summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-09-01 11:08:40 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-10-01 12:16:21 +0000
commit03c549e0392f92c02536d3f86d5e1d8dfa3435ac (patch)
treefe49d170a929b34ba82cd10db1a0bd8e3760fa4b /chromium/chrome/browser
parent5d013f5804a0d91fcf6c626b2d6fb6eca5c845b0 (diff)
downloadqtwebengine-chromium-03c549e0392f92c02536d3f86d5e1d8dfa3435ac.tar.gz
BASELINE: Update Chromium to 91.0.4472.160
Change-Id: I0def1f08a2412aeed79a9ab95dd50eb5c3f65f31 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser')
-rw-r--r--chromium/chrome/browser/BUILD.gn504
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api.cc42
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api.h11
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc125
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_permission_context.cc5
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_ui.cc2
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller.cc82
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller.h26
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller_browsertest.cc375
-rw-r--r--chromium/chrome/browser/accessibility/caption_host_impl.cc39
-rw-r--r--chromium/chrome/browser/accessibility/caption_host_impl.h18
-rw-r--r--chromium/chrome/browser/accessibility/image_annotation_browsertest.cc2
-rw-r--r--chromium/chrome/browser/accessibility/soda_installer.cc56
-rw-r--r--chromium/chrome/browser/accessibility/soda_installer.h25
-rw-r--r--chromium/chrome/browser/accessibility/soda_installer_impl.cc17
-rw-r--r--chromium/chrome/browser/accessibility/soda_installer_impl.h6
-rw-r--r--chromium/chrome/browser/android/browserservices/intents/BUILD.gn27
-rw-r--r--chromium/chrome/browser/android/browserservices/verification/BUILD.gn4
-rw-r--r--chromium/chrome/browser/android/crypto/BUILD.gn5
-rw-r--r--chromium/chrome/browser/android/webapk/BUILD.gn9
-rw-r--r--chromium/chrome/browser/android/webapps/launchpad/BUILD.gn71
-rw-r--r--chromium/chrome/browser/ash/guest_os/BUILD.gn11
-rw-r--r--chromium/chrome/browser/ash/guest_os/guest_os_diagnostics.mojom27
-rw-r--r--chromium/chrome/browser/ash/wilco_dtc_supportd/BUILD.gn (renamed from chromium/chrome/browser/chromeos/wilco_dtc_supportd/BUILD.gn)0
-rw-r--r--chromium/chrome/browser/banners/android/BUILD.gn4
-rw-r--r--chromium/chrome/browser/browser_resources.grd107
-rw-r--r--chromium/chrome/browser/buildflags.gni8
-rw-r--r--chromium/chrome/browser/cart/chrome_cart.mojom14
-rw-r--r--chromium/chrome/browser/chrome_notification_types.h42
-rw-r--r--chromium/chrome/browser/chromeos/BUILD.gn2275
-rw-r--r--chromium/chrome/browser/chromeos/crostini/crostini_types.mojom1
-rw-r--r--chromium/chrome/browser/chromeos/nearby/BUILD.gn7
-rw-r--r--chromium/chrome/browser/commerce/merchant_viewer/BUILD.gn35
-rw-r--r--chromium/chrome/browser/commerce/merchant_viewer/android/BUILD.gn164
-rw-r--r--chromium/chrome/browser/commerce/subscriptions/android/BUILD.gn7
-rw-r--r--chromium/chrome/browser/commerce/subscriptions/test/android/BUILD.gn16
-rw-r--r--chromium/chrome/browser/consent_auditor/android/BUILD.gn2
-rw-r--r--chromium/chrome/browser/contextmenu/BUILD.gn1
-rw-r--r--chromium/chrome/browser/continuous_search/BUILD.gn55
-rw-r--r--chromium/chrome/browser/continuous_search/internal/BUILD.gn22
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc165
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry.h48
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc3
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc226
-rw-r--r--chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc2
-rw-r--r--chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h2
-rw-r--r--chromium/chrome/browser/dev_ui_browser_resources.grd24
-rw-r--r--chromium/chrome/browser/devtools/BUILD.gn1
-rw-r--r--chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc5
-rw-r--r--chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc50
-rw-r--r--chromium/chrome/browser/devtools/device/port_forwarding_controller.cc5
-rw-r--r--chromium/chrome/browser/devtools/device/tcp_device_provider.cc12
-rw-r--r--chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc5
-rw-r--r--chromium/chrome/browser/devtools/device/usb/android_usb_device.cc4
-rw-r--r--chromium/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc3
-rw-r--r--chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc46
-rw-r--r--chromium/chrome/browser/devtools/devtools_browsertest.cc (renamed from chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc)146
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_helper.cc8
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_helper.h3
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_system_indexer.cc12
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_watcher.cc2
-rw-r--r--chromium/chrome/browser/devtools/devtools_infobar_delegate.cc8
-rw-r--r--chromium/chrome/browser/devtools/devtools_infobar_delegate.h13
-rw-r--r--chromium/chrome/browser/devtools/devtools_interactive_browsertest.cc (renamed from chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc)0
-rw-r--r--chromium/chrome/browser/devtools/devtools_toggle_action.cc16
-rw-r--r--chromium/chrome/browser/devtools/devtools_toggle_action.h8
-rw-r--r--chromium/chrome/browser/devtools/devtools_ui_bindings.cc40
-rw-r--r--chromium/chrome/browser/devtools/devtools_ui_bindings.h3
-rw-r--r--chromium/chrome/browser/devtools/devtools_window.cc32
-rw-r--r--chromium/chrome/browser/devtools/devtools_window.h4
-rw-r--r--chromium/chrome/browser/devtools/devtools_window_testing.cc2
-rw-r--r--chromium/chrome/browser/devtools/global_confirm_info_bar.cc14
-rw-r--r--chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc4
-rw-r--r--chromium/chrome/browser/devtools/protocol/security_handler.cc1
-rw-r--r--chromium/chrome/browser/devtools/protocol/target_handler.cc8
-rw-r--r--chromium/chrome/browser/devtools/remote_debugging_server.cc4
-rw-r--r--chromium/chrome/browser/download/android/BUILD.gn3
-rw-r--r--chromium/chrome/browser/download/internal/android/BUILD.gn5
-rw-r--r--chromium/chrome/browser/endpoint_fetcher/BUILD.gn1
-rw-r--r--chromium/chrome/browser/enterprise/util/BUILD.gn1
-rw-r--r--chromium/chrome/browser/error_reporting/BUILD.gn1
-rw-r--r--chromium/chrome/browser/extensions/BUILD.gn62
-rw-r--r--chromium/chrome/browser/extensions/api/BUILD.gn1
-rw-r--r--chromium/chrome/browser/extensions/api/DEPS1
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc25
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.h34
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc51
-rw-r--r--chromium/chrome/browser/extensions/api/automation/automation_apitest.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc30
-rw-r--r--chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h5
-rw-r--r--chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc107
-rw-r--r--chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc19
-rw-r--r--chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.cc22
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers_unittest.cc25
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc28
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api_unittest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h7
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h8
-rw-r--r--chromium/chrome/browser/extensions/api/certificate_provider/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc85
-rw-r--r--chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc18
-rw-r--r--chromium/chrome/browser/extensions/api/chrome_extensions_api_client.h6
-rw-r--r--chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/commands/command_service.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/commands/command_service.h6
-rw-r--r--chromium/chrome/browser/extensions/api/commands/commands.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_api.cc51
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.h4
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc28
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_service.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_service.h5
-rw-r--r--chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc93
-rw-r--r--chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h2
-rw-r--r--chromium/chrome/browser/extensions/api/cookies/cookies_api.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/debugger_api.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h5
-rw-r--r--chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/declarative/rules_registry_service_unittest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_action.cc61
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_action.h15
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_condition.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_condition_unittest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc17
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.h4
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc16
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h2
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker_unittest.cc138
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc25
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.h7
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker_unittest.cc29
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc18
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc460
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc17
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc46
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/DIR_METADATA12
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h2
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc72
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_api.h56
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc122
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc20
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_mangle.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/entry_picker.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/entry_picker.h2
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc38
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc68
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc29
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.h1
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc53
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api.cc38
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api.h14
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc182
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_device_attributes/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_networking_attributes/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_apitest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h17
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h6
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc29
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc43
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.cc64
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h14
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc20
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.cc112
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h75
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h13
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc26
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc32
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h15
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc63
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h6
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.h4
-rw-r--r--chromium/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h2
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/consent_provider.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/consent_provider_unittest.cc16
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_entry_picker.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc187
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc120
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/gcm/gcm_api.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/history/history_api.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/history/history_api.h7
-rw-r--r--chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h11
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_apitest.cc13
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc17
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h7
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.cc52
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h31
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc37
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h11
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h2
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_event_router_base.h4
-rw-r--r--chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc190
-rw-r--r--chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h96
-rw-r--r--chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc118
-rw-r--r--chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.h2
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc29
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_unittest.cc45
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_apitest.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_browsertest.cc41
-rw-r--r--chromium/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h13
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.cc55
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.h44
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.cc75
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.h60
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc161
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc40
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_port.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_process_host.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc16
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc74
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_launch_from_native_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_test_util.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc50
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h2
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/notifications_api.cc47
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/notifications_api.h6
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc55
-rw-r--r--chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc21
-rw-r--r--chromium/chrome/browser/extensions/api/omnibox/omnibox_api.h9
-rw-r--r--chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc88
-rw-r--r--chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/OWNERS1
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.h16
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc179
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h3
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h7
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h5
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc21
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h7
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api.cc21
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc25
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc23
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/DIR_METADATA2
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc21
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h2
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc25
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.h6
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_api.cc172
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_api.h5
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_helpers.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_helpers.h3
-rw-r--r--chromium/chrome/browser/extensions/api/processes/processes_api.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/proxy/proxy_api.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/proxy/proxy_api.h3
-rw-r--r--chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/resources_private/resources_private_api.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h8
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc514
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h8
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util_unittest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/scripting/scripting_api.cc55
-rw-r--r--chromium/chrome/browser/extensions/api/search/search_api_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/sessions/session_id.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/sessions/sessions_api.cc78
-rw-r--r--chromium/chrome/browser/extensions/api/sessions/sessions_api.h3
-rw-r--r--chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h6
-rw-r--r--chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc55
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h6
-rw-r--r--chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/storage/policy_value_store.cc32
-rw-r--r--chromium/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc61
-rw-r--r--chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h6
-rw-r--r--chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/DIR_METADATA11
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h6
-rw-r--r--chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_api.cc59
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_api.h14
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc38
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_constants.h1
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_event_router.h14
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc16
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_windows_api.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/windows_event_router.h6
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/OWNERS2
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.h2
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc17
-rw-r--r--chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h2
-rw-r--r--chromium/chrome/browser/extensions/api/vpn_provider/DIR_METADATA5
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc113
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h87
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc167
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc221
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h9
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc451
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc43
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/DIR_METADATA12
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc20
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc318
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h53
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc84
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc145
-rw-r--r--chromium/chrome/browser/feature_engagement/BUILD.gn32
-rw-r--r--chromium/chrome/browser/feed/android/BUILD.gn89
-rw-r--r--chromium/chrome/browser/feedback/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/flags/BUILD.gn1
-rw-r--r--chromium/chrome/browser/gsa/BUILD.gn1
-rw-r--r--chromium/chrome/browser/image_descriptions/BUILD.gn1
-rw-r--r--chromium/chrome/browser/image_fetcher/BUILD.gn1
-rw-r--r--chromium/chrome/browser/installable/digital_asset_links/BUILD.gn13
-rw-r--r--chromium/chrome/browser/language/android/BUILD.gn17
-rw-r--r--chromium/chrome/browser/lens/BUILD.gn82
-rw-r--r--chromium/chrome/browser/media/feeds/BUILD.gn20
-rw-r--r--chromium/chrome/browser/media/feeds/media_feeds_store.mojom478
-rw-r--r--chromium/chrome/browser/media/router/BUILD.gn42
-rw-r--r--chromium/chrome/browser/media/router/discovery/BUILD.gn1
-rw-r--r--chromium/chrome/browser/media/router/features.gni8
-rw-r--r--chromium/chrome/browser/media/webrtc/DIR_METADATA11
-rw-r--r--chromium/chrome/browser/media/webrtc/OWNERS7
-rw-r--r--chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list.cc3
-rw-r--r--chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list_unittest.cc6
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.cc41
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.cc12
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_list.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_list_base.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_list_base.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_picker.h5
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/display_media_access_handler.cc3
-rw-r--r--chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/fake_desktop_media_list.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/fake_desktop_media_list.h2
-rw-r--r--chromium/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/media_authorization_wrapper_mac.h2
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc18
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc10
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc9
-rw-r--r--chromium/chrome/browser/media/webrtc/native_desktop_media_list.cc36
-rw-r--r--chromium/chrome/browser/media/webrtc/native_desktop_media_list.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc6
-rw-r--r--chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h2
-rw-r--r--chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm27
-rw-r--r--chromium/chrome/browser/media/webrtc/tab_desktop_media_list_unittest.cc18
-rw-r--r--chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc5
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.cc392
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.h148
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h28
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc8
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.h4
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc6
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h8
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc850
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc11
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc3
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc4
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc6
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc8
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc10
-rw-r--r--chromium/chrome/browser/media/webrtc/window_icon_util_linux.cc37
-rw-r--r--chromium/chrome/browser/media/webrtc/window_icon_util_ozone.cc18
-rw-r--r--chromium/chrome/browser/media/webrtc/window_icon_util_x11.cc51
-rw-r--r--chromium/chrome/browser/nearby_sharing/contacts/BUILD.gn3
-rw-r--r--chromium/chrome/browser/net/OWNERS1
-rw-r--r--chromium/chrome/browser/net/chrome_accept_encoding_header_browsertest.cc49
-rw-r--r--chromium/chrome/browser/net/chrome_accept_header_browsertest.cc43
-rw-r--r--chromium/chrome/browser/net/chrome_report_sender_unittest.cc1
-rw-r--r--chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc46
-rw-r--r--chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h20
-rw-r--r--chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref_unittest.cc88
-rw-r--r--chromium/chrome/browser/net/cookie_policy_browsertest.cc308
-rw-r--r--chromium/chrome/browser/net/errorpage_browsertest.cc15
-rw-r--r--chromium/chrome/browser/net/explicitly_allowed_network_ports_browsertest.cc132
-rw-r--r--chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc60
-rw-r--r--chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h33
-rw-r--r--chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc149
-rw-r--r--chromium/chrome/browser/net/explicitly_allowed_ports_switch_browsertest.cc56
-rw-r--r--chromium/chrome/browser/net/net_error_diagnostics_dialog_chromeos.cc16
-rw-r--r--chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc2
-rw-r--r--chromium/chrome/browser/net/net_error_tab_helper_unittest.cc4
-rw-r--r--chromium/chrome/browser/net/net_export_helper.cc4
-rw-r--r--chromium/chrome/browser/net/network_context_configuration_browsertest.cc50
-rw-r--r--chromium/chrome/browser/net/network_quality_estimator_browsertest.cc2
-rw-r--r--chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc3
-rw-r--r--chromium/chrome/browser/net/network_quality_tracker_browsertest.cc4
-rw-r--r--chromium/chrome/browser/net/nss_context.cc7
-rw-r--r--chromium/chrome/browser/net/nss_context.h36
-rw-r--r--chromium/chrome/browser/net/nss_context_chromeos.cc129
-rw-r--r--chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc35
-rw-r--r--chromium/chrome/browser/net/nss_context_linux.cc13
-rw-r--r--chromium/chrome/browser/net/nss_service_chromeos.cc314
-rw-r--r--chromium/chrome/browser/net/nss_service_chromeos.h41
-rw-r--r--chromium/chrome/browser/net/nss_service_chromeos_factory.cc40
-rw-r--r--chromium/chrome/browser/net/nss_service_chromeos_factory.h41
-rw-r--r--chromium/chrome/browser/net/private_network_access_browsertest.cc84
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service.cc20
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service.h2
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service_browsertest.cc23
-rw-r--r--chromium/chrome/browser/net/proxy_browsertest.cc9
-rw-r--r--chromium/chrome/browser/net/reporting_browsertest.cc40
-rw-r--r--chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc172
-rw-r--r--chromium/chrome/browser/net/service_providers_win.h1
-rw-r--r--chromium/chrome/browser/net/storage_test_utils.cc39
-rw-r--r--chromium/chrome/browser/net/storage_test_utils.h2
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager.cc28
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager.h6
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager_browsertest.cc12
-rw-r--r--chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc7
-rw-r--r--chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.cc16
-rw-r--r--chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.h24
-rw-r--r--chromium/chrome/browser/net/trial_comparison_cert_verifier_controller_unittest.cc55
-rw-r--r--chromium/chrome/browser/net/websocket_browsertest.cc25
-rw-r--r--chromium/chrome/browser/offline_pages/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/optimization_guide/android/BUILD.gn2
-rw-r--r--chromium/chrome/browser/paint_preview/android/BUILD.gn3
-rw-r--r--chromium/chrome/browser/password_check/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/password_check/android/internal/BUILD.gn2
-rw-r--r--chromium/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd3
-rw-r--r--chromium/chrome/browser/password_entry_edit/android/BUILD.gn18
-rw-r--r--chromium/chrome/browser/password_entry_edit/android/internal/BUILD.gn7
-rw-r--r--chromium/chrome/browser/password_manager/android/BUILD.gn13
-rw-r--r--chromium/chrome/browser/payments/BUILD.gn1
-rw-r--r--chromium/chrome/browser/performance_hints/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/persisted_state_db/BUILD.gn1
-rw-r--r--chromium/chrome/browser/policy/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/preferences/BUILD.gn3
-rw-r--r--chromium/chrome/browser/prefs/README.md55
-rw-r--r--chromium/chrome/browser/prefs/browser_prefs.cc327
-rw-r--r--chromium/chrome/browser/prefs/chrome_command_line_pref_store.cc26
-rw-r--r--chromium/chrome/browser/prefs/chrome_command_line_pref_store.h3
-rw-r--r--chromium/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc8
-rw-r--r--chromium/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc30
-rw-r--r--chromium/chrome/browser/prefs/chrome_pref_service_unittest.cc10
-rw-r--r--chromium/chrome/browser/prefs/incognito_mode_prefs.cc15
-rw-r--r--chromium/chrome/browser/prefs/origin_trial_prefs.cc15
-rw-r--r--chromium/chrome/browser/prefs/origin_trial_prefs.h15
-rw-r--r--chromium/chrome/browser/prefs/pref_functional_browsertest.cc4
-rw-r--r--chromium/chrome/browser/prefs/profile_pref_store_manager.cc2
-rw-r--r--chromium/chrome/browser/prefs/profile_pref_store_manager_unittest.cc4
-rw-r--r--chromium/chrome/browser/prefs/session_startup_pref_unittest.cc5
-rw-r--r--chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc22
-rw-r--r--chromium/chrome/browser/printing/cloud_print/privet_device_lister_unittest.cc2
-rw-r--r--chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc2
-rw-r--r--chromium/chrome/browser/printing/cloud_print/privet_notifications.cc23
-rw-r--r--chromium/chrome/browser/printing/cloud_print/privet_notifications.h2
-rw-r--r--chromium/chrome/browser/printing/pdf_nup_converter_client.h4
-rw-r--r--chromium/chrome/browser/printing/pdf_to_emf_converter.cc2
-rw-r--r--chromium/chrome/browser/printing/print_backend_service.cc1
-rw-r--r--chromium/chrome/browser/printing/print_browsertest.cc1
-rw-r--r--chromium/chrome/browser/printing/print_dialog_cloud_win.cc6
-rw-r--r--chromium/chrome/browser/printing/print_job.cc7
-rw-r--r--chromium/chrome/browser/printing/print_job.h2
-rw-r--r--chromium/chrome/browser/printing/print_job_unittest.cc4
-rw-r--r--chromium/chrome/browser/printing/print_job_worker.cc2
-rw-r--r--chromium/chrome/browser/printing/print_preview_dialog_controller.cc12
-rw-r--r--chromium/chrome/browser/printing/print_preview_dialog_controller.h2
-rw-r--r--chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc10
-rw-r--r--chromium/chrome/browser/printing/print_view_manager_base.cc8
-rw-r--r--chromium/chrome/browser/printing/print_view_manager_base.h4
-rw-r--r--chromium/chrome/browser/printing/printer_query.cc5
-rw-r--r--chromium/chrome/browser/printing/test_print_job.cc2
-rw-r--r--chromium/chrome/browser/printing/test_print_job.h2
-rw-r--r--chromium/chrome/browser/privacy/BUILD.gn1
-rw-r--r--chromium/chrome/browser/privacy_budget/BUILD.gn5
-rw-r--r--chromium/chrome/browser/privacy_sandbox/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/profiles/BUILD.gn16
-rw-r--r--chromium/chrome/browser/profiles/android/BUILD.gn4
-rw-r--r--chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc21
-rw-r--r--chromium/chrome/browser/resources/BUILD.gn21
-rw-r--r--chromium/chrome/browser/resources/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/about_sys/about_sys.html6
-rw-r--r--chromium/chrome/browser/resources/about_sys/about_sys.js13
-rw-r--r--chromium/chrome/browser/resources/bookmarks/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/bookmarks/app.js2
-rw-r--r--chromium/chrome/browser/resources/bookmarks/command_manager.js4
-rw-r--r--chromium/chrome/browser/resources/bookmarks/folder_node.html1
-rw-r--r--chromium/chrome/browser/resources/bookmarks/item.js2
-rw-r--r--chromium/chrome/browser/resources/bookmarks/toolbar.js2
-rw-r--r--chromium/chrome/browser/resources/chromeos/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn1
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn22
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn45
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp106
-rw-r--r--chromium/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn32
-rw-r--r--chromium/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn40
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/BUILD.gn217
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn80
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn1
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/oobe_animation_resources.grdp26
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp35
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/oobe_image_resources.grdp5
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/oobe_resources.grd57
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn94
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn104
-rw-r--r--chromium/chrome/browser/resources/chromeos/password_change/BUILD.gn41
-rw-r--r--chromium/chrome/browser/resources/chromeos/vm/BUILD.gn38
-rw-r--r--chromium/chrome/browser/resources/component_extension_resources.grd3
-rw-r--r--chromium/chrome/browser/resources/device_log_ui/device_log_ui.js4
-rw-r--r--chromium/chrome/browser/resources/discards/discards_main.js2
-rw-r--r--chromium/chrome/browser/resources/download_internals/BUILD.gn33
-rw-r--r--chromium/chrome/browser/resources/download_shelf/BUILD.gn133
-rw-r--r--chromium/chrome/browser/resources/download_shelf/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/download_shelf/app.html1
-rw-r--r--chromium/chrome/browser/resources/download_shelf/app.js15
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_item.html107
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_item.js89
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_list.html8
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_list.js164
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_shelf.html16
-rw-r--r--chromium/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js125
-rw-r--r--chromium/chrome/browser/resources/downloads/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/downloads/manager.js4
-rw-r--r--chromium/chrome/browser/resources/engagement/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/engagement/site_engagement.html3
-rw-r--r--chromium/chrome/browser/resources/engagement/site_engagement.js4
-rw-r--r--chromium/chrome/browser/resources/extensions/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log.js2
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.js2
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.html2
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.js2
-rw-r--r--chromium/chrome/browser/resources/extensions/detail_view.html22
-rw-r--r--chromium/chrome/browser/resources/extensions/detail_view.js16
-rw-r--r--chromium/chrome/browser/resources/extensions/icons.html7
-rw-r--r--chromium/chrome/browser/resources/extensions/item.html37
-rw-r--r--chromium/chrome/browser/resources/extensions/item.js22
-rw-r--r--chromium/chrome/browser/resources/extensions/manager.js4
-rw-r--r--chromium/chrome/browser/resources/extensions/service.js6
-rw-r--r--chromium/chrome/browser/resources/extensions/shared_vars.html3
-rw-r--r--chromium/chrome/browser/resources/extensions/toolbar.js14
-rw-r--r--chromium/chrome/browser/resources/feed_internals/feed_internals.html8
-rw-r--r--chromium/chrome/browser/resources/feed_internals/feed_internals.js9
-rw-r--r--chromium/chrome/browser/resources/feedback/js/event_handler.js2
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/feedback_resources.grd7
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/html/assistant_logs_info.html5
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/html/default.html21
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/html/sys_info.html5
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/BUILD.gn45
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/assistant_logs_info.js6
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/feedback.js213
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/feedback_util.js13
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/sys_info.js19
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/take_screenshot.js7
-rw-r--r--chromium/chrome/browser/resources/feedback_webui/js/topbar_handlers.js34
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/authenticator.js45
-rw-r--r--chromium/chrome/browser/resources/hats/hats.html79
-rw-r--r--chromium/chrome/browser/resources/history/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/history/app.js4
-rw-r--r--chromium/chrome/browser/resources/history/history_item.js2
-rw-r--r--chromium/chrome/browser/resources/history/history_toolbar.js2
-rw-r--r--chromium/chrome/browser/resources/history/lazy_load.js2
-rw-r--r--chromium/chrome/browser/resources/history/side_bar.js3
-rw-r--r--chromium/chrome/browser/resources/history/synced_device_card.js2
-rw-r--r--chromium/chrome/browser/resources/history/synced_device_manager.js2
-rw-r--r--chromium/chrome/browser/resources/inline_login/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/inline_login/inline_login_app.html3
-rw-r--r--chromium/chrome/browser/resources/inline_login/inline_login_app.js10
-rw-r--r--chromium/chrome/browser/resources/inline_login/welcome_page_app.js6
-rw-r--r--chromium/chrome/browser/resources/inspect/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/inspect/inspect.css4
-rw-r--r--chromium/chrome/browser/resources/inspect/inspect.html20
-rw-r--r--chromium/chrome/browser/resources/inspect/inspect.js65
-rw-r--r--chromium/chrome/browser/resources/internals/BUILD.gn37
-rw-r--r--chromium/chrome/browser/resources/internals/hello_ts/BUILD.gn31
-rw-r--r--chromium/chrome/browser/resources/internals/hello_ts/hello_ts.html6
-rw-r--r--chromium/chrome/browser/resources/internals/hello_ts/hello_ts.ts40
-rw-r--r--chromium/chrome/browser/resources/internals/notifications/BUILD.gn14
-rw-r--r--chromium/chrome/browser/resources/internals/query_tiles/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/internals/user_education/BUILD.gn23
-rw-r--r--chromium/chrome/browser/resources/internals/user_education/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/internals/user_education/index.html12
-rw-r--r--chromium/chrome/browser/resources/internals/user_education/user_education_internals.html11
-rw-r--r--chromium/chrome/browser/resources/internals/user_education/user_education_internals.js53
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/BUILD.gn36
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/DIR_METADATA3
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/side_nav_container.html6
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/side_nav_container.js26
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/toolbar.html18
-rw-r--r--chromium/chrome/browser/resources/kaleidoscope/toolbar.js70
-rw-r--r--chromium/chrome/browser/resources/local_ntp/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/local_ntp/animations.css176
-rw-r--r--chromium/chrome/browser/resources/local_ntp/animations.js106
-rw-r--r--chromium/chrome/browser/resources/local_ntp/chevron.svg1
-rw-r--r--chromium/chrome/browser/resources/local_ntp/custom_links_edit.css201
-rw-r--r--chromium/chrome/browser/resources/local_ntp/custom_links_edit.html49
-rw-r--r--chromium/chrome/browser/resources/local_ntp/custom_links_edit.js320
-rw-r--r--chromium/chrome/browser/resources/local_ntp/customize.css722
-rw-r--r--chromium/chrome/browser/resources/local_ntp/customize.js2484
-rw-r--r--chromium/chrome/browser/resources/local_ntp/doodles.css295
-rw-r--r--chromium/chrome/browser/resources/local_ntp/doodles.js721
-rw-r--r--chromium/chrome/browser/resources/local_ntp/externs.js506
-rw-r--r--chromium/chrome/browser/resources/local_ntp/icons.grdp2
-rw-r--r--chromium/chrome/browser/resources/local_ntp/icons/bookmark.svg1
-rw-r--r--chromium/chrome/browser/resources/local_ntp/icons/dont_show.pngbin101 -> 0 bytes
-rw-r--r--chromium/chrome/browser/resources/local_ntp/icons/dont_show_2x.pngbin133 -> 0 bytes
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.css2175
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.html403
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.js2413
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp_common.css74
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp_resources.grd26
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_iframe.css21
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_single.css330
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_single.html19
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_single.js1236
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_title.css14
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_title.html2
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_title.js261
-rw-r--r--chromium/chrome/browser/resources/local_ntp/most_visited_util.js272
-rw-r--r--chromium/chrome/browser/resources/local_ntp/utils.js86
-rw-r--r--chromium/chrome/browser/resources/local_ntp/voice.css596
-rw-r--r--chromium/chrome/browser/resources/local_ntp/voice.js1640
-rw-r--r--chromium/chrome/browser/resources/local_state/BUILD.gn14
-rw-r--r--chromium/chrome/browser/resources/local_state/local_state.ts (renamed from chromium/chrome/browser/resources/local_state/local_state.js)2
-rw-r--r--chromium/chrome/browser/resources/management/management_browser_proxy.js10
-rw-r--r--chromium/chrome/browser/resources/management/management_ui.html16
-rw-r--r--chromium/chrome/browser/resources/management/management_ui.js28
-rw-r--r--chromium/chrome/browser/resources/media/BUILD.gn11
-rw-r--r--chromium/chrome/browser/resources/media/OWNERS5
-rw-r--r--chromium/chrome/browser/resources/media/media_feeds.html233
-rw-r--r--chromium/chrome/browser/resources/media/media_feeds.js680
-rw-r--r--chromium/chrome/browser/resources/media/webrtc_logs.html6
-rw-r--r--chromium/chrome/browser/resources/media/webrtc_logs.js17
-rw-r--r--chromium/chrome/browser/resources/media_router/extension/manifest.yaml6
-rw-r--r--chromium/chrome/browser/resources/memories/BUILD.gn156
-rw-r--r--chromium/chrome/browser/resources/memories/OWNERS2
-rw-r--r--chromium/chrome/browser/resources/memories/app.html71
-rw-r--r--chromium/chrome/browser/resources/memories/app.js134
-rw-r--r--chromium/chrome/browser/resources/memories/memories.html12
-rw-r--r--chromium/chrome/browser/resources/memories/memories.js14
-rw-r--r--chromium/chrome/browser/resources/memories/memory_card.html138
-rw-r--r--chromium/chrome/browser/resources/memories/memory_card.js91
-rw-r--r--chromium/chrome/browser/resources/memories/memory_tile.html35
-rw-r--r--chromium/chrome/browser/resources/memories/memory_tile.js39
-rw-r--r--chromium/chrome/browser/resources/memories/mojom_conversion_mixin.js37
-rw-r--r--chromium/chrome/browser/resources/memories/page_favicon.html6
-rw-r--r--chromium/chrome/browser/resources/memories/page_favicon.js57
-rw-r--r--chromium/chrome/browser/resources/memories/page_thumbnail.html47
-rw-r--r--chromium/chrome/browser/resources/memories/page_thumbnail.js56
-rw-r--r--chromium/chrome/browser/resources/memories/router.html3
-rw-r--r--chromium/chrome/browser/resources/memories/router.js80
-rw-r--r--chromium/chrome/browser/resources/memories/search_query.html33
-rw-r--r--chromium/chrome/browser/resources/memories/search_query.js41
-rw-r--r--chromium/chrome/browser/resources/memories/shared_vars.html14
-rw-r--r--chromium/chrome/browser/resources/memories/shared_vars.js10
-rw-r--r--chromium/chrome/browser/resources/memories/top_visit.html55
-rw-r--r--chromium/chrome/browser/resources/memories/top_visit.js66
-rw-r--r--chromium/chrome/browser/resources/memories/utils.js18
-rw-r--r--chromium/chrome/browser/resources/memories/visit_row.html69
-rw-r--r--chromium/chrome/browser/resources/memories/visit_row.js102
-rw-r--r--chromium/chrome/browser/resources/nearby_internals/BUILD.gn11
-rw-r--r--chromium/chrome/browser/resources/nearby_internals/logging_tab.html4
-rw-r--r--chromium/chrome/browser/resources/nearby_internals/logging_tab.js13
-rw-r--r--chromium/chrome/browser/resources/nearby_internals/nearby_internals.js2
-rw-r--r--chromium/chrome/browser/resources/nearby_internals/nearby_prefs_browser_proxy.js20
-rw-r--r--chromium/chrome/browser/resources/nearby_share/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/nearby_share/app.js2
-rw-r--r--chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.html2
-rw-r--r--chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.js17
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/BUILD.gn58
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_device.html2
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.html1
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js120
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html1
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js3
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_shared.gni1
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.html1
-rw-r--r--chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js3
-rw-r--r--chromium/chrome/browser/resources/net_internals/BUILD.gn19
-rw-r--r--chromium/chrome/browser/resources/net_internals/main.js16
-rw-r--r--chromium/chrome/browser/resources/net_internals/tab_switcher_view.js18
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/BUILD.gn62
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/app.js41
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/background_manager.js26
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js4
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_dialog.js4
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_modules.html38
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_modules.js64
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js4
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js8
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/BUILD.gn1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/iframe.js13
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/logo.js9
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/metrics_utils.js70
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/middle_slot_promo.js12
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/BUILD.gn10
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/chrome_cart_proxy.js17
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/BUILD.gn (renamed from chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/BUILD.gn)9
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/cart_fallback.svg (renamed from chromium/chrome/browser/resources/new_tab_page/icons/cart_fallback.svg)0
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/consent_label.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/module.html136
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/cart/module.js62
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/drive_module_proxy.js17
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_docs_logo.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_sheets_logo.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_slides_logo.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/module.html94
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/drive/module.js48
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/dummy/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/dummy/foo_proxy.js17
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/dummy/module.js2
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/module_descriptor.js30
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/module_registry.js22
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/module_wrapper.js26
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/task_module/BUILD.gn1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.html1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.js2
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/modules/task_module/task_module_handler_proxy.js17
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/most_visited.js15
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page.js4
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page_proxy.js53
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/promo_browser_command_proxy.js17
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox/realbox_browser_proxy.js27
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox/realbox_match.html2
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/utils.js18
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.js26
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/window_proxy.js (renamed from chromium/chrome/browser/resources/new_tab_page/browser_proxy.js)41
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/.eslintrc.js11
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/BUILD.gn121
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/OWNERS3
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/browser_proxy.js43
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.html216
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.js404
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.html43
-rw-r--r--chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.js26
-rw-r--r--chromium/chrome/browser/resources/ntp4/apps_page.js6
-rw-r--r--chromium/chrome/browser/resources/ntp4/incognito_tab.html1
-rw-r--r--chromium/chrome/browser/resources/ntp4/incognito_tab.js10
-rw-r--r--chromium/chrome/browser/resources/ntp4/incognito_tab_theme.css6
-rw-r--r--chromium/chrome/browser/resources/ntp4/new_tab.html3
-rw-r--r--chromium/chrome/browser/resources/ntp4/new_tab.js5
-rw-r--r--chromium/chrome/browser/resources/ntp4/new_tab_theme.css6
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/shared-css.html1
-rw-r--r--chromium/chrome/browser/resources/pdf/pdf_viewer.html13
-rw-r--r--chromium/chrome/browser/resources/pdf/pdf_viewer.js2
-rw-r--r--chromium/chrome/browser/resources/pdf/viewport.js10
-rw-r--r--chromium/chrome/browser/resources/plugin_metadata/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/print_preview/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface.js32
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js115
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/cloud_parsers.js62
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/destination_store.js64
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/invitation.js85
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/invitation_store.js200
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/model.js4
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/printer_status_cros.js33
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/user_manager.js32
-rw-r--r--chromium/chrome/browser/resources/print_preview/metrics.js8
-rw-r--r--chromium/chrome/browser/resources/print_preview/native_layer.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/print_preview.js1
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/BUILD.gn19
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/advanced_settings_item.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/app.js19
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_dialog.html5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_dialog.js5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.html5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.js33
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select.html4
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js9
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_settings.html6
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_settings.js97
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/invitation_promo.html51
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/invitation_promo.js160
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/more_settings.html5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/print_preview_search_box.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/scaling_settings.html6
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/sidebar.js6
-rw-r--r--chromium/chrome/browser/resources/read_later/app.js5
-rw-r--r--chromium/chrome/browser/resources/read_later/side_panel/side_panel.html12
-rw-r--r--chromium/chrome/browser/resources/read_later/side_panel/side_panel.js336
-rw-r--r--chromium/chrome/browser/resources/sandbox_internals/sandbox_internals_win.js99
-rw-r--r--chromium/chrome/browser/resources/settings/BUILD.gn297
-rw-r--r--chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn69
-rw-r--r--chromium/chrome/browser/resources/settings/about_page/BUILD.gn37
-rw-r--r--chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn47
-rw-r--r--chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn22
-rw-r--r--chromium/chrome/browser/resources/settings/basic_page/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/BUILD.gn722
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn9
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn9
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn38
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn13
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn53
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn3
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn90
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn13
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn25
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn35
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/on_startup_page/BUILD.gn7
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn38
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn15
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn32
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn7
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn86
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn45
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn7
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings.gni105
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn5
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn9
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn3
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn39
-rw-r--r--chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/controls/BUILD.gn304
-rw-r--r--chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/settings/languages_page/BUILD.gn122
-rw-r--r--chromium/chrome/browser/resources/settings/people_page/BUILD.gn266
-rw-r--r--chromium/chrome/browser/resources/settings/prefs/BUILD.gn82
-rw-r--r--chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn113
-rw-r--r--chromium/chrome/browser/resources/settings/reset_page/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn9
-rw-r--r--chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn47
-rw-r--r--chromium/chrome/browser/resources/settings/search_page/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/settings/settings.gni55
-rw-r--r--chromium/chrome/browser/resources/settings/settings_main/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/settings/settings_page/BUILD.gn126
-rw-r--r--chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/settings/site_settings/BUILD.gn18
-rw-r--r--chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn10
-rw-r--r--chromium/chrome/browser/resources/settings/system_page/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/signin/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/BUILD.gn32
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/DIR_METADATA11
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/OWNERS2
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome.html26
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html202
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.js99
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_browser_proxy.js62
-rw-r--r--chromium/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg1
-rw-r--r--chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.html75
-rw-r--r--chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.js15
-rw-r--r--chromium/chrome/browser/resources/signin/profile_customization/profile_customization_browser_proxy.js2
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/BUILD.gn11
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/ensure_lazy_loaded.js1
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/lazy_load.js1
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js33
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/navigation_behavior.js19
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/policy_helper.js3
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_card.html4
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_card_menu.html2
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html5
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js10
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html79
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js37
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.html9
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.js8
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html7
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js2
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_shared_css.html9
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_switch.html78
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_switch.js53
-rw-r--r--chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html47
-rw-r--r--chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.js22
-rw-r--r--chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_browser_proxy.js8
-rw-r--r--chromium/chrome/browser/resources/signin/sync_confirmation/sync_loading_confirmation.html62
-rw-r--r--chromium/chrome/browser/resources/ssl/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/sync_file_system_internals/OWNERS1
-rw-r--r--chromium/chrome/browser/resources/tab_search/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/tab_search/app.html54
-rw-r--r--chromium/chrome/browser/resources/tab_search/app.js244
-rw-r--r--chromium/chrome/browser/resources/tab_search/bimap.js76
-rw-r--r--chromium/chrome/browser/resources/tab_search/fuzzy_search.js14
-rw-r--r--chromium/chrome/browser/resources/tab_search/infinite_list.html5
-rw-r--r--chromium/chrome/browser/resources/tab_search/infinite_list.js652
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_data.js21
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_search.js4
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_search_api_proxy.js7
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_search_item.html56
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_search_item.js43
-rw-r--r--chromium/chrome/browser/resources/tab_search/tab_search_search_field.js2
-rw-r--r--chromium/chrome/browser/resources/tab_search/title_item.js11
-rw-r--r--chromium/chrome/browser/resources/tab_strip/BUILD.gn15
-rw-r--r--chromium/chrome/browser/resources/tab_strip/alert_indicator.js3
-rw-r--r--chromium/chrome/browser/resources/tab_strip/alert_indicators.js3
-rw-r--r--chromium/chrome/browser/resources/tab_strip/custom_element.js33
-rw-r--r--chromium/chrome/browser/resources/tab_strip/drag_manager.js34
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tab.html6
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tab.js8
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tab_group.js2
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tab_list.js111
-rw-r--r--chromium/chrome/browser/resources/tools/optimize_webui.gni53
-rwxr-xr-xchromium/chrome/browser/resources/tools/optimize_webui.py202
-rwxr-xr-xchromium/chrome/browser/resources/tools/optimize_webui_test.py29
-rw-r--r--chromium/chrome/browser/resources/usb_internals/descriptor_panel.js70
-rw-r--r--chromium/chrome/browser/resources/usb_internals/devices_page.js11
-rwxr-xr-xchromium/chrome/browser/resources/vr/assets/push_assets_component.py2
-rw-r--r--chromium/chrome/browser/resources/web_app_internals/web_app_internals.html4
-rw-r--r--chromium/chrome/browser/resources/web_app_internals/web_app_internals.js38
-rw-r--r--chromium/chrome/browser/resources/webui_js_error/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/welcome/BUILD.gn32
-rw-r--r--chromium/chrome/browser/resources/welcome/google_apps/nux_google_apps.html16
-rw-r--r--chromium/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.html17
-rw-r--r--chromium/chrome/browser/resources/welcome/welcome_app.js2
-rw-r--r--chromium/chrome/browser/safe_browsing/BUILD.gn4
-rw-r--r--chromium/chrome/browser/safe_browsing/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/safety_check/android/BUILD.gn3
-rw-r--r--chromium/chrome/browser/search/BUILD.gn46
-rw-r--r--chromium/chrome/browser/search/drive/BUILD.gn1
-rw-r--r--chromium/chrome/browser/search/drive/drive.mojom19
-rw-r--r--chromium/chrome/browser/search_engines/android/BUILD.gn56
-rw-r--r--chromium/chrome/browser/share/android/java_sources.gni1
-rw-r--r--chromium/chrome/browser/share/android/test_java_sources.gni2
-rw-r--r--chromium/chrome/browser/sharing/proto/BUILD.gn2
-rw-r--r--chromium/chrome/browser/signin/services/android/BUILD.gn11
-rw-r--r--chromium/chrome/browser/signin/ui/android/BUILD.gn16
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.cc28
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.h16
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc6
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_unittest.cc4
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_unittest.cc16
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc42
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.cc2
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.h2
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_service.cc5
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc4
-rw-r--r--chromium/chrome/browser/spellchecker/spelling_request.cc4
-rw-r--r--chromium/chrome/browser/spellchecker/spelling_request.h6
-rw-r--r--chromium/chrome/browser/spellchecker/spelling_service_client_unittest.cc8
-rw-r--r--chromium/chrome/browser/subresource_filter/BUILD.gn1
-rw-r--r--chromium/chrome/browser/sync/test/integration/sync_integration_tests_sources.gni68
-rw-r--r--chromium/chrome/browser/tab/BUILD.gn36
-rw-r--r--chromium/chrome/browser/tab_contents/tab_util.cc2
-rw-r--r--chromium/chrome/browser/tab_contents/view_source_browsertest.cc10
-rw-r--r--chromium/chrome/browser/tab_contents/web_contents_collection.h7
-rw-r--r--chromium/chrome/browser/thumbnail/generator/BUILD.gn2
-rw-r--r--chromium/chrome/browser/touch_to_fill/android/internal/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/BUILD.gn247
-rw-r--r--chromium/chrome/browser/ui/android/default_browser_promo/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/android/favicon/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/android/layouts/BUILD.gn3
-rw-r--r--chromium/chrome/browser/ui/android/night_mode/BUILD.gn87
-rw-r--r--chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd280
-rw-r--r--chromium/chrome/browser/ui/android/toolbar/BUILD.gn2
-rw-r--r--chromium/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn8
-rw-r--r--chromium/chrome/browser/ui/ash/holding_space/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/messages/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/webui/DEPS6
-rw-r--r--chromium/chrome/browser/ui/webui/about_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/about_ui_unittest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/app_launcher_login_handler.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management.mojom8
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.cc49
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h6
-rw-r--r--chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc50
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h18
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc95
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_viewer_webui.h4
-rw-r--r--chromium/chrome/browser/ui/webui/certificates_handler.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/certificates_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_untrusted_web_ui_controller_factory.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc136
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory_browsertest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc14
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_dialog.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/OWNERS2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc44
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.h12
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/BUILD.gn11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/OWNERS3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc91
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h48
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.cc83
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h30
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc98
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h40
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc50
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h26
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom29
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.cc116
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h53
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/image_source.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.cc46
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h33
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.cc49
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h31
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.cc151
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h41
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc94
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h37
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h20
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc15
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enable_adb_sideloading_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc48
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc29
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc40
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc51
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.h6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc89
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.h10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.h7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h46
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.cc70
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.h43
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc44
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.cc100
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h47
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_browsertest.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc24
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc32
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/network_ui.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/network_ui.h6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/set_time_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/slow_trace_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/user_image_source.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/vm/BUILD.gn12
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/vm/OWNERS4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/vm/vm.mojom14
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.cc84
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.h35
-rw-r--r--chromium/chrome/browser/ui/webui/commander/commander_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/components/components_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/components/components_handler.h5
-rw-r--r--chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc27
-rw-r--r--chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h7
-rw-r--r--chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/cookies_tree_model_util.h3
-rw-r--r--chromium/chrome/browser/ui/webui/crashes_ui.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h13
-rw-r--r--chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler_unittest.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/download_internals/download_internals_ui.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/BUILD.gn36
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/DIR_METADATA3
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/OWNERS9
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_mojom_traits.h236
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf.mojom179
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc77
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h45
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc86
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h68
-rw-r--r--chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h23
-rw-r--r--chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.h4
-rw-r--r--chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker_unittest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h9
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extensions_internals_source.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source.cc49
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source.h13
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source_unittest.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom6
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h6
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_dialog.cc144
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_dialog.h62
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_handler.cc27
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_handler.h34
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_ui.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/feedback/feedback_ui.h10
-rw-r--r--chromium/chrome/browser/ui/webui/flags/flags_ui.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/flags/flags_ui_handler.cc35
-rw-r--r--chromium/chrome/browser/ui/webui/help/help_utils_chromeos.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/help/test_version_updater.h2
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater.h3
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_basic.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc39
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc32
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_mac.mm12
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_win.cc22
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_win.h13
-rw-r--r--chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/history/browsing_history_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/history/foreign_session_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/identity_internals_ui.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/inspect_ui.cc216
-rw-r--r--chromium/chrome/browser/ui/webui/inspect_ui.h9
-rw-r--r--chromium/chrome/browser/ui/webui/internals/internals_ui.cc35
-rw-r--r--chromium/chrome/browser/ui/webui/internals/internals_ui.h8
-rw-r--r--chromium/chrome/browser/ui/webui/internals/user_education/BUILD.gn10
-rw-r--r--chromium/chrome/browser/ui/webui/internals/user_education/OWNERS4
-rw-r--r--chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom12
-rw-r--r--chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h32
-rw-r--r--chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc34
-rw-r--r--chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_a11y_browsertest.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui.h2
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui_browsertest.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui_handler.cc103
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc130
-rw-r--r--chromium/chrome/browser/ui/webui/media/OWNERS5
-rw-r--r--chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc131
-rw-r--r--chromium/chrome/browser/ui/webui/media/media_feeds_ui.h59
-rw-r--r--chromium/chrome/browser/ui/webui/media/webrtc_logs_ui.cc222
-rw-r--r--chromium/chrome/browser/ui/webui/memories/BUILD.gn2
-rw-r--r--chromium/chrome/browser/ui/webui/memories/OWNERS2
-rw-r--r--chromium/chrome/browser/ui/webui/memories/memories.mojom5
-rw-r--r--chromium/chrome/browser/ui/webui/memories/memories_handler.cc134
-rw-r--r--chromium/chrome/browser/ui/webui/memories/memories_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/memories/memories_ui.cc25
-rw-r--r--chromium/chrome/browser/ui/webui/memory_internals_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/metrics_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/metrics_handler.h7
-rw-r--r--chromium/chrome/browser/ui/webui/nacl_ui.cc58
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.cc48
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h40
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_share/nearby_share.mojom35
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h19
-rw-r--r--chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui_browsertest.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/net_export_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom13
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc57
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h7
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/BUILD.gn14
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/DIR_METADATA3
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/OWNERS6
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom96
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.cc208
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h103
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.cc137
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h64
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc17
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/new_tab_ui.cc26
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/new_tab_ui.h10
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc137
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.h37
-rw-r--r--chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/plural_string_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/plural_string_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/policy/policy_ui_handler.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc18
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc17
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h3
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc34
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h3
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc75
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h7
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc109
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h21
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h6
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/printer_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.h7
-rw-r--r--chromium/chrome/browser/ui/webui/profile_helper.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc94
-rw-r--r--chromium/chrome/browser/ui/webui/read_later/read_later_page_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/read_later/read_later_ui.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/realbox/realbox_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/realbox/realbox_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/reset_password/reset_password_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/sanitized_image_source.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/sanitized_image_source.h1
-rw-r--r--chromium/chrome/browser/ui/webui/sanitized_image_source_unittest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/about_handler.cc34
-rw-r--r--chromium/chrome/browser/ui/webui/settings/about_handler.h5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/captions_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/captions_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc14
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc18
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc57
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h33
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc51
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h14
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc36
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.h8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc58
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc43
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc112
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler_unittest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc87
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h16
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc53
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc27
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc45
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h18
-rw-r--r--chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.h6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/font_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/hats_handler.cc64
-rw-r--r--chromium/chrome/browser/ui/webui/settings/hats_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc57
-rw-r--r--chromium/chrome/browser/ui/webui/settings/import_data_handler.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/languages_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.h5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/people_handler.cc20
-rw-r--r--chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/profile_info_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc49
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler.h26
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc114
-rw-r--r--chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/search_engines_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h9
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc200
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_ui.cc31
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc62
-rw-r--r--chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc120
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc29
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc77
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h7
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc49
-rw-r--r--chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc211
-rw-r--r--chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h84
-rw-r--r--chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc65
-rw-r--r--chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h50
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc40
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h24
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h5
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc22
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc150
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.h4
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc36
-rw-r--r--chromium/chrome/browser/ui/webui/signin/login_ui_service.cc36
-rw-r--r--chromium/chrome/browser/ui/webui/signin/login_ui_service.h29
-rw-r--r--chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_customization_handler.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_customization_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_customization_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_handler.cc168
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_handler.h16
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc53
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h7
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h2
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc66
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_reauth_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_ui_error.cc71
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_ui_error.h56
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.cc26
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.h7
-rw-r--r--chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc42
-rw-r--r--chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.h15
-rw-r--r--chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc42
-rw-r--r--chromium/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc22
-rw-r--r--chromium/chrome/browser/ui/webui/signin_internals_ui.cc98
-rw-r--r--chromium/chrome/browser/ui/webui/signin_internals_ui.h30
-rw-r--r--chromium/chrome/browser/ui/webui/sync_file_system_internals/OWNERS1
-rw-r--r--chromium/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals/sync_internals_browsertest.js119
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc58
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h11
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc24
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc32
-rw-r--r--chromium/chrome/browser/ui/webui/system_info_ui.cc18
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search.mojom33
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc168
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h27
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc146
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search_ui.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/tab_search/tab_search_ui_browsertest.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h1
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h8
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc120
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h25
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler_unittest.cc23
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/theme_handler.cc35
-rw-r--r--chromium/chrome/browser/ui/webui/theme_handler.h13
-rw-r--r--chromium/chrome/browser/ui/webui/theme_source.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/theme_source_unittest.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/translate_internals/translate_internals_ui.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_handler.cc15
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_handler_chromeos.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_handler_win.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_ui.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_util_win.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/version/version_util_win.h3
-rw-r--r--chromium/chrome/browser/ui/webui/web_ui_test_handler.cc18
-rw-r--r--chromium/chrome/browser/ui/webui/web_ui_test_handler.h11
-rw-r--r--chromium/chrome/browser/ui/webui/webui_load_timer.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/webui_load_timer.h3
-rw-r--r--chromium/chrome/browser/ui/webui/webui_util.cc41
-rw-r--r--chromium/chrome/browser/ui/webui/webui_util.h12
-rw-r--r--chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/welcome/bookmark_item.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/welcome/ntp_background_handler.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc29
-rw-r--r--chromium/chrome/browser/user_education/BUILD.gn1
-rw-r--r--chromium/chrome/browser/util/BUILD.gn1
-rw-r--r--chromium/chrome/browser/video_tutorials/internal/BUILD.gn1
-rw-r--r--chromium/chrome/browser/web_applications/BUILD.gn38
-rw-r--r--chromium/chrome/browser/web_applications/components/BUILD.gn43
-rw-r--r--chromium/chrome/browser/webapps/android/BUILD.gn16
-rw-r--r--chromium/chrome/browser/webauthn/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/webshare/BUILD.gn4
1615 files changed, 30886 insertions, 33724 deletions
diff --git a/chromium/chrome/browser/BUILD.gn b/chromium/chrome/browser/BUILD.gn
index 9d680545b28..9fedd833074 100644
--- a/chromium/chrome/browser/BUILD.gn
+++ b/chromium/chrome/browser/BUILD.gn
@@ -11,6 +11,7 @@ import("//build/config/compiler/pgo/pgo.gni")
import("//build/config/crypto.gni")
import("//build/config/features.gni")
import("//build/config/linux/gtk/gtk.gni")
+import("//build/config/python.gni")
import("//build/config/ui.gni")
import("//chrome/browser/buildflags.gni")
import("//chrome/browser/downgrade/buildflags.gni")
@@ -92,6 +93,7 @@ buildflag_header("buildflags") {
flags = [
"USE_MINIKIN_HYPHENATION=$use_minikin_hyphenation",
"ENABLE_CHROMIUM_UPDATER=$enable_chromium_updater",
+ "ENABLE_APP_SESSION_SERVICE=$enable_app_session_service",
"USE_THIN_LTO=$use_thin_lto",
]
if (is_win) {
@@ -183,8 +185,6 @@ static_library("browser") {
"background_fetch/background_fetch_delegate_factory.h",
"background_fetch/background_fetch_delegate_impl.cc",
"background_fetch/background_fetch_delegate_impl.h",
- "background_fetch/background_fetch_download_client.cc",
- "background_fetch/background_fetch_download_client.h",
"background_fetch/background_fetch_permission_context.cc",
"background_fetch/background_fetch_permission_context.h",
"background_sync/background_sync_controller_factory.cc",
@@ -293,10 +293,6 @@ static_library("browser") {
"chrome_resource_bundle_helper.h",
"client_hints/client_hints_factory.cc",
"client_hints/client_hints_factory.h",
- "clipboard/clipboard_read_write_permission_context.cc",
- "clipboard/clipboard_read_write_permission_context.h",
- "clipboard/clipboard_sanitized_write_permission_context.cc",
- "clipboard/clipboard_sanitized_write_permission_context.h",
"command_observer.h",
"command_updater.h",
"command_updater_delegate.h",
@@ -318,6 +314,8 @@ static_library("browser") {
"component_updater/crl_set_component_installer.h",
"component_updater/crowd_deny_component_installer.cc",
"component_updater/crowd_deny_component_installer.h",
+ "component_updater/desktop_sharing_hub_component_installer.cc",
+ "component_updater/desktop_sharing_hub_component_installer.h",
"component_updater/file_type_policies_component_installer.cc",
"component_updater/file_type_policies_component_installer.h",
"component_updater/first_party_sets_component_installer.cc",
@@ -446,8 +444,6 @@ static_library("browser") {
"download/download_target_determiner_delegate.h",
"download/download_target_info.cc",
"download/download_target_info.h",
- "download/download_task_scheduler_impl.cc",
- "download/download_task_scheduler_impl.h",
"download/download_ui_controller.cc",
"download/download_ui_controller.h",
"download/download_ui_model.cc",
@@ -455,13 +451,6 @@ static_library("browser") {
"download/drag_download_item.h",
"download/mixed_content_download_blocking.cc",
"download/mixed_content_download_blocking.h",
- "download/offline_item_model.cc",
- "download/offline_item_model.h",
- "download/offline_item_model_data.h",
- "download/offline_item_model_manager.cc",
- "download/offline_item_model_manager.h",
- "download/offline_item_model_manager_factory.cc",
- "download/offline_item_model_manager_factory.h",
"download/offline_item_utils.cc",
"download/offline_item_utils.h",
"download/save_package_file_picker.cc",
@@ -484,10 +473,6 @@ static_library("browser") {
"enterprise/browser_management/browser_management_service.h",
"enterprise/browser_management/browser_management_status_provider.cc",
"enterprise/browser_management/browser_management_status_provider.h",
- "enterprise/connectors/device_trust/device_trust_factory.cc",
- "enterprise/connectors/device_trust/device_trust_factory.h",
- "enterprise/connectors/device_trust/device_trust_service.cc",
- "enterprise/connectors/device_trust/device_trust_service.h",
"enterprise/util/affiliation.cc",
"enterprise/util/affiliation.h",
"enterprise/util/managed_browser_utils.cc",
@@ -565,14 +550,6 @@ static_library("browser") {
"gpu/gpu_mode_manager.cc",
"gpu/gpu_mode_manager.h",
"hang_monitor/hang_crash_dump.h",
- "heavy_ad_intervention/heavy_ad_blocklist.cc",
- "heavy_ad_intervention/heavy_ad_blocklist.h",
- "heavy_ad_intervention/heavy_ad_features.cc",
- "heavy_ad_intervention/heavy_ad_features.h",
- "heavy_ad_intervention/heavy_ad_helper.cc",
- "heavy_ad_intervention/heavy_ad_helper.h",
- "heavy_ad_intervention/heavy_ad_service.cc",
- "heavy_ad_intervention/heavy_ad_service.h",
"heavy_ad_intervention/heavy_ad_service_factory.cc",
"heavy_ad_intervention/heavy_ad_service_factory.h",
"history/chrome_history_backend_client.cc",
@@ -593,6 +570,10 @@ static_library("browser") {
"history/top_sites_factory.h",
"history/web_history_service_factory.cc",
"history/web_history_service_factory.h",
+ "history_clusters/history_clusters_tab_helper.cc",
+ "history_clusters/history_clusters_tab_helper.h",
+ "history_clusters/memories_service_factory.cc",
+ "history_clusters/memories_service_factory.h",
"icon_loader.cc",
"icon_loader.h",
"icon_manager.cc",
@@ -607,8 +588,6 @@ static_library("browser") {
"infobars/infobar_responder.h",
"infobars/infobar_service.cc",
"infobars/infobar_service.h",
- "installable/digital_asset_links/digital_asset_links_handler.cc",
- "installable/digital_asset_links/digital_asset_links_handler.h",
"installable/installable_utils.cc",
"installable/installable_utils.h",
"internal_auth.cc",
@@ -680,14 +659,8 @@ static_library("browser") {
"lookalikes/lookalike_url_tab_storage.h",
"media/audio_service_util.cc",
"media/audio_service_util.h",
- "media/feeds/media_feeds_utils.cc",
- "media/feeds/media_feeds_utils.h",
"media/history/media_history_contents_observer.cc",
"media/history/media_history_contents_observer.h",
- "media/history/media_history_feed_items_table.cc",
- "media/history/media_history_feed_items_table.h",
- "media/history/media_history_feeds_table.cc",
- "media/history/media_history_feeds_table.h",
"media/history/media_history_images_table.cc",
"media/history/media_history_images_table.h",
"media/history/media_history_keyed_service.cc",
@@ -732,8 +705,6 @@ static_library("browser") {
"media/output_protection_proxy.h",
"media/platform_verification_impl.cc",
"media/platform_verification_impl.h",
- "media/router/media_router_feature.cc",
- "media/router/media_router_feature.h",
"media/webrtc/audio_debug_recordings_handler.cc",
"media/webrtc/audio_debug_recordings_handler.h",
"media/webrtc/camera_pan_tilt_zoom_permission_context.cc",
@@ -859,8 +830,6 @@ static_library("browser") {
"navigation_predictor/navigation_predictor_keyed_service_factory.h",
"navigation_predictor/navigation_predictor_preconnect_client.cc",
"navigation_predictor/navigation_predictor_preconnect_client.h",
- "navigation_predictor/navigation_predictor_renderer_warmup_client.cc",
- "navigation_predictor/navigation_predictor_renderer_warmup_client.h",
"navigation_predictor/search_engine_preconnector.cc",
"navigation_predictor/search_engine_preconnector.h",
"net/chrome_mojo_proxy_resolver_factory.cc",
@@ -869,11 +838,15 @@ static_library("browser") {
"net/chrome_network_delegate.h",
"net/chrome_report_sender.cc",
"net/chrome_report_sender.h",
+ "net/convert_explicitly_allowed_network_ports_pref.cc",
+ "net/convert_explicitly_allowed_network_ports_pref.h",
"net/dns_probe_runner.cc",
"net/dns_probe_runner.h",
"net/dns_probe_service.h",
"net/dns_probe_service_factory.cc",
"net/dns_probe_service_factory.h",
+ "net/explicitly_allowed_network_ports_policy_handler.cc",
+ "net/explicitly_allowed_network_ports_policy_handler.h",
"net/file_downloader.cc",
"net/file_downloader.h",
"net/net_error_diagnostics_dialog.h",
@@ -907,8 +880,8 @@ static_library("browser") {
"net/system_network_context_manager.h",
"net_benchmarking.cc",
"net_benchmarking.h",
- "nfc/nfc_permission_context.cc",
- "nfc/nfc_permission_context.h",
+ "nfc/chrome_nfc_permission_context_delegate.cc",
+ "nfc/chrome_nfc_permission_context_delegate.h",
"notifications/metrics/notification_metrics_logger.cc",
"notifications/metrics/notification_metrics_logger.h",
"notifications/metrics/notification_metrics_logger_factory.cc",
@@ -976,6 +949,8 @@ static_library("browser") {
"optimization_guide/optimization_guide_keyed_service_factory.h",
"optimization_guide/optimization_guide_navigation_data.cc",
"optimization_guide/optimization_guide_navigation_data.h",
+ "optimization_guide/optimization_guide_tab_url_provider.cc",
+ "optimization_guide/optimization_guide_tab_url_provider.h",
"optimization_guide/optimization_guide_top_host_provider.cc",
"optimization_guide/optimization_guide_top_host_provider.h",
"optimization_guide/optimization_guide_web_contents_observer.cc",
@@ -991,14 +966,8 @@ static_library("browser") {
"optimization_guide/prediction/prediction_model_download_observer.h",
"page_load_metrics/observers/aborts_page_load_metrics_observer.cc",
"page_load_metrics/observers/aborts_page_load_metrics_observer.h",
- "page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc",
- "page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.h",
"page_load_metrics/observers/ad_metrics/floc_page_load_metrics_observer.cc",
"page_load_metrics/observers/ad_metrics/floc_page_load_metrics_observer.h",
- "page_load_metrics/observers/ad_metrics/frame_data.cc",
- "page_load_metrics/observers/ad_metrics/frame_data.h",
- "page_load_metrics/observers/ad_metrics/page_ad_density_tracker.cc",
- "page_load_metrics/observers/ad_metrics/page_ad_density_tracker.h",
"page_load_metrics/observers/core/amp_page_load_metrics_observer.cc",
"page_load_metrics/observers/core/amp_page_load_metrics_observer.h",
"page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc",
@@ -1218,10 +1187,8 @@ static_library("browser") {
"policy/javascript_policy_handler.h",
"policy/messaging_layer/public/report_client.cc",
"policy/messaging_layer/public/report_client.h",
- "policy/messaging_layer/public/report_queue.cc",
- "policy/messaging_layer/public/report_queue.h",
- "policy/messaging_layer/public/report_queue_configuration.cc",
- "policy/messaging_layer/public/report_queue_configuration.h",
+ "policy/messaging_layer/public/report_queue_impl.cc",
+ "policy/messaging_layer/public/report_queue_impl.h",
"policy/messaging_layer/upload/dm_server_upload_service.cc",
"policy/messaging_layer/upload/dm_server_upload_service.h",
"policy/messaging_layer/upload/record_handler_impl.cc",
@@ -1359,6 +1326,8 @@ static_library("browser") {
"prefetch/search_prefetch/streaming_search_prefetch_request.h",
"prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc",
"prefetch/search_prefetch/streaming_search_prefetch_url_loader.h",
+ "prefetch/speculation_host_impl.cc",
+ "prefetch/speculation_host_impl.h",
"prefs/browser_prefs.cc",
"prefs/browser_prefs.h",
"prefs/chrome_command_line_pref_store.cc",
@@ -1369,8 +1338,6 @@ static_library("browser") {
"prefs/chrome_pref_service_factory.h",
"prefs/incognito_mode_prefs.cc",
"prefs/incognito_mode_prefs.h",
- "prefs/origin_trial_prefs.cc",
- "prefs/origin_trial_prefs.h",
"prefs/pref_metrics_service.cc",
"prefs/pref_metrics_service.h",
"prefs/pref_service_incognito_allowlist.cc",
@@ -1381,20 +1348,6 @@ static_library("browser") {
"prefs/profile_pref_store_manager.h",
"prefs/session_startup_pref.cc",
"prefs/session_startup_pref.h",
- "previews/previews_content_util.cc",
- "previews/previews_content_util.h",
- "previews/previews_https_notification_infobar_decider.cc",
- "previews/previews_https_notification_infobar_decider.h",
- "previews/previews_lite_page_infobar_delegate.cc",
- "previews/previews_lite_page_infobar_delegate.h",
- "previews/previews_service.cc",
- "previews/previews_service.h",
- "previews/previews_service_factory.cc",
- "previews/previews_service_factory.h",
- "previews/previews_ui_tab_helper.cc",
- "previews/previews_ui_tab_helper.h",
- "previews/resource_loading_hints/resource_loading_hints_web_contents_observer.cc",
- "previews/resource_loading_hints/resource_loading_hints_web_contents_observer.h",
"privacy_sandbox/privacy_sandbox_settings.cc",
"privacy_sandbox/privacy_sandbox_settings.h",
"privacy_sandbox/privacy_sandbox_settings_factory.cc",
@@ -1421,8 +1374,6 @@ static_library("browser") {
"profiles/guest_mode_policy_handler.h",
"profiles/guest_signin_observer_factory.cc",
"profiles/guest_signin_observer_factory.h",
- "profiles/incognito_helpers.cc",
- "profiles/incognito_helpers.h",
"profiles/incognito_mode_policy_handler.cc",
"profiles/incognito_mode_policy_handler.h",
"profiles/off_the_record_profile_impl.cc",
@@ -1450,8 +1401,6 @@ static_library("browser") {
"profiles/profile_info_interface.h",
"profiles/profile_io_data.cc",
"profiles/profile_io_data.h",
- "profiles/profile_io_data_handle.cc",
- "profiles/profile_io_data_handle.h",
"profiles/profile_keep_alive_types.cc",
"profiles/profile_keep_alive_types.h",
"profiles/profile_key.cc",
@@ -1589,8 +1538,6 @@ static_library("browser") {
"sharesheet/sharesheet_types.h",
"sharing/ack_message_handler.cc",
"sharing/ack_message_handler.h",
- "sharing/click_to_call/feature.cc",
- "sharing/click_to_call/feature.h",
"sharing/features.cc",
"sharing/features.h",
"sharing/ping_message_handler.cc",
@@ -1637,8 +1584,6 @@ static_library("browser") {
"sharing/sharing_sync_preference.h",
"sharing/sharing_utils.cc",
"sharing/sharing_utils.h",
- "sharing/sms/sms_fetch_request_handler.cc",
- "sharing/sms/sms_fetch_request_handler.h",
"sharing/sms/sms_flags.cc",
"sharing/sms/sms_flags.h",
"sharing/sms/sms_remote_fetcher.cc",
@@ -1651,6 +1596,8 @@ static_library("browser") {
"sharing/web_push/web_push_common.h",
"sharing/web_push/web_push_sender.cc",
"sharing/web_push/web_push_sender.h",
+ "sharing_hub/sharing_hub_features.cc",
+ "sharing_hub/sharing_hub_features.h",
"shell_integration.cc",
"shell_integration.h",
"signin/about_signin_internals_factory.cc",
@@ -1686,8 +1633,6 @@ static_library("browser") {
"signin/identity_manager_factory.h",
"signin/investigator_dependency_provider.cc",
"signin/investigator_dependency_provider.h",
- "signin/local_auth.cc",
- "signin/local_auth.h",
"signin/reauth_result.h",
"signin/reauth_tab_helper.cc",
"signin/reauth_tab_helper.h",
@@ -1705,6 +1650,7 @@ static_library("browser") {
"signin/signin_promo_util.h",
"signin/signin_util.cc",
"signin/signin_util.h",
+ "site_isolation/about_flags.h",
"site_isolation/prefs_observer.cc",
"site_isolation/prefs_observer.h",
"site_isolation/site_details.cc",
@@ -1713,10 +1659,9 @@ static_library("browser") {
"speech/chrome_speech_recognition_manager_delegate.h",
"speech/network_speech_recognizer.cc",
"speech/network_speech_recognizer.h",
- "speech/soda_speech_recognizer.cc",
- "speech/soda_speech_recognizer.h",
"speech/speech_recognizer.cc",
"speech/speech_recognizer.h",
+ "speech/speech_recognizer_delegate.cc",
"speech/speech_recognizer_delegate.h",
"ssl/certificate_error_reporter.cc",
"ssl/certificate_error_reporter.h",
@@ -1788,6 +1733,8 @@ static_library("browser") {
"sync/bookmark_sync_service_factory.h",
"sync/chrome_sync_client.cc",
"sync/chrome_sync_client.h",
+ "sync/device_info_sync_client_impl.cc",
+ "sync/device_info_sync_client_impl.h",
"sync/device_info_sync_service_factory.cc",
"sync/device_info_sync_service_factory.h",
"sync/glue/extensions_activity_monitor.cc",
@@ -1915,6 +1862,9 @@ static_library("browser") {
"//chrome/browser/safe_browsing:verdict_cache_manager_factory",
"//chrome/browser/safe_browsing:advanced_protection",
"//chrome/browser/safe_browsing:metrics_collector",
+
+ # TODO(crbug.com/1030821): Eliminate usages of browser.h from Media Router.
+ "//chrome/browser/media/router",
]
public_deps = [
@@ -1930,10 +1880,6 @@ static_library("browser") {
"//components/payments/core",
"//components/payments/core:error_strings",
"//components/policy/proto",
- "//components/reporting/storage:storage_uploader_interface",
- "//components/reporting/util:shared_queue",
- "//components/reporting/util:status_macros",
- "//components/reporting/util:task_runner_context",
"//components/safe_browsing:buildflags",
"//components/services/storage/public/mojom",
"//components/sync",
@@ -1975,9 +1921,8 @@ static_library("browser") {
"//chrome/browser/image_decoder",
"//chrome/browser/media:media_engagement_preload_proto",
"//chrome/browser/media:mojo_bindings",
- "//chrome/browser/media/feeds:mojo_bindings",
- "//chrome/browser/media/feeds:proto",
"//chrome/browser/media/router",
+ "//chrome/browser/media/router:media_router_feature",
"//chrome/browser/metrics:expired_histograms_array",
"//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory",
"//chrome/browser/net:probe_message_proto",
@@ -1988,6 +1933,7 @@ static_library("browser") {
"//chrome/browser/persisted_state_db:persisted_state_db_content_proto",
"//chrome/browser/policy:path_parser",
"//chrome/browser/privacy_budget",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/browser/profiling_host",
"//chrome/browser/promo_browser_command:mojo_bindings",
@@ -2009,10 +1955,13 @@ static_library("browser") {
"//chrome/browser/ui/webui/app_management:mojo_bindings",
"//chrome/browser/ui/webui/bluetooth_internals",
"//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings",
+ "//chrome/browser/ui/webui/download_shelf:mojo_bindings",
"//chrome/browser/ui/webui/downloads:mojo_bindings",
+ "//chrome/browser/ui/webui/internals/user_education:mojo_bindings",
"//chrome/browser/ui/webui/internals/web_app:mojo_bindings",
"//chrome/browser/ui/webui/memories:mojo_bindings",
"//chrome/browser/ui/webui/new_tab_page:mojo_bindings",
+ "//chrome/browser/ui/webui/new_tab_page_third_party:mojo_bindings",
"//chrome/browser/ui/webui/omnibox:mojo_bindings",
"//chrome/browser/ui/webui/read_later:mojo_bindings",
"//chrome/browser/ui/webui/realbox:mojo_bindings",
@@ -2028,12 +1977,12 @@ static_library("browser") {
"//chrome/common/performance_manager/mojom",
"//chrome/common/printing:printing",
"//chrome/installer/util:with_no_strings",
- "//chrome/services/machine_learning/public/cpp",
- "//chrome/services/machine_learning/public/mojom",
"//components/assist_ranker",
"//components/autofill/content/browser",
"//components/autofill/core/browser",
"//components/autofill_assistant/browser/public:public",
+ "//components/back_forward_cache",
+ "//components/background_fetch",
"//components/background_sync",
"//components/background_task_scheduler",
"//components/blocked_content",
@@ -2071,6 +2020,7 @@ static_library("browser") {
"//components/data_reduction_proxy/core/browser",
"//components/data_use_measurement/core:ascriber",
"//components/device_event_log",
+ "//components/digital_asset_links",
"//components/dom_distiller/content/browser",
"//components/dom_distiller/content/common/mojom",
"//components/domain_reliability",
@@ -2080,9 +2030,11 @@ static_library("browser") {
"//components/download/public/background_service:public",
"//components/embedder_support",
"//components/embedder_support:browser_util",
+ "//components/embedder_support/origin_trials",
"//components/encrypted_messages",
"//components/enterprise",
"//components/enterprise/common/proto:connectors_proto",
+ "//components/enterprise/common/proto:extensions_workflow_events_proto",
"//components/error_page/common",
"//components/error_page/content/browser",
"//components/favicon/content",
@@ -2100,10 +2052,12 @@ static_library("browser") {
"//components/flags_ui",
"//components/gcm_driver",
"//components/handoff",
+ "//components/heavy_ad_intervention",
"//components/history/content/browser",
"//components/history/core/browser",
"//components/history/core/common",
"//components/history/metrics",
+ "//components/history_clusters/core",
"//components/infobars/content",
"//components/infobars/core",
"//components/invalidation/impl",
@@ -2117,8 +2071,6 @@ static_library("browser") {
"//components/leveldb_proto",
"//components/lookalikes/core",
"//components/lookalikes/core:features",
- "//components/memories/content",
- "//components/memories/core",
"//components/metrics:call_stack_profile_collector",
"//components/metrics:call_stack_profile_params",
"//components/metrics:component_metrics",
@@ -2150,6 +2102,7 @@ static_library("browser") {
"//components/optimization_guide/core",
"//components/os_crypt",
"//components/page_load_metrics/browser",
+ "//components/page_load_metrics/browser/observers/ad_metrics",
"//components/page_load_metrics/common",
"//components/paint_preview/buildflags",
"//components/paint_preview/features",
@@ -2167,8 +2120,6 @@ static_library("browser") {
"//components/policy/core/browser",
"//components/policy/proto",
"//components/prefs",
- "//components/previews/content",
- "//components/previews/core",
"//components/printing/browser",
"//components/privacy_sandbox:privacy_sandbox_prefs",
"//components/profile_metrics",
@@ -2178,14 +2129,23 @@ static_library("browser") {
"//components/reading_list/core",
"//components/reading_list/features:flags",
"//components/renderer_context_menu",
+ "//components/reporting/client:report_queue",
+ "//components/reporting/client:report_queue_configuration",
+ "//components/reporting/client:report_queue_provider",
"//components/reporting/encryption:encryption_module",
+ "//components/reporting/encryption:encryption_module_interface",
"//components/reporting/encryption:verification",
"//components/reporting/proto:record_constants",
"//components/reporting/proto:record_proto",
"//components/reporting/storage:storage_configuration",
"//components/reporting/storage:storage_module",
+ "//components/reporting/storage:storage_uploader_interface",
+ "//components/reporting/storage_selector",
+ "//components/reporting/util:shared_queue",
"//components/reporting/util:status",
+ "//components/reporting/util:status_macros",
"//components/reporting/util:status_proto",
+ "//components/reporting/util:task_runner_context",
"//components/reputation/core",
"//components/reputation/core:proto",
"//components/resources",
@@ -2355,6 +2315,7 @@ static_library("browser") {
"//third_party/blink/public:resources",
"//third_party/blink/public:scaled_resources",
"//third_party/blink/public/common",
+ "//third_party/blink/public/common:buildflags",
"//third_party/icu",
"//third_party/leveldatabase",
"//third_party/libaddressinput",
@@ -2406,12 +2367,16 @@ static_library("browser") {
deps += [
"//ash/components/audio",
"//ash/constants",
+ "//ash/content/scanning",
+ "//ash/content/scanning/mojom",
"//chrome/app/theme:chrome_unscaled_resources_grit",
"//chrome/browser/nearby_sharing/common",
"//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
+ "//chrome/browser/ui/webui/chromeos/emoji:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
+ "//chrome/browser/ui/webui/chromeos/vm:mojo_bindings",
"//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
"//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings",
"//chromeos/components/camera_app_ui",
@@ -2420,6 +2385,8 @@ static_library("browser") {
"//chromeos/components/connectivity_diagnostics",
"//chromeos/components/diagnostics_ui",
"//chromeos/components/diagnostics_ui/mojom",
+ "//chromeos/components/eche_app_ui",
+ "//chromeos/components/eche_app_ui/mojom",
"//chromeos/components/help_app_ui",
"//chromeos/components/help_app_ui:mojo_bindings",
"//chromeos/components/local_search_service",
@@ -2428,15 +2395,17 @@ static_library("browser") {
"//chromeos/components/media_app_ui",
"//chromeos/components/media_app_ui:mojo_bindings",
"//chromeos/components/multidevice/debug_webui",
+ "//chromeos/components/personalization_app",
+ "//chromeos/components/personalization_app/mojom",
"//chromeos/components/print_management",
"//chromeos/components/print_management/mojom",
"//chromeos/components/quick_answers/public/cpp:prefs",
- "//chromeos/components/scanning",
- "//chromeos/components/scanning/mojom",
"//chromeos/dbus/attestation",
"//chromeos/dbus/attestation:attestation_proto",
"//chromeos/dbus/cryptohome",
"//chromeos/dbus/power",
+ "//chromeos/dbus/userdataauth:userdataauth",
+ "//chromeos/dbus/userdataauth:userdataauth_proto",
"//chromeos/services/device_sync/public/cpp:prefs",
"//chromeos/services/multidevice_setup/public/cpp",
"//chromeos/services/multidevice_setup/public/cpp:prefs",
@@ -2468,21 +2437,6 @@ static_library("browser") {
]
}
- if (build_with_tflite_lib) {
- sources += [
- "tflite_experiment/tflite_experiment_keyed_service.cc",
- "tflite_experiment/tflite_experiment_keyed_service.h",
- "tflite_experiment/tflite_experiment_keyed_service_factory.cc",
- "tflite_experiment/tflite_experiment_keyed_service_factory.h",
- "tflite_experiment/tflite_experiment_observer.cc",
- "tflite_experiment/tflite_experiment_observer.h",
- "tflite_experiment/tflite_experiment_switches.cc",
- "tflite_experiment/tflite_experiment_switches.h",
- ]
-
- public_deps += [ "//chrome/services/machine_learning" ]
- }
-
# Platforms that have a network diagnostics dialog. All others fall through
# to the stub which is not implemented.
if (is_chromeos_ash) {
@@ -2537,6 +2491,8 @@ static_library("browser") {
"android/autofill_assistant/onboarding_coordinator_bridge.cc",
"android/autofill_assistant/onboarding_fetcher_factory.cc",
"android/autofill_assistant/onboarding_fetcher_factory.h",
+ "android/autofill_assistant/starter_android.cc",
+ "android/autofill_assistant/starter_android.h",
"android/autofill_assistant/trigger_script_bridge_android.cc",
"android/autofill_assistant/trigger_script_bridge_android.h",
"android/autofill_assistant/ui_controller_android.cc",
@@ -2571,6 +2527,7 @@ static_library("browser") {
"android/chrome_backup_agent.h",
"android/chrome_backup_watcher.cc",
"android/chrome_backup_watcher.h",
+ "android/chrome_power_mode_voter.cc",
"android/chrome_startup_flags.cc",
"android/chrome_startup_flags.h",
"android/compose_bitmaps_helper.cc",
@@ -2605,6 +2562,8 @@ static_library("browser") {
"android/compositor/resources/toolbar_resource.h",
"android/compositor/scene_layer/contextual_search_scene_layer.cc",
"android/compositor/scene_layer/contextual_search_scene_layer.h",
+ "android/compositor/scene_layer/continuous_search_scene_layer.cc",
+ "android/compositor/scene_layer/continuous_search_scene_layer.h",
"android/compositor/scene_layer/overscroll_scene_layer.cc",
"android/compositor/scene_layer/overscroll_scene_layer.h",
"android/compositor/scene_layer/scrolling_bottom_view_scene_layer.cc",
@@ -2732,6 +2691,7 @@ static_library("browser") {
"android/feed/v2/feed_stream_surface.h",
"android/feed/v2/refresh_task_scheduler_impl.cc",
"android/feed/v2/refresh_task_scheduler_impl.h",
+ "android/feed/v2/web_feed_bridge.cc",
"android/feedback/connectivity_checker.cc",
"android/feedback/screenshot_mode.h",
"android/feedback/screenshot_task.cc",
@@ -2770,7 +2730,6 @@ static_library("browser") {
"android/hung_renderer_infobar_delegate.h",
"android/image_fetcher/image_fetcher_bridge.cc",
"android/image_fetcher/image_fetcher_bridge.h",
- "android/installedapp/installed_app_verifier.cc",
"android/instantapps/instant_apps_infobar_delegate.cc",
"android/instantapps/instant_apps_infobar_delegate.h",
"android/instantapps/instant_apps_settings.cc",
@@ -2794,10 +2753,7 @@ static_library("browser") {
"android/metrics/android_profile_session_durations_service.h",
"android/metrics/android_profile_session_durations_service_factory.cc",
"android/metrics/android_profile_session_durations_service_factory.h",
- "android/metrics/background_task_memory_metrics_emitter.cc",
- "android/metrics/background_task_memory_metrics_emitter.h",
"android/metrics/launch_metrics.cc",
- "android/metrics/ukm_recorder.cc",
"android/metrics/uma_session_stats.cc",
"android/metrics/uma_session_stats.h",
"android/metrics/uma_utils.cc",
@@ -2848,13 +2804,6 @@ static_library("browser") {
"android/profile_key_startup_accessor.h",
"android/profile_key_util.cc",
"android/profile_key_util.h",
- "android/provider/blocking_ui_thread_async_request.cc",
- "android/provider/blocking_ui_thread_async_request.h",
- "android/provider/bookmark_model_task.cc",
- "android/provider/bookmark_model_task.h",
- "android/provider/chrome_browser_provider.cc",
- "android/provider/chrome_browser_provider.h",
- "android/provider/run_on_ui_thread_blocking.h",
"android/reading_list/reading_list_bridge.cc",
"android/reading_list/reading_list_bridge.h",
"android/reading_list/reading_list_manager_factory.cc",
@@ -2901,6 +2850,7 @@ static_library("browser") {
"android/signin/web_signin_bridge.h",
"android/startup_bridge.cc",
"android/startup_bridge.h",
+ "android/survey/http_client_type.h",
"android/survey/survey_http_client.cc",
"android/survey/survey_http_client.h",
"android/survey/survey_http_client_bridge.cc",
@@ -2953,7 +2903,6 @@ static_library("browser") {
"android/webapk/webapk_update_manager.cc",
"android/webapps/webapp_registry.cc",
"android/webapps/webapp_registry.h",
- "android/webauth/fido2helper_native_android.cc",
"autofill/accessory_controller.h",
"autofill/address_accessory_controller.h",
"autofill/address_accessory_controller_impl.cc",
@@ -2963,6 +2912,13 @@ static_library("browser") {
"autofill/android/personal_data_manager_android.cc",
"autofill/android/personal_data_manager_android.h",
"autofill/android/phone_number_util_android.cc",
+ "autofill/android/save_address_profile_flow_manager.cc",
+ "autofill/android/save_address_profile_flow_manager.h",
+ "autofill/android/save_address_profile_message_controller.cc",
+ "autofill/android/save_address_profile_message_controller.h",
+ "autofill/android/save_address_profile_prompt_controller.cc",
+ "autofill/android/save_address_profile_prompt_controller.h",
+ "autofill/android/save_address_profile_prompt_view.h",
"autofill/autofill_keyboard_accessory_adapter.cc",
"autofill/autofill_keyboard_accessory_adapter.h",
"autofill/credit_card_accessory_controller.h",
@@ -2982,6 +2938,7 @@ static_library("browser") {
"chrome_browser_field_trials_mobile.h",
"chrome_browser_main_android.cc",
"chrome_browser_main_android.h",
+ "commerce/merchant_viewer/web_contents_helper.cc",
"crash_upload_list/crash_upload_list_android.cc",
"crash_upload_list/crash_upload_list_android.h",
"data_reduction_proxy/data_reduction_promo_infobar_delegate_android.cc",
@@ -3035,14 +2992,6 @@ static_library("browser") {
"flags/android/chrome_feature_list.h",
"geolocation/geolocation_permission_context_delegate_android.cc",
"geolocation/geolocation_permission_context_delegate_android.h",
- "history/android/android_history_provider_service.cc",
- "history/android/android_history_provider_service.h",
- "history/android/android_provider_backend.cc",
- "history/android/android_provider_backend.h",
- "history/android/bookmark_model_sql_handler.cc",
- "history/android/bookmark_model_sql_handler.h",
- "history/android/sqlite_cursor.cc",
- "history/android/sqlite_cursor.h",
"icon_loader_android.cc",
"installable/installed_webapp_bridge.cc",
"installable/installed_webapp_bridge.h",
@@ -3053,6 +3002,9 @@ static_library("browser") {
"installable/installed_webapp_provider.cc",
"installable/installed_webapp_provider.h",
"installable/quality_enforcer.cc",
+ "lens/android/lens_policy_utils.cc",
+ "lens/android/lens_prefs.cc",
+ "lens/android/lens_prefs.h",
"lifetime/application_lifetime_android.cc",
"lifetime/application_lifetime_android.h",
"long_screenshots/long_screenshots_tab_service_factory.cc",
@@ -3077,8 +3029,6 @@ static_library("browser") {
"metrics/page_load_metrics_provider.h",
"metrics/thread_watcher_android.cc",
"metrics/thread_watcher_android.h",
- "nfc/nfc_permission_context_android.cc",
- "nfc/nfc_permission_context_android.h",
"notifications/notification_channels_provider_android.cc",
"notifications/notification_channels_provider_android.h",
"notifications/notification_platform_bridge_android.cc",
@@ -3095,6 +3045,8 @@ static_library("browser") {
"offline_pages/prefetch/notifications/prefetch_notification_service_factory.h",
"optimization_guide/android/optimization_guide_bridge.cc",
"optimization_guide/android/optimization_guide_bridge.h",
+ "optimization_guide/android/optimization_guide_tab_url_provider_android.cc",
+ "optimization_guide/android/optimization_guide_tab_url_provider_android.h",
"page_load_metrics/observers/android_page_load_metrics_observer.cc",
"page_load_metrics/observers/android_page_load_metrics_observer.h",
"password_check/android/password_check_bridge.cc",
@@ -3117,6 +3069,8 @@ static_library("browser") {
"password_manager/android/credential_leak_controller_android.h",
"password_manager/android/generated_password_saved_infobar_delegate_android.cc",
"password_manager/android/generated_password_saved_infobar_delegate_android.h",
+ "password_manager/android/generated_password_saved_message_delegate.cc",
+ "password_manager/android/generated_password_saved_message_delegate.h",
"password_manager/android/password_accessory_controller.h",
"password_manager/android/password_accessory_controller_impl.cc",
"password_manager/android/password_accessory_controller_impl.h",
@@ -3161,11 +3115,11 @@ static_library("browser") {
"policy/cloud/user_policy_signin_service_mobile.cc",
"policy/cloud/user_policy_signin_service_mobile.h",
"policy/policy_service_factory_android.cc",
- "previews/android/previews_android_bridge.cc",
- "previews/android/previews_android_bridge.h",
"privacy/secure_dns_bridge.cc",
"privacy_sandbox/android/privacy_sandbox_bridge.cc",
"profiles/android/profile_manager_utils.cc",
+ "profiles/android/profile_resolver.cc",
+ "profiles/android/profile_resolver.h",
"profiles/incognito_utils_android.cc",
"profiles/profile_android.cc",
"profiles/profile_android.h",
@@ -3196,6 +3150,8 @@ static_library("browser") {
"sharing/shared_clipboard/shared_clipboard_message_handler_android.h",
"sharing/sharing_service_proxy_android.cc",
"sharing/sharing_service_proxy_android.h",
+ "sharing/sms/sms_fetch_request_handler.cc",
+ "sharing/sms/sms_fetch_request_handler.h",
"shell_integration_android.cc",
"signin/identity_services_provider_android.cc",
"signin/signin_manager_android_factory.cc",
@@ -3206,6 +3162,8 @@ static_library("browser") {
"ssl/chrome_security_state_model_delegate.h",
"ssl/known_interception_disclosure_infobar.cc",
"ssl/known_interception_disclosure_infobar.h",
+ "subresource_redirect/android/previews_android_bridge.cc",
+ "subresource_redirect/android/previews_android_bridge.h",
"sync/glue/synced_tab_delegate_android.cc",
"sync/glue/synced_tab_delegate_android.h",
"sync/glue/synced_window_delegate_android.cc",
@@ -3239,18 +3197,24 @@ static_library("browser") {
":client_discourse_context_proto",
":delta_file_proto",
":explore_sites_proto",
+ ":profile_token",
":usage_stats_proto",
"//chrome/android:jni_headers",
"//chrome/android/modules/extra_icu/provider:native",
"//chrome/browser/android/webapk:proto",
"//chrome/browser/banners/android:jni_headers",
+ "//chrome/browser/commerce/merchant_viewer:merchant_signal_db",
+ "//chrome/browser/commerce/merchant_viewer:merchant_signal_db_content_proto",
+ "//chrome/browser/commerce/merchant_viewer/android:jni_headers",
"//chrome/browser/commerce/subscriptions:commerce_subscription_db",
"//chrome/browser/commerce/subscriptions:commerce_subscription_db_content_proto",
"//chrome/browser/commerce/subscriptions/android:jni_headers",
"//chrome/browser/consent_auditor/android:jni_headers",
+ "//chrome/browser/continuous_search:jni_headers",
"//chrome/browser/continuous_search/internal",
"//chrome/browser/download/internal/android",
"//chrome/browser/endpoint_fetcher:jni_headers",
+ "//chrome/browser/feed/android:jni_headers",
"//chrome/browser/feedback/android",
"//chrome/browser/flags:flags_android",
"//chrome/browser/language/android:jni_headers",
@@ -3302,6 +3266,7 @@ static_library("browser") {
"//components/crash/android:crash_android",
"//components/embedder_support/android:browser_context",
"//components/embedder_support/android:context_menu",
+ "//components/embedder_support/android:simple_factory_key",
"//components/embedder_support/android:util",
"//components/embedder_support/android:web_contents_delegate",
"//components/external_intents/android",
@@ -3312,6 +3277,7 @@ static_library("browser") {
"//components/feed/core/v2:feed_core_v2",
"//components/image_fetcher/core:metrics",
"//components/infobars/android",
+ "//components/installedapp/android",
"//components/invalidation/impl:feature_list",
"//components/javascript_dialogs/android:jni_headers",
"//components/language/android:language_bridge",
@@ -3332,7 +3298,7 @@ static_library("browser") {
"//components/payments/content/android",
"//components/payments/content/android:jni_headers",
"//components/permissions/android:native",
- "//components/power_metrics",
+ "//components/power_scheduler",
"//components/query_tiles",
"//components/reading_list/features:flags",
"//components/resources:android_resources",
@@ -3346,8 +3312,10 @@ static_library("browser") {
"//components/subresource_filter/android",
"//components/thin_webview/internal",
"//components/translate/core/language_detection",
+ "//components/ukm/android:ukm_recorder",
"//components/ukm/content",
"//components/viz/common",
+ "//components/webauthn/android",
"//device/fido:cablev2_registration",
"//ipc:param_traits",
"//media/mojo/clients",
@@ -3420,28 +3388,31 @@ static_library("browser") {
"apps/app_service/app_launch_params.h",
"apps/app_service/app_service_metrics.cc",
"apps/app_service/app_service_metrics.h",
- "apps/app_service/app_service_proxy.cc",
"apps/app_service/app_service_proxy.h",
+ "apps/app_service/app_service_proxy_base.cc",
+ "apps/app_service/app_service_proxy_base.h",
+ "apps/app_service/app_service_proxy_desktop.cc",
+ "apps/app_service/app_service_proxy_desktop.h",
"apps/app_service/app_service_proxy_factory.cc",
"apps/app_service/app_service_proxy_factory.h",
"apps/app_service/browser_app_launcher.cc",
"apps/app_service/browser_app_launcher.h",
"apps/app_service/dip_px_util.cc",
"apps/app_service/dip_px_util.h",
- "apps/app_service/extension_apps.cc",
- "apps/app_service/extension_apps.h",
- "apps/app_service/extension_apps_base.cc",
- "apps/app_service/extension_apps_base.h",
"apps/app_service/extension_uninstaller.cc",
"apps/app_service/extension_uninstaller.h",
"apps/app_service/icon_key_util.cc",
"apps/app_service/icon_key_util.h",
"apps/app_service/launch_utils.cc",
"apps/app_service/launch_utils.h",
- "apps/app_service/web_apps.cc",
- "apps/app_service/web_apps.h",
- "apps/app_service/web_apps_base.cc",
- "apps/app_service/web_apps_base.h",
+ "apps/app_service/publishers/extension_apps.cc",
+ "apps/app_service/publishers/extension_apps.h",
+ "apps/app_service/publishers/extension_apps_base.cc",
+ "apps/app_service/publishers/extension_apps_base.h",
+ "apps/app_service/publishers/web_apps.cc",
+ "apps/app_service/publishers/web_apps.h",
+ "apps/app_service/publishers/web_apps_base.cc",
+ "apps/app_service/publishers/web_apps_base.h",
"apps/intent_helper/apps_navigation_throttle.cc",
"apps/intent_helper/apps_navigation_throttle.h",
"apps/intent_helper/apps_navigation_types.cc",
@@ -3487,8 +3458,6 @@ static_library("browser") {
"cart/commerce_hint_service.cc",
"cart/commerce_hint_service.h",
"certificate_viewer.h",
- "chrome_browser_field_trials_desktop.cc",
- "chrome_browser_field_trials_desktop.h",
"chrome_process_singleton.cc",
"chrome_process_singleton.h",
"component_updater/intervention_policy_database_component_installer.cc",
@@ -3511,6 +3480,8 @@ static_library("browser") {
"device_api/managed_configuration_api.h",
"device_api/managed_configuration_api_factory.cc",
"device_api/managed_configuration_api_factory.h",
+ "device_api/managed_configuration_service.cc",
+ "device_api/managed_configuration_service.h",
"device_api/managed_configuration_store.cc",
"device_api/managed_configuration_store.h",
"device_identity/device_identity_provider.cc",
@@ -3554,6 +3525,13 @@ static_library("browser") {
"download/download_shelf_context_menu.h",
"download/download_shelf_controller.cc",
"download/download_shelf_controller.h",
+ "download/offline_item_model.cc",
+ "download/offline_item_model.h",
+ "download/offline_item_model_data.h",
+ "download/offline_item_model_manager.cc",
+ "download/offline_item_model_manager.h",
+ "download/offline_item_model_manager_factory.cc",
+ "download/offline_item_model_manager_factory.h",
"enterprise/connectors/analysis/analysis_service_settings.cc",
"enterprise/connectors/analysis/analysis_service_settings.h",
"enterprise/connectors/analysis/content_analysis_delegate.cc",
@@ -3568,6 +3546,10 @@ static_library("browser") {
"enterprise/connectors/connectors_prefs.h",
"enterprise/connectors/connectors_service.cc",
"enterprise/connectors/connectors_service.h",
+ "enterprise/connectors/device_trust/device_trust_factory.cc",
+ "enterprise/connectors/device_trust/device_trust_factory.h",
+ "enterprise/connectors/device_trust/device_trust_service.cc",
+ "enterprise/connectors/device_trust/device_trust_service.h",
"enterprise/connectors/device_trust/signal_reporter.cc",
"enterprise/connectors/device_trust/signal_reporter.h",
"enterprise/connectors/enterprise_connectors_policy_handler.cc",
@@ -3614,6 +3596,8 @@ static_library("browser") {
"enterprise/reporting/report_scheduler_desktop.h",
"enterprise/reporting/reporting_delegate_factory_desktop.cc",
"enterprise/reporting/reporting_delegate_factory_desktop.h",
+ "enterprise/signals/context_info_fetcher.cc",
+ "enterprise/signals/context_info_fetcher.h",
"enterprise/signals/device_info_fetcher.cc",
"enterprise/signals/device_info_fetcher.h",
"feedback/feedback_dialog_utils.cc",
@@ -3673,16 +3657,6 @@ static_library("browser") {
"lifetime/termination_notification.h",
"media/capture_access_handler_base.cc",
"media/capture_access_handler_base.h",
- "media/feeds/media_feeds_contents_observer.cc",
- "media/feeds/media_feeds_contents_observer.h",
- "media/feeds/media_feeds_converter.cc",
- "media/feeds/media_feeds_converter.h",
- "media/feeds/media_feeds_fetcher.cc",
- "media/feeds/media_feeds_fetcher.h",
- "media/feeds/media_feeds_service.cc",
- "media/feeds/media_feeds_service.h",
- "media/feeds/media_feeds_service_factory.cc",
- "media/feeds/media_feeds_service_factory.h",
"media/unified_autoplay_config.cc",
"media/unified_autoplay_config.h",
"media/webrtc/current_tab_desktop_media_list.cc",
@@ -3774,6 +3748,8 @@ static_library("browser") {
"metrics/usage_scenario/usage_scenario_tracker.h",
"metrics/usage_scenario/video_capture_event_provider.cc",
"metrics/usage_scenario/video_capture_event_provider.h",
+ "metrics/usage_scenario/webrtc_event_provider.cc",
+ "metrics/usage_scenario/webrtc_event_provider.h",
"notifications/muted_notification_handler.cc",
"notifications/muted_notification_handler.h",
"notifications/notification_system_observer.cc",
@@ -3843,8 +3819,8 @@ static_library("browser") {
"renderer_context_menu/accessibility_labels_bubble_model.h",
"renderer_context_menu/accessibility_labels_menu_observer.cc",
"renderer_context_menu/accessibility_labels_menu_observer.h",
- "renderer_context_menu/copy_link_to_text_menu_observer.cc",
- "renderer_context_menu/copy_link_to_text_menu_observer.h",
+ "renderer_context_menu/link_to_text_menu_observer.cc",
+ "renderer_context_menu/link_to_text_menu_observer.h",
"renderer_context_menu/render_view_context_menu.cc",
"renderer_context_menu/render_view_context_menu.h",
"renderer_context_menu/spelling_bubble_model.cc",
@@ -3919,14 +3895,10 @@ static_library("browser") {
"search/instant_service_factory.h",
"search/instant_service_observer.cc",
"search/instant_service_observer.h",
- "search/local_ntp_source.cc",
- "search/local_ntp_source.h",
"search/most_visited_iframe_source.cc",
"search/most_visited_iframe_source.h",
"search/ntp_custom_background_enabled_policy_handler.cc",
"search/ntp_custom_background_enabled_policy_handler.h",
- "search/ntp_icon_source.cc",
- "search/ntp_icon_source.h",
"search/one_google_bar/one_google_bar_data.cc",
"search/one_google_bar/one_google_bar_data.h",
"search/one_google_bar/one_google_bar_loader.h",
@@ -3977,6 +3949,8 @@ static_library("browser") {
"serial/serial_chooser_context_factory.cc",
"serial/serial_chooser_context_factory.h",
"serial/serial_chooser_histograms.h",
+ "serial/serial_policy_allowed_ports.cc",
+ "serial/serial_policy_allowed_ports.h",
"sessions/closed_tab_cache_service.cc",
"sessions/closed_tab_cache_service.h",
"sessions/closed_tab_cache_service_factory.cc",
@@ -4019,6 +3993,8 @@ static_library("browser") {
"sharing/sharing_notification_handler.h",
"sharing/sharing_ui_controller.cc",
"sharing/sharing_ui_controller.h",
+ "sharing/sms/sms_remote_fetcher_ui_controller.cc",
+ "sharing/sms/sms_remote_fetcher_ui_controller.h",
"signin/signin_promo.cc",
"signin/signin_promo.h",
"signin/signin_ui_util.cc",
@@ -4142,6 +4118,8 @@ static_library("browser") {
"themes/custom_theme_supplier.h",
"themes/increased_contrast_theme_supplier.cc",
"themes/increased_contrast_theme_supplier.h",
+ "themes/theme_color_policy_handler.cc",
+ "themes/theme_color_policy_handler.h",
"themes/theme_helper.cc",
"themes/theme_helper.h",
"themes/theme_properties.cc",
@@ -4149,6 +4127,7 @@ static_library("browser") {
"themes/theme_service.h",
"themes/theme_service_factory.cc",
"themes/theme_service_factory.h",
+ "themes/theme_service_observer.h",
"themes/theme_syncable_service.cc",
"themes/theme_syncable_service.h",
"upgrade_detector/build_state.cc",
@@ -4191,7 +4170,6 @@ static_library("browser") {
"//chrome/browser/resource_coordinator:tab_metrics_event_proto",
"//chrome/browser/resource_coordinator/tab_ranker",
"//chrome/browser/resources:component_extension_resources",
- "//chrome/browser/search:generated",
"//chrome/browser/ui/color:color_headers",
"//chrome/browser/web_applications/components",
"//chrome/common/apps/platform_apps",
@@ -4202,15 +4180,12 @@ static_library("browser") {
"//chrome/common/themes:autogenerated_theme_util",
"//chrome/services/media_gallery_util/public/cpp",
"//components/constrained_window",
- "//components/download/quarantine",
"//components/feedback",
+ "//components/feedback/content:factory",
"//components/image_fetcher/core",
"//components/keep_alive_registry",
"//components/pref_registry",
"//components/printing/common:mojo_interfaces",
- "//components/schema_org",
- "//components/schema_org:extractor",
- "//components/schema_org:schema_org_properties",
"//components/services/app_service:lib",
"//components/services/app_service/public/cpp:app_file_handling",
"//components/services/app_service/public/cpp:app_share_target",
@@ -4235,6 +4210,8 @@ static_library("browser") {
"speech/cros_speech_recognition_service.h",
"speech/cros_speech_recognition_service_factory.cc",
"speech/cros_speech_recognition_service_factory.h",
+ "speech/on_device_speech_recognizer.cc",
+ "speech/on_device_speech_recognizer.h",
]
deps += [ "//chrome/services/speech:lib" ]
@@ -4266,6 +4243,7 @@ static_library("browser") {
deps += [
"//extensions/browser",
"//extensions/browser/api:api_implementations",
+ "//extensions/common:mojom",
]
}
@@ -4289,44 +4267,50 @@ static_library("browser") {
sources += [
"apps/app_service/app_notifications.cc",
"apps/app_service/app_notifications.h",
+ "apps/app_service/app_service_proxy_chromeos.cc",
+ "apps/app_service/app_service_proxy_chromeos.h",
+ "apps/app_service/app_shortcut_item.cc",
+ "apps/app_service/app_shortcut_item.h",
"apps/app_service/app_web_contents_data.cc",
"apps/app_service/app_web_contents_data.h",
"apps/app_service/arc_activity_adaptive_icon_impl.cc",
"apps/app_service/arc_activity_adaptive_icon_impl.h",
- "apps/app_service/arc_apps.cc",
- "apps/app_service/arc_apps.h",
- "apps/app_service/arc_apps_factory.cc",
- "apps/app_service/arc_apps_factory.h",
"apps/app_service/arc_icon_once_loader.cc",
"apps/app_service/arc_icon_once_loader.h",
- "apps/app_service/borealis_apps.cc",
- "apps/app_service/borealis_apps.h",
- "apps/app_service/built_in_chromeos_apps.cc",
- "apps/app_service/built_in_chromeos_apps.h",
- "apps/app_service/crostini_apps.cc",
- "apps/app_service/crostini_apps.h",
- "apps/app_service/extension_apps_chromeos.cc",
- "apps/app_service/extension_apps_chromeos.h",
"apps/app_service/file_utils.cc",
"apps/app_service/file_utils.h",
"apps/app_service/intent_util.cc",
"apps/app_service/intent_util.h",
- "apps/app_service/lacros_apps.cc",
- "apps/app_service/lacros_apps.h",
"apps/app_service/media_requests.cc",
"apps/app_service/media_requests.h",
"apps/app_service/menu_util.cc",
"apps/app_service/menu_util.h",
"apps/app_service/paused_apps.cc",
"apps/app_service/paused_apps.h",
- "apps/app_service/plugin_vm_apps.cc",
- "apps/app_service/plugin_vm_apps.h",
- "apps/app_service/remote_apps.cc",
- "apps/app_service/remote_apps.h",
+ "apps/app_service/publishers/arc_apps.cc",
+ "apps/app_service/publishers/arc_apps.h",
+ "apps/app_service/publishers/arc_apps_factory.cc",
+ "apps/app_service/publishers/arc_apps_factory.h",
+ "apps/app_service/publishers/borealis_apps.cc",
+ "apps/app_service/publishers/borealis_apps.h",
+ "apps/app_service/publishers/built_in_chromeos_apps.cc",
+ "apps/app_service/publishers/built_in_chromeos_apps.h",
+ "apps/app_service/publishers/crostini_apps.cc",
+ "apps/app_service/publishers/crostini_apps.h",
+ "apps/app_service/publishers/extension_apps_chromeos.cc",
+ "apps/app_service/publishers/extension_apps_chromeos.h",
+ "apps/app_service/publishers/lacros_apps.cc",
+ "apps/app_service/publishers/lacros_apps.h",
+ "apps/app_service/publishers/lacros_web_apps.cc",
+ "apps/app_service/publishers/lacros_web_apps.h",
+ "apps/app_service/publishers/plugin_vm_apps.cc",
+ "apps/app_service/publishers/plugin_vm_apps.h",
+ "apps/app_service/publishers/remote_apps.cc",
+ "apps/app_service/publishers/remote_apps.h",
+ "apps/app_service/publishers/web_apps_chromeos.cc",
+ "apps/app_service/publishers/web_apps_chromeos.h",
"apps/app_service/uninstall_dialog.cc",
"apps/app_service/uninstall_dialog.h",
- "apps/app_service/web_apps_chromeos.cc",
- "apps/app_service/web_apps_chromeos.h",
"apps/icon_standardizer.cc",
"apps/icon_standardizer.h",
"browser_process_platform_part_chromeos.cc",
@@ -4534,6 +4518,10 @@ static_library("browser") {
"task_manager/providers/arc/arc_process_task.h",
"task_manager/providers/arc/arc_process_task_provider.cc",
"task_manager/providers/arc/arc_process_task_provider.h",
+ "task_manager/providers/crosapi/crosapi_task.cc",
+ "task_manager/providers/crosapi/crosapi_task.h",
+ "task_manager/providers/crosapi/crosapi_task_provider_ash.cc",
+ "task_manager/providers/crosapi/crosapi_task_provider_ash.h",
"task_manager/providers/vm/crostini_process_task.cc",
"task_manager/providers/vm/crostini_process_task.h",
"task_manager/providers/vm/plugin_vm_process_task.cc",
@@ -4656,11 +4644,15 @@ static_library("browser") {
"lacros/account_manager_facade_factory_lacros.cc",
"lacros/account_manager_util.cc",
"lacros/account_manager_util.h",
+ "lacros/automation_manager_lacros.cc",
+ "lacros/automation_manager_lacros.h",
"lacros/cert_db_initializer.h",
"lacros/cert_db_initializer_factory.cc",
"lacros/cert_db_initializer_factory.h",
"lacros/cert_db_initializer_impl.cc",
"lacros/cert_db_initializer_impl.h",
+ "lacros/chrome_browser_main_extra_parts_lacros.cc",
+ "lacros/chrome_browser_main_extra_parts_lacros.h",
"lacros/client_cert_store_lacros.cc",
"lacros/client_cert_store_lacros.h",
"lacros/crosapi_pref_observer.cc",
@@ -4681,6 +4673,8 @@ static_library("browser") {
"lacros/snap_controller_lacros.h",
"lacros/system_logs/lacros_system_log_fetcher.cc",
"lacros/system_logs/lacros_system_log_fetcher.h",
+ "lacros/task_manager_lacros.cc",
+ "lacros/task_manager_lacros.h",
"metrics/enrollment_status.h",
"metrics/lacros_metrics_provider.cc",
"metrics/lacros_metrics_provider.h",
@@ -4690,6 +4684,8 @@ static_library("browser") {
"notifications/notification_platform_bridge_lacros.cc",
"notifications/notification_platform_bridge_lacros.h",
"platform_util_lacros.cc",
+ "task_manager/providers/crosapi/task_manager_controller_lacros.cc",
+ "task_manager/providers/crosapi/task_manager_controller_lacros.h",
]
deps += [
"//chromeos/crosapi/cpp",
@@ -4852,6 +4848,7 @@ static_library("browser") {
"win/util_win_service.h",
]
public_deps += [
+ "//build:branding_buildflags",
"//chrome/services/util_win/public/mojom",
"//ui/views",
"//ui/views/controls/webview",
@@ -4879,7 +4876,6 @@ static_library("browser") {
"//components/chrome_cleaner/public/constants",
"//components/crash/core/app",
"//components/crash/core/app:crash_export_thunk_include",
- "//components/download/quarantine",
"//components/services/quarantine/public/cpp:features",
"//google_update",
"//sandbox/win:sandbox",
@@ -4998,6 +4994,8 @@ static_library("browser") {
"hang_monitor/hang_crash_dump_mac.cc",
"icon_loader_mac.mm",
"lifetime/application_lifetime_mac.mm",
+ "mac/auth_session_request.h",
+ "mac/auth_session_request.mm",
"mac/bluetooth_utility.h",
"mac/bluetooth_utility.mm",
"mac/dock.h",
@@ -5037,6 +5035,8 @@ static_library("browser") {
"notifications/notification_alert_service_bridge.mm",
"notifications/notification_platform_bridge_mac.h",
"notifications/notification_platform_bridge_mac.mm",
+ "notifications/notification_platform_bridge_mac_metrics.cc",
+ "notifications/notification_platform_bridge_mac_metrics.h",
"notifications/notification_platform_bridge_mac_unnotification.h",
"notifications/notification_platform_bridge_mac_unnotification.mm",
"notifications/notification_platform_bridge_mac_utils.h",
@@ -5068,6 +5068,7 @@ static_library("browser") {
"//chrome/services/mac_notifications/public/mojom",
"//components/crash/core/app",
"//components/metal_util",
+ "//components/remote_cocoa/browser:browser",
"//sandbox/mac:seatbelt",
"//sandbox/policy",
"//services/device/public/cpp/geolocation",
@@ -5088,6 +5089,7 @@ static_library("browser") {
"SecurityInterface.framework",
]
weak_frameworks = [
+ "AuthenticationServices.framework", # macOS 10.15
"SafariServices.framework", # macOS 10.12
"UserNotifications.framework", # macOS 10.14
]
@@ -5100,6 +5102,15 @@ static_library("browser") {
}
}
+ if (is_linux || is_win || is_mac) {
+ sources += [
+ "enterprise/connectors/device_trust/device_trust_key_pair.cc",
+ "enterprise/connectors/device_trust/device_trust_key_pair.h",
+ "enterprise/connectors/device_trust/navigation_throttle.cc",
+ "enterprise/connectors/device_trust/navigation_throttle.h",
+ ]
+ }
+
if (is_linux || is_chromeos) {
sources += [
"chrome_browser_main_linux.cc",
@@ -5166,18 +5177,16 @@ static_library("browser") {
}
}
- if (use_x11) {
- sources += [
- "fullscreen_aurax11.cc",
- "media/webrtc/window_icon_util_x11.cc",
- ]
+ if (is_linux) {
+ sources += [ "fullscreen_linux.cc" ]
+ } else if (use_ozone) {
+ sources += [ "fullscreen_ozone.cc" ]
}
- if (use_ozone) {
- sources += [
- "fullscreen_ozone.cc",
- "media/webrtc/window_icon_util_ozone.cc",
- ]
+ if (use_ozone || use_x11) {
+ # use_x11 also uses window_icon_util_ozone that controls
+ # the path using features::IsUsingOzonePlatform.
+ sources += [ "media/webrtc/window_icon_util_linux.cc" ]
}
if (rtc_use_pipewire) {
@@ -5303,6 +5312,8 @@ static_library("browser") {
"password_manager/multi_profile_credentials_filter.cc",
"password_manager/multi_profile_credentials_filter.h",
"platform_util.cc",
+ "policy/cbcm_invalidations_initializer.cc",
+ "policy/cbcm_invalidations_initializer.h",
"policy/chrome_browser_cloud_management_controller_desktop.cc",
"policy/chrome_browser_cloud_management_controller_desktop.h",
"policy/chrome_browser_cloud_management_register_watcher.cc",
@@ -5423,6 +5434,7 @@ static_library("browser") {
]
deps += [
"//ui/aura",
+ "//ui/base/dragdrop:types",
"//ui/base/dragdrop/mojom:mojom_shared",
"//ui/compositor",
"//ui/snapshot",
@@ -5875,7 +5887,10 @@ static_library("browser") {
"component_updater/widevine_cdm_component_installer.cc",
"component_updater/widevine_cdm_component_installer.h",
]
- deps += [ "//third_party/widevine/cdm:headers" ]
+ deps += [
+ "//components/cdm/common",
+ "//third_party/widevine/cdm:headers",
+ ]
}
if (is_win) {
sources += [
@@ -6204,10 +6219,14 @@ static_library("browser") {
"sessions/session_restore_stats_collector.h",
"sessions/session_service.cc",
"sessions/session_service.h",
+ "sessions/session_service_base.cc",
+ "sessions/session_service_base.h",
"sessions/session_service_factory.cc",
"sessions/session_service_factory.h",
"sessions/session_service_log.cc",
"sessions/session_service_log.h",
+ "sessions/session_service_lookup.cc",
+ "sessions/session_service_lookup.h",
"sessions/session_service_utils.cc",
"sessions/session_service_utils.h",
"sessions/tab_loader.cc",
@@ -6218,6 +6237,15 @@ static_library("browser") {
deps += [ "//components/tab_groups" ]
}
+ if (enable_session_service && enable_app_session_service) {
+ sources += [
+ "sessions/app_session_service.cc",
+ "sessions/app_session_service.h",
+ "sessions/app_session_service_factory.cc",
+ "sessions/app_session_service_factory.h",
+ ]
+ }
+
if (enable_spellcheck) {
sources += [
"spellchecker/spell_check_host_chrome_impl.cc",
@@ -6402,7 +6430,13 @@ static_library("browser") {
"net/nss_context.h",
]
if (is_chromeos_ash) {
- sources += [ "net/nss_context_chromeos.cc" ]
+ sources += [
+ "net/nss_context_chromeos.cc",
+ "net/nss_service_chromeos.cc",
+ "net/nss_service_chromeos.h",
+ "net/nss_service_chromeos_factory.cc",
+ "net/nss_service_chromeos_factory.h",
+ ]
}
if (is_linux || is_chromeos_lacros) {
sources += [ "net/nss_context_linux.cc" ]
@@ -6445,6 +6479,10 @@ if (is_android) {
sources = [ "android/explore_sites/catalog.proto" ]
}
+ proto_library("profile_token") {
+ sources = [ "android/proto/profile_token.proto" ]
+ }
+
proto_library("usage_stats_proto") {
sources = [ "android/usage_stats/website_event.proto" ]
}
@@ -6537,7 +6575,6 @@ grit("resources") {
]
if (enable_plugins) {
- #.json is not in the default sources_assignment_filter.
if (is_chromeos_ash) {
inputs = [ "resources/plugin_metadata/plugins_chromeos.json" ]
}
@@ -6583,12 +6620,14 @@ grit("resources") {
"//chrome/browser/resources/chromeos/gaia_action_buttons:web_components",
"//chrome/browser/resources/chromeos/set_time_dialog:polymer3_elements",
"//chrome/browser/resources/chromeos/smb_shares:polymer3_elements",
+ "//chrome/browser/resources/chromeos/vm:polymer3_elements",
"//chrome/browser/supervised_user:supervised_user_unscaled_resources",
"//chrome/browser/ui/webui/app_management:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings_js",
+ "//chrome/browser/ui/webui/chromeos/vm:mojo_bindings_webui_js",
"//chrome/browser/ui/webui/settings/chromeos:mojom_js",
]
}
@@ -6625,8 +6664,10 @@ grit("dev_ui_browser_resources") {
deps = [
"//chrome/browser/media:mojo_bindings_js",
- "//chrome/browser/media/feeds:mojo_bindings_js",
+ "//chrome/browser/resources/internals/user_education:components",
+ "//chrome/browser/resources/local_state:build",
"//chrome/browser/resources/web_app_internals:components",
+ "//chrome/browser/ui/webui/internals/user_education:mojo_bindings_js",
"//chrome/browser/ui/webui/internals/web_app:mojo_bindings_js",
"//components/site_engagement/core/mojom:mojo_bindings_webui_js",
]
@@ -6635,7 +6676,8 @@ grit("dev_ui_browser_resources") {
}
}
-action("expired_flags_list_gen") {
+# TODO(crbug.com/1112471): Get this to run cleanly under Python 3.
+python2_action("expired_flags_list_gen") {
script = "//tools/flags/generate_expired_list.py"
sources = [ "flag-metadata.json" ]
inputs = [ "//chrome/VERSION" ]
@@ -6700,8 +6742,6 @@ static_library("test_support") {
"history/history_test_utils.h",
"interstitials/security_interstitial_page_test_utils.cc",
"interstitials/security_interstitial_page_test_utils.h",
- "media/history/media_history_test_utils.cc",
- "media/history/media_history_test_utils.h",
"media/webrtc/fake_desktop_media_list.cc",
"media/webrtc/fake_desktop_media_list.h",
"media/webrtc/fake_desktop_media_picker_factory.cc",
@@ -6716,8 +6756,8 @@ static_library("test_support") {
"notifications/stub_notification_display_service.h",
"plugins/plugin_test_utils.cc",
"plugins/plugin_test_utils.h",
- "policy/messaging_layer/public/mock_report_queue.cc",
- "policy/messaging_layer/public/mock_report_queue.h",
+ "policy/messaging_layer/upload/fake_upload_client.cc",
+ "policy/messaging_layer/upload/fake_upload_client.h",
"predictors/loading_test_util.cc",
"predictors/loading_test_util.h",
"resource_coordinator/tab_load_tracker_test_support.cc",
@@ -6756,9 +6796,11 @@ static_library("test_support") {
"//components/password_manager/core/browser:test_support",
"//components/policy/core/browser:test_support",
"//components/prefs:test_support",
+ "//components/reporting/client:test_support",
"//components/reporting/proto:record_constants",
"//components/reporting/proto:record_proto",
"//components/reporting/storage:storage_module",
+ "//components/reporting/storage_selector",
"//components/reporting/util:status",
"//components/reporting/util:status_macros",
"//components/reporting/util:status_proto",
@@ -6817,16 +6859,22 @@ static_library("test_support") {
"hid/mock_hid_device_observer.h",
"profile_resetter/profile_resetter_test_base.cc",
"profile_resetter/profile_resetter_test_base.h",
+ "sessions/app_session_service_test_helper.cc",
+ "sessions/app_session_service_test_helper.h",
"sessions/session_restore_test_helper.cc",
"sessions/session_restore_test_helper.h",
"sessions/session_restore_test_utils.cc",
"sessions/session_restore_test_utils.h",
+ "sessions/session_service_base_test_helper.cc",
+ "sessions/session_service_base_test_helper.h",
"sessions/session_service_test_helper.cc",
"sessions/session_service_test_helper.h",
"sessions/tab_loader_tester.cc",
"sessions/tab_loader_tester.h",
"sessions/tab_restore_service_load_waiter.cc",
"sessions/tab_restore_service_load_waiter.h",
+ "speech/fake_speech_recognition_service.cc",
+ "speech/fake_speech_recognition_service.h",
"ui/tabs/tab_activity_simulator.cc",
"ui/tabs/tab_activity_simulator.h",
]
@@ -6836,10 +6884,28 @@ static_library("test_support") {
sources += [
"ash/app_mode/fake_cws.cc",
"ash/app_mode/fake_cws.h",
+ "ash/arc/extensions/fake_arc_support.cc",
+ "ash/arc/extensions/fake_arc_support.h",
"ash/login/screens/mock_device_disabled_screen_view.cc",
"ash/login/screens/mock_device_disabled_screen_view.h",
- "chromeos/arc/extensions/fake_arc_support.cc",
- "chromeos/arc/extensions/fake_arc_support.h",
+ "ash/login/session/user_session_manager_test_api.cc",
+ "ash/login/session/user_session_manager_test_api.h",
+ "ash/login/test/oobe_configuration_waiter.cc",
+ "ash/login/test/oobe_configuration_waiter.h",
+ "ash/login/ui/fake_login_display_host.cc",
+ "ash/login/ui/fake_login_display_host.h",
+ "ash/login/ui/mock_login_display.cc",
+ "ash/login/ui/mock_login_display.h",
+ "ash/login/ui/mock_login_display_host.cc",
+ "ash/login/ui/mock_login_display_host.h",
+ "ash/login/ui/mock_signin_ui.cc",
+ "ash/login/ui/mock_signin_ui.h",
+ "ash/login/users/avatar/mock_user_image_manager.cc",
+ "ash/login/users/avatar/mock_user_image_manager.h",
+ "ash/login/users/fake_supervised_user_manager.cc",
+ "ash/login/users/fake_supervised_user_manager.h",
+ "ash/login/users/mock_user_manager.cc",
+ "ash/login/users/mock_user_manager.h",
"chromeos/file_manager/fake_disk_mount_manager.cc",
"chromeos/file_manager/fake_disk_mount_manager.h",
"chromeos/input_method/mock_candidate_window_controller.cc",
@@ -6848,24 +6914,6 @@ static_library("test_support") {
"chromeos/input_method/mock_input_method_engine.h",
"chromeos/input_method/mock_input_method_manager_impl.cc",
"chromeos/input_method/mock_input_method_manager_impl.h",
- "chromeos/login/session/user_session_manager_test_api.cc",
- "chromeos/login/session/user_session_manager_test_api.h",
- "chromeos/login/test/oobe_configuration_waiter.cc",
- "chromeos/login/test/oobe_configuration_waiter.h",
- "chromeos/login/ui/fake_login_display_host.cc",
- "chromeos/login/ui/fake_login_display_host.h",
- "chromeos/login/ui/mock_login_display.cc",
- "chromeos/login/ui/mock_login_display.h",
- "chromeos/login/ui/mock_login_display_host.cc",
- "chromeos/login/ui/mock_login_display_host.h",
- "chromeos/login/ui/mock_signin_ui.cc",
- "chromeos/login/ui/mock_signin_ui.h",
- "chromeos/login/users/avatar/mock_user_image_manager.cc",
- "chromeos/login/users/avatar/mock_user_image_manager.h",
- "chromeos/login/users/fake_supervised_user_manager.cc",
- "chromeos/login/users/fake_supervised_user_manager.h",
- "chromeos/login/users/mock_user_manager.cc",
- "chromeos/login/users/mock_user_manager.h",
"chromeos/net/network_portal_detector_test_utils.cc",
"chromeos/net/network_portal_detector_test_utils.h",
"chromeos/policy/cloud_external_data_manager_base_test_util.cc",
@@ -6922,6 +6970,8 @@ static_library("test_support") {
"extensions/test_blocklist.h",
"extensions/test_blocklist_state_fetcher.cc",
"extensions/test_blocklist_state_fetcher.h",
+ "extensions/test_extension_message_bubble_delegate.cc",
+ "extensions/test_extension_message_bubble_delegate.h",
"extensions/test_extension_service.cc",
"extensions/test_extension_service.h",
"extensions/test_extension_system.cc",
@@ -6938,6 +6988,7 @@ static_library("test_support") {
"//extensions:test_support",
"//extensions/browser",
"//extensions/browser:test_support",
+ "//extensions/common:mojom",
"//google_apis:test_support",
"//services/data_decoder/public/cpp:test_support",
]
@@ -7051,6 +7102,9 @@ if (is_android) {
java_cpp_enum("screenshot_mode_enum") {
sources = [ "android/feedback/screenshot_mode.h" ]
}
+ java_cpp_enum("survey_http_client_type_enum") {
+ sources = [ "android/survey/http_client_type.h" ]
+ }
}
if (!is_android) {
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api.cc b/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
index bb825731e2b..2180054511b 100644
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -12,11 +12,11 @@
#include "base/bind.h"
#include "base/json/json_writer.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/api/tabs/tabs_constants.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/infobars/infobar_service.h"
@@ -46,8 +46,8 @@
#include "ash/public/cpp/window_tree_host_lookup.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
#include "chrome/browser/ash/accessibility/magnification_manager.h"
+#include "chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/ui_base_features.h"
@@ -223,7 +223,6 @@ AccessibilityPrivateSetHighlightsFunction::Run() {
ExtensionFunction::ResponseAction
AccessibilityPrivateSetKeyboardListenerFunction::Run() {
- ChromeExtensionFunctionDetails details(this);
CHECK(extension());
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -239,7 +238,8 @@ AccessibilityPrivateSetKeyboardListenerFunction::Run() {
return RespondNow(Error("Existing keyboard listener registered."));
manager->SetKeyboardListenerExtensionId(
- enabled ? extension()->id() : std::string(), details.GetProfile());
+ enabled ? extension()->id() : std::string(),
+ Profile::FromBrowserContext(browser_context()));
ash::EventRewriterController::Get()->CaptureAllKeysForSpokenFeedback(
enabled && capture);
@@ -270,10 +270,9 @@ AccessibilityPrivateSetNativeChromeVoxArcSupportForCurrentAppFunction::Run() {
SetNativeChromeVoxArcSupportForCurrentApp::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(params);
- ChromeExtensionFunctionDetails details(this);
arc::ArcAccessibilityHelperBridge* bridge =
arc::ArcAccessibilityHelperBridge::GetForBrowserContext(
- details.GetProfile());
+ browser_context());
if (bridge) {
bool enabled;
EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled));
@@ -657,4 +656,33 @@ AccessibilityPrivateUpdateSelectToSpeakPanelFunction::Run() {
return RespondNow(NoArguments());
}
-#endif // defined (OS_CHROMEOS)
+ExtensionFunction::ResponseAction
+AccessibilityPrivateShowConfirmationDialogFunction::Run() {
+ std::unique_ptr<accessibility_private::ShowConfirmationDialog::Params>
+ params =
+ accessibility_private::ShowConfirmationDialog::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ std::u16string title = base::UTF8ToUTF16(params->title);
+ std::u16string description = base::UTF8ToUTF16(params->description);
+ ash::AccessibilityController::Get()->ShowConfirmationDialog(
+ title, description,
+ base::BindOnce(
+ &AccessibilityPrivateShowConfirmationDialogFunction::OnDialogResult,
+ base::RetainedRef(this), /* confirmed */ true),
+ base::BindOnce(
+ &AccessibilityPrivateShowConfirmationDialogFunction::OnDialogResult,
+ base::RetainedRef(this), /* not confirmed */ false),
+ base::BindOnce(
+ &AccessibilityPrivateShowConfirmationDialogFunction::OnDialogResult,
+ base::RetainedRef(this), /* not confirmed */ false));
+
+ return RespondLater();
+}
+
+void AccessibilityPrivateShowConfirmationDialogFunction::OnDialogResult(
+ bool confirmed) {
+ Respond(OneArgument(base::Value(confirmed)));
+}
+
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api.h b/chromium/chrome/browser/accessibility/accessibility_extension_api.h
index 448e3a947db..1f56af99445 100644
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api.h
+++ b/chromium/chrome/browser/accessibility/accessibility_extension_api.h
@@ -215,6 +215,17 @@ class AccessibilityPrivateUpdateSelectToSpeakPanelFunction
DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.updateSelectToSpeakPanel",
ACCESSIBILITY_PRIVATE_UPDATESELECTTOSPEAKPANEL)
};
+
+// API function that shows a confirmation dialog, with callbacks for
+// confirm/cancel.
+class AccessibilityPrivateShowConfirmationDialogFunction
+ : public ExtensionFunction {
+ ~AccessibilityPrivateShowConfirmationDialogFunction() override = default;
+ ResponseAction Run() override;
+ void OnDialogResult(bool confirmed);
+ DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.showConfirmationDialog",
+ ACCESSIBILITY_PRIVATE_SHOWCONFIRMATIONDIALOG)
+};
#endif // defined (OS_CHROMEOS)
#endif // CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc b/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc
deleted file mode 100644
index e2b6aadd22a..00000000000
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ash/accessibility/accessibility_manager.h"
-#include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/chrome_pages.h"
-#include "chrome/browser/ui/settings_window_manager_chromeos.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/system_web_app_manager.h"
-#include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/common/webui_url_constants.h"
-#include "content/public/test/browser_test.h"
-#include "ui/accessibility/accessibility_features.h"
-#include "ui/base/ui_base_features.h"
-
-namespace extensions {
-
-using ::ash::AccessibilityManager;
-
-class AccessibilityPrivateApiTest : public ExtensionApiTest {
- public:
- void SetUp() override {
- scoped_feature_list_.InitAndDisableFeature(
- ::features::kSelectToSpeakNavigationControl);
- ExtensionApiTest::SetUp();
- }
-
- base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiTest, SendSyntheticKeyEvent) {
- ASSERT_TRUE(RunExtensionSubtest("accessibility_private/",
- "send_synthetic_key_event.html"))
- << message_;
-}
-
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiTest,
- GetDisplayNameForLocaleTest) {
- ASSERT_TRUE(
- RunExtensionSubtest("accessibility_private/", "display_locale.html"))
- << message_;
-}
-
-// Flaky on a debug build, see crbug.com/1030507.
-#if !defined(NDEBUG)
-#define MAYBE_OpenSettingsSubpage DISABLED_OpenSettingsSubpage
-#else
-#define MAYBE_OpenSettingsSubpage OpenSettingsSubpage
-#endif
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiTest, MAYBE_OpenSettingsSubpage) {
- Profile* profile = AccessibilityManager::Get()->profile();
-
- // Install the Settings App.
- web_app::WebAppProvider::Get(profile)
- ->system_web_app_manager()
- .InstallSystemAppsForTesting();
-
- ASSERT_TRUE(RunExtensionSubtest("accessibility_private/",
- "open_settings_subpage.html"))
- << message_;
-
- chrome::SettingsWindowManager* settings_manager =
- chrome::SettingsWindowManager::GetInstance();
-
- Browser* settings_browser = settings_manager->FindBrowserForProfile(profile);
- EXPECT_NE(nullptr, settings_browser);
-
- content::WebContents* web_contents =
- settings_browser->tab_strip_model()->GetWebContentsAt(0);
-
- EXPECT_TRUE(WaitForLoadStop(web_contents));
-
- EXPECT_EQ(GURL(chrome::GetOSSettingsUrl("manageAccessibility/tts")),
- web_contents->GetLastCommittedURL());
-}
-
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiTest,
- OpenSettingsSubpage_InvalidSubpage) {
- Profile* profile = AccessibilityManager::Get()->profile();
-
- // Install the Settings App.
- web_app::WebAppProvider::Get(profile)
- ->system_web_app_manager()
- .InstallSystemAppsForTesting();
-
- ASSERT_TRUE(RunExtensionSubtest("accessibility_private/",
- "open_settings_subpage_invalid_subpage.html"))
- << message_;
-
- chrome::SettingsWindowManager* settings_manager =
- chrome::SettingsWindowManager::GetInstance();
-
- // Invalid subpage should not open settings window.
- Browser* settings_browser = settings_manager->FindBrowserForProfile(profile);
- EXPECT_EQ(nullptr, settings_browser);
-}
-
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiTest,
- IsFeatureEnabled_FeatureDisabled) {
- ASSERT_TRUE(RunExtensionSubtest("accessibility_private/",
- "is_feature_enabled_feature_disabled.html"))
- << message_;
-}
-
-class AccessibilityPrivateApiFeatureEnabledTest : public ExtensionApiTest {
- public:
- void SetUp() override {
- scoped_feature_list_.InitAndEnableFeature(
- ::features::kSelectToSpeakNavigationControl);
- ExtensionApiTest::SetUp();
- }
-
- base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(AccessibilityPrivateApiFeatureEnabledTest,
- IsFeatureEnabled_FeatureEnabled) {
- ASSERT_TRUE(RunExtensionSubtest("accessibility_private/",
- "is_feature_enabled_feature_enabled.html"))
- << message_;
-}
-
-} // namespace extensions
diff --git a/chromium/chrome/browser/accessibility/accessibility_permission_context.cc b/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
index 38fa011f4de..cab44675011 100644
--- a/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
@@ -3,13 +3,14 @@
// found in the LICENSE file.
#include "chrome/browser/accessibility/accessibility_permission_context.h"
-#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
+#include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom.h"
AccessibilityPermissionContext::AccessibilityPermissionContext(
content::BrowserContext* browser_context)
: PermissionContextBase(browser_context,
ContentSettingsType::ACCESSIBILITY_EVENTS,
- blink::mojom::FeaturePolicyFeature::kNotFound) {}
+ blink::mojom::PermissionsPolicyFeature::kNotFound) {
+}
AccessibilityPermissionContext::~AccessibilityPermissionContext() = default;
diff --git a/chromium/chrome/browser/accessibility/accessibility_ui.cc b/chromium/chrome/browser/accessibility/accessibility_ui.cc
index eed11ee2d85..dff59cf394e 100644
--- a/chromium/chrome/browser/accessibility/accessibility_ui.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_ui.cc
@@ -132,6 +132,8 @@ std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor(
std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor(
content::RenderViewHost* rvh) {
+ TRACE_EVENT1("accessibility", "BuildTargetDescriptor", "render_view_host",
+ rvh);
content::WebContents* web_contents =
content::WebContents::FromRenderViewHost(rvh);
ui::AXMode accessibility_mode;
diff --git a/chromium/chrome/browser/accessibility/caption_controller.cc b/chromium/chrome/browser/accessibility/caption_controller.cc
index 49dfe8fcaf2..2cc502d8120 100644
--- a/chromium/chrome/browser/accessibility/caption_controller.cc
+++ b/chromium/chrome/browser/accessibility/caption_controller.cc
@@ -10,6 +10,7 @@
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
+#include "chrome/browser/accessibility/caption_host_impl.h"
#include "chrome/browser/accessibility/caption_util.h"
#include "chrome/browser/accessibility/soda_installer.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
@@ -25,8 +26,8 @@
#include "components/soda/constants.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/browser/browser_accessibility_state.h"
-#include "content/public/browser/web_contents.h"
#include "media/base/media_switches.h"
+#include "ui/native_theme/native_theme.h"
namespace {
@@ -39,8 +40,6 @@ const char* const kCaptionStylePrefsToObserve[] = {
prefs::kAccessibilityCaptionsTextShadow,
prefs::kAccessibilityCaptionsBackgroundOpacity};
-constexpr int kSodaCleanUpDelayInDays = 30;
-
} // namespace
namespace captions {
@@ -62,7 +61,8 @@ void CaptionController::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
// Initially default the language to en-US.
- registry->RegisterStringPref(prefs::kLiveCaptionLanguageCode, "en-US");
+ registry->RegisterStringPref(prefs::kLiveCaptionLanguageCode, "en-US",
+ user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
}
void CaptionController::Init() {
@@ -75,9 +75,7 @@ void CaptionController::Init() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Return early if current profile is a signin profile (as opposed to a user
- // profile). See crbug.com/1180706
- // TODO(crbug.com/1180706): Remove this check if bug can be resolved through
- // other means.
+ // profile).
if (ash::ProfileHelper::IsSigninProfile(profile_))
return;
#endif
@@ -125,11 +123,8 @@ void CaptionController::OnLiveCaptionEnabledChanged() {
StartLiveCaption();
} else {
StopLiveCaption();
- // Schedule SODA to be deleted in 30 days if the feature is not enabled
- // before then.
- g_browser_process->local_state()->SetTime(
- prefs::kSodaScheduledDeletionTime,
- base::Time::Now() + base::TimeDelta::FromDays(kSodaCleanUpDelayInDays));
+ speech::SodaInstaller::GetInstance()->SetUninstallTimer(
+ profile_->GetPrefs(), g_browser_process->local_state());
}
}
@@ -145,21 +140,22 @@ bool CaptionController::IsLiveCaptionEnabled() {
void CaptionController::StartLiveCaption() {
DCHECK(enabled_);
- if (!base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption) ||
- speech::SodaInstaller::GetInstance()->IsSodaInstalled()) {
+ if (!base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption)) {
CreateUI();
return;
}
- // Ask the SodaInstaller to download the speech model and language pack. The
- // SodaInstaller determines whether SODA is already on the device and whether
- // or not to download. Once SODA is on the device and ready, the SodaInstaller
- // calls OnSodaInstalled on its observers. The UI is created at that time.
- g_browser_process->local_state()->SetTime(prefs::kSodaScheduledDeletionTime,
- base::Time());
- speech::SodaInstaller::GetInstance()->AddObserver(this);
- speech::SodaInstaller::GetInstance()->InstallSoda(profile_->GetPrefs());
- speech::SodaInstaller::GetInstance()->InstallLanguage(profile_->GetPrefs());
+ // The SodaInstaller determines whether SODA is already on the device and
+ // whether or not to download. Once SODA is on the device and ready, the
+ // SODAInstaller calls OnSodaInstalled on its observers. The UI is created at
+ // that time.
+ if (speech::SodaInstaller::GetInstance()->IsSodaInstalled()) {
+ CreateUI();
+ } else {
+ speech::SodaInstaller::GetInstance()->AddObserver(this);
+ speech::SodaInstaller::GetInstance()->Init(
+ profile_->GetPrefs(), g_browser_process->local_state());
+ }
}
void CaptionController::StopLiveCaption() {
@@ -192,14 +188,18 @@ void CaptionController::CreateUI() {
// Add observers to the BrowserList for new browser views being added.
BrowserList::GetInstance()->AddObserver(this);
+ // Observe native theme changes for caption style updates.
+ ui::NativeTheme::GetInstanceForWeb()->AddObserver(this);
+
// Observe caption style prefs.
for (const char* const pref_name : kCaptionStylePrefsToObserve) {
DCHECK(!pref_change_registrar_->IsObserved(pref_name));
pref_change_registrar_->Add(
- pref_name, base::BindRepeating(&CaptionController::UpdateCaptionStyle,
- base::Unretained(this)));
+ pref_name,
+ base::BindRepeating(&CaptionController::OnCaptionStyleUpdated,
+ base::Unretained(this)));
}
- UpdateCaptionStyle();
+ OnCaptionStyleUpdated();
}
void CaptionController::DestroyUI() {
@@ -212,6 +212,7 @@ void CaptionController::DestroyUI() {
// Remove observers.
BrowserList::GetInstance()->RemoveObserver(this);
+ ui::NativeTheme::GetInstanceForWeb()->RemoveObserver(this);
// Remove prefs to observe.
for (const char* const pref_name : kCaptionStylePrefsToObserve) {
@@ -247,20 +248,35 @@ void CaptionController::OnBrowserRemoved(Browser* browser) {
}
bool CaptionController::DispatchTranscription(
- content::WebContents* web_contents,
+ CaptionHostImpl* caption_host_impl,
const chrome::mojom::TranscriptionResultPtr& transcription_result) {
- Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(caption_host_impl->GetWebContents());
if (!browser || !caption_bubble_controllers_.count(browser))
return false;
return caption_bubble_controllers_[browser]->OnTranscription(
- transcription_result, web_contents);
+ caption_host_impl, transcription_result);
}
-void CaptionController::OnError(content::WebContents* web_contents) {
- Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
+void CaptionController::OnError(CaptionHostImpl* caption_host_impl) {
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(caption_host_impl->GetWebContents());
if (!browser || !caption_bubble_controllers_.count(browser))
return;
- return caption_bubble_controllers_[browser]->OnError(web_contents);
+ caption_bubble_controllers_[browser]->OnError(caption_host_impl);
+}
+
+void CaptionController::OnAudioStreamEnd(CaptionHostImpl* caption_host_impl) {
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(caption_host_impl->GetWebContents());
+ if (!browser || !caption_bubble_controllers_.count(browser))
+ return;
+ caption_bubble_controllers_[browser]->OnAudioStreamEnd(caption_host_impl);
+}
+
+void CaptionController::OnLanguageIdentificationEvent(
+ const media::mojom::LanguageIdentificationEventPtr& event) {
+ // TODO(crbug.com/1175357): Implement the UI for language identification.
}
CaptionBubbleController*
@@ -270,7 +286,7 @@ CaptionController::GetCaptionBubbleControllerForBrowser(Browser* browser) {
return caption_bubble_controllers_[browser].get();
}
-void CaptionController::UpdateCaptionStyle() {
+void CaptionController::OnCaptionStyleUpdated() {
PrefService* profile_prefs = profile_->GetPrefs();
// Metrics are recorded when passing the caption prefs to the browser, so do
// not duplicate them here.
diff --git a/chromium/chrome/browser/accessibility/caption_controller.h b/chromium/chrome/browser/accessibility/caption_controller.h
index 49af7c241d1..ee9c4a6e2ce 100644
--- a/chromium/chrome/browser/accessibility/caption_controller.h
+++ b/chromium/chrome/browser/accessibility/caption_controller.h
@@ -12,14 +12,16 @@
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/common/caption.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
+#include "media/mojo/mojom/speech_recognition_service.mojom.h"
#include "ui/native_theme/caption_style.h"
+#include "ui/native_theme/native_theme_observer.h"
class Browser;
class Profile;
class PrefChangeRegistrar;
-namespace content {
-class WebContents;
+namespace ui {
+class NativeTheme;
}
namespace user_prefs {
@@ -29,6 +31,7 @@ class PrefRegistrySyncable;
namespace captions {
class CaptionBubbleController;
+class CaptionHostImpl;
///////////////////////////////////////////////////////////////////////////////
// Caption Controller
@@ -41,7 +44,8 @@ class CaptionBubbleController;
//
class CaptionController : public BrowserListObserver,
public KeyedService,
- public speech::SodaInstaller::Observer {
+ public speech::SodaInstaller::Observer,
+ public ui::NativeThemeObserver {
public:
explicit CaptionController(Profile* profile);
~CaptionController() override;
@@ -56,12 +60,19 @@ class CaptionController : public BrowserListObserver,
// appropriate browser. Returns whether the transcription result was routed
// successfully. Transcriptions will halt if this returns false.
bool DispatchTranscription(
- content::WebContents* web_contents,
+ CaptionHostImpl* caption_host_impl,
const chrome::mojom::TranscriptionResultPtr& transcription_result);
+ void OnLanguageIdentificationEvent(
+ const media::mojom::LanguageIdentificationEventPtr& event);
+
// Alerts the CaptionBubbleController that belongs to the appropriate browser
// that there is an error in the speech recognition service.
- void OnError(content::WebContents* web_contents);
+ void OnError(CaptionHostImpl* caption_host_impl);
+
+ // Alerts the CaptionBubbleController that belongs to the appropriate browser
+ // that the audio stream has ended.
+ void OnAudioStreamEnd(CaptionHostImpl* caption_host_impl);
CaptionBubbleController* GetCaptionBubbleControllerForBrowser(
Browser* browser);
@@ -79,6 +90,10 @@ class CaptionController : public BrowserListObserver,
void OnSodaProgress(int progress) override {}
void OnSodaError() override {}
+ // ui::NativeThemeObserver:
+ void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override {}
+ void OnCaptionStyleUpdated() override;
+
void OnLiveCaptionEnabledChanged();
void OnLiveCaptionLanguageChanged();
bool IsLiveCaptionEnabled();
@@ -86,7 +101,6 @@ class CaptionController : public BrowserListObserver,
void StopLiveCaption();
void CreateUI();
void DestroyUI();
- void UpdateCaptionStyle();
void UpdateAccessibilityCaptionHistograms();
diff --git a/chromium/chrome/browser/accessibility/caption_controller_browsertest.cc b/chromium/chrome/browser/accessibility/caption_controller_browsertest.cc
index 5ae1da8ee0a..6e191d742ef 100644
--- a/chromium/chrome/browser/accessibility/caption_controller_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/caption_controller_browsertest.cc
@@ -6,15 +6,19 @@
#include "base/files/file_path.h"
#include "base/ranges/ranges.h"
+#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/accessibility/caption_controller_factory.h"
+#include "chrome/browser/accessibility/caption_host_impl.h"
#include "chrome/browser/browser_features.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_keep_alive_types.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_window.h"
+#include "chrome/browser/profiles/scoped_profile_keep_alive.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/caption_bubble_controller.h"
@@ -42,8 +46,7 @@ Profile* CreateProfile() {
profile_manager->GenerateNextProfileDirectoryPath();
base::RunLoop run_loop;
profile_manager->CreateProfileAsync(
- profile_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop),
- base::string16(), std::string());
+ profile_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop));
run_loop.Run();
return profile_manager->GetProfileByPath(profile_path);
}
@@ -96,6 +99,16 @@ class CaptionControllerTest : public InProcessBrowserTest {
->GetCaptionBubbleControllerForBrowser(browser);
}
+ CaptionHostImpl* GetCaptionHostImplForBrowser(Browser* browser) {
+ if (!caption_host_impls_.count(browser)) {
+ caption_host_impls_.emplace(browser, std::make_unique<CaptionHostImpl>(
+ browser->tab_strip_model()
+ ->GetActiveWebContents()
+ ->GetMainFrame()));
+ }
+ return caption_host_impls_[browser].get();
+ }
+
bool DispatchTranscription(std::string text) {
return DispatchTranscriptionToBrowser(text, browser());
}
@@ -109,7 +122,7 @@ class CaptionControllerTest : public InProcessBrowserTest {
Browser* browser,
Profile* profile) {
return GetControllerForProfile(profile)->DispatchTranscription(
- browser->tab_strip_model()->GetActiveWebContents(),
+ GetCaptionHostImplForBrowser(browser),
chrome::mojom::TranscriptionResult::New(text, false /* is_final */));
}
@@ -121,7 +134,18 @@ class CaptionControllerTest : public InProcessBrowserTest {
void OnErrorOnBrowserForProfile(Browser* browser, Profile* profile) {
GetControllerForProfile(profile)->OnError(
- browser->tab_strip_model()->GetActiveWebContents());
+ GetCaptionHostImplForBrowser(browser));
+ }
+
+ void OnAudioStreamEnd() { OnAudioStreamEndOnBrowser(browser()); }
+
+ void OnAudioStreamEndOnBrowser(Browser* browser) {
+ OnAudioStreamEndOnBrowserForProfile(browser, browser->profile());
+ }
+
+ void OnAudioStreamEndOnBrowserForProfile(Browser* browser, Profile* profile) {
+ GetControllerForProfile(profile)->OnAudioStreamEnd(
+ GetCaptionHostImplForBrowser(browser));
}
int NumBubbleControllers() {
@@ -132,23 +156,36 @@ class CaptionControllerTest : public InProcessBrowserTest {
return GetControllerForProfile(profile)->caption_bubble_controllers_.size();
}
- bool IsWidgetVisible() { return IsWidgetVisibleOnBrowser(browser()); }
+ void ExpectIsWidgetVisible(bool visible) {
+ ExpectIsWidgetVisibleOnBrowser(visible, browser());
+ }
- bool IsWidgetVisibleOnBrowser(Browser* browser) {
- return GetBubbleControllerForBrowser(browser)->IsWidgetVisibleForTesting();
+ void ExpectIsWidgetVisibleOnBrowser(bool visible, Browser* browser) {
+#if defined(TOOLKIT_VIEWS)
+ EXPECT_EQ(
+ visible,
+ GetBubbleControllerForBrowser(browser)->IsWidgetVisibleForTesting());
+#endif
}
- std::string GetBubbleLabelText() {
- return GetBubbleLabelTextOnBrowser(browser());
+ void ExpectBubbleLabelTextEquals(std::string text) {
+ ExpectBubbleLabelTextOnBrowserEquals(text, browser());
}
- std::string GetBubbleLabelTextOnBrowser(Browser* browser) {
- return GetBubbleControllerForBrowser(browser)
- ->GetBubbleLabelTextForTesting();
+ void ExpectBubbleLabelTextOnBrowserEquals(std::string text,
+ Browser* browser) {
+#if defined(TOOLKIT_VIEWS)
+ EXPECT_EQ(
+ text,
+ GetBubbleControllerForBrowser(browser)->GetBubbleLabelTextForTesting());
+#endif
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
+
+ std::unordered_map<Browser*, std::unique_ptr<CaptionHostImpl>>
+ caption_host_impls_;
};
IN_PROC_BROWSER_TEST_F(CaptionControllerTest, ProfilePrefsAreRegistered) {
@@ -200,12 +237,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
// Make the bubble visible by dispatching a transcription.
DispatchTranscription(
"In Switzerland it is illegal to own just one guinea pig.");
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisible());
-#else
- EXPECT_FALSE(IsWidgetVisible());
-#endif
+ ExpectIsWidgetVisible(true);
SetLiveCaptionEnabled(false);
EXPECT_EQ(nullptr, GetBubbleController());
@@ -287,12 +319,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnBrowserRemoved) {
// Make the bubble on browser3 visible by dispatching a transcription.
DispatchTranscriptionToBrowser(
"If you lift a kangaroo's tail off the ground it can't hop.", browser3);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser3));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser3));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser3);
browser3->window()->Close();
ui_test_utils::WaitForBrowserToClose();
EXPECT_EQ(nullptr,
@@ -302,12 +329,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnBrowserRemoved) {
// Make the bubble on browser2 visible by dispatching a transcription.
DispatchTranscriptionToBrowser(
"A lion's roar can be heard from 5 miles away.", browser2);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
// Close all browsers and verify that the caption bubbles are destroyed on
// the two remaining browsers.
@@ -320,6 +342,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnBrowserRemoved) {
//
// TODO(crbug.com/88586): Remove the other branch once
// DestroyProfileOnBrowserClose becomes the default.
+ base::RunLoop().RunUntilIdle();
std::vector<Profile*> loaded_profiles =
g_browser_process->profile_manager()->GetLoadedProfiles();
auto it = base::ranges::find(loaded_profiles, profile);
@@ -354,12 +377,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnBrowserRemoved_Incognito) {
DispatchTranscriptionToBrowser(
"If you lift a kangaroo's tail off the ground it can't hop.",
incognito_browser1);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(incognito_browser1));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser1);
incognito_browser1->window()->Close();
ui_test_utils::WaitForBrowserToClose();
EXPECT_EQ(nullptr, controller->GetCaptionBubbleControllerForBrowser(
@@ -376,14 +394,9 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, DispatchTranscription) {
success = DispatchTranscription(
"A baby octopus is about the size of a flea when it is born.");
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisible());
- EXPECT_EQ("A baby octopus is about the size of a flea when it is born.",
- GetBubbleLabelText());
-#else
- EXPECT_FALSE(IsWidgetVisible());
-#endif
+ ExpectIsWidgetVisible(true);
+ ExpectBubbleLabelTextEquals(
+ "A baby octopus is about the size of a flea when it is born.");
SetLiveCaptionEnabled(false);
success = DispatchTranscription(
@@ -404,54 +417,40 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
bool success = DispatchTranscriptionToBrowser(
"Honeybees can recognize human faces.", browser1);
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
- EXPECT_EQ("Honeybees can recognize human faces.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("", GetBubbleLabelTextOnBrowser(browser2));
- EXPECT_EQ("", GetBubbleLabelTextOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, incognito_browser);
+ ExpectBubbleLabelTextOnBrowserEquals("Honeybees can recognize human faces.",
+ browser1);
+ ExpectBubbleLabelTextOnBrowserEquals("", browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("", incognito_browser);
success = DispatchTranscriptionToBrowser(
"A blue whale's heart is the size of a small car.", browser2);
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
- EXPECT_EQ("A blue whale's heart is the size of a small car.",
- GetBubbleLabelTextOnBrowser(browser2));
- EXPECT_EQ("Honeybees can recognize human faces.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("", GetBubbleLabelTextOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, incognito_browser);
+ ExpectBubbleLabelTextOnBrowserEquals(
+ "A blue whale's heart is the size of a small car.", browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("Honeybees can recognize human faces.",
+ browser1);
+ ExpectBubbleLabelTextOnBrowserEquals("", incognito_browser);
success = DispatchTranscriptionToBrowser(
"Squirrels forget where they hide about half of their nuts.",
incognito_browser);
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(incognito_browser));
- EXPECT_EQ("A blue whale's heart is the size of a small car.",
- GetBubbleLabelTextOnBrowser(browser2));
- EXPECT_EQ("Honeybees can recognize human faces.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("Squirrels forget where they hide about half of their nuts.",
- GetBubbleLabelTextOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser);
+ ExpectBubbleLabelTextOnBrowserEquals(
+ "A blue whale's heart is the size of a small car.", browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("Honeybees can recognize human faces.",
+ browser1);
+ ExpectBubbleLabelTextOnBrowserEquals(
+ "Squirrels forget where they hide about half of their nuts.",
+ incognito_browser);
}
IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnError) {
@@ -460,12 +459,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnError) {
SetLiveCaptionEnabled(true);
OnError();
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisible());
-#else
- EXPECT_FALSE(IsWidgetVisible());
-#endif
+ ExpectIsWidgetVisible(true);
SetLiveCaptionEnabled(false);
OnError();
@@ -480,34 +474,67 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnError_MultipleBrowsers) {
// OnError routes to the right browser.
OnErrorOnBrowser(browser1);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, incognito_browser);
OnErrorOnBrowser(browser2);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, incognito_browser);
OnErrorOnBrowser(incognito_browser);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(incognito_browser));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(incognito_browser));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser);
+}
+
+IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnAudioStreamEnd) {
+ OnAudioStreamEnd();
+ EXPECT_EQ(0, NumBubbleControllers());
+
+ SetLiveCaptionEnabled(true);
+ DispatchTranscription("Some cicadas appear only once every 17 years.");
+ ExpectIsWidgetVisible(true);
+
+ OnAudioStreamEnd();
+ ExpectIsWidgetVisible(false);
+
+ SetLiveCaptionEnabled(false);
+ OnAudioStreamEnd();
+ EXPECT_EQ(0, NumBubbleControllers());
+}
+
+IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
+ OnAudioStreamEnd_MultipleBrowsers) {
+ Browser* browser1 = browser();
+ Browser* browser2 = CreateBrowser(browser()->profile());
+ Browser* incognito_browser = CreateIncognitoBrowser();
+ SetLiveCaptionEnabled(true);
+ DispatchTranscriptionToBrowser("Ladybugs are beetles, not bugs.", browser1);
+ DispatchTranscriptionToBrowser("Ladybugs eat 5000 bugs in their lifetimes.",
+ browser2);
+ DispatchTranscriptionToBrowser("Ladybugs have up to 20 spots.",
+ incognito_browser);
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser);
+
+ // OnAudioStreamEnd routes to the right browser.
+ OnAudioStreamEndOnBrowser(browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser);
+
+ OnAudioStreamEndOnBrowser(browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+ ExpectIsWidgetVisibleOnBrowser(true, incognito_browser);
+
+ OnAudioStreamEndOnBrowser(incognito_browser);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+ ExpectIsWidgetVisibleOnBrowser(false, incognito_browser);
}
#if !BUILDFLAG(IS_CHROMEOS_ASH) // No multi-profile on ChromeOS.
@@ -591,6 +618,13 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
CaptionController* controller1 = GetControllerForProfile(profile1);
CaptionController* controller2 = GetControllerForProfile(profile2);
+ // TODO(crbug.com/88586): Remove this test when the
+ // DestroyProfileOnBrowserClose flag is removed.
+ ScopedProfileKeepAlive profile1_keep_alive(
+ profile1, ProfileKeepAliveOrigin::kBrowserWindow);
+ ScopedProfileKeepAlive profile2_keep_alive(
+ profile2, ProfileKeepAliveOrigin::kBrowserWindow);
+
// Enable live caption on both profiles.
SetLiveCaptionEnabled(true);
SetLiveCaptionEnabledForProfile(true, profile2);
@@ -609,12 +643,7 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
// transcription.
DispatchTranscriptionToBrowser(
"If you lift a kangaroo's tail off the ground it can't hop.", browser1);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
browser1->window()->Close();
ui_test_utils::WaitForBrowserToClose();
EXPECT_EQ(nullptr,
@@ -639,49 +668,30 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
bool success = DispatchTranscriptionToBrowserForProfile(
"Only female mosquitos bite.", browser1, profile1);
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_EQ("Only female mosquitos bite.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("", GetBubbleLabelTextOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("Only female mosquitos bite.", browser1);
+ ExpectBubbleLabelTextOnBrowserEquals("", browser2);
success = DispatchTranscriptionToBrowserForProfile(
"Mosquitos were around at the time of the dinosaurs.", browser2,
profile2);
EXPECT_TRUE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_EQ("Only female mosquitos bite.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("Mosquitos were around at the time of the dinosaurs.",
- GetBubbleLabelTextOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("Only female mosquitos bite.", browser1);
+ ExpectBubbleLabelTextOnBrowserEquals(
+ "Mosquitos were around at the time of the dinosaurs.", browser2);
// Dispatch transcription returns false for browsers on different profiles.
success = DispatchTranscriptionToBrowserForProfile(
"There are over 3000 species of mosquitos.", browser1, profile2);
EXPECT_FALSE(success);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
- EXPECT_EQ("Only female mosquitos bite.",
- GetBubbleLabelTextOnBrowser(browser1));
- EXPECT_EQ("Mosquitos were around at the time of the dinosaurs.",
- GetBubbleLabelTextOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+ ExpectBubbleLabelTextOnBrowserEquals("Only female mosquitos bite.", browser1);
+ ExpectBubbleLabelTextOnBrowserEquals(
+ "Mosquitos were around at the time of the dinosaurs.", browser2);
}
IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnError_MultipleProfiles) {
@@ -696,33 +706,50 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, OnError_MultipleProfiles) {
// OnError routes to the right browser on the right profile.
OnErrorOnBrowserForProfile(browser1, profile1);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
OnErrorOnBrowserForProfile(browser2, profile2);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
// OnError does nothing when sent to browsers on different profiles.
OnErrorOnBrowserForProfile(browser1, profile2);
-// The CaptionBubbleController is currently only implemented in Views.
-#if defined(TOOLKIT_VIEWS)
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_TRUE(IsWidgetVisibleOnBrowser(browser2));
-#else
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser1));
- EXPECT_FALSE(IsWidgetVisibleOnBrowser(browser2));
-#endif
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+}
+
+IN_PROC_BROWSER_TEST_F(CaptionControllerTest,
+ OnAudioStreamEnd_MultipleProfiles) {
+ Profile* profile1 = browser()->profile();
+ Profile* profile2 = CreateProfile();
+ Browser* browser1 = browser();
+ Browser* browser2 = CreateBrowser(profile2);
+
+ // Enable live caption on both profiles.
+ SetLiveCaptionEnabled(true);
+ SetLiveCaptionEnabledForProfile(true, profile2);
+
+ DispatchTranscriptionToBrowserForProfile(
+ "Capybaras are the largest rodents in the world.", browser1, profile1);
+ DispatchTranscriptionToBrowserForProfile(
+ "Capybaras' teeth grow continuously.", browser2, profile2);
+ ExpectIsWidgetVisibleOnBrowser(true, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+
+ // OnAudioStreamEnd routes to the right browser on the right profile.
+ OnAudioStreamEndOnBrowserForProfile(browser1, profile1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(true, browser2);
+
+ OnAudioStreamEndOnBrowserForProfile(browser2, profile2);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
+
+ // OnAudioStreamEnd does nothing when sent to browsers on different profiles.
+ OnAudioStreamEndOnBrowserForProfile(browser1, profile2);
+ ExpectIsWidgetVisibleOnBrowser(false, browser1);
+ ExpectIsWidgetVisibleOnBrowser(false, browser2);
}
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chromium/chrome/browser/accessibility/caption_host_impl.cc b/chromium/chrome/browser/accessibility/caption_host_impl.cc
index 2d4e2dca166..990e400bd2a 100644
--- a/chromium/chrome/browser/accessibility/caption_host_impl.cc
+++ b/chromium/chrome/browser/accessibility/caption_host_impl.cc
@@ -32,32 +32,37 @@ CaptionHostImpl::CaptionHostImpl(content::RenderFrameHost* frame_host)
Observe(web_contents);
}
-CaptionHostImpl::~CaptionHostImpl() = default;
+CaptionHostImpl::~CaptionHostImpl() {
+ CaptionController* caption_controller = GetCaptionController();
+ if (caption_controller)
+ caption_controller->OnAudioStreamEnd(this);
+}
void CaptionHostImpl::OnTranscription(
chrome::mojom::TranscriptionResultPtr transcription_result,
OnTranscriptionCallback reply) {
- content::WebContents* web_contents = GetWebContents();
- if (!web_contents) {
- std::move(reply).Run(false);
- return;
- }
- CaptionController* caption_controller = GetCaptionController(web_contents);
+ CaptionController* caption_controller = GetCaptionController();
if (!caption_controller) {
std::move(reply).Run(false);
return;
}
- std::move(reply).Run(caption_controller->DispatchTranscription(
- web_contents, transcription_result));
+ std::move(reply).Run(
+ caption_controller->DispatchTranscription(this, transcription_result));
}
-void CaptionHostImpl::OnError() {
- content::WebContents* web_contents = GetWebContents();
- if (!web_contents)
+void CaptionHostImpl::OnLanguageIdentificationEvent(
+ media::mojom::LanguageIdentificationEventPtr event) {
+ CaptionController* caption_controller = GetCaptionController();
+ if (!caption_controller)
return;
- CaptionController* caption_controller = GetCaptionController(web_contents);
+
+ caption_controller->OnLanguageIdentificationEvent(std::move(event));
+}
+
+void CaptionHostImpl::OnError() {
+ CaptionController* caption_controller = GetCaptionController();
if (caption_controller)
- caption_controller->OnError(web_contents);
+ caption_controller->OnError(this);
}
void CaptionHostImpl::RenderFrameDeleted(content::RenderFrameHost* frame_host) {
@@ -75,8 +80,10 @@ content::WebContents* CaptionHostImpl::GetWebContents() {
return web_contents;
}
-CaptionController* CaptionHostImpl::GetCaptionController(
- content::WebContents* web_contents) {
+CaptionController* CaptionHostImpl::GetCaptionController() {
+ content::WebContents* web_contents = GetWebContents();
+ if (!web_contents)
+ return nullptr;
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
if (!profile)
diff --git a/chromium/chrome/browser/accessibility/caption_host_impl.h b/chromium/chrome/browser/accessibility/caption_host_impl.h
index 1b3cc862d76..4b916d96278 100644
--- a/chromium/chrome/browser/accessibility/caption_host_impl.h
+++ b/chromium/chrome/browser/accessibility/caption_host_impl.h
@@ -9,6 +9,7 @@
#include "chrome/common/caption.mojom.h"
#include "content/public/browser/web_contents_observer.h"
+#include "media/mojo/mojom/speech_recognition_service.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
namespace content {
@@ -42,19 +43,22 @@ class CaptionHostImpl : public chrome::mojom::CaptionHost,
void OnTranscription(
chrome::mojom::TranscriptionResultPtr transcription_result,
OnTranscriptionCallback reply) override;
+ void OnLanguageIdentificationEvent(
+ media::mojom::LanguageIdentificationEventPtr event) override;
void OnError() override;
- // content::WebContentsObserver:
- void RenderFrameDeleted(content::RenderFrameHost* frame_host) override;
-
- private:
// Returns the WebContents if it exists. If it does not exist, sets the
// RenderFrameHost reference to nullptr and returns nullptr.
content::WebContents* GetWebContents();
- // Returns the CaptionController for this WebContents. Returns nullptr if
- // it does not exist.
- CaptionController* GetCaptionController(content::WebContents*);
+ protected:
+ // content::WebContentsObserver:
+ void RenderFrameDeleted(content::RenderFrameHost* frame_host) override;
+
+ private:
+ // Returns the CaptionController for frame_host_. Returns nullptr if it does
+ // not exist.
+ CaptionController* GetCaptionController();
content::RenderFrameHost* frame_host_;
};
diff --git a/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc b/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
index c49e0f549f7..c0a15d72379 100644
--- a/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
@@ -262,7 +262,7 @@ class ImageAnnotationBrowserTest : public InProcessBrowserTest {
PrefService* prefs = user_prefs::UserPrefs::Get(context);
DCHECK(prefs);
- prefs->Set(language::prefs::kAcceptLanguages,
+ prefs->Set(language::prefs::kSelectedLanguages,
base::Value(accept_languages));
}
diff --git a/chromium/chrome/browser/accessibility/soda_installer.cc b/chromium/chrome/browser/accessibility/soda_installer.cc
index 3fcb0346fda..21861fc9499 100644
--- a/chromium/chrome/browser/accessibility/soda_installer.cc
+++ b/chromium/chrome/browser/accessibility/soda_installer.cc
@@ -4,12 +4,58 @@
#include "chrome/browser/accessibility/soda_installer.h"
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/public/cpp/ash_pref_names.h"
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#include "base/feature_list.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/soda/pref_names.h"
+#include "media/base/media_switches.h"
+
+namespace {
+
+constexpr int kSodaCleanUpDelayInDays = 30;
+
+} // namespace
+
namespace speech {
SodaInstaller::SodaInstaller() = default;
SodaInstaller::~SodaInstaller() = default;
+void SodaInstaller::Init(PrefService* profile_prefs,
+ PrefService* global_prefs) {
+ if (!base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption))
+ return;
+
+ if (IsAnyFeatureUsingSodaEnabled(profile_prefs)) {
+ global_prefs->SetTime(prefs::kSodaScheduledDeletionTime, base::Time());
+ speech::SodaInstaller::GetInstance()->InstallSoda(profile_prefs);
+ speech::SodaInstaller::GetInstance()->InstallLanguage(profile_prefs);
+ } else {
+ base::Time deletion_time =
+ global_prefs->GetTime(prefs::kSodaScheduledDeletionTime);
+ if (!deletion_time.is_null() && deletion_time < base::Time::Now()) {
+ UninstallSoda(global_prefs);
+ }
+ }
+}
+
+void SodaInstaller::SetUninstallTimer(PrefService* profile_prefs,
+ PrefService* global_prefs) {
+ // Do not schedule uninstallation if any SODA client features are still
+ // enabled.
+ if (IsAnyFeatureUsingSodaEnabled(profile_prefs))
+ return;
+
+ // Schedule deletion.
+ global_prefs->SetTime(
+ prefs::kSodaScheduledDeletionTime,
+ base::Time::Now() + base::TimeDelta::FromDays(kSodaCleanUpDelayInDays));
+}
+
void SodaInstaller::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
@@ -39,4 +85,14 @@ void SodaInstaller::NotifySodaInstalledForTesting() {
NotifyOnSodaInstalled();
}
+bool SodaInstaller::IsAnyFeatureUsingSodaEnabled(PrefService* prefs) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ // TODO(crbug.com/1165437): Add Projector feature.
+ return prefs->GetBoolean(prefs::kLiveCaptionEnabled) ||
+ prefs->GetBoolean(ash::prefs::kAccessibilityDictationEnabled);
+#else // !BUILDFLAG(IS_CHROMEOS_ASH)
+ return prefs->GetBoolean(prefs::kLiveCaptionEnabled);
+#endif
+}
+
} // namespace speech
diff --git a/chromium/chrome/browser/accessibility/soda_installer.h b/chromium/chrome/browser/accessibility/soda_installer.h
index 353557d17c1..37096e83cb1 100644
--- a/chromium/chrome/browser/accessibility/soda_installer.h
+++ b/chromium/chrome/browser/accessibility/soda_installer.h
@@ -39,6 +39,16 @@ class SodaInstaller {
// instance.
static SodaInstaller* GetInstance();
+ // Initialize SODA if any SODA-utilising feature is enabled. Intended to be
+ // called during embedder startup. Checks whether SODA is due for
+ // uninstallation, and if so, triggers uninstallation.
+ void Init(PrefService* profile_prefs, PrefService* global_prefs);
+
+ // Schedules SODA for uninstallation if no SODA client features are
+ // currently enabled. Should be called when client features using SODA are
+ // disabled.
+ void SetUninstallTimer(PrefService* profile_prefs, PrefService* global_prefs);
+
// Gets the directory path of the installed SODA lib bundle, or an empty path
// if not installed. Currently Chrome OS only, returns empty path on other
// platforms.
@@ -67,9 +77,10 @@ class SodaInstaller {
// asynchronously returned an answer.
virtual bool IsSodaInstalled() const = 0;
- // Uninstalls SODA and associated language model(s). On some platforms, disc
- // space may not be freed immediately.
- virtual void UninstallSoda(PrefService* global_prefs) = 0;
+ // Returns whether or not the language pack for a given language or locale
+ // code is installed.
+ virtual bool IsLanguageInstalled(
+ const std::string& locale_or_language) const = 0;
// Adds an observer to the observer list.
void AddObserver(Observer* observer);
@@ -80,6 +91,10 @@ class SodaInstaller {
void NotifySodaInstalledForTesting();
protected:
+ // Uninstalls SODA and associated language model(s). On some platforms, disc
+ // space may not be freed immediately.
+ virtual void UninstallSoda(PrefService* global_prefs) = 0;
+
// Notifies the observers that the SODA installation has completed.
void NotifyOnSodaInstalled();
@@ -93,6 +108,10 @@ class SodaInstaller {
base::ObserverList<Observer> observers_;
bool soda_binary_installed_ = false;
bool language_installed_ = false;
+
+ private:
+ // Any new feature using SODA should add its pref here.
+ bool IsAnyFeatureUsingSodaEnabled(PrefService* prefs);
};
} // namespace speech
diff --git a/chromium/chrome/browser/accessibility/soda_installer_impl.cc b/chromium/chrome/browser/accessibility/soda_installer_impl.cc
index 9b83f595f2f..1e7b1678a12 100644
--- a/chromium/chrome/browser/accessibility/soda_installer_impl.cc
+++ b/chromium/chrome/browser/accessibility/soda_installer_impl.cc
@@ -13,6 +13,7 @@
#include "base/containers/contains.h"
#include "base/containers/flat_set.h"
#include "base/feature_list.h"
+#include "base/files/file_util.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/numerics/ranges.h"
@@ -21,8 +22,10 @@
#include "chrome/browser/component_updater/soda_language_pack_component_installer.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
+#include "components/soda/constants.h"
#include "components/update_client/crx_update_item.h"
#include "media/base/media_switches.h"
+#include "ui/base/l10n/l10n_util.h"
namespace {
@@ -109,10 +112,18 @@ bool SodaInstallerImpl::IsSodaInstalled() const {
return soda_binary_installed_ && language_installed_;
}
+bool SodaInstallerImpl::IsLanguageInstalled(
+ const std::string& locale_or_language) const {
+ // TODO(crbug.com/1161569): SODA is only available for en-US right now.
+ // Update this to check installation of language pack when available.
+ return l10n_util::GetLanguage(locale_or_language) == "en" &&
+ language_installed_;
+}
+
void SodaInstallerImpl::UninstallSoda(PrefService* global_prefs) {
- // TODO(crbug.com/1055150): Refactor uninstallation code from elsewhere to
- // here.
- NOTREACHED();
+ base::DeletePathRecursively(speech::GetSodaDirectory());
+ base::DeletePathRecursively(speech::GetSodaLanguagePacksDirectory());
+ global_prefs->SetTime(prefs::kSodaScheduledDeletionTime, base::Time());
}
void SodaInstallerImpl::OnEvent(Events event, const std::string& id) {
diff --git a/chromium/chrome/browser/accessibility/soda_installer_impl.h b/chromium/chrome/browser/accessibility/soda_installer_impl.h
index 9d6b4b754cd..8fac315e49d 100644
--- a/chromium/chrome/browser/accessibility/soda_installer_impl.h
+++ b/chromium/chrome/browser/accessibility/soda_installer_impl.h
@@ -42,9 +42,13 @@ class SodaInstallerImpl : public SodaInstaller,
void InstallSoda(PrefService* prefs) override;
void InstallLanguage(PrefService* prefs) override;
bool IsSodaInstalled() const override;
- void UninstallSoda(PrefService* global_prefs) override;
+ bool IsLanguageInstalled(
+ const std::string& locale_or_language) const override;
private:
+ // SodaInstaller:
+ void UninstallSoda(PrefService* global_prefs) override;
+
// component_updater::ServiceObserver:
void OnEvent(Events event, const std::string& id) override;
diff --git a/chromium/chrome/browser/android/browserservices/intents/BUILD.gn b/chromium/chrome/browser/android/browserservices/intents/BUILD.gn
new file mode 100644
index 00000000000..a668c3fcd3f
--- /dev/null
+++ b/chromium/chrome/browser/android/browserservices/intents/BUILD.gn
@@ -0,0 +1,27 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/browserservices/intents/BitmapHelper.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/CustomButtonParams.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/WebApkExtras.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/WebApkShareTarget.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/WebDisplayMode.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/WebappExtras.java",
+ "java/src/org/chromium/chrome/browser/browserservices/intents/WebappIcon.java",
+ ]
+ deps = [
+ "//base:base_java",
+ "//chrome/browser/flags:java",
+ "//components/webapps/browser/android:java",
+ "//services/device/public/mojom:mojom_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_browser_browser_java",
+ ]
+ srcjar_deps = [ "//chrome/browser/android/webapk:enums_srcjar" ]
+}
diff --git a/chromium/chrome/browser/android/browserservices/verification/BUILD.gn b/chromium/chrome/browser/android/browserservices/verification/BUILD.gn
index f398d6d5506..1f663c66cb1 100644
--- a/chromium/chrome/browser/android/browserservices/verification/BUILD.gn
+++ b/chromium/chrome/browser/android/browserservices/verification/BUILD.gn
@@ -15,10 +15,10 @@ android_library("java") {
]
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
+ "//components/digital_asset_links:java",
"//components/embedder_support/android:util_java",
"//components/externalauth/android:java",
"//content/public/android:content_java",
@@ -27,8 +27,6 @@ android_library("java") {
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_browser_browser_java",
]
- srcjar_deps =
- [ "//chrome/browser/installable/digital_asset_links:enums_srcjar" ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
diff --git a/chromium/chrome/browser/android/crypto/BUILD.gn b/chromium/chrome/browser/android/crypto/BUILD.gn
index d62fc9d261f..8624549c240 100644
--- a/chromium/chrome/browser/android/crypto/BUILD.gn
+++ b/chromium/chrome/browser/android/crypto/BUILD.gn
@@ -10,8 +10,5 @@ android_library("java") {
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
- sources = [
- "java/src/org/chromium/chrome/browser/crypto/ByteArrayGenerator.java",
- "java/src/org/chromium/chrome/browser/crypto/CipherFactory.java",
- ]
+ sources = [ "java/src/org/chromium/chrome/browser/crypto/CipherFactory.java" ]
}
diff --git a/chromium/chrome/browser/android/webapk/BUILD.gn b/chromium/chrome/browser/android/webapk/BUILD.gn
index 70409625e27..38be629820d 100644
--- a/chromium/chrome/browser/android/webapk/BUILD.gn
+++ b/chromium/chrome/browser/android/webapk/BUILD.gn
@@ -2,8 +2,17 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/android/rules.gni")
import("//third_party/protobuf/proto_library.gni")
proto_library("proto") {
sources = [ "webapk.proto" ]
}
+
+# Since only one target uses the generated enums, we can leave it as a
+# srcjar. If in the future, more targets want to depend on these enums,
+# we will need to introduce an android_library that contains the srcjar
+# that multiple other targets can depend on.
+java_cpp_enum("enums_srcjar") {
+ sources = [ "webapk_types.h" ]
+}
diff --git a/chromium/chrome/browser/android/webapps/launchpad/BUILD.gn b/chromium/chrome/browser/android/webapps/launchpad/BUILD.gn
new file mode 100644
index 00000000000..7215e3891f6
--- /dev/null
+++ b/chromium/chrome/browser/android/webapps/launchpad/BUILD.gn
@@ -0,0 +1,71 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/AppListCoordinator.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/AppListMediator.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/AppManagementMenuCoordinator.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/AppManagementMenuHeaderProperties.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/AppManagementMenuHeaderViewBinder.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadCoordinator.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadItem.java",
+ "java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPage.java",
+ ]
+
+ deps = [
+ ":java_resources",
+ "//base:base_java",
+ "//chrome/android/webapk/libs/client:client_java",
+ "//chrome/browser/ui/android/native_page:java",
+ "//components/browser_ui/widget/android:java",
+ "//components/embedder_support/android:util_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_recyclerview_recyclerview_java",
+ "//ui/android:ui_full_java",
+ ]
+ resources_package = "org.chromium.chrome.browser.webapps.launchpad"
+}
+
+android_resources("java_resources") {
+ sources = [
+ "java/res/layout/launchpad_app_menu_header.xml",
+ "java/res/layout/launchpad_menu_dialog_layout.xml",
+ "java/res/layout/launchpad_menu_dialog_layout.xml",
+ "java/res/layout/launchpad_page_layout.xml",
+ "java/res/layout/launchpad_tile_view.xml",
+ "java/res/values/dimens.xml",
+ ]
+
+ deps = [
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//components/browser_ui/widget/android:java_resources",
+ ]
+}
+
+android_library("javatests") {
+ testonly = true
+ sources = [ "java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPageTest.java" ]
+
+ deps = [
+ ":java",
+ ":java_resources",
+ "//base:base_java_test_support",
+ "//chrome/android:chrome_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/ui/messages/android:java",
+ "//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/widget/android:java",
+ "//components/embedder_support/android:util_java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/android_deps:espresso_java",
+ "//third_party/androidx:androidx_recyclerview_recyclerview_java",
+ "//third_party/androidx:androidx_test_runner_java",
+ "//third_party/hamcrest:hamcrest_java",
+ "//third_party/junit",
+ "//ui/android:ui_full_java",
+ ]
+}
diff --git a/chromium/chrome/browser/ash/guest_os/BUILD.gn b/chromium/chrome/browser/ash/guest_os/BUILD.gn
new file mode 100644
index 00000000000..5b256349734
--- /dev/null
+++ b/chromium/chrome/browser/ash/guest_os/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("guest_os_diagnostics_mojom") {
+ sources = [ "guest_os_diagnostics.mojom" ]
+
+ webui_module_path = "/"
+}
diff --git a/chromium/chrome/browser/ash/guest_os/guest_os_diagnostics.mojom b/chromium/chrome/browser/ash/guest_os/guest_os_diagnostics.mojom
new file mode 100644
index 00000000000..7d175bf75e0
--- /dev/null
+++ b/chromium/chrome/browser/ash/guest_os/guest_os_diagnostics.mojom
@@ -0,0 +1,27 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module guest_os.mojom;
+
+struct DiagnosticEntry {
+ enum Status {
+ kPass,
+ kFail,
+ kNotApplicable,
+ };
+
+ string requirement;
+ Status status;
+ string? explanation;
+};
+
+struct DiagnosticTopError {
+ string message;
+ string? learn_more_link;
+};
+
+struct Diagnostics {
+ array<DiagnosticEntry> entries;
+ DiagnosticTopError? top_error;
+};
diff --git a/chromium/chrome/browser/chromeos/wilco_dtc_supportd/BUILD.gn b/chromium/chrome/browser/ash/wilco_dtc_supportd/BUILD.gn
index 1c47ee44e69..1c47ee44e69 100644
--- a/chromium/chrome/browser/chromeos/wilco_dtc_supportd/BUILD.gn
+++ b/chromium/chrome/browser/ash/wilco_dtc_supportd/BUILD.gn
diff --git a/chromium/chrome/browser/banners/android/BUILD.gn b/chromium/chrome/browser/banners/android/BUILD.gn
index dd8688768a6..3a3c5114701 100644
--- a/chromium/chrome/browser/banners/android/BUILD.gn
+++ b/chromium/chrome/browser/banners/android/BUILD.gn
@@ -14,8 +14,8 @@ android_library("java") {
":java_resources",
":jni_headers",
"//base:base_java",
- "//base:jni_java",
"//chrome/android:chrome_jni_headers",
+ "//chrome/browser/feature_engagement:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/appmenu:java",
@@ -54,6 +54,8 @@ android_library("javatests") {
"//chrome/android:chrome_java",
"//chrome/android:chrome_test_java",
"//chrome/android:chrome_test_util_java",
+ "//chrome/browser/android/browserservices/intents:java",
+ "//chrome/browser/feature_engagement:java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
diff --git a/chromium/chrome/browser/browser_resources.grd b/chromium/chrome/browser/browser_resources.grd
index 974c20f48a4..e63741b6efb 100644
--- a/chromium/chrome/browser/browser_resources.grd
+++ b/chromium/chrome/browser/browser_resources.grd
@@ -23,83 +23,9 @@
</if>
<if expr="chromeos">
- <structure name="IDR_MD_LOGIN_HTML" file="resources\chromeos\login\md_login.html" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
- <structure name="IDR_MD_LOGIN_JS" file="resources\chromeos\login\md_login.js" flattenhtml="true" type="chrome_html" />
- <structure name="IDR_OOBE_HTML" file="resources\chromeos\login\oobe.html" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
- <structure name="IDR_OOBE_JS" file="resources\chromeos\login\oobe.js" flattenhtml="true" type="chrome_html" />
<structure name="IDR_KEYBOARD_UTILS_JS" file="resources\chromeos\keyboard\keyboard_utils.js" flattenhtml="true" type="chrome_html" />
- <structure name="IDR_CUSTOM_ELEMENTS_OOBE_HTML" file="resources\chromeos\login\structure\components_common.html" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
- <structure name="IDR_CUSTOM_ELEMENTS_OOBE_JS" file="resources\chromeos\login\structure\components_common.js" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
- <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_HTML" file="resources\chromeos\login\structure\components_common.html" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
- <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_JS" file="resources\chromeos\login\structure\components_common.js" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
<structure name="IDR_ASSISTANT_OPTIN_HTML" file="resources\chromeos\assistant_optin\assistant_optin.html" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
<structure name="IDR_ASSISTANT_OPTIN_JS" file="resources\chromeos\assistant_optin\assistant_optin.js" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
- <structure name="IDR_OOBE_DEBUGGER_JS" file="resources\chromeos\login\debug\debug.js" flattenhtml="true" type="chrome_html" />
- <structure name="IDR_OOBE_DEBUGGER_STUB_JS" file="resources\chromeos\login\debug\no_debug.js" flattenhtml="true" type="chrome_html" />
- <structure name="IDR_OOBE_TEST_API_JS" file="resources\chromeos\login\test_api\test_api.js" flattenhtml="true" type="chrome_html" />
- <structure name="IDR_OOBE_TEST_API_STUB_JS" file="resources\chromeos\login\test_api\no_test_api.js" flattenhtml="true" type="chrome_html" />
-
- <!-- OOBE Components -->
- <structure name="IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_i18n_behavior/oobe_i18n_behavior.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_i18n_behavior/oobe_i18n_behavior.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_I18N_SETUP_HTML" file="resources/chromeos/login/components/oobe_i18n_behavior/i18n_setup.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_DIALOG_HOST_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_DIALOG_HOST_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_focus_behavior/oobe_focus_behavior.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_focus_behavior/oobe_focus_behavior.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.js" type="chrome_html" />
-
- <!-- OOBE CSS Vars -->
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_OLD_CSS_HTML" file="resources/chromeos/login/components/oobe_vars/oobe_custom_vars_old_css.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_CSS_HTML" file="resources/chromeos/login/components/oobe_vars/oobe_custom_vars_css.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_REMORA_CSS_HTML" file="resources/chromeos/login/components/oobe_vars/oobe_custom_vars_remora_css.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_SHARED_VARS_CSS_HTML" file="resources/chromeos/login/components/oobe_vars/oobe_shared_vars_css.html" type="chrome_html" />
-
- <structure name="IDR_OOBE_COMPONENTS_COMMON_STYLES_HTML" file="resources/chromeos/login/components/common_styles/common_styles.html" type="chrome_html" flattenhtml="true"/>
- <structure name="IDR_OOBE_COMPONENTS_HD_IRON_ICON_HTML" file="resources/chromeos/login/components/hd_iron_icon/hd_iron_icon.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_HD_IRON_ICON_JS" file="resources/chromeos/login/components/hd_iron_icon/hd_iron_icon.js" type="chrome_html" />
-
- <structure name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_HTML" file="resources/chromeos/login/components/oobe_dialog/oobe_dialog.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_JS" file="resources/chromeos/login/components/oobe_dialog/oobe_dialog.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_HTML" file="resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_JS" file="resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.js" type="chrome_html" />
-
-
- <!-- New layout (oobe_adaptive_dialog and oobe_content_dialog) corresponds OOBE redesign which has happened in November 2020 -->
- <structure name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_HTML" file="resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_JS" file="resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_HTML" file="resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_JS" file="resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_HTML" file="resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_JS" file="resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_HTML" file="resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_JS" file="resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js" type="chrome_html" />
-
-
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_HTML" file="resources/chromeos/login/components/oobe_carousel/oobe_carousel.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_JS" file="resources/chromeos/login/components/oobe_carousel/oobe_carousel.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_SLIDE_HTML" file="resources/chromeos/login/components/oobe_slide/oobe_slide.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_OOBE_SLIDE_JS" file="resources/chromeos/login/components/oobe_slide/oobe_slide.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_PROGRESS_LIST_ITEM_HTML" file="resources/chromeos/login/components/progress_list_item/progress_list_item.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_PROGRESS_LIST_ITEM_JS" file="resources/chromeos/login/components/progress_list_item/progress_list_item.js" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_THROBBER_NOTICE_HTML" file="resources/chromeos/login/components/throbber_notice/throbber_notice.html" type="chrome_html" />
- <structure name="IDR_OOBE_COMPONENTS_THROBBER_NOTICE_JS" file="resources/chromeos/login/components/throbber_notice/throbber_notice.js" type="chrome_html" />
-
- <!-- Gesture Navigation animations. -->
- <structure type="chrome_html" name="IDR_GESTURE_NAVIGATION_GO_HOME_ANIMATION" file="resources\chromeos\login\images\gesture_go_home.json" compress="gzip" />
- <structure type="chrome_html" name="IDR_GESTURE_NAVIGATION_GO_BACK_ANIMATION" file="resources\chromeos\login\images\gesture_go_back.json" compress="gzip" />
- <structure type="chrome_html" name="IDR_GESTURE_NAVIGATION_HOTSEAT_OVERVIEW_ANIMATION" file="resources\chromeos\login\images\gesture_hotseat_overview.json" compress="gzip" />
-
- <!-- Marketing Opt In animations. -->
- <structure name="IDR_MARKETING_OPT_IN_ALL_SET_ANIMATION" file="resources\chromeos\login\images\all_set.json" compress="gzip" type="chrome_html" />
- <structure name="IDR_MARKETING_OPT_IN_ALL_SET_ANIMATION_NEW_NOLOOP" file="resources\chromeos\login\images\all_set_new_noloop.json" compress="gzip" type="chrome_html" />
-
- <!-- Multi-device Setup animation. -->
- <structure name="IDR_MULTIDEVICE_SETUP_ANIMATION" file="resources\chromeos\login\images\multidevice_setup.json" compress="gzip" type="chrome_html" />
-
- <!-- Apps downloading animation. -->
- <structure name="IDR_APPS_DOWNLOADING_ANIMATION" file="resources\chromeos\login\images\downloading_apps.json" compress="gzip" type="chrome_html" />
</if>
</structures>
<includes>
@@ -204,7 +130,6 @@
<include name="IDR_NETWORK_SPEECH_SYNTHESIS_MANIFEST" file="resources\network_speech_synthesis\manifest.json" type="BINDATA" />
- <include name="IDR_DESKTOP_HATS_HTML" file="resources\hats\hats.html" type="BINDATA" />
<include name="IDR_ORIGIN_MOJO_JS" file="${root_gen_dir}\url\mojom\origin.mojom-lite.js" use_base_dir="false" type="BINDATA"/>
<if expr="enable_plugins">
<include name="IDR_PDF_MANIFEST" file="resources\pdf\manifest.json" type="BINDATA" />
@@ -229,6 +154,7 @@
</if>
<include name="IDR_URL_MOJOM_LITE_JS" file="${root_gen_dir}\url\mojom\url.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<if expr="is_win or is_macosx or desktop_linux or chromeos">
+ <include name="IDR_SYNC_LOADING_CONFIRMATION_HTML" file="resources\signin\sync_confirmation\sync_loading_confirmation.html" type="BINDATA" />
<include name="IDR_SYNC_DISABLED_CONFIRMATION_HTML" file="resources\signin\sync_confirmation\sync_disabled_confirmation.html" type="BINDATA" />
<include name="IDR_SYNC_DISABLED_CONFIRMATION_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\sync_confirmation\sync_disabled_confirmation_app.js" use_base_dir="false" preprocess="true" type="BINDATA" />
<include name="IDR_SYNC_CONFIRMATION_HTML" file="resources\signin\sync_confirmation\sync_confirmation.html" type="BINDATA" />
@@ -264,6 +190,9 @@
<include name="IDR_WEBSTORE_MANIFEST" file="resources\webstore_app\manifest.json" type="BINDATA" />
<include name="IDR_CRYPTOTOKEN_MANIFEST" file="resources\cryptotoken\manifest.json" type="BINDATA" />
<if expr="chromeos">
+ <!-- Shared images for ChromeOS WebUIs -->
+ <include name="IDR_CHROME_OS_AN_ERROR_OCCURRED_SVG" file="resources\chromeos\images\an_error_occurred.svg" type="BINDATA" />
+ <include name="IDR_CHROME_OS_NO_NETWORK_SVG" file="resources\chromeos\images\no_network.svg" type="BINDATA" />
<!-- Edu account login resources -->
<include name="IDR_EDU_LOGIN_EDU_LOGIN_HTML" file="resources\chromeos\edu_login\edu_login.html" allowexternalscript="true" type="BINDATA" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\app.js" use_base_dir="false" type="BINDATA" />
@@ -310,7 +239,6 @@
<include name="IDR_PASSWORD_CHANGE_HTML" file="resources\chromeos\password_change\password_change.html" type="BINDATA" />
<include name="IDR_PASSWORD_CHANGE_JS" file="resources\chromeos\password_change\password_change.js" type="BINDATA" />
- <include name="IDR_PASSWORD_CHANGE_CSS" file="resources\chromeos\password_change\password_change.css" type="BINDATA" />
<include name="IDR_PASSWORD_CHANGE_AUTHENTICATOR_JS" file="resources\gaia_auth_host\password_change_authenticator.js" flattenhtml="true" type="BINDATA" />
<include name="IDR_CONFIRM_PASSWORD_CHANGE_HTML" file="resources\chromeos\password_change\confirm_password_change.html" type="chrome_html" />
<include name="IDR_CONFIRM_PASSWORD_CHANGE_JS" file="resources\chromeos\password_change\confirm_password_change.js" type="chrome_html" />
@@ -319,6 +247,8 @@
<include name="IDR_GAIA_AUTH_AUTHENTICATOR_JS" file="resources\gaia_auth_host\authenticator.js" flattenhtml="true" type="BINDATA" />
<include name="IDR_LOCK_SCREEN_REAUTH_HTML" file="resources\chromeos\password_change\lock_screen_reauth.html" flattenhtml="true" type="BINDATA" />
<include name="IDR_LOCK_SCREEN_REAUTH_JS" file="resources\chromeos\password_change\lock_screen_reauth.js" type="BINDATA" />
+ <include name="IDR_LOCK_SCREEN_NETWORK_HTML" file="resources\chromeos\password_change\lock_screen_network.html" type="BINDATA" />
+ <include name="IDR_LOCK_SCREEN_NETWORK_JS" file="resources\chromeos\password_change\lock_screen_network.js" type="BINDATA" />
<include name="IDR_CROSTINI_INSTALLER_INDEX_HTML" file="resources\chromeos\crostini_installer\index.html" type="BINDATA" />
<include name="IDR_CROSTINI_INSTALLER_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\crostini_installer\app.js" type="BINDATA" use_base_dir="false" />
@@ -355,6 +285,18 @@
<include name="IDR_DEMO_APP_MANIFEST" file="resources\chromeos\demo_app\manifest.json" type="BINDATA" />
<include name="IDR_WALLPAPERMANAGER_MANIFEST" file="resources\chromeos\wallpaper_manager\manifest.json" type="BINDATA" />
<include name="IDR_ARC_SUPPORT_MANIFEST" file="resources\chromeos\arc_support\manifest.json" type="BINDATA" />
+
+ <!-- Fingerprint resources. -->
+ <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_right.json"/>
+ <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_TABLET_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_tablet.json"/>
+ <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_DEFAULT_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_default.json"/>
+ <include type="BINDATA" name="IDR_FINGERPRINT_LAPTOP_TOP_RIGHT_ILLUSTRATION_SVG" file="resources\chromeos\quick_unlock\fingerprint_laptop_top_right.svg" />
+ <include type="BINDATA" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ILLUSTRATION_SVG" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_left.svg" />
+
+ <include name="IDR_VM_INDEX_HTML" file="resources\chromeos\vm\index.html" type="BINDATA" />
+ <include name="IDR_VM_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\vm\app.js" type="BINDATA" use_base_dir="false" />
+ <include name="IDR_VM_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ui\webui\chromeos\vm\vm.mojom-webui.js" use_base_dir="false" type="BINDATA" />
+ <include name="IDR_GUEST_OS_DIAGNOSTICS_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ash\guest_os\guest_os_diagnostics.mojom-webui.js" use_base_dir="false" type="BINDATA" />
</if>
<if expr="chromeos and _google_chrome">
<include name="IDR_HELP_MANIFEST" file="resources\help_app\manifest.json" type="BINDATA" />
@@ -365,6 +307,10 @@
<include name="IDR_PROFILE_CUSTOMIZATION_HTML" file="resources\signin\profile_customization\profile_customization.html" type="BINDATA" />
<include name="IDR_PROFILE_CUSTOMIZATION_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\profile_customization\profile_customization_app.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_PROFILE_CUSTOMIZATION_BROWSER_PROXY_JS" file="resources\signin\profile_customization\profile_customization_browser_proxy.js" type="BINDATA" />
+ <include name="IDR_ENTERPRISE_PROFILE_WELCOME_HTML" file="resources\signin\enterprise_profile_welcome\enterprise_profile_welcome.html" type="BINDATA" />
+ <include name="IDR_ENTERPRISE_PROFILE_WELCOME_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\enterprise_profile_welcome\enterprise_profile_welcome_app.js" use_base_dir="false" type="BINDATA" />
+ <include name="IDR_ENTERPRISE_PROFILE_WELCOME_BROWSER_PROXY_JS" file="resources\signin\enterprise_profile_welcome\enterprise_profile_welcome_browser_proxy.js" type="BINDATA" />
+ <include name="IDR_ENTERPRISE_PROFILE_WELCOME_ILLUSTRATION_SVG" file="resources\signin\enterprise_profile_welcome\images\enterprise_profile_welcome_illustration.svg" type="BINDATA" />
</if>
<if expr="not is_android">
<include name="IDR_IDENTITY_INTERNALS_HTML" file="resources\identity_internals\identity_internals.html" type="BINDATA" />
@@ -472,14 +418,7 @@
<include name="IDR_ADD_SUPERVISION_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\ui\webui\chromeos\add_supervision\add_supervision.mojom-lite.js" use_base_dir="false" type="BINDATA" />
</if>
<if expr="chromeos">
- <!-- OOBE / Login resources -->
<include name="IDR_ASSISTANT_LOGO_PNG" file="resources\chromeos\assistant_optin\assistant_logo.png" type="BINDATA" />
- <include name="IDR_SUPERVISION_ICON_PNG" file="resources\chromeos\supervision\supervision_icon.png" type="BINDATA" />
-
- <if expr="_google_chrome">
- <!-- ARC Apps dowloading animation. -->
- <include name="IDR_OOBE_ARC_APPS_DOWNLOADING_VIDEO" file="internal\resources\arc_support\videos\app_downloading.mp4" type="BINDATA" />
- </if>
</if>
<if expr="safe_browsing_mode == 1">
<include name="IDR_RESET_PASSWORD_HTML" file="resources\reset_password\reset_password.html" type="BINDATA" />
@@ -491,7 +430,6 @@
<include name="IDR_TAB_RANKER_PAIRWISE_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="resource_coordinator\tab_ranker\pairwise_preprocessor_config.pb" type="BINDATA" />
</if>
<if expr="chromeos">
- <include name="IDR_SMART_DIM_20181115_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="chromeos\power\ml\smart_dim\20181115_example_preprocessor_config.pb" type="BINDATA" />
<include name="IDR_SMART_DIM_20190521_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="chromeos\power\ml\smart_dim\20190521_example_preprocessor_config.pb" type="BINDATA" />
<include name="IDR_SEARCH_RANKER_20190923_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="ui\app_list\search\search_result_ranker\search_ranker_assets\20190923_example_preprocessor_config.pb" type="BINDATA" />
</if>
@@ -521,6 +459,7 @@
<include name="IDR_MACHINE_LEARNING_INTERNALS_TEST_MODEL_TAB_JS" file="resources\chromeos\machine_learning\test_model_tab.js" type="BINDATA" />
<include name="IDR_MACHINE_LEARNING_INTERNALS_TIME_MOJO_JS" file="${root_gen_dir}\mojo/public/mojom/base/time.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_MACHINE_LEARNING_INTERNALS_UTILS_JS" file="resources\chromeos\machine_learning\machine_learning_internals_utils.js" type="BINDATA" />
+ <include name="IDR_MACHINE_LEARNING_INTERNALS_WEB_PLATFORM_HANDWRITING_MOJO_JS" file="${root_gen_dir}\chromeos\services\machine_learning\public\mojom\web_platform_handwriting.mojom-lite.js" use_base_dir="false" type="BINDATA" />
</if>
<if expr="not is_android">
<!-- Chrome Cart -->
diff --git a/chromium/chrome/browser/buildflags.gni b/chromium/chrome/browser/buildflags.gni
index 603bee2f68c..90860b84886 100644
--- a/chromium/chrome/browser/buildflags.gni
+++ b/chromium/chrome/browser/buildflags.gni
@@ -3,6 +3,8 @@
# found in the LICENSE file.
import("//build/config/chrome_build.gni")
+import("//build/config/chromeos/ui_mode.gni")
+import("//chromecast/chromecast.gni")
declare_args() {
# Chromium Updater is a cross-platform updater for desktop clients built using
@@ -12,4 +14,10 @@ declare_args() {
# integration with the open source, cross-platform Chromium updater.
# TODO(crbug.com/1054060)
enable_chromium_updater = false
+
+ # TODO(stahon@microsoft.com) Remove this when app_session_service is enabled
+ # across the board. Until then, this buildflag allows some platforms to use
+ # app_session_service and some not.
+ enable_app_session_service =
+ !(is_chromeos_ash || is_chromeos_lacros || is_chromecast || is_android)
}
diff --git a/chromium/chrome/browser/cart/chrome_cart.mojom b/chromium/chrome/browser/cart/chrome_cart.mojom
index 2ea260fed82..c0c87aa1df6 100644
--- a/chromium/chrome/browser/cart/chrome_cart.mojom
+++ b/chromium/chrome/browser/cart/chrome_cart.mojom
@@ -14,6 +14,8 @@ struct MerchantCart {
url.mojom.Url cart_url;
// List of URLs for product image to show in the cart.
array<url.mojom.Url> product_image_urls;
+ // Text content of the discount on this cart (e.g. 15% off).
+ string discount_text;
};
// Browser-side handler for requests from JS.
@@ -37,9 +39,19 @@ interface CartHandler {
// and returns if the operation is successful.
RestoreRemovedCart(url.mojom.Url cart_url) => (bool success);
// Returns whether to show welcome surface in the module.
- GetWarmWelcomeVisible() => (bool visible);
+ GetWarmWelcomeVisible() => (bool welcome_visible);
// Logs that cart at position |index| has been clicked.
OnCartItemClicked(uint32 index);
// Logs the number of carts when module is created.
OnModuleCreated(uint32 count);
+ // Returns whether to show discount consent card in the module.
+ GetDiscountConsentCardVisible() => (bool consent_visible);
+ // Stores in profile prefs that user has acknowledged
+ // discount consent and whether user has opted-in or opted-out
+ // the feature.
+ OnDiscountConsentAcknowledged(bool accept);
+ // Returns whether the rule-based discount feature is enabled.
+ GetDiscountEnabled() => (bool enabled);
+ // Sets whether the rule-based discount feature is enabled.
+ SetDiscountEnabled(bool enabled);
};
diff --git a/chromium/chrome/browser/chrome_notification_types.h b/chromium/chrome/browser/chrome_notification_types.h
index b2ac11ae849..1b19a39de43 100644
--- a/chromium/chrome/browser/chrome_notification_types.h
+++ b/chromium/chrome/browser/chrome_notification_types.h
@@ -37,29 +37,6 @@ namespace chrome {
enum NotificationType {
NOTIFICATION_CHROME_START = PREVIOUS_END,
- // Browser-window ----------------------------------------------------------
-
- // This message is sent after a window has been opened. The source is a
- // Source<Browser> containing the affected Browser. No details are
- // expected.
- // DEPRECATED: Use BrowserListObserver::OnBrowserAdded()
- // TODO(https://crbug.com/1174776): Remove.
- NOTIFICATION_BROWSER_OPENED = NOTIFICATION_CHROME_START,
-
- // This message is sent when closing a browser has been cancelled, either by
- // the user cancelling a beforeunload dialog, or IsClosingPermitted()
- // disallowing closing. This notification implies that no BROWSER_CLOSING or
- // BROWSER_CLOSED notification will be sent.
- // The source is a Source<Browser> containing the affected browser. No details
- // are expected.
- // TODO(https://crbug.com/1174777): Remove.
- NOTIFICATION_BROWSER_CLOSE_CANCELLED,
-
- // The user has changed the browser theme. The source is a
- // Source<ThemeService>. There are no details.
- // TODO(https://crbug.com/1174780): Remove.
- NOTIFICATION_BROWSER_THEME_CHANGED,
-
// Application-wide ----------------------------------------------------------
// This message is sent when the application is terminating (the last
@@ -68,7 +45,7 @@ enum NotificationType {
// no BackgroundContents keeping the browser running). No source or details
// are passed.
// TODO(https://crbug.com/1174781): Remove.
- NOTIFICATION_APP_TERMINATING,
+ NOTIFICATION_APP_TERMINATING = NOTIFICATION_CHROME_START,
#if defined(OS_MAC)
// This notification is sent when the app has no key window, such as when
@@ -78,18 +55,6 @@ enum NotificationType {
NOTIFICATION_NO_KEY_WINDOW,
#endif
- // This is sent when the user has chosen to exit the app, but before any
- // browsers have closed. This is sent if the user chooses to exit (via exit
- // menu item or keyboard shortcut) or to restart the process (such as in flags
- // page), not if Chrome exits by some other means (such as the user closing
- // the last window). No source or details are passed.
- //
- // Note that receiving this notification does not necessarily mean the process
- // will exit because the shutdown process can be cancelled by an unload
- // handler. Use APP_TERMINATING for such needs.
- // TODO(https://crbug.com/1174784): Remove.
- NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
-
// Authentication ----------------------------------------------------------
// This is sent when a login prompt is shown. The source is the
@@ -142,11 +107,6 @@ enum NotificationType {
// Misc --------------------------------------------------------------------
#if BUILDFLAG(IS_CHROMEOS_ASH)
- // Sent immediately after the logged-in user's profile is ready.
- // The details are a Profile object.
- // TODO(https://crbug.com/1174789): Remove.
- NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
-
// Sent when a network error message is displayed on the WebUI login screen.
// First paint event of this fires NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE.
// TODO(https://crbug.com/1174791): Remove.
diff --git a/chromium/chrome/browser/chromeos/BUILD.gn b/chromium/chrome/browser/chromeos/BUILD.gn
index 8bd736fdb8b..8f3ddfecf93 100644
--- a/chromium/chrome/browser/chromeos/BUILD.gn
+++ b/chromium/chrome/browser/chromeos/BUILD.gn
@@ -69,13 +69,17 @@ source_set("chromeos") {
":screen_brightness_event_proto",
":user_activity_event_proto",
":user_charging_event_proto",
+ "../ash/guest_os:guest_os_diagnostics_mojom",
"crostini:crostini_installer_types_mojom",
"//apps",
"//ash",
"//ash/components/account_manager",
"//ash/components/audio",
"//ash/components/pcie_peripheral",
+ "//ash/components/resources:scanning_app_resources_grit",
"//ash/constants",
+ "//ash/content/scanning",
+ "//ash/content/scanning/mojom",
"//ash/public/cpp",
"//ash/public/cpp/external_arc",
"//ash/public/mojom",
@@ -89,15 +93,17 @@ source_set("chromeos") {
"//chrome/browser:theme_properties",
"//chrome/browser/apps/platform_apps",
"//chrome/browser/apps/platform_apps/api",
+ "//chrome/browser/ash/wilco_dtc_supportd:mojo_utils",
"//chrome/browser/browsing_data:constants",
"//chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_error_page",
- "//chrome/browser/chromeos/nearby:bluetooth_adapter_util",
+ "//chrome/browser/chromeos/nearby:bluetooth_adapter_manager",
"//chrome/browser/chromeos/power/ml/smart_dim",
- "//chrome/browser/chromeos/wilco_dtc_supportd:mojo_utils",
"//chrome/browser/devtools",
"//chrome/browser/extensions",
"//chrome/browser/image_decoder",
+ "//chrome/browser/nearby_sharing/common",
"//chrome/browser/nearby_sharing/logging",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/browser/resource_coordinator:tab_metrics_event_proto",
"//chrome/browser/resources/settings:resources_grit",
@@ -127,6 +133,7 @@ source_set("chromeos") {
"//chromeos/components/drivefs",
"//chromeos/components/drivefs/mojom",
"//chromeos/components/eche_app_ui",
+ "//chromeos/components/feature_usage",
"//chromeos/components/help_app_ui",
"//chromeos/components/local_search_service/public/cpp:cpp",
"//chromeos/components/media_app_ui",
@@ -134,6 +141,9 @@ source_set("chromeos") {
"//chromeos/components/multidevice",
"//chromeos/components/multidevice:stub_multidevice_util",
"//chromeos/components/multidevice/logging",
+ "//chromeos/components/personalization_app",
+ "//chromeos/components/personalization_app",
+ "//chromeos/components/personalization_app/mojom",
"//chromeos/components/phonehub",
"//chromeos/components/power",
"//chromeos/components/print_management",
@@ -141,8 +151,6 @@ source_set("chromeos") {
"//chromeos/components/proximity_auth",
"//chromeos/components/quick_answers/public/cpp:prefs",
"//chromeos/components/remote_apps/mojom",
- "//chromeos/components/scanning",
- "//chromeos/components/scanning/mojom",
"//chromeos/components/sensors",
"//chromeos/components/sensors:buildflags",
"//chromeos/components/sensors/mojom",
@@ -188,6 +196,7 @@ source_set("chromeos") {
"//chromeos/dbus/machine_learning",
"//chromeos/dbus/media_analytics",
"//chromeos/dbus/media_analytics:media_perception_proto",
+ "//chromeos/dbus/missive",
"//chromeos/dbus/pciguard",
"//chromeos/dbus/permission_broker",
"//chromeos/dbus/power",
@@ -203,6 +212,8 @@ source_set("chromeos") {
"//chromeos/dbus/u2f",
"//chromeos/dbus/u2f:u2f_proto",
"//chromeos/dbus/upstart",
+ "//chromeos/dbus/userdataauth",
+ "//chromeos/dbus/userdataauth:userdataauth_proto",
"//chromeos/disks",
"//chromeos/geolocation",
"//chromeos/ime:gencode",
@@ -216,8 +227,8 @@ source_set("chromeos") {
"//chromeos/resources:eche_bundle_resources_grit",
"//chromeos/resources:help_app_resources_grit",
"//chromeos/resources:media_app_resources_grit",
+ "//chromeos/resources:personalization_app_resources_grit",
"//chromeos/resources:print_management_resources_grit",
- "//chromeos/resources:scanning_app_resources_grit",
"//chromeos/services/assistant/public/cpp",
"//chromeos/services/cros_healthd/public/cpp",
"//chromeos/services/cros_healthd/public/mojom",
@@ -228,6 +239,7 @@ source_set("chromeos") {
"//chromeos/services/ime/public/cpp:buildflags",
"//chromeos/services/ime/public/mojom",
"//chromeos/services/machine_learning/public/cpp",
+ "//chromeos/services/machine_learning/public/cpp:stub",
"//chromeos/services/machine_learning/public/mojom",
"//chromeos/services/multidevice_setup",
"//chromeos/services/multidevice_setup/public/cpp",
@@ -263,6 +275,7 @@ source_set("chromeos") {
"//components/consent_auditor:consent_auditor",
"//components/constrained_window",
"//components/content_settings/core/browser",
+ "//components/country_codes",
"//components/crash/core/app",
"//components/crx_file",
"//components/device_event_log",
@@ -274,6 +287,7 @@ source_set("chromeos") {
"//components/exo",
"//components/favicon/core",
"//components/feedback",
+ "//components/feedback/content",
"//components/flags_ui",
"//components/full_restore",
"//components/gcm_driver",
@@ -307,8 +321,16 @@ source_set("chromeos") {
"//components/proxy_config",
"//components/quirks",
"//components/renderer_context_menu",
+ "//components/reporting/client:report_queue",
+ "//components/reporting/client:report_queue_configuration",
+ "//components/reporting/client:report_queue_provider",
+ "//components/reporting/proto:interface_proto",
+ "//components/reporting/storage:storage_module",
+ "//components/reporting/util:backoff_settings",
"//components/reporting/util:status",
+ "//components/reporting/util:status_proto",
"//components/reporting/util:task_runner_context",
+ "//components/reporting/util:test_callbacks_support",
"//components/rlz",
"//components/safe_browsing/core:csd_proto",
"//components/safe_browsing/core/db:metadata_proto",
@@ -319,6 +341,7 @@ source_set("chromeos") {
"//components/session_manager/core",
"//components/signin/public/identity_manager",
"//components/signin/public/webdata",
+ "//components/soda:constants",
"//components/spellcheck/browser:browser",
"//components/spellcheck/common:spellcheck_result",
"//components/storage_monitor",
@@ -546,8 +569,394 @@ source_set("chromeos") {
"../ash/app_mode/web_app/web_kiosk_app_launcher.h",
"../ash/app_mode/web_app/web_kiosk_app_manager.cc",
"../ash/app_mode/web_app/web_kiosk_app_manager.h",
+ "../ash/apps/apk_web_app_installer.cc",
+ "../ash/apps/apk_web_app_installer.h",
+ "../ash/apps/apk_web_app_service.cc",
+ "../ash/apps/apk_web_app_service.h",
+ "../ash/apps/apk_web_app_service_factory.cc",
+ "../ash/apps/apk_web_app_service_factory.h",
+ "../ash/apps/intent_helper/ash_intent_picker_helpers.cc",
+ "../ash/apps/intent_helper/ash_intent_picker_helpers.h",
+ "../ash/apps/intent_helper/common_apps_navigation_throttle.cc",
+ "../ash/apps/intent_helper/common_apps_navigation_throttle.h",
+ "../ash/apps/metrics/intent_handling_metrics.cc",
+ "../ash/apps/metrics/intent_handling_metrics.h",
+ "../ash/arc/accessibility/accessibility_info_data_wrapper.cc",
+ "../ash/arc/accessibility/accessibility_info_data_wrapper.h",
+ "../ash/arc/accessibility/accessibility_node_info_data_wrapper.cc",
+ "../ash/arc/accessibility/accessibility_node_info_data_wrapper.h",
+ "../ash/arc/accessibility/accessibility_window_info_data_wrapper.cc",
+ "../ash/arc/accessibility/accessibility_window_info_data_wrapper.h",
+ "../ash/arc/accessibility/arc_accessibility_helper_bridge.cc",
+ "../ash/arc/accessibility/arc_accessibility_helper_bridge.h",
+ "../ash/arc/accessibility/arc_accessibility_util.cc",
+ "../ash/arc/accessibility/arc_accessibility_util.h",
+ "../ash/arc/accessibility/auto_complete_handler.cc",
+ "../ash/arc/accessibility/auto_complete_handler.h",
+ "../ash/arc/accessibility/ax_tree_source_arc.cc",
+ "../ash/arc/accessibility/ax_tree_source_arc.h",
+ "../ash/arc/accessibility/drawer_layout_handler.cc",
+ "../ash/arc/accessibility/drawer_layout_handler.h",
+ "../ash/arc/accessibility/geometry_util.cc",
+ "../ash/arc/accessibility/geometry_util.h",
+ "../ash/arc/adbd/arc_adbd_monitor_bridge.cc",
+ "../ash/arc/adbd/arc_adbd_monitor_bridge.h",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_menu_builder.cc",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_menu_builder.h",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_request.cc",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_request.h",
+ "../ash/arc/arc_demo_mode_delegate_impl.cc",
+ "../ash/arc/arc_demo_mode_delegate_impl.h",
+ "../ash/arc/arc_migration_constants.h",
+ "../ash/arc/arc_migration_guide_notification.cc",
+ "../ash/arc/arc_migration_guide_notification.h",
+ "../ash/arc/arc_optin_uma.cc",
+ "../ash/arc/arc_optin_uma.h",
+ "../ash/arc/arc_support_host.cc",
+ "../ash/arc/arc_support_host.h",
+ "../ash/arc/arc_ui_availability_reporter.cc",
+ "../ash/arc/arc_ui_availability_reporter.h",
+ "../ash/arc/arc_util.cc",
+ "../ash/arc/arc_util.h",
+ "../ash/arc/arc_web_contents_data.cc",
+ "../ash/arc/arc_web_contents_data.h",
+ "../ash/arc/auth/arc_active_directory_enrollment_token_fetcher.cc",
+ "../ash/arc/auth/arc_active_directory_enrollment_token_fetcher.h",
+ "../ash/arc/auth/arc_auth_code_fetcher.h",
+ "../ash/arc/auth/arc_auth_context.cc",
+ "../ash/arc/auth/arc_auth_context.h",
+ "../ash/arc/auth/arc_auth_service.cc",
+ "../ash/arc/auth/arc_auth_service.h",
+ "../ash/arc/auth/arc_background_auth_code_fetcher.cc",
+ "../ash/arc/auth/arc_background_auth_code_fetcher.h",
+ "../ash/arc/auth/arc_fetcher_base.cc",
+ "../ash/arc/auth/arc_fetcher_base.h",
+ "../ash/arc/auth/arc_robot_auth_code_fetcher.cc",
+ "../ash/arc/auth/arc_robot_auth_code_fetcher.h",
+ "../ash/arc/bluetooth/arc_bluetooth_bridge.cc",
+ "../ash/arc/bluetooth/arc_bluetooth_bridge.h",
+ "../ash/arc/bluetooth/arc_bluetooth_task_queue.cc",
+ "../ash/arc/bluetooth/arc_bluetooth_task_queue.h",
+ "../ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.cc",
+ "../ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h",
+ "../ash/arc/cast_receiver/arc_cast_receiver_service.cc",
+ "../ash/arc/cast_receiver/arc_cast_receiver_service.h",
+ "../ash/arc/enterprise/arc_data_snapshotd_delegate.cc",
+ "../ash/arc/enterprise/arc_data_snapshotd_delegate.h",
+ "../ash/arc/enterprise/arc_enterprise_reporting_service.cc",
+ "../ash/arc/enterprise/arc_enterprise_reporting_service.h",
+ "../ash/arc/enterprise/arc_force_installed_apps_tracker.cc",
+ "../ash/arc/enterprise/arc_force_installed_apps_tracker.h",
+ "../ash/arc/enterprise/arc_snapshot_reboot_notification_impl.cc",
+ "../ash/arc/enterprise/arc_snapshot_reboot_notification_impl.h",
+ "../ash/arc/enterprise/cert_store/arc_cert_installer.cc",
+ "../ash/arc/enterprise/cert_store/arc_cert_installer.h",
+ "../ash/arc/enterprise/cert_store/arc_cert_installer_utils.cc",
+ "../ash/arc/enterprise/cert_store/arc_cert_installer_utils.h",
+ "../ash/arc/enterprise/cert_store/cert_store_service.cc",
+ "../ash/arc/enterprise/cert_store/cert_store_service.h",
+ "../ash/arc/extensions/arc_support_message_host.cc",
+ "../ash/arc/extensions/arc_support_message_host.h",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_service.cc",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_service.h",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_util.cc",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_util.h",
+ "../ash/arc/file_system_watcher/file_system_scanner.cc",
+ "../ash/arc/file_system_watcher/file_system_scanner.h",
+ "../ash/arc/fileapi/arc_content_file_system_async_file_util.cc",
+ "../ash/arc/fileapi/arc_content_file_system_async_file_util.h",
+ "../ash/arc/fileapi/arc_content_file_system_backend_delegate.cc",
+ "../ash/arc/fileapi/arc_content_file_system_backend_delegate.h",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_reader.cc",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_reader.h",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_writer.cc",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_writer.h",
+ "../ash/arc/fileapi/arc_content_file_system_size_util.cc",
+ "../ash/arc/fileapi/arc_content_file_system_size_util.h",
+ "../ash/arc/fileapi/arc_content_file_system_url_util.cc",
+ "../ash/arc/fileapi/arc_content_file_system_url_util.h",
+ "../ash/arc/fileapi/arc_documents_provider_async_file_util.cc",
+ "../ash/arc/fileapi/arc_documents_provider_async_file_util.h",
+ "../ash/arc/fileapi/arc_documents_provider_backend_delegate.cc",
+ "../ash/arc/fileapi/arc_documents_provider_backend_delegate.h",
+ "../ash/arc/fileapi/arc_documents_provider_file_stream_reader.cc",
+ "../ash/arc/fileapi/arc_documents_provider_file_stream_reader.h",
+ "../ash/arc/fileapi/arc_documents_provider_file_stream_writer.cc",
+ "../ash/arc/fileapi/arc_documents_provider_file_stream_writer.h",
+ "../ash/arc/fileapi/arc_documents_provider_file_system_url_util.cc",
+ "../ash/arc/fileapi/arc_documents_provider_file_system_url_util.h",
+ "../ash/arc/fileapi/arc_documents_provider_root.cc",
+ "../ash/arc/fileapi/arc_documents_provider_root.h",
+ "../ash/arc/fileapi/arc_documents_provider_root_map.cc",
+ "../ash/arc/fileapi/arc_documents_provider_root_map.h",
+ "../ash/arc/fileapi/arc_documents_provider_root_map_factory.cc",
+ "../ash/arc/fileapi/arc_documents_provider_root_map_factory.h",
+ "../ash/arc/fileapi/arc_documents_provider_util.cc",
+ "../ash/arc/fileapi/arc_documents_provider_util.h",
+ "../ash/arc/fileapi/arc_documents_provider_watcher_manager.cc",
+ "../ash/arc/fileapi/arc_documents_provider_watcher_manager.h",
+ "../ash/arc/fileapi/arc_file_system_bridge.cc",
+ "../ash/arc/fileapi/arc_file_system_bridge.h",
+ "../ash/arc/fileapi/arc_file_system_mounter.cc",
+ "../ash/arc/fileapi/arc_file_system_mounter.h",
+ "../ash/arc/fileapi/arc_file_system_operation_runner.cc",
+ "../ash/arc/fileapi/arc_file_system_operation_runner.h",
+ "../ash/arc/fileapi/arc_file_system_operation_runner_util.cc",
+ "../ash/arc/fileapi/arc_file_system_operation_runner_util.h",
+ "../ash/arc/fileapi/arc_media_view_util.cc",
+ "../ash/arc/fileapi/arc_media_view_util.h",
+ "../ash/arc/fileapi/arc_select_files_handler.cc",
+ "../ash/arc/fileapi/arc_select_files_handler.h",
+ "../ash/arc/fileapi/arc_select_files_util.cc",
+ "../ash/arc/fileapi/arc_select_files_util.h",
+ "../ash/arc/fileapi/chrome_content_provider_url_util.cc",
+ "../ash/arc/fileapi/chrome_content_provider_url_util.h",
+ "../ash/arc/fileapi/file_stream_forwarder.cc",
+ "../ash/arc/fileapi/file_stream_forwarder.h",
+ "../ash/arc/icon_decode_request.cc",
+ "../ash/arc/icon_decode_request.h",
+ "../ash/arc/input_method_manager/arc_input_method_manager_bridge.h",
+ "../ash/arc/input_method_manager/arc_input_method_manager_bridge_impl.cc",
+ "../ash/arc/input_method_manager/arc_input_method_manager_bridge_impl.h",
+ "../ash/arc/input_method_manager/arc_input_method_manager_service.cc",
+ "../ash/arc/input_method_manager/arc_input_method_manager_service.h",
+ "../ash/arc/input_method_manager/arc_input_method_state.cc",
+ "../ash/arc/input_method_manager/arc_input_method_state.h",
+ "../ash/arc/input_method_manager/input_connection_impl.cc",
+ "../ash/arc/input_method_manager/input_connection_impl.h",
+ "../ash/arc/input_method_manager/input_method_prefs.cc",
+ "../ash/arc/input_method_manager/input_method_prefs.h",
+ "../ash/arc/instance_throttle/arc_active_window_throttle_observer.cc",
+ "../ash/arc/instance_throttle/arc_active_window_throttle_observer.h",
+ "../ash/arc/instance_throttle/arc_app_launch_throttle_observer.cc",
+ "../ash/arc/instance_throttle/arc_app_launch_throttle_observer.h",
+ "../ash/arc/instance_throttle/arc_boot_phase_throttle_observer.cc",
+ "../ash/arc/instance_throttle/arc_boot_phase_throttle_observer.h",
+ "../ash/arc/instance_throttle/arc_instance_throttle.cc",
+ "../ash/arc/instance_throttle/arc_instance_throttle.h",
+ "../ash/arc/instance_throttle/arc_pip_window_throttle_observer.cc",
+ "../ash/arc/instance_throttle/arc_pip_window_throttle_observer.h",
+ "../ash/arc/intent_helper/arc_external_protocol_dialog.cc",
+ "../ash/arc/intent_helper/arc_external_protocol_dialog.h",
+ "../ash/arc/intent_helper/arc_settings_service.cc",
+ "../ash/arc/intent_helper/arc_settings_service.h",
+ "../ash/arc/intent_helper/custom_tab_session_impl.cc",
+ "../ash/arc/intent_helper/custom_tab_session_impl.h",
+ "../ash/arc/intent_helper/factory_reset_delegate.cc",
+ "../ash/arc/intent_helper/factory_reset_delegate.h",
+ "../ash/arc/intent_helper/open_with_menu.cc",
+ "../ash/arc/intent_helper/open_with_menu.h",
+ "../ash/arc/intent_helper/start_smart_selection_action_menu.cc",
+ "../ash/arc/intent_helper/start_smart_selection_action_menu.h",
+ "../ash/arc/keymaster/arc_keymaster_bridge.cc",
+ "../ash/arc/keymaster/arc_keymaster_bridge.h",
+ "../ash/arc/keymaster/cert_store_bridge.cc",
+ "../ash/arc/keymaster/cert_store_bridge.h",
+ "../ash/arc/kiosk/arc_kiosk_bridge.cc",
+ "../ash/arc/kiosk/arc_kiosk_bridge.h",
+ "../ash/arc/metrics/arc_metrics_service_proxy.cc",
+ "../ash/arc/metrics/arc_metrics_service_proxy.h",
+ "../ash/arc/notification/arc_boot_error_notification.cc",
+ "../ash/arc/notification/arc_boot_error_notification.h",
+ "../ash/arc/notification/arc_provision_notification_service.cc",
+ "../ash/arc/notification/arc_provision_notification_service.h",
+ "../ash/arc/notification/arc_supervision_transition_notification.cc",
+ "../ash/arc/notification/arc_supervision_transition_notification.h",
+ "../ash/arc/oemcrypto/arc_oemcrypto_bridge.cc",
+ "../ash/arc/oemcrypto/arc_oemcrypto_bridge.h",
+ "../ash/arc/optin/arc_optin_preference_handler.cc",
+ "../ash/arc/optin/arc_optin_preference_handler.h",
+ "../ash/arc/optin/arc_optin_preference_handler_observer.h",
+ "../ash/arc/optin/arc_terms_of_service_default_negotiator.cc",
+ "../ash/arc/optin/arc_terms_of_service_default_negotiator.h",
+ "../ash/arc/optin/arc_terms_of_service_negotiator.cc",
+ "../ash/arc/optin/arc_terms_of_service_negotiator.h",
+ "../ash/arc/optin/arc_terms_of_service_oobe_negotiator.cc",
+ "../ash/arc/optin/arc_terms_of_service_oobe_negotiator.h",
+ "../ash/arc/pip/arc_picture_in_picture_window_controller_impl.cc",
+ "../ash/arc/pip/arc_picture_in_picture_window_controller_impl.h",
+ "../ash/arc/pip/arc_pip_bridge.cc",
+ "../ash/arc/pip/arc_pip_bridge.h",
+ "../ash/arc/policy/arc_android_management_checker.cc",
+ "../ash/arc/policy/arc_android_management_checker.h",
+ "../ash/arc/policy/arc_policy_bridge.cc",
+ "../ash/arc/policy/arc_policy_bridge.h",
+ "../ash/arc/policy/arc_policy_util.cc",
+ "../ash/arc/policy/arc_policy_util.h",
+ "../ash/arc/print_spooler/arc_print_spooler_bridge.cc",
+ "../ash/arc/print_spooler/arc_print_spooler_bridge.h",
+ "../ash/arc/print_spooler/arc_print_spooler_util.cc",
+ "../ash/arc/print_spooler/arc_print_spooler_util.h",
+ "../ash/arc/print_spooler/print_session_impl.cc",
+ "../ash/arc/print_spooler/print_session_impl.h",
+ "../ash/arc/process/arc_process.cc",
+ "../ash/arc/process/arc_process.h",
+ "../ash/arc/process/arc_process_service.cc",
+ "../ash/arc/process/arc_process_service.h",
+ "../ash/arc/screen_capture/arc_screen_capture_bridge.cc",
+ "../ash/arc/screen_capture/arc_screen_capture_bridge.h",
+ "../ash/arc/screen_capture/arc_screen_capture_session.cc",
+ "../ash/arc/screen_capture/arc_screen_capture_session.h",
+ "../ash/arc/session/adb_sideloading_availability_delegate_impl.cc",
+ "../ash/arc/session/adb_sideloading_availability_delegate_impl.h",
+ "../ash/arc/session/arc_app_id_provider_impl.cc",
+ "../ash/arc/session/arc_app_id_provider_impl.h",
+ "../ash/arc/session/arc_demo_mode_preference_handler.cc",
+ "../ash/arc/session/arc_demo_mode_preference_handler.h",
+ "../ash/arc/session/arc_play_store_enabled_preference_handler.cc",
+ "../ash/arc/session/arc_play_store_enabled_preference_handler.h",
+ "../ash/arc/session/arc_provisioning_result.cc",
+ "../ash/arc/session/arc_provisioning_result.h",
+ "../ash/arc/session/arc_service_launcher.cc",
+ "../ash/arc/session/arc_service_launcher.h",
+ "../ash/arc/session/arc_session_manager.cc",
+ "../ash/arc/session/arc_session_manager.h",
+ "../ash/arc/session/arc_session_manager_observer.h",
+ "../ash/arc/sharesheet/arc_sharesheet_bridge.cc",
+ "../ash/arc/sharesheet/arc_sharesheet_bridge.h",
+ "../ash/arc/tracing/arc_app_performance_tracing.cc",
+ "../ash/arc/tracing/arc_app_performance_tracing.h",
+ "../ash/arc/tracing/arc_app_performance_tracing_custom_session.cc",
+ "../ash/arc/tracing/arc_app_performance_tracing_custom_session.h",
+ "../ash/arc/tracing/arc_app_performance_tracing_session.cc",
+ "../ash/arc/tracing/arc_app_performance_tracing_session.h",
+ "../ash/arc/tracing/arc_app_performance_tracing_uma_session.cc",
+ "../ash/arc/tracing/arc_app_performance_tracing_uma_session.h",
+ "../ash/arc/tracing/arc_cpu_event.cc",
+ "../ash/arc/tracing/arc_cpu_event.h",
+ "../ash/arc/tracing/arc_graphics_jank_detector.cc",
+ "../ash/arc/tracing/arc_graphics_jank_detector.h",
+ "../ash/arc/tracing/arc_system_model.cc",
+ "../ash/arc/tracing/arc_system_model.h",
+ "../ash/arc/tracing/arc_system_stat_collector.cc",
+ "../ash/arc/tracing/arc_system_stat_collector.h",
+ "../ash/arc/tracing/arc_tracing_bridge.cc",
+ "../ash/arc/tracing/arc_tracing_bridge.h",
+ "../ash/arc/tracing/arc_tracing_event.cc",
+ "../ash/arc/tracing/arc_tracing_event.h",
+ "../ash/arc/tracing/arc_tracing_event_matcher.cc",
+ "../ash/arc/tracing/arc_tracing_event_matcher.h",
+ "../ash/arc/tracing/arc_tracing_graphics_model.cc",
+ "../ash/arc/tracing/arc_tracing_graphics_model.h",
+ "../ash/arc/tracing/arc_tracing_model.cc",
+ "../ash/arc/tracing/arc_tracing_model.h",
+ "../ash/arc/tracing/arc_value_event.cc",
+ "../ash/arc/tracing/arc_value_event.h",
+ "../ash/arc/tracing/arc_value_event_trimmer.cc",
+ "../ash/arc/tracing/arc_value_event_trimmer.h",
+ "../ash/arc/tts/arc_tts_service.cc",
+ "../ash/arc/tts/arc_tts_service.h",
+ "../ash/arc/usb/arc_usb_host_bridge_delegate.cc",
+ "../ash/arc/usb/arc_usb_host_bridge_delegate.h",
+ "../ash/arc/user_session/arc_user_session_service.cc",
+ "../ash/arc/user_session/arc_user_session_service.h",
+ "../ash/arc/video/gpu_arc_video_service_host.cc",
+ "../ash/arc/video/gpu_arc_video_service_host.h",
+ "../ash/arc/wallpaper/arc_wallpaper_service.cc",
+ "../ash/arc/wallpaper/arc_wallpaper_service.h",
"../ash/assistant/assistant_util.cc",
"../ash/assistant/assistant_util.h",
+ "../ash/attestation/attestation_ca_client.cc",
+ "../ash/attestation/attestation_ca_client.h",
+ "../ash/attestation/attestation_policy_observer.cc",
+ "../ash/attestation/attestation_policy_observer.h",
+ "../ash/attestation/enrollment_certificate_uploader.h",
+ "../ash/attestation/enrollment_certificate_uploader_impl.cc",
+ "../ash/attestation/enrollment_certificate_uploader_impl.h",
+ "../ash/attestation/enrollment_policy_observer.cc",
+ "../ash/attestation/enrollment_policy_observer.h",
+ "../ash/attestation/machine_certificate_uploader.h",
+ "../ash/attestation/machine_certificate_uploader_impl.cc",
+ "../ash/attestation/machine_certificate_uploader_impl.h",
+ "../ash/attestation/platform_verification_dialog.cc",
+ "../ash/attestation/platform_verification_dialog.h",
+ "../ash/attestation/platform_verification_flow.cc",
+ "../ash/attestation/platform_verification_flow.h",
+ "../ash/attestation/tpm_challenge_key.cc",
+ "../ash/attestation/tpm_challenge_key.h",
+ "../ash/attestation/tpm_challenge_key_result.cc",
+ "../ash/attestation/tpm_challenge_key_result.h",
+ "../ash/attestation/tpm_challenge_key_subtle.cc",
+ "../ash/attestation/tpm_challenge_key_subtle.h",
+ "../ash/attestation/tpm_challenge_key_with_timeout.cc",
+ "../ash/attestation/tpm_challenge_key_with_timeout.h",
+ "../ash/authpolicy/authpolicy_credentials_manager.cc",
+ "../ash/authpolicy/authpolicy_credentials_manager.h",
+ "../ash/authpolicy/authpolicy_helper.cc",
+ "../ash/authpolicy/authpolicy_helper.h",
+ "../ash/authpolicy/data_pipe_utils.cc",
+ "../ash/authpolicy/data_pipe_utils.h",
+ "../ash/authpolicy/kerberos_files_handler.cc",
+ "../ash/authpolicy/kerberos_files_handler.h",
+ "../ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc",
+ "../ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h",
+ "../ash/base/file_flusher.cc",
+ "../ash/base/file_flusher.h",
+ "../ash/base/locale_util.cc",
+ "../ash/base/locale_util.h",
+ "../ash/bluetooth/debug_logs_manager.cc",
+ "../ash/bluetooth/debug_logs_manager.h",
+ "../ash/bluetooth/debug_logs_manager_factory.cc",
+ "../ash/bluetooth/debug_logs_manager_factory.h",
+ "../ash/borealis/borealis_app_launcher.cc",
+ "../ash/borealis/borealis_app_launcher.h",
+ "../ash/borealis/borealis_app_uninstaller.cc",
+ "../ash/borealis/borealis_app_uninstaller.h",
+ "../ash/borealis/borealis_context.cc",
+ "../ash/borealis/borealis_context.h",
+ "../ash/borealis/borealis_context_manager.h",
+ "../ash/borealis/borealis_context_manager_impl.cc",
+ "../ash/borealis/borealis_context_manager_impl.h",
+ "../ash/borealis/borealis_features.cc",
+ "../ash/borealis/borealis_features.h",
+ "../ash/borealis/borealis_game_mode_controller.cc",
+ "../ash/borealis/borealis_game_mode_controller.h",
+ "../ash/borealis/borealis_installer.cc",
+ "../ash/borealis/borealis_installer.h",
+ "../ash/borealis/borealis_installer_impl.cc",
+ "../ash/borealis/borealis_installer_impl.h",
+ "../ash/borealis/borealis_launch_watcher.cc",
+ "../ash/borealis/borealis_launch_watcher.h",
+ "../ash/borealis/borealis_metrics.cc",
+ "../ash/borealis/borealis_metrics.h",
+ "../ash/borealis/borealis_prefs.cc",
+ "../ash/borealis/borealis_prefs.h",
+ "../ash/borealis/borealis_service.cc",
+ "../ash/borealis/borealis_service.h",
+ "../ash/borealis/borealis_service_factory.cc",
+ "../ash/borealis/borealis_service_factory.h",
+ "../ash/borealis/borealis_service_impl.cc",
+ "../ash/borealis/borealis_service_impl.h",
+ "../ash/borealis/borealis_shutdown_monitor.cc",
+ "../ash/borealis/borealis_shutdown_monitor.h",
+ "../ash/borealis/borealis_task.cc",
+ "../ash/borealis/borealis_task.h",
+ "../ash/borealis/borealis_util.cc",
+ "../ash/borealis/borealis_util.h",
+ "../ash/borealis/borealis_window_manager.cc",
+ "../ash/borealis/borealis_window_manager.h",
+ "../ash/borealis/infra/described.h",
+ "../ash/borealis/infra/expected.h",
+ "../ash/borealis/infra/state_manager.h",
+ "../ash/borealis/infra/transition.h",
+ "../ash/camera_mic/vm_camera_mic_manager.cc",
+ "../ash/camera_mic/vm_camera_mic_manager.h",
+ "../ash/cert_provisioning/cert_provisioning_common.cc",
+ "../ash/cert_provisioning/cert_provisioning_common.h",
+ "../ash/cert_provisioning/cert_provisioning_invalidator.cc",
+ "../ash/cert_provisioning/cert_provisioning_invalidator.h",
+ "../ash/cert_provisioning/cert_provisioning_metrics.cc",
+ "../ash/cert_provisioning/cert_provisioning_metrics.h",
+ "../ash/cert_provisioning/cert_provisioning_platform_keys_helpers.cc",
+ "../ash/cert_provisioning/cert_provisioning_platform_keys_helpers.h",
+ "../ash/cert_provisioning/cert_provisioning_scheduler.cc",
+ "../ash/cert_provisioning/cert_provisioning_scheduler.h",
+ "../ash/cert_provisioning/cert_provisioning_scheduler_user_service.cc",
+ "../ash/cert_provisioning/cert_provisioning_scheduler_user_service.h",
+ "../ash/cert_provisioning/cert_provisioning_serializer.cc",
+ "../ash/cert_provisioning/cert_provisioning_serializer.h",
+ "../ash/cert_provisioning/cert_provisioning_worker.cc",
+ "../ash/cert_provisioning/cert_provisioning_worker.h",
"../ash/certificate_provider/certificate_info.cc",
"../ash/certificate_provider/certificate_info.h",
"../ash/certificate_provider/certificate_provider.h",
@@ -566,16 +975,134 @@ source_set("chromeos") {
"../ash/certificate_provider/sign_requests.h",
"../ash/certificate_provider/thread_safe_certificate_map.cc",
"../ash/certificate_provider/thread_safe_certificate_map.h",
+ "../ash/child_accounts/parent_access_code/authenticator.cc",
+ "../ash/child_accounts/parent_access_code/authenticator.h",
+ "../ash/child_accounts/parent_access_code/config_source.cc",
+ "../ash/child_accounts/parent_access_code/config_source.h",
+ "../ash/child_accounts/parent_access_code/parent_access_service.cc",
+ "../ash/child_accounts/parent_access_code/parent_access_service.h",
+ "../ash/crosapi/automation_ash.cc",
+ "../ash/crosapi/automation_ash.h",
+ "../ash/crosapi/browser_data_migrator.cc",
+ "../ash/crosapi/browser_data_migrator.h",
+ "../ash/crosapi/browser_loader.cc",
+ "../ash/crosapi/browser_loader.h",
+ "../ash/crosapi/browser_manager.cc",
+ "../ash/crosapi/browser_manager.h",
+ "../ash/crosapi/browser_manager_observer.h",
+ "../ash/crosapi/browser_service_host_ash.cc",
+ "../ash/crosapi/browser_service_host_ash.h",
+ "../ash/crosapi/browser_service_host_observer.h",
+ "../ash/crosapi/browser_util.cc",
+ "../ash/crosapi/browser_util.h",
+ "../ash/crosapi/cert_database_ash.cc",
+ "../ash/crosapi/cert_database_ash.h",
+ "../ash/crosapi/clipboard_ash.cc",
+ "../ash/crosapi/clipboard_ash.h",
+ "../ash/crosapi/crosapi_ash.cc",
+ "../ash/crosapi/crosapi_ash.h",
+ "../ash/crosapi/crosapi_id.h",
+ "../ash/crosapi/crosapi_manager.cc",
+ "../ash/crosapi/crosapi_manager.h",
+ "../ash/crosapi/device_attributes_ash.cc",
+ "../ash/crosapi/device_attributes_ash.h",
+ "../ash/crosapi/environment_provider.cc",
+ "../ash/crosapi/environment_provider.h",
+ "../ash/crosapi/fake_browser_manager.cc",
+ "../ash/crosapi/fake_browser_manager.h",
+ "../ash/crosapi/feedback_ash.cc",
+ "../ash/crosapi/feedback_ash.h",
+ "../ash/crosapi/file_manager_ash.cc",
+ "../ash/crosapi/file_manager_ash.h",
+ "../ash/crosapi/idle_service_ash.cc",
+ "../ash/crosapi/idle_service_ash.h",
+ "../ash/crosapi/keystore_service_ash.cc",
+ "../ash/crosapi/keystore_service_ash.h",
+ "../ash/crosapi/message_center_ash.cc",
+ "../ash/crosapi/message_center_ash.h",
+ "../ash/crosapi/metrics_reporting_ash.cc",
+ "../ash/crosapi/metrics_reporting_ash.h",
+ "../ash/crosapi/prefs_ash.cc",
+ "../ash/crosapi/prefs_ash.h",
+ "../ash/crosapi/screen_manager_ash.cc",
+ "../ash/crosapi/screen_manager_ash.h",
+ "../ash/crosapi/select_file_ash.cc",
+ "../ash/crosapi/select_file_ash.h",
+ "../ash/crosapi/task_manager_ash.cc",
+ "../ash/crosapi/task_manager_ash.h",
+ "../ash/crosapi/test_controller_ash.cc",
+ "../ash/crosapi/test_controller_ash.h",
+ "../ash/crosapi/test_mojo_connection_manager.cc",
+ "../ash/crosapi/test_mojo_connection_manager.h",
+ "../ash/crosapi/url_handler_ash.cc",
+ "../ash/crosapi/url_handler_ash.h",
+ "../ash/crosapi/video_capture_device_ash.cc",
+ "../ash/crosapi/video_capture_device_ash.h",
+ "../ash/crosapi/video_capture_device_factory_ash.cc",
+ "../ash/crosapi/video_capture_device_factory_ash.h",
+ "../ash/crosapi/video_frame_handler_ash.cc",
+ "../ash/crosapi/video_frame_handler_ash.h",
+ "../ash/crosapi/window_util.cc",
+ "../ash/crosapi/window_util.h",
+ "../ash/drive/drive_integration_service.cc",
+ "../ash/drive/drive_integration_service.h",
+ "../ash/drive/drivefs_native_message_host.cc",
+ "../ash/drive/drivefs_native_message_host.h",
+ "../ash/drive/file_system_util.cc",
+ "../ash/drive/file_system_util.h",
+ "../ash/drive/fileapi/drivefs_async_file_util.cc",
+ "../ash/drive/fileapi/drivefs_async_file_util.h",
+ "../ash/drive/fileapi/drivefs_file_system_backend_delegate.cc",
+ "../ash/drive/fileapi/drivefs_file_system_backend_delegate.h",
+ "../ash/guest_os/guest_os_diagnostics_builder.cc",
+ "../ash/guest_os/guest_os_diagnostics_builder.h",
+ "../ash/guest_os/guest_os_external_protocol_handler.cc",
+ "../ash/guest_os/guest_os_external_protocol_handler.h",
+ "../ash/guest_os/guest_os_pref_names.cc",
+ "../ash/guest_os/guest_os_pref_names.h",
+ "../ash/guest_os/guest_os_registry_service.cc",
+ "../ash/guest_os/guest_os_registry_service.h",
+ "../ash/guest_os/guest_os_registry_service_factory.cc",
+ "../ash/guest_os/guest_os_registry_service_factory.h",
+ "../ash/guest_os/guest_os_share_path.cc",
+ "../ash/guest_os/guest_os_share_path.h",
+ "../ash/guest_os/guest_os_share_path_factory.cc",
+ "../ash/guest_os/guest_os_share_path_factory.h",
+ "../ash/guest_os/guest_os_stability_monitor.cc",
+ "../ash/guest_os/guest_os_stability_monitor.h",
+ "../ash/guest_os/virtual_machines/virtual_machines_util.cc",
+ "../ash/guest_os/virtual_machines/virtual_machines_util.h",
+ "../ash/lock_screen_apps/app_manager.h",
+ "../ash/lock_screen_apps/app_manager_impl.cc",
+ "../ash/lock_screen_apps/app_manager_impl.h",
+ "../ash/lock_screen_apps/app_window_metrics_tracker.cc",
+ "../ash/lock_screen_apps/app_window_metrics_tracker.h",
+ "../ash/lock_screen_apps/first_app_run_toast_manager.cc",
+ "../ash/lock_screen_apps/first_app_run_toast_manager.h",
+ "../ash/lock_screen_apps/focus_cycler_delegate.h",
+ "../ash/lock_screen_apps/lock_screen_profile_creator.cc",
+ "../ash/lock_screen_apps/lock_screen_profile_creator.h",
+ "../ash/lock_screen_apps/lock_screen_profile_creator_impl.cc",
+ "../ash/lock_screen_apps/lock_screen_profile_creator_impl.h",
+ "../ash/lock_screen_apps/state_controller.cc",
+ "../ash/lock_screen_apps/state_controller.h",
+ "../ash/lock_screen_apps/state_observer.h",
+ "../ash/lock_screen_apps/toast_dialog_view.cc",
+ "../ash/lock_screen_apps/toast_dialog_view.h",
"../ash/login/app_mode/kiosk_launch_controller.cc",
"../ash/login/app_mode/kiosk_launch_controller.h",
- "../ash/login/auth/auth_prewarmer.cc",
- "../ash/login/auth/auth_prewarmer.h",
"../ash/login/auth/chrome_cryptohome_authenticator.cc",
"../ash/login/auth/chrome_cryptohome_authenticator.h",
"../ash/login/auth/chrome_login_performer.cc",
"../ash/login/auth/chrome_login_performer.h",
- "../ash/login/demo_mode/demo_app_launcher.cc",
- "../ash/login/demo_mode/demo_app_launcher.h",
+ "../ash/login/auth/chrome_safe_mode_delegate.cc",
+ "../ash/login/auth/chrome_safe_mode_delegate.h",
+ "../ash/login/challenge_response_auth_keys_loader.cc",
+ "../ash/login/challenge_response_auth_keys_loader.h",
+ "../ash/login/chrome_restart_request.cc",
+ "../ash/login/chrome_restart_request.h",
+ "../ash/login/configuration_keys.cc",
+ "../ash/login/configuration_keys.h",
"../ash/login/demo_mode/demo_extensions_external_loader.cc",
"../ash/login/demo_mode/demo_extensions_external_loader.h",
"../ash/login/demo_mode/demo_mode_detector.cc",
@@ -642,10 +1169,45 @@ source_set("chromeos") {
"../ash/login/enrollment/enterprise_enrollment_helper.h",
"../ash/login/enrollment/enterprise_enrollment_helper_impl.cc",
"../ash/login/enrollment/enterprise_enrollment_helper_impl.h",
+ "../ash/login/enterprise_user_session_metrics.cc",
+ "../ash/login/enterprise_user_session_metrics.h",
+ "../ash/login/error_screens_histogram_helper.cc",
+ "../ash/login/error_screens_histogram_helper.h",
+ "../ash/login/existing_user_controller.cc",
+ "../ash/login/existing_user_controller.h",
+ "../ash/login/help_app_launcher.cc",
+ "../ash/login/help_app_launcher.h",
+ "../ash/login/helper.cc",
+ "../ash/login/helper.h",
+ "../ash/login/hwid_checker.cc",
+ "../ash/login/hwid_checker.h",
"../ash/login/lock/screen_locker.cc",
"../ash/login/lock/screen_locker.h",
"../ash/login/lock/views_screen_locker.cc",
"../ash/login/lock/views_screen_locker.h",
+ "../ash/login/lock_screen_utils.cc",
+ "../ash/login/lock_screen_utils.h",
+ "../ash/login/login_auth_recorder.cc",
+ "../ash/login/login_auth_recorder.h",
+ "../ash/login/login_client_cert_usage_observer.cc",
+ "../ash/login/login_client_cert_usage_observer.h",
+ "../ash/login/login_pref_names.cc",
+ "../ash/login/login_pref_names.h",
+ "../ash/login/login_screen_extensions_lifetime_manager.cc",
+ "../ash/login/login_screen_extensions_lifetime_manager.h",
+ "../ash/login/login_screen_extensions_storage_cleaner.cc",
+ "../ash/login/login_screen_extensions_storage_cleaner.h",
+ "../ash/login/login_wizard.h",
+ "../ash/login/marketing_backend_connector.cc",
+ "../ash/login/marketing_backend_connector.h",
+ "../ash/login/mojo_system_info_dispatcher.cc",
+ "../ash/login/mojo_system_info_dispatcher.h",
+ "../ash/login/oobe_configuration.cc",
+ "../ash/login/oobe_configuration.h",
+ "../ash/login/oobe_screen.cc",
+ "../ash/login/oobe_screen.h",
+ "../ash/login/profile_auth_data.cc",
+ "../ash/login/profile_auth_data.h",
"../ash/login/quick_unlock/auth_token.cc",
"../ash/login/quick_unlock/auth_token.h",
"../ash/login/quick_unlock/fingerprint_storage.cc",
@@ -662,6 +1224,8 @@ source_set("chromeos") {
"../ash/login/quick_unlock/quick_unlock_storage.h",
"../ash/login/quick_unlock/quick_unlock_utils.cc",
"../ash/login/quick_unlock/quick_unlock_utils.h",
+ "../ash/login/reauth_stats.cc",
+ "../ash/login/reauth_stats.h",
"../ash/login/saml/in_session_password_change_manager.cc",
"../ash/login/saml/in_session_password_change_manager.h",
"../ash/login/saml/in_session_password_sync_manager.cc",
@@ -686,6 +1250,8 @@ source_set("chromeos") {
"../ash/login/saml/saml_metric_utils.h",
"../ash/login/saml/saml_profile_prefs.cc",
"../ash/login/saml/saml_profile_prefs.h",
+ "../ash/login/screen_manager.cc",
+ "../ash/login/screen_manager.h",
"../ash/login/screens/active_directory_login_screen.cc",
"../ash/login/screens/active_directory_login_screen.h",
"../ash/login/screens/active_directory_password_change_screen.cc",
@@ -700,6 +1266,8 @@ source_set("chromeos") {
"../ash/login/screens/base_screen.h",
"../ash/login/screens/chrome_user_selection_screen.cc",
"../ash/login/screens/chrome_user_selection_screen.h",
+ "../ash/login/screens/chromevox_hint/chromevox_hint_detector.cc",
+ "../ash/login/screens/chromevox_hint/chromevox_hint_detector.h",
"../ash/login/screens/demo_preferences_screen.cc",
"../ash/login/screens/demo_preferences_screen.h",
"../ash/login/screens/demo_setup_screen.cc",
@@ -786,13 +1354,246 @@ source_set("chromeos") {
"../ash/login/screens/welcome_screen.h",
"../ash/login/screens/wrong_hwid_screen.cc",
"../ash/login/screens/wrong_hwid_screen.h",
+ "../ash/login/security_token_pin_dialog_host_ash_impl.cc",
+ "../ash/login/security_token_pin_dialog_host_ash_impl.h",
+ "../ash/login/security_token_session_controller.cc",
+ "../ash/login/security_token_session_controller.h",
+ "../ash/login/security_token_session_controller_factory.cc",
+ "../ash/login/security_token_session_controller_factory.h",
+ "../ash/login/session/chrome_session_manager.cc",
+ "../ash/login/session/chrome_session_manager.h",
+ "../ash/login/session/user_session_initializer.cc",
+ "../ash/login/session/user_session_initializer.h",
+ "../ash/login/session/user_session_manager.cc",
+ "../ash/login/session/user_session_manager.h",
+ "../ash/login/signin/auth_error_observer.cc",
+ "../ash/login/signin/auth_error_observer.h",
+ "../ash/login/signin/auth_error_observer_factory.cc",
+ "../ash/login/signin/auth_error_observer_factory.h",
+ "../ash/login/signin/merge_session_navigation_throttle.cc",
+ "../ash/login/signin/merge_session_navigation_throttle.h",
+ "../ash/login/signin/merge_session_throttling_utils.cc",
+ "../ash/login/signin/merge_session_throttling_utils.h",
+ "../ash/login/signin/oauth2_login_manager.cc",
+ "../ash/login/signin/oauth2_login_manager.h",
+ "../ash/login/signin/oauth2_login_manager_factory.cc",
+ "../ash/login/signin/oauth2_login_manager_factory.h",
+ "../ash/login/signin/oauth2_login_verifier.cc",
+ "../ash/login/signin/oauth2_login_verifier.h",
+ "../ash/login/signin/oauth2_token_fetcher.cc",
+ "../ash/login/signin/oauth2_token_fetcher.h",
+ "../ash/login/signin/oauth2_token_initializer.cc",
+ "../ash/login/signin/oauth2_token_initializer.h",
+ "../ash/login/signin/offline_signin_limiter.cc",
+ "../ash/login/signin/offline_signin_limiter.h",
+ "../ash/login/signin/offline_signin_limiter_factory.cc",
+ "../ash/login/signin/offline_signin_limiter_factory.h",
+ "../ash/login/signin/signin_error_notifier_ash.cc",
+ "../ash/login/signin/signin_error_notifier_ash.h",
+ "../ash/login/signin/signin_error_notifier_factory_ash.cc",
+ "../ash/login/signin/signin_error_notifier_factory_ash.h",
+ "../ash/login/signin/token_handle_fetcher.cc",
+ "../ash/login/signin/token_handle_fetcher.h",
+ "../ash/login/signin/token_handle_util.cc",
+ "../ash/login/signin/token_handle_util.h",
+ "../ash/login/signin_partition_manager.cc",
+ "../ash/login/signin_partition_manager.h",
+ "../ash/login/signin_specifics.h",
+ "../ash/login/startup_utils.cc",
+ "../ash/login/startup_utils.h",
+ "../ash/login/ui/captive_portal_dialog_delegate.cc",
+ "../ash/login/ui/captive_portal_dialog_delegate.h",
+ "../ash/login/ui/captive_portal_view.cc",
+ "../ash/login/ui/captive_portal_view.h",
+ "../ash/login/ui/captive_portal_window_proxy.cc",
+ "../ash/login/ui/captive_portal_window_proxy.h",
+ "../ash/login/ui/input_events_blocker.cc",
+ "../ash/login/ui/input_events_blocker.h",
+ "../ash/login/ui/kiosk_app_menu_controller.cc",
+ "../ash/login/ui/kiosk_app_menu_controller.h",
+ "../ash/login/ui/login_display.cc",
+ "../ash/login/ui/login_display.h",
+ "../ash/login/ui/login_display_host.cc",
+ "../ash/login/ui/login_display_host.h",
+ "../ash/login/ui/login_display_host_common.cc",
+ "../ash/login/ui/login_display_host_common.h",
+ "../ash/login/ui/login_display_host_mojo.cc",
+ "../ash/login/ui/login_display_host_mojo.h",
+ "../ash/login/ui/login_display_host_webui.cc",
+ "../ash/login/ui/login_display_host_webui.h",
+ "../ash/login/ui/login_display_mojo.cc",
+ "../ash/login/ui/login_display_mojo.h",
+ "../ash/login/ui/login_display_webui.cc",
+ "../ash/login/ui/login_display_webui.h",
+ "../ash/login/ui/login_feedback.cc",
+ "../ash/login/ui/login_feedback.h",
+ "../ash/login/ui/login_screen_extension_ui/create_options.cc",
+ "../ash/login/ui/login_screen_extension_ui/create_options.h",
+ "../ash/login/ui/login_screen_extension_ui/dialog_delegate.cc",
+ "../ash/login/ui/login_screen_extension_ui/dialog_delegate.h",
+ "../ash/login/ui/login_screen_extension_ui/web_dialog_view.cc",
+ "../ash/login/ui/login_screen_extension_ui/web_dialog_view.h",
+ "../ash/login/ui/login_screen_extension_ui/window.cc",
+ "../ash/login/ui/login_screen_extension_ui/window.h",
+ "../ash/login/ui/login_web_dialog.cc",
+ "../ash/login/ui/login_web_dialog.h",
+ "../ash/login/ui/oobe_dialog_size_utils.cc",
+ "../ash/login/ui/oobe_dialog_size_utils.h",
+ "../ash/login/ui/oobe_ui_dialog_delegate.cc",
+ "../ash/login/ui/oobe_ui_dialog_delegate.h",
+ "../ash/login/ui/signin_ui.h",
+ "../ash/login/ui/simple_web_view_dialog.cc",
+ "../ash/login/ui/simple_web_view_dialog.h",
+ "../ash/login/ui/user_adding_screen.cc",
+ "../ash/login/ui/user_adding_screen.h",
+ "../ash/login/ui/user_adding_screen_input_methods_controller.cc",
+ "../ash/login/ui/user_adding_screen_input_methods_controller.h",
+ "../ash/login/ui/views/user_board_view.h",
+ "../ash/login/ui/web_contents_forced_title.cc",
+ "../ash/login/ui/web_contents_forced_title.h",
+ "../ash/login/ui/webui_accelerator_mapping.cc",
+ "../ash/login/ui/webui_accelerator_mapping.h",
+ "../ash/login/ui/webui_login_view.cc",
+ "../ash/login/ui/webui_login_view.h",
+ "../ash/login/user_board_view_mojo.cc",
+ "../ash/login/user_board_view_mojo.h",
+ "../ash/login/user_flow.cc",
+ "../ash/login/user_flow.h",
+ "../ash/login/user_online_signin_notifier.cc",
+ "../ash/login/user_online_signin_notifier.h",
+ "../ash/login/users/affiliation.cc",
+ "../ash/login/users/affiliation.h",
+ "../ash/login/users/avatar/user_image_loader.cc",
+ "../ash/login/users/avatar/user_image_loader.h",
+ "../ash/login/users/avatar/user_image_manager.cc",
+ "../ash/login/users/avatar/user_image_manager.h",
+ "../ash/login/users/avatar/user_image_manager_impl.cc",
+ "../ash/login/users/avatar/user_image_manager_impl.h",
+ "../ash/login/users/avatar/user_image_sync_observer.cc",
+ "../ash/login/users/avatar/user_image_sync_observer.h",
+ "../ash/login/users/chrome_user_manager.cc",
+ "../ash/login/users/chrome_user_manager.h",
+ "../ash/login/users/chrome_user_manager_impl.cc",
+ "../ash/login/users/chrome_user_manager_impl.h",
+ "../ash/login/users/chrome_user_manager_util.cc",
+ "../ash/login/users/chrome_user_manager_util.h",
+ "../ash/login/users/default_user_image/default_user_images.cc",
+ "../ash/login/users/default_user_image/default_user_images.h",
+ "../ash/login/users/multi_profile_user_controller.cc",
+ "../ash/login/users/multi_profile_user_controller.h",
+ "../ash/login/users/multi_profile_user_controller_delegate.h",
+ "../ash/login/users/scoped_test_user_manager.cc",
+ "../ash/login/users/scoped_test_user_manager.h",
+ "../ash/login/users/supervised_user_manager.h",
+ "../ash/login/users/supervised_user_manager_impl.cc",
+ "../ash/login/users/supervised_user_manager_impl.h",
+ "../ash/login/users/test_users.cc",
+ "../ash/login/users/test_users.h",
+ "../ash/login/users/user_manager_interface.h",
+ "../ash/login/version_info_updater.cc",
+ "../ash/login/version_info_updater.h",
+ "../ash/login/version_updater/update_time_estimator.cc",
+ "../ash/login/version_updater/update_time_estimator.h",
+ "../ash/login/version_updater/version_updater.cc",
+ "../ash/login/version_updater/version_updater.h",
+ "../ash/login/wizard_context.cc",
+ "../ash/login/wizard_context.h",
+ "../ash/login/wizard_controller.cc",
+ "../ash/login/wizard_controller.h",
"../ash/mobile/mobile_activator.cc",
"../ash/mobile/mobile_activator.h",
+ "../ash/net/secure_dns_manager.cc",
+ "../ash/net/secure_dns_manager.h",
+ "../ash/night_light/night_light_client.cc",
+ "../ash/night_light/night_light_client.h",
+ "../ash/notifications/adb_sideloading_policy_change_notification.cc",
+ "../ash/notifications/adb_sideloading_policy_change_notification.h",
"../ash/notifications/deprecation_notification_controller.cc",
"../ash/notifications/deprecation_notification_controller.h",
+ "../ash/notifications/echo_dialog_listener.h",
+ "../ash/notifications/echo_dialog_view.cc",
+ "../ash/notifications/echo_dialog_view.h",
+ "../ash/notifications/gnubby_notification.cc",
+ "../ash/notifications/gnubby_notification.h",
+ "../ash/notifications/idle_app_name_notification_view.cc",
+ "../ash/notifications/idle_app_name_notification_view.h",
+ "../ash/notifications/kiosk_external_update_notification.cc",
+ "../ash/notifications/kiosk_external_update_notification.h",
+ "../ash/notifications/low_disk_notification.cc",
+ "../ash/notifications/low_disk_notification.h",
+ "../ash/notifications/passphrase_textfield.cc",
+ "../ash/notifications/passphrase_textfield.h",
+ "../ash/notifications/request_pin_view.cc",
+ "../ash/notifications/request_pin_view.h",
+ "../ash/notifications/request_system_proxy_credentials_view.cc",
+ "../ash/notifications/request_system_proxy_credentials_view.h",
+ "../ash/notifications/screen_capture_notification_ui_ash.cc",
+ "../ash/notifications/screen_capture_notification_ui_ash.h",
+ "../ash/notifications/system_proxy_notification.cc",
+ "../ash/notifications/system_proxy_notification.h",
+ "../ash/notifications/tpm_auto_update_notification.cc",
+ "../ash/notifications/tpm_auto_update_notification.h",
+ "../ash/notifications/update_required_notification.cc",
+ "../ash/notifications/update_required_notification.h",
+ "../ash/ownership/fake_owner_settings_service.cc",
+ "../ash/ownership/fake_owner_settings_service.h",
+ "../ash/ownership/owner_settings_service_ash.cc",
+ "../ash/ownership/owner_settings_service_ash.h",
+ "../ash/ownership/owner_settings_service_ash_factory.cc",
+ "../ash/ownership/owner_settings_service_ash_factory.h",
+ "../ash/plugin_vm/plugin_vm_diagnostics.cc",
+ "../ash/plugin_vm/plugin_vm_diagnostics.h",
+ "../ash/plugin_vm/plugin_vm_drive_image_download_service.cc",
+ "../ash/plugin_vm/plugin_vm_drive_image_download_service.h",
+ "../ash/plugin_vm/plugin_vm_engagement_metrics_service.cc",
+ "../ash/plugin_vm/plugin_vm_engagement_metrics_service.h",
+ "../ash/plugin_vm/plugin_vm_features.cc",
+ "../ash/plugin_vm/plugin_vm_features.h",
+ "../ash/plugin_vm/plugin_vm_files.cc",
+ "../ash/plugin_vm/plugin_vm_files.h",
+ "../ash/plugin_vm/plugin_vm_image_download_client.cc",
+ "../ash/plugin_vm/plugin_vm_image_download_client.h",
+ "../ash/plugin_vm/plugin_vm_installer.cc",
+ "../ash/plugin_vm/plugin_vm_installer.h",
+ "../ash/plugin_vm/plugin_vm_installer_factory.cc",
+ "../ash/plugin_vm/plugin_vm_installer_factory.h",
+ "../ash/plugin_vm/plugin_vm_license_checker.cc",
+ "../ash/plugin_vm/plugin_vm_license_checker.h",
+ "../ash/plugin_vm/plugin_vm_manager.h",
+ "../ash/plugin_vm/plugin_vm_manager_factory.cc",
+ "../ash/plugin_vm/plugin_vm_manager_factory.h",
+ "../ash/plugin_vm/plugin_vm_manager_impl.cc",
+ "../ash/plugin_vm/plugin_vm_manager_impl.h",
+ "../ash/plugin_vm/plugin_vm_metrics_util.cc",
+ "../ash/plugin_vm/plugin_vm_metrics_util.h",
+ "../ash/plugin_vm/plugin_vm_pref_names.cc",
+ "../ash/plugin_vm/plugin_vm_pref_names.h",
+ "../ash/plugin_vm/plugin_vm_uninstaller_notification.cc",
+ "../ash/plugin_vm/plugin_vm_uninstaller_notification.h",
+ "../ash/plugin_vm/plugin_vm_util.cc",
+ "../ash/plugin_vm/plugin_vm_util.h",
"../ash/profiles/profile_helper.cc",
"../ash/profiles/profile_helper.h",
"../ash/reset/metrics.h",
+ "../ash/scanning/chrome_scanning_app_delegate.cc",
+ "../ash/scanning/chrome_scanning_app_delegate.h",
+ "../ash/scanning/lorgnette_scanner_manager.cc",
+ "../ash/scanning/lorgnette_scanner_manager.h",
+ "../ash/scanning/lorgnette_scanner_manager_factory.cc",
+ "../ash/scanning/lorgnette_scanner_manager_factory.h",
+ "../ash/scanning/lorgnette_scanner_manager_util.cc",
+ "../ash/scanning/lorgnette_scanner_manager_util.h",
+ "../ash/scanning/scan_service.cc",
+ "../ash/scanning/scan_service.h",
+ "../ash/scanning/scan_service_factory.cc",
+ "../ash/scanning/scan_service_factory.h",
+ "../ash/scanning/scanner_detector.h",
+ "../ash/scanning/scanning_type_converters.cc",
+ "../ash/scanning/scanning_type_converters.h",
+ "../ash/scanning/zeroconf_scanner_detector.cc",
+ "../ash/scanning/zeroconf_scanner_detector.h",
+ "../ash/scanning/zeroconf_scanner_detector_utils.cc",
+ "../ash/scanning/zeroconf_scanner_detector_utils.h",
"../ash/settings/cros_settings.cc",
"../ash/settings/cros_settings.h",
"../ash/settings/device_settings_cache.cc",
@@ -873,6 +1674,64 @@ source_set("chromeos") {
"../ash/system_logs/touch_log_source.h",
"../ash/system_logs/ui_hierarchy_log_source.cc",
"../ash/system_logs/ui_hierarchy_log_source.h",
+ "../ash/web_applications/camera_system_web_app_info.cc",
+ "../ash/web_applications/camera_system_web_app_info.h",
+ "../ash/web_applications/chrome_camera_app_ui_constants.h",
+ "../ash/web_applications/chrome_camera_app_ui_delegate.cc",
+ "../ash/web_applications/chrome_camera_app_ui_delegate.h",
+ "../ash/web_applications/chrome_help_app_ui_delegate.cc",
+ "../ash/web_applications/chrome_help_app_ui_delegate.h",
+ "../ash/web_applications/chrome_media_app_ui_delegate.cc",
+ "../ash/web_applications/chrome_media_app_ui_delegate.h",
+ "../ash/web_applications/chrome_personalization_app_ui_delegate.cc",
+ "../ash/web_applications/chrome_personalization_app_ui_delegate.h",
+ "../ash/web_applications/connectivity_diagnostics_system_web_app_info.cc",
+ "../ash/web_applications/connectivity_diagnostics_system_web_app_info.h",
+ "../ash/web_applications/crosh_loader.cc",
+ "../ash/web_applications/crosh_loader.h",
+ "../ash/web_applications/crosh_loader_factory.cc",
+ "../ash/web_applications/crosh_loader_factory.h",
+ "../ash/web_applications/crosh_system_web_app_info.cc",
+ "../ash/web_applications/crosh_system_web_app_info.h",
+ "../ash/web_applications/diagnostics_system_web_app_info.cc",
+ "../ash/web_applications/diagnostics_system_web_app_info.h",
+ "../ash/web_applications/eche_app_info.cc",
+ "../ash/web_applications/eche_app_info.h",
+ "../ash/web_applications/help_app_web_app_info.cc",
+ "../ash/web_applications/help_app_web_app_info.h",
+ "../ash/web_applications/media_web_app_info.cc",
+ "../ash/web_applications/media_web_app_info.h",
+ "../ash/web_applications/os_settings_web_app_info.cc",
+ "../ash/web_applications/os_settings_web_app_info.h",
+ "../ash/web_applications/personalization_app_info.cc",
+ "../ash/web_applications/personalization_app_info.h",
+ "../ash/web_applications/print_management_web_app_info.cc",
+ "../ash/web_applications/print_management_web_app_info.h",
+ "../ash/web_applications/scanning_system_web_app_info.cc",
+ "../ash/web_applications/scanning_system_web_app_info.h",
+ "../ash/web_applications/system_web_app_install_utils.cc",
+ "../ash/web_applications/system_web_app_install_utils.h",
+ "../ash/web_applications/terminal_source.cc",
+ "../ash/web_applications/terminal_source.h",
+ "../ash/web_applications/terminal_system_web_app_info.cc",
+ "../ash/web_applications/terminal_system_web_app_info.h",
+ "../ash/web_applications/terminal_ui.cc",
+ "../ash/web_applications/terminal_ui.h",
+ "../ash/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.cc",
+ "../ash/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_client.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_client.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_manager.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_manager.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_network_context.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.h",
"android_sms/android_sms_app_manager.cc",
"android_sms/android_sms_app_manager.h",
"android_sms/android_sms_app_manager_impl.cc",
@@ -897,400 +1756,14 @@ source_set("chromeos") {
"android_sms/fcm_connection_establisher.h",
"android_sms/pairing_lost_notifier.cc",
"android_sms/pairing_lost_notifier.h",
- "apps/apk_web_app_installer.cc",
- "apps/apk_web_app_installer.h",
- "apps/apk_web_app_service.cc",
- "apps/apk_web_app_service.h",
- "apps/apk_web_app_service_factory.cc",
- "apps/apk_web_app_service_factory.h",
- "apps/intent_helper/chromeos_intent_picker_helpers.cc",
- "apps/intent_helper/chromeos_intent_picker_helpers.h",
- "apps/intent_helper/common_apps_navigation_throttle.cc",
- "apps/intent_helper/common_apps_navigation_throttle.h",
- "apps/metrics/intent_handling_metrics.cc",
- "apps/metrics/intent_handling_metrics.h",
- "arc/accessibility/accessibility_info_data_wrapper.cc",
- "arc/accessibility/accessibility_info_data_wrapper.h",
- "arc/accessibility/accessibility_node_info_data_wrapper.cc",
- "arc/accessibility/accessibility_node_info_data_wrapper.h",
- "arc/accessibility/accessibility_window_info_data_wrapper.cc",
- "arc/accessibility/accessibility_window_info_data_wrapper.h",
- "arc/accessibility/arc_accessibility_helper_bridge.cc",
- "arc/accessibility/arc_accessibility_helper_bridge.h",
- "arc/accessibility/arc_accessibility_util.cc",
- "arc/accessibility/arc_accessibility_util.h",
- "arc/accessibility/auto_complete_handler.cc",
- "arc/accessibility/auto_complete_handler.h",
- "arc/accessibility/ax_tree_source_arc.cc",
- "arc/accessibility/ax_tree_source_arc.h",
- "arc/accessibility/drawer_layout_handler.cc",
- "arc/accessibility/drawer_layout_handler.h",
- "arc/accessibility/geometry_util.cc",
- "arc/accessibility/geometry_util.h",
- "arc/adbd/arc_adbd_monitor_bridge.cc",
- "arc/adbd/arc_adbd_monitor_bridge.h",
- "arc/app_shortcuts/arc_app_shortcut_item.cc",
- "arc/app_shortcuts/arc_app_shortcut_item.h",
- "arc/app_shortcuts/arc_app_shortcuts_menu_builder.cc",
- "arc/app_shortcuts/arc_app_shortcuts_menu_builder.h",
- "arc/app_shortcuts/arc_app_shortcuts_request.cc",
- "arc/app_shortcuts/arc_app_shortcuts_request.h",
- "arc/arc_demo_mode_delegate_impl.cc",
- "arc/arc_demo_mode_delegate_impl.h",
- "arc/arc_migration_constants.h",
- "arc/arc_migration_guide_notification.cc",
- "arc/arc_migration_guide_notification.h",
- "arc/arc_optin_uma.cc",
- "arc/arc_optin_uma.h",
- "arc/arc_support_host.cc",
- "arc/arc_support_host.h",
- "arc/arc_ui_availability_reporter.cc",
- "arc/arc_ui_availability_reporter.h",
- "arc/arc_util.cc",
- "arc/arc_util.h",
- "arc/arc_web_contents_data.cc",
- "arc/arc_web_contents_data.h",
- "arc/auth/arc_active_directory_enrollment_token_fetcher.cc",
- "arc/auth/arc_active_directory_enrollment_token_fetcher.h",
- "arc/auth/arc_auth_code_fetcher.h",
- "arc/auth/arc_auth_context.cc",
- "arc/auth/arc_auth_context.h",
- "arc/auth/arc_auth_service.cc",
- "arc/auth/arc_auth_service.h",
- "arc/auth/arc_background_auth_code_fetcher.cc",
- "arc/auth/arc_background_auth_code_fetcher.h",
- "arc/auth/arc_fetcher_base.cc",
- "arc/auth/arc_fetcher_base.h",
- "arc/auth/arc_robot_auth_code_fetcher.cc",
- "arc/auth/arc_robot_auth_code_fetcher.h",
- "arc/bluetooth/arc_bluetooth_bridge.cc",
- "arc/bluetooth/arc_bluetooth_bridge.h",
- "arc/bluetooth/arc_bluetooth_task_queue.cc",
- "arc/bluetooth/arc_bluetooth_task_queue.h",
- "arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.cc",
- "arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h",
- "arc/cast_receiver/arc_cast_receiver_service.cc",
- "arc/cast_receiver/arc_cast_receiver_service.h",
- "arc/enterprise/arc_data_snapshotd_delegate.cc",
- "arc/enterprise/arc_data_snapshotd_delegate.h",
- "arc/enterprise/arc_enterprise_reporting_service.cc",
- "arc/enterprise/arc_enterprise_reporting_service.h",
- "arc/enterprise/arc_force_installed_apps_tracker.cc",
- "arc/enterprise/arc_force_installed_apps_tracker.h",
- "arc/enterprise/arc_snapshot_reboot_notification_impl.cc",
- "arc/enterprise/arc_snapshot_reboot_notification_impl.h",
- "arc/enterprise/cert_store/arc_cert_installer.cc",
- "arc/enterprise/cert_store/arc_cert_installer.h",
- "arc/enterprise/cert_store/arc_cert_installer_utils.cc",
- "arc/enterprise/cert_store/arc_cert_installer_utils.h",
- "arc/enterprise/cert_store/cert_store_service.cc",
- "arc/enterprise/cert_store/cert_store_service.h",
- "arc/extensions/arc_support_message_host.cc",
- "arc/extensions/arc_support_message_host.h",
- "arc/file_system_watcher/arc_file_system_watcher_service.cc",
- "arc/file_system_watcher/arc_file_system_watcher_service.h",
- "arc/file_system_watcher/arc_file_system_watcher_util.cc",
- "arc/file_system_watcher/arc_file_system_watcher_util.h",
- "arc/file_system_watcher/file_system_scanner.cc",
- "arc/file_system_watcher/file_system_scanner.h",
- "arc/fileapi/arc_content_file_system_async_file_util.cc",
- "arc/fileapi/arc_content_file_system_async_file_util.h",
- "arc/fileapi/arc_content_file_system_backend_delegate.cc",
- "arc/fileapi/arc_content_file_system_backend_delegate.h",
- "arc/fileapi/arc_content_file_system_file_stream_reader.cc",
- "arc/fileapi/arc_content_file_system_file_stream_reader.h",
- "arc/fileapi/arc_content_file_system_file_stream_writer.cc",
- "arc/fileapi/arc_content_file_system_file_stream_writer.h",
- "arc/fileapi/arc_content_file_system_size_util.cc",
- "arc/fileapi/arc_content_file_system_size_util.h",
- "arc/fileapi/arc_content_file_system_url_util.cc",
- "arc/fileapi/arc_content_file_system_url_util.h",
- "arc/fileapi/arc_documents_provider_async_file_util.cc",
- "arc/fileapi/arc_documents_provider_async_file_util.h",
- "arc/fileapi/arc_documents_provider_backend_delegate.cc",
- "arc/fileapi/arc_documents_provider_backend_delegate.h",
- "arc/fileapi/arc_documents_provider_file_stream_reader.cc",
- "arc/fileapi/arc_documents_provider_file_stream_reader.h",
- "arc/fileapi/arc_documents_provider_file_stream_writer.cc",
- "arc/fileapi/arc_documents_provider_file_stream_writer.h",
- "arc/fileapi/arc_documents_provider_file_system_url_util.cc",
- "arc/fileapi/arc_documents_provider_file_system_url_util.h",
- "arc/fileapi/arc_documents_provider_root.cc",
- "arc/fileapi/arc_documents_provider_root.h",
- "arc/fileapi/arc_documents_provider_root_map.cc",
- "arc/fileapi/arc_documents_provider_root_map.h",
- "arc/fileapi/arc_documents_provider_root_map_factory.cc",
- "arc/fileapi/arc_documents_provider_root_map_factory.h",
- "arc/fileapi/arc_documents_provider_util.cc",
- "arc/fileapi/arc_documents_provider_util.h",
- "arc/fileapi/arc_documents_provider_watcher_manager.cc",
- "arc/fileapi/arc_documents_provider_watcher_manager.h",
- "arc/fileapi/arc_file_system_bridge.cc",
- "arc/fileapi/arc_file_system_bridge.h",
- "arc/fileapi/arc_file_system_mounter.cc",
- "arc/fileapi/arc_file_system_mounter.h",
- "arc/fileapi/arc_file_system_operation_runner.cc",
- "arc/fileapi/arc_file_system_operation_runner.h",
- "arc/fileapi/arc_file_system_operation_runner_util.cc",
- "arc/fileapi/arc_file_system_operation_runner_util.h",
- "arc/fileapi/arc_media_view_util.cc",
- "arc/fileapi/arc_media_view_util.h",
- "arc/fileapi/arc_select_files_handler.cc",
- "arc/fileapi/arc_select_files_handler.h",
- "arc/fileapi/arc_select_files_util.cc",
- "arc/fileapi/arc_select_files_util.h",
- "arc/fileapi/chrome_content_provider_url_util.cc",
- "arc/fileapi/chrome_content_provider_url_util.h",
- "arc/fileapi/file_stream_forwarder.cc",
- "arc/fileapi/file_stream_forwarder.h",
- "arc/icon_decode_request.cc",
- "arc/icon_decode_request.h",
- "arc/input_method_manager/arc_input_method_manager_bridge.h",
- "arc/input_method_manager/arc_input_method_manager_bridge_impl.cc",
- "arc/input_method_manager/arc_input_method_manager_bridge_impl.h",
- "arc/input_method_manager/arc_input_method_manager_service.cc",
- "arc/input_method_manager/arc_input_method_manager_service.h",
- "arc/input_method_manager/arc_input_method_state.cc",
- "arc/input_method_manager/arc_input_method_state.h",
- "arc/input_method_manager/input_connection_impl.cc",
- "arc/input_method_manager/input_connection_impl.h",
- "arc/input_method_manager/input_method_prefs.cc",
- "arc/input_method_manager/input_method_prefs.h",
- "arc/instance_throttle/arc_active_window_throttle_observer.cc",
- "arc/instance_throttle/arc_active_window_throttle_observer.h",
- "arc/instance_throttle/arc_app_launch_throttle_observer.cc",
- "arc/instance_throttle/arc_app_launch_throttle_observer.h",
- "arc/instance_throttle/arc_boot_phase_throttle_observer.cc",
- "arc/instance_throttle/arc_boot_phase_throttle_observer.h",
- "arc/instance_throttle/arc_instance_throttle.cc",
- "arc/instance_throttle/arc_instance_throttle.h",
- "arc/instance_throttle/arc_pip_window_throttle_observer.cc",
- "arc/instance_throttle/arc_pip_window_throttle_observer.h",
- "arc/intent_helper/arc_external_protocol_dialog.cc",
- "arc/intent_helper/arc_external_protocol_dialog.h",
- "arc/intent_helper/arc_settings_service.cc",
- "arc/intent_helper/arc_settings_service.h",
- "arc/intent_helper/custom_tab_session_impl.cc",
- "arc/intent_helper/custom_tab_session_impl.h",
- "arc/intent_helper/factory_reset_delegate.cc",
- "arc/intent_helper/factory_reset_delegate.h",
- "arc/intent_helper/open_with_menu.cc",
- "arc/intent_helper/open_with_menu.h",
- "arc/intent_helper/start_smart_selection_action_menu.cc",
- "arc/intent_helper/start_smart_selection_action_menu.h",
- "arc/keymaster/arc_keymaster_bridge.cc",
- "arc/keymaster/arc_keymaster_bridge.h",
- "arc/keymaster/cert_store_bridge.cc",
- "arc/keymaster/cert_store_bridge.h",
- "arc/kiosk/arc_kiosk_bridge.cc",
- "arc/kiosk/arc_kiosk_bridge.h",
- "arc/metrics/arc_metrics_service_proxy.cc",
- "arc/metrics/arc_metrics_service_proxy.h",
- "arc/notification/arc_boot_error_notification.cc",
- "arc/notification/arc_boot_error_notification.h",
- "arc/notification/arc_provision_notification_service.cc",
- "arc/notification/arc_provision_notification_service.h",
- "arc/notification/arc_supervision_transition_notification.cc",
- "arc/notification/arc_supervision_transition_notification.h",
- "arc/oemcrypto/arc_oemcrypto_bridge.cc",
- "arc/oemcrypto/arc_oemcrypto_bridge.h",
- "arc/optin/arc_optin_preference_handler.cc",
- "arc/optin/arc_optin_preference_handler.h",
- "arc/optin/arc_optin_preference_handler_observer.h",
- "arc/optin/arc_terms_of_service_default_negotiator.cc",
- "arc/optin/arc_terms_of_service_default_negotiator.h",
- "arc/optin/arc_terms_of_service_negotiator.cc",
- "arc/optin/arc_terms_of_service_negotiator.h",
- "arc/optin/arc_terms_of_service_oobe_negotiator.cc",
- "arc/optin/arc_terms_of_service_oobe_negotiator.h",
- "arc/pip/arc_picture_in_picture_window_controller_impl.cc",
- "arc/pip/arc_picture_in_picture_window_controller_impl.h",
- "arc/pip/arc_pip_bridge.cc",
- "arc/pip/arc_pip_bridge.h",
- "arc/policy/arc_android_management_checker.cc",
- "arc/policy/arc_android_management_checker.h",
- "arc/policy/arc_policy_bridge.cc",
- "arc/policy/arc_policy_bridge.h",
- "arc/policy/arc_policy_util.cc",
- "arc/policy/arc_policy_util.h",
- "arc/print_spooler/arc_print_spooler_bridge.cc",
- "arc/print_spooler/arc_print_spooler_bridge.h",
- "arc/print_spooler/arc_print_spooler_util.cc",
- "arc/print_spooler/arc_print_spooler_util.h",
- "arc/print_spooler/print_session_impl.cc",
- "arc/print_spooler/print_session_impl.h",
- "arc/process/arc_process.cc",
- "arc/process/arc_process.h",
- "arc/process/arc_process_service.cc",
- "arc/process/arc_process_service.h",
- "arc/screen_capture/arc_screen_capture_bridge.cc",
- "arc/screen_capture/arc_screen_capture_bridge.h",
- "arc/screen_capture/arc_screen_capture_session.cc",
- "arc/screen_capture/arc_screen_capture_session.h",
- "arc/session/adb_sideloading_availability_delegate_impl.cc",
- "arc/session/adb_sideloading_availability_delegate_impl.h",
- "arc/session/arc_app_id_provider_impl.cc",
- "arc/session/arc_app_id_provider_impl.h",
- "arc/session/arc_demo_mode_preference_handler.cc",
- "arc/session/arc_demo_mode_preference_handler.h",
- "arc/session/arc_play_store_enabled_preference_handler.cc",
- "arc/session/arc_play_store_enabled_preference_handler.h",
- "arc/session/arc_provisioning_result.cc",
- "arc/session/arc_provisioning_result.h",
- "arc/session/arc_service_launcher.cc",
- "arc/session/arc_service_launcher.h",
- "arc/session/arc_session_manager.cc",
- "arc/session/arc_session_manager.h",
- "arc/session/arc_session_manager_observer.h",
- "arc/sharesheet/arc_sharesheet_bridge.cc",
- "arc/sharesheet/arc_sharesheet_bridge.h",
- "arc/tracing/arc_app_performance_tracing.cc",
- "arc/tracing/arc_app_performance_tracing.h",
- "arc/tracing/arc_app_performance_tracing_custom_session.cc",
- "arc/tracing/arc_app_performance_tracing_custom_session.h",
- "arc/tracing/arc_app_performance_tracing_session.cc",
- "arc/tracing/arc_app_performance_tracing_session.h",
- "arc/tracing/arc_app_performance_tracing_uma_session.cc",
- "arc/tracing/arc_app_performance_tracing_uma_session.h",
- "arc/tracing/arc_cpu_event.cc",
- "arc/tracing/arc_cpu_event.h",
- "arc/tracing/arc_graphics_jank_detector.cc",
- "arc/tracing/arc_graphics_jank_detector.h",
- "arc/tracing/arc_system_model.cc",
- "arc/tracing/arc_system_model.h",
- "arc/tracing/arc_system_stat_collector.cc",
- "arc/tracing/arc_system_stat_collector.h",
- "arc/tracing/arc_tracing_bridge.cc",
- "arc/tracing/arc_tracing_bridge.h",
- "arc/tracing/arc_tracing_event.cc",
- "arc/tracing/arc_tracing_event.h",
- "arc/tracing/arc_tracing_event_matcher.cc",
- "arc/tracing/arc_tracing_event_matcher.h",
- "arc/tracing/arc_tracing_graphics_model.cc",
- "arc/tracing/arc_tracing_graphics_model.h",
- "arc/tracing/arc_tracing_model.cc",
- "arc/tracing/arc_tracing_model.h",
- "arc/tracing/arc_value_event.cc",
- "arc/tracing/arc_value_event.h",
- "arc/tracing/arc_value_event_trimmer.cc",
- "arc/tracing/arc_value_event_trimmer.h",
- "arc/tts/arc_tts_service.cc",
- "arc/tts/arc_tts_service.h",
- "arc/usb/arc_usb_host_bridge_delegate.cc",
- "arc/usb/arc_usb_host_bridge_delegate.h",
- "arc/user_session/arc_user_session_service.cc",
- "arc/user_session/arc_user_session_service.h",
- "arc/video/gpu_arc_video_service_host.cc",
- "arc/video/gpu_arc_video_service_host.h",
- "arc/wallpaper/arc_wallpaper_service.cc",
- "arc/wallpaper/arc_wallpaper_service.h",
- "attestation/attestation_ca_client.cc",
- "attestation/attestation_ca_client.h",
- "attestation/attestation_policy_observer.cc",
- "attestation/attestation_policy_observer.h",
- "attestation/enrollment_certificate_uploader.h",
- "attestation/enrollment_certificate_uploader_impl.cc",
- "attestation/enrollment_certificate_uploader_impl.h",
- "attestation/enrollment_policy_observer.cc",
- "attestation/enrollment_policy_observer.h",
- "attestation/machine_certificate_uploader.h",
- "attestation/machine_certificate_uploader_impl.cc",
- "attestation/machine_certificate_uploader_impl.h",
- "attestation/platform_verification_dialog.cc",
- "attestation/platform_verification_dialog.h",
- "attestation/platform_verification_flow.cc",
- "attestation/platform_verification_flow.h",
- "attestation/tpm_challenge_key.cc",
- "attestation/tpm_challenge_key.h",
- "attestation/tpm_challenge_key_result.cc",
- "attestation/tpm_challenge_key_result.h",
- "attestation/tpm_challenge_key_subtle.cc",
- "attestation/tpm_challenge_key_subtle.h",
- "attestation/tpm_challenge_key_with_timeout.cc",
- "attestation/tpm_challenge_key_with_timeout.h",
- "authpolicy/authpolicy_credentials_manager.cc",
- "authpolicy/authpolicy_credentials_manager.h",
- "authpolicy/authpolicy_helper.cc",
- "authpolicy/authpolicy_helper.h",
- "authpolicy/data_pipe_utils.cc",
- "authpolicy/data_pipe_utils.h",
- "authpolicy/kerberos_files_handler.cc",
- "authpolicy/kerberos_files_handler.h",
- "backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc",
- "backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h",
- "base/file_flusher.cc",
- "base/file_flusher.h",
- "base/locale_util.cc",
- "base/locale_util.h",
- "bluetooth/debug_logs_manager.cc",
- "bluetooth/debug_logs_manager.h",
- "bluetooth/debug_logs_manager_factory.cc",
- "bluetooth/debug_logs_manager_factory.h",
"boot_times_recorder.cc",
"boot_times_recorder.h",
- "borealis/borealis_app_launcher.cc",
- "borealis/borealis_app_launcher.h",
- "borealis/borealis_app_uninstaller.cc",
- "borealis/borealis_app_uninstaller.h",
- "borealis/borealis_context.cc",
- "borealis/borealis_context.h",
- "borealis/borealis_context_manager.h",
- "borealis/borealis_context_manager_impl.cc",
- "borealis/borealis_context_manager_impl.h",
- "borealis/borealis_features.cc",
- "borealis/borealis_features.h",
- "borealis/borealis_installer.cc",
- "borealis/borealis_installer.h",
- "borealis/borealis_installer_impl.cc",
- "borealis/borealis_installer_impl.h",
- "borealis/borealis_launch_watcher.cc",
- "borealis/borealis_launch_watcher.h",
- "borealis/borealis_metrics.cc",
- "borealis/borealis_metrics.h",
- "borealis/borealis_prefs.cc",
- "borealis/borealis_prefs.h",
- "borealis/borealis_service.cc",
- "borealis/borealis_service.h",
- "borealis/borealis_service_factory.cc",
- "borealis/borealis_service_factory.h",
- "borealis/borealis_service_impl.cc",
- "borealis/borealis_service_impl.h",
- "borealis/borealis_shutdown_monitor.cc",
- "borealis/borealis_shutdown_monitor.h",
- "borealis/borealis_task.cc",
- "borealis/borealis_task.h",
- "borealis/borealis_util.cc",
- "borealis/borealis_util.h",
- "borealis/borealis_window_manager.cc",
- "borealis/borealis_window_manager.h",
- "borealis/infra/described.h",
- "borealis/infra/expected.h",
- "borealis/infra/state_manager.h",
- "borealis/infra/transition.h",
"browser_context_keyed_service_factories.cc",
"browser_context_keyed_service_factories.h",
"camera_detector.cc",
"camera_detector.h",
- "camera_mic/vm_camera_mic_manager.cc",
- "camera_mic/vm_camera_mic_manager.h",
"camera_presence_notifier.cc",
"camera_presence_notifier.h",
- "cert_provisioning/cert_provisioning_common.cc",
- "cert_provisioning/cert_provisioning_common.h",
- "cert_provisioning/cert_provisioning_invalidator.cc",
- "cert_provisioning/cert_provisioning_invalidator.h",
- "cert_provisioning/cert_provisioning_metrics.cc",
- "cert_provisioning/cert_provisioning_metrics.h",
- "cert_provisioning/cert_provisioning_platform_keys_helpers.cc",
- "cert_provisioning/cert_provisioning_platform_keys_helpers.h",
- "cert_provisioning/cert_provisioning_scheduler.cc",
- "cert_provisioning/cert_provisioning_scheduler.h",
- "cert_provisioning/cert_provisioning_scheduler_user_service.cc",
- "cert_provisioning/cert_provisioning_scheduler_user_service.h",
- "cert_provisioning/cert_provisioning_serializer.cc",
- "cert_provisioning/cert_provisioning_serializer.h",
- "cert_provisioning/cert_provisioning_worker.cc",
- "cert_provisioning/cert_provisioning_worker.h",
"child_accounts/child_policy_observer.cc",
"child_accounts/child_policy_observer.h",
"child_accounts/child_status_reporting_service.cc",
@@ -1323,12 +1796,6 @@ source_set("chromeos") {
"child_accounts/family_user_parental_control_metrics.h",
"child_accounts/family_user_session_metrics.cc",
"child_accounts/family_user_session_metrics.h",
- "child_accounts/parent_access_code/authenticator.cc",
- "child_accounts/parent_access_code/authenticator.h",
- "child_accounts/parent_access_code/config_source.cc",
- "child_accounts/parent_access_code/config_source.h",
- "child_accounts/parent_access_code/parent_access_service.cc",
- "child_accounts/parent_access_code/parent_access_service.h",
"child_accounts/screen_time_controller.cc",
"child_accounts/screen_time_controller.h",
"child_accounts/screen_time_controller_factory.cc",
@@ -1378,55 +1845,6 @@ source_set("chromeos") {
"chrome_content_browser_client_chromeos_part.h",
"concierge_helper_service.cc",
"concierge_helper_service.h",
- "crosapi/browser_loader.cc",
- "crosapi/browser_loader.h",
- "crosapi/browser_manager.cc",
- "crosapi/browser_manager.h",
- "crosapi/browser_manager_observer.h",
- "crosapi/browser_service_host_ash.cc",
- "crosapi/browser_service_host_ash.h",
- "crosapi/browser_service_host_observer.h",
- "crosapi/browser_util.cc",
- "crosapi/browser_util.h",
- "crosapi/cert_database_ash.cc",
- "crosapi/cert_database_ash.h",
- "crosapi/clipboard_ash.cc",
- "crosapi/clipboard_ash.h",
- "crosapi/crosapi_ash.cc",
- "crosapi/crosapi_ash.h",
- "crosapi/crosapi_id.h",
- "crosapi/crosapi_manager.cc",
- "crosapi/crosapi_manager.h",
- "crosapi/device_attributes_ash.cc",
- "crosapi/device_attributes_ash.h",
- "crosapi/environment_provider.cc",
- "crosapi/environment_provider.h",
- "crosapi/fake_browser_manager.cc",
- "crosapi/fake_browser_manager.h",
- "crosapi/feedback_ash.cc",
- "crosapi/feedback_ash.h",
- "crosapi/file_manager_ash.cc",
- "crosapi/file_manager_ash.h",
- "crosapi/keystore_service_ash.cc",
- "crosapi/keystore_service_ash.h",
- "crosapi/message_center_ash.cc",
- "crosapi/message_center_ash.h",
- "crosapi/metrics_reporting_ash.cc",
- "crosapi/metrics_reporting_ash.h",
- "crosapi/prefs_ash.cc",
- "crosapi/prefs_ash.h",
- "crosapi/screen_manager_ash.cc",
- "crosapi/screen_manager_ash.h",
- "crosapi/select_file_ash.cc",
- "crosapi/select_file_ash.h",
- "crosapi/test_controller_ash.cc",
- "crosapi/test_controller_ash.h",
- "crosapi/test_mojo_connection_manager.cc",
- "crosapi/test_mojo_connection_manager.h",
- "crosapi/url_handler_ash.cc",
- "crosapi/url_handler_ash.h",
- "crosapi/window_util.cc",
- "crosapi/window_util.h",
"crostini/ansible/ansible_management_service.cc",
"crostini/ansible/ansible_management_service.h",
"crostini/ansible/ansible_management_service_factory.cc",
@@ -1448,6 +1866,8 @@ source_set("chromeos") {
"crostini/crostini_installer.cc",
"crostini/crostini_installer.h",
"crostini/crostini_installer_ui_delegate.h",
+ "crostini/crostini_low_disk_notification.cc",
+ "crostini/crostini_low_disk_notification.h",
"crostini/crostini_manager.cc",
"crostini/crostini_manager.h",
"crostini/crostini_manager_factory.cc",
@@ -1519,6 +1939,8 @@ source_set("chromeos") {
"dbus/dbus_helper.h",
"dbus/drive_file_stream_service_provider.cc",
"dbus/drive_file_stream_service_provider.h",
+ "dbus/encrypted_reporting_service_provider.cc",
+ "dbus/encrypted_reporting_service_provider.h",
"dbus/kiosk_info_service_provider.cc",
"dbus/kiosk_info_service_provider.h",
"dbus/libvda_service_provider.cc",
@@ -1553,16 +1975,6 @@ source_set("chromeos") {
"device_sync/device_sync_client_factory.h",
"display/quirks_manager_delegate_impl.cc",
"display/quirks_manager_delegate_impl.h",
- "drive/drive_integration_service.cc",
- "drive/drive_integration_service.h",
- "drive/drivefs_native_message_host.cc",
- "drive/drivefs_native_message_host.h",
- "drive/file_system_util.cc",
- "drive/file_system_util.h",
- "drive/fileapi/drivefs_async_file_util.cc",
- "drive/fileapi/drivefs_async_file_util.h",
- "drive/fileapi/drivefs_file_system_backend_delegate.cc",
- "drive/fileapi/drivefs_file_system_backend_delegate.h",
"eche_app/eche_app_manager_factory.cc",
"eche_app/eche_app_manager_factory.h",
"eol_notification.cc",
@@ -1800,6 +2212,10 @@ source_set("chromeos") {
"first_run/first_run.h",
"full_restore/app_launch_handler.cc",
"full_restore/app_launch_handler.h",
+ "full_restore/full_restore_arc_task_handler.cc",
+ "full_restore/full_restore_arc_task_handler.h",
+ "full_restore/full_restore_arc_task_handler_factory.cc",
+ "full_restore/full_restore_arc_task_handler_factory.h",
"full_restore/full_restore_data_handler.cc",
"full_restore/full_restore_data_handler.h",
"full_restore/full_restore_prefs.cc",
@@ -1810,20 +2226,8 @@ source_set("chromeos") {
"full_restore/full_restore_service_factory.h",
"full_restore/new_user_restore_pref_handler.cc",
"full_restore/new_user_restore_pref_handler.h",
- "guest_os/guest_os_external_protocol_handler.cc",
- "guest_os/guest_os_external_protocol_handler.h",
- "guest_os/guest_os_pref_names.cc",
- "guest_os/guest_os_pref_names.h",
- "guest_os/guest_os_registry_service.cc",
- "guest_os/guest_os_registry_service.h",
- "guest_os/guest_os_registry_service_factory.cc",
- "guest_os/guest_os_registry_service_factory.h",
- "guest_os/guest_os_share_path.cc",
- "guest_os/guest_os_share_path.h",
- "guest_os/guest_os_share_path_factory.cc",
- "guest_os/guest_os_share_path_factory.h",
- "guest_os/guest_os_stability_monitor.cc",
- "guest_os/guest_os_stability_monitor.h",
+ "hats/hats_config.cc",
+ "hats/hats_config.h",
"hats/hats_dialog.cc",
"hats/hats_dialog.h",
"hats/hats_finch_helper.cc",
@@ -1917,212 +2321,8 @@ source_set("chromeos") {
"launcher_search_provider/launcher_search_provider_service_factory.h",
"locale_change_guard.cc",
"locale_change_guard.h",
- "lock_screen_apps/app_manager.h",
- "lock_screen_apps/app_manager_impl.cc",
- "lock_screen_apps/app_manager_impl.h",
- "lock_screen_apps/app_window_metrics_tracker.cc",
- "lock_screen_apps/app_window_metrics_tracker.h",
- "lock_screen_apps/first_app_run_toast_manager.cc",
- "lock_screen_apps/first_app_run_toast_manager.h",
- "lock_screen_apps/focus_cycler_delegate.h",
- "lock_screen_apps/lock_screen_profile_creator.cc",
- "lock_screen_apps/lock_screen_profile_creator.h",
- "lock_screen_apps/lock_screen_profile_creator_impl.cc",
- "lock_screen_apps/lock_screen_profile_creator_impl.h",
- "lock_screen_apps/state_controller.cc",
- "lock_screen_apps/state_controller.h",
- "lock_screen_apps/state_observer.h",
- "lock_screen_apps/toast_dialog_view.cc",
- "lock_screen_apps/toast_dialog_view.h",
"logging.cc",
"logging.h",
- "login/challenge_response_auth_keys_loader.cc",
- "login/challenge_response_auth_keys_loader.h",
- "login/chrome_restart_request.cc",
- "login/chrome_restart_request.h",
- "login/configuration_keys.cc",
- "login/configuration_keys.h",
- "login/enterprise_user_session_metrics.cc",
- "login/enterprise_user_session_metrics.h",
- "login/error_screens_histogram_helper.cc",
- "login/error_screens_histogram_helper.h",
- "login/existing_user_controller.cc",
- "login/existing_user_controller.h",
- "login/help_app_launcher.cc",
- "login/help_app_launcher.h",
- "login/helper.cc",
- "login/helper.h",
- "login/hwid_checker.cc",
- "login/hwid_checker.h",
- "login/lock_screen_utils.cc",
- "login/lock_screen_utils.h",
- "login/login_auth_recorder.cc",
- "login/login_auth_recorder.h",
- "login/login_client_cert_usage_observer.cc",
- "login/login_client_cert_usage_observer.h",
- "login/login_pref_names.cc",
- "login/login_pref_names.h",
- "login/login_screen_extensions_lifetime_manager.cc",
- "login/login_screen_extensions_lifetime_manager.h",
- "login/login_screen_extensions_storage_cleaner.cc",
- "login/login_screen_extensions_storage_cleaner.h",
- "login/login_wizard.h",
- "login/marketing_backend_connector.cc",
- "login/marketing_backend_connector.h",
- "login/mojo_system_info_dispatcher.cc",
- "login/mojo_system_info_dispatcher.h",
- "login/oobe_configuration.cc",
- "login/oobe_configuration.h",
- "login/oobe_screen.cc",
- "login/oobe_screen.h",
- "login/profile_auth_data.cc",
- "login/profile_auth_data.h",
- "login/reauth_stats.cc",
- "login/reauth_stats.h",
- "login/screen_manager.cc",
- "login/screen_manager.h",
- "login/security_token_pin_dialog_host_ash_impl.cc",
- "login/security_token_pin_dialog_host_ash_impl.h",
- "login/security_token_session_controller.cc",
- "login/security_token_session_controller.h",
- "login/security_token_session_controller_factory.cc",
- "login/security_token_session_controller_factory.h",
- "login/session/chrome_session_manager.cc",
- "login/session/chrome_session_manager.h",
- "login/session/user_session_initializer.cc",
- "login/session/user_session_initializer.h",
- "login/session/user_session_manager.cc",
- "login/session/user_session_manager.h",
- "login/signin/auth_error_observer.cc",
- "login/signin/auth_error_observer.h",
- "login/signin/auth_error_observer_factory.cc",
- "login/signin/auth_error_observer_factory.h",
- "login/signin/merge_session_navigation_throttle.cc",
- "login/signin/merge_session_navigation_throttle.h",
- "login/signin/merge_session_throttling_utils.cc",
- "login/signin/merge_session_throttling_utils.h",
- "login/signin/oauth2_login_manager.cc",
- "login/signin/oauth2_login_manager.h",
- "login/signin/oauth2_login_manager_factory.cc",
- "login/signin/oauth2_login_manager_factory.h",
- "login/signin/oauth2_login_verifier.cc",
- "login/signin/oauth2_login_verifier.h",
- "login/signin/oauth2_token_fetcher.cc",
- "login/signin/oauth2_token_fetcher.h",
- "login/signin/oauth2_token_initializer.cc",
- "login/signin/oauth2_token_initializer.h",
- "login/signin/offline_signin_limiter.cc",
- "login/signin/offline_signin_limiter.h",
- "login/signin/offline_signin_limiter_factory.cc",
- "login/signin/offline_signin_limiter_factory.h",
- "login/signin/signin_error_notifier_ash.cc",
- "login/signin/signin_error_notifier_ash.h",
- "login/signin/signin_error_notifier_factory_ash.cc",
- "login/signin/signin_error_notifier_factory_ash.h",
- "login/signin/token_handle_fetcher.cc",
- "login/signin/token_handle_fetcher.h",
- "login/signin/token_handle_util.cc",
- "login/signin/token_handle_util.h",
- "login/signin_partition_manager.cc",
- "login/signin_partition_manager.h",
- "login/signin_specifics.h",
- "login/startup_utils.cc",
- "login/startup_utils.h",
- "login/ui/captive_portal_view.cc",
- "login/ui/captive_portal_view.h",
- "login/ui/captive_portal_window_proxy.cc",
- "login/ui/captive_portal_window_proxy.h",
- "login/ui/input_events_blocker.cc",
- "login/ui/input_events_blocker.h",
- "login/ui/kiosk_app_menu_controller.cc",
- "login/ui/kiosk_app_menu_controller.h",
- "login/ui/login_display.cc",
- "login/ui/login_display.h",
- "login/ui/login_display_host.cc",
- "login/ui/login_display_host.h",
- "login/ui/login_display_host_common.cc",
- "login/ui/login_display_host_common.h",
- "login/ui/login_display_host_mojo.cc",
- "login/ui/login_display_host_mojo.h",
- "login/ui/login_display_host_webui.cc",
- "login/ui/login_display_host_webui.h",
- "login/ui/login_display_mojo.cc",
- "login/ui/login_display_mojo.h",
- "login/ui/login_display_webui.cc",
- "login/ui/login_display_webui.h",
- "login/ui/login_feedback.cc",
- "login/ui/login_feedback.h",
- "login/ui/login_screen_extension_ui/create_options.cc",
- "login/ui/login_screen_extension_ui/create_options.h",
- "login/ui/login_screen_extension_ui/dialog_delegate.cc",
- "login/ui/login_screen_extension_ui/dialog_delegate.h",
- "login/ui/login_screen_extension_ui/web_dialog_view.cc",
- "login/ui/login_screen_extension_ui/web_dialog_view.h",
- "login/ui/login_screen_extension_ui/window.cc",
- "login/ui/login_screen_extension_ui/window.h",
- "login/ui/login_web_dialog.cc",
- "login/ui/login_web_dialog.h",
- "login/ui/oobe_dialog_size_utils.cc",
- "login/ui/oobe_dialog_size_utils.h",
- "login/ui/oobe_ui_dialog_delegate.cc",
- "login/ui/oobe_ui_dialog_delegate.h",
- "login/ui/signin_ui.h",
- "login/ui/simple_web_view_dialog.cc",
- "login/ui/simple_web_view_dialog.h",
- "login/ui/user_adding_screen.cc",
- "login/ui/user_adding_screen.h",
- "login/ui/user_adding_screen_input_methods_controller.cc",
- "login/ui/user_adding_screen_input_methods_controller.h",
- "login/ui/views/user_board_view.h",
- "login/ui/web_contents_forced_title.cc",
- "login/ui/web_contents_forced_title.h",
- "login/ui/webui_accelerator_mapping.cc",
- "login/ui/webui_accelerator_mapping.h",
- "login/ui/webui_login_view.cc",
- "login/ui/webui_login_view.h",
- "login/user_board_view_mojo.cc",
- "login/user_board_view_mojo.h",
- "login/user_flow.cc",
- "login/user_flow.h",
- "login/users/affiliation.cc",
- "login/users/affiliation.h",
- "login/users/avatar/user_image_loader.cc",
- "login/users/avatar/user_image_loader.h",
- "login/users/avatar/user_image_manager.cc",
- "login/users/avatar/user_image_manager.h",
- "login/users/avatar/user_image_manager_impl.cc",
- "login/users/avatar/user_image_manager_impl.h",
- "login/users/avatar/user_image_sync_observer.cc",
- "login/users/avatar/user_image_sync_observer.h",
- "login/users/chrome_user_manager.cc",
- "login/users/chrome_user_manager.h",
- "login/users/chrome_user_manager_impl.cc",
- "login/users/chrome_user_manager_impl.h",
- "login/users/chrome_user_manager_util.cc",
- "login/users/chrome_user_manager_util.h",
- "login/users/default_user_image/default_user_images.cc",
- "login/users/default_user_image/default_user_images.h",
- "login/users/multi_profile_user_controller.cc",
- "login/users/multi_profile_user_controller.h",
- "login/users/multi_profile_user_controller_delegate.h",
- "login/users/scoped_test_user_manager.cc",
- "login/users/scoped_test_user_manager.h",
- "login/users/supervised_user_manager.h",
- "login/users/supervised_user_manager_impl.cc",
- "login/users/supervised_user_manager_impl.h",
- "login/users/test_users.cc",
- "login/users/test_users.h",
- "login/users/user_manager_interface.h",
- "login/version_info_updater.cc",
- "login/version_info_updater.h",
- "login/version_updater/update_time_estimator.cc",
- "login/version_updater/update_time_estimator.h",
- "login/version_updater/version_updater.cc",
- "login/version_updater/version_updater.h",
- "login/wizard_context.cc",
- "login/wizard_context.h",
- "login/wizard_controller.cc",
- "login/wizard_controller.h",
"multidevice_setup/auth_token_validator_factory.cc",
"multidevice_setup/auth_token_validator_factory.h",
"multidevice_setup/auth_token_validator_impl.cc",
@@ -2203,20 +2403,14 @@ source_set("chromeos") {
"net/network_throttling_observer.h",
"net/shill_error.cc",
"net/shill_error.h",
+ "net/system_proxy_manager.cc",
+ "net/system_proxy_manager.h",
"network_change_manager_client.cc",
"network_change_manager_client.h",
- "night_light/night_light_client.cc",
- "night_light/night_light_client.h",
"note_taking_controller_client.cc",
"note_taking_controller_client.h",
"note_taking_helper.cc",
"note_taking_helper.h",
- "ownership/fake_owner_settings_service.cc",
- "ownership/fake_owner_settings_service.h",
- "ownership/owner_settings_service_chromeos.cc",
- "ownership/owner_settings_service_chromeos.h",
- "ownership/owner_settings_service_chromeos_factory.cc",
- "ownership/owner_settings_service_chromeos_factory.h",
"phonehub/browser_tabs_metadata_fetcher_impl.cc",
"phonehub/browser_tabs_metadata_fetcher_impl.h",
"phonehub/browser_tabs_model_provider_impl.cc",
@@ -2255,35 +2449,6 @@ source_set("chromeos") {
"platform_keys/platform_keys_service_factory.cc",
"platform_keys/platform_keys_service_factory.h",
"platform_keys/platform_keys_service_nss.cc",
- "plugin_vm/plugin_vm_drive_image_download_service.cc",
- "plugin_vm/plugin_vm_drive_image_download_service.h",
- "plugin_vm/plugin_vm_engagement_metrics_service.cc",
- "plugin_vm/plugin_vm_engagement_metrics_service.h",
- "plugin_vm/plugin_vm_features.cc",
- "plugin_vm/plugin_vm_features.h",
- "plugin_vm/plugin_vm_files.cc",
- "plugin_vm/plugin_vm_files.h",
- "plugin_vm/plugin_vm_image_download_client.cc",
- "plugin_vm/plugin_vm_image_download_client.h",
- "plugin_vm/plugin_vm_installer.cc",
- "plugin_vm/plugin_vm_installer.h",
- "plugin_vm/plugin_vm_installer_factory.cc",
- "plugin_vm/plugin_vm_installer_factory.h",
- "plugin_vm/plugin_vm_license_checker.cc",
- "plugin_vm/plugin_vm_license_checker.h",
- "plugin_vm/plugin_vm_manager.h",
- "plugin_vm/plugin_vm_manager_factory.cc",
- "plugin_vm/plugin_vm_manager_factory.h",
- "plugin_vm/plugin_vm_manager_impl.cc",
- "plugin_vm/plugin_vm_manager_impl.h",
- "plugin_vm/plugin_vm_metrics_util.cc",
- "plugin_vm/plugin_vm_metrics_util.h",
- "plugin_vm/plugin_vm_pref_names.cc",
- "plugin_vm/plugin_vm_pref_names.h",
- "plugin_vm/plugin_vm_uninstaller_notification.cc",
- "plugin_vm/plugin_vm_uninstaller_notification.h",
- "plugin_vm/plugin_vm_util.cc",
- "plugin_vm/plugin_vm_util.h",
"policy/active_directory_join_delegate.h",
"policy/active_directory_policy_manager.cc",
"policy/active_directory_policy_manager.h",
@@ -2572,8 +2737,8 @@ source_set("chromeos") {
"policy/system_features_disable_list_policy_handler.h",
"policy/system_log_uploader.cc",
"policy/system_log_uploader.h",
- "policy/system_proxy_manager.cc",
- "policy/system_proxy_manager.h",
+ "policy/system_proxy_handler.cc",
+ "policy/system_proxy_handler.h",
"policy/tpm_auto_update_mode_policy_handler.cc",
"policy/tpm_auto_update_mode_policy_handler.h",
"policy/upload_job.h",
@@ -2723,6 +2888,10 @@ source_set("chromeos") {
"printing/history/print_job_history_service_impl.h",
"printing/history/print_job_info_proto_conversions.cc",
"printing/history/print_job_info_proto_conversions.h",
+ "printing/history/print_job_reporting_service.h",
+ "printing/history/print_job_reporting_service_factory.cc",
+ "printing/history/print_job_reporting_service_factory.h",
+ "printing/history/print_job_reporting_service_impl.cc",
"printing/ppd_provider_factory.cc",
"printing/ppd_provider_factory.h",
"printing/ppd_resolution_state.cc",
@@ -2797,27 +2966,6 @@ source_set("chromeos") {
"remote_apps/remote_apps_model.cc",
"remote_apps/remote_apps_model.h",
"remote_apps/remote_apps_types.h",
- "scanning/lorgnette_scanner_manager.cc",
- "scanning/lorgnette_scanner_manager.h",
- "scanning/lorgnette_scanner_manager_factory.cc",
- "scanning/lorgnette_scanner_manager_factory.h",
- "scanning/lorgnette_scanner_manager_util.cc",
- "scanning/lorgnette_scanner_manager_util.h",
- "scanning/scan_service.cc",
- "scanning/scan_service.h",
- "scanning/scan_service_factory.cc",
- "scanning/scan_service_factory.h",
- "scanning/scanner_detector.h",
- "scanning/scanning_paths_provider_impl.cc",
- "scanning/scanning_paths_provider_impl.h",
- "scanning/scanning_type_converters.cc",
- "scanning/scanning_type_converters.h",
- "scanning/scanning_util.cc",
- "scanning/scanning_util.h",
- "scanning/zeroconf_scanner_detector.cc",
- "scanning/zeroconf_scanner_detector.h",
- "scanning/zeroconf_scanner_detector_utils.cc",
- "scanning/zeroconf_scanner_detector_utils.h",
"scheduler_configuration_manager.cc",
"scheduler_configuration_manager.h",
"secure_channel/nearby_connection_broker.cc",
@@ -2923,93 +3071,10 @@ source_set("chromeos") {
"tpm_firmware_update_notification.h",
"u2f_notification.cc",
"u2f_notification.h",
- "ui/adb_sideloading_policy_change_notification.cc",
- "ui/adb_sideloading_policy_change_notification.h",
- "ui/echo_dialog_listener.h",
- "ui/echo_dialog_view.cc",
- "ui/echo_dialog_view.h",
- "ui/gnubby_notification.cc",
- "ui/gnubby_notification.h",
- "ui/idle_app_name_notification_view.cc",
- "ui/idle_app_name_notification_view.h",
- "ui/kiosk_external_update_notification.cc",
- "ui/kiosk_external_update_notification.h",
- "ui/low_disk_notification.cc",
- "ui/low_disk_notification.h",
- "ui/passphrase_textfield.cc",
- "ui/passphrase_textfield.h",
- "ui/request_pin_view.cc",
- "ui/request_pin_view.h",
- "ui/request_system_proxy_credentials_view.cc",
- "ui/request_system_proxy_credentials_view.h",
- "ui/screen_capture_notification_ui_chromeos.cc",
- "ui/screen_capture_notification_ui_chromeos.h",
- "ui/system_proxy_notification.cc",
- "ui/system_proxy_notification.h",
- "ui/tpm_auto_update_notification.cc",
- "ui/tpm_auto_update_notification.h",
- "ui/update_required_notification.cc",
- "ui/update_required_notification.h",
"usb/cros_usb_detector.cc",
"usb/cros_usb_detector.h",
- "virtual_machines/virtual_machines_util.cc",
- "virtual_machines/virtual_machines_util.h",
"vm_shutdown_observer.h",
"vm_starting_observer.h",
- "web_applications/camera_system_web_app_info.cc",
- "web_applications/camera_system_web_app_info.h",
- "web_applications/chrome_camera_app_ui_constants.h",
- "web_applications/chrome_camera_app_ui_delegate.cc",
- "web_applications/chrome_camera_app_ui_delegate.h",
- "web_applications/chrome_help_app_ui_delegate.cc",
- "web_applications/chrome_help_app_ui_delegate.h",
- "web_applications/chrome_media_app_ui_delegate.cc",
- "web_applications/chrome_media_app_ui_delegate.h",
- "web_applications/connectivity_diagnostics_system_web_app_info.cc",
- "web_applications/connectivity_diagnostics_system_web_app_info.h",
- "web_applications/crosh_loader.cc",
- "web_applications/crosh_loader.h",
- "web_applications/crosh_loader_factory.cc",
- "web_applications/crosh_loader_factory.h",
- "web_applications/crosh_system_web_app_info.cc",
- "web_applications/crosh_system_web_app_info.h",
- "web_applications/diagnostics_system_web_app_info.cc",
- "web_applications/diagnostics_system_web_app_info.h",
- "web_applications/eche_app_info.cc",
- "web_applications/eche_app_info.h",
- "web_applications/help_app_web_app_info.cc",
- "web_applications/help_app_web_app_info.h",
- "web_applications/media_web_app_info.cc",
- "web_applications/media_web_app_info.h",
- "web_applications/os_settings_web_app_info.cc",
- "web_applications/os_settings_web_app_info.h",
- "web_applications/print_management_web_app_info.cc",
- "web_applications/print_management_web_app_info.h",
- "web_applications/scanning_system_web_app_info.cc",
- "web_applications/scanning_system_web_app_info.h",
- "web_applications/system_web_app_install_utils.cc",
- "web_applications/system_web_app_install_utils.h",
- "web_applications/terminal_source.cc",
- "web_applications/terminal_source.h",
- "web_applications/terminal_system_web_app_info.cc",
- "web_applications/terminal_system_web_app_info.h",
- "web_applications/terminal_ui.cc",
- "web_applications/terminal_ui.h",
- "wilco_dtc_supportd/fake_wilco_dtc_supportd_client.cc",
- "wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_bridge.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_client.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_client.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_manager.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_manager.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_messaging.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_network_context.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.h",
"window_throttle_observer_base.cc",
"window_throttle_observer_base.h",
@@ -3177,14 +3242,14 @@ source_set("chromeos") {
"//chromeos/resources:telemetry_extension_resources",
]
sources += [
- "web_applications/chrome_file_manager_ui_delegate.cc",
- "web_applications/chrome_file_manager_ui_delegate.h",
- "web_applications/file_manager_web_app_info.cc",
- "web_applications/file_manager_web_app_info.h",
- "web_applications/sample_system_web_app_info.cc",
- "web_applications/sample_system_web_app_info.h",
- "web_applications/telemetry_extension_web_app_info.cc",
- "web_applications/telemetry_extension_web_app_info.h",
+ "../ash/web_applications/chrome_file_manager_ui_delegate.cc",
+ "../ash/web_applications/chrome_file_manager_ui_delegate.h",
+ "../ash/web_applications/file_manager_web_app_info.cc",
+ "../ash/web_applications/file_manager_web_app_info.h",
+ "../ash/web_applications/sample_system_web_app_info.cc",
+ "../ash/web_applications/sample_system_web_app_info.h",
+ "../ash/web_applications/telemetry_extension_web_app_info.cc",
+ "../ash/web_applications/telemetry_extension_web_app_info.h",
]
}
@@ -3217,6 +3282,9 @@ source_set("chromeos") {
"//chromeos/dbus/chromebox_for_meetings",
"//chromeos/services/chromebox_for_meetings/public/cpp",
"//chromeos/services/chromebox_for_meetings/public/mojom",
+ "//components/reporting/client:report_queue",
+ "//components/reporting/client:report_queue_configuration",
+ "//components/reporting/client:report_queue_provider",
"//components/reporting/proto:record_constants",
"//components/variations/field_trial_config",
]
@@ -3257,10 +3325,10 @@ static_library("arc_test_support") {
testonly = true
sources = [
- "arc/test/arc_data_removed_waiter.cc",
- "arc/test/arc_data_removed_waiter.h",
- "arc/test/test_arc_session_manager.cc",
- "arc/test/test_arc_session_manager.h",
+ "../ash/arc/test/arc_data_removed_waiter.cc",
+ "../ash/arc/test/arc_data_removed_waiter.h",
+ "../ash/arc/test/test_arc_session_manager.cc",
+ "../ash/arc/test/test_arc_session_manager.h",
]
deps = [
@@ -3278,14 +3346,34 @@ static_library("test_support") {
"../ash/app_mode/test_kiosk_extension_builder.h",
"../ash/app_mode/web_app/mock_web_kiosk_app_launcher.cc",
"../ash/app_mode/web_app/mock_web_kiosk_app_launcher.h",
+ "../ash/attestation/mock_enrollment_certificate_uploader.cc",
+ "../ash/attestation/mock_enrollment_certificate_uploader.h",
+ "../ash/attestation/mock_machine_certificate_uploader.cc",
+ "../ash/attestation/mock_machine_certificate_uploader.h",
+ "../ash/borealis/borealis_context_manager_mock.cc",
+ "../ash/borealis/borealis_context_manager_mock.h",
+ "../ash/borealis/borealis_service_fake.cc",
+ "../ash/borealis/borealis_service_fake.h",
+ "../ash/borealis/borealis_window_manager_mock.cc",
+ "../ash/borealis/borealis_window_manager_mock.h",
+ "../ash/borealis/borealis_window_manager_test_helper.cc",
+ "../ash/borealis/borealis_window_manager_test_helper.h",
+ "../ash/cert_provisioning/mock_cert_provisioning_scheduler.cc",
+ "../ash/cert_provisioning/mock_cert_provisioning_scheduler.h",
"../ash/certificate_provider/test_certificate_provider_extension.cc",
"../ash/certificate_provider/test_certificate_provider_extension.h",
+ "../ash/drive/drivefs_test_support.cc",
+ "../ash/drive/drivefs_test_support.h",
+ "../ash/lock_screen_apps/fake_lock_screen_profile_creator.cc",
+ "../ash/lock_screen_apps/fake_lock_screen_profile_creator.h",
"../ash/login/demo_mode/demo_mode_test_helper.cc",
"../ash/login/demo_mode/demo_mode_test_helper.h",
"../ash/login/enrollment/enterprise_enrollment_helper_mock.cc",
"../ash/login/enrollment/enterprise_enrollment_helper_mock.h",
"../ash/login/enrollment/mock_enrollment_screen.cc",
"../ash/login/enrollment/mock_enrollment_screen.h",
+ "../ash/login/mock_network_state_helper.cc",
+ "../ash/login/mock_network_state_helper.h",
"../ash/login/screens/mock_error_screen.cc",
"../ash/login/screens/mock_error_screen.h",
"../ash/login/screens/mock_network_screen.cc",
@@ -3296,6 +3384,49 @@ static_library("test_support") {
"../ash/login/screens/mock_welcome_screen.h",
"../ash/login/screens/recommend_apps/fake_recommend_apps_fetcher_delegate.cc",
"../ash/login/screens/recommend_apps/fake_recommend_apps_fetcher_delegate.h",
+ "../ash/login/test/dialog_window_waiter.cc",
+ "../ash/login/test/dialog_window_waiter.h",
+ "../ash/login/test/embedded_test_server_mixin.cc",
+ "../ash/login/test/embedded_test_server_mixin.h",
+ "../ash/login/test/fake_gaia_mixin.cc",
+ "../ash/login/test/fake_gaia_mixin.h",
+ "../ash/login/test/https_forwarder.cc",
+ "../ash/login/test/https_forwarder.h",
+ "../ash/login/test/js_checker.cc",
+ "../ash/login/test/js_checker.h",
+ "../ash/login/test/local_policy_test_server_mixin.cc",
+ "../ash/login/test/local_policy_test_server_mixin.h",
+ "../ash/login/test/local_state_mixin.cc",
+ "../ash/login/test/local_state_mixin.h",
+ "../ash/login/test/logged_in_user_mixin.cc",
+ "../ash/login/test/logged_in_user_mixin.h",
+ "../ash/login/test/login_manager_mixin.cc",
+ "../ash/login/test/login_manager_mixin.h",
+ "../ash/login/test/oobe_auth_page_waiter.cc",
+ "../ash/login/test/oobe_auth_page_waiter.h",
+ "../ash/login/test/oobe_screen_exit_waiter.cc",
+ "../ash/login/test/oobe_screen_exit_waiter.h",
+ "../ash/login/test/oobe_screen_waiter.cc",
+ "../ash/login/test/oobe_screen_waiter.h",
+ "../ash/login/test/scoped_help_app_for_test.cc",
+ "../ash/login/test/scoped_help_app_for_test.h",
+ "../ash/login/test/scoped_policy_update.cc",
+ "../ash/login/test/scoped_policy_update.h",
+ "../ash/login/test/session_flags_manager.cc",
+ "../ash/login/test/session_flags_manager.h",
+ "../ash/login/test/session_manager_state_waiter.cc",
+ "../ash/login/test/session_manager_state_waiter.h",
+ "../ash/login/test/test_condition_waiter.h",
+ "../ash/login/test/test_predicate_waiter.cc",
+ "../ash/login/test/test_predicate_waiter.h",
+ "../ash/login/test/user_policy_mixin.cc",
+ "../ash/login/test/user_policy_mixin.h",
+ "../ash/login/test/wizard_controller_screen_exit_waiter.cc",
+ "../ash/login/test/wizard_controller_screen_exit_waiter.h",
+ "../ash/login/version_updater/mock_version_updater_delegate.cc",
+ "../ash/login/version_updater/mock_version_updater_delegate.h",
+ "../ash/plugin_vm/fake_plugin_vm_features.cc",
+ "../ash/plugin_vm/fake_plugin_vm_features.h",
"../ash/settings/scoped_testing_cros_settings.cc",
"../ash/settings/scoped_testing_cros_settings.h",
"android_sms/fake_android_sms_app_manager.cc",
@@ -3304,20 +3435,6 @@ static_library("test_support") {
"android_sms/fake_android_sms_app_setup_controller.h",
"android_sms/fake_connection_establisher.cc",
"android_sms/fake_connection_establisher.h",
- "attestation/mock_enrollment_certificate_uploader.cc",
- "attestation/mock_enrollment_certificate_uploader.h",
- "attestation/mock_machine_certificate_uploader.cc",
- "attestation/mock_machine_certificate_uploader.h",
- "borealis/borealis_context_manager_mock.cc",
- "borealis/borealis_context_manager_mock.h",
- "borealis/borealis_service_fake.cc",
- "borealis/borealis_service_fake.h",
- "borealis/borealis_window_manager_mock.cc",
- "borealis/borealis_window_manager_mock.h",
- "borealis/borealis_window_manager_test_helper.cc",
- "borealis/borealis_window_manager_test_helper.h",
- "cert_provisioning/mock_cert_provisioning_scheduler.cc",
- "cert_provisioning/mock_cert_provisioning_scheduler.h",
"child_accounts/child_account_test_utils.cc",
"child_accounts/child_account_test_utils.h",
"crostini/ansible/ansible_management_test_helper.cc",
@@ -3328,58 +3445,11 @@ static_library("test_support") {
"crostini/crostini_test_util.h",
"crostini/fake_crostini_features.cc",
"crostini/fake_crostini_features.h",
- "drive/drivefs_test_support.cc",
- "drive/drivefs_test_support.h",
"extensions/test_external_cache.cc",
"extensions/test_external_cache.h",
"file_manager/mount_test_util.cc",
"file_manager/mount_test_util.h",
"input_method/stub_input_method_engine_observer.h",
- "lock_screen_apps/fake_lock_screen_profile_creator.cc",
- "lock_screen_apps/fake_lock_screen_profile_creator.h",
- "login/mock_network_state_helper.cc",
- "login/mock_network_state_helper.h",
- "login/test/dialog_window_waiter.cc",
- "login/test/dialog_window_waiter.h",
- "login/test/embedded_test_server_mixin.cc",
- "login/test/embedded_test_server_mixin.h",
- "login/test/fake_gaia_mixin.cc",
- "login/test/fake_gaia_mixin.h",
- "login/test/https_forwarder.cc",
- "login/test/https_forwarder.h",
- "login/test/js_checker.cc",
- "login/test/js_checker.h",
- "login/test/local_policy_test_server_mixin.cc",
- "login/test/local_policy_test_server_mixin.h",
- "login/test/local_state_mixin.cc",
- "login/test/local_state_mixin.h",
- "login/test/logged_in_user_mixin.cc",
- "login/test/logged_in_user_mixin.h",
- "login/test/login_manager_mixin.cc",
- "login/test/login_manager_mixin.h",
- "login/test/oobe_auth_page_waiter.cc",
- "login/test/oobe_auth_page_waiter.h",
- "login/test/oobe_screen_exit_waiter.cc",
- "login/test/oobe_screen_exit_waiter.h",
- "login/test/oobe_screen_waiter.cc",
- "login/test/oobe_screen_waiter.h",
- "login/test/scoped_help_app_for_test.cc",
- "login/test/scoped_help_app_for_test.h",
- "login/test/scoped_policy_update.cc",
- "login/test/scoped_policy_update.h",
- "login/test/session_flags_manager.cc",
- "login/test/session_flags_manager.h",
- "login/test/session_manager_state_waiter.cc",
- "login/test/session_manager_state_waiter.h",
- "login/test/test_condition_waiter.h",
- "login/test/test_predicate_waiter.cc",
- "login/test/test_predicate_waiter.h",
- "login/test/user_policy_mixin.cc",
- "login/test/user_policy_mixin.h",
- "login/test/wizard_controller_screen_exit_waiter.cc",
- "login/test/wizard_controller_screen_exit_waiter.h",
- "login/version_updater/mock_version_updater_delegate.cc",
- "login/version_updater/mock_version_updater_delegate.h",
"platform_keys/key_permissions/fake_user_private_token_kpm_service.cc",
"platform_keys/key_permissions/fake_user_private_token_kpm_service.h",
"platform_keys/key_permissions/mock_key_permissions_manager.cc",
@@ -3388,8 +3458,8 @@ static_library("test_support") {
"platform_keys/key_permissions/mock_key_permissions_service.h",
"platform_keys/mock_platform_keys_service.cc",
"platform_keys/mock_platform_keys_service.h",
- "plugin_vm/fake_plugin_vm_features.cc",
- "plugin_vm/fake_plugin_vm_features.h",
+ "policy/dlp/dlp_content_manager_test_helper.cc",
+ "policy/dlp/dlp_content_manager_test_helper.h",
"policy/minimum_version_policy_test_helpers.cc",
"policy/minimum_version_policy_test_helpers.h",
"policy/user_policy_test_helper.cc",
@@ -3419,6 +3489,8 @@ static_library("test_support") {
"//chromeos/dbus/cryptohome",
"//chromeos/dbus/cryptohome:cryptohome_proto",
"//chromeos/dbus/session_manager",
+ "//chromeos/dbus/userdataauth:userdataauth",
+ "//chromeos/dbus/userdataauth:userdataauth_proto",
"//chromeos/login/auth",
"//chromeos/services/ime:test_support",
"//chromeos/services/multidevice_setup/public/cpp:test_support",
@@ -3441,7 +3513,6 @@ static_library("test_support") {
"//skia",
"//testing/gmock",
"//testing/gtest",
- "//ui/file_manager/file_manager/test:create_test_main",
"//url",
]
}
@@ -3461,8 +3532,148 @@ source_set("unit_tests") {
"../ash/app_mode/kiosk_session_plugin_handler_unittest.cc",
"../ash/app_mode/startup_app_launcher_unittest.cc",
"../ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc",
+ "../ash/apps/apk_web_app_installer_unittest.cc",
+ "../ash/apps/metrics/intent_handling_metrics_unittest.cc",
+ "../ash/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc",
+ "../ash/arc/accessibility/arc_accessibility_helper_bridge_unittest.cc",
+ "../ash/arc/accessibility/arc_accessibility_test_util.h",
+ "../ash/arc/accessibility/arc_accessibility_util_unittest.cc",
+ "../ash/arc/accessibility/auto_complete_handler_unittest.cc",
+ "../ash/arc/accessibility/ax_tree_source_arc_unittest.cc",
+ "../ash/arc/accessibility/drawer_layout_handler_unittest.cc",
+ "../ash/arc/adbd/arc_adbd_monitor_bridge_unittest.cc",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_menu_builder_unittest.cc",
+ "../ash/arc/app_shortcuts/arc_app_shortcuts_request_unittest.cc",
+ "../ash/arc/arc_demo_mode_delegate_impl_unittest.cc",
+ "../ash/arc/arc_migration_guide_notification_unittest.cc",
+ "../ash/arc/arc_support_host_unittest.cc",
+ "../ash/arc/arc_ui_availability_reporter_unittest.cc",
+ "../ash/arc/arc_util_unittest.cc",
+ "../ash/arc/bluetooth/arc_bluetooth_bridge_unittest.cc",
+ "../ash/arc/bluetooth/arc_bluetooth_task_queue_unittest.cc",
+ "../ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc",
+ "../ash/arc/enterprise/arc_data_snapshotd_delegate_unittest.cc",
+ "../ash/arc/enterprise/arc_force_installed_apps_tracker_unittest.cc",
+ "../ash/arc/enterprise/arc_snapshot_reboot_notification_impl_unittest.cc",
+ "../ash/arc/enterprise/cert_store/arc_cert_installer_unittest.cc",
+ "../ash/arc/extensions/arc_support_message_host_unittest.cc",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_service_unittest.cc",
+ "../ash/arc/file_system_watcher/arc_file_system_watcher_util_unittest.cc",
+ "../ash/arc/file_system_watcher/file_system_scanner_unittest.cc",
+ "../ash/arc/fileapi/arc_content_file_system_async_file_util_unittest.cc",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc",
+ "../ash/arc/fileapi/arc_content_file_system_file_stream_writer_unittest.cc",
+ "../ash/arc/fileapi/arc_content_file_system_url_util_unittest.cc",
+ "../ash/arc/fileapi/arc_documents_provider_root_unittest.cc",
+ "../ash/arc/fileapi/arc_documents_provider_util_unittest.cc",
+ "../ash/arc/fileapi/arc_file_system_bridge_unittest.cc",
+ "../ash/arc/fileapi/arc_file_system_operation_runner_unittest.cc",
+ "../ash/arc/fileapi/arc_select_files_handler_unittest.cc",
+ "../ash/arc/fileapi/arc_select_files_util_unittest.cc",
+ "../ash/arc/fileapi/chrome_content_provider_url_util_unittest.cc",
+ "../ash/arc/fileapi/file_stream_forwarder_unittest.cc",
+ "../ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc",
+ "../ash/arc/input_method_manager/arc_input_method_state_unittest.cc",
+ "../ash/arc/input_method_manager/input_connection_impl_unittest.cc",
+ "../ash/arc/input_method_manager/input_method_prefs_unittest.cc",
+ "../ash/arc/input_method_manager/test_input_method_manager_bridge.cc",
+ "../ash/arc/input_method_manager/test_input_method_manager_bridge.h",
+ "../ash/arc/instance_throttle/arc_active_window_throttle_observer_unittest.cc",
+ "../ash/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc",
+ "../ash/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc",
+ "../ash/arc/instance_throttle/arc_instance_throttle_unittest.cc",
+ "../ash/arc/instance_throttle/arc_pip_window_throttle_observer_unittest.cc",
+ "../ash/arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
+ "../ash/arc/intent_helper/arc_settings_service_unittest.cc",
+ "../ash/arc/intent_helper/open_with_menu_unittest.cc",
+ "../ash/arc/kiosk/arc_kiosk_bridge_unittest.cc",
+ "../ash/arc/notification/arc_provision_notification_service_unittest.cc",
+ "../ash/arc/notification/arc_supervision_transition_notification_unittest.cc",
+ "../ash/arc/optin/arc_terms_of_service_default_negotiator_unittest.cc",
+ "../ash/arc/pip/arc_pip_bridge_unittest.cc",
+ "../ash/arc/policy/arc_policy_bridge_unittest.cc",
+ "../ash/arc/process/arc_process_unittest.cc",
+ "../ash/arc/session/arc_demo_mode_preference_handler_unittest.cc",
+ "../ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc",
+ "../ash/arc/session/arc_provisioning_result_unittest.cc",
+ "../ash/arc/session/arc_session_manager_unittest.cc",
+ "../ash/arc/tracing/arc_app_performance_tracing_unittest.cc",
+ "../ash/arc/tracing/arc_cpu_event_unittest.cc",
+ "../ash/arc/tracing/arc_graphics_jank_detector_unittest.cc",
+ "../ash/arc/tracing/arc_system_model_unittest.cc",
+ "../ash/arc/tracing/arc_system_stat_collector_unittest.cc",
+ "../ash/arc/tracing/arc_tracing_event_matcher_unittest.cc",
+ "../ash/arc/tracing/arc_tracing_model_unittest.cc",
+ "../ash/arc/tracing/arc_value_event_unittest.cc",
+ "../ash/arc/tts/arc_tts_service_unittest.cc",
+ "../ash/arc/wallpaper/arc_wallpaper_service_unittest.cc",
"../ash/assistant/assistant_util_unittest.cc",
+ "../ash/attestation/attestation_ca_client_unittest.cc",
+ "../ash/attestation/attestation_policy_observer_unittest.cc",
+ "../ash/attestation/enrollment_certificate_uploader_impl_unittest.cc",
+ "../ash/attestation/enrollment_policy_observer_unittest.cc",
+ "../ash/attestation/fake_certificate.cc",
+ "../ash/attestation/fake_certificate.h",
+ "../ash/attestation/machine_certificate_uploader_impl_unittest.cc",
+ "../ash/attestation/mock_tpm_challenge_key.cc",
+ "../ash/attestation/mock_tpm_challenge_key.h",
+ "../ash/attestation/mock_tpm_challenge_key_subtle.cc",
+ "../ash/attestation/mock_tpm_challenge_key_subtle.h",
+ "../ash/attestation/platform_verification_flow_unittest.cc",
+ "../ash/attestation/tpm_challenge_key_result_unittest.cc",
+ "../ash/attestation/tpm_challenge_key_subtle_unittest.cc",
+ "../ash/attestation/tpm_challenge_key_unittest.cc",
+ "../ash/authpolicy/authpolicy_credentials_manager_unittest.cc",
+ "../ash/authpolicy/authpolicy_helper_unittest.cc",
+ "../ash/base/file_flusher_unittest.cc",
+ "../ash/bluetooth/debug_logs_manager_unittest.cc",
+ "../ash/borealis/borealis_app_launcher_unittest.cc",
+ "../ash/borealis/borealis_context_manager_unittest.cc",
+ "../ash/borealis/borealis_context_unittest.cc",
+ "../ash/borealis/borealis_features_unittest.cc",
+ "../ash/borealis/borealis_game_mode_controller_unittest.cc",
+ "../ash/borealis/borealis_installer_unittest.cc",
+ "../ash/borealis/borealis_launch_watcher_unittest.cc",
+ "../ash/borealis/borealis_shutdown_monitor_unittest.cc",
+ "../ash/borealis/borealis_task_unittest.cc",
+ "../ash/borealis/borealis_window_manager_unittest.cc",
+ "../ash/borealis/infra/described_unittest.cc",
+ "../ash/borealis/infra/expected_unittest.cc",
+ "../ash/borealis/infra/state_manager_unittest.cc",
+ "../ash/borealis/infra/transition_unittest.cc",
+ "../ash/camera_mic/vm_camera_mic_manager_unittest.cc",
+ "../ash/cert_provisioning/cert_provisioning_invalidator_unittest.cc",
+ "../ash/cert_provisioning/cert_provisioning_platform_keys_helpers_unittest.cc",
+ "../ash/cert_provisioning/cert_provisioning_scheduler_unittest.cc",
+ "../ash/cert_provisioning/cert_provisioning_test_helpers.cc",
+ "../ash/cert_provisioning/cert_provisioning_test_helpers.h",
+ "../ash/cert_provisioning/cert_provisioning_worker_unittest.cc",
+ "../ash/cert_provisioning/mock_cert_provisioning_invalidator.cc",
+ "../ash/cert_provisioning/mock_cert_provisioning_invalidator.h",
+ "../ash/cert_provisioning/mock_cert_provisioning_worker.cc",
+ "../ash/cert_provisioning/mock_cert_provisioning_worker.h",
"../ash/certificate_provider/certificate_provider_service_unittest.cc",
+ "../ash/child_accounts/parent_access_code/authenticator_unittest.cc",
+ "../ash/child_accounts/parent_access_code/parent_access_test_utils.cc",
+ "../ash/child_accounts/parent_access_code/parent_access_test_utils.h",
+ "../ash/crosapi/browser_data_migrator_unittest.cc",
+ "../ash/crosapi/browser_loader_unittest.cc",
+ "../ash/crosapi/browser_manager_unittest.cc",
+ "../ash/crosapi/browser_util_unittest.cc",
+ "../ash/crosapi/message_center_ash_unittest.cc",
+ "../ash/crosapi/metrics_reporting_ash_unittest.cc",
+ "../ash/crosapi/prefs_ash_unittest.cc",
+ "../ash/crosapi/test_mojo_connection_manager_unittest.cc",
+ "../ash/drive/drive_integration_service_unittest.cc",
+ "../ash/drive/drivefs_native_message_host_unittest.cc",
+ "../ash/drive/file_system_util_unittest.cc",
+ "../ash/guest_os/guest_os_external_protocol_handler_unittest.cc",
+ "../ash/guest_os/guest_os_registry_service_unittest.cc",
+ "../ash/guest_os/guest_os_share_path_unittest.cc",
+ "../ash/guest_os/guest_os_stability_monitor_unittest.cc",
+ "../ash/lock_screen_apps/app_manager_impl_unittest.cc",
+ "../ash/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc",
+ "../ash/lock_screen_apps/state_controller_unittest.cc",
"../ash/login/auth/cryptohome_authenticator_unittest.cc",
"../ash/login/demo_mode/demo_extensions_external_loader_unittest.cc",
"../ash/login/demo_mode/demo_mode_detector_unittest.cc",
@@ -3475,8 +3686,17 @@ source_set("unit_tests") {
"../ash/login/easy_unlock/easy_unlock_challenge_wrapper_unittest.cc",
"../ash/login/easy_unlock/easy_unlock_tpm_key_manager_unittest.cc",
"../ash/login/enrollment/enrollment_screen_unittest.cc",
+ "../ash/login/enterprise_user_session_metrics_unittest.cc",
+ "../ash/login/error_screens_histogram_helper_unittest.cc",
+ "../ash/login/existing_user_controller_auto_login_unittest.cc",
+ "../ash/login/existing_user_controller_base_test.cc",
+ "../ash/login/existing_user_controller_base_test.h",
+ "../ash/login/existing_user_controller_forced_online_auth_unittest.cc",
+ "../ash/login/hwid_checker_unittest.cc",
"../ash/login/lock/screen_locker_unittest.cc",
+ "../ash/login/profile_auth_data_unittest.cc",
"../ash/login/quick_unlock/fingerprint_storage_unittest.cc",
+ "../ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc",
"../ash/login/quick_unlock/pin_storage_prefs_unittest.cc",
"../ash/login/quick_unlock/quick_unlock_storage_unittest.cc",
"../ash/login/saml/in_session_password_change_manager_unittest.cc",
@@ -3486,13 +3706,56 @@ source_set("unit_tests") {
"../ash/login/saml/password_expiry_notification_unittest.cc",
"../ash/login/saml/password_sync_token_login_checker_unittest.cc",
"../ash/login/saml/password_sync_token_verifier_unittest.cc",
+ "../ash/login/screens/chromevox_hint/chromevox_hint_detector_unittest.cc",
"../ash/login/screens/encryption_migration_screen_unittest.cc",
"../ash/login/screens/network_screen_unittest.cc",
"../ash/login/screens/recommend_apps/recommend_apps_fetcher_impl_unittest.cc",
"../ash/login/screens/update_required_screen_unittest.cc",
"../ash/login/screens/update_screen_unittest.cc",
+ "../ash/login/session/user_session_manager_test.cc",
+ "../ash/login/signin/offline_signin_limiter_unittest.cc",
+ "../ash/login/signin/signin_error_notifier_ash_unittest.cc",
+ "../ash/login/signin_partition_manager_unittest.cc",
+ "../ash/login/ui/login_screen_extension_ui/dialog_delegate_unittest.cc",
+ "../ash/login/ui/login_screen_extension_ui/web_dialog_view_unittest.cc",
+ "../ash/login/ui/oobe_dialog_size_utils_unittest.cc",
+ "../ash/login/user_online_signin_notifier_unittest.cc",
+ "../ash/login/users/affiliation_unittest.cc",
+ "../ash/login/users/multi_profile_user_controller_unittest.cc",
+ "../ash/login/users/user_manager_unittest.cc",
+ "../ash/login/version_updater/update_time_estimator_unittest.cc",
+ "../ash/login/version_updater/version_updater_unittest.cc",
"../ash/mobile/mobile_activator_unittest.cc",
+ "../ash/net/secure_dns_manager_unittest.cc",
+ "../ash/night_light/night_light_client_unittest.cc",
"../ash/notifications/deprecation_notification_controller_unittest.cc",
+ "../ash/notifications/echo_dialog_view_unittest.cc",
+ "../ash/notifications/gnubby_notification_unittest.cc",
+ "../ash/notifications/idle_app_name_notification_view_unittest.cc",
+ "../ash/notifications/low_disk_notification_unittest.cc",
+ "../ash/notifications/mock_adb_sideloading_policy_change_notification.cc",
+ "../ash/notifications/mock_adb_sideloading_policy_change_notification.h",
+ "../ash/notifications/request_system_proxy_credentials_view_unittest.cc",
+ "../ash/notifications/update_required_notification_unittest.cc",
+ "../ash/ownership/owner_settings_service_ash_unittest.cc",
+ "../ash/plugin_vm/mock_plugin_vm_manager.cc",
+ "../ash/plugin_vm/mock_plugin_vm_manager.h",
+ "../ash/plugin_vm/plugin_vm_features_unittest.cc",
+ "../ash/plugin_vm/plugin_vm_files_unittest.cc",
+ "../ash/plugin_vm/plugin_vm_installer_unittest.cc",
+ "../ash/plugin_vm/plugin_vm_manager_impl_unittest.cc",
+ "../ash/plugin_vm/plugin_vm_test_helper.cc",
+ "../ash/plugin_vm/plugin_vm_test_helper.h",
+ "../ash/plugin_vm/plugin_vm_util_unittest.cc",
+ "../ash/scanning/chrome_scanning_app_delegate_unittest.cc",
+ "../ash/scanning/fake_lorgnette_scanner_manager.cc",
+ "../ash/scanning/fake_lorgnette_scanner_manager.h",
+ "../ash/scanning/lorgnette_scanner_manager_unittest.cc",
+ "../ash/scanning/lorgnette_scanner_manager_util_unittest.cc",
+ "../ash/scanning/scan_service_factory_unittest.cc",
+ "../ash/scanning/scan_service_unittest.cc",
+ "../ash/scanning/scanning_type_converters_unittest.cc",
+ "../ash/scanning/zeroconf_scanner_detector_unittest.cc",
"../ash/settings/cros_settings_unittest.cc",
"../ash/settings/device_settings_cache_unittest.cc",
"../ash/settings/device_settings_provider_unittest.cc",
@@ -3509,6 +3772,15 @@ source_set("unit_tests") {
"../ash/system_logs/shill_log_source_unittest.cc",
"../ash/system_logs/single_debug_daemon_log_source_unittest.cc",
"../ash/system_logs/single_log_file_log_source_unittest.cc",
+ "../ash/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.cc",
+ "../ash/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h",
+ "../ash/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.cc",
+ "../ash/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge_unittest.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_notification_controller_unittest.cc",
+ "../ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc",
"../download/notification/download_item_notification_unittest.cc",
"../extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc",
"../extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc",
@@ -3526,124 +3798,6 @@ source_set("unit_tests") {
"android_sms/connection_manager_unittest.cc",
"android_sms/fcm_connection_establisher_unittest.cc",
"android_sms/pairing_lost_notifier_unittest.cc",
- "apps/apk_web_app_installer_unittest.cc",
- "apps/metrics/intent_handling_metrics_unittest.cc",
- "arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc",
- "arc/accessibility/arc_accessibility_helper_bridge_unittest.cc",
- "arc/accessibility/arc_accessibility_test_util.h",
- "arc/accessibility/arc_accessibility_util_unittest.cc",
- "arc/accessibility/auto_complete_handler_unittest.cc",
- "arc/accessibility/ax_tree_source_arc_unittest.cc",
- "arc/accessibility/drawer_layout_handler_unittest.cc",
- "arc/adbd/arc_adbd_monitor_bridge_unittest.cc",
- "arc/app_shortcuts/arc_app_shortcuts_menu_builder_unittest.cc",
- "arc/app_shortcuts/arc_app_shortcuts_request_unittest.cc",
- "arc/arc_demo_mode_delegate_impl_unittest.cc",
- "arc/arc_migration_guide_notification_unittest.cc",
- "arc/arc_support_host_unittest.cc",
- "arc/arc_ui_availability_reporter_unittest.cc",
- "arc/arc_util_unittest.cc",
- "arc/bluetooth/arc_bluetooth_bridge_unittest.cc",
- "arc/bluetooth/arc_bluetooth_task_queue_unittest.cc",
- "arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc",
- "arc/enterprise/arc_data_snapshotd_delegate_unittest.cc",
- "arc/enterprise/arc_force_installed_apps_tracker_unittest.cc",
- "arc/enterprise/arc_snapshot_reboot_notification_impl_unittest.cc",
- "arc/enterprise/cert_store/arc_cert_installer_unittest.cc",
- "arc/extensions/arc_support_message_host_unittest.cc",
- "arc/file_system_watcher/arc_file_system_watcher_service_unittest.cc",
- "arc/file_system_watcher/arc_file_system_watcher_util_unittest.cc",
- "arc/file_system_watcher/file_system_scanner_unittest.cc",
- "arc/fileapi/arc_content_file_system_async_file_util_unittest.cc",
- "arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc",
- "arc/fileapi/arc_content_file_system_file_stream_writer_unittest.cc",
- "arc/fileapi/arc_content_file_system_url_util_unittest.cc",
- "arc/fileapi/arc_documents_provider_root_unittest.cc",
- "arc/fileapi/arc_documents_provider_util_unittest.cc",
- "arc/fileapi/arc_file_system_bridge_unittest.cc",
- "arc/fileapi/arc_file_system_operation_runner_unittest.cc",
- "arc/fileapi/arc_select_files_handler_unittest.cc",
- "arc/fileapi/arc_select_files_util_unittest.cc",
- "arc/fileapi/chrome_content_provider_url_util_unittest.cc",
- "arc/fileapi/file_stream_forwarder_unittest.cc",
- "arc/input_method_manager/arc_input_method_manager_service_unittest.cc",
- "arc/input_method_manager/arc_input_method_state_unittest.cc",
- "arc/input_method_manager/input_connection_impl_unittest.cc",
- "arc/input_method_manager/input_method_prefs_unittest.cc",
- "arc/input_method_manager/test_input_method_manager_bridge.cc",
- "arc/input_method_manager/test_input_method_manager_bridge.h",
- "arc/instance_throttle/arc_active_window_throttle_observer_unittest.cc",
- "arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc",
- "arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc",
- "arc/instance_throttle/arc_instance_throttle_unittest.cc",
- "arc/instance_throttle/arc_pip_window_throttle_observer_unittest.cc",
- "arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
- "arc/intent_helper/arc_settings_service_unittest.cc",
- "arc/intent_helper/open_with_menu_unittest.cc",
- "arc/kiosk/arc_kiosk_bridge_unittest.cc",
- "arc/notification/arc_provision_notification_service_unittest.cc",
- "arc/notification/arc_supervision_transition_notification_unittest.cc",
- "arc/optin/arc_terms_of_service_default_negotiator_unittest.cc",
- "arc/pip/arc_pip_bridge_unittest.cc",
- "arc/policy/arc_policy_bridge_unittest.cc",
- "arc/process/arc_process_unittest.cc",
- "arc/session/arc_demo_mode_preference_handler_unittest.cc",
- "arc/session/arc_play_store_enabled_preference_handler_unittest.cc",
- "arc/session/arc_provisioning_result_unittest.cc",
- "arc/session/arc_session_manager_unittest.cc",
- "arc/tracing/arc_app_performance_tracing_unittest.cc",
- "arc/tracing/arc_cpu_event_unittest.cc",
- "arc/tracing/arc_graphics_jank_detector_unittest.cc",
- "arc/tracing/arc_system_model_unittest.cc",
- "arc/tracing/arc_system_stat_collector_unittest.cc",
- "arc/tracing/arc_tracing_event_matcher_unittest.cc",
- "arc/tracing/arc_tracing_model_unittest.cc",
- "arc/tracing/arc_value_event_unittest.cc",
- "arc/tts/arc_tts_service_unittest.cc",
- "arc/wallpaper/arc_wallpaper_service_unittest.cc",
- "attestation/attestation_ca_client_unittest.cc",
- "attestation/attestation_policy_observer_unittest.cc",
- "attestation/enrollment_certificate_uploader_impl_unittest.cc",
- "attestation/enrollment_policy_observer_unittest.cc",
- "attestation/fake_certificate.cc",
- "attestation/fake_certificate.h",
- "attestation/machine_certificate_uploader_impl_unittest.cc",
- "attestation/mock_tpm_challenge_key.cc",
- "attestation/mock_tpm_challenge_key.h",
- "attestation/mock_tpm_challenge_key_subtle.cc",
- "attestation/mock_tpm_challenge_key_subtle.h",
- "attestation/platform_verification_flow_unittest.cc",
- "attestation/tpm_challenge_key_result_unittest.cc",
- "attestation/tpm_challenge_key_subtle_unittest.cc",
- "attestation/tpm_challenge_key_unittest.cc",
- "authpolicy/authpolicy_credentials_manager_unittest.cc",
- "authpolicy/authpolicy_helper.unittest.cc",
- "base/file_flusher_unittest.cc",
- "bluetooth/debug_logs_manager_unittest.cc",
- "borealis/borealis_app_launcher_unittest.cc",
- "borealis/borealis_context_manager_unittest.cc",
- "borealis/borealis_context_unittest.cc",
- "borealis/borealis_features_unittest.cc",
- "borealis/borealis_installer_unittest.cc",
- "borealis/borealis_launch_watcher_unittest.cc",
- "borealis/borealis_shutdown_monitor_unittest.cc",
- "borealis/borealis_task_unittest.cc",
- "borealis/borealis_window_manager_unittest.cc",
- "borealis/infra/described_unittest.cc",
- "borealis/infra/expected_unittest.cc",
- "borealis/infra/state_manager_unittest.cc",
- "borealis/infra/transition_unittest.cc",
- "camera_mic/vm_camera_mic_manager_unittest.cc",
- "cert_provisioning/cert_provisioning_invalidator_unittest.cc",
- "cert_provisioning/cert_provisioning_platform_keys_helpers_unittest.cc",
- "cert_provisioning/cert_provisioning_scheduler_unittest.cc",
- "cert_provisioning/cert_provisioning_test_helpers.cc",
- "cert_provisioning/cert_provisioning_test_helpers.h",
- "cert_provisioning/cert_provisioning_worker_unittest.cc",
- "cert_provisioning/mock_cert_provisioning_invalidator.cc",
- "cert_provisioning/mock_cert_provisioning_invalidator.h",
- "cert_provisioning/mock_cert_provisioning_worker.cc",
- "cert_provisioning/mock_cert_provisioning_worker.h",
"child_accounts/child_user_service_unittest.cc",
"child_accounts/event_based_status_reporting_service_unittest.cc",
"child_accounts/family_user_app_metrics_unittest.cc",
@@ -3651,9 +3805,6 @@ source_set("unit_tests") {
"child_accounts/family_user_metrics_service_unittest.cc",
"child_accounts/family_user_parental_control_metrics_unittest.cc",
"child_accounts/family_user_session_metrics_unittest.cc",
- "child_accounts/parent_access_code/authenticator_unittest.cc",
- "child_accounts/parent_access_code/parent_access_test_utils.cc",
- "child_accounts/parent_access_code/parent_access_test_utils.h",
"child_accounts/secondary_account_consent_logger_unittest.cc",
"child_accounts/time_limit_notifier_unittest.cc",
"child_accounts/time_limit_test_utils.cc",
@@ -3672,18 +3823,13 @@ source_set("unit_tests") {
"child_accounts/usage_time_state_notifier_unittest.cc",
"chrome_content_browser_client_chromeos_part_unittest.cc",
"concierge_helper_service_unittest.cc",
- "crosapi/browser_loader_unittest.cc",
- "crosapi/browser_util_unittest.cc",
- "crosapi/message_center_ash_unittest.cc",
- "crosapi/metrics_reporting_ash_unittest.cc",
- "crosapi/prefs_ash_unittest.cc",
- "crosapi/test_mojo_connection_manager_unittest.cc",
"crostini/ansible/ansible_management_service_unittest.cc",
"crostini/crostini_disk_unittest.cc",
"crostini/crostini_export_import_unittest.cc",
"crostini/crostini_features_unittest.cc",
"crostini/crostini_force_close_watcher_unittest.cc",
"crostini/crostini_installer_unittest.cc",
+ "crostini/crostini_low_disk_notification_unittest.cc",
"crostini/crostini_manager_unittest.cc",
"crostini/crostini_mime_types_service_unittest.cc",
"crostini/crostini_package_notification_unittest.cc",
@@ -3701,11 +3847,9 @@ source_set("unit_tests") {
"crostini/throttle/crostini_throttle_unittest.cc",
"cryptauth/client_app_metadata_provider_service_unittest.cc",
"customization/customization_document_unittest.cc",
+ "dbus/encrypted_reporting_service_provider_unittest.cc",
"dbus/proxy_resolution_service_provider_unittest.cc",
"device_name_store_unittest.cc",
- "drive/drive_integration_service_unittest.cc",
- "drive/drivefs_native_message_host_unittest.cc",
- "drive/file_system_util_unittest.cc",
"eol_notification_unittest.cc",
"events/event_rewriter_unittest.cc",
"exo/chrome_data_exchange_delegate_unittest.cc",
@@ -3798,10 +3942,6 @@ source_set("unit_tests") {
"fileapi/test/fake_recent_source.cc",
"full_restore/full_restore_prefs_unittest.cc",
"full_restore/full_restore_service_unittest.cc",
- "guest_os/guest_os_external_protocol_handler_unittest.cc",
- "guest_os/guest_os_registry_service_unittest.cc",
- "guest_os/guest_os_share_path_unittest.cc",
- "guest_os/guest_os_stability_monitor_unittest.cc",
"hats/hats_finch_helper_unittest.cc",
"hats/hats_notification_controller_unittest.cc",
"input_method/assistive_suggester_unittest.cc",
@@ -3824,27 +3964,7 @@ source_set("unit_tests") {
"kerberos/kerberos_credentials_manager_test.cc",
"kerberos/kerberos_ticket_expiry_notification_test.cc",
"locale_change_guard_unittest.cc",
- "lock_screen_apps/app_manager_impl_unittest.cc",
- "lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc",
- "lock_screen_apps/state_controller_unittest.cc",
- "login/enterprise_user_session_metrics_unittest.cc",
- "login/error_screens_histogram_helper_unittest.cc",
- "login/existing_user_controller_auto_login_unittest.cc",
- "login/existing_user_controller_forced_online_auth_unittest.cc",
- "login/hwid_checker_unittest.cc",
- "login/profile_auth_data_unittest.cc",
- "login/session/user_session_manager_test.cc",
- "login/signin/offline_signin_limiter_unittest.cc",
- "login/signin/signin_error_notifier_ash_unittest.cc",
- "login/signin_partition_manager_unittest.cc",
- "login/ui/login_screen_extension_ui/dialog_delegate_unittest.cc",
- "login/ui/login_screen_extension_ui/web_dialog_view_unittest.cc",
- "login/ui/oobe_dialog_size_utils_unittest.cc",
- "login/users/affiliation_unittest.cc",
- "login/users/multi_profile_user_controller_unittest.cc",
- "login/users/user_manager_unittest.cc",
- "login/version_updater/update_time_estimator_unittest.cc",
- "login/version_updater/version_updater_unittest.cc",
+ "nearby/bluetooth_adapter_manager_unittest.cc",
"nearby/nearby_process_manager_impl_unittest.cc",
"net/client_cert_store_chromeos_unittest.cc",
"net/network_diagnostics/captive_portal_routine_unittest.cc",
@@ -3878,23 +3998,13 @@ source_set("unit_tests") {
"net/network_portal_detector_impl_unittest.cc",
"net/network_pref_state_observer_unittest.cc",
"net/network_throttling_observer_unittest.cc",
+ "net/system_proxy_manager_unittest.cc",
"network_change_manager_client_unittest.cc",
- "night_light/night_light_client_unittest.cc",
"note_taking_helper_unittest.cc",
- "ownership/owner_settings_service_chromeos_unittest.cc",
"phonehub/browser_tabs_metadata_fetcher_impl_unittest.cc",
"phonehub/browser_tabs_model_provider_impl_unittest.cc",
"platform_keys/key_permissions/arc_key_permissions_manager_delegate_unittest.cc",
"platform_keys/key_permissions/key_permissions_service_impl_unittest.cc",
- "plugin_vm/mock_plugin_vm_manager.cc",
- "plugin_vm/mock_plugin_vm_manager.h",
- "plugin_vm/plugin_vm_features_unittest.cc",
- "plugin_vm/plugin_vm_files_unittest.cc",
- "plugin_vm/plugin_vm_installer_unittest.cc",
- "plugin_vm/plugin_vm_manager_impl_unittest.cc",
- "plugin_vm/plugin_vm_test_helper.cc",
- "plugin_vm/plugin_vm_test_helper.h",
- "plugin_vm/plugin_vm_util_unittest.cc",
"policy/active_directory_policy_manager_unittest.cc",
"policy/adb_sideloading_allowance_mode_policy_handler_unittest.cc",
"policy/affiliated_cloud_policy_invalidator_unittest.cc",
@@ -3928,6 +4038,8 @@ source_set("unit_tests") {
"policy/dlp/dlp_clipboard_notifier_unittest.cc",
"policy/dlp/dlp_content_manager_unittest.cc",
"policy/dlp/dlp_content_tab_helper_unittest.cc",
+ "policy/dlp/dlp_data_transfer_notifier_unittest.cc",
+ "policy/dlp/dlp_drag_drop_notifier_unittest.cc",
"policy/dlp/dlp_rules_manager_impl_unittest.cc",
"policy/dlp/dlp_rules_manager_test_utils.cc",
"policy/dlp/dlp_rules_manager_test_utils.h",
@@ -3977,7 +4089,7 @@ source_set("unit_tests") {
"policy/status_uploader_unittest.cc",
"policy/system_features_disable_list_policy_handler_unittest.cc",
"policy/system_log_uploader_unittest.cc",
- "policy/system_proxy_manager_unittest.cc",
+ "policy/system_proxy_handler_unittest.cc",
"policy/tpm_auto_update_mode_policy_handler_unittest.cc",
"policy/upload_job_unittest.cc",
"policy/user_cloud_policy_manager_chromeos_unittest.cc",
@@ -4024,6 +4136,7 @@ source_set("unit_tests") {
"printing/history/print_job_history_cleaner_unittest.cc",
"printing/history/print_job_history_service_impl_unittest.cc",
"printing/history/print_job_info_proto_conversions_unittest.cc",
+ "printing/history/print_job_reporting_service_unittest.cc",
"printing/history/test_print_job_database.cc",
"printing/history/test_print_job_database.h",
"printing/history/test_print_job_history_service_observer.cc",
@@ -4055,16 +4168,6 @@ source_set("unit_tests") {
"release_notes/release_notes_notification_unittest.cc",
"release_notes/release_notes_storage_unittest.cc",
"remote_apps/remote_apps_model_unittest.cc",
- "scanning/fake_lorgnette_scanner_manager.cc",
- "scanning/fake_lorgnette_scanner_manager.h",
- "scanning/lorgnette_scanner_manager_unittest.cc",
- "scanning/lorgnette_scanner_manager_util_unittest.cc",
- "scanning/scan_service_factory_unittest.cc",
- "scanning/scan_service_unittest.cc",
- "scanning/scanning_paths_provider_impl_unittest.cc",
- "scanning/scanning_type_converters_unittest.cc",
- "scanning/scanning_util_unittest.cc",
- "scanning/zeroconf_scanner_detector_unittest.cc",
"scheduler_configuration_manager_unittest.cc",
"secure_channel/nearby_connection_broker_impl_unittest.cc",
"secure_channel/nearby_connector_impl_unittest.cc",
@@ -4096,24 +4199,7 @@ source_set("unit_tests") {
"throttle_observer_unittest.cc",
"throttle_service_unittest.cc",
"tpm_firmware_update_unittest.cc",
- "ui/echo_dialog_view_unittest.cc",
- "ui/gnubby_notification_unittest.cc",
- "ui/idle_app_name_notification_view_unittest.cc",
- "ui/low_disk_notification_unittest.cc",
- "ui/mock_adb_sideloading_policy_change_notification.cc",
- "ui/mock_adb_sideloading_policy_change_notification.h",
- "ui/request_system_proxy_credentials_view_unittest.cc",
- "ui/update_required_notification_unittest.cc",
"usb/cros_usb_detector_unittest.cc",
- "wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.cc",
- "wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h",
- "wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.cc",
- "wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h",
- "wilco_dtc_supportd/wilco_dtc_supportd_bridge_unittest.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_notification_controller_unittest.cc",
- "wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc",
# TODO(zturner): Enable this on Windows. See
# BrowserWithTestWindowTest::SetUp() for a comment explaining why this is
@@ -4189,7 +4275,6 @@ source_set("unit_tests") {
"//chromeos/components/proximity_auth",
"//chromeos/components/proximity_auth:test_support",
"//chromeos/components/tether:test_support",
- "//chromeos/cryptohome:test_support",
"//chromeos/dbus:test_support",
"//chromeos/dbus/attestation",
"//chromeos/dbus/attestation:attestation_proto",
@@ -4198,6 +4283,7 @@ source_set("unit_tests") {
"//chromeos/dbus/cryptohome:attestation_proto",
"//chromeos/dbus/dlcservice:test_support",
"//chromeos/dbus/lorgnette_manager:lorgnette_proto",
+ "//chromeos/dbus/missive",
"//chromeos/dbus/power",
"//chromeos/dbus/services:test_support",
"//chromeos/dbus/session_manager",
@@ -4246,6 +4332,7 @@ source_set("unit_tests") {
"//components/pref_registry",
"//components/prefs:test_support",
"//components/renderer_context_menu",
+ "//components/reporting/storage:missive_storage_module",
"//components/resources",
"//components/services/app_service/public/cpp:test_support",
"//components/session_manager/core",
@@ -4316,7 +4403,7 @@ source_set("unit_tests") {
}
proto_library("attestation_proto") {
- sources = [ "attestation/attestation_key_payload.proto" ]
+ sources = [ "../ash/attestation/attestation_key_payload.proto" ]
}
proto_library("screen_brightness_event_proto") {
@@ -4332,7 +4419,7 @@ proto_library("user_activity_event_proto") {
}
proto_library("backdrop_wallpaper_proto") {
- sources = [ "backdrop_wallpaper_handlers/backdrop_wallpaper.proto" ]
+ sources = [ "../ash/backdrop_wallpaper_handlers/backdrop_wallpaper.proto" ]
generate_python = false
}
diff --git a/chromium/chrome/browser/chromeos/crostini/crostini_types.mojom b/chromium/chrome/browser/chromeos/crostini/crostini_types.mojom
index 16e42565442..f38ca9403c9 100644
--- a/chromium/chrome/browser/chromeos/crostini/crostini_types.mojom
+++ b/chromium/chrome/browser/chromeos/crostini/crostini_types.mojom
@@ -24,6 +24,7 @@ enum InstallerState {
enum InstallerError {
kNone,
kErrorLoadingTermina,
+ kNeedUpdate,
kErrorCreatingDiskImage,
kErrorStartingTermina,
kErrorStartingLxd,
diff --git a/chromium/chrome/browser/chromeos/nearby/BUILD.gn b/chromium/chrome/browser/chromeos/nearby/BUILD.gn
index aedeba2375b..0db2d129b33 100644
--- a/chromium/chrome/browser/chromeos/nearby/BUILD.gn
+++ b/chromium/chrome/browser/chromeos/nearby/BUILD.gn
@@ -5,15 +5,16 @@
# Note: This target is separated from the rest of //chrome/browser/chromeos so
# that it can depend on the bluetooth::mojom::Adapter interface, which is only
# visible to a limited set of clients.
-source_set("bluetooth_adapter_util") {
+source_set("bluetooth_adapter_manager") {
sources = [
- "bluetooth_adapter_util.cc",
- "bluetooth_adapter_util.h",
+ "bluetooth_adapter_manager.cc",
+ "bluetooth_adapter_manager.h",
]
deps = [
"//base",
"//chromeos/services/nearby/public/cpp",
+ "//dbus",
"//device/bluetooth",
"//device/bluetooth:deprecated_experimental_mojo",
"//mojo/public/cpp/bindings",
diff --git a/chromium/chrome/browser/commerce/merchant_viewer/BUILD.gn b/chromium/chrome/browser/commerce/merchant_viewer/BUILD.gn
new file mode 100644
index 00000000000..42dee4320e3
--- /dev/null
+++ b/chromium/chrome/browser/commerce/merchant_viewer/BUILD.gn
@@ -0,0 +1,35 @@
+# Copyright 2021 The Chromium Authors.All rights reserved.
+# Use of this source code is governed by a BSD - style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+import("//testing/test.gni")
+import("//third_party/protobuf/proto_library.gni")
+
+proto_java_library("optimization_guide_protos_java") {
+ proto_path = "proto"
+ sources = [ "$proto_path/merchant_trust_signals.proto" ]
+}
+
+source_set("merchant_signal_db") {
+ sources = [
+ "merchant_signal_db.cc",
+ "merchant_signal_db.h",
+ ]
+
+ deps = [
+ ":merchant_signal_db_content_proto",
+ "//base:base",
+ "//chrome/browser/commerce/merchant_viewer/android:jni_headers",
+ "//chrome/browser/persisted_state_db:persisted_state_db",
+ "//components/embedder_support/android:browser_context",
+ "//components/keyed_service/content",
+ "//components/leveldb_proto",
+ "//content/public/browser:browser",
+ "//third_party/leveldatabase",
+ ]
+}
+
+proto_library("merchant_signal_db_content_proto") {
+ sources = [ "merchant_signal_db_content.proto" ]
+}
diff --git a/chromium/chrome/browser/commerce/merchant_viewer/android/BUILD.gn b/chromium/chrome/browser/commerce/merchant_viewer/android/BUILD.gn
new file mode 100644
index 00000000000..ee58f70010d
--- /dev/null
+++ b/chromium/chrome/browser/commerce/merchant_viewer/android/BUILD.gn
@@ -0,0 +1,164 @@
+# Copyright 2021 The Chromium Authors.All rights reserved.
+# Use of this source code is governed by a BSD - style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsSheetContent.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabCoordinator.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediator.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContext.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewModel.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEvent.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantViewerConfig.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/RatingStarSpan.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/WebContentsHelpers.java",
+ ]
+
+ deps = [
+ ":jni_headers",
+ "//base:base_java",
+ "//chrome/android:base_module_java",
+ "//chrome/android/features/tab_ui:java_resources",
+ "//chrome/android/features/tab_ui:java_strings_grd",
+ "//chrome/browser/android/lifecycle:java",
+ "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/optimization_guide/android:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/tab:java",
+ "//chrome/browser/tabmodel:java",
+ "//chrome/browser/version:java",
+ "//components/browser_ui/bottomsheet/android:java",
+ "//components/browser_ui/widget/android:java",
+ "//components/embedder_support/android:browser_context_java",
+ "//components/embedder_support/android:content_view_java",
+ "//components/embedder_support/android:util_java",
+ "//components/embedder_support/android:web_contents_delegate_java",
+ "//components/messages/android:java",
+ "//components/optimization_guide/proto:optimization_guide_proto_java",
+ "//components/security_state/content/android:java",
+ "//components/security_state/core:security_state_enums_java",
+ "//components/thin_webview:factory_java",
+ "//components/thin_webview:java",
+ "//components/thin_webview:thin_webview",
+ "//components/url_formatter/android:url_formatter_java",
+ "//content/public/android:content_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_core_core_java",
+ "//ui/android:ui_no_recycler_view_java",
+ "//url:gurl_java",
+ ]
+ resources_package = "org.chromium.chrome.tab_ui"
+
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+java_library("junit") {
+ # Skip platform checks since Robolectric depends on requires_android targets.
+ bypass_platform_checks = true
+
+ testonly = true
+
+ sources = [
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCallbackHelper.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProviderTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactoryTest.java",
+ ]
+
+ deps = [
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//base:base_junit_test_support",
+ "//chrome/android:base_module_java",
+ "//chrome/android:chrome_java",
+ "//chrome/android/features/tab_ui:java_resources",
+ "//chrome/android/features/tab_ui:java_strings_grd",
+ "//chrome/browser/android/lifecycle:java",
+ "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
+ "//chrome/browser/commerce/merchant_viewer/android:java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/optimization_guide/android:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/tab:java",
+ "//chrome/browser/tabmodel:java",
+ "//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/bottomsheet/android:java",
+ "//components/embedder_support/android:content_view_java",
+ "//components/embedder_support/android:util_java",
+ "//components/embedder_support/android:web_contents_delegate_java",
+ "//components/messages/android:java",
+ "//components/optimization_guide/proto:optimization_guide_proto_java",
+ "//components/security_state/content/android:java",
+ "//components/security_state/core:security_state_enums_java",
+ "//content/public/android:content_java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/android_deps:protobuf_lite_runtime_java",
+ "//third_party/android_deps:robolectric_all_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_test_runner_java",
+ "//third_party/hamcrest:hamcrest_core_java",
+ "//third_party/junit",
+ "//third_party/mockito:mockito_java",
+ "//ui/android:ui_no_recycler_view_java",
+ "//url:gurl_java",
+ ]
+ resources_package = "org.chromium.chrome.tab_ui"
+}
+
+android_library("javatests") {
+ testonly = true
+
+ sources = [
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventLoadCallbackHelper.java",
+ "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorageTest.java",
+ ]
+
+ deps = [
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
+ "//chrome/browser/commerce/merchant_viewer/android:java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/tabmodel:java",
+ "//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/bottomsheet/android:java",
+ "//components/messages/android:java",
+ "//components/messages/android/internal:java",
+ "//content/public/android:content_full_java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/android_support_test_runner:runner_java",
+ "//third_party/androidx:androidx_test_core_java",
+ "//third_party/androidx:androidx_test_runner_java",
+ "//third_party/junit",
+ "//third_party/mockito:mockito_java",
+ "//ui/android:ui_java_test_support",
+ "//ui/android:ui_no_recycler_view_java",
+ "//url:gurl_java",
+ ]
+}
+
+generate_jni("jni_headers") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEvent.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage.java",
+ "java/src/org/chromium/chrome/browser/merchant_viewer/WebContentsHelpers.java",
+ ]
+}
diff --git a/chromium/chrome/browser/commerce/subscriptions/android/BUILD.gn b/chromium/chrome/browser/commerce/subscriptions/android/BUILD.gn
index 30abd9300cb..7c8128c7f14 100644
--- a/chromium/chrome/browser/commerce/subscriptions/android/BUILD.gn
+++ b/chromium/chrome/browser/commerce/subscriptions/android/BUILD.gn
@@ -7,6 +7,9 @@ import("//build/config/android/rules.gni")
android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscription.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionJsonSerializer.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsServiceConfig.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsServiceProxy.java",
"java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsStorage.java",
"java/src/org/chromium/chrome/browser/subscriptions/ImplicitPriceDropSubscriptionsManager.java",
"java/src/org/chromium/chrome/browser/subscriptions/SubscriptionsManager.java",
@@ -15,9 +18,11 @@ android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/android:base_module_java",
+ "//chrome/browser/android/lifecycle:java",
+ "//chrome/browser/endpoint_fetcher:java",
"//chrome/browser/flags:java",
+ "//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/tabmodel:java",
diff --git a/chromium/chrome/browser/commerce/subscriptions/test/android/BUILD.gn b/chromium/chrome/browser/commerce/subscriptions/test/android/BUILD.gn
index e61a4b5da47..81e1629e457 100644
--- a/chromium/chrome/browser/commerce/subscriptions/test/android/BUILD.gn
+++ b/chromium/chrome/browser/commerce/subscriptions/test/android/BUILD.gn
@@ -11,15 +11,20 @@ java_library("junit") {
testonly = true
- sources = [ "java/src/org/chromium/chrome/browser/subscriptions/ImplicitPriceDropSubscriptionsManagerUnitTest.java" ]
+ sources = [
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionJsonSerializerUnitTest.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/ImplicitPriceDropSubscriptionsManagerUnitTest.java",
+ ]
deps = [
"//base:base_java",
"//base:base_junit_test_support",
"//chrome/android:base_module_java",
"//chrome/android:chrome_java",
+ "//chrome/browser/android/lifecycle:java",
"//chrome/browser/commerce/subscriptions/android:java",
"//chrome/browser/flags:java",
+ "//chrome/browser/preferences:java",
"//chrome/browser/tab:java",
"//chrome/browser/tabmodel:java",
"//chrome/test/android:chrome_java_test_support",
@@ -36,18 +41,25 @@ java_library("junit") {
android_library("javatests") {
testonly = true
- sources = [ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsStorageTest.java" ]
+ sources = [
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsServiceProxyUnitTest.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsStorageTest.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/SubscriptionsLoadCallbackHelper.java",
+ "java/src/org/chromium/chrome/browser/subscriptions/SubscriptionsManagerImplTest.java",
+ ]
deps = [
"//base:base_java",
"//base:base_java_test_support",
"//chrome/browser/commerce/subscriptions/android:java",
+ "//chrome/browser/endpoint_fetcher:java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/test/android:chrome_java_test_support",
"//content/public/test/android:content_java_test_support",
"//third_party/androidx:androidx_test_core_java",
"//third_party/androidx:androidx_test_runner_java",
+ "//third_party/hamcrest:hamcrest_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
]
diff --git a/chromium/chrome/browser/consent_auditor/android/BUILD.gn b/chromium/chrome/browser/consent_auditor/android/BUILD.gn
index 7a841bcf5dc..88689de33a4 100644
--- a/chromium/chrome/browser/consent_auditor/android/BUILD.gn
+++ b/chromium/chrome/browser/consent_auditor/android/BUILD.gn
@@ -12,8 +12,8 @@ android_library("java") {
sources = [ "java/src/org/chromium/chrome/browser/consent_auditor/ConsentAuditorBridge.java" ]
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
+ "//components/signin/public/android:java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
srcjar_deps = [ "//components/consent_auditor:consent_auditor_java" ]
diff --git a/chromium/chrome/browser/contextmenu/BUILD.gn b/chromium/chrome/browser/contextmenu/BUILD.gn
index c39afe78689..a297757b22f 100644
--- a/chromium/chrome/browser/contextmenu/BUILD.gn
+++ b/chromium/chrome/browser/contextmenu/BUILD.gn
@@ -22,7 +22,6 @@ android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//components/browser_ui/share/android:java",
"//components/embedder_support/android:context_menu_java",
"//content/public/android:content_java",
diff --git a/chromium/chrome/browser/continuous_search/BUILD.gn b/chromium/chrome/browser/continuous_search/BUILD.gn
index fd064632fff..8244d0ae174 100644
--- a/chromium/chrome/browser/continuous_search/BUILD.gn
+++ b/chromium/chrome/browser/continuous_search/BUILD.gn
@@ -5,27 +5,36 @@
import("//build/config/android/rules.gni")
android_library("java") {
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
sources = [
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerCoordinator.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediator.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerProperties.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerViewBinder.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListCoordinator.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListMediator.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListProperties.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListViewBinder.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchSceneLayer.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabHelper.java",
]
deps = [
+ ":data_structures_java",
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/browser_controls/android:java",
"//chrome/browser/continuous_search/internal:java",
"//chrome/browser/flags:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/layouts:java",
+ "//chrome/browser/ui/android/theme:java",
"//components/browser_ui/widget/android:java",
"//components/embedder_support/android:util_java",
"//content/public/android:content_java",
"//services/network/public/mojom:mojom_java",
+ "//services/network/public/mojom:url_loader_base_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_coordinatorlayout_coordinatorlayout_java",
"//third_party/androidx:androidx_recyclerview_recyclerview_java",
@@ -35,8 +44,35 @@ android_library("java") {
resources_package = "org.chromium.chrome.browser.continuous_search"
}
+java_cpp_enum("page_category_generated_enum") {
+ sources = [ "page_category.h" ]
+}
+
+android_library("data_structures_java") {
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
+ sources = [
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationMetadata.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationUserData.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/PageGroup.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/PageItem.java",
+ ]
+
+ srcjar_deps = [ ":page_category_generated_enum" ]
+
+ deps = [
+ "//base:base_java",
+ "//base:jni_java",
+ "//chrome/browser/tab:java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//url:gurl_java",
+ ]
+}
+
android_resources("java_resources") {
sources = [
+ "android/java/res/drawable/continuous_search_list_item_background.xml",
+ "android/java/res/layout/continuous_search_container.xml",
"android/java/res/layout/continuous_search_list_ad.xml",
"android/java/res/layout/continuous_search_list_group_label.xml",
"android/java/res/layout/continuous_search_list_item.xml",
@@ -45,12 +81,17 @@ android_resources("java_resources") {
deps = [ "//chrome/android:chrome_app_java_resources" ]
}
+generate_jni("jni_headers") {
+ sources = [ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchSceneLayer.java" ]
+}
+
android_library("javatests") {
testonly = true
sources = [ "android/javatests/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabHelperTest.java" ]
deps = [
+ ":data_structures_java",
":java",
"//base:base_java",
"//base:base_java_test_support",
@@ -75,15 +116,21 @@ android_library("junit") {
bypass_platform_checks = true
testonly = true
- sources = [ "android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListMediatorTest.java" ]
+ sources = [
+ "android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java",
+ "android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchListMediatorTest.java",
+ ]
deps = [
+ ":data_structures_java",
":java",
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
+ "//chrome/browser/browser_controls/android:java",
"//chrome/browser/continuous_search/internal:java",
"//chrome/browser/tab:java",
+ "//chrome/browser/ui/android/theme:java",
"//content/public/android:content_java",
"//third_party/android_deps:robolectric_all_java",
"//third_party/junit",
@@ -93,3 +140,7 @@ android_library("junit") {
"//url:gurl_junit_test_support",
]
}
+
+source_set("public") {
+ sources = [ "page_category.h" ]
+}
diff --git a/chromium/chrome/browser/continuous_search/internal/BUILD.gn b/chromium/chrome/browser/continuous_search/internal/BUILD.gn
index 284a1471e9a..e403cca8a66 100644
--- a/chromium/chrome/browser/continuous_search/internal/BUILD.gn
+++ b/chromium/chrome/browser/continuous_search/internal/BUILD.gn
@@ -4,10 +4,6 @@
import("//build/config/android/rules.gni")
-java_cpp_enum("search_result_category_generated_enum") {
- sources = [ "search_result_category.h" ]
-}
-
generate_jni("jni_headers") {
sources = [
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultExtractorProducer.java",
@@ -20,27 +16,21 @@ android_library("java") {
sources = [
"android/java/src/org/chromium/chrome/browser/continuous_search/BackNavigationTabObserver.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationUserDataImpl.java",
+ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationUserDataObserver.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserver.java",
- "android/java/src/org/chromium/chrome/browser/continuous_search/SearchResult.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultExtractorProducer.java",
- "android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultGroup.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultListener.java",
- "android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultMetadata.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultProducer.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultProducerFactory.java",
- "android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultUserData.java",
- "android/java/src/org/chromium/chrome/browser/continuous_search/SearchResultUserDataObserver.java",
"android/java/src/org/chromium/chrome/browser/continuous_search/SearchUrlHelper.java",
]
- srcjar_deps = [
- ":search_result_category_generated_enum",
- "//components/continuous_search/browser:search_result_extractor_client_status_generated_enum",
- ]
+ srcjar_deps = [ "//components/continuous_search/browser:search_result_extractor_client_status_generated_enum" ]
deps = [
"//base:base_java",
- "//base:jni_java",
+ "//chrome/browser/continuous_search:data_structures_java",
"//chrome/browser/tab:java",
"//chrome/browser/tabmodel:java",
"//content/public/android:content_java",
@@ -64,6 +54,7 @@ android_library("junit") {
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
+ "//chrome/browser/continuous_search:data_structures_java",
"//chrome/browser/tab:java",
"//content/public/android:content_java",
"//third_party/android_deps:robolectric_all_java",
@@ -76,7 +67,6 @@ android_library("junit") {
source_set("internal") {
sources = [
- "search_result_category.h",
"search_result_extractor_producer.cc",
"search_result_extractor_producer.h",
"search_result_extractor_producer_interface.h",
@@ -87,6 +77,7 @@ source_set("internal") {
deps = [
":jni_headers",
"//base",
+ "//chrome/browser/continuous_search:public",
"//components/continuous_search/browser",
"//components/continuous_search/common/public/mojom",
"//components/google/core/common",
@@ -108,6 +99,7 @@ source_set("unit_tests") {
deps = [
":internal",
"//base",
+ "//chrome/browser/continuous_search:public",
"//chrome/test:test_support",
"//components/continuous_search/browser/test:test_support",
"//components/continuous_search/common/public/mojom",
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
index e2d1fbfe6ac..49cd2b5016e 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
@@ -25,6 +25,7 @@
#include "components/prefs/pref_service.h"
#include "components/user_prefs/user_prefs.h"
#include "content/public/browser/child_process_security_policy.h"
+#include "third_party/blink/public/common/security/protocol_handler_security_level.h"
using content::BrowserThread;
using content::ChildProcessSecurityPolicy;
@@ -117,6 +118,30 @@ void ProtocolHandlerRegistry::Delegate::CheckDefaultClientWithOS(
->StartCheckIsDefault(std::move(callback));
}
+void ProtocolHandlerRegistry::Delegate::RegisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const shell_integration::AppProtocolMap app_protocols,
+ base::OnceCallback<void(bool)> registration_complete_callback) {
+ shell_integration::AddAppProtocolClients(
+ app_protocols, app_profile_path,
+ std::move(registration_complete_callback));
+}
+
+void ProtocolHandlerRegistry::Delegate::DeregisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const std::vector<std::string>& app_protocols) {
+ shell_integration::RemoveAppProtocolClients(app_protocols, app_profile_path);
+}
+
+void ProtocolHandlerRegistry::Delegate::CheckAppIsDefaultClientWithOS(
+ const std::string& app_id,
+ const base::FilePath& app_profile_path,
+ const std::string& protocol,
+ base::OnceCallback<void(bool)> check_complete_callback) {
+ shell_integration::CheckAppIsProtocolClient(
+ app_id, protocol, app_profile_path, std::move(check_complete_callback));
+}
+
// ProtocolHandlerRegistry -----------------------------------------------------
ProtocolHandlerRegistry::ProtocolHandlerRegistry(
@@ -168,6 +193,50 @@ void ProtocolHandlerRegistry::OnIgnoreRegisterProtocolHandler(
NotifyChanged();
}
+void ProtocolHandlerRegistry::RegisterAppProtocolHandlers(
+ const std::string& app_id,
+ const std::vector<apps::ProtocolHandlerInfo>& handler_infos) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ std::vector<std::string> app_protocols;
+
+ for (const auto& handler_info : handler_infos) {
+ ProtocolHandler handler = ProtocolHandler::CreateWebAppProtocolHandler(
+ handler_info.protocol, handler_info.url, app_id);
+ if (!handler.IsValid() || !RegisterProtocolHandler(handler, USER))
+ continue;
+
+ app_protocols.push_back(handler.protocol());
+
+ ProtocolHandler default_handler = GetHandlerFor(handler.protocol());
+ if (default_handler.IsEmpty()) {
+ SetDefaultImpl(handler);
+ }
+ }
+
+ UpdateAppProtocolsWithOS(app_protocols);
+
+ Save();
+ NotifyChanged();
+}
+
+void ProtocolHandlerRegistry::DeregisterAppProtocolHandlers(
+ const std::string& app_id,
+ const std::vector<apps::ProtocolHandlerInfo>& handler_infos) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ std::vector<ProtocolHandler> handlers;
+ for (const auto& handler_info : handler_infos) {
+ ProtocolHandler handler = ProtocolHandler::CreateWebAppProtocolHandler(
+ handler_info.protocol, handler_info.url, app_id);
+ if (HandlerExists(handler, &protocol_handlers_)) {
+ handlers.push_back(handler);
+ }
+ }
+
+ RemoveHandlers(handlers);
+}
+
bool ProtocolHandlerRegistry::AttemptReplace(const ProtocolHandler& handler) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
ProtocolHandler old_default = GetHandlerFor(handler.protocol());
@@ -262,8 +331,15 @@ void ProtocolHandlerRegistry::InitProtocolSettings() {
for (ProtocolHandlerMap::const_iterator p = default_handlers_.begin();
p != default_handlers_.end(); ++p) {
const std::string& protocol = p->second.protocol();
- delegate_->CheckDefaultClientWithOS(
- protocol, GetDefaultWebClientCallback(protocol));
+ if (p->second.web_app_id()) {
+ std::string app_id = p->second.web_app_id().value();
+ delegate_->CheckAppIsDefaultClientWithOS(
+ app_id, context_->GetPath(), protocol,
+ GetAppProtocolWorkerCallback({{protocol, app_id}}));
+ } else {
+ delegate_->CheckDefaultClientWithOS(
+ protocol, GetDefaultWebClientCallback(protocol));
+ }
}
}
}
@@ -452,6 +528,7 @@ void ProtocolHandlerRegistry::RemoveHandlers(
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::vector<ProtocolHandler> erased_handlers;
+ std::vector<std::string> app_protocols_to_remove_from_os;
for (const auto& handler : handlers) {
if (IsIgnored(handler)) {
@@ -483,12 +560,13 @@ void ProtocolHandlerRegistry::RemoveHandlers(
ProtocolHandlerList& existing_handlers =
protocol_handlers_[erased_handler.protocol()];
ProtocolHandler default_handler = GetHandlerFor(erased_handler.protocol());
- if (default_handler == erased_handler) {
+ if (default_handler == erased_handler || erased_handler.web_app_id()) {
// Removing the default handler for a protocol requires updating the
- // default registration. If the default handler is a web app handler, the
- // removal of any handler for the protocol may require updating the
- // the default registration as the protocol may no longer require
- // disambiguation.
+ // default registration. If the default handler is a web app handler, its
+ // removal may require updating the the default registration as the
+ // protocol may no longer require disambiguation (i.e.: if a single app is
+ // left as a handler for a protocol, it should be registered with the OS
+ // instead).
if (!existing_handlers.empty()) {
updated_default_handlers.push_back(existing_handlers[0]);
} else {
@@ -496,12 +574,26 @@ void ProtocolHandlerRegistry::RemoveHandlers(
}
}
+ // TODO(1132105): Implement DeregisterExternalHandler so that websites can
+ // be unregistered with the OS. Alternatively, expand
+ // DeregisterAppProtocolsWithOS's scope to work with non-app protocols.
if (!IsHandledProtocol(erased_handler.protocol())) {
delegate_->DeregisterExternalHandler(erased_handler.protocol());
}
+
+ if (GetHandlerFor(erased_handler.protocol()).IsEmpty() &&
+ erased_handler.web_app_id()) {
+ // Web app protocols are removed from the OS when the protocol no longer
+ // has a default handler.
+ app_protocols_to_remove_from_os.push_back(erased_handler.protocol());
+ }
}
SetDefaults(updated_default_handlers);
+ if (!app_protocols_to_remove_from_os.empty())
+ delegate_->DeregisterAppProtocolsWithOS(context_->GetPath(),
+ app_protocols_to_remove_from_os);
+
Save();
if (!erased_handlers.empty())
NotifyChanged();
@@ -636,11 +728,22 @@ void ProtocolHandlerRegistry::SetDefaults(
if (is_loading_)
return;
- // If we're not loading register with the OS.
+ // Separate site handlers from web app handlers so that web app handlers can
+ // be registered to the OS in a batch operation.
+ std::vector<std::string> app_protocols;
for (const auto& handler : handlers) {
- delegate_->RegisterWithOSAsDefaultClient(
- handler.protocol(), GetDefaultWebClientCallback(handler.protocol()));
+ if (handler.web_app_id()) {
+ app_protocols.push_back(handler.protocol());
+ } else {
+ delegate_->RegisterWithOSAsDefaultClient(
+ handler.protocol(), GetDefaultWebClientCallback(handler.protocol()));
+ }
}
+
+ UpdateAppProtocolsWithOS(app_protocols);
+
+ Save();
+ NotifyChanged();
}
void ProtocolHandlerRegistry::SetDefaultImpl(const ProtocolHandler& handler) {
@@ -810,6 +913,30 @@ void ProtocolHandlerRegistry::EraseHandler(const ProtocolHandler& handler,
list->erase(std::find(list->begin(), list->end(), handler));
}
+void ProtocolHandlerRegistry::UpdateAppProtocolsWithOS(
+ const std::vector<std::string>& protocols) {
+ if (protocols.empty())
+ return;
+
+ shell_integration::AppProtocolMap app_protocols;
+
+ for (const auto& protocol : protocols) {
+ ProtocolHandler default_handler = GetHandlerFor(protocol);
+ ProtocolHandlerList handlers = protocol_handlers_[protocol];
+ // If other handlers exist for the protocol, the protocol will be
+ // registered for disambiguation (i.e.: the browser will be registered
+ // with the OS as the handler instead of the app).
+ if (handlers.size() == 1 && handlers[0] == default_handler)
+ app_protocols[protocol] = default_handler.web_app_id();
+ else
+ app_protocols[protocol] = base::nullopt;
+ }
+
+ delegate_->RegisterAppProtocolsWithOS(
+ context_->GetPath(), app_protocols,
+ GetAppProtocolWorkerCallback(app_protocols));
+}
+
void ProtocolHandlerRegistry::OnSetAsDefaultProtocolClientFinished(
const std::string& protocol,
shell_integration::DefaultWebClientState state) {
@@ -836,3 +963,21 @@ ProtocolHandlerRegistry::GetDefaultWebClientCallback(
&ProtocolHandlerRegistry::OnSetAsDefaultProtocolClientFinished,
weak_ptr_factory_.GetWeakPtr(), protocol);
}
+
+void ProtocolHandlerRegistry::OnAppProtocolOperationFinished(
+ const shell_integration::AppProtocolMap& app_protocols,
+ bool registration_success) {
+ // Clear if the protocol could not be registered
+ if (ShouldRemoveHandlersNotInOS() && !registration_success) {
+ for (const auto& app_protocol_pair : app_protocols)
+ ClearDefault(app_protocol_pair.first);
+ }
+}
+
+base::OnceCallback<void(bool)>
+ProtocolHandlerRegistry::GetAppProtocolWorkerCallback(
+ const shell_integration::AppProtocolMap& app_protocols) {
+ return base::BindOnce(
+ &ProtocolHandlerRegistry::OnAppProtocolOperationFinished,
+ weak_ptr_factory_.GetWeakPtr(), app_protocols);
+}
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.h b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.h
index f75f2c13b05..ab76f62cf23 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.h
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.h
@@ -19,6 +19,7 @@
#include "chrome/browser/shell_integration.h"
#include "chrome/common/custom_handlers/protocol_handler.h"
#include "components/keyed_service/core/keyed_service.h"
+#include "components/services/app_service/public/cpp/protocol_handler_info.h"
#include "content/public/browser/browser_thread.h"
namespace user_prefs {
@@ -41,9 +42,9 @@ class ProtocolHandlerRegistry : public KeyedService {
typedef std::vector<ProtocolHandler> ProtocolHandlerList;
typedef std::map<std::string, ProtocolHandlerList> ProtocolHandlerMultiMap;
- // |Delegate| provides an interface for interacting asynchronously
- // with the underlying OS for the purposes of registering Chrome
- // as the default handler for specific protocols.
+ // |Delegate| provides an interface for interacting asynchronously with the
+ // underlying OS for the purposes of registering Chrome and web apps as
+ // default handlers for specific protocols.
class Delegate {
public:
virtual ~Delegate();
@@ -56,6 +57,18 @@ class ProtocolHandlerRegistry : public KeyedService {
virtual void CheckDefaultClientWithOS(
const std::string& protocol,
shell_integration::DefaultWebClientWorkerCallback callback);
+ virtual void RegisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const shell_integration::AppProtocolMap app_protocols,
+ base::OnceCallback<void(bool)> registration_complete_callback);
+ virtual void DeregisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const std::vector<std::string>& app_protocols);
+ virtual void CheckAppIsDefaultClientWithOS(
+ const std::string& app_id,
+ const base::FilePath& app_profile_path,
+ const std::string& protocol,
+ base::OnceCallback<void(bool)> check_complete_callback);
};
class Observer : public base::CheckedObserver {
@@ -87,6 +100,18 @@ class ProtocolHandlerRegistry : public KeyedService {
// given protocol handler again.
void OnIgnoreRegisterProtocolHandler(const ProtocolHandler& handler);
+ // Registers each web app protocol handler as a non default handler if another
+ // handler exists for its scheme or as a default handler for uncontested
+ // schemes.
+ void RegisterAppProtocolHandlers(
+ const std::string& app_id,
+ const std::vector<apps::ProtocolHandlerInfo>& handler_infos);
+
+ // Removes each web app protocol handler from the registry and OS.
+ void DeregisterAppProtocolHandlers(
+ const std::string& app_id,
+ const std::vector<apps::ProtocolHandlerInfo>& handler_infos);
+
// Removes all handlers that have the same origin and protocol as the given
// one and installs the given handler. Returns true if any protocol handlers
// were replaced.
@@ -294,6 +319,13 @@ class ProtocolHandlerRegistry : public KeyedService {
// Erases the handler that is guaranteed to exist from the list.
void EraseHandler(const ProtocolHandler& handler, ProtocolHandlerList* list);
+ // Updates the OS registration for each protocol based on the registry state
+ // of corresponding app handlers. For each protocol, the resulting OS
+ // registration may be the associated app, the browser (for disambiguation),
+ // or no registration if the app handler is not present in the registry.
+ // |protocols| is expected to contain a list of unique protocols.
+ void UpdateAppProtocolsWithOS(const std::vector<std::string>& protocols);
+
// Called with the default state when the default protocol client worker is
// done.
void OnSetAsDefaultProtocolClientFinished(
@@ -304,6 +336,16 @@ class ProtocolHandlerRegistry : public KeyedService {
shell_integration::DefaultWebClientWorkerCallback GetDefaultWebClientCallback(
const std::string& protocol);
+ // Called with success flag when an asynchronous app protocols operation is
+ // complete.
+ void OnAppProtocolOperationFinished(
+ const shell_integration::AppProtocolMap& app_protocols,
+ bool operation_success);
+
+ // Gets the callback for AppProtocolWorkerCallback.
+ base::OnceCallback<void(bool)> GetAppProtocolWorkerCallback(
+ const shell_integration::AppProtocolMap& protocols);
+
// Map from protocols (strings) to protocol handlers.
ProtocolHandlerMultiMap protocol_handlers_;
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
index cbdfb71fae9..a0093962d87 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -5,7 +5,6 @@
#include <memory>
#include <string>
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
@@ -194,7 +193,7 @@ IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerSubresourceWebBundlesBrowserTest,
GURL handler_url = embedded_test_server()->GetURL("/%s");
AddProtocolHandler("urn", handler_url);
- base::string16 expected_title = base::ASCIIToUTF16("OK");
+ std::u16string expected_title = u"OK";
content::TitleWatcher title_watcher(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
index 79bed3e1c66..1de613118ca 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
@@ -15,6 +15,7 @@
#include "base/scoped_observer.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
+#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/common/custom_handlers/protocol_handler.h"
@@ -28,6 +29,7 @@
#include "content/public/test/test_renderer_host.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/security/protocol_handler_security_level.h"
+#include "url/gurl.h"
using content::BrowserThread;
@@ -90,9 +92,43 @@ class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
os_registered_protocols_.end();
}
+ void RegisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const shell_integration::AppProtocolMap app_protocols,
+ base::OnceCallback<void(bool)> registration_complete_callback) override {
+ // Do as-if the registration has to run on another sequence and post back
+ // the result with a task to the current thread.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(std::move(registration_complete_callback),
+ !force_os_failure_));
+
+ if (!force_os_failure_) {
+ for (const auto& protocol_pair : app_protocols) {
+ os_registered_app_protocols_[protocol_pair.first] =
+ protocol_pair.second;
+ }
+ }
+ }
+
+ void DeregisterAppProtocolsWithOS(
+ const base::FilePath& app_profile_path,
+ const std::vector<std::string>& app_protocols) override {
+ for (const auto& protocol : app_protocols) {
+ os_registered_app_protocols_.erase(protocol);
+ }
+ }
+
+ bool IsFakeAppHandlerRegisteredWithOS(const std::string& protocol,
+ base::Optional<std::string> app_id) {
+ auto handler_iter = os_registered_app_protocols_.find(protocol);
+ return handler_iter != os_registered_app_protocols_.end() &&
+ handler_iter->second == app_id;
+ }
+
void Reset() {
registered_protocols_.clear();
os_registered_protocols_.clear();
+ os_registered_app_protocols_.clear();
force_os_failure_ = false;
}
@@ -103,6 +139,7 @@ class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
private:
std::set<std::string> registered_protocols_;
std::set<std::string> os_registered_protocols_;
+ shell_integration::AppProtocolMap os_registered_app_protocols_;
bool force_os_failure_;
};
@@ -155,6 +192,21 @@ class QueryProtocolHandlerOnChange : public ProtocolHandlerRegistry::Observer {
DISALLOW_COPY_AND_ASSIGN(QueryProtocolHandlerOnChange);
};
+apps::ProtocolHandlerInfo GetProtocolHandlerInfo(const std::string& protocol,
+ const GURL& url) {
+ apps::ProtocolHandlerInfo handler_info;
+ handler_info.protocol = protocol;
+ handler_info.url = url;
+ return handler_info;
+}
+
+ProtocolHandler GetProtocolHandler(
+ const apps::ProtocolHandlerInfo& handler_info,
+ const std::string& app_id) {
+ return ProtocolHandler::CreateWebAppProtocolHandler(handler_info.protocol,
+ handler_info.url, app_id);
+}
+
} // namespace
class ProtocolHandlerRegistryTest : public testing::Test {
@@ -183,6 +235,12 @@ class ProtocolHandlerRegistryTest : public testing::Test {
return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s"));
}
+ ProtocolHandler CreateWebAppProtocolHandler(const std::string& protocol,
+ const GURL& url,
+ const std::string& app_id) {
+ return ProtocolHandler::CreateWebAppProtocolHandler(protocol, url, app_id);
+ }
+
bool ProtocolHandlerCanRegisterProtocol(
const std::string& protocol,
const GURL& handler_url,
@@ -230,8 +288,8 @@ class ProtocolHandlerRegistryTest : public testing::Test {
void SetUpRegistry(bool initialize) {
auto delegate = std::make_unique<FakeDelegate>();
delegate_ = delegate.get();
- registry_.reset(
- new ProtocolHandlerRegistry(profile(), std::move(delegate)));
+ registry_ = std::make_unique<ProtocolHandlerRegistry>(profile(),
+ std::move(delegate));
if (initialize) registry_->InitProtocolSettings();
}
@@ -242,7 +300,7 @@ class ProtocolHandlerRegistryTest : public testing::Test {
}
void SetUp() override {
- profile_.reset(new TestingProfile());
+ profile_ = std::make_unique<TestingProfile>();
CHECK(profile_->GetPrefs());
SetUpRegistry(true);
test_protocol_handler_ =
@@ -328,13 +386,14 @@ TEST_F(ProtocolHandlerRegistryTest, SaveAndLoad) {
TEST_F(ProtocolHandlerRegistryTest, Encode) {
base::Time now = base::Time::Now();
- ProtocolHandler handler("news", GURL("http://example.com"), now,
+ ProtocolHandler handler("news", GURL("http://example.com"), "app_id", now,
blink::ProtocolHandlerSecurityLevel::kStrict);
auto value = handler.Encode();
ProtocolHandler recreated =
ProtocolHandler::CreateProtocolHandler(value.get());
EXPECT_EQ("news", recreated.protocol());
EXPECT_EQ(GURL("http://example.com"), recreated.url());
+ EXPECT_EQ("app_id", recreated.web_app_id());
EXPECT_EQ(now, recreated.last_modified());
}
@@ -1203,3 +1262,162 @@ TEST_F(ProtocolHandlerRegistryTest, ProtocolHandlerSecurityLevels) {
"ext+foo", https_handler_url,
blink::ProtocolHandlerSecurityLevel::kExtensionFeatures));
}
+
+TEST_F(ProtocolHandlerRegistryTest, TestRegisterWebAppHandlers) {
+ EXPECT_FALSE(delegate()->IsExternalHandlerRegistered("mailto"));
+ EXPECT_FALSE(delegate()->IsExternalHandlerRegistered("web+test"));
+
+ apps::ProtocolHandlerInfo ph1_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test1.com/%s"));
+ ProtocolHandler ph1 = GetProtocolHandler(ph1_info, "app_id1");
+
+ apps::ProtocolHandlerInfo ph2_info =
+ GetProtocolHandlerInfo("web+test", GURL("https://test2.com/%s"));
+ ProtocolHandler ph2 = GetProtocolHandler(ph2_info, "app_id1");
+
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph1_info, ph2_info});
+
+ // After registration, both handlers should be externally registered with the
+ // OS and registered as defaults in the ProtocolHandlerRegistsry.
+ EXPECT_TRUE(delegate()->IsExternalHandlerRegistered("mailto"));
+ EXPECT_TRUE(delegate()->IsExternalHandlerRegistered("web+test"));
+
+ EXPECT_TRUE(registry()->IsRegistered(ph1));
+ EXPECT_TRUE(registry()->IsDefault(ph1));
+ EXPECT_TRUE(delegate()->IsFakeAppHandlerRegisteredWithOS(ph1.protocol(),
+ ph1.web_app_id()));
+
+ EXPECT_TRUE(registry()->IsRegistered(ph2));
+ EXPECT_TRUE(registry()->IsDefault(ph2));
+ EXPECT_TRUE(delegate()->IsFakeAppHandlerRegisteredWithOS(ph2.protocol(),
+ ph2.web_app_id()));
+}
+
+TEST_F(ProtocolHandlerRegistryTest,
+ TestDuplicateSchemeAppHandlersAreNonDefault) {
+ ProtocolHandler ph1 = ProtocolHandler::CreateProtocolHandler(
+ "mailto", GURL("https://test1.com/%s"));
+ registry()->OnAcceptRegisterProtocolHandler(ph1);
+
+ EXPECT_TRUE(registry()->IsRegistered(ph1));
+ EXPECT_TRUE(registry()->IsDefault(ph1));
+ EXPECT_TRUE(delegate()->IsFakeRegisteredWithOS(ph1.protocol()));
+
+ apps::ProtocolHandlerInfo ph2_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test2.com/%s"));
+ ProtocolHandler ph2 = GetProtocolHandler(ph2_info, "app_id1");
+
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph2_info});
+
+ // Because ph2 was registered second and has the same scheme as ph1, it should
+ // be registered as non default with the ProtocolHandlerRegistry and not
+ // registered with the OS.
+ EXPECT_TRUE(registry()->IsRegistered(ph2));
+ EXPECT_FALSE(registry()->IsDefault(ph2));
+ EXPECT_FALSE(delegate()->IsFakeAppHandlerRegisteredWithOS(ph2.protocol(),
+ ph2.web_app_id()));
+}
+
+TEST_F(ProtocolHandlerRegistryTest,
+ TestDuplicateSchemeAppHandlersAreRegisteredForDisambiguation) {
+ apps::ProtocolHandlerInfo ph1_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test1.com/%s"));
+ ProtocolHandler ph1 = GetProtocolHandler(ph1_info, "app_id1");
+
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph1_info});
+ EXPECT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS(ph1.protocol(), "app_id1"));
+
+ apps::ProtocolHandlerInfo ph2_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test2.com/%s"));
+ ProtocolHandler ph2 = GetProtocolHandler(ph2_info, "app_id2");
+
+ registry()->RegisterAppProtocolHandlers("app_id2", {ph2_info});
+ // The protocol should be registered for disambiguation with a null app_id.
+ EXPECT_TRUE(delegate()->IsFakeAppHandlerRegisteredWithOS(ph2.protocol(),
+ base::nullopt));
+}
+
+TEST_F(ProtocolHandlerRegistryTest, TestRemoveWebAppHandlers) {
+ // Register a single handler for web+testing and multiple handlers for mailto.
+ apps::ProtocolHandlerInfo ph1_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test1.com/%s"));
+ ProtocolHandler ph1 = GetProtocolHandler(ph1_info, "app_id1");
+ apps::ProtocolHandlerInfo ph2_info =
+ GetProtocolHandlerInfo("web+testing", GURL("https://test1.com/%s"));
+ ProtocolHandler ph2 = GetProtocolHandler(ph2_info, "app_id1");
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph1_info, ph2_info});
+
+ apps::ProtocolHandlerInfo ph3_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test2.com/%s"));
+ ProtocolHandler ph3 = GetProtocolHandler(ph3_info, "app_id2");
+ registry()->RegisterAppProtocolHandlers("app_id2", {ph3_info});
+
+ EXPECT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("mailto", base::nullopt));
+ EXPECT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("web+testing", "app_id1"));
+
+ // Deregister a single handler for both web+testing and mailto, leaving no
+ // registered web+testing and handlers and one registered mailto handler.
+ registry()->DeregisterAppProtocolHandlers("app_id1", {ph1_info, ph2_info});
+
+ EXPECT_FALSE(registry()->IsRegistered(ph1));
+ EXPECT_FALSE(registry()->IsRegistered(ph2));
+ EXPECT_TRUE(registry()->IsRegistered(ph3));
+ EXPECT_TRUE(registry()->IsDefault(ph3));
+
+ // web+testing should be removed from the OS while mailto should remain
+ // registered with the OS since ph3 was promoted to default.
+ EXPECT_FALSE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("web+testing", "app_id1"));
+ EXPECT_FALSE(delegate()->IsExternalHandlerRegistered("web+testing"));
+ EXPECT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("mailto", "app_id2"));
+ EXPECT_TRUE(delegate()->IsExternalHandlerRegistered("mailto"));
+}
+
+TEST_F(ProtocolHandlerRegistryTest,
+ TestRemovingNonDefaultHandlerUpdatesDefault) {
+ // Register multiple handlers for mailto and ensure the protocol is registered
+ // for disambiguation.
+ apps::ProtocolHandlerInfo ph1_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test1.com/%s"));
+ ProtocolHandler ph1 = GetProtocolHandler(ph1_info, "app_id1");
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph1_info});
+
+ apps::ProtocolHandlerInfo ph2_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test2.com/%s"));
+ ProtocolHandler ph2 = GetProtocolHandler(ph2_info, "app_id2");
+ registry()->RegisterAppProtocolHandlers("app_id2", {ph2_info});
+
+ ASSERT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("mailto", base::nullopt));
+
+ // Remove the non default handler (ph2) and test that the protocol is handled
+ // by ph1 and no longer registered for disambiguation.
+ registry()->DeregisterAppProtocolHandlers("app_id2", {ph2_info});
+
+ EXPECT_TRUE(
+ delegate()->IsFakeAppHandlerRegisteredWithOS("mailto", "app_id1"));
+}
+
+TEST_F(ProtocolHandlerRegistryTest, TestRegisterHandlersWithOSFailure) {
+ delegate()->set_force_os_failure(true);
+
+ apps::ProtocolHandlerInfo ph1_info =
+ GetProtocolHandlerInfo("mailto", GURL("https://test1.com/%s"));
+ ProtocolHandler ph1 = GetProtocolHandler(ph1_info, "app_id1");
+ registry()->RegisterAppProtocolHandlers("app_id1", {ph1_info});
+ base::RunLoop().RunUntilIdle();
+ base::ThreadPoolInstance::Get()->FlushForTesting();
+
+ EXPECT_TRUE(delegate()->IsExternalHandlerRegistered(ph1.protocol()));
+ EXPECT_TRUE(registry()->IsRegistered(ph1));
+
+#if defined(OS_WIN) || defined(OS_MAC)
+ // Default handlers that failed OS registration should no longer be default.
+ // TODO(crbug.com/1019239): Investigate Linux assumptions.
+ EXPECT_FALSE(registry()->IsDefault(ph1));
+#endif
+}
diff --git a/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc b/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
index 70069e2fc45..3c0b03766e5 100644
--- a/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
+++ b/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
@@ -32,7 +32,7 @@ RegisterProtocolHandlerPermissionRequest::GetRequestType() const {
return permissions::RequestType::kRegisterProtocolHandler;
}
-base::string16
+std::u16string
RegisterProtocolHandlerPermissionRequest::GetMessageTextFragment() const {
ProtocolHandler old_handler = registry_->GetHandlerFor(handler_.protocol());
return old_handler.IsEmpty()
diff --git a/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h b/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
index 92a357cb914..d55e193e555 100644
--- a/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
+++ b/chromium/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
@@ -33,7 +33,7 @@ class RegisterProtocolHandlerPermissionRequest
private:
// permissions::PermissionRequest:
permissions::RequestType GetRequestType() const override;
- base::string16 GetMessageTextFragment() const override;
+ std::u16string GetMessageTextFragment() const override;
GURL GetOrigin() const override;
void PermissionGranted(bool is_one_time) override;
void PermissionDenied() override;
diff --git a/chromium/chrome/browser/dev_ui_browser_resources.grd b/chromium/chrome/browser/dev_ui_browser_resources.grd
index c92f62088be..366475caf7a 100644
--- a/chromium/chrome/browser/dev_ui_browser_resources.grd
+++ b/chromium/chrome/browser/dev_ui_browser_resources.grd
@@ -29,20 +29,12 @@ This file specifies browser resources for developer-facing chrome:// pages
<include name="IDR_DOMAIN_RELIABILITY_INTERNALS_HTML" file="resources\domain_reliability_internals\domain_reliability_internals.html" type="BINDATA" />
<include name="IDR_DOMAIN_RELIABILITY_INTERNALS_CSS" file="resources\domain_reliability_internals\domain_reliability_internals.css" type="BINDATA" />
<include name="IDR_DOMAIN_RELIABILITY_INTERNALS_JS" file="resources\domain_reliability_internals\domain_reliability_internals.js" type="BINDATA" />
- <include name="IDR_DOWNLOAD_INTERNALS_HTML" file="resources\download_internals\download_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
- <include name="IDR_DOWNLOAD_INTERNALS_CSS" file="resources\download_internals\download_internals.css" type="BINDATA" />
- <include name="IDR_DOWNLOAD_INTERNALS_JS" file="resources\download_internals\download_internals.js" type="BINDATA" />
- <include name="IDR_DOWNLOAD_INTERNALS_BROWSER_PROXY_JS" file="resources\download_internals\download_internals_browser_proxy.js" type="BINDATA" />
- <include name="IDR_DOWNLOAD_INTERNALS_VISUALS_JS" file="resources\download_internals\download_internals_visuals.js" type="BINDATA" />
<include name="IDR_LOCAL_STATE_HTML" file="resources\local_state\local_state.html" type="BINDATA" />
- <include name="IDR_LOCAL_STATE_JS" file="resources\local_state\local_state.js" type="BINDATA" />
+ <include name="IDR_LOCAL_STATE_JS" file="${root_gen_dir}\chrome\browser\resources\local_state\local_state.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_MEDIA_DATA_TABLE_JS" file="resources\media\media_data_table.js" type="BINDATA" />
<include name="IDR_MEDIA_ENGAGEMENT_HTML" file="resources\media\media_engagement.html" type="BINDATA" />
<include name="IDR_MEDIA_ENGAGEMENT_JS" file="resources\media\media_engagement.js" type="BINDATA" />
<include name="IDR_MEDIA_ENGAGEMENT_SCORE_DETAILS_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\media\media_engagement_score_details.mojom-lite.js" use_base_dir="false" type="BINDATA" />
- <include name="IDR_MEDIA_FEEDS_HTML" file="resources\media\media_feeds.html" type="BINDATA" />
- <include name="IDR_MEDIA_FEEDS_JS" file="resources\media\media_feeds.js" type="BINDATA" />
- <include name="IDR_MEDIA_FEEDS_STORE_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\media\feeds\media_feeds_store.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_MEDIA_HISTORY_HTML" file="resources\media\media_history.html" type="BINDATA" allowexternalscript="true" />
<include name="IDR_MEDIA_HISTORY_JS" file="resources\media\media_history.js" type="BINDATA" />
<include name="IDR_MEDIA_HISTORY_STORE_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\media\history\media_history_store.mojom-lite.js" use_base_dir="false" type="BINDATA" />
@@ -73,9 +65,6 @@ This file specifies browser resources for developer-facing chrome:// pages
<include name="IDR_FEED_INTERNALS_CSS" file="resources\feed_internals\feed_internals.css" allowexternalscript="true" type="BINDATA" />
<include name="IDR_FEED_INTERNALS_JS" file="resources\feed_internals\feed_internals.js" type="BINDATA" />
<include name="IDR_FEED_INTERNALS_MOJO_JS" file="${root_gen_dir}\chrome\browser\ui\webui\feed_internals\feed_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" />
- <include name="IDR_NOTIFICATIONS_INTERNALS_HTML" file="resources\internals\notifications\notifications_internals.html" type="BINDATA" />
- <include name="IDR_NOTIFICATIONS_INTERNALS_JS" file="resources\internals\notifications\notifications_internals.js" type="BINDATA" />
- <include name="IDR_NOTIFICATIONS_INTERNALS_BROWSER_PROXY_JS" file="resources\internals\notifications\notifications_internals_browser_proxy.js" type="BINDATA" />
<include name="IDR_QUERY_TILES_INTERNALS_HTML" file="resources\internals\query_tiles\query_tiles_internals.html" type="BINDATA" />
<include name="IDR_QUERY_TILES_INTERNALS_JS" file="resources\internals\query_tiles\query_tiles_internals.js" type="BINDATA" />
<include name="IDR_QUERY_TILES_INTERNALS_BROWSER_PROXY_JS" file="resources\internals\query_tiles\query_tiles_internals_browser_proxy.js" type="BINDATA" />
@@ -86,14 +75,21 @@ This file specifies browser resources for developer-facing chrome:// pages
<include name="IDR_FAMILY_LINK_USER_INTERNALS_CSS" file="resources\family_link_user_internals\family_link_user_internals.css" type="BINDATA" />
<include name="IDR_FAMILY_LINK_USER_INTERNALS_JS" file="resources\family_link_user_internals\family_link_user_internals.js" type="BINDATA" />
</if>
- <include name="IDR_TRANSLATE_INTERNALS_HTML" file="../../components/translate/translate_internals/translate_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
- <include name="IDR_TRANSLATE_INTERNALS_JS" file="../../components/translate/translate_internals/translate_internals.js" type="BINDATA" />
+ <include name="IDR_TRANSLATE_INTERNALS_CSS" file="../../components/translate/translate_internals/translate_internals.css" type="BINDATA" />
+ <include name="IDR_TRANSLATE_INTERNALS_HTML" file="../../components/translate/translate_internals/translate_internals.html" type="BINDATA" />
+ <include name="IDR_TRANSLATE_INTERNALS_JS" file="../../components/translate/translate_internals/translate_internals.js" preprocess="true" type="BINDATA" />
<include name="IDR_WEB_APP_INTERNALS_HTML" file="resources/web_app_internals/index.html" type="BINDATA" />
<include name="IDR_WEB_APP_INTERNALS_JS" file="${root_gen_dir}/chrome/browser/resources/web_app_internals/web_app_internals.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_WEB_APP_INTERNALS_MOJOM_LITE_JS" file="${root_gen_dir}/chrome/browser/ui/webui/internals/web_app/web_app_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_UKM_INTERNALS_HTML" file="../../components/ukm/debug/ukm_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
<include name="IDR_UKM_INTERNALS_JS" file="../../components/ukm/debug/ukm_internals.js" type="BINDATA" />
<include name="IDR_UKM_INTERNALS_CSS" file="../../components/ukm/debug/ukm_internals.css" type="BINDATA" />
+
+ <if expr="not is_android">
+ <include name="IDR_USER_EDUCATION_INTERNALS_HTML" file="resources/internals/user_education/index.html" type="BINDATA" />
+ <include name="IDR_USER_EDUCATION_INTERNALS_JS" file="${root_gen_dir}/chrome/browser/resources/internals/user_education/user_education_internals.js" use_base_dir="false" type="BINDATA" />
+ <include name="IDR_USER_EDUCATION_INTERNALS_MOJOM_WEBUI_JS" file="${root_gen_dir}/mojom-webui/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom-webui.js" resource_path="chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom-webui.js" use_base_dir="false" type="BINDATA" />
+ </if>
</includes>
</release>
</grit>
diff --git a/chromium/chrome/browser/devtools/BUILD.gn b/chromium/chrome/browser/devtools/BUILD.gn
index 281afd126dd..68f80ebb9a0 100644
--- a/chromium/chrome/browser/devtools/BUILD.gn
+++ b/chromium/chrome/browser/devtools/BUILD.gn
@@ -121,6 +121,7 @@ static_library("devtools") {
"//chrome:strings",
"//chrome/app/theme:theme_resources",
"//chrome/browser:browser_process",
+ "//chrome/browser/media/router:media_router_feature",
"//chrome/browser/profiles:profile",
"//chrome/common",
"//components/guest_view/browser",
diff --git a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 60917620903..564b10f4961 100644
--- a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -110,8 +111,8 @@ ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() {
// we are controlled entirely by the automation process.
// Keep the application running until explicit close through DevTools
// protocol.
- keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::REMOTE_DEBUGGING,
- KeepAliveRestartOption::DISABLED));
+ keep_alive_ = std::make_unique<ScopedKeepAlive>(
+ KeepAliveOrigin::REMOTE_DEBUGGING, KeepAliveRestartOption::DISABLED);
}
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
}
diff --git a/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc b/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
index 826b699db3d..c6abad80554 100644
--- a/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
+++ b/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -190,8 +191,8 @@ void AdbClientSocket::Connect(net::CompletionOnceCallback callback) {
net::AddressList address_list =
net::AddressList::CreateFromIPAddress(ip_address, port_);
- socket_.reset(new net::TCPClientSocket(address_list, nullptr, nullptr,
- nullptr, net::NetLogSource()));
+ socket_ = std::make_unique<net::TCPClientSocket>(
+ address_list, nullptr, nullptr, nullptr, net::NetLogSource());
connect_callback_ = std::move(callback);
int result = socket_->Connect(base::BindOnce(
&AdbClientSocket::RunConnectCallback, base::Unretained(this)));
@@ -228,14 +229,15 @@ void AdbClientSocket::SendCommand(const std::string& command,
"debugging."
})");
- base::RepeatingCallback<void(int)> on_response =
- base::AdaptCallbackForRepeating(
- base::BindOnce(&AdbClientSocket::ReadResponse, base::Unretained(this),
- std::move(callback), is_void));
- int result = socket_->Write(request_buffer.get(), request_buffer->size(),
- on_response, traffic_annotation);
- if (result != net::ERR_IO_PENDING)
- on_response.Run(result);
+ auto split_callback = base::SplitOnceCallback(
+ base::BindOnce(&AdbClientSocket::ReadResponse, base::Unretained(this),
+ std::move(callback), is_void));
+ int result =
+ socket_->Write(request_buffer.get(), request_buffer->size(),
+ std::move(split_callback.first), traffic_annotation);
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result);
+ }
}
void AdbClientSocket::ReadResponse(CommandCallback callback,
@@ -247,14 +249,14 @@ void AdbClientSocket::ReadResponse(CommandCallback callback,
}
scoped_refptr<net::IOBuffer> response_buffer =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
- base::RepeatingCallback<void(int)> on_response_header =
- base::AdaptCallbackForRepeating(base::BindOnce(
- &AdbClientSocket::OnResponseHeader, base::Unretained(this),
- std::move(callback), is_void, response_buffer));
- result =
- socket_->Read(response_buffer.get(), kBufferSize, on_response_header);
- if (result != net::ERR_IO_PENDING)
- on_response_header.Run(result);
+ auto split_callback = base::SplitOnceCallback(
+ base::BindOnce(&AdbClientSocket::OnResponseHeader, base::Unretained(this),
+ std::move(callback), is_void, response_buffer));
+ result = socket_->Read(response_buffer.get(), kBufferSize,
+ std::move(split_callback.first));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result);
+ }
}
void AdbClientSocket::OnResponseHeader(
@@ -320,16 +322,16 @@ void AdbClientSocket::OnResponseData(
}
// Read tail
- base::RepeatingCallback<void(int, const std::string&)> on_finished =
- base::AdaptCallbackForRepeating(std::move(callback));
+ auto split_callback = base::SplitOnceCallback(std::move(callback));
result = socket_->Read(
response_buffer.get(), kBufferSize,
base::BindOnce(&AdbClientSocket::OnResponseData, base::Unretained(this),
- on_finished, new_response, response_buffer, bytes_left));
+ std::move(split_callback.first), new_response,
+ response_buffer, bytes_left));
if (result > 0) {
- OnResponseData(on_finished, new_response, response_buffer, bytes_left,
- result);
+ OnResponseData(std::move(split_callback.second), new_response,
+ response_buffer, bytes_left, result);
} else if (result != net::ERR_IO_PENDING) {
- on_finished.Run(net::OK, new_response);
+ std::move(split_callback.second).Run(net::OK, new_response);
}
}
diff --git a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
index 43a3574821d..bfdf6cef2dd 100644
--- a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
+++ b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/devtools/device/port_forwarding_controller.h"
#include <map>
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -256,8 +257,8 @@ class SocketTunnel {
void OnResolved(net::AddressList resolved_addresses) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- host_socket_.reset(new net::TCPClientSocket(
- resolved_addresses, nullptr, nullptr, nullptr, net::NetLogSource()));
+ host_socket_ = std::make_unique<net::TCPClientSocket>(
+ resolved_addresses, nullptr, nullptr, nullptr, net::NetLogSource());
int result = host_socket_->Connect(
base::BindOnce(&SocketTunnel::OnConnected, base::Unretained(this)));
if (result != net::ERR_IO_PENDING)
diff --git a/chromium/chrome/browser/devtools/device/tcp_device_provider.cc b/chromium/chrome/browser/devtools/device/tcp_device_provider.cc
index bb2a0b75f97..d7ce27e2879 100644
--- a/chromium/chrome/browser/devtools/device/tcp_device_provider.cc
+++ b/chromium/chrome/browser/devtools/device/tcp_device_provider.cc
@@ -82,12 +82,12 @@ class ResolveHostAndOpenSocket final : public network::ResolveHostClientBase {
new net::TCPClientSocket(resolved_addresses.value(), nullptr, nullptr,
nullptr, net::NetLogSource()));
net::StreamSocket* socket_ptr = socket.get();
- net::CompletionRepeatingCallback on_connect =
- base::AdaptCallbackForRepeating(base::BindOnce(
- &RunSocketCallback, std::move(callback_), std::move(socket)));
- result = socket_ptr->Connect(on_connect);
- if (result != net::ERR_IO_PENDING)
- on_connect.Run(result);
+ auto split_callback = base::SplitOnceCallback(base::BindOnce(
+ &RunSocketCallback, std::move(callback_), std::move(socket)));
+ result = socket_ptr->Connect(std::move(split_callback.first));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result);
+ }
delete this;
}
diff --git a/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
index e920973dc3d..d281fea98db 100644
--- a/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
+++ b/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
@@ -220,7 +220,9 @@ class FakeAndroidUsbDevice : public FakeUsbDevice {
FakeAndroidUsbDevice(
scoped_refptr<FakeUsbDeviceInfo> device,
mojo::PendingRemote<device::mojom::UsbDeviceClient> client)
- : FakeUsbDevice(device, std::move(client)) {
+ : FakeUsbDevice(device,
+ /*blocked_interface_classes=*/{},
+ std::move(client)) {
broken_traits_ =
static_cast<FakeAndroidUsbDeviceInfo*>(device.get())->broken_traits();
}
@@ -424,6 +426,7 @@ class FakeAndroidUsbManager : public FakeUsbDeviceManager {
void GetDevice(
const std::string& guid,
+ const std::vector<uint8_t>& blocked_interface_classes,
mojo::PendingReceiver<device::mojom::UsbDevice> device_receiver,
mojo::PendingRemote<device::mojom::UsbDeviceClient> device_client)
override {
diff --git a/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc b/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
index 98bbcabce2c..1192d68721e 100644
--- a/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
+++ b/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
@@ -116,8 +116,8 @@ void CreateDeviceOnInterfaceClaimed(
AndroidDeviceInfo android_device_info,
mojo::Remote<device::mojom::UsbDevice> device,
const base::RepeatingClosure& barrier,
- bool success) {
- if (success) {
+ device::mojom::UsbClaimInterfaceResult result) {
+ if (result == device::mojom::UsbClaimInterfaceResult::kSuccess) {
devices->push_back(
new AndroidUsbDevice(rsa_key, android_device_info, std::move(device)));
barrier.Run();
diff --git a/chromium/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc b/chromium/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
index a6452ed6bf9..bab3661bf56 100644
--- a/chromium/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
+++ b/chromium/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
@@ -173,7 +173,8 @@ void UsbDeviceManagerHelper::GetDevice(
EnsureUsbDeviceManagerConnection();
DCHECK(device_manager_);
- device_manager_->GetDevice(guid, std::move(device_receiver),
+ device_manager_->GetDevice(guid, /*blocked_interface_classes=*/{},
+ std::move(device_receiver),
/*device_client=*/mojo::NullRemote());
}
diff --git a/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc b/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
index 351f05954f7..28e89f197ac 100644
--- a/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
+++ b/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
@@ -47,11 +47,13 @@ void OnRead(net::StreamSocket* socket,
}
std::string new_data = data + std::string(buffer->data(), result);
- net::CompletionRepeatingCallback on_read = base::AdaptCallbackForRepeating(
+ auto split_callback = base::SplitOnceCallback(
base::BindOnce(&OnRead, socket, buffer, new_data, std::move(callback)));
- result = socket->Read(buffer.get(), kBufferSize, on_read);
- if (result != net::ERR_IO_PENDING)
- on_read.Run(result);
+ result =
+ socket->Read(buffer.get(), kBufferSize, std::move(split_callback.first));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result);
+ }
}
void OpenedForCommand(UsbDeviceProvider::CommandCallback callback,
@@ -63,12 +65,13 @@ void OpenedForCommand(UsbDeviceProvider::CommandCallback callback,
}
scoped_refptr<net::IOBuffer> buffer =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
- net::CompletionRepeatingCallback on_read =
- base::AdaptCallbackForRepeating(base::BindOnce(
- &OnRead, socket, buffer, std::string(), std::move(callback)));
- result = socket->Read(buffer.get(), kBufferSize, on_read);
- if (result != net::ERR_IO_PENDING)
- on_read.Run(result);
+ auto split_callback = base::SplitOnceCallback(base::BindOnce(
+ &OnRead, socket, buffer, std::string(), std::move(callback)));
+ result =
+ socket->Read(buffer.get(), kBufferSize, std::move(split_callback.first));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result);
+ }
}
void RunCommand(scoped_refptr<AndroidUsbDevice> device,
@@ -79,11 +82,12 @@ void RunCommand(scoped_refptr<AndroidUsbDevice> device,
std::move(callback).Run(net::ERR_CONNECTION_FAILED, std::string());
return;
}
- auto completion = base::AdaptCallbackForRepeating(std::move(callback));
- int result =
- socket->Connect(base::BindOnce(&OpenedForCommand, completion, socket));
- if (result != net::ERR_IO_PENDING)
- completion.Run(result, std::string());
+ auto split_callback = base::SplitOnceCallback(std::move(callback));
+ int result = socket->Connect(base::BindOnce(
+ &OpenedForCommand, std::move(split_callback.first), socket));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result, std::string());
+ }
}
} // namespace
@@ -126,12 +130,12 @@ void UsbDeviceProvider::OpenSocket(const std::string& serial,
return;
}
- base::RepeatingCallback<void(int, std::unique_ptr<net::StreamSocket>)>
- on_result = base::AdaptCallbackForRepeating(std::move(callback));
- int result =
- socket->Connect(base::BindOnce(&OnOpenSocket, on_result, socket));
- if (result != net::ERR_IO_PENDING)
- on_result.Run(result, nullptr);
+ auto split_callback = base::SplitOnceCallback(std::move(callback));
+ int result = socket->Connect(
+ base::BindOnce(&OnOpenSocket, std::move(split_callback.first), socket));
+ if (result != net::ERR_IO_PENDING) {
+ std::move(split_callback.second).Run(result, nullptr);
+ }
}
void UsbDeviceProvider::ReleaseDevice(const std::string& serial) {
diff --git a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chromium/chrome/browser/devtools/devtools_browsertest.cc
index 8fffecf865d..81ccefa1153 100644
--- a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chromium/chrome/browser/devtools/devtools_browsertest.cc
@@ -218,15 +218,15 @@ void SwitchToExtensionPanel(DevToolsWindow* window,
} // namespace
-class DevToolsSanityTest : public InProcessBrowserTest {
+class DevToolsTest : public InProcessBrowserTest {
public:
- DevToolsSanityTest() : window_(nullptr) {}
+ DevToolsTest() : window_(nullptr) {}
void SetUpOnMainThread() override {
// A number of tests expect favicon requests to succeed - otherwise, they'll
// generate console errors.
embedded_test_server()->RegisterRequestHandler(
- base::BindRepeating(&DevToolsSanityTest::HandleFaviconRequest));
+ base::BindRepeating(&DevToolsTest::HandleFaviconRequest));
// LoadNetworkResourceForFrontend depends on "hello.html" from content's
// test directory.
embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data");
@@ -314,16 +314,16 @@ class DevToolsSanityTest : public InProcessBrowserTest {
DevToolsWindow* window_;
};
-class SitePerProcessDevToolsSanityTest : public DevToolsSanityTest {
+class SitePerProcessDevToolsTest : public DevToolsTest {
public:
void SetUpCommandLine(base::CommandLine* command_line) override {
- DevToolsSanityTest::SetUpCommandLine(command_line);
+ DevToolsTest::SetUpCommandLine(command_line);
content::IsolateAllSitesForTesting(command_line);
}
void SetUpOnMainThread() override {
content::SetupCrossSiteRedirector(embedded_test_server());
- DevToolsSanityTest::SetUpOnMainThread();
+ DevToolsTest::SetUpOnMainThread();
}
};
@@ -365,7 +365,7 @@ void DevToolsWindowBeforeUnloadObserver::BeforeUnloadFired(
message_loop_runner_->Quit();
}
-class DevToolsBeforeUnloadTest: public DevToolsSanityTest {
+class DevToolsBeforeUnloadTest: public DevToolsTest {
public:
void CloseInspectedTab() {
browser()->tab_strip_model()->CloseWebContentsAt(0,
@@ -389,7 +389,7 @@ class DevToolsBeforeUnloadTest: public DevToolsSanityTest {
content::PrepContentsForBeforeUnloadTest(web_contents);
}
- void RunBeforeUnloadSanityTest(
+ void RunBeforeUnloadTest(
bool is_docked,
base::RepeatingCallback<void(void)> close_method,
bool wait_for_browser_close = true) {
@@ -460,7 +460,7 @@ void TimeoutCallback(const std::string& timeout_message) {
// Base class for DevTools tests that test devtools functionality for
// extensions and content scripts.
-class DevToolsExtensionTest : public DevToolsSanityTest,
+class DevToolsExtensionTest : public DevToolsTest,
public content::NotificationObserver {
public:
DevToolsExtensionTest()
@@ -646,9 +646,9 @@ class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest {
}
};
-class WorkerDevToolsSanityTest : public InProcessBrowserTest {
+class WorkerDevToolsTest : public InProcessBrowserTest {
public:
- WorkerDevToolsSanityTest() : window_(nullptr) {}
+ WorkerDevToolsTest() : window_(nullptr) {}
void SetUpOnMainThread() override {
ASSERT_TRUE(embedded_test_server()->Start());
@@ -715,7 +715,7 @@ class WorkerDevToolsSanityTest : public InProcessBrowserTest {
// Tests that BeforeUnload event gets called on docked devtools if
// we try to close them.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestDockedDevToolsClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
true,
base::BindRepeating(&DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync,
base::Unretained(this)),
@@ -735,7 +735,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestDockedDevToolsClose) {
#endif
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
MAYBE_TestDockedDevToolsInspectedTabClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
true, base::BindRepeating(&DevToolsBeforeUnloadTest::CloseInspectedTab,
base::Unretained(this)));
}
@@ -744,7 +744,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
// we try to close the inspected browser.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
TestDockedDevToolsInspectedBrowserClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
true,
base::BindRepeating(&DevToolsBeforeUnloadTest::CloseInspectedBrowser,
base::Unretained(this)));
@@ -753,7 +753,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
// Tests that BeforeUnload event gets called on undocked devtools if
// we try to close them.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestUndockedDevToolsClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
false,
base::BindRepeating(&DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync,
base::Unretained(this)),
@@ -764,7 +764,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestUndockedDevToolsClose) {
// we try to close the inspected page.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
TestUndockedDevToolsInspectedTabClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
false, base::BindRepeating(&DevToolsBeforeUnloadTest::CloseInspectedTab,
base::Unretained(this)));
}
@@ -773,7 +773,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
// we try to close the inspected browser.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
TestUndockedDevToolsInspectedBrowserClose) {
- RunBeforeUnloadSanityTest(
+ RunBeforeUnloadTest(
false,
base::BindRepeating(&DevToolsBeforeUnloadTest::CloseInspectedBrowser,
base::Unretained(this)));
@@ -783,7 +783,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
// we try to exit application.
IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
TestUndockedDevToolsApplicationClose) {
- RunBeforeUnloadSanityTest(false,
+ RunBeforeUnloadTest(false,
base::BindRepeating(&chrome::CloseAllBrowsers));
}
@@ -878,7 +878,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
}
// Tests scripts panel showing.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestShowScriptsTab) {
RunTest("testShowScriptsTab", kDebuggerTestPage);
}
@@ -894,7 +894,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
#define MAYBE_TestScriptsTabIsPopulatedOnInspectedPageRefresh \
TestScriptsTabIsPopulatedOnInspectedPageRefresh
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
MAYBE_TestScriptsTabIsPopulatedOnInspectedPageRefresh) {
RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh",
kDebuggerTestPage);
@@ -1399,7 +1399,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionInItself) {
#else
#define MAYBE_DevtoolsInDevTools DevtoolsInDevTools
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_DevtoolsInDevTools) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_DevtoolsInDevTools) {
GURL devtools_url = GURL(chrome::kChromeUIDevToolsURL);
OpenDevToolsWindow(kDebuggerTestPage, false);
@@ -1570,8 +1570,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, TestEvaluateOnChromeScheme) {
}
// Tests that scripts are not duplicated after Scripts Panel switch.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
- TestNoScriptDuplicatesOnPanelSwitch) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestNoScriptDuplicatesOnPanelSwitch) {
RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage);
}
@@ -1583,7 +1582,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
#else
#define MAYBE_TestPauseWhenLoadingDevTools TestPauseWhenLoadingDevTools
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestPauseWhenLoadingDevTools) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestPauseWhenLoadingDevTools) {
RunTest("testPauseWhenLoadingDevTools", kPauseWhenLoadingDevTools);
}
@@ -1599,28 +1598,28 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestPauseWhenLoadingDevTools) {
#else
#define MAYBE_TestPauseWhenScriptIsRunning TestPauseWhenScriptIsRunning
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
MAYBE_TestPauseWhenScriptIsRunning) {
RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning);
}
// Tests network timing.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkTiming) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestNetworkTiming) {
RunTest("testNetworkTiming", kSlowTestPage);
}
// Tests network size.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSize) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestNetworkSize) {
RunTest("testNetworkSize", kChunkedTestPage);
}
// Tests raw headers text.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSyncSize) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestNetworkSyncSize) {
RunTest("testNetworkSyncSize", kChunkedTestPage);
}
// Tests raw headers text.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestNetworkRawHeadersText) {
// This test expects headers to be exactly 112 bytes in length, so add an
// extra header to reach that length.
RunTest("testNetworkRawHeadersText",
@@ -1673,7 +1672,7 @@ bool InterceptURLLoad(content::URLLoaderInterceptor::RequestParams* params) {
} // namespace
// TODO(crbug.com/1046784) Flaky
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestNetworkPushTime) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, DISABLED_TestNetworkPushTime) {
content::URLLoaderInterceptor interceptor(
base::BindRepeating(InterceptURLLoad));
@@ -1691,18 +1690,19 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestNetworkPushTime) {
#else
#define MAYBE_TestDOMWarnings TestDOMWarnings
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestDOMWarnings) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestDOMWarnings) {
RunTest("testDOMWarnings", kDOMWarningsTestPage);
}
// Tests that console messages are not duplicated on navigation back.
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(MEMORY_SANITIZER)
// Flaking on windows swarm try runs: crbug.com/409285.
+// Also flaking on MSan runs: crbug.com/1182861
#define MAYBE_TestConsoleOnNavigateBack DISABLED_TestConsoleOnNavigateBack
#else
#define MAYBE_TestConsoleOnNavigateBack TestConsoleOnNavigateBack
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestConsoleOnNavigateBack) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestConsoleOnNavigateBack) {
RunTest("testConsoleOnNavigateBack", kNavigateBackTestPage);
}
@@ -1712,11 +1712,11 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestConsoleOnNavigateBack) {
#else
#define MAYBE_TestDeviceEmulation TestDeviceEmulation
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestDeviceEmulation) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestDeviceEmulation) {
RunTest("testDeviceMetricsOverrides", "about:blank");
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDispatchKeyEventDoesNotCrash) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestDispatchKeyEventDoesNotCrash) {
RunTest("testDispatchKeyEventDoesNotCrash", "about:blank");
}
@@ -1746,14 +1746,15 @@ class AutofillManagerTestDelegateDevtoolsImpl
};
// Disabled. Failing on MacOS MSAN. See https://crbug.com/849129.
-#if defined(OS_MAC)
+// Also failing on Linux. See https://crbug.com/1187693.
+#if defined(OS_MAC) || defined(OS_LINUX)
#define MAYBE_TestDispatchKeyEventShowsAutoFill \
DISABLED_TestDispatchKeyEventShowsAutoFill
#else
#define MAYBE_TestDispatchKeyEventShowsAutoFill \
TestDispatchKeyEventShowsAutoFill
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
MAYBE_TestDispatchKeyEventShowsAutoFill) {
OpenDevToolsWindow(kDispatchKeyEventShowsAutoFill, false);
@@ -1772,7 +1773,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
// Tests that whitelisted unhandled shortcuts are forwarded from inspected page
// into devtools frontend
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, testKeyEventUnhandled) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, testKeyEventUnhandled) {
OpenDevToolsWindow("about:blank", true);
RunTestFunction(window_, "testKeyEventUnhandled");
CloseDevToolsWindow();
@@ -1780,7 +1781,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, testKeyEventUnhandled) {
// Tests that the keys that are forwarded from the browser update
// when their shortcuts change
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, testForwardedKeysChanged) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, testForwardedKeysChanged) {
OpenDevToolsWindow("about:blank", true);
RunTestFunction(window_, "testForwardedKeysChanged");
CloseDevToolsWindow();
@@ -1794,14 +1795,14 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, testForwardedKeysChanged) {
#else
#define MAYBE_testShowCertificate testShowCertificate
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_testShowCertificate) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_testShowCertificate) {
OpenDevToolsWindow("about:blank", true);
RunTestFunction(window_, "testShowCertificate");
CloseDevToolsWindow();
}
// Tests that settings are stored in profile correctly.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestSettings) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestSettings) {
OpenDevToolsWindow("about:blank", true);
RunTestFunction(window_, "testSettings");
CloseDevToolsWindow();
@@ -1810,7 +1811,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestSettings) {
// Tests that external navigation from inspector page is always handled by
// DevToolsWindow and results in inspected page navigation. See also
// https://crbug.com/180555.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestDevToolsExternalNavigation) {
OpenDevToolsWindow(kDebuggerTestPage, true);
GURL url = embedded_test_server()->GetURL(kNavigateBackTestPage);
ui_test_utils::UrlLoadObserver observer(url,
@@ -1827,7 +1828,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) {
}
// Tests that toolbox window is loaded when DevTools window is undocked.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxLoadedUndocked) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestToolboxLoadedUndocked) {
OpenDevToolsWindow(kDebuggerTestPage, false);
ASSERT_TRUE(toolbox_web_contents());
DevToolsWindow* on_self =
@@ -1838,7 +1839,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxLoadedUndocked) {
}
// Tests that toolbox window is not loaded when DevTools window is docked.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxNotLoadedDocked) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestToolboxNotLoadedDocked) {
OpenDevToolsWindow(kDebuggerTestPage, true);
ASSERT_FALSE(toolbox_web_contents());
DevToolsWindow* on_self =
@@ -1851,11 +1852,11 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxNotLoadedDocked) {
// Tests that inspector will reattach to inspected page when it is reloaded
// after a crash. See http://crbug.com/101952
// Disabled. it doesn't check anything right now: http://crbug.com/461790
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestReattachAfterCrash) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, DISABLED_TestReattachAfterCrash) {
RunTest("testReattachAfterCrash", kArbitraryPage);
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestPageWithNoJavaScript) {
OpenDevToolsWindow("about:blank", false);
std::string result;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
@@ -1867,7 +1868,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) {
CloseDevToolsWindow();
}
-class DevToolsAutoOpenerTest : public DevToolsSanityTest {
+class DevToolsAutoOpenerTest : public DevToolsTest {
public:
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kAutoOpenDevToolsForTabs);
@@ -1905,7 +1906,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsAutoOpenerTest, MAYBE_TestAutoOpenForTabs) {
observer_->CloseAllSync();
}
-class DevToolsReattachAfterCrashTest : public DevToolsSanityTest {
+class DevToolsReattachAfterCrashTest : public DevToolsTest {
protected:
void RunTestWithPanel(const char* panel_name) {
OpenDevToolsWindow("about:blank", false);
@@ -1933,7 +1934,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsReattachAfterCrashTest,
RunTestWithPanel("network");
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, AutoAttachToWindowOpen) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, AutoAttachToWindowOpen) {
OpenDevToolsWindow(kWindowOpenTestPage, false);
DevToolsWindowTesting::Get(window_)->SetOpenNewWindowForPopups(true);
DevToolsWindowCreationObserver observer;
@@ -1946,7 +1947,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, AutoAttachToWindowOpen) {
}
// TODO(crbug.com/1102964) Flaky
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_SecondTabAfterDevTools) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, DISABLED_SecondTabAfterDevTools) {
OpenDevToolsWindow(kDebuggerTestPage, true);
ui_test_utils::NavigateToURLWithDisposition(
@@ -1963,7 +1964,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_SecondTabAfterDevTools) {
CloseDevToolsWindow();
}
-IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, InspectSharedWorker) {
+IN_PROC_BROWSER_TEST_F(WorkerDevToolsTest, InspectSharedWorker) {
GURL url = embedded_test_server()->GetURL(kSharedWorkerTestPage);
ui_test_utils::NavigateToURL(browser(), url);
@@ -1975,7 +1976,7 @@ IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, InspectSharedWorker) {
}
// Flaky on multiple platforms. See http://crbug.com/432444
-IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(WorkerDevToolsTest,
PauseInSharedWorkerInitialization) {
GURL url = embedded_test_server()->GetURL(kReloadSharedWorkerTestPage);
ui_test_utils::NavigateToURL(browser(), url);
@@ -2037,7 +2038,7 @@ IN_PROC_BROWSER_TEST_F(RemoteDebuggingTest, MAYBE_RemoteDebugger) {
ASSERT_TRUE(RunExtensionTest("target_list")) << message_;
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, PolicyDisallowed) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, PolicyDisallowed) {
browser()->profile()->GetPrefs()->SetInteger(
prefs::kDevToolsAvailability,
static_cast<int>(
@@ -2050,7 +2051,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, PolicyDisallowed) {
ASSERT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
}
-class DevToolsSanityExtensionTest : public extensions::ExtensionBrowserTest {
+class DevToolsExtensionForceInstallTest : public extensions::ExtensionBrowserTest {
public:
// Installs an extensions, emulating that it has been force-installed by
// policy.
@@ -2063,7 +2064,8 @@ class DevToolsSanityExtensionTest : public extensions::ExtensionBrowserTest {
.AppendASCII("extensions")
.AppendASCII("options.crx");
const Extension* extension = InstallExtension(
- crx_path, 1, extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD);
+ crx_path, 1,
+ extensions::mojom::ManifestLocation::kExternalPolicyDownload);
ASSERT_TRUE(extension);
*extension_id = extension->id();
}
@@ -2081,7 +2083,7 @@ class DevToolsSanityExtensionTest : public extensions::ExtensionBrowserTest {
}
};
-IN_PROC_BROWSER_TEST_F(DevToolsSanityExtensionTest,
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionForceInstallTest,
PolicyDisallowedForForceInstalledExtensions) {
browser()->profile()->GetPrefs()->SetInteger(
prefs::kDevToolsAvailability,
@@ -2097,7 +2099,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityExtensionTest,
}
IN_PROC_BROWSER_TEST_F(
- DevToolsSanityExtensionTest,
+ DevToolsExtensionForceInstallTest,
PolicyDisallowedForForceInstalledExtensionsAfterNavigation) {
browser()->profile()->GetPrefs()->SetInteger(
prefs::kDevToolsAvailability,
@@ -2121,7 +2123,7 @@ IN_PROC_BROWSER_TEST_F(
ASSERT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
}
-class DevToolsAllowedByCommandLineSwitch : public DevToolsSanityExtensionTest {
+class DevToolsAllowedByCommandLineSwitch : public DevToolsExtensionForceInstallTest {
public:
void SetUpCommandLine(base::CommandLine* command_line) override {
extensions::ExtensionBrowserTest::SetUpCommandLine(command_line);
@@ -2156,11 +2158,11 @@ IN_PROC_BROWSER_TEST_F(DevToolsAllowedByCommandLineSwitch,
#endif
}
-class DevToolsPixelOutputTests : public DevToolsSanityTest {
+class DevToolsPixelOutputTests : public DevToolsTest {
public:
void SetUp() override {
EnablePixelOutput();
- DevToolsSanityTest::SetUp();
+ DevToolsTest::SetUp();
}
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kUseGpuInTests);
@@ -2210,7 +2212,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsPixelOutputTests,
CloseDevToolsWindow();
}
-class DevToolsNetInfoTest : public DevToolsSanityTest {
+class DevToolsNetInfoTest : public DevToolsTest {
protected:
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kEnableNetworkInformationDownlinkMax);
@@ -2277,7 +2279,7 @@ class MockWebUIProvider
// This tests checks that window is correctly initialized when DevTools is
// opened while navigation through history with forward and back actions.
// (crbug.com/627407)
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
TestWindowInitializedOnNavigateBack) {
TestChromeWebUIControllerFactory test_factory;
MockWebUIProvider mock_provider("dummyurl",
@@ -2302,7 +2304,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory);
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestRawHeadersWithRedirectAndHSTS) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, TestRawHeadersWithRedirectAndHSTS) {
net::EmbeddedTestServer https_test_server(
net::EmbeddedTestServer::TYPE_HTTPS);
https_test_server.SetSSLConfig(
@@ -2343,7 +2345,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestRawHeadersWithRedirectAndHSTS) {
#else
#define MAYBE_TestOpenInNewTabFilter TestOpenInNewTabFilter
#endif
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestOpenInNewTabFilter) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestOpenInNewTabFilter) {
OpenDevToolsWindow(kDebuggerTestPage, false);
DevToolsUIBindings::Delegate* bindings_delegate_ =
static_cast<DevToolsUIBindings::Delegate*>(window_);
@@ -2388,7 +2390,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestOpenInNewTabFilter) {
CloseDevToolsWindow();
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, LoadNetworkResourceForFrontend) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, LoadNetworkResourceForFrontend) {
std::string file_url =
"file://" + base::PathService::CheckedGet(base::DIR_SOURCE_ROOT)
.AppendASCII("content/test/data/devtools/navigation.html")
@@ -2406,7 +2408,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, LoadNetworkResourceForFrontend) {
}
// TODO(crbug.com/921608) Disabled for flakiness.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_CreateBrowserContext) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, DISABLED_CreateBrowserContext) {
GURL url(embedded_test_server()->GetURL("/devtools/empty.html"));
window_ = DevToolsWindowTesting::OpenDiscoveryDevToolsWindowSync(
browser()->profile());
@@ -2415,7 +2417,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_CreateBrowserContext) {
}
// TODO(crbug.com/1110417): Flaky.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
DISABLED_DisposeEmptyBrowserContext) {
window_ = DevToolsWindowTesting::OpenDiscoveryDevToolsWindowSync(
browser()->profile());
@@ -2425,14 +2427,14 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
// TODO(1078348): Find a better strategy for testing protocol methods against
// non-headless Chrome.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, NewWindowFromBrowserContext) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, NewWindowFromBrowserContext) {
window_ = DevToolsWindowTesting::OpenDiscoveryDevToolsWindowSync(
browser()->profile());
RunTestMethod("testNewWindowFromBrowserContext");
DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
}
-IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsSanityTest, InspectElement) {
+IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsTest, InspectElement) {
GURL url(embedded_test_server()->GetURL("a.com", "/devtools/oopif.html"));
GURL iframe_url(
embedded_test_server()->GetURL("b.com", "/devtools/oopif_frame.html"));
@@ -2463,7 +2465,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsSanityTest, InspectElement) {
DevToolsWindowTesting::CloseDevToolsWindowSync(window);
}
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, ExistsForWebContentsAfterClosing) {
+IN_PROC_BROWSER_TEST_F(DevToolsTest, ExistsForWebContentsAfterClosing) {
ASSERT_FALSE(content::DevToolsAgentHost::HasFor(GetInspectedTab()));
// Simulate opening devtools for the current tab.
@@ -2581,7 +2583,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsPolicyTest, OpenBlackListedDevTools) {
}
// Flaky on Mus. See https://crbug.com/819285.
-IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsSanityTest,
+IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsTest,
DISABLED_InputDispatchEventsToOOPIF) {
GURL url(
embedded_test_server()->GetURL("a.com", "/devtools/oopif-input.html"));
@@ -2628,7 +2630,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
namespace {
-class DevToolsLocalizationTest : public DevToolsSanityTest {
+class DevToolsLocalizationTest : public DevToolsTest {
public:
bool NavigatorLanguageMatches(const std::string& expected_locale) {
bool result = false;
diff --git a/chromium/chrome/browser/devtools/devtools_file_helper.cc b/chromium/chrome/browser/devtools/devtools_file_helper.cc
index bde2af7c03d..a86bc0fd4eb 100644
--- a/chromium/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chromium/chrome/browser/devtools/devtools_file_helper.cc
@@ -117,7 +117,7 @@ class SelectFileDialog : public ui::SelectFileDialog::Listener {
file_type_info.extensions[0].push_back(ext);
}
select_file_dialog_->SelectFile(
- type, base::string16(), default_path, &file_type_info, 0, ext,
+ type, std::u16string(), default_path, &file_type_info, 0, ext,
platform_util::GetTopLevel(web_contents->GetNativeView()), nullptr);
}
@@ -347,9 +347,9 @@ void DevToolsFileHelper::InnerAddFileSystem(
RemoveFileSystem(file_system_path);
std::string path_display_name = path.AsEndingWithSeparator().AsUTF8Unsafe();
- base::string16 message = l10n_util::GetStringFUTF16(
- IDS_DEV_TOOLS_CONFIRM_ADD_FILE_SYSTEM_MESSAGE,
- base::UTF8ToUTF16(path_display_name));
+ std::u16string message =
+ l10n_util::GetStringFUTF16(IDS_DEV_TOOLS_CONFIRM_ADD_FILE_SYSTEM_MESSAGE,
+ base::UTF8ToUTF16(path_display_name));
show_info_bar_callback.Run(
message, BindOnce(&DevToolsFileHelper::AddUserConfirmedFileSystem,
weak_factory_.GetWeakPtr(), type, path));
diff --git a/chromium/chrome/browser/devtools/devtools_file_helper.h b/chromium/chrome/browser/devtools/devtools_file_helper.h
index df74930e32e..9b37a11c9a1 100644
--- a/chromium/chrome/browser/devtools/devtools_file_helper.h
+++ b/chromium/chrome/browser/devtools/devtools_file_helper.h
@@ -15,7 +15,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/devtools/devtools_file_watcher.h"
#include "chrome/browser/platform_util.h"
#include "components/prefs/pref_change_registrar.h"
@@ -66,7 +65,7 @@ class DevToolsFileHelper {
using SaveCallback = base::OnceCallback<void(const std::string&)>;
using ShowInfoBarCallback =
- base::RepeatingCallback<void(const base::string16&,
+ base::RepeatingCallback<void(const std::u16string&,
base::OnceCallback<void(bool)>)>;
// Saves |content| to the file and associates its path with given |url|.
diff --git a/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc b/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
index 7c2ad28a66e..a5b6700a697 100644
--- a/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
+++ b/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
@@ -7,6 +7,7 @@
#include <stddef.h>
#include <iterator>
+#include <memory>
#include "base/bind.h"
#include "base/callback.h"
@@ -25,7 +26,6 @@
#include "content/public/browser/browser_thread.h"
using base::Bind;
-using base::Callback;
using base::FileEnumerator;
using base::FilePath;
using base::Time;
@@ -259,8 +259,6 @@ void Index::NormalizeVectors() {
}
}
-typedef Callback<void(bool, const vector<bool>&)> IndexerCallback;
-
} // namespace
DevToolsFileSystemIndexer::FileSystemIndexingJob::FileSystemIndexingJob(
@@ -304,16 +302,16 @@ void DevToolsFileSystemIndexer::FileSystemIndexingJob::CollectFilesToIndex() {
if (stopped_)
return;
if (!file_enumerator_) {
- file_enumerator_.reset(new FileEnumerator(
+ file_enumerator_ = std::make_unique<FileEnumerator>(
pending_folders_.back(), false,
- FileEnumerator::FILES | FileEnumerator::DIRECTORIES));
+ FileEnumerator::FILES | FileEnumerator::DIRECTORIES);
pending_folders_.pop_back();
}
FilePath file_path = file_enumerator_->Next();
if (file_path.empty() && !pending_folders_.empty()) {
- file_enumerator_.reset(new FileEnumerator(
+ file_enumerator_ = std::make_unique<FileEnumerator>(
pending_folders_.back(), false,
- FileEnumerator::FILES | FileEnumerator::DIRECTORIES));
+ FileEnumerator::FILES | FileEnumerator::DIRECTORIES);
pending_folders_.pop_back();
impl_task_runner()->PostTask(
FROM_HERE, BindOnce(&FileSystemIndexingJob::CollectFilesToIndex, this));
diff --git a/chromium/chrome/browser/devtools/devtools_file_watcher.cc b/chromium/chrome/browser/devtools/devtools_file_watcher.cc
index 831a32b0e23..19d479e0f25 100644
--- a/chromium/chrome/browser/devtools/devtools_file_watcher.cc
+++ b/chromium/chrome/browser/devtools/devtools_file_watcher.cc
@@ -129,7 +129,7 @@ void DevToolsFileWatcher::SharedFileWatcher::AddWatch(
return;
if (!base::FilePathWatcher::RecursiveWatchAvailable())
return;
- watchers_[path].reset(new base::FilePathWatcher());
+ watchers_[path] = std::make_unique<base::FilePathWatcher>();
bool success = watchers_[path]->Watch(
path, base::FilePathWatcher::Type::kRecursive,
base::BindRepeating(&SharedFileWatcher::DirectoryChanged,
diff --git a/chromium/chrome/browser/devtools/devtools_infobar_delegate.cc b/chromium/chrome/browser/devtools/devtools_infobar_delegate.cc
index aa2f030344f..35bd5172aa4 100644
--- a/chromium/chrome/browser/devtools/devtools_infobar_delegate.cc
+++ b/chromium/chrome/browser/devtools/devtools_infobar_delegate.cc
@@ -9,14 +9,14 @@
#include "ui/base/l10n/l10n_util.h"
// static
-void DevToolsInfoBarDelegate::Create(const base::string16& message,
+void DevToolsInfoBarDelegate::Create(const std::u16string& message,
Callback callback) {
std::unique_ptr<ConfirmInfoBarDelegate> delegate(
new DevToolsInfoBarDelegate(message, std::move(callback)));
GlobalConfirmInfoBar::Show(std::move(delegate));
}
-DevToolsInfoBarDelegate::DevToolsInfoBarDelegate(const base::string16& message,
+DevToolsInfoBarDelegate::DevToolsInfoBarDelegate(const std::u16string& message,
Callback callback)
: message_(message), callback_(std::move(callback)) {}
@@ -30,11 +30,11 @@ DevToolsInfoBarDelegate::GetIdentifier() const {
return DEV_TOOLS_INFOBAR_DELEGATE;
}
-base::string16 DevToolsInfoBarDelegate::GetMessageText() const {
+std::u16string DevToolsInfoBarDelegate::GetMessageText() const {
return message_;
}
-base::string16 DevToolsInfoBarDelegate::GetButtonLabel(
+std::u16string DevToolsInfoBarDelegate::GetButtonLabel(
InfoBarButton button) const {
return l10n_util::GetStringUTF16((button == BUTTON_OK)
? IDS_DEV_TOOLS_CONFIRM_ALLOW_BUTTON
diff --git a/chromium/chrome/browser/devtools/devtools_infobar_delegate.h b/chromium/chrome/browser/devtools/devtools_infobar_delegate.h
index c92c3594e53..5780ac642b9 100644
--- a/chromium/chrome/browser/devtools/devtools_infobar_delegate.h
+++ b/chromium/chrome/browser/devtools/devtools_infobar_delegate.h
@@ -5,27 +5,28 @@
#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_INFOBAR_DELEGATE_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_INFOBAR_DELEGATE_H_
+#include <string>
+
#include "base/callback.h"
-#include "base/strings/string16.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
class DevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
public:
using Callback = base::OnceCallback<void(bool)>;
- static void Create(const base::string16& message, Callback callback);
+ static void Create(const std::u16string& message, Callback callback);
private:
- DevToolsInfoBarDelegate(const base::string16& message, Callback callback);
+ DevToolsInfoBarDelegate(const std::u16string& message, Callback callback);
~DevToolsInfoBarDelegate() override;
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
- base::string16 GetMessageText() const override;
- base::string16 GetButtonLabel(InfoBarButton button) const override;
+ std::u16string GetMessageText() const override;
+ std::u16string GetButtonLabel(InfoBarButton button) const override;
bool Accept() override;
bool Cancel() override;
- const base::string16 message_;
+ const std::u16string message_;
Callback callback_;
DISALLOW_COPY_AND_ASSIGN(DevToolsInfoBarDelegate);
diff --git a/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc b/chromium/chrome/browser/devtools/devtools_interactive_browsertest.cc
index 7b4eb494874..7b4eb494874 100644
--- a/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc
+++ b/chromium/chrome/browser/devtools/devtools_interactive_browsertest.cc
diff --git a/chromium/chrome/browser/devtools/devtools_toggle_action.cc b/chromium/chrome/browser/devtools/devtools_toggle_action.cc
index 11e3509d01b..27795f771fe 100644
--- a/chromium/chrome/browser/devtools/devtools_toggle_action.cc
+++ b/chromium/chrome/browser/devtools/devtools_toggle_action.cc
@@ -4,11 +4,12 @@
#include "chrome/browser/devtools/devtools_toggle_action.h"
-DevToolsToggleAction::RevealParams::RevealParams(const base::string16& url,
+#include <memory>
+
+DevToolsToggleAction::RevealParams::RevealParams(const std::u16string& url,
size_t line_number,
size_t column_number)
- : url(url), line_number(line_number), column_number(column_number) {
-}
+ : url(url), line_number(line_number), column_number(column_number) {}
DevToolsToggleAction::RevealParams::~RevealParams() {
}
@@ -28,7 +29,7 @@ DevToolsToggleAction::DevToolsToggleAction(const DevToolsToggleAction& rhs)
void DevToolsToggleAction::operator=(const DevToolsToggleAction& rhs) {
type_ = rhs.type_;
if (rhs.params_.get())
- params_.reset(new RevealParams(*rhs.params_));
+ params_ = std::make_unique<RevealParams>(*rhs.params_);
}
DevToolsToggleAction::~DevToolsToggleAction() {
@@ -65,10 +66,9 @@ DevToolsToggleAction DevToolsToggleAction::Toggle() {
}
// static
-DevToolsToggleAction DevToolsToggleAction::Reveal(
- const base::string16& url,
- size_t line_number,
- size_t column_number) {
+DevToolsToggleAction DevToolsToggleAction::Reveal(const std::u16string& url,
+ size_t line_number,
+ size_t column_number) {
return DevToolsToggleAction(
new RevealParams(url, line_number, column_number));
}
diff --git a/chromium/chrome/browser/devtools/devtools_toggle_action.h b/chromium/chrome/browser/devtools/devtools_toggle_action.h
index c6a3a4e73f0..42b035d6081 100644
--- a/chromium/chrome/browser/devtools/devtools_toggle_action.h
+++ b/chromium/chrome/browser/devtools/devtools_toggle_action.h
@@ -8,8 +8,8 @@
#include <stddef.h>
#include <memory>
+#include <string>
-#include "base/strings/string16.h"
struct DevToolsToggleAction {
public:
@@ -25,12 +25,12 @@ struct DevToolsToggleAction {
};
struct RevealParams {
- RevealParams(const base::string16& url,
+ RevealParams(const std::u16string& url,
size_t line_number,
size_t column_number);
~RevealParams();
- base::string16 url;
+ std::u16string url;
size_t line_number;
size_t column_number;
};
@@ -45,7 +45,7 @@ struct DevToolsToggleAction {
static DevToolsToggleAction PauseInDebugger();
static DevToolsToggleAction Inspect();
static DevToolsToggleAction Toggle();
- static DevToolsToggleAction Reveal(const base::string16& url,
+ static DevToolsToggleAction Reveal(const std::u16string& url,
size_t line_number,
size_t column_number);
static DevToolsToggleAction NoOp();
diff --git a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
index a4d42edfc22..0f447f838c4 100644
--- a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -144,6 +144,10 @@ static const char kDevToolsDeveloperResourceLoadedHistogram[] =
"DevTools.DeveloperResourceLoaded";
static const char kDevToolsDeveloperResourceSchemeHistogram[] =
"DevTools.DeveloperResourceScheme";
+static const char kDevToolsLinearMemoryInspectorRevealedFromHistogram[] =
+ "DevTools.LinearMemoryInspector.RevealedFrom";
+static const char kDevToolsLinearMemoryInspectorTargetHistogram[] =
+ "DevTools.LinearMemoryInspector.Target";
static const char kRemotePageActionInspect[] = "inspect";
static const char kRemotePageActionReload[] = "reload";
@@ -580,7 +584,8 @@ class DevToolsUIBindings::FrontendWebContentsObserver
void RenderProcessGone(base::TerminationStatus status) override;
void ReadyToCommitNavigation(
content::NavigationHandle* navigation_handle) override;
- void DocumentOnLoadCompletedInMainFrame() override;
+ void DocumentOnLoadCompletedInMainFrame(
+ content::RenderFrameHost* render_frame_host) override;
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
@@ -657,7 +662,8 @@ void DevToolsUIBindings::FrontendWebContentsObserver::ReadyToCommitNavigation(
}
void DevToolsUIBindings::FrontendWebContentsObserver::
- DocumentOnLoadCompletedInMainFrame() {
+ DocumentOnLoadCompletedInMainFrame(
+ content::RenderFrameHost* render_frame_host) {
devtools_bindings_->DocumentOnLoadCompletedInMainFrame();
}
@@ -690,9 +696,11 @@ DevToolsUIBindings::DevToolsUIBindings(content::WebContents* web_contents)
devices_updates_enabled_(false),
frontend_loaded_(false) {
g_devtools_ui_bindings_instances.Get().push_back(this);
- frontend_contents_observer_.reset(new FrontendWebContentsObserver(this));
+ frontend_contents_observer_ =
+ std::make_unique<FrontendWebContentsObserver>(this);
- file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_, this));
+ file_helper_ =
+ std::make_unique<DevToolsFileHelper>(web_contents_, profile_, this);
file_system_indexer_ = new DevToolsFileSystemIndexer();
extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
web_contents_);
@@ -949,7 +957,7 @@ void DevToolsUIBindings::LoadNetworkResource(DispatchCallback callback,
return;
}
} else {
- auto* partition = content::BrowserContext::GetStoragePartitionForSite(
+ auto* partition = content::BrowserContext::GetStoragePartitionForUrl(
web_contents_->GetBrowserContext(), gurl);
url_loader_factory = partition->GetURLLoaderFactoryForBrowserProcess();
}
@@ -1325,7 +1333,9 @@ void DevToolsUIBindings::RecordEnumeratedHistogram(const std::string& name,
name == kDevToolsCssEditorOpenedHistogram ||
name == kDevToolsIssueCreatedHistogram ||
name == kDevToolsDeveloperResourceLoadedHistogram ||
- name == kDevToolsDeveloperResourceSchemeHistogram)
+ name == kDevToolsDeveloperResourceSchemeHistogram ||
+ name == kDevToolsLinearMemoryInspectorRevealedFromHistogram ||
+ name == kDevToolsLinearMemoryInspectorTargetHistogram)
base::UmaHistogramExactLinear(name, sample, boundary_value);
else
frontend_host_->BadMessageReceived();
@@ -1488,7 +1498,7 @@ void DevToolsUIBindings::SearchCompleted(
}
void DevToolsUIBindings::ShowDevToolsInfoBar(
- const base::string16& message,
+ const std::u16string& message,
DevToolsInfoBarDelegate::Callback callback) {
if (!delegate_->GetInfoBarService()) {
std::move(callback).Run(false);
@@ -1527,9 +1537,10 @@ void DevToolsUIBindings::AddDevToolsExtensionsToClient() {
new base::DictionaryValue());
extension_info->SetString("startPage", url.spec());
extension_info->SetString("name", extension->name());
- extension_info->SetBoolean("exposeExperimentalAPIs",
- extension->permissions_data()->HasAPIPermission(
- extensions::APIPermission::kExperimental));
+ extension_info->SetBoolean(
+ "exposeExperimentalAPIs",
+ extension->permissions_data()->HasAPIPermission(
+ extensions::mojom::APIPermissionID::kExperimental));
results.Append(std::move(extension_info));
}
@@ -1560,11 +1571,12 @@ void DevToolsUIBindings::ShowSurvey(DispatchCallback callback,
ShowSurveyCallback(std::move(callback), false);
return;
}
- base::RepeatingCallback<void(const base::Value*)> on_survey =
- base::AdaptCallbackForRepeating(std::move(callback));
+ auto split_callback = base::SplitOnceCallback(std::move(callback));
hats_service->LaunchSurvey(
- trigger, base::BindOnce(ShowSurveyCallback, on_survey, true),
- base::BindOnce(ShowSurveyCallback, on_survey, false));
+ trigger,
+ base::BindOnce(ShowSurveyCallback, std::move(split_callback.first), true),
+ base::BindOnce(ShowSurveyCallback, std::move(split_callback.second),
+ false));
}
void DevToolsUIBindings::CanShowSurvey(DispatchCallback callback,
diff --git a/chromium/chrome/browser/devtools/devtools_ui_bindings.h b/chromium/chrome/browser/devtools/devtools_ui_bindings.h
index a4987fd55d6..a6213ab9792 100644
--- a/chromium/chrome/browser/devtools/devtools_ui_bindings.h
+++ b/chromium/chrome/browser/devtools/devtools_ui_bindings.h
@@ -13,7 +13,6 @@
#include "base/containers/unique_ptr_adapters.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/devtools/device/devtools_android_bridge.h"
#include "chrome/browser/devtools/devtools_embedder_message_dispatcher.h"
#include "chrome/browser/devtools/devtools_file_helper.h"
@@ -223,7 +222,7 @@ class DevToolsUIBindings : public DevToolsEmbedderMessageDispatcher::Delegate,
void SearchCompleted(int request_id,
const std::string& file_system_path,
const std::vector<std::string>& file_paths);
- void ShowDevToolsInfoBar(const base::string16& message,
+ void ShowDevToolsInfoBar(const std::u16string& message,
DevToolsInfoBarDelegate::Callback callback);
// Extensions support.
diff --git a/chromium/chrome/browser/devtools/devtools_window.cc b/chromium/chrome/browser/devtools/devtools_window.cc
index eb0d4c58bfa..6c9256ab32e 100644
--- a/chromium/chrome/browser/devtools/devtools_window.cc
+++ b/chromium/chrome/browser/devtools/devtools_window.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/devtools/devtools_window.h"
#include <algorithm>
+#include <memory>
#include <set>
#include <utility>
@@ -401,7 +402,8 @@ class DevToolsWindow::OwnedMainWebContents {
: keep_alive_(KeepAliveOrigin::DEVTOOLS_WINDOW,
KeepAliveRestartOption::DISABLED),
web_contents_(std::move(web_contents)) {
- Profile* profile = GetProfileForDevToolsWindow(web_contents_.get());
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents_->GetBrowserContext());
DCHECK(profile);
if (!profile->IsOffTheRecord()) {
// ScopedProfileKeepAlive does not support OTR profiles.
@@ -455,6 +457,7 @@ DevToolsWindow::~DevToolsWindow() {
UpdateBrowserWindow();
UpdateBrowserToolbar();
+ capture_handle_.RunAndReset();
owned_toolbox_web_contents_.reset();
DevToolsWindows* instances = g_devtools_window_instances.Pointer();
@@ -714,17 +717,6 @@ DevToolsWindow* DevToolsWindow::OpenNodeFrontendWindow(Profile* profile) {
}
// static
-Profile* DevToolsWindow::GetProfileForDevToolsWindow(
- content::WebContents* web_contents) {
- Profile* profile =
- Profile::FromBrowserContext(web_contents->GetBrowserContext());
- if (profile->IsPrimaryOTRProfile()) {
- return profile;
- }
- return profile->GetOriginalProfile();
-}
-
-// static
void DevToolsWindow::ToggleDevToolsWindow(
content::WebContents* inspected_web_contents,
bool force_open,
@@ -736,7 +728,8 @@ void DevToolsWindow::ToggleDevToolsWindow(
DevToolsWindow* window = FindDevToolsWindow(agent.get());
bool do_open = force_open;
if (!window) {
- Profile* profile = GetProfileForDevToolsWindow(inspected_web_contents);
+ Profile* profile = Profile::FromBrowserContext(
+ inspected_web_contents->GetBrowserContext());
base::RecordAction(base::UserMetricsAction("DevTools_InspectRenderer"));
std::string panel;
switch (action.type()) {
@@ -1036,8 +1029,8 @@ DevToolsWindow::DevToolsWindow(FrontendType frontend_type,
// There is no inspected_web_contents in case of various workers.
if (inspected_web_contents)
- inspected_contents_observer_.reset(
- new ObserverWithAccessor(inspected_web_contents));
+ inspected_contents_observer_ =
+ std::make_unique<ObserverWithAccessor>(inspected_web_contents);
// Initialize docked page to be of the right size.
if (can_dock_ && inspected_web_contents) {
@@ -1049,7 +1042,7 @@ DevToolsWindow::DevToolsWindow(FrontendType frontend_type,
}
}
- event_forwarder_.reset(new DevToolsEventForwarder(this));
+ event_forwarder_ = std::make_unique<DevToolsEventForwarder>(this);
// Tag the DevTools main WebContents with its TaskManager specific UserData
// so that it shows up in the task manager.
@@ -1282,6 +1275,7 @@ void DevToolsWindow::WebContentsCreated(WebContents* source_contents,
CHECK(can_dock_);
// Ownership will be passed in DevToolsWindow::AddNewContents.
+ capture_handle_.RunAndReset();
if (owned_toolbox_web_contents_)
owned_toolbox_web_contents_.reset();
toolbox_web_contents_ = new_contents;
@@ -1296,8 +1290,10 @@ void DevToolsWindow::WebContentsCreated(WebContents* source_contents,
// is resized when the frame is rendered. Force rendering of the toolbox at
// all times, to make sure that a frame can be rendered even when the
// inspected WebContents fully covers the toolbox. https://crbug.com/828307
- toolbox_web_contents_->IncrementCapturerCount(gfx::Size(),
- /* stay_hidden */ false);
+ capture_handle_ =
+ toolbox_web_contents_->IncrementCapturerCount(gfx::Size(),
+ /*stay_hidden=*/false,
+ /*stay_awake=*/false);
}
}
diff --git a/chromium/chrome/browser/devtools/devtools_window.h b/chromium/chrome/browser/devtools/devtools_window.h
index 106035cfb3e..03a1a59ac92 100644
--- a/chromium/chrome/browser/devtools/devtools_window.h
+++ b/chromium/chrome/browser/devtools/devtools_window.h
@@ -335,8 +335,6 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
const DevToolsToggleAction& action,
const std::string& settings,
DevToolsOpenedByAction opened_by = DevToolsOpenedByAction::kUnknown);
- static Profile* GetProfileForDevToolsWindow(
- content::WebContents* web_contents);
// content::WebContentsDelegate:
void ActivateContents(content::WebContents* contents) override;
@@ -475,6 +473,8 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
PrefChangeRegistrar pref_change_registrar_;
+ base::ScopedClosureRunner capture_handle_;
+
friend class DevToolsEventForwarder;
DISALLOW_COPY_AND_ASSIGN(DevToolsWindow);
};
diff --git a/chromium/chrome/browser/devtools/devtools_window_testing.cc b/chromium/chrome/browser/devtools/devtools_window_testing.cc
index c9a142e67cc..33518b9a24e 100644
--- a/chromium/chrome/browser/devtools/devtools_window_testing.cc
+++ b/chromium/chrome/browser/devtools/devtools_window_testing.cc
@@ -109,7 +109,7 @@ void DevToolsWindowTesting::WaitForDevToolsWindowLoad(DevToolsWindow* window) {
window->ready_for_test_callback_ = runner->QuitClosure();
runner->Run();
}
- base::string16 harness = base::UTF8ToUTF16(
+ std::u16string harness = base::UTF8ToUTF16(
content::DevToolsFrontendHost::GetFrontendResource(kHarnessScript));
window->main_web_contents_->GetMainFrame()->ExecuteJavaScript(
harness, base::NullCallback());
diff --git a/chromium/chrome/browser/devtools/global_confirm_info_bar.cc b/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
index de1a6904102..99504be9f56 100644
--- a/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
+++ b/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
@@ -26,14 +26,14 @@ class GlobalConfirmInfoBar::DelegateProxy : public ConfirmInfoBarDelegate {
// ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
- base::string16 GetLinkText() const override;
+ std::u16string GetLinkText() const override;
GURL GetLinkURL() const override;
bool LinkClicked(WindowOpenDisposition disposition) override;
void InfoBarDismissed() override;
- base::string16 GetMessageText() const override;
+ std::u16string GetMessageText() const override;
gfx::ElideBehavior GetMessageElideBehavior() const override;
int GetButtons() const override;
- base::string16 GetButtonLabel(InfoBarButton button) const override;
+ std::u16string GetButtonLabel(InfoBarButton button) const override;
bool Accept() override;
bool Cancel() override;
@@ -55,7 +55,7 @@ GlobalConfirmInfoBar::DelegateProxy::GetIdentifier() const {
: INVALID;
}
-base::string16 GlobalConfirmInfoBar::DelegateProxy::GetLinkText() const {
+std::u16string GlobalConfirmInfoBar::DelegateProxy::GetLinkText() const {
return global_info_bar_ ? global_info_bar_->delegate_->GetLinkText()
: ConfirmInfoBarDelegate::GetLinkText();
}
@@ -94,9 +94,9 @@ void GlobalConfirmInfoBar::DelegateProxy::InfoBarDismissed() {
}
}
-base::string16 GlobalConfirmInfoBar::DelegateProxy::GetMessageText() const {
+std::u16string GlobalConfirmInfoBar::DelegateProxy::GetMessageText() const {
return global_info_bar_ ? global_info_bar_->delegate_->GetMessageText()
- : base::string16();
+ : std::u16string();
}
gfx::ElideBehavior
@@ -113,7 +113,7 @@ int GlobalConfirmInfoBar::DelegateProxy::GetButtons() const {
: BUTTON_NONE;
}
-base::string16 GlobalConfirmInfoBar::DelegateProxy::GetButtonLabel(
+std::u16string GlobalConfirmInfoBar::DelegateProxy::GetButtonLabel(
InfoBarButton button) const {
return global_info_bar_ ? global_info_bar_->delegate_->GetButtonLabel(button)
: ConfirmInfoBarDelegate::GetButtonLabel(button);
diff --git a/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc b/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
index 90295eaefe6..239f6da94e1 100644
--- a/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
+++ b/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
@@ -26,8 +26,8 @@ class TestConfirmInfoBarDelegate : public ConfirmInfoBarDelegate {
InfoBarIdentifier GetIdentifier() const override { return TEST_INFOBAR; }
- base::string16 GetMessageText() const override {
- return base::ASCIIToUTF16("GlobalConfirmInfoBar browser tests delegate.");
+ std::u16string GetMessageText() const override {
+ return u"GlobalConfirmInfoBar browser tests delegate.";
}
private:
diff --git a/chromium/chrome/browser/devtools/protocol/security_handler.cc b/chromium/chrome/browser/devtools/protocol/security_handler.cc
index cb1adef5e3a..f78280c7107 100644
--- a/chromium/chrome/browser/devtools/protocol/security_handler.cc
+++ b/chromium/chrome/browser/devtools/protocol/security_handler.cc
@@ -172,6 +172,7 @@ std::unique_ptr<protocol::Security::SafetyTipInfo> CreateSafetyTipInfo(
NOTREACHED();
return nullptr;
+ case security_state::SafetyTipStatus::kDigitalAssetLinkMatch:
case security_state::SafetyTipStatus::kNone:
case security_state::SafetyTipStatus::kUnknown:
return nullptr;
diff --git a/chromium/chrome/browser/devtools/protocol/target_handler.cc b/chromium/chrome/browser/devtools/protocol/target_handler.cc
index 87601179264..34b0e3f6efe 100644
--- a/chromium/chrome/browser/devtools/protocol/target_handler.cc
+++ b/chromium/chrome/browser/devtools/protocol/target_handler.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_navigator.h"
+#include "chrome/common/webui_url_constants.h"
#include "content/public/browser/devtools_agent_host.h"
namespace {
@@ -108,9 +109,14 @@ protocol::Response TargetHandler::CreateTarget(
"no browser is open");
}
+ GURL gurl(url);
+ if (gurl.is_empty()) {
+ gurl = GURL(url::kAboutBlankURL);
+ }
+
create_new_window = !target_browser;
NavigateParams params = CreateNavigateParams(
- profile, GURL(url), ui::PAGE_TRANSITION_AUTO_TOPLEVEL, create_new_window,
+ profile, gurl, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, create_new_window,
create_in_background, target_browser);
Navigate(&params);
if (!params.navigated_or_inserted_contents)
diff --git a/chromium/chrome/browser/devtools/remote_debugging_server.cc b/chromium/chrome/browser/devtools/remote_debugging_server.cc
index 7e3c3f8b84b..07e885c2287 100644
--- a/chromium/chrome/browser/devtools/remote_debugging_server.cc
+++ b/chromium/chrome/browser/devtools/remote_debugging_server.cc
@@ -52,7 +52,7 @@ class TCPServerSocketFactory
return socket;
if (socket->ListenWithAddressAndPort("::1", port, kBackLog) == net::OK)
return socket;
- return std::unique_ptr<net::ServerSocket>();
+ return nullptr;
}
// content::DevToolsSocketFactory.
@@ -65,7 +65,7 @@ class TCPServerSocketFactory
std::unique_ptr<net::ServerSocket> CreateForTethering(
std::string* name) override {
if (!g_tethering_enabled.Get())
- return std::unique_ptr<net::ServerSocket>();
+ return nullptr;
if (last_tethering_port_ == kMaxTetheringPort)
last_tethering_port_ = kMinTetheringPort;
diff --git a/chromium/chrome/browser/download/android/BUILD.gn b/chromium/chrome/browser/download/android/BUILD.gn
index b534cf5f540..0bd963194db 100644
--- a/chromium/chrome/browser/download/android/BUILD.gn
+++ b/chromium/chrome/browser/download/android/BUILD.gn
@@ -68,7 +68,6 @@ android_library("java") {
":file_provider_java",
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/offline_pages/android:java",
"//chrome/browser/preferences:java",
@@ -88,6 +87,7 @@ android_library("java") {
"//components/prefs/android:java",
"//components/user_prefs/android:java",
"//content/public/android:content_java",
+ "//net/android:net_java",
"//third_party/android_deps:material_design_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_core_core_java",
@@ -180,6 +180,7 @@ android_library("junit_tests") {
"//chrome/test/android:chrome_java_test_support",
"//components/offline_items_collection/core:core_java",
"//components/prefs/android:java",
+ "//net/android:net_java",
"//third_party/android_deps:robolectric_all_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
diff --git a/chromium/chrome/browser/download/internal/android/BUILD.gn b/chromium/chrome/browser/download/internal/android/BUILD.gn
index 7d32fc96365..4506aaead06 100644
--- a/chromium/chrome/browser/download/internal/android/BUILD.gn
+++ b/chromium/chrome/browser/download/internal/android/BUILD.gn
@@ -28,10 +28,6 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/download/home/filter/OfflineItemFilterSource.java",
"java/src/org/chromium/chrome/browser/download/home/filter/SearchOfflineItemFilter.java",
"java/src/org/chromium/chrome/browser/download/home/filter/TypeOfflineItemFilter.java",
- "java/src/org/chromium/chrome/browser/download/home/filter/chips/Chip.java",
- "java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsCoordinator.java",
- "java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsProvider.java",
- "java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java",
"java/src/org/chromium/chrome/browser/download/home/glue/OfflineContentProviderGlue.java",
"java/src/org/chromium/chrome/browser/download/home/glue/ThumbnailRequestGlue.java",
"java/src/org/chromium/chrome/browser/download/home/list/BatchListModel.java",
@@ -106,7 +102,6 @@ android_library("java") {
":java_resources",
":jni_headers",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/download/android:file_provider_java",
"//chrome/browser/download/android:java",
"//chrome/browser/profiles/android:java",
diff --git a/chromium/chrome/browser/endpoint_fetcher/BUILD.gn b/chromium/chrome/browser/endpoint_fetcher/BUILD.gn
index b7707f36b94..0cb31502745 100644
--- a/chromium/chrome/browser/endpoint_fetcher/BUILD.gn
+++ b/chromium/chrome/browser/endpoint_fetcher/BUILD.gn
@@ -8,7 +8,6 @@ android_library("java") {
deps = [
":jni_headers",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
diff --git a/chromium/chrome/browser/enterprise/util/BUILD.gn b/chromium/chrome/browser/enterprise/util/BUILD.gn
index 62b4dbcbcc0..d53dcfe271a 100644
--- a/chromium/chrome/browser/enterprise/util/BUILD.gn
+++ b/chromium/chrome/browser/enterprise/util/BUILD.gn
@@ -8,7 +8,6 @@ android_library("java") {
sources = [ "android/java/src/org/chromium/chrome/browser/enterprise/util/ManagedBrowserUtils.java" ]
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/chromium/chrome/browser/error_reporting/BUILD.gn b/chromium/chrome/browser/error_reporting/BUILD.gn
index f9ba0712b81..5038c825f41 100644
--- a/chromium/chrome/browser/error_reporting/BUILD.gn
+++ b/chromium/chrome/browser/error_reporting/BUILD.gn
@@ -22,6 +22,7 @@ static_library("error_reporting") {
]
deps = [
"//base",
+ "//build:branding_buildflags",
"//build:chromeos_buildflags",
"//chrome/common:constants",
"//components/crash/content/browser/error_reporting",
diff --git a/chromium/chrome/browser/extensions/BUILD.gn b/chromium/chrome/browser/extensions/BUILD.gn
index d4435c81860..08a1b17e857 100644
--- a/chromium/chrome/browser/extensions/BUILD.gn
+++ b/chromium/chrome/browser/extensions/BUILD.gn
@@ -4,6 +4,7 @@
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//chrome/browser/resources/pdf/ink/ink.gni")
import("//chrome/common/features.gni")
@@ -149,6 +150,8 @@ static_library("extensions") {
"api/downloads_internal/downloads_internal_api.h",
"api/enterprise_hardware_platform/enterprise_hardware_platform_api.cc",
"api/enterprise_hardware_platform/enterprise_hardware_platform_api.h",
+ "api/enterprise_reporting_private/enterprise_reporting_private_api.cc",
+ "api/enterprise_reporting_private/enterprise_reporting_private_api.h",
"api/extension_action/extension_action_api.cc",
"api/extension_action/extension_action_api.h",
"api/extension_action/extension_page_actions_api_constants.cc",
@@ -431,6 +434,8 @@ static_library("extensions") {
"blocklist.h",
"blocklist_check.cc",
"blocklist_check.h",
+ "blocklist_extension_prefs.cc",
+ "blocklist_extension_prefs.h",
"blocklist_factory.cc",
"blocklist_factory.h",
"blocklist_state_fetcher.cc",
@@ -463,6 +468,8 @@ static_library("extensions") {
"chrome_extension_cookies.h",
"chrome_extension_cookies_factory.cc",
"chrome_extension_cookies_factory.h",
+ "chrome_extension_frame_host.cc",
+ "chrome_extension_frame_host.h",
"chrome_extension_function_details.cc",
"chrome_extension_function_details.h",
"chrome_extension_host_delegate.cc",
@@ -647,8 +654,6 @@ static_library("extensions") {
"menu_manager_factory.h",
"navigation_observer.cc",
"navigation_observer.h",
- "ntp_overridden_bubble_delegate.cc",
- "ntp_overridden_bubble_delegate.h",
"pack_extension_job.cc",
"pack_extension_job.h",
"pending_extension_info.cc",
@@ -665,6 +670,8 @@ static_library("extensions") {
"policy_handlers.h",
"proxy_overridden_bubble_delegate.cc",
"proxy_overridden_bubble_delegate.h",
+ "safe_browsing_verdict_handler.cc",
+ "safe_browsing_verdict_handler.h",
"scoped_active_install.cc",
"scoped_active_install.h",
"scripting_permissions_modifier.cc",
@@ -679,8 +686,6 @@ static_library("extensions") {
"standard_management_policy_provider.h",
"startup_helper.cc",
"startup_helper.h",
- "state_store_notification_observer.cc",
- "state_store_notification_observer.h",
"suspicious_extension_bubble_delegate.cc",
"suspicious_extension_bubble_delegate.h",
"sync_bundle.cc",
@@ -788,11 +793,14 @@ static_library("extensions") {
"//chrome/browser/devtools",
"//chrome/browser/image_decoder",
"//chrome/browser/media/router",
+ "//chrome/browser/media/router:media_router_feature",
"//chrome/browser/media/router/discovery",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/browser/resource_coordinator:intervention_policy_database_proto",
"//chrome/browser/resource_coordinator:mojo_bindings",
"//chrome/browser/safe_browsing",
+ "//chrome/browser/safe_browsing:metrics_collector",
"//chrome/browser/web_applications",
"//chrome/browser/web_applications/components",
"//components/site_engagement/core/mojom:mojo_bindings",
@@ -893,6 +901,7 @@ static_library("extensions") {
"//extensions/browser/updater",
"//extensions/buildflags",
"//extensions/common",
+ "//extensions/common:mojom",
"//extensions/common/api",
"//extensions/strings",
"//google_apis",
@@ -956,12 +965,20 @@ static_library("extensions") {
if (is_chromeos_lacros || is_chromeos_ash) {
sources += [
"api/enterprise_device_attributes/enterprise_device_attributes_api.h",
+ "api/enterprise_platform_keys/enterprise_platform_keys_api.cc",
"api/enterprise_platform_keys/enterprise_platform_keys_api.h",
+ "api/messaging/native_message_built_in_host.cc",
+ "api/messaging/native_message_built_in_host.h",
+ "api/messaging/native_message_echo_host.cc",
+ "api/messaging/native_message_echo_host.h",
"api/platform_keys/platform_keys_api.h",
+ "clipboard_extension_helper_chromeos.cc",
+ "clipboard_extension_helper_chromeos.h",
]
deps += [
"//chromeos/crosapi/cpp",
"//chromeos/crosapi/mojom",
+ "//remoting/host/it2me:chrome_os_host",
]
if (is_chromeos_lacros) {
sources += [
@@ -969,11 +986,24 @@ static_library("extensions") {
"api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.h",
"api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc",
"api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.h",
+ "api/messaging/native_message_host_lacros.cc",
"api/platform_keys/platform_keys_api_lacros.cc",
"api/platform_keys/platform_keys_api_lacros.h",
]
deps += [ "//chromeos/lacros" ]
+ } else {
+ sources += [ "api/messaging/native_message_host_chromeos.cc" ]
+ deps += [ "//remoting/host" ]
}
+ } else {
+ sources += [
+ "api/messaging/native_message_process_host.cc",
+ "api/messaging/native_message_process_host.h",
+ "api/messaging/native_messaging_launch_from_native.cc",
+ "api/messaging/native_messaging_launch_from_native.h",
+ "api/messaging/native_process_launcher.cc",
+ "api/messaging/native_process_launcher.h",
+ ]
}
if (is_chromeos_ash) {
@@ -1006,7 +1036,6 @@ static_library("extensions") {
"api/input_ime/input_ime_event_router_base.h",
"api/media_perception_private/media_perception_api_delegate_chromeos.cc",
"api/media_perception_private/media_perception_api_delegate_chromeos.h",
- "api/messaging/native_message_host_chromeos.cc",
"api/networking_cast_private/chrome_networking_cast_private_delegate.cc",
"api/networking_cast_private/chrome_networking_cast_private_delegate.h",
"api/networking_cast_private/networking_cast_private_api.cc",
@@ -1031,8 +1060,6 @@ static_library("extensions") {
"api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc",
"api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h",
"chrome_kiosk_delegate_chromeos.cc",
- "clipboard_extension_helper_chromeos.cc",
- "clipboard_extension_helper_chromeos.h",
"extension_assets_manager_chromeos.cc",
"extension_assets_manager_chromeos.h",
"extension_garbage_collector_chromeos.cc",
@@ -1094,9 +1121,6 @@ static_library("extensions") {
"//components/user_manager",
"//media/capture:capture_lib",
"//media/capture/video/chromeos/mojom:cros_camera",
- "//remoting/base",
- "//remoting/host",
- "//remoting/host/it2me:chrome_os_host",
"//third_party/protobuf:protobuf_lite",
"//ui/base/ime/chromeos",
"//ui/chromeos",
@@ -1120,19 +1144,9 @@ static_library("extensions") {
sources += [
"api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc",
"api/enterprise_reporting_private/chrome_desktop_report_request_helper.h",
- "api/enterprise_reporting_private/context_info_fetcher.cc",
- "api/enterprise_reporting_private/context_info_fetcher.h",
- "api/enterprise_reporting_private/enterprise_reporting_private_api.cc",
- "api/enterprise_reporting_private/enterprise_reporting_private_api.h",
"api/enterprise_reporting_private/keychain_data_helper_mac.h",
"api/enterprise_reporting_private/keychain_data_helper_mac.mm",
"api/image_writer_private/operation_nonchromeos.cc",
- "api/messaging/native_message_process_host.cc",
- "api/messaging/native_message_process_host.h",
- "api/messaging/native_messaging_launch_from_native.cc",
- "api/messaging/native_messaging_launch_from_native.h",
- "api/messaging/native_process_launcher.cc",
- "api/messaging/native_process_launcher.h",
"api/tabs/tabs_util.cc",
"chrome_kiosk_delegate.cc",
"default_apps.cc",
@@ -1160,13 +1174,19 @@ static_library("extensions") {
"global_shortcut_listener_x11.cc",
"global_shortcut_listener_x11.h",
]
- } else if (use_ozone) {
+ }
+ if (use_ozone) {
+ deps += [ "//ui/ozone" ]
sources += [
"global_shortcut_listener_ozone.cc",
"global_shortcut_listener_ozone.h",
]
}
+ if (use_x11 || use_ozone) {
+ sources += [ "global_shortcut_listener_linux.cc" ]
+ }
+
if (is_mac) {
sources += [
"api/image_writer_private/removable_storage_provider_mac.cc",
diff --git a/chromium/chrome/browser/extensions/api/BUILD.gn b/chromium/chrome/browser/extensions/api/BUILD.gn
index 68be274094f..bbb51858520 100644
--- a/chromium/chrome/browser/extensions/api/BUILD.gn
+++ b/chromium/chrome/browser/extensions/api/BUILD.gn
@@ -26,6 +26,7 @@ function_registration("api_registration") {
"//components/policy/proto",
# Different APIs include headers from these targets.
+ "//chrome/common",
"//chrome/common:mojo_bindings",
"//components/omnibox/browser",
"//components/translate/core/browser",
diff --git a/chromium/chrome/browser/extensions/api/DEPS b/chromium/chrome/browser/extensions/api/DEPS
index 88f2d8af062..e66c260059e 100644
--- a/chromium/chrome/browser/extensions/api/DEPS
+++ b/chromium/chrome/browser/extensions/api/DEPS
@@ -3,7 +3,6 @@ include_rules = [
"+services/device/public",
# Enable remote assistance on Chrome OS
- "+remoting/base",
"+remoting/host",
]
diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
index c9998d76b55..c3ba3fa17bc 100644
--- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/autofill_private/autofill_util.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/autofill_private.h"
#include "components/autofill/content/browser/content_autofill_driver.h"
#include "components/autofill/content/browser/content_autofill_driver_factory.h"
@@ -53,7 +54,7 @@ constexpr auto kUserVerified =
void RemoveDuplicatePhoneNumberAtIndex(size_t index,
const std::string& country_code,
base::ListValue* list) {
- base::string16 new_value;
+ std::u16string new_value;
if (!list->GetString(index, &new_value)) {
NOTREACHED() << "List should have a value at index " << index;
return;
@@ -65,7 +66,7 @@ void RemoveDuplicatePhoneNumberAtIndex(size_t index,
if (i == index)
continue;
- base::string16 existing_value;
+ std::u16string existing_value;
if (!list->GetString(i, &existing_value)) {
NOTREACHED() << "List should have a value at index " << i;
continue;
@@ -105,7 +106,7 @@ ExtensionFunction::ResponseAction AutofillPrivateSaveAddressFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -227,7 +228,7 @@ ExtensionFunction::ResponseAction AutofillPrivateSaveAddressFunction::Run() {
ExtensionFunction::ResponseAction AutofillPrivateGetCountryListFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
// Return an empty list if data is not loaded.
if (!(personal_data && personal_data->IsDataLoaded())) {
@@ -282,7 +283,7 @@ AutofillPrivateGetAddressComponentsFunction::Run() {
ExtensionFunction::ResponseAction AutofillPrivateGetAddressListFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
DCHECK(personal_data && personal_data->IsDataLoaded());
@@ -302,7 +303,7 @@ ExtensionFunction::ResponseAction AutofillPrivateSaveCreditCardFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -383,7 +384,7 @@ ExtensionFunction::ResponseAction AutofillPrivateRemoveEntryFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -425,7 +426,7 @@ ExtensionFunction::ResponseAction AutofillPrivateMaskCreditCardFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -441,7 +442,7 @@ ExtensionFunction::ResponseAction
AutofillPrivateGetCreditCardListFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
DCHECK(personal_data && personal_data->IsDataLoaded());
@@ -459,7 +460,7 @@ ExtensionFunction::ResponseAction
AutofillPrivateMigrateCreditCardsFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -498,7 +499,7 @@ ExtensionFunction::ResponseAction
AutofillPrivateLogServerCardLinkClickedFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
if (!personal_data || !personal_data->IsDataLoaded())
return RespondNow(Error(kErrorDataUnavailable));
@@ -539,7 +540,7 @@ AutofillPrivateSetCreditCardFIDOAuthEnabledStateFunction::Run() {
ExtensionFunction::ResponseAction AutofillPrivateGetUpiIdListFunction::Run() {
autofill::PersonalDataManager* personal_data =
autofill::PersonalDataManagerFactory::GetForProfile(
- chrome_details_.GetProfile());
+ Profile::FromBrowserContext(browser_context()));
DCHECK(personal_data && personal_data->IsDataLoaded());
return RespondNow(
diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.h b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
index 138c0c3dda0..16309999a8a 100644
--- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
+++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
@@ -7,7 +7,6 @@
#include <string>
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "extensions/browser/extension_function.h"
namespace extensions {
@@ -27,9 +26,6 @@ class AutofillPrivateSaveAddressFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateGetCountryListFunction : public ExtensionFunction {
@@ -47,9 +43,6 @@ class AutofillPrivateGetCountryListFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateGetAddressComponentsFunction : public ExtensionFunction {
@@ -84,9 +77,6 @@ class AutofillPrivateGetAddressListFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateSaveCreditCardFunction : public ExtensionFunction {
@@ -104,9 +94,6 @@ class AutofillPrivateSaveCreditCardFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateRemoveEntryFunction : public ExtensionFunction {
@@ -124,9 +111,6 @@ class AutofillPrivateRemoveEntryFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateValidatePhoneNumbersFunction : public ExtensionFunction {
@@ -161,9 +145,6 @@ class AutofillPrivateMaskCreditCardFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateGetCreditCardListFunction : public ExtensionFunction {
@@ -181,9 +162,6 @@ class AutofillPrivateGetCreditCardListFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateMigrateCreditCardsFunction : public ExtensionFunction {
@@ -201,9 +179,6 @@ class AutofillPrivateMigrateCreditCardsFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateLogServerCardLinkClickedFunction
@@ -222,9 +197,6 @@ class AutofillPrivateLogServerCardLinkClickedFunction
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateSetCreditCardFIDOAuthEnabledStateFunction
@@ -245,9 +217,6 @@ class AutofillPrivateSetCreditCardFIDOAuthEnabledStateFunction
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
class AutofillPrivateGetUpiIdListFunction : public ExtensionFunction {
@@ -265,9 +234,6 @@ class AutofillPrivateGetUpiIdListFunction : public ExtensionFunction {
// ExtensionFunction overrides.
ResponseAction Run() override;
-
- private:
- ChromeExtensionFunctionDetails chrome_details_{this};
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
index a80ea98e5df..8b31ea583eb 100644
--- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
@@ -39,8 +39,10 @@ class AutofillPrivateApiTest : public ExtensionApiTest {
bool RunAutofillSubtest(const std::string& subtest) {
autofill::WaitForPersonalDataManagerToBeLoaded(profile());
- return RunExtensionSubtest("autofill_private", "main.html?" + subtest,
- kFlagNone, kFlagLoadAsComponent);
+ const std::string page_url = "main.html?" + subtest;
+ return RunExtensionTest({.name = "autofill_private",
+ .page_url = page_url.c_str(),
+ .load_as_component = true});
}
};
diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc b/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc
index 22bcc27a11b..f15e49d267f 100644
--- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc
+++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include <memory>
#include <utility>
#include <vector>
@@ -38,7 +39,7 @@ std::unique_ptr<std::vector<std::string>> GetValueList(
autofill::ServerFieldType type) {
std::unique_ptr<std::vector<std::string>> list(new std::vector<std::string>);
- std::vector<base::string16> values;
+ std::vector<std::u16string> values;
if (autofill::AutofillType(type).group() == autofill::FieldTypeGroup::kName) {
values.push_back(
profile.GetInfo(autofill::AutofillType(type),
@@ -52,7 +53,7 @@ std::unique_ptr<std::vector<std::string>> GetValueList(
if (values.size() == 1 && values.front().empty())
return list;
- for (const base::string16& value16 : values)
+ for (const std::u16string& value16 : values)
list->push_back(base::UTF16ToUTF8(value16));
return list;
@@ -68,11 +69,11 @@ std::unique_ptr<std::string> GetStringFromProfile(
autofill_private::AddressEntry ProfileToAddressEntry(
const autofill::AutofillProfile& profile,
- const base::string16& label) {
+ const std::u16string& label) {
autofill_private::AddressEntry address;
// Add all address fields to the entry.
- address.guid.reset(new std::string(profile.guid()));
+ address.guid = std::make_unique<std::string>(profile.guid());
address.full_names = GetValueList(profile, autofill::NAME_FULL);
address.honorific =
GetStringFromProfile(profile, autofill::NAME_HONORIFIC_PREFIX);
@@ -94,12 +95,13 @@ autofill_private::AddressEntry ProfileToAddressEntry(
address.phone_numbers =
GetValueList(profile, autofill::PHONE_HOME_WHOLE_NUMBER);
address.email_addresses = GetValueList(profile, autofill::EMAIL_ADDRESS);
- address.language_code.reset(new std::string(profile.language_code()));
+ address.language_code =
+ std::make_unique<std::string>(profile.language_code());
// Parse |label| so that it can be used to create address metadata.
- base::string16 separator =
+ std::u16string separator =
l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_SUMMARY_SEPARATOR);
- std::vector<base::string16> label_pieces = base::SplitStringUsingSubstr(
+ std::vector<std::u16string> label_pieces = base::SplitStringUsingSubstr(
label, separator, base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
// Create address metadata and add it to |address|.
@@ -120,8 +122,9 @@ autofill_private::CountryEntry CountryToCountryEntry(
// A null |country| means "insert a space here", so we add a country w/o a
// |name| or |country_code| to the list and let the UI handle it.
if (country) {
- entry.name.reset(new std::string(base::UTF16ToUTF8(country->name())));
- entry.country_code.reset(new std::string(country->country_code()));
+ entry.name =
+ std::make_unique<std::string>(base::UTF16ToUTF8(country->name()));
+ entry.country_code = std::make_unique<std::string>(country->country_code());
}
return entry;
@@ -133,24 +136,24 @@ autofill_private::CreditCardEntry CreditCardToCreditCardEntry(
autofill_private::CreditCardEntry card;
// Add all credit card fields to the entry.
- card.guid.reset(new std::string(credit_card.guid()));
- card.name.reset(new std::string(base::UTF16ToUTF8(
- credit_card.GetRawInfo(autofill::CREDIT_CARD_NAME_FULL))));
- card.card_number.reset(new std::string(
- base::UTF16ToUTF8(credit_card.GetRawInfo(autofill::CREDIT_CARD_NUMBER))));
- card.expiration_month.reset(new std::string(base::UTF16ToUTF8(
- credit_card.GetRawInfo(autofill::CREDIT_CARD_EXP_MONTH))));
- card.expiration_year.reset(new std::string(base::UTF16ToUTF8(
- credit_card.GetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR))));
+ card.guid = std::make_unique<std::string>(credit_card.guid());
+ card.name = std::make_unique<std::string>(base::UTF16ToUTF8(
+ credit_card.GetRawInfo(autofill::CREDIT_CARD_NAME_FULL)));
+ card.card_number = std::make_unique<std::string>(
+ base::UTF16ToUTF8(credit_card.GetRawInfo(autofill::CREDIT_CARD_NUMBER)));
+ card.expiration_month = std::make_unique<std::string>(base::UTF16ToUTF8(
+ credit_card.GetRawInfo(autofill::CREDIT_CARD_EXP_MONTH)));
+ card.expiration_year = std::make_unique<std::string>(base::UTF16ToUTF8(
+ credit_card.GetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR)));
if (!credit_card.nickname().empty()) {
- card.nickname.reset(
- new std::string(base::UTF16ToUTF8(credit_card.nickname())));
+ card.nickname = std::make_unique<std::string>(
+ base::UTF16ToUTF8(credit_card.nickname()));
}
// Create card metadata and add it to |card|.
std::unique_ptr<autofill_private::AutofillMetadata> metadata(
new autofill_private::AutofillMetadata);
- std::pair<base::string16, base::string16> label_pieces =
+ std::pair<std::u16string, std::u16string> label_pieces =
credit_card.LabelPieces();
metadata->summary_label = base::UTF16ToUTF8(label_pieces.first);
metadata->summary_sublabel =
@@ -162,8 +165,8 @@ autofill_private::CreditCardEntry CreditCardToCreditCardEntry(
// IsValid() checks if both card number and expiration date are valid.
// IsServerCard() checks whether there is a duplicated server card in
// |personal_data|.
- metadata->is_migratable.reset(new bool(
- credit_card.IsValid() && !personal_data.IsServerCard(&credit_card)));
+ metadata->is_migratable = std::make_unique<bool>(
+ credit_card.IsValid() && !personal_data.IsServerCard(&credit_card));
card.metadata = std::move(metadata);
return card;
@@ -179,7 +182,7 @@ AddressEntryList GenerateAddressList(
const autofill::PersonalDataManager& personal_data) {
const std::vector<autofill::AutofillProfile*>& profiles =
personal_data.GetProfiles();
- std::vector<base::string16> labels;
+ std::vector<std::u16string> labels;
autofill::AutofillProfile::CreateDifferentiatingLabels(
profiles, g_browser_process->GetApplicationLocale(), &labels);
DCHECK_EQ(labels.size(), profiles.size());
diff --git a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
index 19d71f8495f..25f67f1b176 100644
--- a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -236,12 +236,12 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, TabsAutomationHostsPermissions) {
}
#if defined(USE_AURA)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
IN_PROC_BROWSER_TEST_F(AutomationApiTest, Desktop) {
ASSERT_TRUE(RunExtensionSubtest("automation/tests/desktop", "desktop.html"))
<< message_;
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopInitialFocus) {
ASSERT_TRUE(
RunExtensionSubtest("automation/tests/desktop", "initial_focus.html"))
@@ -288,7 +288,9 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopGetNextTextMatch) {
IN_PROC_BROWSER_TEST_F(AutomationApiTest, LocationInWebView) {
StartEmbeddedTestServer();
- ASSERT_TRUE(RunPlatformAppTest("automation/tests/webview")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "automation/tests/webview", .launch_as_platform_app = true}))
+ << message_;
}
#endif
@@ -452,7 +454,8 @@ class AutomationApiTestWithDeviceScaleFactor : public AutomationApiTest {
IN_PROC_BROWSER_TEST_F(AutomationApiTestWithDeviceScaleFactor, LocationScaled) {
StartEmbeddedTestServer();
- ASSERT_TRUE(RunPlatformAppTest("automation/tests/location_scaled"))
+ ASSERT_TRUE(RunExtensionTest({.name = "automation/tests/location_scaled",
+ .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc b/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
index 56ba781f50e..6cc902db875 100644
--- a/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.cc
@@ -26,7 +26,10 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
+#include "chrome/browser/ash/crosapi/automation_ash.h"
+#include "chrome/browser/ash/crosapi/crosapi_ash.h"
+#include "chrome/browser/ash/crosapi/crosapi_manager.h"
+#include "chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.h"
#endif
namespace extensions {
@@ -82,6 +85,13 @@ content::WebContents* ChromeAutomationInternalApiDelegate::GetActiveWebContents(
bool ChromeAutomationInternalApiDelegate::EnableTree(
const ui::AXTreeID& tree_id) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
+ // CrosapiManager may not be initialized on unit testing.
+ // Propagate the EnableTree signal to crosapi clients.
+ if (crosapi::CrosapiManager::IsInitialized()) {
+ crosapi::CrosapiManager::Get()->crosapi_ash()->automation_ash()->EnableTree(
+ tree_id);
+ }
+
arc::ArcAccessibilityHelperBridge* bridge =
arc::ArcAccessibilityHelperBridge::GetForBrowserContext(
GetActiveUserContext());
@@ -92,6 +102,17 @@ bool ChromeAutomationInternalApiDelegate::EnableTree(
}
void ChromeAutomationInternalApiDelegate::EnableDesktop() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ // CrosapiManager may not be initialized on unit testing.
+ // Propagate the EnableDesktop signal to crosapi clients.
+ if (crosapi::CrosapiManager::IsInitialized()) {
+ crosapi::CrosapiManager::Get()
+ ->crosapi_ash()
+ ->automation_ash()
+ ->EnableDesktop();
+ }
+#endif
+
#if defined(USE_AURA)
AutomationManagerAura::GetInstance()->Enable();
#else
@@ -108,10 +129,11 @@ ui::AXTreeID ChromeAutomationInternalApiDelegate::GetAXTreeID() {
#endif
}
-void ChromeAutomationInternalApiDelegate::SetEventBundleSink(
- ui::AXEventBundleSink* sink) {
+void ChromeAutomationInternalApiDelegate::SetAutomationEventRouterInterface(
+ AutomationEventRouterInterface* router) {
#if defined(USE_AURA)
- AutomationManagerAura::GetInstance()->set_event_bundle_sink(sink);
+ AutomationManagerAura::GetInstance()->set_automation_event_router_interface(
+ router);
#else
NOTIMPLEMENTED();
#endif
diff --git a/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h b/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h
index 13cba0b8a23..f0c2c6674e1 100644
--- a/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h
+++ b/chromium/chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h
@@ -11,6 +11,8 @@
namespace extensions {
+class AutomationEventRouterInterface;
+
// A delegate for chrome specific automation api logic.
class ChromeAutomationInternalApiDelegate
: public AutomationInternalApiDelegate {
@@ -36,7 +38,8 @@ class ChromeAutomationInternalApiDelegate
bool EnableTree(const ui::AXTreeID& tree_id) override;
void EnableDesktop() override;
ui::AXTreeID GetAXTreeID() override;
- void SetEventBundleSink(ui::AXEventBundleSink* sink) override;
+ void SetAutomationEventRouterInterface(
+ AutomationEventRouterInterface* router) override;
content::BrowserContext* GetActiveUserContext() override;
};
diff --git a/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc
index aa49c0ac3d3..111e8b0e9f5 100644
--- a/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc
@@ -7,9 +7,9 @@
#include "base/memory/ptr_util.h"
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/ownership/fake_owner_settings_service.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
-#include "chrome/browser/chromeos/ownership/fake_owner_settings_service.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/scoped_user_manager.h"
@@ -48,7 +48,7 @@ class BluetoothLowEnergyApiTestChromeOs : public PlatformAppBrowserTest {
protected:
void EnterKioskSession() {
- fake_user_manager_ = new chromeos::FakeChromeUserManager();
+ fake_user_manager_ = new ash::FakeChromeUserManager();
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(fake_user_manager_));
@@ -66,10 +66,10 @@ class BluetoothLowEnergyApiTestChromeOs : public PlatformAppBrowserTest {
ash::KioskAppManager* manager() const { return ash::KioskAppManager::Get(); }
- chromeos::FakeChromeUserManager* fake_user_manager_;
+ ash::FakeChromeUserManager* fake_user_manager_;
std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
- chromeos::ScopedCrosSettingsTestHelper settings_helper_;
+ ash::ScopedCrosSettingsTestHelper settings_helper_;
std::unique_ptr<chromeos::FakeOwnerSettingsService> owner_settings_service_;
};
@@ -77,15 +77,18 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
RegisterAdvertisement_Flag) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableBLEAdvertising);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/register_advertisement_flag"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/register_advertisement_flag",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
RegisterAdvertisement_NotKioskSession) {
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/register_advertisement_no_kiosk_mode"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name =
+ "api_test/bluetooth_low_energy/register_advertisement_no_kiosk_mode",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -93,8 +96,9 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
RegisterAdvertisement_KioskSessionOnly) {
EnterKioskSession();
ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "register_advertisement_kiosk_session_only"))
+ RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "register_advertisement_kiosk_session_only",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -102,16 +106,18 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
RegisterAdvertisement) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/register_advertisement"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/register_advertisement",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, ResetAdvertising) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/reset_all_advertisements"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/reset_all_advertisements",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -119,42 +125,44 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
SetAdvertisingInterval) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "set_advertising_interval"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "set_advertising_interval",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, CreateService) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "create_service"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "create_service",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, CreateService_Flag) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableBLEAdvertising);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/create_service_flag"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/create_service_flag",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
CreateService_NotKioskSession) {
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/create_service_no_kiosk_mode"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/create_service_no_kiosk_mode",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
CreateService_KioskSessionOnly) {
EnterKioskSession();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "create_service_kiosk_session_only"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "create_service_kiosk_session_only",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -162,45 +170,45 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
CreateCharacteristic) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "create_characteristic"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "create_characteristic",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, CreateDescriptor) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "create_descriptor"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "create_descriptor",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, RegisterService) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "register_service"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "register_service",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, UnregisterService) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "unregister_service"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "unregister_service",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs, RemoveService) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "remove_service"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "remove_service",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -208,9 +216,9 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
NotifyCharacteristicValueChanged) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/bluetooth_low_energy/"
- "notify_characteristic_value_changed"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/bluetooth_low_energy/"
+ "notify_characteristic_value_changed",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -218,9 +226,10 @@ IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTestChromeOs,
NotifyCharacteristicValueChanged_ErrorConditions) {
EnterKioskSession();
SetAutoLaunchApp();
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/bluetooth_low_energy/"
- "notify_characteristic_value_changed_error_conditions"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/bluetooth_low_energy/"
+ "notify_characteristic_value_changed_error_conditions",
+ .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
index 74ce3d3411e..451ad182061 100644
--- a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
@@ -42,6 +42,7 @@
#include "extensions/browser/extension_function_dispatcher.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/view_type_utils.h"
+#include "extensions/common/mojom/view_type.mojom.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
@@ -104,12 +105,12 @@ CreateNodeDataElementFromBookmarkNode(const BookmarkNode& node) {
bookmark_manager_private::BookmarkNodeDataElement element;
// Add id and parentId so we can associate the data with existing nodes on the
// client side.
- element.id.reset(new std::string(base::NumberToString(node.id())));
- element.parent_id.reset(
- new std::string(base::NumberToString(node.parent()->id())));
+ element.id = std::make_unique<std::string>(base::NumberToString(node.id()));
+ element.parent_id =
+ std::make_unique<std::string>(base::NumberToString(node.parent()->id()));
if (node.is_url())
- element.url.reset(new std::string(node.url().spec()));
+ element.url = std::make_unique<std::string>(node.url().spec());
element.title = base::UTF16ToUTF8(node.GetTitle());
for (const auto& child : node.children()) {
@@ -128,7 +129,7 @@ bookmark_manager_private::BookmarkNodeDataElement CreateApiNodeDataElement(
bookmark_manager_private::BookmarkNodeDataElement node_element;
if (element.is_url)
- node_element.url.reset(new std::string(element.url.spec()));
+ node_element.url = std::make_unique<std::string>(element.url.spec());
node_element.title = base::UTF16ToUTF8(element.title);
for (size_t i = 0; i < element.children.size(); ++i) {
node_element.children.push_back(
@@ -224,9 +225,9 @@ BookmarkManagerPrivateAPI::GetFactoryInstance() {
void BookmarkManagerPrivateAPI::OnListenerAdded(
const EventListenerInfo& details) {
EventRouter::Get(browser_context_)->UnregisterObserver(this);
- event_router_.reset(new BookmarkManagerPrivateEventRouter(
+ event_router_ = std::make_unique<BookmarkManagerPrivateEventRouter>(
browser_context_,
- BookmarkModelFactory::GetForBrowserContext(browser_context_)));
+ BookmarkModelFactory::GetForBrowserContext(browser_context_));
}
BookmarkManagerPrivateDragEventRouter::BookmarkManagerPrivateDragEventRouter(
@@ -432,7 +433,7 @@ BookmarkManagerPrivateStartDragFunction::RunOnReady() {
return Error(bookmark_keys::kEditBookmarksDisabled);
content::WebContents* web_contents = GetSenderWebContents();
- if (GetViewType(web_contents) != VIEW_TYPE_TAB_CONTENTS) {
+ if (GetViewType(web_contents) != mojom::ViewType::kTabContents) {
NOTREACHED();
return Error(kUnknownErrorDoNotUse);
}
@@ -478,7 +479,7 @@ BookmarkManagerPrivateDropFunction::RunOnReady() {
return Error(error);
content::WebContents* web_contents = GetSenderWebContents();
- DCHECK_EQ(VIEW_TYPE_TAB_CONTENTS, GetViewType(web_contents));
+ DCHECK_EQ(mojom::ViewType::kTabContents, GetViewType(web_contents));
size_t drop_index;
if (params->index)
diff --git a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
index 205107a919a..c120b8be853 100644
--- a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
@@ -34,9 +34,8 @@ class BookmarkManagerPrivateApiUnitTest : public ExtensionServiceTestBase {
model_ = BookmarkModelFactory::GetForBrowserContext(profile());
bookmarks::test::WaitForBookmarkModelToLoad(model_);
- const bookmarks::BookmarkNode* node =
- model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("Goog"),
- GURL("https://www.google.com"));
+ const bookmarks::BookmarkNode* node = model_->AddURL(
+ model_->other_node(), 0, u"Goog", GURL("https://www.google.com"));
// Store node->id() as we will delete |node| in RunOnDeletedNode().
node_id_ = base::NumberToString(node->id());
}
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.cc
index f358ee31131..e33d1ffbbbe 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.cc
@@ -63,27 +63,29 @@ void PopulateBookmarkTreeNode(
const BookmarkNode* parent = node->parent();
if (parent) {
- out_bookmark_tree_node->parent_id.reset(
- new std::string(base::NumberToString(parent->id())));
- out_bookmark_tree_node->index.reset(new int(parent->GetIndexOf(node)));
+ out_bookmark_tree_node->parent_id =
+ std::make_unique<std::string>(base::NumberToString(parent->id()));
+ out_bookmark_tree_node->index =
+ std::make_unique<int>(parent->GetIndexOf(node));
}
if (!node->is_folder()) {
- out_bookmark_tree_node->url.reset(new std::string(node->url().spec()));
+ out_bookmark_tree_node->url =
+ std::make_unique<std::string>(node->url().spec());
} else {
// Javascript Date wants milliseconds since the epoch, ToDoubleT is seconds.
base::Time t = node->date_folder_modified();
if (!t.is_null()) {
- out_bookmark_tree_node->date_group_modified.reset(
- new double(floor(t.ToDoubleT() * 1000)));
+ out_bookmark_tree_node->date_group_modified =
+ std::make_unique<double>(floor(t.ToDoubleT() * 1000));
}
}
out_bookmark_tree_node->title = base::UTF16ToUTF8(node->GetTitle());
if (!node->date_added().is_null()) {
// Javascript Date wants milliseconds since the epoch, ToDoubleT is seconds.
- out_bookmark_tree_node->date_added.reset(
- new double(floor(node->date_added().ToDoubleT() * 1000)));
+ out_bookmark_tree_node->date_added =
+ std::make_unique<double>(floor(node->date_added().ToDoubleT() * 1000));
}
if (bookmarks::IsDescendantOf(node, managed->managed_node())) {
@@ -99,8 +101,8 @@ void PopulateBookmarkTreeNode(
GetBookmarkTreeNode(managed, child.get(), true, only_folders));
}
}
- out_bookmark_tree_node->children.reset(
- new std::vector<BookmarkTreeNode>(std::move(children)));
+ out_bookmark_tree_node->children =
+ std::make_unique<std::vector<BookmarkTreeNode>>(std::move(children));
}
}
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers_unittest.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers_unittest.cc
index e7a05424d8f..ae7ac0afe4d 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_helpers_unittest.cc
@@ -55,22 +55,19 @@ class ExtensionBookmarksTest : public testing::Test {
managed_ = ManagedBookmarkServiceFactory::GetForProfile(profile_.get());
bookmarks::test::WaitForBookmarkModelToLoad(model_);
- node_ = model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("Digg"),
+ node_ = model_->AddURL(model_->other_node(), 0, u"Digg",
GURL("http://www.reddit.com"));
model_->SetNodeMetaInfo(node_, "some_key1", "some_value1");
model_->SetNodeMetaInfo(node_, "some_key2", "some_value2");
- model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("News"),
+ model_->AddURL(model_->other_node(), 0, u"News",
GURL("http://www.foxnews.com"));
- folder_ = model_->AddFolder(
- model_->other_node(), 0, base::ASCIIToUTF16("outer folder"));
+ folder_ = model_->AddFolder(model_->other_node(), 0, u"outer folder");
model_->SetNodeMetaInfo(folder_, "some_key1", "some_value1");
- model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 1"));
- model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 2"));
- node2_ = model_->AddURL(
- folder_, 0, base::ASCIIToUTF16("Digg"), GURL("http://reddit.com"));
+ model_->AddFolder(folder_, 0, u"inner folder 1");
+ model_->AddFolder(folder_, 0, u"inner folder 2");
+ node2_ = model_->AddURL(folder_, 0, u"Digg", GURL("http://reddit.com"));
model_->SetNodeMetaInfo(node2_, "some_key2", "some_value2");
- model_->AddURL(
- folder_, 0, base::ASCIIToUTF16("CNet"), GURL("http://cnet.com"));
+ model_->AddURL(folder_, 0, u"CNet", GURL("http://cnet.com"));
}
content::BrowserTaskEnvironment task_environment_;
@@ -127,9 +124,7 @@ TEST_F(ExtensionBookmarksTest, GetModifiableNode) {
TEST_F(ExtensionBookmarksTest, GetManagedNode) {
const BookmarkNode* managed_bookmark =
- model_->AddURL(managed_->managed_node(),
- 0,
- base::ASCIIToUTF16("Chromium"),
+ model_->AddURL(managed_->managed_node(), 0, u"Chromium",
GURL("http://www.chromium.org/"));
BookmarkTreeNode tree = GetBookmarkTreeNode(managed_, managed_bookmark,
false, // Recurse.
@@ -156,9 +151,7 @@ TEST_F(ExtensionBookmarksTest, RemoveNodePermanent) {
TEST_F(ExtensionBookmarksTest, RemoveNodeManaged) {
const BookmarkNode* managed_bookmark =
- model_->AddURL(managed_->managed_node(),
- 0,
- base::ASCIIToUTF16("Chromium"),
+ model_->AddURL(managed_->managed_node(), 0, u"Chromium",
GURL("http://www.chromium.org"));
std::string error;
EXPECT_FALSE(
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
index b503e71ce68..4dd771e59ca 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
@@ -52,7 +52,7 @@ IN_PROC_BROWSER_TEST_P(BookmarksApiTest, Bookmarks) {
node->SetString("name", "Managed Bookmark");
node->SetString("url", "http://www.chromium.org");
list.Append(std::move(node));
- node.reset(new base::DictionaryValue());
+ node = std::make_unique<base::DictionaryValue>();
node->SetString("name", "Managed Folder");
node->Set("children", std::make_unique<base::ListValue>());
list.Append(std::move(node));
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
index 15f6ad4bdc3..b851825a368 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
@@ -8,6 +8,7 @@
#include <limits>
#include <memory>
+#include <string>
#include <utility>
#include "base/bind.h"
@@ -17,7 +18,6 @@
#include "base/lazy_instance.h"
#include "base/path_service.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -159,7 +159,7 @@ const BookmarkNode* BookmarksFunction::CreateBookmarkNode(
index = size_t{*details.index};
}
- base::string16 title; // Optional.
+ std::u16string title; // Optional.
if (details.title.get())
title = base::UTF8ToUTF16(*details.title);
@@ -338,7 +338,7 @@ void BookmarkEventRouter::BookmarkNodeChanged(BookmarkModel* model,
api::bookmarks::OnChanged::ChangeInfo change_info;
change_info.title = base::UTF16ToUTF8(node->GetTitle());
if (node->is_url())
- change_info.url.reset(new std::string(node->url().spec()));
+ change_info.url = std::make_unique<std::string>(node->url().spec());
DispatchEvent(events::BOOKMARKS_ON_CHANGED,
api::bookmarks::OnChanged::kEventName,
@@ -409,8 +409,8 @@ BookmarksAPI::GetFactoryInstance() {
}
void BookmarksAPI::OnListenerAdded(const EventListenerInfo& details) {
- bookmark_event_router_.reset(
- new BookmarkEventRouter(Profile::FromBrowserContext(browser_context_)));
+ bookmark_event_router_ = std::make_unique<BookmarkEventRouter>(
+ Profile::FromBrowserContext(browser_context_));
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
@@ -526,8 +526,8 @@ ExtensionFunction::ResponseValue BookmarksSearchFunction::RunOnReady() {
std::vector<const BookmarkNode*> nodes;
if (params->query.as_string) {
bookmarks::QueryFields query;
- query.word_phrase_query.reset(
- new base::string16(base::UTF8ToUTF16(*params->query.as_string)));
+ query.word_phrase_query = std::make_unique<std::u16string>(
+ base::UTF8ToUTF16(*params->query.as_string));
bookmarks::GetBookmarksMatchingProperties(
BookmarkModelFactory::GetForBrowserContext(GetProfile()), query,
std::numeric_limits<int>::max(), &nodes);
@@ -537,13 +537,15 @@ ExtensionFunction::ResponseValue BookmarksSearchFunction::RunOnReady() {
*params->query.as_object;
bookmarks::QueryFields query;
if (object.query) {
- query.word_phrase_query.reset(
- new base::string16(base::UTF8ToUTF16(*object.query)));
+ query.word_phrase_query =
+ std::make_unique<std::u16string>(base::UTF8ToUTF16(*object.query));
}
if (object.url)
- query.url.reset(new base::string16(base::UTF8ToUTF16(*object.url)));
+ query.url =
+ std::make_unique<std::u16string>(base::UTF8ToUTF16(*object.url));
if (object.title)
- query.title.reset(new base::string16(base::UTF8ToUTF16(*object.title)));
+ query.title =
+ std::make_unique<std::u16string>(base::UTF8ToUTF16(*object.title));
bookmarks::GetBookmarksMatchingProperties(
BookmarkModelFactory::GetForBrowserContext(GetProfile()), query,
std::numeric_limits<int>::max(), &nodes);
@@ -672,7 +674,7 @@ ExtensionFunction::ResponseValue BookmarksUpdateFunction::RunOnReady() {
return BadMessage();
// Optional but we need to distinguish non present from an empty title.
- base::string16 title;
+ std::u16string title;
bool has_title = false;
if (params->changes.title.get()) {
title = base::UTF8ToUTF16(*params->changes.title);
@@ -745,7 +747,7 @@ void BookmarksIOFunction::ShowSelectFileDialog(
// such a case if file-selection dialogs are forbidden by policy, we will not
// show an InfoBar, which is better than letting one appear out of the blue.
select_file_dialog_->SelectFile(
- type, base::string16(), default_path, &file_type_info, 0,
+ type, std::u16string(), default_path, &file_type_info, 0,
base::FilePath::StringType(), owning_window, nullptr);
}
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api_unittest.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api_unittest.cc
index 1d5939731c2..34974634746 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api_unittest.cc
@@ -32,8 +32,8 @@ class BookmarksApiUnittest : public ExtensionServiceTestBase {
model_ = BookmarkModelFactory::GetForBrowserContext(profile());
bookmarks::test::WaitForBookmarkModelToLoad(model_);
- const bookmarks::BookmarkNode* node = model_->AddFolder(
- model_->other_node(), 0, base::ASCIIToUTF16("Empty folder"));
+ const bookmarks::BookmarkNode* node =
+ model_->AddFolder(model_->other_node(), 0, u"Empty folder");
node_id_ = base::NumberToString(node->id());
}
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
index 721bcdeae62..40e9c04cd8f 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc
@@ -45,7 +45,6 @@ class BrailleDisplayPrivateAPI::DefaultEventDelegate
BrailleDisplayPrivateAPI::BrailleDisplayPrivateAPI(
content::BrowserContext* context)
: profile_(Profile::FromBrowserContext(context)),
- scoped_observer_(this),
event_delegate_(new DefaultEventDelegate(this, profile_)) {}
BrailleDisplayPrivateAPI::~BrailleDisplayPrivateAPI() {
@@ -103,16 +102,16 @@ void BrailleDisplayPrivateAPI::SetEventDelegateForTest(
void BrailleDisplayPrivateAPI::OnListenerAdded(
const EventListenerInfo& details) {
BrailleController* braille_controller = BrailleController::GetInstance();
- if (!scoped_observer_.IsObserving(braille_controller))
- scoped_observer_.Add(braille_controller);
+ if (!scoped_observation_.IsObservingSource(braille_controller))
+ scoped_observation_.Observe(braille_controller);
}
void BrailleDisplayPrivateAPI::OnListenerRemoved(
const EventListenerInfo& details) {
BrailleController* braille_controller = BrailleController::GetInstance();
if (!event_delegate_->HasListener() &&
- scoped_observer_.IsObserving(braille_controller)) {
- scoped_observer_.Remove(braille_controller);
+ scoped_observation_.IsObservingSource(braille_controller)) {
+ scoped_observation_.Reset();
}
}
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
index 2684e50134e..fc3c5f3a0f4 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
@@ -5,7 +5,7 @@
#ifndef CHROME_BROWSER_EXTENSIONS_API_BRAILLE_DISPLAY_PRIVATE_BRAILLE_DISPLAY_PRIVATE_API_H_
#define CHROME_BROWSER_EXTENSIONS_API_BRAILLE_DISPLAY_PRIVATE_BRAILLE_DISPLAY_PRIVATE_API_H_
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
#include "chrome/common/extensions/api/braille_display_private.h"
#include "extensions/browser/api/async_api_function.h"
@@ -66,8 +66,9 @@ class BrailleDisplayPrivateAPI : public BrowserContextKeyedAPI,
void SetEventDelegateForTest(std::unique_ptr<EventDelegate> delegate);
Profile* profile_;
- ScopedObserver<api::braille_display_private::BrailleController,
- BrailleObserver> scoped_observer_;
+ base::ScopedObservation<api::braille_display_private::BrailleController,
+ BrailleObserver>
+ scoped_observation_{this};
std::unique_ptr<EventDelegate> event_delegate_;
// BrowserContextKeyedAPI implementation.
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
index dd4b05905ed..eb8f56246d2 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
@@ -184,7 +184,8 @@ IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, WriteDots) {
connection_data_.display_columns = 11;
connection_data_.display_rows = 1;
connection_data_.cell_size = 6;
- ASSERT_TRUE(RunComponentExtensionTest("braille_display_private/write_dots"))
+ ASSERT_TRUE(RunExtensionTest({.name = "braille_display_private/write_dots",
+ .load_as_component = true}))
<< message_;
ASSERT_EQ(3U, connection_data_.written_content.size());
const std::string expected_content(
@@ -260,7 +261,8 @@ IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, KeyEvents) {
BRLAPI_KEY_CMD_PASSDOTS | i);
}
- ASSERT_TRUE(RunComponentExtensionTest("braille_display_private/key_events"));
+ ASSERT_TRUE(RunExtensionTest({.name = "braille_display_private/key_events",
+ .load_as_component = true}));
}
IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, DisplayStateChanges) {
@@ -269,8 +271,9 @@ IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, DisplayStateChanges) {
connection_data_.cell_size = 6;
connection_data_.pending_keys.push_back(kErrorKeyCode);
connection_data_.reappear_on_disconnect = true;
- ASSERT_TRUE(RunComponentExtensionTest(
- "braille_display_private/display_state_changes"));
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "braille_display_private/display_state_changes",
+ .load_as_component = true}));
}
class BrailleDisplayPrivateAPIUserTest : public BrailleDisplayPrivateApiTest {
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc b/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc
index 2b2b867331b..3d97b24b3fb 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/braille_display_private/mock_braille_controller.h"
+#include <memory>
+
namespace extensions {
namespace api {
namespace braille_display_private {
@@ -15,8 +17,8 @@ std::unique_ptr<DisplayState> MockBrailleController::GetDisplayState() {
std::unique_ptr<DisplayState> state(new DisplayState());
state->available = available_;
if (available_) {
- state->text_column_count.reset(new int(18));
- state->text_row_count.reset(new int(18));
+ state->text_column_count = std::make_unique<int>(18);
+ state->text_row_count = std::make_unique<int>(18);
}
return state;
}
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc
index e732981f223..cab6b17d044 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h"
+#include <memory>
+
namespace extensions {
namespace api {
namespace braille_display_private {
@@ -12,7 +14,7 @@ StubBrailleController::StubBrailleController() {
}
std::unique_ptr<DisplayState> StubBrailleController::GetDisplayState() {
- return std::unique_ptr<DisplayState>(new DisplayState);
+ return std::make_unique<DisplayState>();
}
void StubBrailleController::WriteDots(const std::vector<uint8_t>& cells,
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
index afb2c80e113..938ca02063c 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -265,7 +265,7 @@ void BrowsingDataSettingsFunction::SetDetails(
permitted_dict->SetBoolean(data_type, is_permitted);
}
-BrowsingDataRemoverFunction::BrowsingDataRemoverFunction() : observer_(this) {}
+BrowsingDataRemoverFunction::BrowsingDataRemoverFunction() = default;
void BrowsingDataRemoverFunction::OnBrowsingDataRemoverDone(
uint64_t failed_data_types) {
@@ -278,7 +278,7 @@ void BrowsingDataRemoverFunction::OnTaskFinished() {
if (--pending_tasks_ > 0)
return;
synced_data_deletion_.reset();
- observer_.RemoveAll();
+ observation_.Reset();
Respond(NoArguments());
Release(); // Balanced in StartRemoving.
}
@@ -377,7 +377,7 @@ void BrowsingDataRemoverFunction::StartRemoving() {
// that we're notified after removal) and call remove() with the arguments
// we've generated above. We can use a raw pointer here, as the browsing data
// remover is responsible for deleting itself once data removal is complete.
- observer_.Add(remover);
+ observation_.Observe(remover);
DCHECK_EQ(pending_tasks_, 0);
pending_tasks_ = 1;
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
index c101eab6761..6d84cfdeb60 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
@@ -12,7 +12,7 @@
#include <memory>
#include <vector>
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "content/public/browser/browsing_data_filter_builder.h"
@@ -149,9 +149,9 @@ class BrowsingDataRemoverFunction
content::BrowsingDataFilterBuilder::Mode mode_ =
content::BrowsingDataFilterBuilder::Mode::kPreserve;
int pending_tasks_ = 0;
- ScopedObserver<content::BrowsingDataRemover,
- content::BrowsingDataRemover::Observer>
- observer_;
+ base::ScopedObservation<content::BrowsingDataRemover,
+ content::BrowsingDataRemover::Observer>
+ observation_{this};
std::unique_ptr<AccountReconcilor::ScopedSyncedDataDeletion>
synced_data_deletion_;
};
diff --git a/chromium/chrome/browser/extensions/api/certificate_provider/DIR_METADATA b/chromium/chrome/browser/extensions/api/certificate_provider/DIR_METADATA
index 3ecb4771a12..1cb62eff1d1 100644
--- a/chromium/chrome/browser/extensions/api/certificate_provider/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/certificate_provider/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise>Smartcard"
}
diff --git a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index 74a0397c2de..502c1d8aad1 100644
--- a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -25,16 +25,14 @@
#include "base/strings/utf_string_conversions.h"
#include "base/test/bind.h"
#include "base/values.h"
-#include "chrome/browser/browser_process.h"
#include "chrome/browser/ash/certificate_provider/certificate_provider.h"
#include "chrome/browser/ash/certificate_provider/certificate_provider_service.h"
#include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h"
#include "chrome/browser/ash/certificate_provider/test_certificate_provider_extension.h"
-#include "chrome/browser/chromeos/ui/request_pin_view.h"
+#include "chrome/browser/ash/notifications/request_pin_view.h"
#include "chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/ui_test_utils.h"
@@ -387,7 +385,7 @@ class CertificateProviderApiMockedExtensionTest
{
base::RunLoop run_loop;
GetExtensionMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("signatureRequestData;"),
+ u"signatureRequestData;",
base::BindOnce(&StoreDigest, &request_data, run_loop.QuitClosure()));
run_loop.Run();
}
@@ -423,6 +421,26 @@ class CertificateProviderApiMockedExtensionTest
"got client cert with fingerprint: " + client_cert_fingerprint);
}
+ void SetInterstitialBypass() {
+ // Navigate to the test server in a new tab (to not clobber the test
+ // fixture setup.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GetHttpsClientCertUrl(),
+ WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+ auto* tab = browser()->tab_strip_model()->GetActiveWebContents();
+
+ // Proceed through the interstitial to set an SSL bypass for this host.
+ content::TestNavigationObserver nav_observer(tab,
+ /*number_of_navigations=*/1);
+ ASSERT_TRUE(content::ExecuteScript(
+ tab, "window.certificateErrorPageController.proceed();"));
+ nav_observer.Wait();
+
+ // Close the new tab to go back to the state set up by SetUpOnMainThread().
+ tab->Close();
+ }
+
private:
std::string GetCertificateData() const {
const base::FilePath certificate_path =
@@ -474,7 +492,7 @@ class CertificateProviderRequestPinTest : public CertificateProviderApiTest {
browser(), extension_->GetResourceURL(test_page_file_name));
}
- chromeos::RequestPinView* GetActivePinDialogView() {
+ ash::RequestPinView* GetActivePinDialogView() {
return cert_provider_service_->pin_dialog_manager()
->default_dialog_host_for_testing()
->active_view_for_testing();
@@ -686,22 +704,13 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest,
// Tests the RSA MD5/SHA-1 signature algorithm. Note that TLS 1.1 is used in
// order to make this algorithm employed.
-// TODO(cthomp): The SSLVersionMin policy will be removed in M-91, making these
-// algorithms unsupported.
IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest, RsaMd5Sha1) {
- // This test requires the SSLVersionMin policy is set to allow TLS 1.0.
- base::Value ssl_policy("tls1"); // TLS 1.0
- policy_map_.Set(policy::key::kSSLVersionMin, policy::POLICY_LEVEL_MANDATORY,
- policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_CLOUD,
- std::move(ssl_policy), nullptr);
- EXPECT_NO_FATAL_FAILURE(provider_.UpdateChromePolicy(policy_map_));
-
- // Wait for the updated SSL configuration to be sent to the network service,
- // to avoid a race.
- g_browser_process->system_network_context_manager()
- ->FlushSSLConfigManagerForTesting();
-
ASSERT_TRUE(StartHttpsServer(net::SSL_PROTOCOL_VERSION_TLS1_1));
+
+ // Bypass the legacy TLS interstitial. Future connections to the test server
+ // will now succeed.
+ SetInterstitialBypass();
+
ExecuteJavascript("supportedAlgorithms = ['RSASSA_PKCS1_v1_5_MD5_SHA1'];");
ExecuteJavascript("registerForSignatureRequests();");
ExecuteJavascriptAndWaitForCallback("setCertificates();");
@@ -712,23 +721,14 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest, RsaMd5Sha1) {
// Tests the RSA MD5/SHA-1 signature algorithm using the legacy version of the
// API. Note that TLS 1.1 is used in order to make this algorithm employed.
-// TODO(cthomp): The SSLVersionMin policy will be removed in M-91, making these
-// algorithms unsupported.
IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest,
LegacyRsaMd5Sha1) {
- // This test requires the SSLVersionMin policy is set to allow TLS 1.0.
- base::Value ssl_policy("tls1"); // TLS 1.0
- policy_map_.Set(policy::key::kSSLVersionMin, policy::POLICY_LEVEL_MANDATORY,
- policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_CLOUD,
- std::move(ssl_policy), nullptr);
- EXPECT_NO_FATAL_FAILURE(provider_.UpdateChromePolicy(policy_map_));
-
- // Wait for the updated SSL configuration to be sent to the network service,
- // to avoid a race.
- g_browser_process->system_network_context_manager()
- ->FlushSSLConfigManagerForTesting();
-
ASSERT_TRUE(StartHttpsServer(net::SSL_PROTOCOL_VERSION_TLS1_1));
+
+ // Bypass the legacy TLS interstitial. Future connections to the test server
+ // will now succeed.
+ SetInterstitialBypass();
+
ExecuteJavascript("supportedLegacyHashes = ['MD5_SHA1'];");
ExecuteJavascript("registerAsLegacyCertificateProvider();");
ExecuteJavascript("registerForLegacySignatureRequests();");
@@ -849,23 +849,14 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest,
// Tests that the RSA MD5/SHA-1 signature algorithm is used in case of TLS 1.1,
// even when there are other algorithms specified (which are stronger but aren't
// supported on TLS 1.1).
-// TODO(cthomp): The SSLVersionMin policy will be removed in M-91, making these
-// algorithms unsupported.
IN_PROC_BROWSER_TEST_F(CertificateProviderApiMockedExtensionTest,
RsaMd5Sha1AndOthers) {
- // This test requires the SSLVersionMin policy is set to allow TLS 1.0.
- base::Value ssl_policy("tls1"); // TLS 1.0
- policy_map_.Set(policy::key::kSSLVersionMin, policy::POLICY_LEVEL_MANDATORY,
- policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_CLOUD,
- std::move(ssl_policy), nullptr);
- EXPECT_NO_FATAL_FAILURE(provider_.UpdateChromePolicy(policy_map_));
-
- // Wait for the updated SSL configuration to be sent to the network service,
- // to avoid a race.
- g_browser_process->system_network_context_manager()
- ->FlushSSLConfigManagerForTesting();
-
ASSERT_TRUE(StartHttpsServer(net::SSL_PROTOCOL_VERSION_TLS1_1));
+
+ // Bypass the legacy TLS interstitial. Future connections to the test server
+ // will now succeed.
+ SetInterstitialBypass();
+
ExecuteJavascript(
"supportedAlgorithms = ['RSASSA_PKCS1_v1_5_SHA512', "
"'RSASSA_PKCS1_v1_5_SHA1', 'RSASSA_PKCS1_v1_5_MD5_SHA1'];");
diff --git a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
index 8380ebe4768..b9a1166bd57 100644
--- a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
+++ b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
@@ -72,6 +72,9 @@
#include "chrome/browser/extensions/api/file_handlers/non_native_file_system_delegate_chromeos.h"
#include "chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h"
#include "chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h"
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chrome/browser/extensions/clipboard_extension_helper_chromeos.h"
#endif
@@ -153,11 +156,11 @@ bool ChromeExtensionsAPIClient::ShouldHideBrowserNetworkRequest(
request.initiator ==
url::Origin::Create(GURL(chrome::kChromeUINewTabURL)));
- // Hide requests made by the browser on behalf of the local NTP.
+ // Hide requests made by the browser on behalf of the 1P WebUI NTP.
is_sensitive_request |=
(is_browser_request &&
request.initiator ==
- url::Origin::Create(GURL(chrome::kChromeSearchLocalNtpUrl)));
+ url::Origin::Create(GURL(chrome::kChromeUINewTabPageURL)));
// Hide requests made by the NTP Instant renderer.
auto* instant_service =
@@ -326,8 +329,8 @@ ChromeExtensionsAPIClient::CreateDevicePermissionsPrompt(
bool ChromeExtensionsAPIClient::ShouldAllowDetachingUsb(int vid,
int pid) const {
const base::ListValue* policy_list;
- if (chromeos::CrosSettings::Get()->GetList(chromeos::kUsbDetachableAllowlist,
- &policy_list)) {
+ if (ash::CrosSettings::Get()->GetList(chromeos::kUsbDetachableAllowlist,
+ &policy_list)) {
for (const auto& entry : *policy_list) {
if (entry.FindIntKey(chromeos::kUsbDetachableAllowlistKeyVid) == vid &&
entry.FindIntKey(chromeos::kUsbDetachableAllowlistKeyPid) == pid) {
@@ -371,7 +374,8 @@ ChromeExtensionsAPIClient::CreateDisplayInfoProvider() const {
MetricsPrivateDelegate* ChromeExtensionsAPIClient::GetMetricsPrivateDelegate() {
if (!metrics_private_delegate_)
- metrics_private_delegate_.reset(new ChromeMetricsPrivateDelegate());
+ metrics_private_delegate_ =
+ std::make_unique<ChromeMetricsPrivateDelegate>();
return metrics_private_delegate_.get();
}
@@ -424,7 +428,9 @@ ChromeExtensionsAPIClient::GetNonNativeFileSystemDelegate() {
}
return non_native_file_system_delegate_.get();
}
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
void ChromeExtensionsAPIClient::SaveImageDataToClipboard(
const std::vector<char>& image_data,
api::clipboard::ImageType type,
@@ -437,7 +443,7 @@ void ChromeExtensionsAPIClient::SaveImageDataToClipboard(
image_data, type, std::move(additional_items),
std::move(success_callback), std::move(error_callback));
}
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
AutomationInternalApiDelegate*
ChromeExtensionsAPIClient::GetAutomationInternalApiDelegate() {
diff --git a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.h b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.h
index ae948f32568..10e9c251d02 100644
--- a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.h
+++ b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.h
@@ -85,14 +85,16 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient {
#if BUILDFLAG(IS_CHROMEOS_ASH)
MediaPerceptionAPIDelegate* GetMediaPerceptionAPIDelegate() override;
NonNativeFileSystemDelegate* GetNonNativeFileSystemDelegate() override;
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
void SaveImageDataToClipboard(
const std::vector<char>& image_data,
api::clipboard::ImageType type,
AdditionalDataItemList additional_items,
base::OnceClosure success_callback,
base::OnceCallback<void(const std::string&)> error_callback) override;
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
AutomationInternalApiDelegate* GetAutomationInternalApiDelegate() override;
std::vector<KeyedServiceBaseFactory*> GetFactoryDependencies() override;
@@ -108,6 +110,8 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient {
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::unique_ptr<MediaPerceptionAPIDelegate> media_perception_api_delegate_;
std::unique_ptr<NonNativeFileSystemDelegate> non_native_file_system_delegate_;
+#endif
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
std::unique_ptr<ClipboardExtensionHelper> clipboard_extension_helper_;
#endif
std::unique_ptr<extensions::ChromeAutomationInternalApiDelegate>
diff --git a/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc b/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
index 4b5bb96b6dc..0459eed687d 100644
--- a/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
@@ -20,5 +20,7 @@ class CommandLinePrivateApiTest : public extensions::ExtensionApiTest {
};
IN_PROC_BROWSER_TEST_F(CommandLinePrivateApiTest, Basics) {
- EXPECT_TRUE(RunComponentExtensionTest("command_line/basics")) << message_;
+ EXPECT_TRUE(RunExtensionTest(
+ {.name = "command_line/basics", .load_as_component = true}))
+ << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.cc b/chromium/chrome/browser/extensions/api/commands/command_service.cc
index c4701392d9a..65e8eb1b987 100644
--- a/chromium/chrome/browser/extensions/api/commands/command_service.cc
+++ b/chromium/chrome/browser/extensions/api/commands/command_service.cc
@@ -103,7 +103,7 @@ CommandService::CommandService(content::BrowserContext* context)
ExtensionFunctionRegistry::GetInstance()
.RegisterFunction<GetAllCommandsFunction>();
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
}
CommandService::~CommandService() {
@@ -319,8 +319,8 @@ Command CommandService::FindCommandByName(const std::string& extension_id,
shortcut, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
CHECK(tokens.size() >= 2);
- return Command(command_name, base::string16(), tokens[1].as_string(),
- global);
+ return Command(command_name, std::u16string(), tokens[1].as_string(),
+ global);
}
return Command();
@@ -485,7 +485,7 @@ bool CommandService::CanAutoAssign(const Command &command,
return false; // Browser and page actions are not global in nature.
if (extension->permissions_data()->HasAPIPermission(
- APIPermission::kCommandsAccessibility))
+ mojom::APIPermissionID::kCommandsAccessibility))
return true;
// Global shortcuts are restricted to (Ctrl|Command)+Shift+[0-9].
diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.h b/chromium/chrome/browser/extensions/api/commands/command_service.h
index f09db03b905..161b2e30126 100644
--- a/chromium/chrome/browser/extensions/api/commands/command_service.h
+++ b/chromium/chrome/browser/extensions/api/commands/command_service.h
@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "base/observer_list.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/common/extensions/command.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry.h"
@@ -221,8 +221,8 @@ class CommandService : public BrowserContextKeyedAPI,
// A weak pointer to the profile we are associated with. Not owned by us.
Profile* profile_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
base::ObserverList<Observer>::Unchecked observers_;
diff --git a/chromium/chrome/browser/extensions/api/commands/commands.cc b/chromium/chrome/browser/extensions/api/commands/commands.cc
index 5f5991f37ef..216ad66c99d 100644
--- a/chromium/chrome/browser/extensions/api/commands/commands.cc
+++ b/chromium/chrome/browser/extensions/api/commands/commands.cc
@@ -19,9 +19,8 @@ std::unique_ptr<base::DictionaryValue> CreateCommandValue(
std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
result->SetString("name", command.command_name());
result->SetString("description", command.description());
- result->SetString("shortcut",
- active ? command.accelerator().GetShortcutText() :
- base::string16());
+ result->SetString("shortcut", active ? command.accelerator().GetShortcutText()
+ : std::u16string());
return result;
}
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api.cc
index 145091f81e5..b732767ba21 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api.cc
@@ -63,11 +63,6 @@ bool RemoveContentType(base::ListValue* args,
// We remove the ContentSettingsType parameter since this is added by the
// renderer, and is not part of the JSON schema.
args->Remove(0, nullptr);
- // PLUGINS have been deprecated, so ignore requests for removing them.
- if (content_type_str == "plugins") {
- *content_type = ContentSettingsType::DEPRECATED_PLUGINS;
- return true;
- }
*content_type =
extensions::content_settings_helpers::StringToContentSettingsType(
content_type_str);
@@ -86,12 +81,6 @@ ContentSettingsContentSettingClearFunction::Run() {
std::unique_ptr<Clear::Params> params(Clear::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
- if (content_type == ContentSettingsType::DEPRECATED_PLUGINS) {
- return RespondNow(
- Error(content_settings_api_constants::
- kSettingPluginContentSettingsClearIsDisallowed));
- }
-
ExtensionPrefsScope scope = kExtensionPrefsScopeRegular;
bool incognito = false;
if (params->details.scope ==
@@ -126,10 +115,6 @@ ContentSettingsContentSettingGetFunction::Run() {
std::unique_ptr<Get::Params> params(Get::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
- if (content_type == ContentSettingsType::DEPRECATED_PLUGINS) {
- return RespondNow(Error(content_settings_api_constants::
- kSettingPluginContentSettingsGetIsDisallowed));
- }
GURL primary_url(params->details.primary_url);
if (!primary_url.is_valid()) {
@@ -172,13 +157,11 @@ ContentSettingsContentSettingGetFunction::Run() {
cookie_settings = CookieSettingsFactory::GetForProfile(profile).get();
}
- ContentSetting setting;
- if (content_type == ContentSettingsType::COOKIES) {
- cookie_settings->GetCookieSetting(primary_url, secondary_url, nullptr,
- &setting);
- } else {
- setting = map->GetContentSetting(primary_url, secondary_url, content_type);
- }
+ ContentSetting setting =
+ content_type == ContentSettingsType::COOKIES
+ ? cookie_settings->GetCookieSetting(primary_url, secondary_url,
+ nullptr)
+ : map->GetContentSetting(primary_url, secondary_url, content_type);
std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
std::string setting_string =
@@ -199,12 +182,6 @@ ContentSettingsContentSettingSetFunction::Run() {
std::unique_ptr<Set::Params> params(Set::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
- // PLUGINS have been deprecated.
- if (content_type == ContentSettingsType::DEPRECATED_PLUGINS) {
- return RespondNow(Error(content_settings_api_constants::
- kSettingPluginContentSettingsIsDisallowed));
- }
-
std::string primary_error;
ContentSettingsPattern primary_pattern =
content_settings_helpers::ParseExtensionPattern(
@@ -326,19 +303,11 @@ ContentSettingsContentSettingSetFunction::Run() {
ExtensionFunction::ResponseAction
ContentSettingsContentSettingGetResourceIdentifiersFunction::Run() {
- ContentSettingsType content_type;
- EXTENSION_FUNCTION_VALIDATE(RemoveContentType(args_.get(), &content_type));
-
- if (content_type != ContentSettingsType::DEPRECATED_PLUGINS) {
- return RespondNow(NoArguments());
- }
-#if BUILDFLAG(ENABLE_PLUGINS)
- return RespondNow(
- Error(content_settings_api_constants::
- kSettingPluginContentSettingsResourceIdentifierIsDisallowed));
-#endif
-
- return RespondLater();
+ // The only setting that supported resource identifiers was plugins. Since
+ // plugins have been deprecated since Chrome 87, there are no resource
+ // identifiers for existing settings (but we retain the function for
+ // backwards and potential forwards compatibility).
+ return RespondNow(NoArguments());
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.cc
index 6176c1f6ae1..796a79724d7 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.cc
@@ -23,15 +23,5 @@ const char kIncognitoSessionOnlyError[] =
"You cannot read incognito content settings when no incognito window "
"is open.";
const char kInvalidUrlError[] = "The URL \"*\" is invalid.";
-const char kSettingPluginContentSettingsIsDisallowed[] =
- "`chrome.contentSettings.plugins.set()` API is no longer supported.";
-const char kSettingPluginContentSettingsResourceIdentifierIsDisallowed[] =
- "`chrome.contentSettings.plugins.getResourceIdentifiers()` API is no "
- "longer supported.";
-const char kSettingPluginContentSettingsGetIsDisallowed[] =
- "`chrome.contentSettings.plugins.get()` API is no longer supported.";
-const char kSettingPluginContentSettingsClearIsDisallowed[] =
- "`chrome.contentSettings.plugins.clear()` API is no longer supported.";
-
} // namespace content_settings_api_constants
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.h b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.h
index adb68a18d2e..b4f4201e105 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.h
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_api_constants.h
@@ -23,10 +23,6 @@ extern const char kSecondaryPatternKey[];
extern const char kIncognitoContextError[];
extern const char kIncognitoSessionOnlyError[];
extern const char kInvalidUrlError[];
-extern const char kSettingPluginContentSettingsIsDisallowed[];
-extern const char kSettingPluginContentSettingsResourceIdentifierIsDisallowed[];
-extern const char kSettingPluginContentSettingsGetIsDisallowed[];
-extern const char kSettingPluginContentSettingsClearIsDisallowed[];
} // namespace content_settings_api_constants
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
index b7153b24caf..0f28fb51337 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
@@ -289,9 +289,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, IncognitoIsolation) {
std::vector<int> content_settings_before = GetContentSettingsSnapshot(url);
// Run extension, set all permissions to allow, and check if they are changed.
- EXPECT_TRUE(RunExtensionSubtestWithArgAndFlags(
- "content_settings/incognitoisolation", "test.html", "allow",
- kFlagEnableIncognito, kFlagUseIncognito))
+ ASSERT_TRUE(RunExtensionTest({.name = "content_settings/incognitoisolation",
+ .page_url = "test.html",
+ .custom_arg = "allow",
+ .open_in_incognito = true},
+ {.allow_in_incognito = true}))
<< message_;
// Get content settings after running extension to ensure nothing is changed.
@@ -299,9 +301,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, IncognitoIsolation) {
EXPECT_EQ(content_settings_before, content_settings_after);
// Run extension, set all permissions to block, and check if they are changed.
- EXPECT_TRUE(RunExtensionSubtestWithArgAndFlags(
- "content_settings/incognitoisolation", "test.html", "block",
- kFlagEnableIncognito, kFlagUseIncognito))
+ ASSERT_TRUE(RunExtensionTest({.name = "content_settings/incognitoisolation",
+ .page_url = "test.html",
+ .custom_arg = "block",
+ .open_in_incognito = true},
+ {.allow_in_incognito = true}))
<< message_;
// Get content settings after running extension to ensure nothing is changed.
@@ -312,8 +316,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, IncognitoIsolation) {
// Tests if changing incognito mode permissions in regular profile are rejected.
IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest,
IncognitoNotAllowedInRegular) {
- EXPECT_FALSE(RunExtensionSubtestWithArg("content_settings/incognitoisolation",
- "test.html", "allow"))
+ EXPECT_FALSE(RunExtensionTest({.name = "content_settings/incognitoisolation",
+ .page_url = "test.html",
+ .custom_arg = "allow"}))
<< message_;
}
@@ -346,11 +351,6 @@ IN_PROC_BROWSER_TEST_P(ExtensionContentSettingsApiLazyTest,
"ContentSettings.ExtensionNonEmbeddedSettingSet", 2);
}
-IN_PROC_BROWSER_TEST_P(ExtensionContentSettingsApiLazyTest, PluginsApiTest) {
- constexpr char kExtensionPath[] = "content_settings/disablepluginsapi";
- EXPECT_TRUE(RunLazyTest(kExtensionPath)) << message_;
-}
-
IN_PROC_BROWSER_TEST_P(ExtensionContentSettingsApiLazyTest, ConsoleErrorTest) {
constexpr char kExtensionPath[] = "content_settings/disablepluginsapi";
const extensions::Extension* extension =
@@ -360,7 +360,7 @@ IN_PROC_BROWSER_TEST_P(ExtensionContentSettingsApiLazyTest, ConsoleErrorTest) {
->GetBackgroundHostForExtension(extension->id())
->host_contents();
content::WebContentsConsoleObserver console_observer(web_contents);
- console_observer.SetPattern("*API is no longer supported*");
+ console_observer.SetPattern("*contentSettings.plugins is deprecated.*");
browsertest_util::ExecuteScriptInBackgroundPageNoWait(
profile(), extension->id(), "setPluginsSetting()");
console_observer.Wait();
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.cc
index 5ef415d0622..5b497ee8b48 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.cc
@@ -71,11 +71,12 @@ void ContentSettingsService::OnExtensionStateChanged(
void ContentSettingsService::OnExtensionPrefsWillBeDestroyed(
ExtensionPrefs* prefs) {
- scoped_observer_.Remove(prefs);
+ DCHECK(scoped_observation_.IsObservingSource(prefs));
+ scoped_observation_.Reset();
}
void ContentSettingsService::OnExtensionPrefsAvailable(ExtensionPrefs* prefs) {
- scoped_observer_.Add(prefs);
+ scoped_observation_.Observe(prefs);
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.h b/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.h
index c5a86f87f42..ce32761a495 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.h
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_service.h
@@ -7,7 +7,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/content_settings/content_settings_store.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_prefs.h"
@@ -59,7 +59,8 @@ class ContentSettingsService : public BrowserContextKeyedAPI,
static const char* service_name() { return "ContentSettingsService"; }
scoped_refptr<ContentSettingsStore> content_settings_store_;
- ScopedObserver<ExtensionPrefs, ExtensionPrefsObserver> scoped_observer_{this};
+ base::ScopedObservation<ExtensionPrefs, ExtensionPrefsObserver>
+ scoped_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ContentSettingsService);
};
diff --git a/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc b/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
index 2d8f6323d81..32802feb787 100644
--- a/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
+
#include "base/strings/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/extensions/extension_apitest.h"
@@ -26,23 +28,63 @@
namespace extensions {
+using ContextType = ExtensionBrowserTest::ContextType;
+
class ExtensionContextMenuApiTest : public ExtensionApiTest {
public:
ExtensionContextMenuApiTest() = default;
+ ExtensionContextMenuApiTest(const ExtensionContextMenuApiTest&) = delete;
+ ExtensionContextMenuApiTest& operator=(const ExtensionContextMenuApiTest&) =
+ delete;
+};
+
+class ExtensionContextMenuApiTestWithContextType
+ : public ExtensionContextMenuApiTest,
+ public testing::WithParamInterface<ContextType> {
+ public:
+ ExtensionContextMenuApiTestWithContextType() = default;
+ ExtensionContextMenuApiTestWithContextType(
+ const ExtensionContextMenuApiTestWithContextType&) = delete;
+ ExtensionContextMenuApiTestWithContextType& operator=(
+ const ExtensionContextMenuApiTestWithContextType&) = delete;
+
+ protected:
+ bool RunTest(const char* path) {
+ return RunExtensionTest(
+ {.name = path},
+ {.load_as_service_worker = GetParam() == ContextType::kServiceWorker});
+ }
};
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ServiceWorkerContextMenus) {
- ASSERT_TRUE(RunExtensionTest({.name = "context_menus/event_page"},
- {.load_as_service_worker = true}))
- << message_;
+INSTANTIATE_TEST_SUITE_P(PersistentBackground,
+ ExtensionContextMenuApiTestWithContextType,
+ ::testing::Values(ContextType::kPersistentBackground));
+INSTANTIATE_TEST_SUITE_P(ServiceWorker,
+ ExtensionContextMenuApiTestWithContextType,
+ ::testing::Values(ContextType::kServiceWorker));
+
+// These tests are run from lazy extension contexts, namely event-page or
+// service worker extensions.
+using ExtensionContextMenuApiLazyTest =
+ ExtensionContextMenuApiTestWithContextType;
+
+INSTANTIATE_TEST_SUITE_P(EventPage,
+ ExtensionContextMenuApiLazyTest,
+ ::testing::Values(ContextType::kEventPage));
+INSTANTIATE_TEST_SUITE_P(ServiceWorker,
+ ExtensionContextMenuApiLazyTest,
+ ::testing::Values(ContextType::kServiceWorker));
+
+IN_PROC_BROWSER_TEST_P(ExtensionContextMenuApiLazyTest, ContextMenus) {
+ ASSERT_TRUE(RunTest("context_menus/event_page")) << message_;
}
// crbug.com/51436 -- creating context menus from multiple script contexts
// should work.
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContextMenusFromMultipleContexts) {
+IN_PROC_BROWSER_TEST_P(ExtensionContextMenuApiTestWithContextType,
+ ContextMenusFromMultipleContexts) {
ASSERT_TRUE(embedded_test_server()->Start());
- ASSERT_TRUE(RunExtensionTest("context_menus/add_from_multiple_contexts"))
- << message_;
+ ASSERT_TRUE(RunTest("context_menus/add_from_multiple_contexts")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
@@ -63,6 +105,21 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContextMenusFromMultipleContexts) {
}
}
+IN_PROC_BROWSER_TEST_P(ExtensionContextMenuApiTestWithContextType,
+ ContextMenusBasics) {
+ ASSERT_TRUE(RunTest("context_menus/basics")) << message_;
+}
+
+IN_PROC_BROWSER_TEST_P(ExtensionContextMenuApiTestWithContextType,
+ ContextMenusNoPerms) {
+ ASSERT_TRUE(RunTest("context_menus/no_perms")) << message_;
+}
+
+IN_PROC_BROWSER_TEST_P(ExtensionContextMenuApiTestWithContextType,
+ ContextMenusMultipleIds) {
+ ASSERT_TRUE(RunTest("context_menus/item_ids")) << message_;
+}
+
class ExtensionContextMenuVisibilityApiTest
: public ExtensionContextMenuApiTest {
public:
@@ -83,7 +140,7 @@ class ExtensionContextMenuVisibilityApiTest
params.page_url = frame->GetLastCommittedURL();
// Create context menu.
- menu_.reset(new TestRenderViewContextMenu(frame, params));
+ menu_ = std::make_unique<TestRenderViewContextMenu>(frame, params);
menu_->Init();
// Get menu model.
@@ -164,26 +221,6 @@ class ExtensionContextMenuVisibilityApiTest
DISALLOW_COPY_AND_ASSIGN(ExtensionContextMenuVisibilityApiTest);
};
-IN_PROC_BROWSER_TEST_F(ExtensionContextMenuVisibilityApiTest,
- ContextMenusBasics) {
- ASSERT_TRUE(RunExtensionTest("context_menus/basics")) << message_;
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionContextMenuVisibilityApiTest,
- ContextMenusNoPerms) {
- ASSERT_TRUE(RunExtensionTest("context_menus/no_perms")) << message_;
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionContextMenuVisibilityApiTest,
- ContextMenusMultipleIds) {
- ASSERT_TRUE(RunExtensionTest("context_menus/item_ids")) << message_;
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionContextMenuVisibilityApiTest,
- ContextMenusEventPage) {
- ASSERT_TRUE(RunExtensionTest("context_menus/event_page")) << message_;
-}
-
// Tests showing a single visible menu item in the top-level menu model, which
// includes actions like "Back", "View Page Source", "Inspect", etc.
IN_PROC_BROWSER_TEST_F(ExtensionContextMenuVisibilityApiTest,
diff --git a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h
index ccc35279410..b2e1ddfcf50 100644
--- a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h
+++ b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h
@@ -24,7 +24,7 @@ std::unique_ptr<extensions::MenuItem::Id> GetParentId(
bool is_off_the_record,
const MenuItem::ExtensionKey& key) {
if (!property.parent_id)
- return std::unique_ptr<extensions::MenuItem::Id>();
+ return nullptr;
std::unique_ptr<extensions::MenuItem::Id> parent_id(
new extensions::MenuItem::Id(is_off_the_record, key));
diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
index 471e00f6c97..6870bbe3d53 100644
--- a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
+++ b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
@@ -244,7 +244,7 @@ ExtensionFunction::ResponseAction CookiesGetFunction::Run() {
return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
- parsed_args_->details.store_id.reset(new std::string(store_id));
+ parsed_args_->details.store_id = std::make_unique<std::string>(store_id);
DCHECK(!url_.is_empty() && url_.is_valid());
cookies_helpers::GetCookieListFromManager(
@@ -302,7 +302,7 @@ ExtensionFunction::ResponseAction CookiesGetAllFunction::Run() {
return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
- parsed_args_->details.store_id.reset(new std::string(store_id));
+ parsed_args_->details.store_id = std::make_unique<std::string>(store_id);
DCHECK(url_.is_empty() || url_.is_valid());
if (url_.is_empty()) {
@@ -379,8 +379,7 @@ ExtensionFunction::ResponseAction CookiesSetFunction::Run() {
return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
- parsed_args_->details.store_id.reset(new std::string(store_id));
-
+ parsed_args_->details.store_id = std::make_unique<std::string>(store_id);
base::Time expiration_time;
if (parsed_args_->details.expiration_date.get()) {
@@ -532,7 +531,7 @@ ExtensionFunction::ResponseAction CookiesRemoveFunction::Run() {
return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
- parsed_args_->details.store_id.reset(new std::string(store_id));
+ parsed_args_->details.store_id = std::make_unique<std::string>(store_id);
network::mojom::CookieDeletionFilterPtr filter(
network::mojom::CookieDeletionFilter::New());
@@ -568,7 +567,7 @@ ExtensionFunction::ResponseAction CookiesGetAllCookieStoresFunction::Run() {
original_profile->HasPrimaryOTRProfile()) {
incognito_profile = original_profile->GetPrimaryOTRProfile();
if (incognito_profile)
- incognito_tab_ids.reset(new base::ListValue());
+ incognito_tab_ids = std::make_unique<base::ListValue>();
}
DCHECK(original_profile != incognito_profile);
@@ -619,7 +618,8 @@ BrowserContextKeyedAPIFactory<CookiesAPI>* CookiesAPI::GetFactoryInstance() {
}
void CookiesAPI::OnListenerAdded(const EventListenerInfo& details) {
- cookies_event_router_.reset(new CookiesEventRouter(browser_context_));
+ cookies_event_router_ =
+ std::make_unique<CookiesEventRouter>(browser_context_);
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
diff --git a/chromium/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc b/chromium/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
index a3443a2f870..ec0262335fb 100644
--- a/chromium/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
@@ -6,7 +6,7 @@
#include "base/system/sys_info.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
-#include "chrome/browser/chromeos/web_applications/system_web_app_integration_test.h"
+#include "chrome/browser/ash/web_applications/system_web_app_integration_test.h"
#include "chrome/browser/devtools/devtools_window_testing.h"
#include "chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h"
#include "chrome/browser/extensions/api/crash_report_private/crash_report_private_api.h"
diff --git a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
index fbc3ac40e0a..01645bcb805 100644
--- a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
@@ -248,7 +248,9 @@ class CryptoTokenPermissionTest : public ExtensionApiUnittest {
bool* out_result) {
if (bubble_action != permissions::PermissionRequestManager::NONE) {
prompt_factory_->set_response_type(bubble_action);
- prompt_factory_->DocumentOnLoadCompletedInMainFrame();
+ auto* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0);
+ prompt_factory_->DocumentOnLoadCompletedInMainFrame(
+ web_contents->GetMainFrame());
}
auto function = base::MakeRefCounted<
diff --git a/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc b/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
index 1a5fe2f8081..0dbdcee0575 100644
--- a/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/dashboard_private/dashboard_private_api.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -134,7 +135,7 @@ void DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::
ExtensionInstallPrompt::DELEGATED_PERMISSIONS_PROMPT));
prompt->set_delegated_username(details().delegated_user);
- install_prompt_.reset(new ExtensionInstallPrompt(web_contents));
+ install_prompt_ = std::make_unique<ExtensionInstallPrompt>(web_contents);
install_prompt_->ShowDialog(
base::BindOnce(
&DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::
diff --git a/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc b/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
index 739e3e1606e..cfd5e2ca8c5 100644
--- a/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -20,7 +20,7 @@
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/task/post_task.h"
@@ -79,11 +79,11 @@ namespace {
void CopyDebuggee(Debuggee* dst, const Debuggee& src) {
if (src.tab_id)
- dst->tab_id.reset(new int(*src.tab_id));
+ dst->tab_id = std::make_unique<int>(*src.tab_id);
if (src.extension_id)
- dst->extension_id.reset(new std::string(*src.extension_id));
+ dst->extension_id = std::make_unique<std::string>(*src.extension_id);
if (src.target_id)
- dst->target_id.reset(new std::string(*src.target_id));
+ dst->target_id = std::make_unique<std::string>(*src.target_id);
}
// Returns true if the given |Extension| is allowed to attach to the specified
@@ -225,8 +225,8 @@ class ExtensionDevToolsClientHost : public content::DevToolsAgentHostClient,
api::debugger::DETACH_REASON_TARGET_CLOSED;
// Listen to extension unloaded notification.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsClientHost);
};
@@ -245,7 +245,7 @@ ExtensionDevToolsClientHost::ExtensionDevToolsClientHost(
// ExtensionRegistryObserver listen extension unloaded and detach debugger
// from there.
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
// RVH-based agents disconnect from their clients when the app is terminating
// but shared worker-based agents do not.
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc
index f9ba058b6e6..18d678bdd25 100644
--- a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc
@@ -82,7 +82,7 @@ bool ExtensionDevToolsInfoBarDelegate::ShouldExpire(
return false;
}
-base::string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
+std::u16string ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
return l10n_util::GetStringFUTF16(IDS_DEV_TOOLS_INFOBAR_LABEL,
extension_name_);
}
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h
index 6870d675211..4fa19b3dc29 100644
--- a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h
+++ b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h
@@ -10,7 +10,6 @@
#include "base/callback_forward.h"
#include "base/callback_list.h"
-#include "base/strings/string16.h"
#include "base/timer/timer.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
@@ -43,7 +42,7 @@ class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
// ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
bool ShouldExpire(const NavigationDetails& details) const override;
- base::string16 GetMessageText() const override;
+ std::u16string GetMessageText() const override;
gfx::ElideBehavior GetMessageElideBehavior() const override;
int GetButtons() const override;
@@ -59,7 +58,7 @@ class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
base::OnceClosure destroyed_callback);
const std::string extension_id_;
- const base::string16 extension_name_;
+ const std::u16string extension_name_;
// infobar_ is set after attaching an extension and is deleted 5 seconds after
// detaching the extension. |infobar_| owns this object and is therefore
// guaranteed to outlive it.
diff --git a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
index d289d56c03c..c86f0bcff07 100644
--- a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
@@ -100,7 +100,7 @@ const char kRedirectToDataNoRules[] =
class DeclarativeApiTest : public ExtensionApiTest {
public:
std::string GetTitle() {
- base::string16 title(
+ std::u16string title(
browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
return base::UTF16ToUTF8(title);
}
@@ -127,10 +127,10 @@ const base::FilePath::CharType kDataRoot[] =
class DeclarativeApiTestWithOriginPolicy : public DeclarativeApiTest {
protected:
- base::string16 NavigateToAndReturnTitle(const char* url) {
+ std::u16string NavigateToAndReturnTitle(const char* url) {
EXPECT_TRUE(server());
ui_test_utils::NavigateToURL(browser(), GURL(server()->GetURL(url)));
- base::string16 title;
+ std::u16string title;
ui_test_utils::GetCurrentTabTitle(browser(), &title);
return title;
}
@@ -157,7 +157,7 @@ class DeclarativeApiTestWithOriginPolicy : public DeclarativeApiTest {
IN_PROC_BROWSER_TEST_F(DeclarativeApiTestWithOriginPolicy,
OriginPolicyEnabled) {
// Navigate to a page with an origin policy. It should load correctly.
- EXPECT_EQ(base::ASCIIToUTF16("Page With Policy"),
+ EXPECT_EQ(u"Page With Policy",
NavigateToAndReturnTitle("/page-with-policy.html"));
// Load an extension that has the |declarativeWebRequest| permission.
@@ -165,7 +165,7 @@ IN_PROC_BROWSER_TEST_F(DeclarativeApiTestWithOriginPolicy,
// Future navigations to the page with the origin policy should still work,
// and not throw an interstitial.
- EXPECT_EQ(base::ASCIIToUTF16("Page With Policy"),
+ EXPECT_EQ(u"Page With Policy",
NavigateToAndReturnTitle("/page-with-policy.html"));
}
diff --git a/chromium/chrome/browser/extensions/api/declarative/rules_registry_service_unittest.cc b/chromium/chrome/browser/extensions/api/declarative/rules_registry_service_unittest.cc
index 97ef56d188a..3638194bb4e 100644
--- a/chromium/chrome/browser/extensions/api/declarative/rules_registry_service_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative/rules_registry_service_unittest.cc
@@ -5,6 +5,8 @@
#include "extensions/browser/api/declarative/rules_registry_service.h"
#include <stddef.h>
+
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -34,7 +36,7 @@ void InsertRule(scoped_refptr<extensions::RulesRegistry> registry,
const std::string& id) {
std::vector<extensions::api::events::Rule> add_rules;
add_rules.emplace_back();
- add_rules[0].id.reset(new std::string(id));
+ add_rules[0].id = std::make_unique<std::string>(id);
std::string error = registry->AddRules(kExtensionId, std::move(add_rules));
EXPECT_TRUE(error.empty());
}
diff --git a/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc b/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc
index 997fed5c4e1..f3cdbb616aa 100644
--- a/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc
@@ -77,7 +77,7 @@ class RulesRegistryWithCacheTest : public testing::Test {
TestRulesRegistry* registry) {
std::vector<api::events::Rule> add_rules;
add_rules.emplace_back();
- add_rules[0].id.reset(new std::string(rule_id));
+ add_rules[0].id = std::make_unique<std::string>(rule_id);
return registry->AddRules(extension_id, std::move(add_rules));
}
@@ -360,14 +360,15 @@ TEST_F(RulesRegistryWithCacheTest, RulesPreservedAcrossRestart) {
std::string error;
scoped_refptr<Extension> extension(LoadManifestUnchecked(
"permissions", "web_request_all_host_permissions.json",
- Manifest::UNPACKED, Extension::NO_FLAGS, extension1_->id(), &error));
+ mojom::ManifestLocation::kUnpacked, Extension::NO_FLAGS,
+ extension1_->id(), &error));
ASSERT_TRUE(error.empty());
extension_service->AddExtension(extension.get());
EXPECT_TRUE(extensions::ExtensionRegistry::Get(env_.profile())
->enabled_extensions()
.Contains(extension->id()));
EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
- APIPermission::kDeclarativeWebRequest));
+ mojom::APIPermissionID::kDeclarativeWebRequest));
env_.GetExtensionSystem()->SetReady();
// 2. First run, adding a rule for the extension.
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc b/chromium/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc
index 9861349a914..ec8bd0e3381 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc
@@ -155,7 +155,7 @@ ChromeContentRulesRegistry::CreateRule(
conditions.push_back(
CreateContentCondition(extension, predicate_factories, *value, error));
if (!error->empty())
- return std::unique_ptr<ContentRule>();
+ return nullptr;
}
std::vector<std::unique_ptr<const ContentAction>> actions;
@@ -163,7 +163,7 @@ ChromeContentRulesRegistry::CreateRule(
actions.push_back(ContentAction::Create(browser_context(), extension,
*value, error));
if (!error->empty())
- return std::unique_ptr<ContentRule>();
+ return nullptr;
}
// Note: |api_rule| may contain tags, but these are ignored.
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
index b30a0f00cb3..91525dff90b 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -18,17 +18,20 @@
#include "chrome/browser/profiles/profile.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/invalidate_type.h"
-#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
+#include "extensions/browser/content_script_tracker.h"
#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_action_manager.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extension_user_script_loader.h"
+#include "extensions/browser/extension_web_contents_observer.h"
#include "extensions/browser/user_script_manager.h"
#include "extensions/common/api/declarative/declarative_constants.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/image_util.h"
+#include "extensions/common/mojom/host_id.mojom.h"
+#include "extensions/common/mojom/run_location.mojom-shared.h"
#include "extensions/common/script_constants.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
@@ -238,7 +241,7 @@ std::unique_ptr<ContentAction> RequestContentScript::Create(
std::string* error) {
ScriptData script_data;
if (!InitScriptData(dict, error, &script_data))
- return std::unique_ptr<ContentAction>();
+ return nullptr;
RecordContentActionCreated(
declarative_content_constants::ContentActionType::kRequestContentScript);
@@ -290,27 +293,34 @@ RequestContentScript::RequestContentScript(
content::BrowserContext* browser_context,
const Extension* extension,
const ScriptData& script_data) {
- HostID host_id(HostID::EXTENSIONS, extension->id());
+ mojom::HostID host_id(mojom::HostID::HostType::kExtensions, extension->id());
InitScript(host_id, extension, script_data);
script_loader_ = ExtensionSystem::Get(browser_context)
->user_script_manager()
->GetUserScriptLoaderForExtension(extension->id());
+ scoped_observation_.Observe(script_loader_);
AddScript();
}
RequestContentScript::~RequestContentScript() {
- DCHECK(script_loader_);
- script_loader_->RemoveScripts(
- {UserScriptIDPair(script_.id(), script_.host_id())});
+ // This can occur either if this RequestContentScript action is removed via an
+ // API call or if its extension is unloaded. If the extension is unloaded, the
+ // associated `script_loader_` may have been deleted before this object which
+ // means the loader has already removed `script_`.
+ if (script_loader_) {
+ script_loader_->RemoveScripts(
+ {UserScriptIDPair(script_.id(), script_.host_id())},
+ UserScriptLoader::ScriptsLoadedCallback());
+ }
}
-void RequestContentScript::InitScript(const HostID& host_id,
+void RequestContentScript::InitScript(const mojom::HostID& host_id,
const Extension* extension,
const ScriptData& script_data) {
script_.set_id(UserScript::GenerateUserScriptID());
script_.set_host_id(host_id);
- script_.set_run_location(UserScript::BROWSER_DRIVEN);
+ script_.set_run_location(mojom::RunLocation::kBrowserDriven);
script_.set_match_all_frames(script_data.all_frames);
script_.set_match_origin_as_fallback(
script_data.match_about_blank
@@ -336,7 +346,8 @@ void RequestContentScript::AddScript() {
DCHECK(script_loader_);
auto scripts = std::make_unique<UserScriptList>();
scripts->push_back(UserScript::CopyMetadataFrom(script_));
- script_loader_->AddScripts(std::move(scripts));
+ script_loader_->AddScripts(std::move(scripts),
+ UserScriptLoader::ScriptsLoadedCallback());
}
void RequestContentScript::Apply(const ApplyInfo& apply_info) const {
@@ -352,11 +363,31 @@ void RequestContentScript::Revert(const ApplyInfo& apply_info) const {}
void RequestContentScript::InstructRenderProcessToInject(
content::WebContents* contents,
const Extension* extension) const {
- content::RenderFrameHost* render_frame_host = contents->GetMainFrame();
- render_frame_host->Send(new ExtensionMsg_ExecuteDeclarativeScript(
- render_frame_host->GetRoutingID(),
+ ContentScriptTracker::WillExecuteCode(base::PassKey<RequestContentScript>(),
+ contents->GetMainFrame(), *extension);
+
+ mojom::LocalFrame* local_frame =
+ ExtensionWebContentsObserver::GetForWebContents(contents)->GetLocalFrame(
+ contents->GetMainFrame());
+ if (!local_frame) {
+ // TODO(https://crbug.com/1203579): Need to review when this method is
+ // called with non-live frame.
+ return;
+ }
+ local_frame->ExecuteDeclarativeScript(
sessions::SessionTabHelper::IdForTab(contents).id(), extension->id(),
- script_.id(), contents->GetLastCommittedURL()));
+ script_.id(), contents->GetLastCommittedURL());
+}
+
+void RequestContentScript::OnScriptsLoaded(
+ UserScriptLoader* loader,
+ content::BrowserContext* browser_context) {}
+
+void RequestContentScript::OnUserScriptLoaderDestroyed(
+ UserScriptLoader* loader) {
+ DCHECK_EQ(script_loader_, loader);
+ scoped_observation_.Reset();
+ script_loader_ = nullptr;
}
// static
@@ -420,7 +451,7 @@ std::unique_ptr<ContentAction> ContentAction::Create(
action_dict->GetString(declarative_content_constants::kInstanceType,
&instance_type))) {
*error = kMissingInstanceTypeError;
- return std::unique_ptr<ContentAction>();
+ return nullptr;
}
ContentActionFactory& factory = g_content_action_factory.Get();
@@ -430,7 +461,7 @@ std::unique_ptr<ContentAction> ContentAction::Create(
browser_context, extension, action_dict, error);
*error = base::StringPrintf(kInvalidInstanceTypeError, instance_type.c_str());
- return std::unique_ptr<ContentAction>();
+ return nullptr;
}
// static
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_action.h b/chromium/chrome/browser/extensions/api/declarative_content/content_action.h
index d9ee97a9616..c41375fd7b0 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_action.h
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_action.h
@@ -9,6 +9,9 @@
#include <string>
#include "base/macros.h"
+#include "base/scoped_observation.h"
+#include "extensions/browser/user_script_loader.h"
+#include "extensions/common/mojom/host_id.mojom-forward.h"
#include "extensions/common/user_script.h"
namespace base {
@@ -67,7 +70,8 @@ class ContentAction {
};
// Action that injects a content script.
-class RequestContentScript : public ContentAction {
+class RequestContentScript : public ContentAction,
+ public UserScriptLoader::Observer {
public:
struct ScriptData;
@@ -93,7 +97,7 @@ class RequestContentScript : public ContentAction {
void Revert(const ApplyInfo& apply_info) const override;
private:
- void InitScript(const HostID& host_id,
+ void InitScript(const mojom::HostID& host_id,
const Extension* extension,
const ScriptData& script_data);
@@ -102,8 +106,15 @@ class RequestContentScript : public ContentAction {
void InstructRenderProcessToInject(content::WebContents* contents,
const Extension* extension) const;
+ // UserScriptLoader::Observer:
+ void OnScriptsLoaded(UserScriptLoader* loader,
+ content::BrowserContext* browser_context) override;
+ void OnUserScriptLoaderDestroyed(UserScriptLoader* loader) override;
+
UserScript script_;
ExtensionUserScriptLoader* script_loader_ = nullptr;
+ base::ScopedObservation<UserScriptLoader, UserScriptLoader::Observer>
+ scoped_observation_{this};
DISALLOW_COPY_AND_ASSIGN(RequestContentScript);
};
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
index 22ea2b4f1fb..2ec74267b03 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
@@ -38,6 +38,7 @@ namespace {
using base::test::ParseJson;
using testing::HasSubstr;
using ContentActionType = declarative_content_constants::ContentActionType;
+using extensions::mojom::ManifestLocation;
std::unique_ptr<base::DictionaryValue> SimpleManifest() {
return DictionaryBuilder()
@@ -120,7 +121,7 @@ TEST(DeclarativeContentActionTest, ShowActionWithoutAction) {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(manifest.Build())
- .SetLocation(Manifest::COMPONENT)
+ .SetLocation(ManifestLocation::kComponent)
.Build();
env.GetExtensionService()->AddExtension(extension.get());
@@ -149,7 +150,7 @@ TEST_P(ParameterizedDeclarativeContentActionTest, ShowAction) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("extension")
.SetAction(GetParam())
- .SetLocation(Manifest::INTERNAL)
+ .SetLocation(ManifestLocation::kInternal)
.Build();
env.GetExtensionService()->AddExtension(extension.get());
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_condition.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_condition.cc
index 17b0bcc426c..d85a0981653 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_condition.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_condition.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/declarative_content/content_condition.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -40,7 +41,7 @@ std::unique_ptr<ContentCondition> CreateContentCondition(
const base::DictionaryValue* api_condition_dict = nullptr;
if (!api_condition.GetAsDictionary(&api_condition_dict)) {
*error = kExpectedDictionary;
- return std::unique_ptr<ContentCondition>();
+ return nullptr;
}
// Verify that we are dealing with a Condition whose type we understand.
@@ -48,11 +49,11 @@ std::unique_ptr<ContentCondition> CreateContentCondition(
if (!api_condition_dict->GetString(
declarative_content_constants::kInstanceType, &instance_type)) {
*error = kConditionWithoutInstanceType;
- return std::unique_ptr<ContentCondition>();
+ return nullptr;
}
if (instance_type != declarative_content_constants::kPageStateMatcherType) {
*error = kExpectedOtherConditionType;
- return std::unique_ptr<ContentCondition>();
+ return nullptr;
}
std::vector<std::unique_ptr<const ContentPredicate>> predicates;
@@ -73,11 +74,10 @@ std::unique_ptr<ContentCondition> CreateContentCondition(
predicate_name.c_str());
if (!error->empty())
- return std::unique_ptr<ContentCondition>();
+ return nullptr;
}
- return std::unique_ptr<ContentCondition>(
- new ContentCondition(std::move(predicates)));
+ return std::make_unique<ContentCondition>(std::move(predicates));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_condition_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_condition_unittest.cc
index 809b12858b6..62aa4c687c0 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_condition_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_condition_unittest.cc
@@ -40,7 +40,7 @@ class TestPredicateFactoryGeneratingError : public ContentPredicateFactory {
const base::Value& value,
std::string* error) override {
*error = error_;
- return std::unique_ptr<const ContentPredicate>();
+ return nullptr;
}
private:
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
index e5900e55d27..58f886093e9 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
@@ -238,18 +238,15 @@ void DeclarativeContentApiTest::CheckBookmarkEvents(bool match_is_bookmarked) {
// Check rule evaluation on add/remove bookmark.
bookmarks::BookmarkModel* bookmark_model =
BookmarkModelFactory::GetForBrowserContext(browser()->profile());
- const bookmarks::BookmarkNode* node =
- bookmark_model->AddURL(bookmark_model->other_node(), 0,
- base::ASCIIToUTF16("title"),
- GURL("http://test1/"));
+ const bookmarks::BookmarkNode* node = bookmark_model->AddURL(
+ bookmark_model->other_node(), 0, u"title", GURL("http://test1/"));
EXPECT_EQ(match_is_bookmarked, action->GetIsVisible(tab_id));
bookmark_model->Remove(node);
EXPECT_EQ(!match_is_bookmarked, action->GetIsVisible(tab_id));
// Check rule evaluation on navigate to bookmarked and non-bookmarked URL.
- bookmark_model->AddURL(bookmark_model->other_node(), 0,
- base::ASCIIToUTF16("title"),
+ bookmark_model->AddURL(bookmark_model->other_node(), 0, u"title",
GURL("http://test2/"));
NavigateInRenderer(tab, GURL("http://test2/"));
@@ -995,10 +992,8 @@ IN_PROC_BROWSER_TEST_F(DeclarativeContentApiTest,
}
// https://crbug.com/517492
-// Fails on XP: http://crbug.com/515717
-// Fails on other platfomrs: http://crbug.com/1013457
IN_PROC_BROWSER_TEST_F(DeclarativeContentApiTest,
- DISABLED_RemoveAllRulesAfterExtensionUninstall) {
+ RemoveAllRulesAfterExtensionUninstall) {
ext_dir_.WriteManifest(kDeclarativeContentManifest);
ext_dir_.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundHelpers);
@@ -1018,12 +1013,12 @@ IN_PROC_BROWSER_TEST_F(DeclarativeContentApiTest,
ExtensionService* extension_service = extensions::ExtensionSystem::Get(
browser()->profile())->extension_service();
- base::string16 error;
+ std::u16string error;
ASSERT_TRUE(extension_service->UninstallExtension(
extension->id(),
UNINSTALL_REASON_FOR_TESTING,
&error));
- ASSERT_EQ(base::ASCIIToUTF16(""), error);
+ ASSERT_EQ(u"", error);
// Reload the extension, then add and remove a rule.
extension = LoadExtension(ext_dir_.UnpackedPath());
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.cc
index 94d9e4280f8..b1d1b09d876 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.cc
@@ -40,8 +40,16 @@ DeclarativeContentConditionTrackerTest::GetMockRenderProcessHost(
contents->GetMainFrame()->GetProcess());
}
+TestingProfile::TestingFactories
+DeclarativeContentConditionTrackerTest::GetTestingFactories() const {
+ return {};
+}
+
TestingProfile* DeclarativeContentConditionTrackerTest::profile() {
if (!profile_) {
+ for (auto& pair : GetTestingFactories())
+ profile_builder_.AddTestingFactory(pair.first, pair.second);
+
profile_ = profile_builder_.Build();
}
return profile_.get();
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.h b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.h
index 8e2ab7c430c..305e041fe88 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.h
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_condition_tracker_test.h
@@ -48,6 +48,10 @@ class DeclarativeContentConditionTrackerTest : public testing::Test {
const void* GeneratePredicateGroupID();
+ // Returns a list of factories to use when creating the TestingProfile.
+ // Can be overridden by sub-classes if needed.
+ virtual TestingProfile::TestingFactories GetTestingFactories() const;
+
private:
content::BrowserTaskEnvironment task_environment_;
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
index 6646f76e5aa..4749d1d0f29 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
@@ -18,8 +18,10 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_process_host.h"
+#include "extensions/browser/renderer_startup_helper.h"
#include "extensions/common/api/declarative/declarative_constants.h"
#include "extensions/common/extension_messages.h"
+#include "extensions/common/mojom/renderer.mojom.h"
#include "ipc/ipc_message.h"
#include "ipc/ipc_message_macros.h"
@@ -50,14 +52,14 @@ DeclarativeContentCssPredicate::Create(ContentPredicateEvaluator* evaluator,
if (!css_rules_value->GetString(i, &css_rule)) {
*error = base::StringPrintf(kCssInvalidTypeOfParameter,
declarative_content_constants::kCss);
- return std::unique_ptr<DeclarativeContentCssPredicate>();
+ return nullptr;
}
css_rules.push_back(css_rule);
}
} else {
*error = base::StringPrintf(kCssInvalidTypeOfParameter,
declarative_content_constants::kCss);
- return std::unique_ptr<DeclarativeContentCssPredicate>();
+ return nullptr;
}
return !css_rules.empty()
@@ -291,9 +293,13 @@ void DeclarativeContentCssConditionTracker::
InstructRenderProcessIfManagingBrowserContext(
content::RenderProcessHost* process,
std::vector<std::string> watched_css_selectors) {
- if (delegate_->ShouldManageConditionsForBrowserContext(
- process->GetBrowserContext())) {
- process->Send(new ExtensionMsg_WatchPages(watched_css_selectors));
+ content::BrowserContext* browser_context = process->GetBrowserContext();
+ if (delegate_->ShouldManageConditionsForBrowserContext(browser_context)) {
+ mojom::Renderer* renderer =
+ RendererStartupHelperFactory::GetForBrowserContext(browser_context)
+ ->GetRenderer(process);
+ if (renderer)
+ renderer->WatchPages(watched_css_selectors);
}
}
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h
index bb6e9bc63ba..d9ce6fef09d 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h
@@ -131,7 +131,7 @@ class DeclarativeContentCssConditionTracker
std::vector<std::string> GetWatchedCssSelectors() const;
// If the renderer process is associated with our browser context, tells it
- // what page attributes to watch for using an ExtensionMsg_WatchPages.
+ // what page attributes to watch for using the WatchPages Mojo method.
void InstructRenderProcessIfManagingBrowserContext(
content::RenderProcessHost* process,
std::vector<std::string> watched_css_selectors);
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker_unittest.cc
index edcbc86d545..64811c31fb9 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker_unittest.cc
@@ -15,7 +15,10 @@
#include "content/public/browser/web_contents.h"
#include "content/public/test/mock_navigation_handle.h"
#include "content/public/test/mock_render_process_host.h"
+#include "extensions/browser/renderer_startup_helper.h"
#include "extensions/common/extension_messages.h"
+#include "extensions/common/mojom/renderer.mojom.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace extensions {
@@ -24,11 +27,105 @@ using testing::HasSubstr;
using testing::UnorderedElementsAre;
using testing::UnorderedElementsAreArray;
+namespace {
+
+// Class that implements the binding of a new Renderer mojom interface and
+// can receive callbacks on it for testing validation.
+class InterceptingRendererStartupHelper : public RendererStartupHelper,
+ public mojom::Renderer {
+ public:
+ explicit InterceptingRendererStartupHelper(
+ content::BrowserContext* browser_context)
+ : RendererStartupHelper(browser_context) {}
+
+ void Reset() { is_watch_pages_called_ = false; }
+ void SetWatchPagesCalledClosure(base::OnceClosure on_watch_pages_done) {
+ on_watch_pages_done_ = std::move(on_watch_pages_done);
+ }
+
+ bool IsWatchPagesCalled() { return is_watch_pages_called_; }
+ const std::vector<std::string>& CssSelector() { return css_selectors_; }
+
+ protected:
+ mojo::PendingAssociatedRemote<mojom::Renderer> BindNewRendererRemote(
+ content::RenderProcessHost* process) override {
+ mojo::AssociatedRemote<mojom::Renderer> remote;
+ receivers_.Add(this, remote.BindNewEndpointAndPassDedicatedReceiver());
+ return remote.Unbind();
+ }
+
+ private:
+ // mojom::Renderer implementation:
+ void ActivateExtension(const std::string& extension_id) override {}
+ void SetActivityLoggingEnabled(bool enabled) override {}
+ void UnloadExtension(const std::string& extension_id) override {}
+ void SuspendExtension(
+ const std::string& extension_id,
+ mojom::Renderer::SuspendExtensionCallback callback) override {
+ std::move(callback).Run();
+ }
+ void CancelSuspendExtension(const std::string& extension_id) override {}
+ void SetSessionInfo(version_info::Channel channel,
+ mojom::FeatureSessionType session,
+ bool is_lock_screen_context) override {}
+ void SetSystemFont(const std::string& font_family,
+ const std::string& font_size) override {}
+ void SetWebViewPartitionID(const std::string& partition_id) override {}
+ void SetScriptingAllowlist(
+ const std::vector<std::string>& extension_ids) override {}
+ void ShouldSuspend(ShouldSuspendCallback callback) override {
+ std::move(callback).Run();
+ }
+ void TransferBlobs(TransferBlobsCallback callback) override {
+ std::move(callback).Run();
+ }
+ void UpdateDefaultPolicyHostRestrictions(
+ const URLPatternSet& default_policy_blocked_hosts,
+ const URLPatternSet& default_policy_allowed_hosts) override {}
+ void UpdateTabSpecificPermissions(const std::string& extension_id,
+ const URLPatternSet& new_hosts,
+ int tab_id,
+ bool update_origin_allowlist) override {}
+ void UpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory,
+ mojom::HostIDPtr host_id,
+ std::vector<mojom::HostIDPtr> changed_hosts,
+ bool allowlisted_only) override {}
+ void ClearTabSpecificPermissions(
+ const std::vector<std::string>& extension_ids,
+ int tab_id,
+ bool update_origin_allowlist) override {}
+ void WatchPages(const std::vector<std::string>& css_selectors) override {
+ is_watch_pages_called_ = true;
+ css_selectors_ = css_selectors;
+ std::move(on_watch_pages_done_).Run();
+ }
+
+ bool is_watch_pages_called_ = false;
+ std::vector<std::string> css_selectors_;
+ base::OnceClosure on_watch_pages_done_;
+ mojo::AssociatedReceiverSet<mojom::Renderer> receivers_;
+};
+
+} // namespace
+
class DeclarativeContentCssConditionTrackerTest
: public DeclarativeContentConditionTrackerTest {
protected:
- DeclarativeContentCssConditionTrackerTest()
- : tracker_(&delegate_) {
+ DeclarativeContentCssConditionTrackerTest() : tracker_(&delegate_) {}
+
+ static std::unique_ptr<KeyedService> BuildFakeRendererStartupHelper(
+ content::BrowserContext* context) {
+ return std::make_unique<InterceptingRendererStartupHelper>(context);
+ }
+
+ TestingProfile::TestingFactories GetTestingFactories() const override {
+ return {{RendererStartupHelperFactory::GetInstance(),
+ base::BindRepeating(&BuildFakeRendererStartupHelper)}};
+ }
+
+ void SimulateRenderProcessCreated(content::RenderProcessHost* rph) {
+ RendererStartupHelperFactory::GetForBrowserContext(profile())
+ ->OnRenderProcessHostCreated(rph);
}
class Delegate : public ContentPredicateEvaluator::Delegate {
@@ -61,32 +158,37 @@ class DeclarativeContentCssConditionTrackerTest
return predicate;
}
- // Expects an ExtensionMsg_WatchPages message in |sink| with |selectors| as
- // the param, after invoking |func|.
+ // Expects the WatchPages Mojo method is called with |selectors| as the param,
+ // after invoking |func|.
template <class Func>
void ExpectWatchPagesMessage(content::WebContents* tab,
const std::set<std::string>& selectors,
const Func& func) {
- IPC::TestSink& sink = GetMockRenderProcessHost(tab)->sink();
- sink.ClearMessages();
+ auto* helper = static_cast<InterceptingRendererStartupHelper*>(
+ RendererStartupHelperFactory::GetForBrowserContext(profile()));
+
+ helper->Reset();
+ base::RunLoop run_loop;
+ helper->SetWatchPagesCalledClosure(run_loop.QuitClosure());
func();
- EXPECT_EQ(1u, sink.message_count());
- const IPC::Message* message =
- sink.GetUniqueMessageMatching(ExtensionMsg_WatchPages::ID);
- ASSERT_TRUE(message);
- ExtensionMsg_WatchPages::Param params;
- ExtensionMsg_WatchPages::Read(message, &params);
- EXPECT_THAT(std::get<0>(params), UnorderedElementsAreArray(selectors));
+ run_loop.Run();
+
+ EXPECT_TRUE(helper->IsWatchPagesCalled());
+ EXPECT_THAT(helper->CssSelector(), UnorderedElementsAreArray(selectors));
}
- // Expects no ExtensionMsg_WatchPages message in |sink| after invoking |func|.
+ // Expects no the WatchPages Mojo method is called after invoking |func|.
template <class Func>
void ExpectNoWatchPagesMessage(content::WebContents* tab,
const Func& func) {
- IPC::TestSink& sink = GetMockRenderProcessHost(tab)->sink();
- sink.ClearMessages();
+ auto* helper = static_cast<InterceptingRendererStartupHelper*>(
+ RendererStartupHelperFactory::GetForBrowserContext(profile()));
+ helper->Reset();
+ base::RunLoop run_loop;
func();
- EXPECT_EQ(0u, sink.message_count());
+ run_loop.RunUntilIdle();
+
+ EXPECT_FALSE(helper->IsWatchPagesCalled());
}
// Sends an OnWatchedPageChange message to the tab.
@@ -140,6 +242,7 @@ TEST(DeclarativeContentCssPredicateTest, CssPredicate) {
// sent.
TEST_F(DeclarativeContentCssConditionTrackerTest, AddAndRemovePredicates) {
const std::unique_ptr<content::WebContents> tab = MakeTab();
+ SimulateRenderProcessCreated(GetMockRenderProcessHost(tab.get()));
tracker_.TrackForWebContents(tab.get());
EXPECT_EQ(0, delegate_.evaluation_requests());
@@ -191,6 +294,7 @@ TEST_F(DeclarativeContentCssConditionTrackerTest, AddAndRemovePredicates) {
TEST_F(DeclarativeContentCssConditionTrackerTest,
AddAndRemovePredicatesWithSameSelectors) {
const std::unique_ptr<content::WebContents> tab = MakeTab();
+ SimulateRenderProcessCreated(GetMockRenderProcessHost(tab.get()));
tracker_.TrackForWebContents(tab.get());
EXPECT_EQ(0, delegate_.evaluation_requests());
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
index 3533069510b..e38fe3edd69 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
@@ -25,7 +25,7 @@ const char kIsBookmarkedRequiresBookmarkPermission[] =
bool HasBookmarkAPIPermission(const Extension* extension) {
return extension->permissions_data()->HasAPIPermission(
- APIPermission::kBookmark);
+ mojom::APIPermissionID::kBookmark);
}
} // namespace
@@ -48,20 +48,19 @@ DeclarativeContentIsBookmarkedPredicate::Create(
const Extension* extension,
const base::Value& value,
std::string* error) {
- bool is_bookmarked = false;
- if (value.GetAsBoolean(&is_bookmarked)) {
- if (!HasBookmarkAPIPermission(extension)) {
- *error = kIsBookmarkedRequiresBookmarkPermission;
- return std::unique_ptr<DeclarativeContentIsBookmarkedPredicate>();
- } else {
- return base::WrapUnique(new DeclarativeContentIsBookmarkedPredicate(
- evaluator, extension, is_bookmarked));
- }
- } else {
+ if (!value.is_bool()) {
*error = base::StringPrintf(kIsBookmarkedInvalidTypeOfParameter,
declarative_content_constants::kIsBookmarked);
- return std::unique_ptr<DeclarativeContentIsBookmarkedPredicate>();
+ return nullptr;
+ }
+
+ if (!HasBookmarkAPIPermission(extension)) {
+ *error = kIsBookmarkedRequiresBookmarkPermission;
+ return nullptr;
}
+
+ return base::WrapUnique(new DeclarativeContentIsBookmarkedPredicate(
+ evaluator, extension, value.GetBool() /* is_bookmarked */));
}
ContentPredicateEvaluator*
@@ -151,7 +150,7 @@ DeclarativeContentIsBookmarkedConditionTracker::
BookmarkModelFactory::GetForBrowserContext(context);
// Can be null during unit test execution.
if (bookmark_model)
- scoped_bookmarks_observer_.Add(bookmark_model);
+ scoped_bookmarks_observation_.Observe(bookmark_model);
}
DeclarativeContentIsBookmarkedConditionTracker::
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.h b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.h
index 7d99bfb22e4..c96430f1f88 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.h
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.h
@@ -11,7 +11,7 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/declarative_content/content_predicate_evaluator.h"
#include "components/bookmarks/browser/base_bookmark_model_observer.h"
#include "components/bookmarks/browser/bookmark_model.h"
@@ -157,8 +157,9 @@ class DeclarativeContentIsBookmarkedConditionTracker
// are complete.
int extensive_bookmark_changes_in_progress_;
- ScopedObserver<bookmarks::BookmarkModel, bookmarks::BookmarkModelObserver>
- scoped_bookmarks_observer_{this};
+ base::ScopedObservation<bookmarks::BookmarkModel,
+ bookmarks::BookmarkModelObserver>
+ scoped_bookmarks_observation_{this};
DISALLOW_COPY_AND_ASSIGN(DeclarativeContentIsBookmarkedConditionTracker);
};
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker_unittest.cc
index 65a9dc24731..8c62bcff1c8 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker_unittest.cc
@@ -101,9 +101,8 @@ class DeclarativeContentIsBookmarkedConditionTrackerTest
bookmarks::test::WaitForBookmarkModelToLoad(
BookmarkModelFactory::GetForBrowserContext(profile()));
bookmark_model_ = BookmarkModelFactory::GetForBrowserContext(profile());
- tracker_.reset(new DeclarativeContentIsBookmarkedConditionTracker(
- profile(),
- &delegate_));
+ tracker_ = std::make_unique<DeclarativeContentIsBookmarkedConditionTracker>(
+ profile(), &delegate_);
extension_ = CreateExtensionWithBookmarksPermission(true);
is_bookmarked_predicate_ = CreatePredicate(tracker_.get(), extension_.get(),
true);
@@ -211,8 +210,7 @@ TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest,
LoadURL(tab.get(), GURL("http://bookmarked/"));
EXPECT_TRUE(delegate_.evaluation_requests().empty());
- bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
+ bookmark_model_->AddURL(bookmark_model_->other_node(), 0, u"title",
GURL("http://bookmarked/"));
tracker_->TrackForWebContents(tab.get());
@@ -246,10 +244,8 @@ TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest,
// Bookmark the first tab's URL.
delegate_.evaluation_requests().clear();
- const bookmarks::BookmarkNode* node =
- bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
- GURL("http://bookmarked/"));
+ const bookmarks::BookmarkNode* node = bookmark_model_->AddURL(
+ bookmark_model_->other_node(), 0, u"title", GURL("http://bookmarked/"));
EXPECT_THAT(delegate_.evaluation_requests(),
UnorderedElementsAre(tabs[0].get()));
EXPECT_TRUE(CheckPredicates(tabs[0].get(), true));
@@ -292,10 +288,8 @@ TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest, ExtensiveChanges) {
// added nodes.
delegate_.evaluation_requests().clear();
bookmark_model_->BeginExtensiveChanges();
- const bookmarks::BookmarkNode* node =
- bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
- GURL("http://bookmarked/"));
+ const bookmarks::BookmarkNode* node = bookmark_model_->AddURL(
+ bookmark_model_->other_node(), 0, u"title", GURL("http://bookmarked/"));
EXPECT_TRUE(delegate_.evaluation_requests().empty());
EXPECT_TRUE(CheckPredicates(tabs[0].get(), false));
EXPECT_TRUE(CheckPredicates(tabs[1].get(), false));
@@ -327,8 +321,7 @@ TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest, ExtensiveChanges) {
const bookmarks::BookmarkNode* node = nullptr;
{
bookmarks::ScopedGroupBookmarkActions scoped_group(bookmark_model_);
- node = bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
+ node = bookmark_model_->AddURL(bookmark_model_->other_node(), 0, u"title",
GURL("http://bookmarked/"));
EXPECT_TRUE(delegate_.evaluation_requests().empty());
EXPECT_TRUE(CheckPredicates(tabs[0].get(), false));
@@ -361,11 +354,9 @@ TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest, ExtensiveChanges) {
TEST_F(DeclarativeContentIsBookmarkedConditionTrackerTest, Navigation) {
// Bookmark two URLs.
delegate_.evaluation_requests().clear();
- bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
+ bookmark_model_->AddURL(bookmark_model_->other_node(), 0, u"title",
GURL("http://bookmarked1/"));
- bookmark_model_->AddURL(bookmark_model_->other_node(), 0,
- base::ASCIIToUTF16("title"),
+ bookmark_model_->AddURL(bookmark_model_->other_node(), 0, u"title",
GURL("http://bookmarked2/"));
// Create two tabs.
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
index bae8e65dee5..1a263ddf334 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
@@ -43,16 +43,16 @@ DeclarativeContentPageUrlPredicate::Create(
if (!value.GetAsDictionary(&dict)) {
*error = base::StringPrintf(kPageUrlInvalidTypeOfParameter,
declarative_content_constants::kPageUrl);
- return std::unique_ptr<DeclarativeContentPageUrlPredicate>();
- } else {
- url_matcher_condition_set =
- url_matcher::URLMatcherFactory::CreateFromURLFilterDictionary(
- url_matcher_condition_factory, dict, ++g_next_id, error);
- if (!url_matcher_condition_set)
- return std::unique_ptr<DeclarativeContentPageUrlPredicate>();
- return base::WrapUnique(new DeclarativeContentPageUrlPredicate(
- evaluator, url_matcher_condition_set));
+ return nullptr;
}
+
+ url_matcher_condition_set =
+ url_matcher::URLMatcherFactory::CreateFromURLFilterDictionary(
+ url_matcher_condition_factory, dict, ++g_next_id, error);
+ if (!url_matcher_condition_set)
+ return nullptr;
+ return base::WrapUnique(new DeclarativeContentPageUrlPredicate(
+ evaluator, url_matcher_condition_set));
}
ContentPredicateEvaluator*
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 614000d4862..92e15f55584 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -31,7 +31,10 @@
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
+#include "base/test/test_timeouts.h"
+#include "base/thread_annotations.h"
#include "base/threading/thread_restrictions.h"
+#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "base/values.h"
#include "build/build_config.h"
@@ -110,6 +113,7 @@
#include "ipc/ipc_message.h"
#include "net/base/net_errors.h"
#include "net/dns/mock_host_resolver.h"
+#include "net/http/http_request_headers.h"
#include "net/http/http_status_code.h"
#include "net/test/embedded_test_server/default_handlers.h"
#include "net/test/embedded_test_server/http_request.h"
@@ -121,6 +125,7 @@
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/simple_url_loader.h"
#include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/common/features.h"
namespace extensions {
namespace declarative_net_request {
@@ -174,18 +179,26 @@ class DeclarativeNetRequestBrowserTest
public ::testing::WithParamInterface<ExtensionLoadType> {
public:
DeclarativeNetRequestBrowserTest() {
+ feature_list_.InitWithFeatures({blink::features::kFledgeInterestGroups,
+ blink::features::kFledgeInterestGroupAPI},
+ {});
net::test_server::RegisterDefaultHandlers(embedded_test_server());
}
- // ExtensionBrowserTest overrides:
- void SetUpOnMainThread() override {
- ExtensionBrowserTest::SetUpOnMainThread();
-
+ // Returns the path of the files served by the EmbeddedTestServer.
+ static base::FilePath GetHttpServerPath() {
base::FilePath test_root_path;
base::PathService::Get(chrome::DIR_TEST_DATA, &test_root_path);
test_root_path = test_root_path.AppendASCII("extensions")
.AppendASCII("declarative_net_request");
- embedded_test_server()->ServeFilesFromDirectory(test_root_path);
+ return test_root_path;
+ }
+
+ // ExtensionBrowserTest overrides:
+ void SetUpOnMainThread() override {
+ ExtensionBrowserTest::SetUpOnMainThread();
+
+ embedded_test_server()->ServeFilesFromDirectory(GetHttpServerPath());
embedded_test_server()->RegisterRequestMonitor(
base::BindRepeating(&DeclarativeNetRequestBrowserTest::MonitorRequest,
@@ -209,6 +222,19 @@ class DeclarativeNetRequestBrowserTest
ExtensionBrowserTest::TearDownOnMainThread();
}
+ // Handler to monitor the requests which reach the EmbeddedTestServer. This
+ // will be run on EmbeddedTestServers' IO threads. Public so it can be bound
+ // in test bodies.
+ void MonitorRequest(const net::test_server::HttpRequest& request) {
+ base::AutoLock lock(requests_to_server_lock_);
+ requests_to_server_[request.GetURL()] = request;
+ if (url_to_wait_for_ == request.GetURL()) {
+ ASSERT_TRUE(wait_for_request_run_loop_);
+ url_to_wait_for_ = GURL();
+ wait_for_request_run_loop_->Quit();
+ }
+ }
+
protected:
// Returns the number of extensions with active rulesets.
size_t extensions_with_rulesets_count() {
@@ -521,13 +547,33 @@ class DeclarativeNetRequestBrowserTest
browsertest_util::ScriptUserActivation::kDontActivate);
}
- std::set<GURL> GetAndResetRequestsToServer() {
+ std::map<GURL, net::test_server::HttpRequest> GetAndResetRequestsToServer() {
base::AutoLock lock(requests_to_server_lock_);
- std::set<GURL> results = requests_to_server_;
+ auto results = std::move(requests_to_server_);
requests_to_server_.clear();
return results;
}
+ // Waits until MonitorRequest() has observed `url_to_wait_for` at least once
+ // since the last time GetAndResetRequestsToServer() was invoked. Returns
+ // instantly if `url_to_wait_for` has already been observed.
+ void WaitForRequest(const GURL& url_to_wait_for) {
+ {
+ base::AutoLock lock(requests_to_server_lock_);
+
+ DCHECK(url_to_wait_for_.is_empty());
+ DCHECK(!wait_for_request_run_loop_);
+
+ if (requests_to_server_.count(url_to_wait_for))
+ return;
+ url_to_wait_for_ = url_to_wait_for;
+ wait_for_request_run_loop_ = std::make_unique<base::RunLoop>();
+ }
+
+ wait_for_request_run_loop_->Run();
+ wait_for_request_run_loop_.reset();
+ }
+
TestRule CreateModifyHeadersRule(
int id,
int priority,
@@ -597,13 +643,6 @@ class DeclarativeNetRequestBrowserTest
ASSERT_EQ("success", ExecuteScriptInBackgroundPage(extension_id, script));
}
- // Handler to monitor the requests which reach the EmbeddedTestServer. This
- // will be run on the EmbeddedTestServer's IO thread.
- void MonitorRequest(const net::test_server::HttpRequest& request) {
- base::AutoLock lock(requests_to_server_lock_);
- requests_to_server_.insert(request.GetURL());
- }
-
// Helper to load an extension. |has_dynamic_ruleset| should be true if the
// extension has a dynamic ruleset on load. If |is_extension_update|, the last
// loaded extension is updated.
@@ -748,14 +787,20 @@ class DeclarativeNetRequestBrowserTest
return ExecuteScriptInBackgroundPage(extension_id, script);
}
+ base::test::ScopedFeatureList feature_list_;
base::ScopedTempDir temp_dir_;
unsigned flags_ = ConfigFlag::kConfig_None;
// Requests observed by the EmbeddedTestServer. This is accessed on both the
// UI and the EmbeddedTestServer's IO thread. Access is protected by
- // |requests_to_server_lock_|.
- std::set<GURL> requests_to_server_;
+ // `requests_to_server_lock_`.
+ std::map<GURL, net::test_server::HttpRequest> requests_to_server_
+ GUARDED_BY(requests_to_server_lock_);
+ // URL that `wait_for_request_run_loop_` is currently waiting to observe.
+ GURL url_to_wait_for_ GUARDED_BY(requests_to_server_lock_);
+ // RunLoop to quit when a request for `url_to_wait_for_` is observed.
+ std::unique_ptr<base::RunLoop> wait_for_request_run_loop_;
base::Lock requests_to_server_lock_;
@@ -1887,6 +1932,27 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, ZeroRulesets) {
EXPECT_TRUE(IsNavigationBlocked(url));
}
+// Ensure that when an extension blocks a main-frame request using
+// declarativeNetRequest, the resultant error page attributes this to an
+// extension.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
+ ErrorPageForBlockedMainFrameNavigation) {
+ ASSERT_NO_FATAL_FAILURE(
+ LoadExtensionWithRules({CreateMainFrameBlockRule("example.com")}));
+
+ ui_test_utils::NavigateToURL(browser(), GetURLForFilter("example.com"));
+ EXPECT_EQ(content::PAGE_TYPE_ERROR, GetPageType());
+
+ std::string body;
+ ASSERT_TRUE(content::ExecuteScriptAndExtractString(
+ web_contents(),
+ "window.domAutomationController.send(document.body.textContent)", &body));
+
+ EXPECT_TRUE(
+ base::Contains(body, "This page has been blocked by an extension"));
+ EXPECT_TRUE(base::Contains(body, "Try disabling your extensions."));
+}
+
// Test an extension with multiple static rulesets.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, MultipleRulesets) {
set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
@@ -2541,7 +2607,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
const GURL redirected_script_url =
embedded_test_server()->GetURL("/subresources/script.js");
- std::set<GURL> seen_requests = GetAndResetRequestsToServer();
+ std::map<GURL, net::test_server::HttpRequest> seen_requests =
+ GetAndResetRequestsToServer();
EXPECT_EQ(!expect_script_redirected,
base::Contains(seen_requests, requested_script_url));
EXPECT_EQ(expect_script_redirected,
@@ -4443,13 +4510,15 @@ class DeclarativeNetRequestAllowAllRequestsBrowserTest
std::string url_filter;
bool is_regex_rule;
base::Optional<std::vector<std::string>> resource_types;
+ base::Optional<std::vector<std::string>> request_methods;
};
DeclarativeNetRequestAllowAllRequestsBrowserTest() = default;
void RunTest(const std::vector<RuleData>& rule_data,
const std::vector<std::string>& paths_seen,
- const std::vector<std::string>& paths_not_seen) {
+ const std::vector<std::string>& paths_not_seen,
+ bool post_navigation = false) {
std::vector<TestRule> test_rules;
for (const auto& rule : rule_data) {
TestRule test_rule = CreateGenericRule();
@@ -4462,16 +4531,19 @@ class DeclarativeNetRequestAllowAllRequestsBrowserTest
else
test_rule.condition->url_filter = rule.url_filter;
test_rule.condition->resource_types = rule.resource_types;
+ test_rule.condition->request_methods = rule.request_methods;
test_rules.push_back(test_rule);
}
ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(test_rules));
GURL page_url = embedded_test_server()->GetURL(
- "example.com", "/page_with_two_frames.html");
+ "example.com", post_navigation ? "/post_to_page_with_two_frames.html"
+ : "/page_with_two_frames.html");
ui_test_utils::NavigateToURL(browser(), page_url);
- const std::set<GURL> requests_seen = GetAndResetRequestsToServer();
+ std::map<GURL, net::test_server::HttpRequest> requests_seen =
+ GetAndResetRequestsToServer();
for (const auto& path : paths_seen) {
GURL expected_request_url = embedded_test_server()->GetURL(path);
@@ -4585,6 +4657,51 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestAllowAllRequestsBrowserTest,
{});
}
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestAllowAllRequestsBrowserTest,
+ TestPostNavigationMatched) {
+ std::vector<RuleData> rule_data = {
+ {1, 6, "allowAllRequests", "page_with_two_frames\\.html", true,
+ std::vector<std::string>({"main_frame"}),
+ std::vector<std::string>({"post"})},
+ {2, 5, "block", "*", false},
+ };
+
+ // Requests:
+ // -/page_with_two_frames.html (Matching rule=1)
+ // -/subresources/script.js (Matching rule=[1,2] Winner=1)
+ // -/child_frame.html?frame=1 (Matching Rule=[1,2] Winner=1)
+ // -/subresources/script.js?frameId=1 (Matching Rule=[1,2] Winner=1)
+ // -/child_frame.html?frame=2 (Matching Rule=[1,2] Winner=1)
+ // -/subresources/script.js?frameId=2 (Matching Rule=[1,2] Winner=1)
+ // Hence all requests go through.
+ RunTest(rule_data,
+ {requests[0], requests[1], requests[2], requests[3], requests[4],
+ requests[5]},
+ {}, true);
+}
+
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestAllowAllRequestsBrowserTest,
+ TestPostNavigationNotMatched) {
+ std::vector<RuleData> rule_data = {
+ {1, 6, "allowAllRequests", "page_with_two_frames\\.html", true,
+ std::vector<std::string>({"main_frame"}),
+ std::vector<std::string>({"get"})},
+ {2, 5, "block", "*", false},
+ };
+
+ // Requests:
+ // -/page_with_two_frames.html (No matches)
+ // -/subresources/script.js (Matching rule 2)
+ // -/child_frame.html?frame=1 (Matching rule 2)
+ // -/subresources/script.js?frameId=1 (Matching rule 2)
+ // -/child_frame.html?frame=2 (Matching rule 2)
+ // -/subresources/script.js?frameId=2 (Matching rule 2)
+ // Hence requests are blocked.
+ RunTest(rule_data, {requests[0]},
+ {requests[1], requests[2], requests[3], requests[4], requests[5]},
+ true);
+}
+
// Tests that when an extension is updated but loses the declarativeNetRequest
// permission, its dynamic ruleset is not enabled.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
@@ -4945,7 +5062,7 @@ class DeclarativeNetRequestSubresourceWebBundlesBrowserTest
}
protected:
- bool TryLoadScript(const char* script_src) {
+ bool TryLoadScript(const std::string& script_src) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
bool success = false;
@@ -4962,7 +5079,7 @@ class DeclarativeNetRequestSubresourceWebBundlesBrowserTest
document.body.appendChild(script);
})();
)",
- script_src);
+ script_src.c_str());
EXPECT_TRUE(ExecuteScriptAndExtractBool(web_contents->GetMainFrame(),
script, &success));
return success;
@@ -5081,7 +5198,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
ui_test_utils::NavigateToURL(browser(), page_url);
EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
- base::string16 expected_title = base::ASCIIToUTF16("script loaded");
+ std::u16string expected_title = u"script loaded";
content::TitleWatcher title_watcher(web_contents, expected_title);
EXPECT_TRUE(TryLoadScript("pass.js"));
// Check that the script in the web bundle is correctly loaded even when the
@@ -5091,6 +5208,79 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
EXPECT_FALSE(TryLoadScript("cancel.js"));
}
+// Ensure DeclarativeNetRequest API can block the requests for the subresources
+// inside the web bundle which URL is urn uuid.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
+ RequestCanceledUrnUUIDUrl) {
+ TestRule rule = CreateGenericRule();
+ std::string pass_js_url = "urn:uuid:fc80c15b-69e9-4a45-ab41-9c90d2b55976";
+ std::string cancel_js_url = "urn:uuid:15d749ad-7d9f-49d9-94f7-83a866e7fef8";
+ std::vector<TestRule> rules;
+ rule.id = kMinValidID;
+ rule.condition->url_filter = cancel_js_url + "|";
+ rule.condition->resource_types = std::vector<std::string>({"script"});
+ rule.priority = 1;
+ rules.push_back(rule);
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(rules));
+
+ const std::string page_html =
+ base::StringPrintf(R"(
+ <title>Loaded</title>
+ <body>
+ <script>
+ (() => {
+ const wbn_url =
+ new URL('./web_bundle.wbn', location.href).toString();
+ const pass_js_url = '%s';
+ const cancel_js_url = '%s';
+ const link = document.createElement('link');
+ link.rel = 'webbundle';
+ link.href = wbn_url;
+ link.resources = pass_js_url + ' ' + cancel_js_url;
+ document.body.appendChild(link);
+ })();
+ </script>
+ </body>
+ )",
+ pass_js_url.c_str(), cancel_js_url.c_str());
+
+ std::string web_bundle;
+ RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+ RegisterRequestHandler("/test.html", "text/html", page_html);
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Create a web bundle.
+ // Currently the web bundle format requires a valid GURL for the fallback URL
+ // of a web bundle. So we use |pass_js_url_str| for the fallback URL.
+ // TODO(crbug.com/966753): Stop using |pass_js_url_str| when
+ // https://github.com/WICG/webpackage/issues/590 is resolved.
+ web_package::test::WebBundleBuilder builder(pass_js_url, "");
+ auto pass_js_location = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}},
+ "document.title = 'script loaded';");
+ auto cancel_js_location = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}}, "");
+ builder.AddIndexEntry(pass_js_url, "", {pass_js_location});
+ builder.AddIndexEntry(cancel_js_url, "", {cancel_js_location});
+ std::vector<uint8_t> bundle = builder.CreateBundle();
+ web_bundle = std::string(bundle.begin(), bundle.end());
+
+ GURL page_url = embedded_test_server()->GetURL("/test.html");
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ ui_test_utils::NavigateToURL(browser(), page_url);
+ EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+
+ std::u16string expected_title = u"script loaded";
+ content::TitleWatcher title_watcher(web_contents, expected_title);
+ EXPECT_TRUE(TryLoadScript(pass_js_url));
+ // Check that the pass_js_url script in the web bundle is correctly loaded
+ // even when the extension with blocking handler intercepted the request.
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+
+ EXPECT_FALSE(TryLoadScript(cancel_js_url));
+}
+
// Ensure DeclarativeNetRequest API can redirect the requests for the
// subresources inside the web bundle.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
@@ -5203,7 +5393,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
ui_test_utils::NavigateToURL(browser(), page_url);
EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
{
- base::string16 expected_title = base::ASCIIToUTF16("redirected");
+ std::u16string expected_title = u"redirected";
content::TitleWatcher title_watcher(web_contents, expected_title);
EXPECT_TRUE(TryLoadScript("redirect.js"));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -5212,8 +5402,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
// In the current implementation, extensions can redirect the request to
// the other resource in the web bundle even if the resource is not listed
// in the resources attribute.
- base::string16 expected_title =
- base::ASCIIToUTF16("redirected_to_unlisted");
+ std::u16string expected_title = u"redirected_to_unlisted";
content::TitleWatcher title_watcher(web_contents, expected_title);
EXPECT_TRUE(TryLoadScript("redirect_to_unlisted.js"));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -5541,6 +5730,225 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestGlobalRulesBrowserTest_Packed,
EXPECT_EQ("3", GetAvailableStaticRuleCount(last_loaded_extension_id()));
}
+// Tests the "requestMethods" and "excludedRequestMethods" property of a
+// declarative rule condition.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
+ BlockRequests_Methods) {
+ struct {
+ int id;
+ std::string url_filter;
+ std::vector<std::string> request_methods;
+ std::vector<std::string> excluded_request_methods;
+ } rules_data[] = {{1, "default", {}, {}},
+ {2, "included", {"head", "put"}, {}},
+ {3, "excluded", {}, {"options", "patch"}},
+ {4, "combination", {"get"}, {"put"}}};
+
+ std::vector<TestRule> rules;
+ for (const auto& rule_data : rules_data) {
+ TestRule rule = CreateGenericRule(rule_data.id);
+ rule.condition->url_filter = rule_data.url_filter;
+
+ // An empty list is not allowed for the "requestMethods" property.
+ if (!rule_data.request_methods.empty())
+ rule.condition->request_methods = rule_data.request_methods;
+
+ rule.condition->excluded_request_methods =
+ rule_data.excluded_request_methods;
+ rules.push_back(rule);
+ }
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(rules));
+
+ struct {
+ std::string path;
+ std::string expected_blocked_request_methods;
+ } test_cases[] = {{"default", "delete,get,head,options,patch,post,put"},
+ {"included", "head,put"},
+ {"excluded", "delete,get,head,post,put"},
+ {"combination", "get"}};
+
+ const char kPerformRequestWithAllMethodsScript[] = R"(
+ {
+ const allRequestMethods = ["delete", "get", "head", "options", "patch",
+ "post", "put"];
+ const url = "/empty.html?%s";
+
+ let blockedMethods = [];
+
+ Promise.allSettled(
+ allRequestMethods.map(method =>
+ fetch(url, {method}).catch(() => { blockedMethods.push(method); })
+ )
+ ).then(() =>
+ {
+ window.domAutomationController.send(blockedMethods.sort().join());
+ });
+ }
+ )";
+
+ GURL url = embedded_test_server()->GetURL("abc.com", "/empty.html");
+ ui_test_utils::NavigateToURL(browser(), url);
+ content::RenderFrameHost* main_frame = GetMainFrame();
+
+ for (const auto& test_case : test_cases) {
+ SCOPED_TRACE(base::StringPrintf("Path: %s", test_case.path.c_str()));
+ std::string actual_blocked_request_methods;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ main_frame,
+ base::StringPrintf(kPerformRequestWithAllMethodsScript,
+ test_case.path.c_str()),
+ &actual_blocked_request_methods));
+ EXPECT_EQ(test_case.expected_blocked_request_methods,
+ actual_blocked_request_methods);
+ }
+}
+
+// Tests that FLEDGE requests can be blocked by the declarativeNetRequest API,
+// and that if they try to redirect requests, the request is blocked, instead of
+// being redirected.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, FledgeAuctionScripts) {
+ const char kAddedHeaderName[] = "Header-Name";
+ const char kAddedHeaderValue[] = "Header-Value";
+
+ net::EmbeddedTestServer https_server(
+ net::test_server::EmbeddedTestServer::TYPE_HTTPS);
+ https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
+ https_server.AddDefaultHandlers();
+ https_server.ServeFilesFromDirectory(GetHttpServerPath());
+ https_server.RegisterRequestMonitor(
+ base::BindRepeating(&DeclarativeNetRequestBrowserTest::MonitorRequest,
+ base::Unretained(this)));
+ ASSERT_TRUE(https_server.Start());
+
+ ASSERT_TRUE(
+ ui_test_utils::NavigateToURL(browser(), https_server.GetURL("/echo")));
+
+ GURL bidding_logic_url =
+ https_server.GetURL("/interest_group/bidding_logic.js");
+ GURL decision_logic_url =
+ https_server.GetURL("/interest_group/decision_logic.js");
+ GURL bidder_report_url = https_server.GetURL("/echo?bidder_report");
+ GURL decision_report_url = https_server.GetURL("/echo?decision_report");
+
+ // Add an interest group.
+ EXPECT_EQ("done", content::EvalJs(
+ web_contents(),
+ content::JsReplace(
+ R"(
+ (function() {
+ navigator.joinAdInterestGroup({
+ name: 'cars',
+ owner: $1,
+ biddingLogicUrl: $2,
+ userBiddingSignals: [],
+ ads: [{
+ renderUrl: 'https://example.com/render',
+ metadata: {ad: 'metadata', here: [1, 2, 3]}
+ }]
+ }, /*joinDurationSec=*/ 300);
+ return 'done';
+ })();
+ )",
+ url::Origin::Create(bidding_logic_url).Serialize(),
+ bidding_logic_url.spec())));
+
+ // Create an extension to add a header to all requests.
+ TestRule custom_response_header_rule = CreateModifyHeadersRule(
+ 1 /* id */, 1 /* priority */, "*",
+ // request_headers
+ std::vector<TestHeaderInfo>(
+ {TestHeaderInfo(kAddedHeaderName, "set", kAddedHeaderValue)}),
+ base::nullopt);
+ // CreateModifyHeadersRule() applies to subframes only by default, so clear
+ // that.
+ custom_response_header_rule.condition->resource_types = base::nullopt;
+
+ ASSERT_NO_FATAL_FAILURE(
+ LoadExtensionWithRules({custom_response_header_rule}, "test_extension",
+ {URLPattern::kAllUrlsPattern}));
+
+ std::string run_auction_command = content::JsReplace(
+ R"(
+ (async function() {
+ return await navigator.runAdAuction({
+ seller: $1,
+ decisionLogicUrl: $2,
+ interestGroupBuyers: [$1],
+ });
+ })()
+ )",
+ url::Origin::Create(decision_logic_url).Serialize(),
+ decision_logic_url.spec());
+
+ // Unfortunately, there's a race between adding an interest group and running
+ // an auction, with no API in Javascript currently available to wait until an
+ // interest group has been added, so can only run the auction until there's a
+ // result, which means the interest group has been added.
+ while ("https://example.com/render" !=
+ content::EvalJs(web_contents(), run_auction_command)) {
+ }
+
+ // Wait to see both the report request of both worklets.
+ WaitForRequest(bidder_report_url);
+ WaitForRequest(decision_report_url);
+ // Clear observed URLs.
+ std::map<GURL, net::test_server::HttpRequest> requests =
+ GetAndResetRequestsToServer();
+
+ // Make sure the add headers rule was applied to all requests related to the
+ // auction.
+ for (const GURL& expected_url : {bidding_logic_url, decision_logic_url,
+ bidder_report_url, decision_report_url}) {
+ auto request = requests.find(expected_url);
+ ASSERT_NE(request, requests.end());
+ auto added_header = request->second.headers.find(kAddedHeaderName);
+ ASSERT_NE(added_header, request->second.headers.end());
+ EXPECT_EQ(kAddedHeaderValue, added_header->second);
+ }
+
+ // Now there are no pending requests for the auction. Add a rule to block the
+ // bidder's report URL.
+ TestRule block_report_rule = CreateGenericRule();
+ block_report_rule.condition->url_filter = bidder_report_url.spec() + "^";
+ block_report_rule.id = 2;
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
+ {block_report_rule}, "test_extension2", {URLPattern::kAllUrlsPattern}));
+
+ // Running the auction again should result in the same URL winning.
+ EXPECT_EQ("https://example.com/render",
+ content::EvalJs(web_contents(), run_auction_command));
+ // Wait for the decision script's report URL to be requested.
+ WaitForRequest(decision_report_url);
+ // The bidder script should be blocked. Unfortunately, there's no way to wait
+ // for the bidder script to not be requested. Instead, just wait for an
+ // addition "tiny timeout" delay, and make sure it was not requested.
+ base::RunLoop run_loop;
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
+ run_loop.Run();
+ EXPECT_EQ(0u, GetAndResetRequestsToServer().count(bidder_report_url));
+
+ // Load a second extension which redirects requests for the bidding script to
+ // a URL that serves an identical bidding script.
+ TestRule redirect_bidding_logic_rule = CreateGenericRule();
+ redirect_bidding_logic_rule.condition->url_filter =
+ bidding_logic_url.spec() + "^";
+ redirect_bidding_logic_rule.id = 3;
+ redirect_bidding_logic_rule.action->type = "redirect";
+ redirect_bidding_logic_rule.action->redirect.emplace();
+ redirect_bidding_logic_rule.action->redirect->url =
+ https_server.GetURL("/interest_group/bidding_logic2.js").spec();
+
+ ASSERT_NO_FATAL_FAILURE(
+ LoadExtensionWithRules({redirect_bidding_logic_rule}, "test_extension3",
+ {URLPattern::kAllUrlsPattern}));
+
+ // Redirecting a bidder script, even to another bidder script, should cause
+ // the request to fail, which causes the entire auction to fail, since there's
+ // only one bidder script.
+ EXPECT_EQ(nullptr, content::EvalJs(web_contents(), run_auction_command));
+}
+
INSTANTIATE_TEST_SUITE_P(All,
DeclarativeNetRequestBrowserTest,
::testing::Values(ExtensionLoadType::PACKED,
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
index 7a81f4a918f..f895d8c8f6d 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
@@ -189,9 +189,9 @@ class DeclarativeNetRequestUnittest : public DNRTestBase {
// Verify the error. Only verify if the |expected_error| is a substring of
// the actual error, since some string may be prepended/appended while
// creating the actual error.
- const std::vector<base::string16>* errors = error_reporter()->GetErrors();
+ const std::vector<std::u16string>* errors = error_reporter()->GetErrors();
ASSERT_EQ(1u, errors->size());
- EXPECT_NE(base::string16::npos,
+ EXPECT_NE(std::u16string::npos,
errors->at(0).find(base::UTF8ToUTF16(error_with_filename)))
<< "expected: " << error_with_filename << " actual: " << errors->at(0);
@@ -325,7 +325,7 @@ class DeclarativeNetRequestUnittest : public DNRTestBase {
ASSERT_TRUE(result->is_list());
const base::ListValue& ids_value = base::Value::AsListValue(*result);
- base::string16 error;
+ std::u16string error;
std::vector<std::string> actual_ids;
for (const auto& val : ids_value)
actual_ids.push_back(val.GetString());
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
index 7a7002324b3..a48eec2c00c 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
@@ -30,6 +30,7 @@
#include "extensions/common/file_util.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/url_pattern.h"
+#include "net/http/http_request_headers.h"
#include "net/http/http_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -118,6 +119,7 @@ class RulesetManagerTest : public DNRTestBase {
const int kRendererId = 1;
WebRequestInfoInitParams info;
info.url = GURL(url);
+ info.method = net::HttpRequestHeaders::kGetMethod;
info.render_process_id = kRendererId;
info.initiator = std::move(initiator);
return info;
@@ -131,6 +133,7 @@ class RulesetManagerTest : public DNRTestBase {
const int kRendererId = 1;
WebRequestInfoInitParams info;
info.url = GURL(url);
+ info.method = net::HttpRequestHeaders::kGetMethod;
info.render_process_id = kRendererId;
net::HttpRequestHeaders extra_request_headers;
diff --git a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
index 9cf163ca4d9..628ff93770f 100644
--- a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
@@ -105,18 +105,13 @@ void WebRequestActionWithThreadsTest::SetUp() {
std::string error;
extension_ = LoadManifestUnchecked("permissions",
"web_request_com_host_permissions.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- "ext_id_1",
- &error);
+ mojom::ManifestLocation::kInvalidLocation,
+ Extension::NO_FLAGS, "ext_id_1", &error);
ASSERT_TRUE(extension_.get()) << error;
- extension_all_urls_ =
- LoadManifestUnchecked("permissions",
- "web_request_all_host_permissions.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- "ext_id_2",
- &error);
+ extension_all_urls_ = LoadManifestUnchecked(
+ "permissions", "web_request_all_host_permissions.json",
+ mojom::ManifestLocation::kInvalidLocation, Extension::NO_FLAGS,
+ "ext_id_2", &error);
ASSERT_TRUE(extension_all_urls_.get()) << error;
ExtensionRegistry::Get(browser_context())->AddEnabled(extension_);
ExtensionRegistry::Get(browser_context())->AddEnabled(extension_all_urls_);
diff --git a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
index e2fe6b7718f..124597dc991 100644
--- a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
@@ -16,6 +16,7 @@
#include "base/run_loop.h"
#include "base/test/values_test_util.h"
#include "base/values.h"
+#include "build/chromeos_buildflags.h"
#include "chrome/common/extensions/extension_test_util.h"
#include "chrome/test/base/testing_profile.h"
#include "components/url_matcher/url_matcher_constants.h"
@@ -32,6 +33,10 @@
#include "testing/gtest/include/gtest/gtest-message.h"
#include "testing/gtest/include/gtest/gtest.h"
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/lacros/scoped_lacros_chrome_service_test_helper.h"
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
namespace helpers = extension_web_request_api_helpers;
namespace keys = extensions::declarative_webrequest_constants;
namespace keys2 = url_matcher::url_matcher_constants;
@@ -128,8 +133,8 @@ class WebRequestRulesRegistryTest : public testing::Test {
action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
api::events::Rule rule;
- rule.id.reset(new std::string(kRuleId1));
- rule.priority.reset(new int(100));
+ rule.id = std::make_unique<std::string>(kRuleId1);
+ rule.priority = std::make_unique<int>(100);
rule.actions.push_back(action_dict.CreateDeepCopy());
http_condition_dict->Set(keys2::kSchemesKey, std::move(scheme_http));
http_condition_url_filter.Set(keys::kUrlKey,
@@ -148,8 +153,8 @@ class WebRequestRulesRegistryTest : public testing::Test {
action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
api::events::Rule rule;
- rule.id.reset(new std::string(kRuleId2));
- rule.priority.reset(new int(100));
+ rule.id = std::make_unique<std::string>(kRuleId2);
+ rule.priority = std::make_unique<int>(100);
rule.actions.push_back(action_dict.CreateDeepCopy());
rule.conditions.push_back(condition_dict.CreateDeepCopy());
return rule;
@@ -164,8 +169,8 @@ class WebRequestRulesRegistryTest : public testing::Test {
action_dict.SetString(keys::kRedirectUrlKey, destination);
api::events::Rule rule;
- rule.id.reset(new std::string(kRuleId3));
- rule.priority.reset(new int(100));
+ rule.id = std::make_unique<std::string>(kRuleId3);
+ rule.priority = std::make_unique<int>(100);
rule.actions.push_back(action_dict.CreateDeepCopy());
rule.conditions.push_back(condition_dict.CreateDeepCopy());
return rule;
@@ -185,8 +190,8 @@ class WebRequestRulesRegistryTest : public testing::Test {
action_dict.SetInteger(keys::kLowerPriorityThanKey, 150);
api::events::Rule rule;
- rule.id.reset(new std::string(kRuleId4));
- rule.priority.reset(new int(200));
+ rule.id = std::make_unique<std::string>(kRuleId4);
+ rule.priority = std::make_unique<int>(200);
rule.actions.push_back(action_dict.CreateDeepCopy());
rule.conditions.push_back(condition_dict.CreateDeepCopy());
return rule;
@@ -214,8 +219,8 @@ class WebRequestRulesRegistryTest : public testing::Test {
action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
api::events::Rule rule;
- rule.id.reset(new std::string(rule_id));
- rule.priority.reset(new int(1));
+ rule.id = std::make_unique<std::string>(rule_id);
+ rule.priority = std::make_unique<int>(1);
rule.actions.push_back(action_dict.CreateDeepCopy());
for (auto it = attributes.cbegin(); it != attributes.cend(); ++it)
rule.conditions.push_back(CreateCondition(**it));
@@ -230,6 +235,11 @@ class WebRequestRulesRegistryTest : public testing::Test {
// |extension2_|.
scoped_refptr<Extension> extension_;
scoped_refptr<Extension> extension2_;
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ chromeos::ScopedLacrosChromeServiceTestHelper
+ scoped_lacros_chrome_service_test_helper_;
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
};
void WebRequestRulesRegistryTest::SetUp() {
@@ -238,17 +248,13 @@ void WebRequestRulesRegistryTest::SetUp() {
std::string error;
extension_ = LoadManifestUnchecked("permissions",
"web_request_all_host_permissions.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- kExtensionId,
- &error);
+ mojom::ManifestLocation::kInvalidLocation,
+ Extension::NO_FLAGS, kExtensionId, &error);
ASSERT_TRUE(extension_.get()) << error;
- extension2_ = LoadManifestUnchecked("permissions",
- "web_request_all_host_permissions.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- kExtensionId2,
- &error);
+ extension2_ = LoadManifestUnchecked(
+ "permissions", "web_request_all_host_permissions.json",
+ mojom::ManifestLocation::kInvalidLocation, Extension::NO_FLAGS,
+ kExtensionId2, &error);
ASSERT_TRUE(extension2_.get()) << error;
CHECK(ExtensionRegistry::Get(&profile_));
ExtensionRegistry::Get(&profile_)->AddEnabled(extension_);
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/DIR_METADATA b/chromium/chrome/browser/extensions/api/desktop_capture/DIR_METADATA
index f9e0b1be2db..07a577b37e4 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/DIR_METADATA
@@ -1,4 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
monorail {
- component: "Blink>GetUserMedia>Desktop"
+ component: "Internals>Media>ScreenCapture"
}
-team_email: "webrtc-dev@chromium.org"
+team_email: "media-capture-dev@chromium.org"
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc
index 60385fbd029..11e7ee8835d 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc
@@ -6,7 +6,6 @@
#include "base/command_line.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_switches.h"
@@ -55,7 +54,7 @@ DesktopCaptureChooseDesktopMediaFunction::Run() {
// |web_contents| is the WebContents for which the stream is created, and will
// also be used to determine where to show the picker's UI.
content::WebContents* web_contents = NULL;
- base::string16 target_name;
+ std::u16string target_name;
GURL origin;
if (params->target_tab) {
if (!params->target_tab->url) {
@@ -81,10 +80,10 @@ DesktopCaptureChooseDesktopMediaFunction::Run() {
return RespondNow(Error(kDesktopCaptureApiNoTabIdError));
}
- ChromeExtensionFunctionDetails details(this);
- if (!ExtensionTabUtil::GetTabById(*(params->target_tab->id),
- details.GetProfile(), true,
- &web_contents)) {
+ if (!ExtensionTabUtil::GetTabById(
+ *(params->target_tab->id),
+ Profile::FromBrowserContext(browser_context()), true,
+ &web_contents)) {
return RespondNow(Error(kDesktopCaptureApiInvalidTabIdError));
}
DCHECK(web_contents);
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 73a5a0563f8..e67834cc849 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -76,7 +76,7 @@ DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
const std::vector<api::desktop_capture::DesktopCaptureSourceType>& sources,
content::WebContents* web_contents,
const GURL& origin,
- const base::string16 target_name) {
+ const std::u16string target_name) {
DCHECK(!picker_controller_);
gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow();
@@ -147,8 +147,8 @@ DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
std::string DesktopCaptureChooseDesktopMediaFunctionBase::GetCallerDisplayName()
const {
- if (extension()->location() == Manifest::COMPONENT ||
- extension()->location() == Manifest::EXTERNAL_COMPONENT) {
+ if (extension()->location() == mojom::ManifestLocation::kComponent ||
+ extension()->location() == mojom::ManifestLocation::kExternalComponent) {
return l10n_util::GetStringUTF8(IDS_SHORT_PRODUCT_NAME);
} else {
return extension()->name();
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
index a52f8fdec80..93f450ad84c 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
@@ -44,7 +44,7 @@ class DesktopCaptureChooseDesktopMediaFunctionBase : public ExtensionFunction {
sources,
content::WebContents* web_contents,
const GURL& origin,
- const base::string16 target_name);
+ const std::u16string target_name);
// Returns the calling application name to show in the picker.
std::string GetCallerDisplayName() const;
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 0683253d7ad..ec508064737 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -32,6 +32,7 @@
#include "chrome/browser/extensions/error_console/error_console_factory.h"
#include "chrome/browser/extensions/extension_commands_global_registry.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system_factory.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/install_verifier.h"
@@ -330,6 +331,7 @@ void BrowserContextKeyedAPIFactory<
DependsOn(ExtensionManagementFactory::GetInstance());
DependsOn(CommandService::GetFactoryInstance());
DependsOn(EventRouterFactory::GetInstance());
+ DependsOn(ExtensionSystemFactory::GetInstance());
}
// static
@@ -345,15 +347,17 @@ DeveloperPrivateAPI::DeveloperPrivateAPI(content::BrowserContext* context)
DeveloperPrivateEventRouter::DeveloperPrivateEventRouter(Profile* profile)
: profile_(profile), event_router_(EventRouter::Get(profile_)) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
- error_console_observer_.Add(ErrorConsole::Get(profile));
- process_manager_observer_.Add(ProcessManager::Get(profile));
- app_window_registry_observer_.Add(AppWindowRegistry::Get(profile));
- warning_service_observer_.Add(WarningService::Get(profile));
- extension_prefs_observer_.Add(ExtensionPrefs::Get(profile));
- extension_management_observer_.Add(
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
+ error_console_observation_.Observe(ErrorConsole::Get(profile));
+ process_manager_observation_.Observe(ProcessManager::Get(profile));
+ app_window_registry_observation_.Observe(AppWindowRegistry::Get(profile));
+ warning_service_observation_.Observe(WarningService::Get(profile));
+ extension_prefs_observation_.Observe(ExtensionPrefs::Get(profile));
+ extension_management_observation_.Observe(
ExtensionManagementFactory::GetForBrowserContext(profile));
- command_service_observer_.Add(CommandService::Get(profile));
+ command_service_observation_.Observe(CommandService::Get(profile));
+ extension_allowlist_observer_.Observe(
+ ExtensionSystem::Get(profile)->extension_service()->allowlist());
pref_change_registrar_.Init(profile->GetPrefs());
// The unretained is safe, since the PrefChangeRegistrar unregisters the
// callback on destruction.
@@ -493,6 +497,12 @@ void DeveloperPrivateEventRouter::OnExtensionRuntimePermissionsChanged(
extension_id);
}
+void DeveloperPrivateEventRouter::OnExtensionAllowlistWarningStateChanged(
+ const std::string& extension_id,
+ bool show_warning) {
+ BroadcastItemStateChanged(developer::EVENT_TYPE_PREFS_CHANGED, extension_id);
+}
+
void DeveloperPrivateEventRouter::OnExtensionManagementSettingsChanged() {
std::unique_ptr<base::ListValue> args(new base::ListValue());
args->Append(DeveloperPrivateAPI::CreateProfileInfo(profile_)->ToValue());
@@ -572,8 +582,8 @@ void DeveloperPrivateEventRouter::BroadcastItemStateChangedHelper(
event_data.event_type = event_type;
event_data.item_id = extension_id;
if (!infos.empty()) {
- event_data.extension_info.reset(
- new developer::ExtensionInfo(std::move(infos[0])));
+ event_data.extension_info =
+ std::make_unique<developer::ExtensionInfo>(std::move(infos[0]));
}
std::unique_ptr<base::ListValue> args(new base::ListValue());
@@ -662,8 +672,8 @@ void DeveloperPrivateAPI::Shutdown() {}
void DeveloperPrivateAPI::OnListenerAdded(
const EventListenerInfo& details) {
if (!developer_private_event_router_) {
- developer_private_event_router_.reset(
- new DeveloperPrivateEventRouter(profile_));
+ developer_private_event_router_ =
+ std::make_unique<DeveloperPrivateEventRouter>(profile_);
}
developer_private_event_router_->AddExtensionId(details.extension_id);
@@ -740,7 +750,7 @@ DeveloperPrivateGetExtensionsInfoFunction::Run() {
include_terminated = *params->options->include_terminated;
}
- info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
+ info_generator_ = std::make_unique<ExtensionInfoGenerator>(browser_context());
info_generator_->CreateExtensionsInfo(
include_disabled, include_terminated,
base::BindOnce(
@@ -769,7 +779,7 @@ DeveloperPrivateGetExtensionInfoFunction::Run() {
developer::GetExtensionInfo::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
+ info_generator_ = std::make_unique<ExtensionInfoGenerator>(browser_context());
info_generator_->CreateExtensionInfo(
params->id,
base::BindOnce(
@@ -813,7 +823,7 @@ DeveloperPrivateGetExtensionSizeFunction::Run() {
}
void DeveloperPrivateGetExtensionSizeFunction::OnSizeCalculated(
- const base::string16& size) {
+ const std::u16string& size) {
Respond(OneArgument(base::Value(size)));
}
@@ -825,7 +835,7 @@ ExtensionFunction::ResponseAction DeveloperPrivateGetItemsInfoFunction::Run() {
developer::GetItemsInfo::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
+ info_generator_ = std::make_unique<ExtensionInfoGenerator>(browser_context());
info_generator_->CreateExtensionsInfo(
params->include_disabled, params->include_terminated,
base::BindOnce(&DeveloperPrivateGetItemsInfoFunction::OnInfosGenerated,
@@ -986,8 +996,8 @@ ExtensionFunction::ResponseAction DeveloperPrivateReloadFunction::Run() {
// Balanced in ClearObservers(), which is called from the first observer
// method to be called with the appropriate extension (or shutdown).
AddRef();
- error_reporter_observer_.Add(LoadErrorReporter::GetInstance());
- registry_observer_.Add(ExtensionRegistry::Get(browser_context()));
+ error_reporter_observation_.Observe(LoadErrorReporter::GetInstance());
+ registry_observation_.Observe(ExtensionRegistry::Get(browser_context()));
return RespondLater();
}
@@ -1042,8 +1052,8 @@ void DeveloperPrivateReloadFunction::OnGotManifestError(
}
void DeveloperPrivateReloadFunction::ClearObservers() {
- registry_observer_.RemoveAll();
- error_reporter_observer_.RemoveAll();
+ registry_observation_.Reset();
+ error_reporter_observation_.Reset();
Release(); // Balanced in Run().
}
@@ -1281,7 +1291,7 @@ void DeveloperPrivateNotifyDragInstallInProgressFunction::SetDropPathForTesting(
bool DeveloperPrivateChooseEntryFunction::ShowPicker(
ui::SelectFileDialog::Type picker_type,
- const base::string16& select_title,
+ const std::u16string& select_title,
const ui::SelectFileDialog::FileTypeInfo& info,
int file_type_index) {
content::WebContents* web_contents = GetSenderWebContents();
@@ -1623,7 +1633,7 @@ ExtensionFunction::ResponseAction DeveloperPrivateChoosePathFunction::Run() {
if (params->select_type == developer::SELECT_TYPE_FILE)
type = ui::SelectFileDialog::SELECT_OPEN_FILE;
- base::string16 select_title;
+ std::u16string select_title;
int file_type_index = 0;
if (params->file_type == developer::FILE_TYPE_LOAD) {
@@ -1735,15 +1745,13 @@ void DeveloperPrivateRequestFileSourceFunction::Finish(
std::unique_ptr<FileHighlighter> highlighter;
if (properties.path_suffix == kManifestFile) {
- highlighter.reset(new ManifestHighlighter(
- file_contents,
- *properties.manifest_key,
- properties.manifest_specific ?
- *properties.manifest_specific : std::string()));
+ highlighter = std::make_unique<ManifestHighlighter>(
+ file_contents, *properties.manifest_key,
+ properties.manifest_specific ? *properties.manifest_specific
+ : std::string());
} else {
- highlighter.reset(new SourceHighlighter(
- file_contents,
- properties.line_number ? *properties.line_number : 0));
+ highlighter = std::make_unique<SourceHighlighter>(
+ file_contents, properties.line_number ? *properties.line_number : 0);
}
response.before_highlight = highlighter->GetBeforeFeature();
@@ -1775,10 +1783,10 @@ DeveloperPrivateOpenDevToolsFunction::Run() {
const bool is_service_worker =
properties.is_service_worker && *properties.is_service_worker;
if (is_service_worker) {
- if (!BackgroundInfo::IsServiceWorkerBased(extension))
- return RespondNow(Error(kInvalidLazyBackgroundPageParameter));
if (!extension)
return RespondNow(Error(kNoSuchExtensionError));
+ if (!BackgroundInfo::IsServiceWorkerBased(extension))
+ return RespondNow(Error(kInvalidLazyBackgroundPageParameter));
if (properties.render_process_id == -1) {
// Start the service worker and open the inspect window.
devtools_util::InspectInactiveServiceWorkerBackground(extension, profile);
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.h b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.h
index 1eae5f9231a..b8b7fcf661d 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.h
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.h
@@ -11,10 +11,11 @@
#include "base/files/file.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/commands/command_service.h"
#include "chrome/browser/extensions/api/developer_private/entry_picker.h"
#include "chrome/browser/extensions/error_console/error_console.h"
+#include "chrome/browser/extensions/extension_allowlist.h"
#include "chrome/browser/extensions/extension_management.h"
#include "chrome/browser/extensions/extension_uninstall_dialog.h"
#include "chrome/browser/extensions/load_error_reporter.h"
@@ -67,6 +68,7 @@ class DeveloperPrivateEventRouter : public ExtensionRegistryObserver,
public AppWindowRegistry::Observer,
public CommandService::Observer,
public ExtensionPrefsObserver,
+ public ExtensionAllowlist::Observer,
public ExtensionManagement::Observer,
public WarningService::Observer,
public content::NotificationObserver {
@@ -122,6 +124,10 @@ class DeveloperPrivateEventRouter : public ExtensionRegistryObserver,
void OnExtensionRuntimePermissionsChanged(
const std::string& extension_id) override;
+ // ExtensionAllowlist::Observer
+ void OnExtensionAllowlistWarningStateChanged(const std::string& extension_id,
+ bool show_warning) override;
+
// ExtensionManagement::Observer:
void OnExtensionManagementSettingsChanged() override;
@@ -134,7 +140,7 @@ class DeveloperPrivateEventRouter : public ExtensionRegistryObserver,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
- // Handles a profile preferance change.
+ // Handles a profile preference change.
void OnProfilePrefChanged();
// Broadcasts an event to all listeners.
@@ -146,22 +152,24 @@ class DeveloperPrivateEventRouter : public ExtensionRegistryObserver,
std::unique_ptr<ExtensionInfoGenerator> info_generator,
std::vector<api::developer_private::ExtensionInfo> infos);
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
- ScopedObserver<ErrorConsole, ErrorConsole::Observer> error_console_observer_{
- this};
- ScopedObserver<ProcessManager, ProcessManagerObserver>
- process_manager_observer_{this};
- ScopedObserver<AppWindowRegistry, AppWindowRegistry::Observer>
- app_window_registry_observer_{this};
- ScopedObserver<WarningService, WarningService::Observer>
- warning_service_observer_{this};
- ScopedObserver<ExtensionPrefs, ExtensionPrefsObserver>
- extension_prefs_observer_{this};
- ScopedObserver<ExtensionManagement, ExtensionManagement::Observer>
- extension_management_observer_{this};
- ScopedObserver<CommandService, CommandService::Observer>
- command_service_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
+ base::ScopedObservation<ErrorConsole, ErrorConsole::Observer>
+ error_console_observation_{this};
+ base::ScopedObservation<ProcessManager, ProcessManagerObserver>
+ process_manager_observation_{this};
+ base::ScopedObservation<AppWindowRegistry, AppWindowRegistry::Observer>
+ app_window_registry_observation_{this};
+ base::ScopedObservation<WarningService, WarningService::Observer>
+ warning_service_observation_{this};
+ base::ScopedObservation<ExtensionPrefs, ExtensionPrefsObserver>
+ extension_prefs_observation_{this};
+ base::ScopedObservation<ExtensionManagement, ExtensionManagement::Observer>
+ extension_management_observation_{this};
+ base::ScopedObservation<CommandService, CommandService::Observer>
+ command_service_observation_{this};
+ base::ScopedObservation<ExtensionAllowlist, ExtensionAllowlist::Observer>
+ extension_allowlist_observer_{this};
Profile* profile_;
@@ -392,7 +400,7 @@ class DeveloperPrivateGetExtensionSizeFunction
~DeveloperPrivateGetExtensionSizeFunction() override;
ResponseAction Run() override;
- void OnSizeCalculated(const base::string16& size);
+ void OnSizeCalculated(const std::u16string& size);
DISALLOW_COPY_AND_ASSIGN(DeveloperPrivateGetExtensionSizeFunction);
};
@@ -467,10 +475,10 @@ class DeveloperPrivateReloadFunction : public DeveloperPrivateAPIFunction,
// The file path of the extension that's reloading.
base::FilePath reloading_extension_path_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- registry_observer_{this};
- ScopedObserver<LoadErrorReporter, LoadErrorReporter::Observer>
- error_reporter_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ registry_observation_{this};
+ base::ScopedObservation<LoadErrorReporter, LoadErrorReporter::Observer>
+ error_reporter_observation_{this};
DISALLOW_COPY_AND_ASSIGN(DeveloperPrivateReloadFunction);
};
@@ -497,7 +505,7 @@ class DeveloperPrivateChooseEntryFunction : public ExtensionFunction,
protected:
~DeveloperPrivateChooseEntryFunction() override;
bool ShowPicker(ui::SelectFileDialog::Type picker_type,
- const base::string16& select_title,
+ const std::u16string& select_title,
const ui::SelectFileDialog::FileTypeInfo& info,
int file_type_index);
};
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index 7a48c1a0352..6725a098945 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -10,7 +10,7 @@
#include "base/bind.h"
#include "base/files/file_util.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.h"
@@ -31,6 +31,7 @@
#include "chrome/test/base/testing_profile.h"
#include "components/crx_file/id_util.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "content/public/browser/notification_service.h"
#include "content/public/test/web_contents_tester.h"
@@ -50,6 +51,7 @@
#include "extensions/browser/test_extension_registry_observer.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
+#include "extensions/common/extension_features.h"
#include "extensions/common/extension_id.h"
#include "extensions/common/extension_set.h"
#include "extensions/common/manifest_constants.h"
@@ -84,9 +86,10 @@ bool HasPrefsPermission(bool (*has_pref)(const std::string&,
return has_pref(id, context);
}
-bool WasPermissionsUpdatedEventDispatched(
+bool WasItemChangedEventDispatched(
const TestEventRouterObserver& observer,
- const ExtensionId& extension_id) {
+ const ExtensionId& extension_id,
+ const api::developer_private::EventType event_type) {
const std::string kEventName =
api::developer_private::OnItemStateChanged::kEventName;
const auto& event_map = observer.events();
@@ -104,8 +107,7 @@ bool WasPermissionsUpdatedEventDispatched(
return false;
if (event_data->item_id != extension_id ||
- event_data->event_type !=
- api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED) {
+ event_data->event_type != event_type) {
return false;
}
@@ -223,7 +225,7 @@ const Extension* DeveloperPrivateApiUnitTest::LoadSimpleExtension() {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(manifest.Build())
- .SetLocation(Manifest::INTERNAL)
+ .SetLocation(mojom::ManifestLocation::kInternal)
.SetID(id)
.Build();
service()->AddExtension(extension.get());
@@ -357,7 +359,7 @@ void DeveloperPrivateApiUnitTest::SetUp() {
init_params.profile_is_supervised = ProfileIsSupervised();
InitializeExtensionService(init_params);
- browser_window_.reset(new TestBrowserWindow());
+ browser_window_ = std::make_unique<TestBrowserWindow>();
Browser::CreateParams params(profile(), true);
params.type = Browser::TYPE_NORMAL;
params.window = browser_window_.get();
@@ -832,8 +834,8 @@ TEST_F(DeveloperPrivateApiUnitTest, ReloadBadExtensionToLoadUnpackedRetry) {
public:
UnloadedRegistryObserver(const base::FilePath& expected_path,
ExtensionRegistry* registry)
- : expected_path_(expected_path), observer_(this) {
- observer_.Add(registry);
+ : expected_path_(expected_path) {
+ observation_.Observe(registry);
}
void OnExtensionUnloaded(content::BrowserContext* browser_context,
@@ -848,7 +850,8 @@ TEST_F(DeveloperPrivateApiUnitTest, ReloadBadExtensionToLoadUnpackedRetry) {
private:
bool saw_unload_ = false;
base::FilePath expected_path_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> observer_;
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ observation_{this};
DISALLOW_COPY_AND_ASSIGN(UnloadedRegistryObserver);
};
@@ -998,7 +1001,7 @@ TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateRequestFileSource) {
properties.extension_id = extension->id();
properties.path_suffix = "manifest.json";
properties.message = kErrorMessage;
- properties.manifest_key.reset(new std::string("name"));
+ properties.manifest_key = std::make_unique<std::string>("name");
scoped_refptr<ExtensionFunction> function(
new api::DeveloperPrivateRequestFileSourceFunction());
@@ -1141,7 +1144,7 @@ TEST_F(DeveloperPrivateApiUnitTest, RepairPolicyExtension) {
// Set up a mock provider with a policy extension.
std::unique_ptr<MockExternalProvider> mock_provider =
std::make_unique<MockExternalProvider>(
- service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
+ service(), mojom::ManifestLocation::kExternalPolicyDownload);
MockExternalProvider* mock_provider_ptr = mock_provider.get();
AddMockExternalProvider(std::move(mock_provider));
mock_provider_ptr->UpdateOrAddExtension(extension_id, "1.0.0.0",
@@ -1685,8 +1688,9 @@ TEST_F(DeveloperPrivateApiUnitTest,
event_router->AddEventListener(kEventName, process, listener_id);
TestEventRouterObserver test_observer(event_router);
- EXPECT_FALSE(
- WasPermissionsUpdatedEventDispatched(test_observer, extension->id()));
+ EXPECT_FALSE(WasItemChangedEventDispatched(
+ test_observer, extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
URLPatternSet hosts({URLPattern(Extension::kValidHostPermissionSchemes,
"https://example.com/*")});
@@ -1698,16 +1702,18 @@ TEST_F(DeveloperPrivateApiUnitTest,
// The event router fetches icons from a blocking thread when sending the
// update event; allow it to finish before verifying the event was dispatched.
base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(
- WasPermissionsUpdatedEventDispatched(test_observer, extension->id()));
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
test_observer.ClearEvents();
permissions_test_util::RevokeRuntimePermissionsAndWaitForCompletion(
profile(), *extension, permissions);
base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(
- WasPermissionsUpdatedEventDispatched(test_observer, extension->id()));
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
}
TEST_F(DeveloperPrivateApiUnitTest, ExtensionUpdatedEventOnPermissionsChange) {
@@ -1731,11 +1737,12 @@ TEST_F(DeveloperPrivateApiUnitTest, ExtensionUpdatedEventOnPermissionsChange) {
.Build();
TestEventRouterObserver test_observer(event_router);
- EXPECT_FALSE(WasPermissionsUpdatedEventDispatched(test_observer,
- dummy_extension->id()));
+ EXPECT_FALSE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
APIPermissionSet apis;
- apis.insert(APIPermission::kTab);
+ apis.insert(extensions::mojom::APIPermissionID::kTab);
PermissionSet permissions(std::move(apis), ManifestPermissionSet(),
URLPatternSet(), URLPatternSet());
permissions_test_util::GrantOptionalPermissionsAndWaitForCompletion(
@@ -1744,8 +1751,9 @@ TEST_F(DeveloperPrivateApiUnitTest, ExtensionUpdatedEventOnPermissionsChange) {
// The event router fetches icons from a blocking thread when sending the
// update event; allow it to finish before verifying the event was dispatched.
base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(WasPermissionsUpdatedEventDispatched(test_observer,
- dummy_extension->id()));
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
test_observer.ClearEvents();
@@ -1753,8 +1761,9 @@ TEST_F(DeveloperPrivateApiUnitTest, ExtensionUpdatedEventOnPermissionsChange) {
profile(), *dummy_extension, permissions,
PermissionsUpdater::REMOVE_HARD);
base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(WasPermissionsUpdatedEventDispatched(test_observer,
- dummy_extension->id()));
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PERMISSIONS_CHANGED));
}
TEST_F(DeveloperPrivateApiUnitTest, InstallDroppedFileZip) {
@@ -1780,6 +1789,69 @@ TEST_F(DeveloperPrivateApiUnitTest, InstallDroppedFileZip) {
EXPECT_EQ("Simple Empty Extension", extension->name());
}
+class DeveloperPrivateApiAllowlistUnitTest
+ : public DeveloperPrivateApiUnitTest {
+ public:
+ DeveloperPrivateApiAllowlistUnitTest() {
+ feature_list_.InitAndEnableFeature(
+ extensions_features::kSafeBrowsingCrxAllowlistShowWarnings);
+ }
+};
+
+TEST_F(DeveloperPrivateApiAllowlistUnitTest,
+ ExtensionUpdatedEventOnAllowlistWarningChange) {
+ // We need to call DeveloperPrivateAPI::Get() in order to instantiate the
+ // keyed service, since it's not created by default in unit tests.
+ DeveloperPrivateAPI::Get(profile());
+ const ExtensionId listener_id = crx_file::id_util::GenerateId("listener");
+ EventRouter* event_router = EventRouter::Get(profile());
+
+ // The DeveloperPrivateEventRouter will only dispatch events if there's at
+ // least one listener to dispatch to. Create one.
+ content::RenderProcessHost* process = nullptr;
+ const char* kEventName =
+ api::developer_private::OnItemStateChanged::kEventName;
+ event_router->AddEventListener(kEventName, process, listener_id);
+
+ scoped_refptr<const Extension> dummy_extension = LoadSimpleExtension();
+ base::RunLoop().RunUntilIdle();
+
+ TestEventRouterObserver test_observer(event_router);
+ EXPECT_FALSE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PREFS_CHANGED));
+
+ safe_browsing::SetSafeBrowsingState(profile()->GetPrefs(),
+ safe_browsing::ENHANCED_PROTECTION);
+
+ base::RunLoop().RunUntilIdle();
+ // The warning state should not have changed since the allowlist state is not
+ // set yet.
+ EXPECT_FALSE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PREFS_CHANGED));
+
+ service()->allowlist()->SetExtensionAllowlistState(dummy_extension->id(),
+ ALLOWLIST_NOT_ALLOWLISTED);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PREFS_CHANGED));
+
+ test_observer.ClearEvents();
+
+ safe_browsing::SetSafeBrowsingState(profile()->GetPrefs(),
+ safe_browsing::STANDARD_PROTECTION);
+
+ base::RunLoop().RunUntilIdle();
+ // The warning is now hidden because the profile is no longer Enhanced
+ // Protection.
+ EXPECT_TRUE(WasItemChangedEventDispatched(
+ test_observer, dummy_extension->id(),
+ api::developer_private::EVENT_TYPE_PREFS_CHANGED));
+}
+
class DeveloperPrivateApiSupervisedUserUnitTest
: public DeveloperPrivateApiUnitTest {
public:
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
index 75b76dfc1a7..c951beb646d 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
@@ -17,7 +17,6 @@
#include "content/public/test/service_worker_test_helpers.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
-#include "extensions/browser/service_worker/service_worker_test_utils.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/test/result_catcher.h"
@@ -30,12 +29,13 @@ IN_PROC_BROWSER_TEST_F(DeveloperPrivateApiTest, Basics) {
// setings in the API test.
base::FilePath base_dir = test_data_dir_.AppendASCII("developer");
EXPECT_TRUE(LoadExtension(base_dir.AppendASCII("hosted_app")));
- EXPECT_TRUE(InstallExtension(
- base_dir.AppendASCII("packaged_app"), 1, Manifest::INTERNAL));
+ EXPECT_TRUE(InstallExtension(base_dir.AppendASCII("packaged_app"), 1,
+ mojom::ManifestLocation::kInternal));
LoadExtension(base_dir.AppendASCII("simple_extension"));
- ASSERT_TRUE(RunPlatformAppTestWithFlags("developer/test", kFlagNone,
- kFlagLoadAsComponent));
+ ASSERT_TRUE(RunExtensionTest({.name = "developer/test",
+ .load_as_component = true,
+ .launch_as_platform_app = true}));
}
// Tests opening the developer tools for an app window.
@@ -140,16 +140,16 @@ IN_PROC_BROWSER_TEST_F(DeveloperPrivateApiTest, InspectEmbeddedOptionsPage) {
IN_PROC_BROWSER_TEST_F(DeveloperPrivateApiTest,
InspectInactiveServiceWorkerBackground) {
ResultCatcher result_catcher;
- service_worker_test_utils::TestRegistrationObserver registration_observer(
- browser()->profile());
- // Load an extension that is service worker based.
+ // Load an extension that is service worker-based.
const Extension* extension =
LoadExtension(test_data_dir_.AppendASCII("service_worker")
.AppendASCII("worker_based_background")
- .AppendASCII("inspect"));
+ .AppendASCII("inspect"),
+ // Wait for the registration to be stored since we'll stop
+ // the worker.
+ {.wait_for_registration_stored = true});
ASSERT_TRUE(extension);
ASSERT_TRUE(result_catcher.GetNextResult());
- registration_observer.WaitForRegistrationStored();
// Stop the service worker.
{
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_mangle.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_mangle.cc
index a24a327b3c6..495d79b2841 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_mangle.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_mangle.cc
@@ -66,14 +66,14 @@ api::developer_private::ItemInfo MangleExtensionInfo(
info.state == api::developer_private::EXTENSION_STATE_TERMINATED;
if (info.path)
- result.path.reset(new std::string(*info.path));
+ result.path = std::make_unique<std::string>(*info.path);
if (info.options_page)
- result.options_url.reset(new std::string(info.options_page->url));
+ result.options_url = std::make_unique<std::string>(info.options_page->url);
if (info.launch_url)
- result.app_launch_url.reset(new std::string(*info.launch_url));
+ result.app_launch_url = std::make_unique<std::string>(*info.launch_url);
if (!info.home_page.url.empty())
- result.homepage_url.reset(new std::string(info.home_page.url));
- result.update_url.reset(new std::string(info.update_url));
+ result.homepage_url = std::make_unique<std::string>(info.home_page.url);
+ result.update_url = std::make_unique<std::string>(info.update_url);
for (const std::string& str_warning : info.install_warnings) {
api::developer_private::InstallWarning warning;
warning.message = str_warning;
diff --git a/chromium/chrome/browser/extensions/api/developer_private/entry_picker.cc b/chromium/chrome/browser/extensions/api/developer_private/entry_picker.cc
index ad7d48b8c67..38eb4903762 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/entry_picker.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/entry_picker.cc
@@ -30,7 +30,7 @@ EntryPicker::EntryPicker(EntryPickerClient* client,
content::WebContents* web_contents,
ui::SelectFileDialog::Type picker_type,
const base::FilePath& last_directory,
- const base::string16& select_title,
+ const std::u16string& select_title,
const ui::SelectFileDialog::FileTypeInfo& info,
int file_type_index)
: client_(client) {
diff --git a/chromium/chrome/browser/extensions/api/developer_private/entry_picker.h b/chromium/chrome/browser/extensions/api/developer_private/entry_picker.h
index 36be5fc20c6..d9eaa552969 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/entry_picker.h
+++ b/chromium/chrome/browser/extensions/api/developer_private/entry_picker.h
@@ -30,7 +30,7 @@ class EntryPicker : public ui::SelectFileDialog::Listener {
content::WebContents* web_contents,
ui::SelectFileDialog::Type picker_type,
const base::FilePath& last_directory,
- const base::string16& select_title,
+ const std::u16string& select_title,
const ui::SelectFileDialog::FileTypeInfo& info,
int file_type_index);
diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index 6ea8182f408..cd6a42ba314 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -32,7 +32,6 @@
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/google_chrome_strings.h"
#include "content/public/browser/render_frame_host.h"
#include "extensions/browser/extension_error.h"
#include "extensions/browser/extension_icon_placeholder.h"
@@ -125,8 +124,8 @@ developer::ManifestError ConstructManifestError(const ManifestError& error) {
PopulateErrorBase(error, &result);
result.manifest_key = base::UTF16ToUTF8(error.manifest_key());
if (!error.manifest_specific().empty()) {
- result.manifest_specific.reset(
- new std::string(base::UTF16ToUTF8(error.manifest_specific())));
+ result.manifest_specific = std::make_unique<std::string>(
+ base::UTF16ToUTF8(error.manifest_specific()));
}
return result;
}
@@ -507,18 +506,17 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
blocklist_text = IDS_EXTENSIONS_BLOCKLISTED_POTENTIALLY_UNWANTED;
break;
default:
- if (extension_system_->extension_service()
- ->allowlist()
- ->ShouldDisplayWarning(extension.id())) {
- blocklist_text = IDS_EXTENSIONS_BLOCKLISTED_NOT_ALLOWLISTED;
- }
break;
}
if (blocklist_text != -1) {
- info->blacklist_text.reset(
- new std::string(l10n_util::GetStringUTF8(blocklist_text)));
+ info->blacklist_text =
+ std::make_unique<std::string>(l10n_util::GetStringUTF8(blocklist_text));
}
+ if (extension_system_->extension_service()->allowlist()->ShouldDisplayWarning(
+ extension.id())) {
+ info->show_safe_browsing_allowlist_warning = true;
+ }
ExtensionManagement* extension_management =
ExtensionManagementFactory::GetForBrowserContext(browser_context_);
Profile* profile = Profile::FromBrowserContext(browser_context_);
@@ -630,12 +628,12 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
// Launch url.
if (extension.is_app()) {
- info->launch_url.reset(
- new std::string(AppLaunchInfo::GetFullLaunchURL(&extension).spec()));
+ info->launch_url = std::make_unique<std::string>(
+ AppLaunchInfo::GetFullLaunchURL(&extension).spec());
}
// Location.
- if (extension.location() == Manifest::INTERNAL &&
+ if (extension.location() == mojom::ManifestLocation::kInternal &&
extension_management->UpdatesFromWebstore(extension)) {
info->location = developer::LOCATION_FROM_STORE;
} else if (Manifest::IsUnpackedLocation(extension.location())) {
@@ -651,13 +649,13 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
int location_text = -1;
if (info->location == developer::LOCATION_UNKNOWN)
location_text = IDS_EXTENSIONS_INSTALL_LOCATION_UNKNOWN;
- else if (extension.location() == Manifest::EXTERNAL_REGISTRY)
+ else if (extension.location() == mojom::ManifestLocation::kExternalRegistry)
location_text = IDS_EXTENSIONS_INSTALL_LOCATION_3RD_PARTY;
else if (extension.is_shared_module())
location_text = IDS_EXTENSIONS_INSTALL_LOCATION_SHARED_MODULE;
if (location_text != -1) {
- info->location_text.reset(
- new std::string(l10n_util::GetStringUTF8(location_text)));
+ info->location_text =
+ std::make_unique<std::string>(l10n_util::GetStringUTF8(location_text));
}
// Runtime/Manifest errors.
@@ -693,7 +691,7 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
// Options page.
if (OptionsPageInfo::HasOptionsPage(&extension)) {
- info->options_page.reset(new developer::OptionsPage());
+ info->options_page = std::make_unique<developer::OptionsPage>();
info->options_page->open_in_tab =
OptionsPageInfo::ShouldOpenInTab(&extension);
info->options_page->url =
@@ -702,9 +700,9 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
// Path.
if (Manifest::IsUnpackedLocation(extension.location())) {
- info->path.reset(new std::string(extension.path().AsUTF8Unsafe()));
- info->prettified_path.reset(new std::string(
- extensions::path_util::PrettifyPath(extension.path()).AsUTF8Unsafe()));
+ info->path = std::make_unique<std::string>(extension.path().AsUTF8Unsafe());
+ info->prettified_path = std::make_unique<std::string>(
+ extensions::path_util::PrettifyPath(extension.path()).AsUTF8Unsafe());
}
AddPermissionsInfo(browser_context_, extension, &info->permissions);
diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
index ce60a3fccf4..0365ae62e7c 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -56,6 +56,8 @@
namespace extensions {
+using mojom::ManifestLocation;
+
namespace developer = api::developer_private;
namespace {
@@ -117,8 +119,10 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestWithInstall {
void OnInfoGenerated(std::unique_ptr<developer::ExtensionInfo>* info_out,
ExtensionInfoGenerator::ExtensionInfoList list) {
EXPECT_EQ(1u, list.size());
- if (!list.empty())
- info_out->reset(new developer::ExtensionInfo(std::move(list[0])));
+ if (!list.empty()) {
+ *info_out =
+ std::make_unique<developer::ExtensionInfo>(std::move(list[0]));
+ }
std::move(quit_closure_).Run();
}
@@ -160,7 +164,7 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestWithInstall {
const scoped_refptr<const Extension> CreateExtension(
const std::string& name,
std::unique_ptr<base::ListValue> permissions,
- Manifest::Location location) {
+ mojom::ManifestLocation location) {
const std::string kId = crx_file::id_util::GenerateId(name);
scoped_refptr<const Extension> extension =
ExtensionBuilder()
@@ -185,7 +189,7 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestWithInstall {
std::unique_ptr<developer::ExtensionInfo> CreateExtensionInfoFromPath(
const base::FilePath& extension_path,
- Manifest::Location location) {
+ mojom::ManifestLocation location) {
ChromeTestExtensionLoader loader(browser_context());
loader.set_location(location);
loader.set_creation_flags(Extension::REQUIRE_KEY);
@@ -207,7 +211,8 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestWithInstall {
// Produce test output.
std::unique_ptr<developer::ExtensionInfo> info =
- CreateExtensionInfoFromPath(extension_path, Manifest::UNPACKED);
+ CreateExtensionInfoFromPath(extension_path,
+ mojom::ManifestLocation::kUnpacked);
info->views = std::move(views);
std::unique_ptr<base::DictionaryValue> actual_output_data = info->ToValue();
ASSERT_TRUE(actual_output_data);
@@ -268,7 +273,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, BasicInfoTest) {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(std::move(manifest))
- .SetLocation(Manifest::UNPACKED)
+ .SetLocation(ManifestLocation::kUnpacked)
.SetPath(data_dir())
.SetID(id)
.Build();
@@ -276,20 +281,15 @@ TEST_F(ExtensionInfoGeneratorUnitTest, BasicInfoTest) {
ErrorConsole* error_console = ErrorConsole::Get(profile());
const GURL kContextUrl("http://example.com");
error_console->ReportError(std::make_unique<RuntimeError>(
- extension->id(), false, base::UTF8ToUTF16("source"),
- base::UTF8ToUTF16("message"),
- StackTrace(1, StackFrame(1, 1, base::UTF8ToUTF16("source"),
- base::UTF8ToUTF16("function"))),
- kContextUrl, logging::LOG_ERROR, 1, 1));
+ extension->id(), false, u"source", u"message",
+ StackTrace(1, StackFrame(1, 1, u"source", u"function")), kContextUrl,
+ logging::LOG_ERROR, 1, 1));
error_console->ReportError(std::make_unique<ManifestError>(
- extension->id(), base::UTF8ToUTF16("message"), base::UTF8ToUTF16("key"),
- base::string16()));
+ extension->id(), u"message", u"key", std::u16string()));
error_console->ReportError(std::make_unique<RuntimeError>(
- extension->id(), false, base::UTF8ToUTF16("source"),
- base::UTF8ToUTF16("message"),
- StackTrace(1, StackFrame(1, 1, base::UTF8ToUTF16("source"),
- base::UTF8ToUTF16("function"))),
- kContextUrl, logging::LOG_WARNING, 1, 1));
+ extension->id(), false, u"source", u"message",
+ StackTrace(1, StackFrame(1, 1, u"source", u"function")), kContextUrl,
+ logging::LOG_WARNING, 1, 1));
// It's not feasible to validate every field here, because that would be
// a duplication of the logic in the method itself. Instead, test a handful
@@ -322,7 +322,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, BasicInfoTest) {
for (const PermissionMessage& message :
extension->permissions_data()->GetPermissionMessages()) {
if (!message.permissions().ContainsID(
- extensions::APIPermission::kHostReadWrite)) {
+ extensions::mojom::APIPermissionID::kHostReadWrite)) {
messages.push_back(message);
}
}
@@ -333,7 +333,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, BasicInfoTest) {
const api::developer_private::Permission& info_permission =
info->permissions.simple_permissions[i];
EXPECT_EQ(message.message(), base::UTF8ToUTF16(info_permission.message));
- const std::vector<base::string16>& submessages = message.submessages();
+ const std::vector<std::u16string>& submessages = message.submessages();
ASSERT_EQ(submessages.size(), info_permission.submessages.size());
for (size_t j = 0; j < submessages.size(); ++j) {
EXPECT_EQ(submessages[j],
@@ -367,7 +367,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, BasicInfoTest) {
id = crx_file::id_util::GenerateId("beta");
extension = ExtensionBuilder()
.SetManifest(std::move(manifest_copy))
- .SetLocation(Manifest::EXTERNAL_PREF)
+ .SetLocation(ManifestLocation::kExternalPref)
.SetID(id)
.Build();
service()->AddExtension(extension.get());
@@ -444,7 +444,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, GenerateExtensionsJSONData) {
TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissions) {
scoped_refptr<const Extension> all_urls_extension = CreateExtension(
"all_urls", ListBuilder().Append(kAllHostsPermission).Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
std::unique_ptr<developer::ExtensionInfo> info =
GenerateExtensionInfo(all_urls_extension->id());
@@ -490,8 +490,8 @@ TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissions) {
// An extension that doesn't request any host permissions should not have
// runtime access controls.
- scoped_refptr<const Extension> no_urls_extension =
- CreateExtension("no urls", ListBuilder().Build(), Manifest::INTERNAL);
+ scoped_refptr<const Extension> no_urls_extension = CreateExtension(
+ "no urls", ListBuilder().Build(), ManifestLocation::kInternal);
info = GenerateExtensionInfo(no_urls_extension->id());
EXPECT_FALSE(info->permissions.runtime_host_permissions);
}
@@ -503,7 +503,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest,
RuntimeHostPermissionsBeyondRequestedScope) {
scoped_refptr<const Extension> extension =
CreateExtension("extension", ListBuilder().Append("http://*/*").Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
std::unique_ptr<developer::ExtensionInfo> info =
GenerateExtensionInfo(extension->id());
@@ -551,7 +551,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissionsSpecificHosts) {
.Append("https://example.com/*")
.Append("https://chromium.org/*")
.Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
std::unique_ptr<developer::ExtensionInfo> info =
GenerateExtensionInfo(extension->id());
@@ -587,7 +587,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissionsSpecificHosts) {
TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissionsAllURLs) {
scoped_refptr<const Extension> all_urls_extension = CreateExtension(
"all_urls", ListBuilder().Append(kAllHostsPermission).Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
// Withholding host permissions should result in the extension being set to
// run on click.
@@ -628,7 +628,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest, WithheldUrlsOverlapping) {
.Append("*://example.com/*")
.Append("https://chromium.org/*")
.Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
ScriptingPermissionsModifier modifier(profile(), extension);
modifier.SetWithholdHostPermissions(true);
@@ -766,7 +766,7 @@ TEST_F(ExtensionInfoGeneratorUnitTest,
TEST_F(ExtensionInfoGeneratorUnitTest, ActiveTabFileUrls) {
scoped_refptr<const Extension> extension =
CreateExtension("activeTab", ListBuilder().Append("activeTab").Build(),
- Manifest::INTERNAL);
+ ManifestLocation::kInternal);
std::unique_ptr<developer::ExtensionInfo> info =
GenerateExtensionInfo(extension->id());
@@ -777,10 +777,12 @@ TEST_F(ExtensionInfoGeneratorUnitTest, ActiveTabFileUrls) {
// Tests that blocklisted extensions are returned by the ExtensionInfoGenerator.
TEST_F(ExtensionInfoGeneratorUnitTest, Blocklisted) {
- const scoped_refptr<const Extension> extension1 = CreateExtension(
- "test1", std::make_unique<base::ListValue>(), Manifest::INTERNAL);
- const scoped_refptr<const Extension> extension2 = CreateExtension(
- "test2", std::make_unique<base::ListValue>(), Manifest::INTERNAL);
+ const scoped_refptr<const Extension> extension1 =
+ CreateExtension("test1", std::make_unique<base::ListValue>(),
+ ManifestLocation::kInternal);
+ const scoped_refptr<const Extension> extension2 =
+ CreateExtension("test2", std::make_unique<base::ListValue>(),
+ ManifestLocation::kInternal);
std::string id1 = extension1->id();
std::string id2 = extension2->id();
diff --git a/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc b/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
index aecc9dc9282..98a04b5fb4c 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
@@ -22,6 +22,7 @@
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/manifest_handlers/incognito_info.h"
+#include "extensions/common/mojom/view_type.mojom.h"
#include "url/gurl.h"
namespace extensions {
@@ -33,36 +34,36 @@ InspectableViewsFinder::InspectableViewsFinder(Profile* profile)
InspectableViewsFinder::~InspectableViewsFinder() {
}
-api::developer_private::ViewType ConvertViewType(const ViewType type) {
+api::developer_private::ViewType ConvertViewType(const mojom::ViewType type) {
api::developer_private::ViewType developer_private_type;
switch (type) {
- case VIEW_TYPE_APP_WINDOW:
+ case mojom::ViewType::kAppWindow:
developer_private_type = api::developer_private::VIEW_TYPE_APP_WINDOW;
break;
- case VIEW_TYPE_BACKGROUND_CONTENTS:
+ case mojom::ViewType::kBackgroundContents:
developer_private_type =
api::developer_private::VIEW_TYPE_BACKGROUND_CONTENTS;
break;
- case VIEW_TYPE_COMPONENT:
+ case mojom::ViewType::kComponent:
developer_private_type = api::developer_private::VIEW_TYPE_COMPONENT;
break;
- case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
+ case mojom::ViewType::kExtensionBackgroundPage:
developer_private_type =
api::developer_private::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE;
break;
- case VIEW_TYPE_EXTENSION_DIALOG:
+ case mojom::ViewType::kExtensionDialog:
developer_private_type =
api::developer_private::VIEW_TYPE_EXTENSION_DIALOG;
break;
- case VIEW_TYPE_EXTENSION_GUEST:
+ case mojom::ViewType::kExtensionGuest:
developer_private_type =
api::developer_private::VIEW_TYPE_EXTENSION_GUEST;
break;
- case VIEW_TYPE_EXTENSION_POPUP:
+ case mojom::ViewType::kExtensionPopup:
developer_private_type =
api::developer_private::VIEW_TYPE_EXTENSION_POPUP;
break;
- case VIEW_TYPE_TAB_CONTENTS:
+ case mojom::ViewType::kTabContents:
developer_private_type = api::developer_private::VIEW_TYPE_TAB_CONTENTS;
break;
default:
@@ -162,11 +163,11 @@ void InspectableViewsFinder::GetViewsForExtensionProcess(
for (content::RenderFrameHost* host : hosts) {
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(host);
- ViewType host_type = GetViewType(web_contents);
- if (host_type == VIEW_TYPE_INVALID ||
- host_type == VIEW_TYPE_EXTENSION_POPUP ||
- host_type == VIEW_TYPE_EXTENSION_DIALOG ||
- host_type == VIEW_TYPE_APP_WINDOW) {
+ mojom::ViewType host_type = GetViewType(web_contents);
+ if (host_type == mojom::ViewType::kInvalid ||
+ host_type == mojom::ViewType::kExtensionPopup ||
+ host_type == mojom::ViewType::kExtensionDialog ||
+ host_type == mojom::ViewType::kAppWindow) {
continue;
}
diff --git a/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.h b/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.h
index 9b4c6baa571..c09f31c2cca 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.h
+++ b/chromium/chrome/browser/extensions/api/developer_private/inspectable_views_finder.h
@@ -9,7 +9,6 @@
#include "base/macros.h"
#include "chrome/common/extensions/api/developer_private.h"
-#include "extensions/common/view_type.h"
class Profile;
class GURL;
diff --git a/chromium/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc b/chromium/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
index de51c93d61f..8499259a880 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h"
+#include <memory>
#include <utility>
#include "apps/saved_files_service.h"
@@ -51,18 +52,19 @@ void ShowPermissionsDialogHelper::ShowPermissionsDialog(
content::WebContents* web_contents,
const Extension* extension) {
extension_id_ = extension->id();
- prompt_.reset(new ExtensionInstallPrompt(web_contents));
+ prompt_ = std::make_unique<ExtensionInstallPrompt>(web_contents);
std::vector<base::FilePath> retained_file_paths;
if (extension->permissions_data()->HasAPIPermission(
- APIPermission::kFileSystem)) {
+ mojom::APIPermissionID::kFileSystem)) {
std::vector<SavedFileEntry> retained_file_entries =
apps::SavedFilesService::Get(profile_)->GetAllFileEntries(
extension_id_);
for (const SavedFileEntry& entry : retained_file_entries)
retained_file_paths.push_back(entry.path);
}
- std::vector<base::string16> retained_device_messages;
- if (extension->permissions_data()->HasAPIPermission(APIPermission::kUsb)) {
+ std::vector<std::u16string> retained_device_messages;
+ if (extension->permissions_data()->HasAPIPermission(
+ mojom::APIPermissionID::kUsb)) {
retained_device_messages =
DevicePermissionsManager::Get(profile_)
->GetPermissionMessageStrings(extension_id_);
diff --git a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
index a2cfc5f9620..2d2fd31b905 100644
--- a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
@@ -42,7 +42,7 @@ class DevicePermissionsManagerTest : public testing::Test {
protected:
void SetUp() override {
testing::Test::SetUp();
- env_.reset(new extensions::TestExtensionEnvironment());
+ env_ = std::make_unique<extensions::TestExtensionEnvironment>();
extension_ = env_->MakeExtension(*base::test::ParseJsonDeprecated(
"{"
" \"app\": {"
@@ -132,12 +132,11 @@ TEST_F(DevicePermissionsManagerTest, AllowAndClearDevices) {
EXPECT_EQ(base::ASCIIToUTF16(
"Test Product from Test Manufacturer (serial number ABCDE)"),
device0_entry->GetPermissionMessageString());
- EXPECT_EQ(base::ASCIIToUTF16("Test Product from Test Manufacturer"),
+ EXPECT_EQ(u"Test Product from Test Manufacturer",
device1_entry->GetPermissionMessageString());
- EXPECT_EQ(base::ASCIIToUTF16("Test HID Device (serial number abcde)"),
+ EXPECT_EQ(u"Test HID Device (serial number abcde)",
device4_entry->GetPermissionMessageString());
- EXPECT_EQ(base::ASCIIToUTF16("Test HID Device"),
- device5_entry->GetPermissionMessageString());
+ EXPECT_EQ(u"Test HID Device", device5_entry->GetPermissionMessageString());
manager->Clear(extension_->id());
// The device_permissions object is deleted by Clear.
@@ -332,26 +331,26 @@ TEST_F(DevicePermissionsManagerTest, LoadPrefs) {
EXPECT_EQ(base::ASCIIToUTF16(
"Test Product from Test Manufacturer (serial number ABCDE)"),
device0_entry->GetPermissionMessageString());
- EXPECT_EQ(base::ASCIIToUTF16("Test HID Device (serial number abcde)"),
+ EXPECT_EQ(u"Test HID Device (serial number abcde)",
device4_entry->GetPermissionMessageString());
}
TEST_F(DevicePermissionsManagerTest, PermissionMessages) {
- base::string16 empty;
- base::string16 product(base::ASCIIToUTF16("Widget"));
- base::string16 manufacturer(base::ASCIIToUTF16("ACME"));
- base::string16 serial_number(base::ASCIIToUTF16("A"));
+ std::u16string empty;
+ std::u16string product(u"Widget");
+ std::u16string manufacturer(u"ACME");
+ std::u16string serial_number(u"A");
- EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0001 from vendor 0000"),
+ EXPECT_EQ(u"Unknown product 0001 from vendor 0000",
DevicePermissionsManager::GetPermissionMessage(
0x0000, 0x0001, empty, empty, empty, false));
EXPECT_EQ(base::ASCIIToUTF16(
"Unknown product 0001 from vendor 0000 (serial number A)"),
DevicePermissionsManager::GetPermissionMessage(
- 0x0000, 0x0001, empty, empty, base::ASCIIToUTF16("A"), false));
+ 0x0000, 0x0001, empty, empty, u"A", false));
- EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0001 from Google Inc."),
+ EXPECT_EQ(u"Unknown product 0001 from Google Inc.",
DevicePermissionsManager::GetPermissionMessage(
0x18D1, 0x0001, empty, empty, empty, false));
@@ -360,44 +359,42 @@ TEST_F(DevicePermissionsManagerTest, PermissionMessages) {
DevicePermissionsManager::GetPermissionMessage(
0x18D1, 0x0001, empty, empty, serial_number, false));
- EXPECT_EQ(base::ASCIIToUTF16("Nexus One from Google Inc."),
+ EXPECT_EQ(u"Nexus One from Google Inc.",
DevicePermissionsManager::GetPermissionMessage(
0x18D1, 0x4E11, empty, empty, empty, true));
- EXPECT_EQ(base::ASCIIToUTF16("Nexus One from Google Inc. (serial number A)"),
+ EXPECT_EQ(u"Nexus One from Google Inc. (serial number A)",
DevicePermissionsManager::GetPermissionMessage(
0x18D1, 0x4E11, empty, empty, serial_number, true));
- EXPECT_EQ(base::ASCIIToUTF16("Nexus One"),
- DevicePermissionsManager::GetPermissionMessage(
- 0x18D1, 0x4E11, empty, empty, empty, false));
+ EXPECT_EQ(u"Nexus One", DevicePermissionsManager::GetPermissionMessage(
+ 0x18D1, 0x4E11, empty, empty, empty, false));
- EXPECT_EQ(base::ASCIIToUTF16("Nexus One (serial number A)"),
+ EXPECT_EQ(u"Nexus One (serial number A)",
DevicePermissionsManager::GetPermissionMessage(
0x18D1, 0x4E11, empty, empty, serial_number, false));
- EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0001 from ACME"),
+ EXPECT_EQ(u"Unknown product 0001 from ACME",
DevicePermissionsManager::GetPermissionMessage(
0x0000, 0x0001, manufacturer, empty, empty, false));
- EXPECT_EQ(
- base::ASCIIToUTF16("Unknown product 0001 from ACME (serial number A)"),
- DevicePermissionsManager::GetPermissionMessage(
- 0x0000, 0x0001, manufacturer, empty, serial_number, false));
+ EXPECT_EQ(u"Unknown product 0001 from ACME (serial number A)",
+ DevicePermissionsManager::GetPermissionMessage(
+ 0x0000, 0x0001, manufacturer, empty, serial_number, false));
- EXPECT_EQ(base::ASCIIToUTF16("Widget from ACME"),
+ EXPECT_EQ(u"Widget from ACME",
DevicePermissionsManager::GetPermissionMessage(
0x0001, 0x0000, manufacturer, product, empty, true));
- EXPECT_EQ(base::ASCIIToUTF16("Widget from ACME (serial number A)"),
+ EXPECT_EQ(u"Widget from ACME (serial number A)",
DevicePermissionsManager::GetPermissionMessage(
0x0001, 0x0000, manufacturer, product, serial_number, true));
- EXPECT_EQ(base::ASCIIToUTF16("Widget"),
+ EXPECT_EQ(u"Widget",
DevicePermissionsManager::GetPermissionMessage(
0x0001, 0x0000, manufacturer, product, empty, false));
- EXPECT_EQ(base::ASCIIToUTF16("Widget (serial number A)"),
+ EXPECT_EQ(u"Widget (serial number A)",
DevicePermissionsManager::GetPermissionMessage(
0x0001, 0x0000, manufacturer, product, serial_number, false));
}
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
index b20a75d494d..67e29a26213 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -19,14 +19,12 @@
#include "base/files/file_util.h"
#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
-#include "base/location.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_macros.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/task/cancelable_task_tracker.h"
@@ -59,9 +57,6 @@
#include "components/download/public/common/download_url_parameters.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host_view.h"
@@ -69,7 +64,6 @@
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_function_dispatcher.h"
#include "extensions/browser/extension_prefs.h"
-#include "extensions/browser/notification_types.h"
#include "extensions/browser/warning_service.h"
#include "extensions/common/permissions/permissions_data.h"
#include "net/base/filename_util.h"
@@ -85,6 +79,7 @@ using content::BrowserThread;
using content::DownloadManager;
using download::DownloadItem;
using download::DownloadPathReservationTracker;
+using extensions::mojom::APIPermissionID;
namespace download_extension_errors {
@@ -696,8 +691,8 @@ class ExtensionDownloadsEventRouterData : public base::SupportsUserData::Data {
// should be lower priority than any actual onDeterminingFilename listeners.
// Ensure that the callback is called within a time limit.
- weak_ptr_factory_.reset(
- new base::WeakPtrFactory<ExtensionDownloadsEventRouterData>(this));
+ weak_ptr_factory_ = std::make_unique<
+ base::WeakPtrFactory<ExtensionDownloadsEventRouterData>>(this);
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::BindOnce(
@@ -867,8 +862,8 @@ class ExtensionDownloadsEventRouterData : public base::SupportsUserData::Data {
// kTooManyListeners. After a few seconds, DetermineFilename will return
// kUnexpectedDeterminer instead of kTooManyListeners so that determiners_
// doesn't keep hogging memory.
- weak_ptr_factory_.reset(
- new base::WeakPtrFactory<ExtensionDownloadsEventRouterData>(this));
+ weak_ptr_factory_ = std::make_unique<
+ base::WeakPtrFactory<ExtensionDownloadsEventRouterData>>(this);
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::BindOnce(
@@ -1114,8 +1109,7 @@ void DownloadsDownloadFunction::OnStarted(
ExtensionDownloadsEventRouterData::Get(item);
if (!data) {
data = new ExtensionDownloadsEventRouterData(
- item, std::unique_ptr<base::DictionaryValue>(
- new base::DictionaryValue()));
+ item, std::make_unique<base::DictionaryValue>());
}
data->CreatorSuggestedFilename(
creator_suggested_filename, creator_conflict_action);
@@ -1438,7 +1432,7 @@ ExtensionFunction::ResponseAction DownloadsOpenFunction::Run() {
Fault(download_item->GetState() != DownloadItem::COMPLETE,
download_extension_errors::kNotComplete, &error) ||
Fault(!extension()->permissions_data()->HasAPIPermission(
- APIPermission::kDownloadsOpen),
+ APIPermissionID::kDownloadsOpen),
download_extension_errors::kOpenPermission, &error)) {
return RespondNow(Error(std::move(error)));
}
@@ -1455,7 +1449,7 @@ ExtensionFunction::ResponseAction DownloadsOpenFunction::Run() {
if (GetSenderWebContents() &&
GetSenderWebContents()->HasRecentInteractiveInputEvent() &&
!extension()->permissions_data()->HasAPIPermission(
- APIPermission::kDebugger)) {
+ APIPermissionID::kDebugger)) {
download_item->OpenDownload();
return RespondNow(NoArguments());
}
@@ -1502,7 +1496,7 @@ ExtensionFunction::ResponseAction DownloadsSetShelfEnabledFunction::Run() {
EXTENSION_FUNCTION_VALIDATE(params.get());
// TODO(devlin): Solve this with the feature system.
if (!extension()->permissions_data()->HasAPIPermission(
- APIPermission::kDownloadsShelf)) {
+ APIPermissionID::kDownloadsShelf)) {
return RespondNow(Error(download_extension_errors::kShelfPermission));
}
@@ -1611,7 +1605,7 @@ ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
: profile_(profile), notifier_(manager, this) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(profile_);
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
EventRouter* router = EventRouter::Get(profile_);
if (router)
router->RegisterObserver(this,
@@ -1875,8 +1869,7 @@ void ExtensionDownloadsEventRouter::OnDownloadUpdated(
// The download_item probably transitioned from temporary to not temporary,
// or else an event listener was added.
data = new ExtensionDownloadsEventRouterData(
- download_item,
- std::unique_ptr<base::DictionaryValue>(new base::DictionaryValue()));
+ download_item, std::make_unique<base::DictionaryValue>());
}
std::unique_ptr<base::DictionaryValue> new_json;
std::unique_ptr<base::DictionaryValue> delta(new base::DictionaryValue());
@@ -1989,15 +1982,6 @@ void ExtensionDownloadsEventRouter::DispatchEvent(
restrict_to_browser_context);
event->will_dispatch_callback = std::move(will_dispatch_callback);
EventRouter::Get(profile_)->BroadcastEvent(std::move(event));
- DownloadsNotificationSource notification_source;
- notification_source.event_name = event_name;
- notification_source.profile = profile_;
- content::Source<DownloadsNotificationSource> content_source(
- &notification_source);
- content::NotificationService::current()->Notify(
- extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
- content_source,
- content::Details<std::string>(&json_args));
}
void ExtensionDownloadsEventRouter::OnExtensionUnloaded(
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api.h b/chromium/chrome/browser/extensions/api/downloads/downloads_api.h
index 30c89bfeac9..38fdac1f080 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api.h
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api.h
@@ -11,7 +11,7 @@
#include "base/files/file_path.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "chrome/browser/download/download_danger_prompt.h"
#include "chrome/common/extensions/api/downloads.h"
@@ -365,12 +365,6 @@ class ExtensionDownloadsEventRouter
// extensions::EventRouter::Observer.
void OnListenerRemoved(const extensions::EventListenerInfo& details) override;
- // Used for testing.
- struct DownloadsNotificationSource {
- std::string event_name;
- Profile* profile;
- };
-
void CheckForHistoryFilesRemoval();
private:
@@ -392,9 +386,9 @@ class ExtensionDownloadsEventRouter
base::Time last_checked_removal_;
// Listen to extension unloaded notifications.
- ScopedObserver<extensions::ExtensionRegistry,
- extensions::ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<extensions::ExtensionRegistry,
+ extensions::ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ExtensionDownloadsEventRouter);
};
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index a654861847e..96f3b23d83c 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -7,6 +7,7 @@
#include <stdint.h>
#include <algorithm>
+#include <memory>
#include "base/bind.h"
#include "base/callback_helpers.h"
@@ -16,6 +17,7 @@
#include "base/json/json_reader.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
+#include "base/scoped_observation.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
#include "base/test/bind.h"
@@ -48,7 +50,6 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/download_manager.h"
-#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/storage_partition.h"
@@ -61,7 +62,6 @@
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/event_router.h"
-#include "extensions/browser/notification_types.h"
#include "extensions/common/manifest_handlers/incognito_info.h"
#include "net/base/data_url.h"
#include "net/dns/mock_host_resolver.h"
@@ -114,20 +114,12 @@ void OnOpenPromptCreated(download::DownloadItem* item,
base::Unretained(prompt)));
}
-class DownloadsEventsListener : public content::NotificationObserver {
+class DownloadsEventsListener : public EventRouter::TestObserver {
public:
- DownloadsEventsListener()
- : waiting_(false) {
- registrar_.Add(this,
- extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
- content::NotificationService::AllSources());
- }
+ explicit DownloadsEventsListener(Profile* profile)
+ : waiting_(false), profile_(profile) {}
- ~DownloadsEventsListener() override {
- registrar_.Remove(this,
- extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
- content::NotificationService::AllSources());
- }
+ ~DownloadsEventsListener() override = default;
void ClearEvents() { events_.clear(); }
@@ -135,12 +127,11 @@ class DownloadsEventsListener : public content::NotificationObserver {
public:
Event(Profile* profile,
const std::string& event_name,
- const std::string& json_args,
+ const base::Value& args,
base::Time caught)
: profile_(profile),
event_name_(event_name),
- json_args_(json_args),
- args_(base::JSONReader::ReadDeprecated(json_args).release()),
+ args_(args.Clone()),
caught_(caught) {}
const base::Time& caught() { return caught_; }
@@ -150,95 +141,83 @@ class DownloadsEventsListener : public content::NotificationObserver {
}
bool SatisfiedBy(const Event& other) const {
- if ((profile_ != other.profile_) ||
+ // Only match profile iff restrict_to_browser_context is non-null when
+ // the event is dispatched from
+ // ExtensionDownloadsEventRouter::DispatchEvent. Event names always have
+ // to match.
+ if ((profile_ && other.profile_ && profile_ != other.profile_) ||
(event_name_ != other.event_name_))
return false;
+
if (((event_name_ == downloads::OnDeterminingFilename::kEventName) ||
(event_name_ == downloads::OnCreated::kEventName) ||
- (event_name_ == downloads::OnChanged::kEventName)) &&
- args_.get() && other.args_.get()) {
- base::ListValue* left_list = NULL;
- base::DictionaryValue* left_dict = NULL;
- base::ListValue* right_list = NULL;
- base::DictionaryValue* right_dict = NULL;
- if (!args_->GetAsList(&left_list) ||
- !other.args_->GetAsList(&right_list) ||
- !left_list->GetDictionary(0, &left_dict) ||
- !right_list->GetDictionary(0, &right_dict))
+ (event_name_ == downloads::OnChanged::kEventName))) {
+ // We expect a non-empty list for these events.
+ if (!args_.is_list() || !other.args_.is_list() ||
+ args_.GetList().empty() || other.args_.GetList().empty())
+ return false;
+ const base::Value& left_dict = args_.GetList()[0];
+ const base::Value& right_dict = other.args_.GetList()[0];
+ if (!left_dict.is_dict() || !right_dict.is_dict())
return false;
- for (base::DictionaryValue::Iterator iter(*left_dict);
- !iter.IsAtEnd(); iter.Advance()) {
- base::Value* right_value = NULL;
- if (!right_dict->HasKey(iter.key()) ||
- (right_dict->Get(iter.key(), &right_value) &&
- !iter.value().Equals(right_value))) {
+ // Expect that all keys present in both dictionaries are equal. If a key
+ // is only present in one of the dictionaries, ignore it. This allows us
+ // to verify the properties we care about in the test without needing to
+ // specify each.
+ for (const auto& it : left_dict.DictItems()) {
+ const base::Value* right_value = right_dict.FindKey(it.first);
+ if (!right_value || *right_value != it.second)
return false;
- }
}
return true;
- } else if ((event_name_ == downloads::OnErased::kEventName) &&
- args_.get() && other.args_.get()) {
- int my_id = -1, other_id = -1;
- return (args_->GetAsInteger(&my_id) &&
- other.args_->GetAsInteger(&other_id) &&
- my_id == other_id);
}
- return json_args_ == other.json_args_;
+ return args_ == other.args_;
}
std::string Debug() {
- return base::StringPrintf("Event(%p, %s, %s, %f)",
- profile_,
- event_name_.c_str(),
- json_args_.c_str(),
- caught_.ToJsTime());
+ return base::StringPrintf("Event(%p, %s, %f)", profile_,
+ event_name_.c_str(), caught_.ToJsTime());
}
private:
Profile* profile_;
std::string event_name_;
std::string json_args_;
- std::unique_ptr<base::Value> args_;
+ base::Value args_;
base::Time caught_;
DISALLOW_COPY_AND_ASSIGN(Event);
};
- typedef ExtensionDownloadsEventRouter::DownloadsNotificationSource
- DownloadsNotificationSource;
-
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override {
- switch (type) {
- case extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT: {
- DownloadsNotificationSource* dns =
- content::Source<DownloadsNotificationSource>(source).ptr();
- Event* new_event = new Event(
- dns->profile, dns->event_name,
- *content::Details<std::string>(details).ptr(), base::Time::Now());
- events_.push_back(base::WrapUnique(new_event));
- if (waiting_ &&
- waiting_for_.get() &&
- new_event->Satisfies(*waiting_for_)) {
- waiting_ = false;
- base::RunLoop::QuitCurrentWhenIdleDeprecated();
- }
- break;
- }
- default:
- NOTREACHED();
+ // extensions::EventRouter::TestObserver:
+ void OnWillDispatchEvent(const extensions::Event& event) override {
+ // TestObserver receives notifications for all events but only needs to
+ // check download events.
+ if (!base::StartsWith(event.event_name, "downloads"))
+ return;
+
+ Event* new_event = new Event(
+ Profile::FromBrowserContext(event.restrict_to_browser_context),
+ event.event_name, *event.event_args.get(), base::Time::Now());
+ events_.push_back(base::WrapUnique(new_event));
+ if (waiting_ && waiting_for_.get() && new_event->Satisfies(*waiting_for_)) {
+ waiting_ = false;
+ base::RunLoop::QuitCurrentWhenIdleDeprecated();
}
}
+ // extensions::EventRouter::TestObserver:
+ void OnDidDispatchEventToProcess(const extensions::Event& event) override {}
+
bool WaitFor(Profile* profile,
const std::string& event_name,
const std::string& json_args) {
- waiting_for_.reset(new Event(profile, event_name, json_args, base::Time()));
+ base::Value args = base::JSONReader::Read(json_args).value();
+ waiting_for_ =
+ std::make_unique<Event>(profile, event_name, args, base::Time());
for (const auto& event : events_) {
- if (event->Satisfies(*waiting_for_)) {
+ if (event->Satisfies(*waiting_for_))
return true;
- }
}
waiting_ = true;
content::RunMessageLoop();
@@ -262,14 +241,16 @@ class DownloadsEventsListener : public content::NotificationObserver {
return success;
}
+ void UpdateProfile(Profile* profile) { profile_ = profile; }
+
base::circular_deque<std::unique_ptr<Event>>* events() { return &events_; }
private:
bool waiting_;
base::Time last_wait_;
std::unique_ptr<Event> waiting_for_;
- content::NotificationRegistrar registrar_;
base::circular_deque<std::unique_ptr<Event>> events_;
+ Profile* profile_;
DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener);
};
@@ -277,9 +258,8 @@ class DownloadsEventsListener : public content::NotificationObserver {
// Object waiting for a download open event.
class DownloadOpenObserver : public download::DownloadItem::Observer {
public:
- explicit DownloadOpenObserver(download::DownloadItem* item)
- : open_observer_(this), item_(item) {
- open_observer_.Add(item);
+ explicit DownloadOpenObserver(download::DownloadItem* item) : item_(item) {
+ open_observation_.Observe(item);
}
~DownloadOpenObserver() override = default;
@@ -300,12 +280,14 @@ class DownloadOpenObserver : public download::DownloadItem::Observer {
}
void OnDownloadDestroyed(download::DownloadItem* item) override {
- open_observer_.Remove(item);
+ DCHECK(open_observation_.IsObservingSource(item));
+ open_observation_.Reset();
item_ = nullptr;
}
- ScopedObserver<download::DownloadItem, download::DownloadItem::Observer>
- open_observer_;
+ base::ScopedObservation<download::DownloadItem,
+ download::DownloadItem::Observer>
+ open_observation_{this};
download::DownloadItem* item_;
base::OnceClosure completion_closure_;
@@ -385,7 +367,11 @@ class DownloadExtensionTest : public ExtensionApiTest {
GoOnTheRecord();
current_browser()->profile()->GetPrefs()->SetBoolean(
prefs::kPromptForDownload, false);
- events_listener_.reset(new DownloadsEventsListener());
+ // Create event listener using current profile.
+ events_listener_ =
+ std::make_unique<DownloadsEventsListener>(current_browser()->profile());
+ extensions::EventRouter::Get(current_browser()->profile())
+ ->AddObserverForTesting(events_listener());
// Disable file chooser for current profile.
DownloadTestFileActivityObserver observer(current_browser()->profile());
observer.EnableFileChooser(false);
@@ -400,7 +386,18 @@ class DownloadExtensionTest : public ExtensionApiTest {
host_resolver()->AddRule("*", "127.0.0.1");
}
- void GoOnTheRecord() { current_browser_ = browser(); }
+ // InProcessBrowserTest
+ void TearDownOnMainThread() override {
+ EventRouter::Get(current_browser()->profile())
+ ->RemoveObserverForTesting(events_listener_.get());
+ ExtensionApiTest::TearDownOnMainThread();
+ }
+
+ void GoOnTheRecord() {
+ current_browser_ = browser();
+ if (events_listener_.get())
+ events_listener_->UpdateProfile(current_browser()->profile());
+ }
void GoOffTheRecord() {
if (!incognito_browser_) {
@@ -410,6 +407,8 @@ class DownloadExtensionTest : public ExtensionApiTest {
observer.EnableFileChooser(false);
}
current_browser_ = incognito_browser_;
+ if (events_listener_.get())
+ events_listener_->UpdateProfile(current_browser()->profile());
}
bool WaitFor(const std::string& event_name, const std::string& json_args) {
@@ -1450,9 +1449,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
ASSERT_EQ(1UL, result_list->GetSize());
base::DictionaryValue* item_value = NULL;
ASSERT_TRUE(result_list->GetDictionary(0, &item_value));
- base::FilePath::StringType item_name;
+ std::string item_name;
ASSERT_TRUE(item_value->GetString("filename", &item_name));
- ASSERT_EQ(items[2]->GetTargetFilePath().value(), item_name);
+ ASSERT_EQ(items[2]->GetTargetFilePath().AsUTF8Unsafe(), item_name);
}
// Test that incognito downloads are only visible in incognito contexts, and
@@ -1465,7 +1464,7 @@ IN_PROC_BROWSER_TEST_F(
std::unique_ptr<base::Value> result_value;
base::ListValue* result_list = NULL;
base::DictionaryValue* result_dict = NULL;
- base::FilePath::StringType filename;
+ std::string filename;
bool is_incognito = false;
std::string error;
std::string on_item_arg;
@@ -1498,12 +1497,14 @@ IN_PROC_BROWSER_TEST_F(
ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
ASSERT_TRUE(result_dict->GetString("filename", &filename));
ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
- EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
+ EXPECT_TRUE(on_item->GetTargetFilePath() ==
+ base::FilePath::FromUTF8Unsafe(filename));
EXPECT_FALSE(is_incognito);
ASSERT_TRUE(result_list->GetDictionary(1, &result_dict));
ASSERT_TRUE(result_dict->GetString("filename", &filename));
ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
- EXPECT_TRUE(off_item->GetTargetFilePath() == base::FilePath(filename));
+ EXPECT_TRUE(off_item->GetTargetFilePath() ==
+ base::FilePath::FromUTF8Unsafe(filename));
EXPECT_TRUE(is_incognito);
// Extensions running in the on-record window should have access only to the
@@ -1516,7 +1517,8 @@ IN_PROC_BROWSER_TEST_F(
ASSERT_EQ(1UL, result_list->GetSize());
ASSERT_TRUE(result_list->GetDictionary(0, &result_dict));
ASSERT_TRUE(result_dict->GetString("filename", &filename));
- EXPECT_TRUE(on_item->GetTargetFilePath() == base::FilePath(filename));
+ EXPECT_TRUE(on_item->GetTargetFilePath() ==
+ base::FilePath::FromUTF8Unsafe(filename));
ASSERT_TRUE(result_dict->GetBoolean("incognito", &is_incognito));
EXPECT_FALSE(is_incognito);
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
index eff7bf7ddfb..9c057212fae 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/downloads/downloads_api.h"
+#include <memory>
+
#include "base/bind.h"
#include "base/macros.h"
#include "chrome/browser/download/download_core_service_factory.h"
@@ -45,8 +47,8 @@ class TestDownloadCoreService : public DownloadCoreServiceImpl {
ExtensionDownloadsEventRouter* GetExtensionEventRouter() override {
if (!router_.get()) {
- router_.reset(new ExtensionDownloadsEventRouter(
- profile_, content::BrowserContext::GetDownloadManager(profile_)));
+ router_ = std::make_unique<ExtensionDownloadsEventRouter>(
+ profile_, content::BrowserContext::GetDownloadManager(profile_));
}
return router_.get();
}
@@ -68,7 +70,7 @@ class DownloadsApiUnitTest : public ExtensionApiUnittest {
void SetUp() override {
ExtensionApiUnittest::SetUp();
- manager_.reset(new testing::StrictMock<MockDownloadManager>());
+ manager_ = std::make_unique<testing::StrictMock<MockDownloadManager>>();
EXPECT_CALL(*manager_, IsManagerInitialized());
EXPECT_CALL(*manager_, AddObserver(testing::_))
.WillOnce(testing::SaveArg<0>(&download_history_manager_observer_));
diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/DIR_METADATA b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/DIR_METADATA
index 3ecb4771a12..07b250ad60f 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise"
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.cc b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.cc
index 3084c800eeb..095dc6c1c91 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_lacros.cc
@@ -21,8 +21,10 @@ const char kUnsupportedProfile[] = "Not available.";
// error, or empty string on success. |context| is the browser context in which
// the extension is hosted.
std::string ValidateCrosapi(content::BrowserContext* context) {
- if (!chromeos::LacrosChromeServiceImpl::Get()->IsDeviceAttributesAvailable())
+ if (!chromeos::LacrosChromeServiceImpl::Get()
+ ->IsAvailable<crosapi::mojom::DeviceAttributes>()) {
return kUnsupportedByAsh;
+ }
// These APIs are used in security-sensitive contexts. We need to ensure that
// the user for ash is the same as the user for lacros. We do this by
@@ -75,7 +77,7 @@ EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction::Run() {
this);
chromeos::LacrosChromeServiceImpl::Get()
- ->device_attributes_remote()
+ ->GetRemote<crosapi::mojom::DeviceAttributes>()
->GetDirectoryDeviceId(std::move(cb));
return RespondLater();
}
@@ -107,7 +109,7 @@ EnterpriseDeviceAttributesGetDeviceSerialNumberFunction::Run() {
this);
chromeos::LacrosChromeServiceImpl::Get()
- ->device_attributes_remote()
+ ->GetRemote<crosapi::mojom::DeviceAttributes>()
->GetDeviceSerialNumber(std::move(cb));
return RespondLater();
}
@@ -139,7 +141,7 @@ EnterpriseDeviceAttributesGetDeviceAssetIdFunction::Run() {
this);
chromeos::LacrosChromeServiceImpl::Get()
- ->device_attributes_remote()
+ ->GetRemote<crosapi::mojom::DeviceAttributes>()
->GetDeviceAssetId(std::move(cb));
return RespondLater();
}
@@ -172,7 +174,7 @@ EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction::Run() {
this);
chromeos::LacrosChromeServiceImpl::Get()
- ->device_attributes_remote()
+ ->GetRemote<crosapi::mojom::DeviceAttributes>()
->GetDeviceAnnotatedLocation(std::move(cb));
return RespondLater();
}
@@ -204,7 +206,7 @@ EnterpriseDeviceAttributesGetDeviceHostnameFunction::Run() {
this);
chromeos::LacrosChromeServiceImpl::Get()
- ->device_attributes_remote()
+ ->GetRemote<crosapi::mojom::DeviceAttributes>()
->GetDeviceHostname(std::move(cb));
return RespondLater();
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
index 49d6c2d1c58..3047fc98dd9 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
@@ -129,9 +129,9 @@ INSTANTIATE_TEST_SUITE_P(AffiliationCheck,
IN_PROC_BROWSER_TEST_F(
ExtensionApiTest,
EnterpriseDeviceAttributesIsRestrictedToPolicyExtension) {
- ASSERT_TRUE(RunExtensionSubtest("enterprise_device_attributes",
- "api_not_available.html",
- kFlagIgnoreManifestWarnings, kFlagNone));
+ ASSERT_TRUE(RunExtensionTest({.name = "enterprise_device_attributes",
+ .page_url = "api_not_available.html"},
+ {.ignore_manifest_warnings = true}));
base::FilePath extension_path =
test_data_dir_.AppendASCII("enterprise_device_attributes");
diff --git a/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/DIR_METADATA b/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/DIR_METADATA
index 3ecb4771a12..e94cabd169a 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise>Networking"
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_apitest.cc b/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_apitest.cc
index 5dcbdb4a728..971ec57945b 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_networking_attributes/enterprise_networking_attributes_apitest.cc
@@ -14,6 +14,7 @@
#include "chromeos/dbus/shill/shill_profile_client.h"
#include "chromeos/dbus/shill/shill_service_client.h"
#include "content/public/test/browser_test.h"
+#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
#include "url/gurl.h"
namespace {
@@ -192,9 +193,9 @@ INSTANTIATE_TEST_SUITE_P(AffiliationCheck,
IN_PROC_BROWSER_TEST_F(
ExtensionApiTest,
EnterpriseNetworkingAttributesIsRestrictedToPolicyExtension) {
- ASSERT_TRUE(RunExtensionSubtest("enterprise_networking_attributes",
- "api_not_available.html",
- kFlagIgnoreManifestWarnings, kFlagNone));
+ ASSERT_TRUE(RunExtensionTest({.name = "enterprise_networking_attributes",
+ .page_url = "api_not_available.html"},
+ {.ignore_manifest_warnings = true}));
base::FilePath extension_path =
test_data_dir_.AppendASCII("enterprise_networking_attributes");
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/DIR_METADATA b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/DIR_METADATA
index 3ecb4771a12..69ef05a819e 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise>Certificates"
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
new file mode 100644
index 00000000000..35c3ec60f20
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
@@ -0,0 +1,39 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file contains code that is shared between Ash and Lacros.
+// Lacros/Ash-specific counterparts are implemented in separate files.
+
+#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h"
+
+#include "base/values.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
+
+namespace extensions {
+namespace platform_keys {
+
+void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
+ registry->RegisterListPref(prefs::kAttestationExtensionAllowlist);
+}
+
+bool IsExtensionAllowed(Profile* profile, const Extension* extension) {
+ if (Manifest::IsComponentLocation(extension->location())) {
+ // Note: For this to even be called, the component extension must also be
+ // allowed in chrome/common/extensions/api/_permission_features.json
+ return true;
+ }
+ const base::ListValue* list =
+ profile->GetPrefs()->GetList(prefs::kAttestationExtensionAllowlist);
+ DCHECK_NE(list, nullptr);
+ base::Value value(extension->id());
+ return list->Find(value) != list->end();
+}
+
+} // namespace platform_keys
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
index 7a9c0e39857..a79f1998119 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
@@ -17,4 +17,21 @@
#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h"
#endif
+class Extension;
+class Profile;
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+} // namespace user_prefs
+
+namespace extensions {
+namespace platform_keys {
+
+void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+bool IsExtensionAllowed(Profile* profile, const Extension* extension);
+
+} // namespace platform_keys
+} // namespace extensions
+
#endif // CHROME_BROWSER_EXTENSIONS_API_ENTERPRISE_PLATFORM_KEYS_ENTERPRISE_PLATFORM_KEYS_API_H_
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
index 7df1183dc65..eae099ab03d 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
@@ -295,7 +295,7 @@ EnterprisePlatformKeysChallengeMachineKeyFunction::Run() {
std::unique_ptr<api_epk::ChallengeMachineKey::Params> params(
api_epk::ChallengeMachineKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- chromeos::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
+ ash::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
&EnterprisePlatformKeysChallengeMachineKeyFunction::OnChallengedKey,
this);
// base::Unretained is safe on impl_ since its life-cycle matches |this| and
@@ -310,7 +310,7 @@ EnterprisePlatformKeysChallengeMachineKeyFunction::Run() {
}
void EnterprisePlatformKeysChallengeMachineKeyFunction::OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result) {
+ const ash::attestation::TpmChallengeKeyResult& result) {
if (result.IsSuccess()) {
Respond(ArgumentList(api_epk::ChallengeMachineKey::Results::Create(
VectorFromString(result.challenge_response))));
@@ -330,7 +330,7 @@ EnterprisePlatformKeysChallengeUserKeyFunction::Run() {
std::unique_ptr<api_epk::ChallengeUserKey::Params> params(
api_epk::ChallengeUserKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- chromeos::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
+ ash::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
&EnterprisePlatformKeysChallengeUserKeyFunction::OnChallengedKey, this);
// base::Unretained is safe on impl_ since its life-cycle matches |this| and
// |callback| holds a reference to |this|.
@@ -344,7 +344,7 @@ EnterprisePlatformKeysChallengeUserKeyFunction::Run() {
}
void EnterprisePlatformKeysChallengeUserKeyFunction::OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result) {
+ const ash::attestation::TpmChallengeKeyResult& result) {
if (result.IsSuccess()) {
Respond(ArgumentList(api_epk::ChallengeUserKey::Results::Create(
VectorFromString(result.challenge_response))));
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h
index c66964f21a2..df708377e57 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.h
@@ -102,8 +102,7 @@ class EnterprisePlatformKeysChallengeMachineKeyFunction
ResponseAction Run() override;
// Called when the challenge operation is complete.
- void OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result);
+ void OnChallengedKey(const ash::attestation::TpmChallengeKeyResult& result);
EPKPChallengeKey impl_;
@@ -121,8 +120,7 @@ class EnterprisePlatformKeysChallengeUserKeyFunction
ResponseAction Run() override;
// Called when the challenge operation is complete.
- void OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result);
+ void OnChallengedKey(const ash::attestation::TpmChallengeKeyResult& result);
EPKPChallengeKey impl_;
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc
index 48f2ee538a5..83332c15b9d 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_lacros.cc
@@ -12,6 +12,7 @@
#include "base/bind.h"
#include "base/numerics/safe_conversions.h"
#include "base/optional.h"
+#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h"
#include "chrome/browser/extensions/api/platform_keys/platform_keys_api.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/enterprise_platform_keys.h"
@@ -50,6 +51,8 @@ const char kUnsupportedSigning[] = "Unsupported signing algorithm.";
const char kUnsupportedSigningInput[] =
"Unsupported input for signing algorithm.";
const char kInvalidKeystoreType[] = "Invalid keystore type.";
+const char kExtensionDoesNotHavePermission[] =
+ "The extension does not have permission to call this function.";
// Performs common crosapi validation. These errors are not caused by the
// extension so they are considered recoverable. Returns an error message on
@@ -157,7 +160,7 @@ EnterprisePlatformKeysInternalGenerateKeyFunction::Run() {
&EnterprisePlatformKeysInternalGenerateKeyFunction::OnGenerateKey, this);
chromeos::LacrosChromeServiceImpl::Get()
->keystore_service_remote()
- ->GenerateKey(keystore, std::move(signing), std::move(c));
+ ->GenerateKey(keystore, std::move(signing), extension_id(), std::move(c));
return RespondLater();
}
@@ -338,8 +341,18 @@ EnterprisePlatformKeysChallengeMachineKeyFunction::Run() {
std::unique_ptr<api_epk::ChallengeMachineKey::Params> params(
api_epk::ChallengeMachineKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- // TODO(https://crbug.com/1113443): This implementation needs to check if the
- // extension is allowlisted via the AttestationExtensionAllowlist policy.
+
+ const std::string error = ValidateCrosapi(
+ KeystoreService::kChallengeAttestationOnlyKeystoreMinVersion,
+ browser_context());
+ if (!error.empty())
+ return RespondNow(Error(error));
+
+ if (!platform_keys::IsExtensionAllowed(
+ Profile::FromBrowserContext(browser_context()), extension())) {
+ return RespondNow(Error(kExtensionDoesNotHavePermission));
+ }
+
auto c = base::BindOnce(&EnterprisePlatformKeysChallengeMachineKeyFunction::
OnChallengeAttestationOnlyKeystore,
this);
@@ -373,15 +386,17 @@ EnterprisePlatformKeysChallengeUserKeyFunction::Run() {
api_epk::ChallengeUserKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- std::string error = ValidateCrosapi(
+ const std::string error = ValidateCrosapi(
KeystoreService::kChallengeAttestationOnlyKeystoreMinVersion,
browser_context());
- if (!error.empty()) {
+ if (!error.empty())
return RespondNow(Error(error));
+
+ if (!platform_keys::IsExtensionAllowed(
+ Profile::FromBrowserContext(browser_context()), extension())) {
+ return RespondNow(Error(kExtensionDoesNotHavePermission));
}
- // TODO(https://crbug.com/1113443): This implementation needs to check if the
- // extension is allowlisted via the AttestationExtensionAllowlist policy.
auto c = base::BindOnce(&EnterprisePlatformKeysChallengeUserKeyFunction::
OnChallengeAttestationOnlyKeystore,
this);
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
index 59d39228604..36cf4b4fe26 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
@@ -10,8 +10,8 @@
#include "base/memory/ptr_util.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/attestation/mock_tpm_challenge_key.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/attestation/mock_tpm_challenge_key.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/common/pref_names.h"
@@ -34,16 +34,15 @@ namespace {
const char kUserEmail[] = "test@google.com";
-void FakeRunCheckNotRegister(
- chromeos::attestation::AttestationKeyType key_type,
- Profile* profile,
- chromeos::attestation::TpmChallengeKeyCallback callback,
- const std::string& challenge,
- bool register_key,
- const std::string& key_name_for_spkac) {
+void FakeRunCheckNotRegister(chromeos::attestation::AttestationKeyType key_type,
+ Profile* profile,
+ ash::attestation::TpmChallengeKeyCallback callback,
+ const std::string& challenge,
+ bool register_key,
+ const std::string& key_name_for_spkac) {
EXPECT_FALSE(register_key);
std::move(callback).Run(
- chromeos::attestation::TpmChallengeKeyResult::MakeChallengeResponse(
+ ash::attestation::TpmChallengeKeyResult::MakeChallengeResponse(
"response"));
}
@@ -51,7 +50,7 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest {
protected:
EPKChallengeKeyTestBase()
: extension_(ExtensionBuilder("Test").Build()),
- fake_user_manager_(new chromeos::FakeChromeUserManager),
+ fake_user_manager_(new ash::FakeChromeUserManager),
user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {
stub_install_attributes_.SetCloudManaged("google.com", "device_id");
}
@@ -63,13 +62,13 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest {
}
void SetMockTpmChallenger() {
- auto mock_tpm_challenge_key = std::make_unique<
- NiceMock<chromeos::attestation::MockTpmChallengeKey>>();
+ auto mock_tpm_challenge_key =
+ std::make_unique<NiceMock<ash::attestation::MockTpmChallengeKey>>();
// Will be used with EXPECT_CALL.
mock_tpm_challenge_key_ = mock_tpm_challenge_key.get();
mock_tpm_challenge_key->EnableFake();
// transfer ownership inside factory
- chromeos::attestation::TpmChallengeKeyFactory::SetForTesting(
+ ash::attestation::TpmChallengeKeyFactory::SetForTesting(
std::move(mock_tpm_challenge_key));
}
@@ -123,10 +122,10 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest {
scoped_refptr<const extensions::Extension> extension_;
chromeos::StubInstallAttributes stub_install_attributes_;
// fake_user_manager_ is owned by user_manager_enabler_.
- chromeos::FakeChromeUserManager* fake_user_manager_ = nullptr;
+ ash::FakeChromeUserManager* fake_user_manager_ = nullptr;
user_manager::ScopedUserManager user_manager_enabler_;
PrefService* prefs_ = nullptr;
- chromeos::attestation::MockTpmChallengeKey* mock_tpm_challenge_key_ = nullptr;
+ ash::attestation::MockTpmChallengeKey* mock_tpm_challenge_key_ = nullptr;
};
class EPKChallengeMachineKeyTest : public EPKChallengeKeyTestBase {
@@ -167,9 +166,9 @@ TEST_F(EPKChallengeMachineKeyTest, ExtensionNotAllowed) {
base::ListValue empty_allowlist;
prefs_->Set(prefs::kAttestationExtensionAllowlist, empty_allowlist);
- EXPECT_EQ(chromeos::attestation::TpmChallengeKeyResult::
- kExtensionNotAllowedErrorMsg,
- RunFunctionAndReturnError(func_.get(), CreateArgs(), browser()));
+ EXPECT_EQ(
+ ash::attestation::TpmChallengeKeyResult::kExtensionNotAllowedErrorMsg,
+ RunFunctionAndReturnError(func_.get(), CreateArgs(), browser()));
}
TEST_F(EPKChallengeMachineKeyTest, Success) {
@@ -240,9 +239,9 @@ TEST_F(EPKChallengeUserKeyTest, ExtensionNotAllowed) {
base::ListValue empty_allowlist;
prefs_->Set(prefs::kAttestationExtensionAllowlist, empty_allowlist);
- EXPECT_EQ(chromeos::attestation::TpmChallengeKeyResult::
- kExtensionNotAllowedErrorMsg,
- RunFunctionAndReturnError(func_.get(), CreateArgs(), browser()));
+ EXPECT_EQ(
+ ash::attestation::TpmChallengeKeyResult::kExtensionNotAllowedErrorMsg,
+ RunFunctionAndReturnError(func_.get(), CreateArgs(), browser()));
}
} // namespace
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
index a614fbc4b98..348d9d88ed8 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
@@ -16,8 +16,8 @@
#include "base/stl_util.h"
#include "base/task/post_task.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/test/device_state_mixin.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/login/test/device_state_mixin.h"
#include "chrome/browser/chromeos/platform_keys/platform_keys_service_factory.h"
#include "chrome/browser/chromeos/scoped_test_system_nss_key_slot_mixin.h"
#include "chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h"
@@ -322,9 +322,9 @@ INSTANTIATE_TEST_SUITE_P(
// chrome.enterprise.platformKeys namespace.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
EnterprisePlatformKeysIsRestrictedToPolicyExtension) {
- ASSERT_TRUE(RunExtensionSubtest("enterprise_platform_keys",
- "api_not_available.html",
- kFlagIgnoreManifestWarnings, kFlagNone));
+ ASSERT_TRUE(RunExtensionTest({.name = "enterprise_platform_keys",
+ .page_url = "api_not_available.html"},
+ {.ignore_manifest_warnings = true}));
base::FilePath extension_path =
test_data_dir_.AppendASCII("enterprise_platform_keys");
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/DIR_METADATA b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/DIR_METADATA
index 3ecb4771a12..69ef05a819e 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise>Certificates"
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.cc
index f7c05db4afa..3017152738d 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.cc
@@ -7,9 +7,9 @@
#include "base/base64.h"
#include "base/bind.h"
#include "base/values.h"
+#include "chrome/browser/ash/attestation/tpm_challenge_key.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/attestation/tpm_challenge_key.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
+#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/enterprise_platform_keys_private.h"
#include "chrome/common/pref_names.h"
@@ -26,11 +26,6 @@ namespace api_epkp = api::enterprise_platform_keys_private;
EPKPChallengeKey::EPKPChallengeKey() = default;
EPKPChallengeKey::~EPKPChallengeKey() = default;
-void EPKPChallengeKey::RegisterProfilePrefs(
- user_prefs::PrefRegistrySyncable* registry) {
- registry->RegisterListPref(prefs::kAttestationExtensionAllowlist);
-}
-
// Check if the extension is allowisted in the user policy.
bool EPKPChallengeKey::IsExtensionAllowed(
Profile* profile,
@@ -41,41 +36,30 @@ bool EPKPChallengeKey::IsExtensionAllowed(
// TODO(drcrash): Use a separate device-wide policy for the API.
return Manifest::IsPolicyLocation(extension->location());
}
- if (Manifest::IsComponentLocation(extension->location())) {
- // Note: For this to even be called, the component extension must also be
- // allowed in chrome/common/extensions/api/_permission_features.json
- return true;
- }
- const base::ListValue* list =
- profile->GetPrefs()->GetList(prefs::kAttestationExtensionAllowlist);
- base::Value value(extension->id());
- return list->Find(value) != list->end();
+ return platform_keys::IsExtensionAllowed(profile, extension.get());
}
-void EPKPChallengeKey::Run(
- chromeos::attestation::AttestationKeyType type,
- scoped_refptr<ExtensionFunction> caller,
- chromeos::attestation::TpmChallengeKeyCallback callback,
- const std::string& challenge,
- bool register_key) {
- Profile* profile = ChromeExtensionFunctionDetails(caller.get()).GetProfile();
+void EPKPChallengeKey::Run(chromeos::attestation::AttestationKeyType type,
+ scoped_refptr<ExtensionFunction> caller,
+ ash::attestation::TpmChallengeKeyCallback callback,
+ const std::string& challenge,
+ bool register_key) {
+ Profile* profile = Profile::FromBrowserContext(caller->browser_context());
if (!IsExtensionAllowed(profile, caller->extension())) {
- std::move(callback).Run(
- chromeos::attestation::TpmChallengeKeyResult::MakeError(
- chromeos::attestation::TpmChallengeKeyResultCode::
- kExtensionNotAllowedError));
+ std::move(callback).Run(ash::attestation::TpmChallengeKeyResult::MakeError(
+ ash::attestation::TpmChallengeKeyResultCode::
+ kExtensionNotAllowedError));
return;
}
std::string key_name_for_spkac;
if (register_key && (type == chromeos::attestation::KEY_DEVICE)) {
- key_name_for_spkac =
- chromeos::attestation::kEnterpriseMachineKeyForSpkacPrefix +
- caller->extension()->id();
+ key_name_for_spkac = ash::attestation::kEnterpriseMachineKeyForSpkacPrefix +
+ caller->extension()->id();
}
- impl_ = chromeos::attestation::TpmChallengeKeyFactory::Create();
+ impl_ = ash::attestation::TpmChallengeKeyFactory::Create();
impl_->BuildResponse(type, profile, std::move(callback), challenge,
register_key, key_name_for_spkac);
}
@@ -91,16 +75,15 @@ EnterprisePlatformKeysPrivateChallengeMachineKeyFunction::Run() {
std::unique_ptr<api_epkp::ChallengeMachineKey::Params> params(
api_epkp::ChallengeMachineKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- chromeos::attestation::TpmChallengeKeyCallback callback =
+ ash::attestation::TpmChallengeKeyCallback callback =
base::BindOnce(&EnterprisePlatformKeysPrivateChallengeMachineKeyFunction::
OnChallengedKey,
this);
std::string challenge;
if (!base::Base64Decode(params->challenge, &challenge)) {
- auto result = chromeos::attestation::TpmChallengeKeyResult::MakeError(
- chromeos::attestation::TpmChallengeKeyResultCode::
- kChallengeBadBase64Error);
+ auto result = ash::attestation::TpmChallengeKeyResult::MakeError(
+ ash::attestation::TpmChallengeKeyResultCode::kChallengeBadBase64Error);
return RespondNow(Error(result.GetErrorMessage()));
}
@@ -116,7 +99,7 @@ EnterprisePlatformKeysPrivateChallengeMachineKeyFunction::Run() {
}
void EnterprisePlatformKeysPrivateChallengeMachineKeyFunction::OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result) {
+ const ash::attestation::TpmChallengeKeyResult& result) {
if (result.IsSuccess()) {
std::string encoded_response;
base::Base64Encode(result.challenge_response, &encoded_response);
@@ -138,15 +121,14 @@ EnterprisePlatformKeysPrivateChallengeUserKeyFunction::Run() {
std::unique_ptr<api_epkp::ChallengeUserKey::Params> params(
api_epkp::ChallengeUserKey::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- chromeos::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
+ ash::attestation::TpmChallengeKeyCallback callback = base::BindOnce(
&EnterprisePlatformKeysPrivateChallengeUserKeyFunction::OnChallengedKey,
this);
std::string challenge;
if (!base::Base64Decode(params->challenge, &challenge)) {
- auto result = chromeos::attestation::TpmChallengeKeyResult::MakeError(
- chromeos::attestation::TpmChallengeKeyResultCode::
- kChallengeBadBase64Error);
+ auto result = ash::attestation::TpmChallengeKeyResult::MakeError(
+ ash::attestation::TpmChallengeKeyResultCode::kChallengeBadBase64Error);
return RespondNow(Error(result.GetErrorMessage()));
}
@@ -161,7 +143,7 @@ EnterprisePlatformKeysPrivateChallengeUserKeyFunction::Run() {
}
void EnterprisePlatformKeysPrivateChallengeUserKeyFunction::OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result) {
+ const ash::attestation::TpmChallengeKeyResult& result) {
if (result.IsSuccess()) {
std::string encoded_response;
base::Base64Encode(result.challenge_response, &encoded_response);
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
index 22c308bc5ef..11565775574 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
@@ -11,7 +11,7 @@
#include <memory>
#include <string>
-#include "chrome/browser/chromeos/attestation/tpm_challenge_key.h"
+#include "chrome/browser/ash/attestation/tpm_challenge_key.h"
#include "chromeos/dbus/constants/attestation_constants.h"
#include "extensions/browser/extension_function.h"
#include "extensions/common/extension.h"
@@ -33,13 +33,11 @@ class EPKPChallengeKey {
EPKPChallengeKey& operator=(const EPKPChallengeKey&) = delete;
~EPKPChallengeKey();
- static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
-
// Asynchronously run the flow to challenge a key in the |caller|
// context.
void Run(chromeos::attestation::AttestationKeyType type,
scoped_refptr<ExtensionFunction> caller,
- chromeos::attestation::TpmChallengeKeyCallback callback,
+ ash::attestation::TpmChallengeKeyCallback callback,
const std::string& challenge,
bool register_key);
@@ -48,7 +46,7 @@ class EPKPChallengeKey {
bool IsExtensionAllowed(Profile* profile,
scoped_refptr<const Extension> extension);
- std::unique_ptr<chromeos::attestation::TpmChallengeKey> impl_;
+ std::unique_ptr<ash::attestation::TpmChallengeKey> impl_;
};
class EnterprisePlatformKeysPrivateChallengeMachineKeyFunction
@@ -61,8 +59,7 @@ class EnterprisePlatformKeysPrivateChallengeMachineKeyFunction
ResponseAction Run() override;
// Called when the challenge operation is complete.
- void OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result);
+ void OnChallengedKey(const ash::attestation::TpmChallengeKeyResult& result);
EPKPChallengeKey impl_;
@@ -81,8 +78,7 @@ class EnterprisePlatformKeysPrivateChallengeUserKeyFunction
ResponseAction Run() override;
// Called when the challenge operation is complete.
- void OnChallengedKey(
- const chromeos::attestation::TpmChallengeKeyResult& result);
+ void OnChallengedKey(const ash::attestation::TpmChallengeKeyResult& result);
EPKPChallengeKey impl_;
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
index 3230c6b536f..454b87f2a2b 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
@@ -8,8 +8,8 @@
#include "base/memory/ptr_util.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/attestation/mock_tpm_challenge_key.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/attestation/mock_tpm_challenge_key.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/common/pref_names.h"
@@ -34,7 +34,7 @@ const char kUserEmail[] = "test@google.com";
class EPKPChallengeKeyTestBase : public BrowserWithTestWindowTest {
protected:
EPKPChallengeKeyTestBase()
- : fake_user_manager_(new chromeos::FakeChromeUserManager()),
+ : fake_user_manager_(new ash::FakeChromeUserManager()),
user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {
extension_ = ExtensionBuilder("Test").Build();
}
@@ -46,10 +46,10 @@ class EPKPChallengeKeyTestBase : public BrowserWithTestWindowTest {
}
void SetMockTpmChallenger() {
- auto mock_tpm_challenge_key = std::make_unique<
- NiceMock<chromeos::attestation::MockTpmChallengeKey>>();
+ auto mock_tpm_challenge_key =
+ std::make_unique<NiceMock<ash::attestation::MockTpmChallengeKey>>();
mock_tpm_challenge_key->EnableFake();
- chromeos::attestation::TpmChallengeKeyFactory::SetForTesting(
+ ash::attestation::TpmChallengeKeyFactory::SetForTesting(
std::move(mock_tpm_challenge_key));
}
@@ -70,7 +70,7 @@ class EPKPChallengeKeyTestBase : public BrowserWithTestWindowTest {
scoped_refptr<const Extension> extension_;
// fake_user_manager_ is owned by user_manager_enabler_.
- chromeos::FakeChromeUserManager* fake_user_manager_ = nullptr;
+ ash::FakeChromeUserManager* fake_user_manager_ = nullptr;
user_manager::ScopedUserManager user_manager_enabler_;
PrefService* prefs_ = nullptr;
};
@@ -95,8 +95,7 @@ TEST_F(EPKPChallengeMachineKeyTest, ExtensionNotAllowlisted) {
prefs_->Set(prefs::kAttestationExtensionAllowlist, empty_allowlist);
EXPECT_EQ(
- chromeos::attestation::TpmChallengeKeyResult::
- kExtensionNotAllowedErrorMsg,
+ ash::attestation::TpmChallengeKeyResult::kExtensionNotAllowedErrorMsg,
utils::RunFunctionAndReturnError(func_.get(), kFuncArgs, browser()));
}
@@ -135,8 +134,7 @@ TEST_F(EPKPChallengeUserKeyTest, ExtensionNotAllowlisted) {
prefs_->Set(prefs::kAttestationExtensionAllowlist, empty_allowlist);
EXPECT_EQ(
- chromeos::attestation::TpmChallengeKeyResult::
- kExtensionNotAllowedErrorMsg,
+ ash::attestation::TpmChallengeKeyResult::kExtensionNotAllowedErrorMsg,
utils::RunFunctionAndReturnError(func_.get(), kFuncArgs, browser()));
}
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.cc
deleted file mode 100644
index 0c44b4216f9..00000000000
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h"
-
-#include <memory>
-#include "chrome/common/extensions/api/enterprise_reporting_private.h"
-
-#include "base/callback_forward.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/util/affiliation.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/version_info/version_info.h"
-#include "device_management_backend.pb.h"
-
-namespace extensions {
-namespace enterprise_reporting {
-
-ContextInfoFetcher::ContextInfoFetcher(
- content::BrowserContext* browser_context,
- enterprise_connectors::ConnectorsService* connectors_service)
- : browser_context_(browser_context),
- connectors_service_(connectors_service) {
- DCHECK(connectors_service_);
-}
-
-ContextInfoFetcher::~ContextInfoFetcher() = default;
-
-// static
-std::unique_ptr<ContextInfoFetcher> ContextInfoFetcher::CreateInstance(
- content::BrowserContext* browser_context,
- enterprise_connectors::ConnectorsService* connectors_service) {
- // TODO(domfc): Add platform overrides of the class once they are needed for
- // an attribute.
- return std::make_unique<ContextInfoFetcher>(browser_context,
- connectors_service);
-}
-
-void ContextInfoFetcher::Fetch(ContextInfoCallback callback) {
- api::enterprise_reporting_private::ContextInfo info;
-
- info.browser_affiliation_ids = GetBrowserAffiliationIDs();
- info.profile_affiliation_ids = GetProfileAffiliationIDs();
- info.on_file_attached_providers =
- GetAnalysisConnectorProviders(enterprise_connectors::FILE_ATTACHED);
- info.on_file_downloaded_providers =
- GetAnalysisConnectorProviders(enterprise_connectors::FILE_DOWNLOADED);
- info.on_bulk_data_entry_providers =
- GetAnalysisConnectorProviders(enterprise_connectors::BULK_DATA_ENTRY);
- info.realtime_url_check_mode = GetRealtimeUrlCheckMode();
- info.on_security_event_providers = GetOnSecurityEventProviders();
- info.browser_version = version_info::GetVersionNumber();
-
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(std::move(callback), std::move(info)));
-}
-
-std::vector<std::string> ContextInfoFetcher::GetBrowserAffiliationIDs() {
- const enterprise_management::PolicyData* browser_policy_data =
- chrome::enterprise_util::GetBrowserPolicyData();
-
- if (!browser_policy_data ||
- browser_policy_data->device_affiliation_ids().empty()) {
- return {};
- }
-
- const auto& affiliation_ids = browser_policy_data->device_affiliation_ids();
- return std::vector<std::string>(affiliation_ids.begin(),
- affiliation_ids.end());
-}
-
-std::vector<std::string> ContextInfoFetcher::GetProfileAffiliationIDs() {
- const enterprise_management::PolicyData* profile_policy_data =
- chrome::enterprise_util::GetProfilePolicyData(
- Profile::FromBrowserContext(browser_context_));
-
- if (!profile_policy_data ||
- profile_policy_data->user_affiliation_ids().empty()) {
- return {};
- }
-
- const auto& affiliation_ids = profile_policy_data->user_affiliation_ids();
- return std::vector<std::string>(affiliation_ids.begin(),
- affiliation_ids.end());
-}
-
-std::vector<std::string> ContextInfoFetcher::GetAnalysisConnectorProviders(
- enterprise_connectors::AnalysisConnector connector) {
- return connectors_service_->GetAnalysisServiceProviderNames(connector);
-}
-
-api::enterprise_reporting_private::RealtimeUrlCheckMode
-ContextInfoFetcher::GetRealtimeUrlCheckMode() {
- switch (connectors_service_->GetAppliedRealTimeUrlCheck()) {
- case safe_browsing::REAL_TIME_CHECK_DISABLED:
- return api::enterprise_reporting_private::
- REALTIME_URL_CHECK_MODE_DISABLED;
- case safe_browsing::REAL_TIME_CHECK_FOR_MAINFRAME_ENABLED:
- return api::enterprise_reporting_private::
- REALTIME_URL_CHECK_MODE_ENABLED_MAIN_FRAME;
- }
-}
-
-std::vector<std::string> ContextInfoFetcher::GetOnSecurityEventProviders() {
- return connectors_service_->GetReportingServiceProviderNames(
- enterprise_connectors::ReportingConnector::SECURITY_EVENT);
-}
-
-} // namespace enterprise_reporting
-} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h
deleted file mode 100644
index 457ece45099..00000000000
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_EXTENSIONS_API_ENTERPRISE_REPORTING_PRIVATE_CONTEXT_INFO_FETCHER_H_
-#define CHROME_BROWSER_EXTENSIONS_API_ENTERPRISE_REPORTING_PRIVATE_CONTEXT_INFO_FETCHER_H_
-
-#include "base/callback_forward.h"
-#include "chrome/common/extensions/api/enterprise_reporting_private.h"
-
-namespace content {
-class BrowserContext;
-} // namespace content
-
-namespace enterprise_connectors {
-enum AnalysisConnector : int;
-class ConnectorsService;
-} // namespace enterprise_connectors
-
-namespace extensions {
-namespace enterprise_reporting {
-
-// Interface used by the chrome.enterprise.reportingPrivate.getContextInfo()
-// function that fetches context information on Chrome. Each supported platform
-// has its own subclass implementation.
-class ContextInfoFetcher {
- public:
- using ContextInfoCallback =
- base::OnceCallback<void(api::enterprise_reporting_private::ContextInfo)>;
- ContextInfoFetcher(
- content::BrowserContext* browser_context,
- enterprise_connectors::ConnectorsService* connectors_service);
- virtual ~ContextInfoFetcher();
-
- ContextInfoFetcher(const ContextInfoFetcher&) = delete;
- ContextInfoFetcher operator=(const ContextInfoFetcher&) = delete;
-
- // Returns a platform specific instance of ContextInfoFetcher.
- static std::unique_ptr<ContextInfoFetcher> CreateInstance(
- content::BrowserContext* browser_context,
- enterprise_connectors::ConnectorsService* connectors_service);
-
- // Fetches the context information for the current platform. Eventually calls
- // |callback_|. This function takes a callback to return a ContextInfo instead
- // of returning synchronously because some attributes need to be fetched
- // asynchronously.
- void Fetch(ContextInfoCallback callback);
-
- private:
- // The following private methods each populate an attribute of ContextInfo. If
- // an attribute can't share implementation across platforms, its corresponding
- // function should be virtual and overridden in the platform subclasses.
-
- std::vector<std::string> GetBrowserAffiliationIDs();
-
- std::vector<std::string> GetProfileAffiliationIDs();
-
- std::vector<std::string> GetAnalysisConnectorProviders(
- enterprise_connectors::AnalysisConnector connector);
-
- api::enterprise_reporting_private::RealtimeUrlCheckMode
- GetRealtimeUrlCheckMode();
-
- std::vector<std::string> GetOnSecurityEventProviders();
-
- content::BrowserContext* browser_context_;
-
- // |connectors_service| is used to obtain the value of each Connector policy.
- enterprise_connectors::ConnectorsService* connectors_service_;
-};
-
-} // namespace enterprise_reporting
-} // namespace extensions
-
-#endif // CHROME_BROWSER_EXTENSIONS_API_ENTERPRISE_REPORTING_PRIVATE_CONTEXT_INFO_FETCHER_H_
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
index 3ee39eb4080..78d787cb207 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
@@ -15,12 +15,12 @@
#include "build/build_config.h"
#include "chrome/browser/enterprise/connectors/connectors_service.h"
#include "chrome/browser/enterprise/signals/device_info_fetcher.h"
-#include "chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h"
#include "components/enterprise/browser/controller/browser_dm_token_storage.h"
namespace extensions {
namespace {
+#if !defined(OS_CHROMEOS)
const char kEndpointVerificationRetrievalFailed[] =
"Failed to retrieve the endpoint verification data.";
const char kEndpointVerificationStoreFailed[] =
@@ -57,9 +57,37 @@ api::enterprise_reporting_private::DeviceInfo ToDeviceInfo(
return device_info;
}
+#endif // !defined(OS_CHROMEOS)
+
+api::enterprise_reporting_private::ContextInfo ToContextInfo(
+ const enterprise_signals::ContextInfo& signals) {
+ api::enterprise_reporting_private::ContextInfo info;
+
+ info.browser_affiliation_ids = signals.browser_affiliation_ids;
+ info.profile_affiliation_ids = signals.profile_affiliation_ids;
+ info.on_file_attached_providers = signals.on_file_attached_providers;
+ info.on_file_downloaded_providers = signals.on_file_downloaded_providers;
+ info.on_bulk_data_entry_providers = signals.on_bulk_data_entry_providers;
+ info.on_security_event_providers = signals.on_security_event_providers;
+ switch (signals.realtime_url_check_mode) {
+ case safe_browsing::REAL_TIME_CHECK_DISABLED:
+ info.realtime_url_check_mode = extensions::api::
+ enterprise_reporting_private::REALTIME_URL_CHECK_MODE_DISABLED;
+ break;
+ case safe_browsing::REAL_TIME_CHECK_FOR_MAINFRAME_ENABLED:
+ info.realtime_url_check_mode =
+ extensions::api::enterprise_reporting_private::
+ REALTIME_URL_CHECK_MODE_ENABLED_MAIN_FRAME;
+ break;
+ }
+ info.browser_version = signals.browser_version;
+
+ return info;
+}
} // namespace
+#if !defined(OS_CHROMEOS)
namespace enterprise_reporting {
const char kDeviceIdNotFound[] = "Failed to retrieve the device id.";
} // namespace enterprise_reporting
@@ -269,6 +297,8 @@ void EnterpriseReportingPrivateGetDeviceInfoFunction::OnDeviceInfoRetrieved(
base::Value::FromUniquePtrValue(ToDeviceInfo(device_signals).ToValue())));
}
+#endif // !defined(OS_CHROMEOS)
+
// getContextInfo
EnterpriseReportingPrivateGetContextInfoFunction::
@@ -284,7 +314,7 @@ EnterpriseReportingPrivateGetContextInfoFunction::Run() {
DCHECK(connectors_service);
context_info_fetcher_ =
- enterprise_reporting::ContextInfoFetcher::CreateInstance(
+ enterprise_signals::ContextInfoFetcher::CreateInstance(
browser_context(), connectors_service);
context_info_fetcher_->Fetch(base::BindOnce(
&EnterpriseReportingPrivateGetContextInfoFunction::OnContextInfoRetrieved,
@@ -294,8 +324,9 @@ EnterpriseReportingPrivateGetContextInfoFunction::Run() {
}
void EnterpriseReportingPrivateGetContextInfoFunction::OnContextInfoRetrieved(
- api::enterprise_reporting_private::ContextInfo context_info) {
- Respond(OneArgument(base::Value::FromUniquePtrValue(context_info.ToValue())));
+ enterprise_signals::ContextInfo context_info) {
+ Respond(OneArgument(
+ base::Value::FromUniquePtrValue(ToContextInfo(context_info).ToValue())));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
index 858454868e5..706d9925c08 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
@@ -8,13 +8,16 @@
#include <memory>
#include <string>
+#include "build/build_config.h"
+#include "chrome/browser/enterprise/signals/context_info_fetcher.h"
#include "chrome/browser/enterprise/signals/device_info_fetcher.h"
#include "chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.h"
-#include "chrome/browser/extensions/api/enterprise_reporting_private/context_info_fetcher.h"
#include "chrome/common/extensions/api/enterprise_reporting_private.h"
#include "extensions/browser/extension_function.h"
namespace extensions {
+
+#if !defined(OS_CHROMEOS)
namespace enterprise_reporting {
extern const char kDeviceIdNotFound[];
@@ -137,6 +140,8 @@ class EnterpriseReportingPrivateGetDeviceInfoFunction
const ::enterprise_signals::DeviceInfo& device_info);
};
+#endif // !defined(OS_CHROMEOS)
+
class EnterpriseReportingPrivateGetContextInfoFunction
: public ExtensionFunction {
public:
@@ -156,11 +161,9 @@ class EnterpriseReportingPrivateGetContextInfoFunction
ExtensionFunction::ResponseAction Run() override;
// Callback once the context data is retrieved.
- void OnContextInfoRetrieved(
- api::enterprise_reporting_private::ContextInfo context_info);
+ void OnContextInfoRetrieved(enterprise_signals::ContextInfo context_info);
- std::unique_ptr<enterprise_reporting::ContextInfoFetcher>
- context_info_fetcher_;
+ std::unique_ptr<enterprise_signals::ContextInfoFetcher> context_info_fetcher_;
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
index 0cd9ebdc1a6..815069255ee 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
@@ -9,7 +9,6 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
#include "chrome/browser/ui/browser.h"
-#include "chrome/common/extensions/api/enterprise_reporting_private.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
#include "components/enterprise/browser/enterprise_switches.h"
@@ -18,6 +17,13 @@
#include "components/version_info/version_info.h"
#include "content/public/test/browser_test.h"
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
+#include "chrome/browser/policy/dm_token_utils.h"
+#endif
+
namespace enterprise_reporting_private =
::extensions::api::enterprise_reporting_private;
@@ -76,6 +82,10 @@ class EnterpriseReportingPrivateGetContextInfoBaseBrowserTest
#endif
void SetupDMToken() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ policy::SetDMTokenForTesting(
+ policy::DMToken::CreateValidTokenForTesting("dm_token"));
+#else
browser_dm_token_storage_ =
std::make_unique<policy::FakeBrowserDMTokenStorage>();
browser_dm_token_storage_->SetEnrollmentToken("enrollment_token");
@@ -83,6 +93,7 @@ class EnterpriseReportingPrivateGetContextInfoBaseBrowserTest
browser_dm_token_storage_->SetDMToken("dm_token");
policy::BrowserDMTokenStorage::SetForTesting(
browser_dm_token_storage_.get());
+#endif
}
private:
@@ -112,9 +123,15 @@ class EnterpriseReportingPrivateGetContextInfoBrowserTest
SetUpOnMainThread();
if (browser_managed()) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ auto* browser_policy_manager = g_browser_process->platform_part()
+ ->browser_policy_connector_chromeos()
+ ->GetDeviceCloudPolicyManager();
+#else
auto* browser_policy_manager =
g_browser_process->browser_policy_connector()
->machine_level_user_cloud_policy_manager();
+#endif
auto browser_policy_data =
std::make_unique<enterprise_management::PolicyData>();
browser_policy_data->add_device_affiliation_ids(kBrowserID1);
@@ -124,9 +141,16 @@ class EnterpriseReportingPrivateGetContextInfoBrowserTest
}
if (profile_managed()) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ auto* profile_policy_manager =
+ browser()->profile()->GetUserCloudPolicyManagerChromeOS();
+ profile_policy_manager->core()->client()->SetupRegistration(
+ "dm_token", "client_id", {});
+#else
safe_browsing::SetProfileDMToken(browser()->profile(), "dm_token");
auto* profile_policy_manager =
browser()->profile()->GetUserCloudPolicyManager();
+#endif
auto profile_policy_data =
std::make_unique<enterprise_management::PolicyData>();
profile_policy_data->add_user_affiliation_ids(kProfileID1);
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
index e23dbfdbd53..9f3a078aa98 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
@@ -12,7 +12,6 @@
#include "chrome/browser/extensions/extension_api_unittest.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/policy/dm_token_utils.h"
-#include "chrome/common/extensions/api/enterprise_reporting_private.h"
#include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
#include "components/policy/core/common/policy_types.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
@@ -23,10 +22,17 @@
#include "base/test/test_reg_util_win.h"
#endif
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+#include "base/nix/xdg_util.h"
+#endif
+
namespace enterprise_reporting_private =
::extensions::api::enterprise_reporting_private;
namespace extensions {
+
+#if !defined(OS_CHROMEOS)
+
namespace {
const char kFakeClientId[] = "fake-client-id";
@@ -291,7 +297,7 @@ TEST_F(EnterpriseReportingPrivateGetDeviceInfoTest, GetDeviceInfo) {
EXPECT_EQ("windows", info.os_name);
#elif defined(OS_LINUX) || defined(OS_CHROMEOS)
std::unique_ptr<base::Environment> env(base::Environment::Create());
- env->SetVar("XDG_CURRENT_DESKTOP", "XFCE");
+ env->SetVar(base::nix::kXdgCurrentDesktopEnvVar, "XFCE");
EXPECT_EQ("linux", info.os_name);
#else
// Verify a stub implementation.
@@ -309,6 +315,8 @@ TEST_F(EnterpriseReportingPrivateGetDeviceInfoTest, GetDeviceInfo) {
#endif
}
+#endif // !defined(OS_CHROMEOS)
+
class EnterpriseReportingPrivateGetContextInfoTest
: public ExtensionApiUnittest {
public:
diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index 2c841e641f9..342a5ba1092 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -9,7 +9,7 @@
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
#include "base/test/metrics/histogram_tester.h"
@@ -836,7 +836,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionApiTest, CloseBackgroundPage) {
class ExtensionHostDestructionObserver : public ExtensionHostObserver {
public:
explicit ExtensionHostDestructionObserver(ExtensionHost* host) {
- host_observer_.Add(host);
+ host_observation_.Observe(host);
}
ExtensionHostDestructionObserver(
const ExtensionHostDestructionObserver& other) = delete;
@@ -845,8 +845,8 @@ IN_PROC_BROWSER_TEST_F(BrowserActionApiTest, CloseBackgroundPage) {
~ExtensionHostDestructionObserver() override = default;
void OnExtensionHostDestroyed(ExtensionHost* host) override {
- ASSERT_TRUE(host_observer_.IsObserving(host));
- host_observer_.Remove(host);
+ ASSERT_TRUE(host_observation_.IsObservingSource(host));
+ host_observation_.Reset();
run_loop_.QuitWhenIdle();
}
@@ -854,7 +854,8 @@ IN_PROC_BROWSER_TEST_F(BrowserActionApiTest, CloseBackgroundPage) {
private:
base::RunLoop run_loop_;
- ScopedObserver<ExtensionHost, ExtensionHostObserver> host_observer_{this};
+ base::ScopedObservation<ExtensionHost, ExtensionHostObserver>
+ host_observation_{this};
};
ExtensionHostDestructionObserver host_destroyed_observer(extension_host);
diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index 8cfc696c5e7..1330d9d80ae 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -17,7 +17,6 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/extensions/extension_action_test_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/test/base/interactive_test_utils.h"
@@ -40,6 +39,7 @@
#include "extensions/browser/notification_types.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_set.h"
+#include "extensions/common/mojom/view_type.mojom.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
@@ -94,7 +94,7 @@ class PopupHostWatcher : public content::NotificationObserver {
const ExtensionHost* host =
content::Details<const ExtensionHost>(details).ptr();
DCHECK(host);
- if (host->extension_host_type() != VIEW_TYPE_EXTENSION_POPUP)
+ if (host->extension_host_type() != mojom::ViewType::kExtensionPopup)
return;
++(type == NOTIFICATION_EXTENSION_HOST_CREATED ? created_ : destroyed_);
@@ -274,9 +274,10 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, TestOpenPopupIncognito) {
content::WindowedNotificationObserver frame_observer(
content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
content::NotificationService::AllSources());
- ASSERT_TRUE(RunExtensionSubtest("browser_action/open_popup",
- "open_popup_succeeds.html",
- kFlagEnableIncognito, kFlagUseIncognito))
+ ASSERT_TRUE(RunExtensionTest({.name = "browser_action/open_popup",
+ .page_url = "open_popup_succeeds.html",
+ .open_in_incognito = true},
+ {.allow_in_incognito = true}))
<< message_;
frame_observer.Wait();
// Non-Aura Linux uses a singleton for the popup, so it looks like all windows
@@ -352,7 +353,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest,
sessions::SessionTabHelper::IdForTab(
browser()->tab_strip_model()->GetActiveWebContents())
.id(),
- APIPermission::kTab));
+ mojom::APIPermissionID::kTab));
EXPECT_TRUE(ClosePopup());
}
@@ -566,8 +567,6 @@ class MainFrameSizeWaiter : public content::WebContentsObserver {
};
IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, BrowserActionPopup) {
- base::AutoReset<bool> disable_toolbar_animations(
- &ToolbarActionsBar::disable_animations_for_testing_, true);
ASSERT_TRUE(
LoadExtension(test_data_dir_.AppendASCII("browser_action/popup")));
const Extension* extension = GetSingleLoadedExtension();
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 401a9d1f667..f6e5d4b33ad 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -28,6 +28,7 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/extensions/extensions_container.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
@@ -43,6 +44,7 @@
#include "extensions/common/error_utils.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/image_util.h"
+#include "extensions/common/mojom/view_type.mojom.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
@@ -546,6 +548,34 @@ ExtensionActionGetBadgeBackgroundColorFunction::RunExtensionAction() {
OneArgument(base::Value::FromUniquePtrValue(std::move(list))));
}
+ActionGetUserSettingsFunction::ActionGetUserSettingsFunction() = default;
+ActionGetUserSettingsFunction::~ActionGetUserSettingsFunction() = default;
+
+ExtensionFunction::ResponseAction ActionGetUserSettingsFunction::Run() {
+ DCHECK(extension());
+ ExtensionActionManager* const action_manager =
+ ExtensionActionManager::Get(browser_context());
+ ExtensionAction* const action =
+ action_manager->GetExtensionAction(*extension());
+
+ // This API is only available to extensions with the "action" key in the
+ // manifest, so they should always have an action.
+ DCHECK(action);
+ DCHECK_EQ(ActionInfo::TYPE_ACTION, action->action_type());
+
+ const bool is_pinned =
+ ToolbarActionsModel::Get(Profile::FromBrowserContext(browser_context()))
+ ->IsActionPinned(extension_id());
+
+ // TODO(devlin): Today, no action APIs are compiled. Unfortunately, this
+ // means we miss out on the compiled types, which would be rather helpful
+ // here.
+ base::Value ui_settings(base::Value::Type::DICTIONARY);
+ ui_settings.SetBoolKey("isOnToolbar", is_pinned);
+
+ return RespondNow(OneArgument(std::move(ui_settings)));
+}
+
BrowserActionOpenPopupFunction::BrowserActionOpenPopupFunction() = default;
ExtensionFunction::ResponseAction BrowserActionOpenPopupFunction::Run() {
@@ -609,7 +639,7 @@ void BrowserActionOpenPopupFunction::Observe(
return;
ExtensionHost* host = content::Details<ExtensionHost>(details).ptr();
- if (host->extension_host_type() != VIEW_TYPE_EXTENSION_POPUP ||
+ if (host->extension_host_type() != mojom::ViewType::kExtensionPopup ||
host->extension()->id() != extension_->id())
return;
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
index dd68632f82b..1fa5f9d74eb 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
@@ -338,6 +338,21 @@ class ActionDisableFunction : public ExtensionActionHideFunction {
~ActionDisableFunction() override {}
};
+class ActionGetUserSettingsFunction : public ExtensionFunction {
+ public:
+ DECLARE_EXTENSION_FUNCTION("action.getUserSettings", ACTION_GETUSERSETTINGS)
+
+ ActionGetUserSettingsFunction();
+ ActionGetUserSettingsFunction(const ActionGetUserSettingsFunction&) = delete;
+ ActionGetUserSettingsFunction& operator=(
+ const ActionGetUserSettingsFunction&) = delete;
+
+ ResponseAction Run() override;
+
+ protected:
+ ~ActionGetUserSettingsFunction() override;
+};
+
//
// browserAction.* aliases for supported browserAction APIs.
//
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
index 43b94da698b..b0f50a3144d 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
@@ -8,7 +8,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/strings/strcat.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
@@ -18,6 +18,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/extensions/extension_action_test_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/render_frame_host.h"
@@ -70,8 +71,8 @@ class TestStateStoreObserver : public StateStore::TestObserver {
public:
TestStateStoreObserver(content::BrowserContext* context,
const std::string& extension_id)
- : extension_id_(extension_id), scoped_observer_(this) {
- scoped_observer_.Add(ExtensionSystem::Get(context)->state_store());
+ : extension_id_(extension_id) {
+ scoped_observation_.Observe(ExtensionSystem::Get(context)->state_store());
}
~TestStateStoreObserver() override {}
@@ -90,7 +91,8 @@ class TestStateStoreObserver : public StateStore::TestObserver {
std::string extension_id_;
std::map<std::string, int> updated_values_;
- ScopedObserver<StateStore, StateStore::TestObserver> scoped_observer_;
+ base::ScopedObservation<StateStore, StateStore::TestObserver>
+ scoped_observation_{this};
DISALLOW_COPY_AND_ASSIGN(TestStateStoreObserver);
};
@@ -1298,6 +1300,59 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
}
}
+using ActionAPITest = ExtensionApiTest;
+
+IN_PROC_BROWSER_TEST_F(ActionAPITest, TestGetUserSettings) {
+ constexpr char kManifest[] =
+ R"({
+ "name": "getUserSettings Test",
+ "manifest_version": 3,
+ "version": "1",
+ "background": {"service_worker": "worker.js"},
+ "action": {}
+ })";
+ constexpr char kWorker[] =
+ R"(chrome.action.onClicked.addListener(async () => {
+ const settings = await chrome.action.getUserSettings();
+ chrome.test.sendMessage(JSON.stringify(settings));
+ });
+ chrome.test.sendMessage('ready');)";
+
+ TestExtensionDir test_dir;
+ test_dir.WriteManifest(kManifest);
+ test_dir.WriteFile(FILE_PATH_LITERAL("worker.js"), kWorker);
+
+ const Extension* extension = nullptr;
+ {
+ ExtensionTestMessageListener listener("ready", /*will_reply=*/false);
+ extension = LoadExtension(test_dir.UnpackedPath());
+ ASSERT_TRUE(extension);
+ ASSERT_TRUE(listener.WaitUntilSatisfied());
+ }
+
+ ToolbarActionsModel* const toolbar_model =
+ ToolbarActionsModel::Get(profile());
+ EXPECT_FALSE(toolbar_model->IsActionPinned(extension->id()));
+
+ std::unique_ptr<ExtensionActionTestHelper> toolbar_helper =
+ ExtensionActionTestHelper::Create(browser());
+
+ auto get_response = [extension, toolbar_helper = toolbar_helper.get()]() {
+ ExtensionTestMessageListener listener(/*will_reply=*/false);
+ listener.set_extension_id(extension->id());
+ toolbar_helper->Press(0);
+ EXPECT_TRUE(listener.WaitUntilSatisfied());
+ return listener.message();
+ };
+
+ EXPECT_EQ(R"({"isOnToolbar":false})", get_response());
+
+ toolbar_model->SetActionVisibility(extension->id(), true);
+ EXPECT_TRUE(toolbar_model->IsActionPinned(extension->id()));
+
+ EXPECT_EQ(R"({"isOnToolbar":true})", get_response());
+}
+
INSTANTIATE_TEST_SUITE_P(All,
MultiActionAPITest,
testing::Values(ActionInfo::TYPE_ACTION,
diff --git a/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.cc b/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.cc
index 054f6a38116..2adfee5286e 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.cc
@@ -9,8 +9,8 @@ namespace extensions {
TestExtensionActionAPIObserver::TestExtensionActionAPIObserver(
content::BrowserContext* context,
const ExtensionId& extension_id)
- : extension_id_(extension_id), scoped_observer_(this) {
- scoped_observer_.Add(ExtensionActionAPI::Get(context));
+ : extension_id_(extension_id) {
+ scoped_observation_.Observe(ExtensionActionAPI::Get(context));
}
TestExtensionActionAPIObserver::TestExtensionActionAPIObserver(
diff --git a/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h b/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h
index 981da2f2b36..e2423448cf2 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h
+++ b/chromium/chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h
@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
#include "extensions/common/extension_id.h"
@@ -52,8 +52,8 @@ class TestExtensionActionAPIObserver : public ExtensionActionAPI::Observer {
content::WebContents* last_web_contents_ = nullptr;
ExtensionId extension_id_;
base::RunLoop run_loop_;
- ScopedObserver<ExtensionActionAPI, ExtensionActionAPI::Observer>
- scoped_observer_;
+ base::ScopedObservation<ExtensionActionAPI, ExtensionActionAPI::Observer>
+ scoped_observation_{this};
// An optional set of web contents to observe for extension action updates.
std::set<content::WebContents*> contents_to_observe_;
diff --git a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
index 9e1fe3ce798..b4eb7c1fe0c 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
@@ -10,7 +10,7 @@
namespace extensions {
-TestIconImageObserver::TestIconImageObserver() : observer_(this) {}
+TestIconImageObserver::TestIconImageObserver() {}
TestIconImageObserver::~TestIconImageObserver() = default;
void TestIconImageObserver::Wait(IconImage* icon) {
@@ -19,7 +19,7 @@ void TestIconImageObserver::Wait(IconImage* icon) {
// if it's for an extension that is buried in the menu). Force the icon to
// load by requesting a bitmap.
icon->image_skia().bitmap();
- observer_.Add(icon);
+ observation_.Observe(icon);
run_loop_.Run();
}
}
diff --git a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.h b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.h
index b8881d8a8a6..310eef3c44f 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.h
+++ b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.h
@@ -7,7 +7,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "extensions/browser/extension_icon_image.h"
namespace extensions {
@@ -32,7 +32,7 @@ class TestIconImageObserver : public IconImage::Observer {
void OnExtensionIconImageChanged(IconImage* icon) override;
base::RunLoop run_loop_;
- ScopedObserver<IconImage, IconImage::Observer> observer_;
+ base::ScopedObservation<IconImage, IconImage::Observer> observation_{this};
DISALLOW_COPY_AND_ASSIGN(TestIconImageObserver);
};
diff --git a/chromium/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc b/chromium/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
index 8e3adab6ccb..d2eb14cf963 100644
--- a/chromium/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
@@ -29,11 +29,11 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "base/strings/string_split.h"
#include "base/system/sys_info.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/crosapi/browser_manager.h"
#include "chrome/browser/ash/system_logs/iwlwifi_dump_log_source.h"
#include "chrome/browser/ash/system_logs/single_debug_daemon_log_source.h"
#include "chrome/browser/ash/system_logs/single_log_file_log_source.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/crosapi/browser_manager.h"
#include "chrome/browser/extensions/component_loader.h"
#include "chrome/browser/extensions/extension_service.h"
#include "components/feedback/system_logs/system_logs_source.h"
@@ -258,8 +258,7 @@ std::string ChromeFeedbackPrivateDelegate::GetSignedInUserEmail(
if (!identity_manager)
return std::string();
// Browser sync consent is not required to use feedback.
- return identity_manager
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+ return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
.email;
}
diff --git a/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
index 57cc908f660..ea791f7a198 100644
--- a/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -282,7 +282,7 @@ IN_PROC_BROWSER_TEST_F(FeedbackTest, ProvideBluetoothLogs) {
&bool_result));
EXPECT_TRUE(bool_result);
}
-#endif // if defined(CHROME_OS)
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
// Disabled due to flake: https://crbug.com/1069870
IN_PROC_BROWSER_TEST_F(FeedbackTest, DISABLED_GetTargetTabUrl) {
diff --git a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
index 8acf313706f..ff783973599 100644
--- a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h"
+#include <string>
#include <utility>
#include <vector>
@@ -13,7 +14,6 @@
#include "base/check.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
-#include "base/strings/string16.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/api/file_system/file_entry_picker.h"
#include "chrome/browser/extensions/chrome_extension_function_details.h"
@@ -297,7 +297,7 @@ bool ChromeFileSystemDelegate::ShowSelectFileDialog(
void ChromeFileSystemDelegate::ConfirmSensitiveDirectoryAccess(
bool has_write_permission,
- const base::string16& app_name,
+ const std::u16string& app_name,
content::WebContents* web_contents,
base::OnceClosure on_accept,
base::OnceClosure on_cancel) {
diff --git a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h
index 5aaf22f1ad5..721d2068f1b 100644
--- a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h
+++ b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.h
@@ -40,7 +40,7 @@ class ChromeFileSystemDelegate : public FileSystemDelegate {
FileSystemDelegate::FilesSelectedCallback files_selected_callback,
base::OnceClosure file_selection_canceled_callback) override;
void ConfirmSensitiveDirectoryAccess(bool has_write_permission,
- const base::string16& app_name,
+ const std::u16string& app_name,
content::WebContents* web_contents,
base::OnceClosure on_accept,
base::OnceClosure on_cancel) override;
diff --git a/chromium/chrome/browser/extensions/api/file_system/consent_provider.cc b/chromium/chrome/browser/extensions/api/file_system/consent_provider.cc
index 76bcf2f9275..2b72eb9fe21 100644
--- a/chromium/chrome/browser/extensions/api/file_system/consent_provider.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/consent_provider.cc
@@ -94,7 +94,7 @@ void ConsentProvider::RequestConsent(
DCHECK(IsGrantableForVolume(extension, volume));
// If a allowlisted component, then no need to ask or inform the user.
- if (extension.location() == Manifest::COMPONENT &&
+ if (extension.location() == mojom::ManifestLocation::kComponent &&
delegate_->IsAllowlistedComponent(extension)) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), CONSENT_GRANTED));
@@ -257,7 +257,7 @@ bool ConsentProviderDelegate::IsAllowlistedComponent(
bool ConsentProviderDelegate::HasRequestDownloadsPermission(
const Extension& extension) {
return extension.permissions_data()->HasAPIPermission(
- APIPermission::kFileSystemRequestDownloads);
+ mojom::APIPermissionID::kFileSystemRequestDownloads);
}
} // namespace file_system_api
diff --git a/chromium/chrome/browser/extensions/api/file_system/consent_provider_unittest.cc b/chromium/chrome/browser/extensions/api/file_system/consent_provider_unittest.cc
index 1c6b0db70f6..8ed46df9b07 100644
--- a/chromium/chrome/browser/extensions/api/file_system/consent_provider_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/consent_provider_unittest.cc
@@ -13,8 +13,8 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/chromeos/file_manager/volume_manager.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chrome/test/base/testing_browser_process.h"
#include "components/prefs/testing_pref_service.h"
#include "components/user_manager/scoped_user_manager.h"
@@ -28,6 +28,7 @@
#include "testing/gtest/include/gtest/gtest.h"
using extensions::file_system_api::ConsentProvider;
+using extensions::mojom::ManifestLocation;
using file_manager::Volume;
namespace extensions {
@@ -87,7 +88,7 @@ class TestingConsentProviderDelegate
bool HasRequestDownloadsPermission(const Extension& extension) override {
return extension.permissions_data()->HasAPIPermission(
- APIPermission::kFileSystemRequestDownloads);
+ mojom::APIPermissionID::kFileSystemRequestDownloads);
}
int show_dialog_counter_;
@@ -115,7 +116,7 @@ class FileSystemApiConsentProviderTest : public testing::Test {
testing_pref_service_.reset(new TestingPrefServiceSimple);
TestingBrowserProcess::GetGlobal()->SetLocalState(
testing_pref_service_.get());
- user_manager_ = new chromeos::FakeChromeUserManager;
+ user_manager_ = new ash::FakeChromeUserManager;
scoped_user_manager_enabler_ =
std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(user_manager_));
@@ -133,8 +134,7 @@ class FileSystemApiConsentProviderTest : public testing::Test {
protected:
base::WeakPtr<Volume> volume_;
std::unique_ptr<TestingPrefServiceSimple> testing_pref_service_;
- chromeos::FakeChromeUserManager*
- user_manager_; // Owned by the scope enabler.
+ ash::FakeChromeUserManager* user_manager_; // Owned by the scope enabler.
std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_enabler_;
content::BrowserTaskEnvironment task_environment_;
base::ScopedTempDir temp_dir_;
@@ -146,7 +146,7 @@ TEST_F(FileSystemApiConsentProviderTest, ForNonKioskApps) {
{
scoped_refptr<const Extension> component_extension(
ExtensionBuilder("Test", ExtensionBuilder::Type::PLATFORM_APP)
- .SetLocation(Manifest::COMPONENT)
+ .SetLocation(ManifestLocation::kComponent)
.Build());
TestingConsentProviderDelegate delegate;
ConsentProvider provider(&delegate);
@@ -159,7 +159,7 @@ TEST_F(FileSystemApiConsentProviderTest, ForNonKioskApps) {
{
scoped_refptr<const Extension> allowlisted_component_extension(
ExtensionBuilder("Test", ExtensionBuilder::Type::PLATFORM_APP)
- .SetLocation(Manifest::COMPONENT)
+ .SetLocation(ManifestLocation::kComponent)
.Build());
TestingConsentProviderDelegate delegate;
delegate.SetComponentAllowlist(allowlisted_component_extension->id());
@@ -183,7 +183,7 @@ TEST_F(FileSystemApiConsentProviderTest, ForNonKioskApps) {
{
scoped_refptr<const Extension> allowlisted_extension(
ExtensionBuilder("Test", ExtensionBuilder::Type::PLATFORM_APP)
- .SetLocation(Manifest::COMPONENT)
+ .SetLocation(ManifestLocation::kComponent)
.AddPermission("fileSystem.requestDownloads")
.Build());
TestingConsentProviderDelegate delegate;
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_entry_picker.cc b/chromium/chrome/browser/extensions/api/file_system/file_entry_picker.cc
index 5f1f2566237..5d62fc7a02f 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_entry_picker.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_entry_picker.cc
@@ -5,10 +5,10 @@
#include "chrome/browser/extensions/api/file_system/file_entry_picker.h"
#include <memory>
+#include <string>
#include <vector>
#include "base/files/file_path.h"
-#include "base/strings/string16.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "content/public/browser/web_contents.h"
@@ -34,7 +34,7 @@ FileEntryPicker::FileEntryPicker(
select_file_dialog_ = ui::SelectFileDialog::Create(
this, std::make_unique<ChromeSelectFilePolicy>(web_contents));
select_file_dialog_->SelectFile(
- picker_type, base::string16(), suggested_name, &file_type_info, 0,
+ picker_type, std::u16string(), suggested_name, &file_type_info, 0,
base::FilePath::StringType(), owning_window, nullptr);
}
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc b/chromium/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc
index 30a22935630..c97748db0a3 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include <memory>
#include <vector>
#include "base/files/file_path.h"
@@ -41,16 +42,18 @@ AcceptOption BuildAcceptOption(const std::string& description,
AcceptOption option;
if (!description.empty())
- option.description.reset(new std::string(description));
+ option.description = std::make_unique<std::string>(description);
if (!mime_types.empty()) {
- option.mime_types.reset(new std::vector<std::string>(base::SplitString(
- mime_types, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)));
+ option.mime_types =
+ std::make_unique<std::vector<std::string>>(base::SplitString(
+ mime_types, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL));
}
if (!extensions.empty()) {
- option.extensions.reset(new std::vector<std::string>(base::SplitString(
- extensions, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)));
+ option.extensions =
+ std::make_unique<std::vector<std::string>>(base::SplitString(
+ extensions, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL));
}
return option;
@@ -154,7 +157,7 @@ TEST(FileSystemApiUnitTest, FileSystemChooseEntryFunctionFileTypeInfoTest) {
FileSystemChooseEntryFunction::BuildFileTypeInfo(&file_type_info,
base::FilePath::StringType(), &options, &acceptsAllTypes);
EXPECT_EQ(file_type_info.extension_description_overrides[0],
- base::UTF8ToUTF16("File Types 101"));
+ u"File Types 101");
}
TEST(FileSystemApiUnitTest, FileSystemChooseEntryFunctionSuggestionTest) {
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
index 9f8aa2cfd1f..401a8dcb8d4 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
@@ -7,7 +7,7 @@
#include "base/files/file_util.h"
#include "base/macros.h"
#include "base/path_service.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
@@ -37,7 +37,8 @@ class AppLoadObserver : public ExtensionRegistryObserver {
content::BrowserContext* browser_context,
const base::RepeatingCallback<void(const Extension*)>& callback)
: callback_(callback) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context));
+ extension_registry_observation_.Observe(
+ ExtensionRegistry::Get(browser_context));
}
void OnExtensionLoaded(content::BrowserContext* browser_context,
@@ -47,8 +48,8 @@ class AppLoadObserver : public ExtensionRegistryObserver {
private:
base::RepeatingCallback<void(const Extension*)> callback_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(AppLoadObserver);
};
@@ -158,7 +159,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetDisplayPath) {
base::FilePath test_file = test_root_folder_.AppendASCII("gold.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/get_display_path"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/get_display_path",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -173,8 +175,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetDisplayPathPrettify) {
base::FilePath test_file = test_root_folder_.AppendASCII("gold.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_display_path_prettify")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/get_display_path_prettify",
+ .launch_as_platform_app = true}))
+ << message_;
}
#endif
@@ -195,8 +199,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_display_path_prettify_mac")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/get_display_path_prettify_mac",
+ .launch_as_platform_app = true}))
+ << message_;
}
#endif
@@ -205,7 +211,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenExistingFileTest) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_existing",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -221,7 +228,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
profile(),
base::BindRepeating(SetLastChooseEntryDirectory, test_file.DirName(),
ExtensionPrefs::Get(profile())));
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
CheckStoredDirectoryMatches(test_file);
@@ -246,7 +254,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
test_file.DirName().Append(base::FilePath::FromUTF8Unsafe(
"fake_directory_does_not_exist")),
ExtensionPrefs::Get(profile())));
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
CheckStoredDirectoryMatches(test_file);
@@ -263,7 +272,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
}
FileSystemChooseEntryFunction::
SkipPickerAndSelectSuggestedPathForTest();
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_existing",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -277,8 +287,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenMultipleSuggested) {
chrome::DIR_USER_DOCUMENTS, test_file.DirName(), false, false));
}
FileSystemChooseEntryFunction::SkipPickerAndSelectSuggestedPathForTest();
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_multiple_with_suggested_name"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_multiple_with_suggested_name",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -292,7 +303,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_EQ(2u, test_files.size());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest(
&test_files);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_multiple_existing"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_multiple_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -302,7 +315,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenDirectoryTest) {
base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_directory",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -314,8 +328,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/file_system/open_directory_with_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_with_write",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -327,8 +342,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_directory_without_permission"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_without_permission",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -340,8 +356,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_directory_with_only_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_with_only_write",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -360,7 +377,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
}
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_directory",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -378,7 +396,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
}
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory_cancel"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_directory_cancel",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -397,7 +417,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
}
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&parent_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory_cancel"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_directory_cancel",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_directory);
}
@@ -419,7 +441,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
}
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_directory",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -431,8 +454,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/invalid_choose_file_type")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/invalid_choose_file_type",
+ .launch_as_platform_app = true}))
+ << message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -442,8 +467,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_existing_with_write")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_existing_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -453,8 +480,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_writable_existing")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_writable_existing",
+ .launch_as_platform_app = true}))
+ << message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -464,8 +493,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_writable_existing_with_write")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_writable_existing_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -478,20 +509,24 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_EQ(2u, test_files.size());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest(
&test_files);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_multiple_writable_existing_with_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name =
+ "api_test/file_system/open_multiple_writable_existing_with_write",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenCancelTest) {
FileSystemChooseEntryFunction::SkipPickerAndAlwaysCancelForTest();
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_cancel"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_cancel",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(base::FilePath());
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenBackgroundTest) {
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_background"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_background",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -500,7 +535,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveNewFileTest) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_new",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -510,7 +546,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveExistingFileTest) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_existing",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(base::FilePath());
}
@@ -521,7 +558,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new_with_write"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/save_new_with_write",
+ .launch_as_platform_app = true}))
<< message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -532,8 +571,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/save_existing_with_write")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/save_existing_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
CheckStoredDirectoryMatches(test_file);
}
@@ -545,18 +586,21 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveMultipleFilesTest) {
ASSERT_EQ(2u, test_files.size());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest(
&test_files);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_multiple"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_multiple",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveCancelTest) {
FileSystemChooseEntryFunction::SkipPickerAndAlwaysCancelForTest();
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_cancel"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_cancel",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveBackgroundTest) {
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_background"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_background",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -565,8 +609,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetWritableTest) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_writable_file_entry")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/get_writable_file_entry",
+ .launch_as_platform_app = true}))
+ << message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
@@ -575,8 +621,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_writable_file_entry_with_write")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/get_writable_file_entry_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
@@ -585,8 +633,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_writable_root_entry")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/get_writable_root_entry",
+ .launch_as_platform_app = true}))
+ << message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiIsWritableTest) {
@@ -594,7 +644,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiIsWritableTest) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/is_writable_file_entry"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/is_writable_file_entry",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -604,8 +656,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/is_writable_file_entry_with_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/is_writable_file_entry_with_write",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -614,8 +667,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRetainEntry) {
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/retain_entry")) << message_;
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/retain_entry",
+ .launch_as_platform_app = true}))
+ << message_;
std::vector<SavedFileEntry> file_entries =
apps::SavedFilesService::Get(profile())->GetAllFileEntries(
GetSingleLoadedExtension()->id());
@@ -631,7 +685,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRetainDirectoryEntry) {
base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/retain_directory"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/retain_directory",
+ .launch_as_platform_app = true}))
<< message_;
std::vector<SavedFileEntry> file_entries =
apps::SavedFilesService::Get(profile())->GetAllFileEntries(
@@ -650,7 +705,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreEntry) {
AppLoadObserver observer(
profile(), base::BindRepeating(AddSavedEntry, test_file, false,
apps::SavedFilesService::Get(profile())));
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_entry"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/restore_entry",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -663,15 +719,18 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreDirectoryEntry) {
AppLoadObserver observer(
profile(), base::BindRepeating(AddSavedEntry, test_directory, true,
apps::SavedFilesService::Get(profile())));
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_directory"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/restore_directory",
+ .launch_as_platform_app = true}))
<< message_;
}
#if !BUILDFLAG(IS_CHROMEOS_ASH)
IN_PROC_BROWSER_TEST_F(FileSystemApiTest, RequestFileSystem_NotChromeOS) {
- ASSERT_TRUE(RunPlatformAppTestWithFlags(
- "api_test/file_system/request_file_system_not_chromeos",
- kFlagIgnoreManifestWarnings, kFlagNone))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_not_chromeos",
+ .launch_as_platform_app = true},
+ {.ignore_manifest_warnings = true}))
<< message_;
}
#endif
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
index eecc8a9af95..a43bedde791 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -12,11 +12,11 @@
#include "base/path_service.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/drivefs_test_support.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
-#include "chrome/browser/chromeos/drive/drivefs_test_support.h"
#include "chrome/browser/chromeos/file_manager/volume_manager.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/extensions/api/file_system/consent_provider.h"
#include "chrome/browser/extensions/component_loader.h"
#include "chrome/common/chrome_paths.h"
@@ -260,7 +260,7 @@ class FileSystemApiTestForRequestFileSystem : public PlatformAppBrowserTest {
protected:
base::ScopedTempDir temp_dir_;
- chromeos::FakeChromeUserManager* fake_user_manager_;
+ ash::FakeChromeUserManager* fake_user_manager_;
std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
// Creates a testing file system in a testing directory.
@@ -286,7 +286,7 @@ class FileSystemApiTestForRequestFileSystem : public PlatformAppBrowserTest {
// Simulates entering the kiosk session.
void EnterKioskSession() {
- fake_user_manager_ = new chromeos::FakeChromeUserManager();
+ fake_user_manager_ = new ash::FakeChromeUserManager();
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(fake_user_manager_));
@@ -329,7 +329,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/open_existing.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -339,8 +340,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/open_existing.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_existing_with_write")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_existing_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
@@ -350,8 +353,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
ASSERT_TRUE(base::PathService::OverrideAndCreateIfNeeded(
chrome::DIR_USER_DOCUMENTS, test_file.DirName(), true, false));
FileSystemChooseEntryFunction::SkipPickerAndSelectSuggestedPathForTest();
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_multiple_with_suggested_name"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_multiple_with_suggested_name",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -366,7 +370,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
test_files.push_back(test_file2);
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest(
&test_files);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_multiple_existing"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/open_multiple_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -376,7 +382,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/subdir");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_directory"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/open_directory",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -386,8 +393,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/subdir");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/file_system/open_directory_with_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_with_write",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -397,8 +405,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/subdir");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_directory_without_permission"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_without_permission",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -408,8 +417,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/subdir");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_directory);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/open_directory_with_only_write"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/open_directory_with_only_write",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -419,7 +429,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/save_new.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_new",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -429,7 +440,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/save_existing.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_existing"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/save_existing",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -439,7 +451,9 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/save_new.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new_with_write"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/save_new_with_write",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -449,77 +463,89 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForDrive,
GetDriveMountPoint().AppendASCII("root/save_existing.txt");
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/save_existing_with_write")) << message_;
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/save_existing_with_write",
+ .launch_as_platform_app = true}))
+ << message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, Background) {
EnterKioskSession();
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_OK);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/file_system/request_file_system_background"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_background",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, ReadOnly) {
EnterKioskSession();
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_OK);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/file_system/request_file_system_read_only"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_read_only",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, Writable) {
EnterKioskSession();
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_OK);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/file_system/request_file_system_writable"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_writable",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, UserReject) {
EnterKioskSession();
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_CANCEL);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/request_file_system_user_reject"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_user_reject",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, NotKioskSession) {
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_OK);
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/request_file_system_not_kiosk_session"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_not_kiosk_session",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem,
AllowlistedComponent) {
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_CANCEL);
- ASSERT_TRUE(RunPlatformAppTestWithFlags(
- "api_test/file_system/request_file_system_whitelisted_component",
- kFlagNone, kFlagLoadAsComponent))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_file_system_whitelisted_component",
+ .load_as_component = true,
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem,
NotAllowlistedComponent) {
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_OK);
- ASSERT_TRUE(RunPlatformAppTestWithFlags(
- "api_test/file_system/request_file_system_not_whitelisted_component",
- kFlagNone, kFlagLoadAsComponent))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name =
+ "api_test/file_system/request_file_system_not_whitelisted_component",
+ .load_as_component = true,
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem, GetVolumeList) {
EnterKioskSession();
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/get_volume_list"))
+ ASSERT_TRUE(RunExtensionTest({.name = "api_test/file_system/get_volume_list",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem,
GetVolumeList_NotKioskSession) {
- ASSERT_TRUE(RunPlatformAppTest(
- "api_test/file_system/get_volume_list_not_kiosk_session"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/get_volume_list_not_kiosk_session",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -533,16 +559,18 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem,
base::BindOnce(&FileSystemApiTestForRequestFileSystem::MountFakeVolume,
base::Unretained(this)));
- ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/on_volume_list_changed"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/file_system/on_volume_list_changed",
+ .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(FileSystemApiTestForRequestFileSystem,
AllowlistedExtensionForDownloads) {
ScopedSkipRequestFileSystemDialog dialog_skipper(ui::DIALOG_BUTTON_CANCEL);
- ASSERT_TRUE(RunPlatformAppTestWithFlags(
- "api_test/file_system/request_downloads_whitelisted_extension", kFlagNone,
- kFlagLaunchPlatformApp))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/file_system/request_downloads_whitelisted_extension",
+ .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc b/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
index 287985a136b..3533c43dcef 100644
--- a/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
@@ -4,12 +4,12 @@
#include "chrome/browser/extensions/api/file_system/request_file_system_notification.h"
+#include <string>
#include <utility>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/file_manager/volume_manager.h"
@@ -94,10 +94,10 @@ void ShowNotificationForAutoGrantedRequestFileSystem(
message_center::RichNotificationData data;
// TODO(mtomasz): Share this code with RequestFileSystemDialogView.
- const base::string16 display_name =
+ const std::u16string display_name =
base::UTF8ToUTF16(!volume->volume_label().empty() ? volume->volume_label()
: volume->volume_id());
- const base::string16 message = l10n_util::GetStringFUTF16(
+ const std::u16string message = l10n_util::GetStringFUTF16(
writable
? IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_NOTIFICATION_WRITABLE_MESSAGE
: IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_NOTIFICATION_MESSAGE,
@@ -107,7 +107,7 @@ void ShowNotificationForAutoGrantedRequestFileSystem(
message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
base::UTF8ToUTF16(extension.name()), message,
gfx::Image(), // Updated asynchronously later.
- base::string16(), // display_source
+ std::u16string(), // display_source
GURL(),
message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
notification_id),
diff --git a/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc b/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc
index 0c9a2deb3c4..c1a68546ada 100644
--- a/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc
+++ b/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc
@@ -169,8 +169,8 @@ void FontSettingsEventRouter::OnFontNamePrefChanged(
extensions::preference_helpers::DispatchEventToExtensions(
profile_, events::FONT_SETTINGS_ON_FONT_CHANGED,
- fonts::OnFontChanged::kEventName, &args, APIPermission::kFontSettings,
- false, pref_name);
+ fonts::OnFontChanged::kEventName, &args,
+ extensions::mojom::APIPermissionID::kFontSettings, false, pref_name);
}
void FontSettingsEventRouter::OnFontPrefChanged(
@@ -189,7 +189,7 @@ void FontSettingsEventRouter::OnFontPrefChanged(
extensions::preference_helpers::DispatchEventToExtensions(
profile_, histogram_value, event_name, &args,
- APIPermission::kFontSettings, false, pref_name);
+ extensions::mojom::APIPermissionID::kFontSettings, false, pref_name);
}
FontSettingsAPI::FontSettingsAPI(content::BrowserContext* context)
diff --git a/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc b/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
index 6d3f53d7b14..769758ff588 100644
--- a/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
@@ -33,8 +33,10 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FontSettingsIncognito) {
prefs->SetString(prefs::kWebKitSansSerifFontFamily, "Arial");
prefs->SetInteger(prefs::kWebKitDefaultFontSize, 16);
- EXPECT_TRUE(RunExtensionSubtest("font_settings/incognito", "launch.html",
- kFlagEnableIncognito, kFlagUseIncognito));
+ EXPECT_TRUE(RunExtensionTest({.name = "font_settings/incognito",
+ .page_url = "launch.html",
+ .open_in_incognito = true},
+ {.allow_in_incognito = true}));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/gcm/gcm_api.cc b/chromium/chrome/browser/extensions/api/gcm/gcm_api.cc
index 3045b247a36..6730ee6cdff 100644
--- a/chromium/chrome/browser/extensions/api/gcm/gcm_api.cc
+++ b/chromium/chrome/browser/extensions/api/gcm/gcm_api.cc
@@ -219,9 +219,11 @@ void GcmJsEventRouter::OnMessage(const std::string& app_id,
api::gcm::OnMessage::Message message_arg;
message_arg.data.additional_properties = message.data;
if (!message.sender_id.empty())
- message_arg.from.reset(new std::string(message.sender_id));
- if (!message.collapse_key.empty())
- message_arg.collapse_key.reset(new std::string(message.collapse_key));
+ message_arg.from = std::make_unique<std::string>(message.sender_id);
+ if (!message.collapse_key.empty()) {
+ message_arg.collapse_key =
+ std::make_unique<std::string>(message.collapse_key);
+ }
std::unique_ptr<Event> event(
new Event(events::GCM_ON_MESSAGE, api::gcm::OnMessage::kEventName,
@@ -242,7 +244,8 @@ void GcmJsEventRouter::OnSendError(
const std::string& app_id,
const gcm::GCMClient::SendErrorDetails& send_error_details) {
api::gcm::OnSendError::Error error;
- error.message_id.reset(new std::string(send_error_details.message_id));
+ error.message_id =
+ std::make_unique<std::string>(send_error_details.message_id);
error.error_message = GcmResultToError(send_error_details.result);
error.details.additional_properties = send_error_details.additional_data;
diff --git a/chromium/chrome/browser/extensions/api/history/history_api.cc b/chromium/chrome/browser/extensions/api/history/history_api.cc
index 620457256b5..9c716813a45 100644
--- a/chromium/chrome/browser/extensions/api/history/history_api.cc
+++ b/chromium/chrome/browser/extensions/api/history/history_api.cc
@@ -66,12 +66,13 @@ HistoryItem GetHistoryItem(const history::URLRow& row) {
HistoryItem history_item;
history_item.id = base::NumberToString(row.id());
- history_item.url.reset(new std::string(row.url().spec()));
- history_item.title.reset(new std::string(base::UTF16ToUTF8(row.title())));
- history_item.last_visit_time.reset(
- new double(MilliSecondsFromTime(row.last_visit())));
- history_item.typed_count.reset(new int(row.typed_count()));
- history_item.visit_count.reset(new int(row.visit_count()));
+ history_item.url = std::make_unique<std::string>(row.url().spec());
+ history_item.title =
+ std::make_unique<std::string>(base::UTF16ToUTF8(row.title()));
+ history_item.last_visit_time =
+ std::make_unique<double>(MilliSecondsFromTime(row.last_visit()));
+ history_item.typed_count = std::make_unique<int>(row.typed_count());
+ history_item.visit_count = std::make_unique<int>(row.visit_count());
return history_item;
}
@@ -81,7 +82,8 @@ VisitItem GetVisitItem(const history::VisitRow& row) {
visit_item.id = base::NumberToString(row.url_id);
visit_item.visit_id = base::NumberToString(row.visit_id);
- visit_item.visit_time.reset(new double(MilliSecondsFromTime(row.visit_time)));
+ visit_item.visit_time =
+ std::make_unique<double>(MilliSecondsFromTime(row.visit_time));
visit_item.referring_visit_id = base::NumberToString(row.referring_visit);
api::history::TransitionType transition = api::history::TRANSITION_TYPE_LINK;
@@ -134,7 +136,7 @@ HistoryEventRouter::HistoryEventRouter(Profile* profile,
history::HistoryService* history_service)
: profile_(profile) {
DCHECK(profile);
- history_service_observer_.Add(history_service);
+ history_service_observation_.Observe(history_service);
}
HistoryEventRouter::~HistoryEventRouter() {
@@ -212,9 +214,9 @@ void BrowserContextKeyedAPIFactory<HistoryAPI>::DeclareFactoryDependencies() {
void HistoryAPI::OnListenerAdded(const EventListenerInfo& details) {
Profile* profile = Profile::FromBrowserContext(browser_context_);
- history_event_router_.reset(new HistoryEventRouter(
+ history_event_router_ = std::make_unique<HistoryEventRouter>(
profile, HistoryServiceFactory::GetForProfile(
- profile, ServiceAccessType::EXPLICIT_ACCESS)));
+ profile, ServiceAccessType::EXPLICIT_ACCESS));
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
@@ -292,7 +294,7 @@ ExtensionFunction::ResponseAction HistorySearchFunction::Run() {
std::unique_ptr<Search::Params> params(Search::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
- base::string16 search_text = base::UTF8ToUTF16(params->query.text);
+ std::u16string search_text = base::UTF8ToUTF16(params->query.text);
history::QueryOptions options;
options.SetRecentDayRange(1);
diff --git a/chromium/chrome/browser/extensions/api/history/history_api.h b/chromium/chrome/browser/extensions/api/history/history_api.h
index 8c3814eee95..a140cb8756b 100644
--- a/chromium/chrome/browser/extensions/api/history/history_api.h
+++ b/chromium/chrome/browser/extensions/api/history/history_api.h
@@ -10,7 +10,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/task/cancelable_task_tracker.h"
#include "chrome/common/extensions/api/history.h"
#include "components/history/core/browser/history_service.h"
@@ -51,8 +51,9 @@ class HistoryEventRouter : public history::HistoryServiceObserver {
std::unique_ptr<base::ListValue> event_args);
Profile* profile_;
- ScopedObserver<history::HistoryService, history::HistoryServiceObserver>
- history_service_observer_{this};
+ base::ScopedObservation<history::HistoryService,
+ history::HistoryServiceObserver>
+ history_service_observation_{this};
DISALLOW_COPY_AND_ASSIGN(HistoryEventRouter);
};
diff --git a/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc b/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
index 64f71ab24f3..fcb0a765565 100644
--- a/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
@@ -48,7 +48,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, I18NUpdate) {
embedded_test_server()->GetURL("/extensions/test_file.html"));
EXPECT_TRUE(catcher.GetNextResult());
- base::string16 title;
+ std::u16string title;
ui_test_utils::GetCurrentTabTitle(browser(), &title);
EXPECT_EQ(std::string("FIRSTMESSAGE"), base::UTF16ToUTF8(title));
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
index f86a6559011..25cb3d273e8 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
@@ -46,8 +46,7 @@ GaiaRemoteConsentFlow::GaiaRemoteConsentFlow(
profile_(profile),
account_id_(token_key.account_info.account_id),
resolution_data_(resolution_data),
- web_flow_started_(false),
- scoped_observer_(this) {}
+ web_flow_started_(false) {}
GaiaRemoteConsentFlow::~GaiaRemoteConsentFlow() {
if (web_flow_)
@@ -94,7 +93,7 @@ void GaiaRemoteConsentFlow::OnSetAccountsComplete(
base::BindRepeating(&GaiaRemoteConsentFlow::OnConsentResultSet,
base::Unretained(this)));
- scoped_observer_.Add(IdentityManagerFactory::GetForProfile(profile_));
+ scoped_observation_.Observe(IdentityManagerFactory::GetForProfile(profile_));
web_flow_->Start();
web_flow_started_ = true;
}
@@ -145,9 +144,10 @@ void GaiaRemoteConsentFlow::OnAuthFlowFailure(WebAuthFlow::Failure failure) {
std::unique_ptr<GaiaAuthFetcher>
GaiaRemoteConsentFlow::CreateGaiaAuthFetcherForPartition(
- GaiaAuthConsumer* consumer) {
+ GaiaAuthConsumer* consumer,
+ const gaia::GaiaSource& source) {
return std::make_unique<GaiaAuthFetcher>(
- consumer, gaia::GaiaSource::kChrome,
+ consumer, source,
web_flow_->GetGuestPartition()->GetURLLoaderFactoryForBrowserProcess());
}
@@ -212,6 +212,7 @@ void GaiaRemoteConsentFlow::SetAccountsInCookie() {
this,
{gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
accounts},
+ gaia::GaiaSource::kChrome,
base::BindOnce(&GaiaRemoteConsentFlow::OnSetAccountsComplete,
base::Unretained(this)));
}
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
index e6e819c2fc4..169ed44f063 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
@@ -8,7 +8,7 @@
#include "base/callback_list.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/identity/extension_token_key.h"
#include "chrome/browser/extensions/api/identity/web_auth_flow.h"
#include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
@@ -73,7 +73,9 @@ class GaiaRemoteConsentFlow
// signin::AccountsCookieMutator::PartitionDelegate:
std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
- GaiaAuthConsumer* consumer) override;
+
+ GaiaAuthConsumer* consumer,
+ const gaia::GaiaSource& source) override;
network::mojom::CookieManager* GetCookieManagerForPartition() override;
// signin::IdentityManager::Observer:
@@ -97,8 +99,9 @@ class GaiaRemoteConsentFlow
std::unique_ptr<signin::AccountsCookieMutator::SetAccountsInCookieTask>
set_accounts_in_cookie_task_;
base::CallbackListSubscription identity_api_set_consent_result_subscription_;
- ScopedObserver<signin::IdentityManager, signin::IdentityManager::Observer>
- scoped_observer_;
+ base::ScopedObservation<signin::IdentityManager,
+ signin::IdentityManager::Observer>
+ scoped_observation_{this};
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
index 4ebce2e3440..2c63bf3a1bd 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h"
+#include <memory>
#include <vector>
#include "base/run_loop.h"
@@ -102,9 +103,8 @@ class IdentityGaiaRemoteConsentFlowTest : public testing::Test {
std::set<std::string>());
RemoteConsentResolutionData resolution_data;
resolution_data.url = GURL("https://example.com/auth/");
- return std::unique_ptr<TestGaiaRemoteConsentFlow>(
- new TestGaiaRemoteConsentFlow(delegate, token_key, resolution_data,
- window_key));
+ return std::make_unique<TestGaiaRemoteConsentFlow>(
+ delegate, token_key, resolution_data, window_key);
}
base::HistogramTester* histogram_tester() { return &histogram_tester_; }
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
index 0b6a71bee69..d1dadce7e03 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -79,7 +79,7 @@
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/ash/login/users/mock_user_manager.h"
#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chromeos/network/network_handler.h"
@@ -133,7 +133,8 @@ class AsyncFunctionRunner {
void RunFunctionAsync(ExtensionFunction* function,
const std::string& args,
content::BrowserContext* browser_context) {
- response_delegate_.reset(new api_test_utils::SendResponseHelper(function));
+ response_delegate_ =
+ std::make_unique<api_test_utils::SendResponseHelper>(function);
std::unique_ptr<base::ListValue> parsed_args(utils::ParseList(args));
ASSERT_TRUE(parsed_args.get())
<< "Could not parse extension function arguments: " << args;
@@ -2781,7 +2782,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, GranularPermissionsResponse) {
class GetAuthTokenFunctionPublicSessionTest : public GetAuthTokenFunctionTest {
public:
GetAuthTokenFunctionPublicSessionTest()
- : user_manager_(new chromeos::MockUserManager) {}
+ : user_manager_(new ash::MockUserManager) {}
protected:
void SetUpInProcessBrowserTestFixture() override {
@@ -2793,8 +2794,8 @@ class GetAuthTokenFunctionPublicSessionTest : public GetAuthTokenFunctionTest {
EXPECT_CALL(*user_manager_, IsLoggedInAsPublicAccount())
.WillRepeatedly(Return(true));
EXPECT_CALL(*user_manager_, GetLoggedInUsers())
- .WillRepeatedly(testing::Invoke(user_manager_,
- &chromeos::MockUserManager::GetUsers));
+ .WillRepeatedly(
+ testing::Invoke(user_manager_, &ash::MockUserManager::GetUsers));
}
scoped_refptr<const Extension> CreateTestExtension(const std::string& id) {
@@ -2815,7 +2816,7 @@ class GetAuthTokenFunctionPublicSessionTest : public GetAuthTokenFunctionTest {
"fake-id")};
// Owned by |user_manager_enabler|.
- chromeos::MockUserManager* user_manager_;
+ ash::MockUserManager* user_manager_;
};
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionPublicSessionTest, NonAllowlisted) {
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
index ac92341a2c5..facc47880fa 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
@@ -45,7 +45,7 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/app_mode/app_mode_utils.h"
-#include "chrome/browser/chromeos/login/session/user_session_manager.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/device_identity/device_oauth2_token_service.h"
#include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
@@ -228,7 +228,7 @@ void IdentityGetAuthTokenFunction::GetAuthTokenForPrimaryAccount(
OnAccountsInCookieUpdated(accounts_in_cookies,
GoogleServiceAuthError::AuthErrorNone());
} else {
- scoped_identity_manager_observer_.Add(identity_manager);
+ scoped_identity_manager_observation_.Observe(identity_manager);
}
}
}
@@ -290,7 +290,7 @@ void IdentityGetAuthTokenFunction::OnAccountsInCookieUpdated(
// Stop listening cookies.
account_listening_mode_ = AccountListeningMode::kNotListening;
- scoped_identity_manager_observer_.RemoveAll();
+ scoped_identity_manager_observation_.Reset();
const std::vector<gaia::ListedAccount>& accounts =
accounts_in_cookie_jar_info.signed_in_accounts;
@@ -405,7 +405,7 @@ void IdentityGetAuthTokenFunction::StartSigninFlow() {
token_key_.account_info.account_id));
}
}
- scoped_identity_manager_observer_.Add(identity_manager);
+ scoped_identity_manager_observation_.Observe(identity_manager);
ShowExtensionLoginPrompt();
#endif
@@ -628,7 +628,7 @@ void IdentityGetAuthTokenFunction::OnRefreshTokenUpdatedForAccount(
if (token_key_.account_info == account_info) {
// Stop listening tokens.
account_listening_mode_ = AccountListeningMode::kNotListening;
- scoped_identity_manager_observer_.RemoveAll();
+ scoped_identity_manager_observation_.Reset();
StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE);
}
@@ -669,7 +669,7 @@ void IdentityGetAuthTokenFunction::OnPrimaryAccountChanged(
DCHECK(IdentityManagerFactory::GetForProfile(GetProfile())
->HasAccountWithRefreshToken(primary_account_info.account_id));
account_listening_mode_ = AccountListeningMode::kNotListening;
- scoped_identity_manager_observer_.RemoveAll();
+ scoped_identity_manager_observation_.Reset();
StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE);
}
@@ -828,7 +828,7 @@ void IdentityGetAuthTokenFunction::OnAccessTokenFetchCompleted(
void IdentityGetAuthTokenFunction::OnIdentityAPIShutdown() {
device_access_token_request_.reset();
token_key_account_access_token_fetcher_.reset();
- scoped_identity_manager_observer_.RemoveAll();
+ scoped_identity_manager_observation_.Reset();
extensions::IdentityAPI::GetFactoryInstance()
->Get(GetProfile())
->mint_queue()
@@ -958,7 +958,8 @@ std::string IdentityGetAuthTokenFunction::GetOAuth2ClientId() const {
// Component apps using auto_approve may use Chrome's client ID by
// omitting the field.
- if (client_id.empty() && extension()->location() == Manifest::COMPONENT &&
+ if (client_id.empty() &&
+ extension()->location() == mojom::ManifestLocation::kComponent &&
oauth2_info.auto_approve) {
client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
}
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
index dc6e51381b4..d876ada0855 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
+++ b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
@@ -12,7 +12,7 @@
#include "base/callback_list.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h"
#include "chrome/browser/extensions/api/identity/identity_mint_queue.h"
@@ -246,8 +246,9 @@ class IdentityGetAuthTokenFunction : public ExtensionFunction,
// Invoked when IdentityAPI is shut down.
base::CallbackListSubscription identity_api_shutdown_subscription_;
- ScopedObserver<signin::IdentityManager, signin::IdentityManager::Observer>
- scoped_identity_manager_observer_{this};
+ base::ScopedObservation<signin::IdentityManager,
+ signin::IdentityManager::Observer>
+ scoped_identity_manager_observation_{this};
// This class can be listening to account changes, but only for one type of
// events at a time.
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
index 5ce89bdf426..d0e4371465e 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
@@ -26,7 +26,7 @@ signin::ConsentLevel GetConsentLevelFromProfileDetails(
switch (account_status) {
case api::identity::ACCOUNT_STATUS_ANY:
- return signin::ConsentLevel::kNotRequired;
+ return signin::ConsentLevel::kSignin;
case api::identity::ACCOUNT_STATUS_NONE:
case api::identity::ACCOUNT_STATUS_SYNC:
return signin::ConsentLevel::kSync;
@@ -55,7 +55,7 @@ ExtensionFunction::ResponseAction IdentityGetProfileUserInfoFunction::Run() {
api::identity::ProfileUserInfo profile_user_info;
if (extension()->permissions_data()->HasAPIPermission(
- APIPermission::kIdentityEmail)) {
+ mojom::APIPermissionID::kIdentityEmail)) {
signin::ConsentLevel consent_level =
GetConsentLevelFromProfileDetails(params->details.get());
auto account_info = IdentityManagerFactory::GetForProfile(
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
index 79655fc7577..f87afd6891c 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
@@ -49,8 +49,8 @@ ExtensionFunction::ResponseAction IdentityLaunchWebAuthFlowFunction::Run() {
AddRef(); // Balanced in OnAuthFlowSuccess/Failure.
- auth_flow_.reset(new WebAuthFlow(this, profile, auth_url, mode,
- WebAuthFlow::LAUNCH_WEB_AUTH_FLOW));
+ auth_flow_ = std::make_unique<WebAuthFlow>(this, profile, auth_url, mode,
+ WebAuthFlow::LAUNCH_WEB_AUTH_FLOW);
auth_flow_->Start();
return RespondLater();
}
diff --git a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
index e3ff426dad0..d017f925861 100644
--- a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
+++ b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
@@ -153,7 +153,8 @@ content::StoragePartitionConfig WebAuthFlow::GetWebViewPartitionConfig(
// This has to mirror the logic in WebViewGuest::CreateWebContents for
// creating the correct StoragePartitionConfig.
auto result = content::StoragePartitionConfig::Create(
- extension_misc::kIdentityApiUiAppId, GetPartitionName(partition),
+ browser_context, extension_misc::kIdentityApiUiAppId,
+ GetPartitionName(partition),
/*in_memory=*/true);
result.set_fallback_to_partition_domain_for_blob_urls(
browser_context->IsOffTheRecord()
diff --git a/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc b/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
index b1940df89eb..96ef0eb06cd 100644
--- a/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
@@ -8,7 +8,7 @@
namespace extensions {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IdleGetAutoLockDelay) {
ASSERT_TRUE(RunExtensionTest("idle/get_auto_lock_delay")) << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
index 367e6f16412..1e6a4e0db94 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
@@ -105,7 +105,8 @@ IN_PROC_BROWSER_TEST_F(ImageWriterPrivateApiTest, TestWriteFromFile) {
base::BindOnce(set_up_utility_client_callbacks));
#endif
- ASSERT_TRUE(RunPlatformAppTest("image_writer_private/write_from_file"))
+ ASSERT_TRUE(RunExtensionTest({.name = "image_writer_private/write_from_file",
+ .launch_as_platform_app = true}))
<< message_;
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.cc b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
index bc9ccedd582..f5daeffb000 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
@@ -40,17 +40,9 @@ using content::BrowserThread;
OperationManager::OperationManager(content::BrowserContext* context)
: browser_context_(context) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
- Profile* profile = Profile::FromBrowserContext(browser_context_);
- registrar_.Add(this,
- extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
- content::Source<Profile>(profile));
- registrar_.Add(this,
- extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE,
- content::Source<Profile>(profile));
- registrar_.Add(this,
- extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED,
- content::Source<Profile>(profile));
+ extension_registry_observation_.Observe(
+ ExtensionRegistry::Get(browser_context_));
+ process_manager_observation_.Observe(ProcessManager::Get(browser_context_));
}
OperationManager::~OperationManager() {
@@ -244,27 +236,23 @@ void OperationManager::OnExtensionUnloaded(
DeleteOperation(extension->id());
}
-void OperationManager::Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- switch (type) {
- case extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: {
- DeleteOperation(content::Details<const Extension>(details).ptr()->id());
- break;
- }
- case extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE:
- // Intentional fall-through.
- case extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED:
- // Note: |ExtensionHost::extension()| can be null if the extension was
- // already unloaded, use ExtensionHost::extension_id() instead.
- DeleteOperation(
- content::Details<ExtensionHost>(details)->extension_id());
- break;
- default: {
- NOTREACHED();
- break;
- }
- }
+void OperationManager::OnShutdown(ExtensionRegistry* registry) {
+ DCHECK(extension_registry_observation_.IsObservingSource(registry));
+ extension_registry_observation_.Reset();
+}
+
+void OperationManager::OnBackgroundHostClose(const std::string& extension_id) {
+ DeleteOperation(extension_id);
+}
+
+void OperationManager::OnProcessManagerShutdown(ProcessManager* manager) {
+ DCHECK(process_manager_observation_.IsObservingSource(manager));
+ process_manager_observation_.Reset();
+}
+
+void OperationManager::OnExtensionProcessTerminated(
+ const Extension* extension) {
+ DeleteOperation(extension->id());
}
OperationManager* OperationManager::Get(content::BrowserContext* context) {
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h
index f45645f523c..7265d5b2506 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h
@@ -11,15 +11,16 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h"
#include "chrome/browser/extensions/api/image_writer_private/operation.h"
#include "chrome/common/extensions/api/image_writer_private.h"
#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/process_manager.h"
+#include "extensions/browser/process_manager_observer.h"
#include "extensions/common/extension_id.h"
#include "url/gurl.h"
@@ -38,8 +39,8 @@ class Operation;
// Manages image writer operations for the current profile. Including clean-up
// and message routing.
class OperationManager : public BrowserContextKeyedAPI,
- public content::NotificationObserver,
- public extensions::ExtensionRegistryObserver,
+ public ExtensionRegistryObserver,
+ public ProcessManagerObserver,
public base::SupportsWeakPtr<OperationManager> {
public:
explicit OperationManager(content::BrowserContext* context);
@@ -91,15 +92,16 @@ class OperationManager : public BrowserContextKeyedAPI,
return "OperationManager";
}
- // NotificationObserver implementation.
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override;
-
- // ExtensionRegistryObserver implementation.
+ // ExtensionRegistryObserver:
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
+ void OnShutdown(ExtensionRegistry* registry) override;
+
+ // ProcessManagerObserver:
+ void OnBackgroundHostClose(const std::string& extension_id) override;
+ void OnProcessManagerShutdown(ProcessManager* manager) override;
+ void OnExtensionProcessTerminated(const Extension* extension) override;
Operation* GetOperation(const ExtensionId& extension_id);
void DeleteOperation(const ExtensionId& extension_id);
@@ -112,11 +114,14 @@ class OperationManager : public BrowserContextKeyedAPI,
content::BrowserContext* browser_context_;
OperationMap operations_;
- content::NotificationRegistrar registrar_;
// Listen to extension unloaded notification.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
+
+ // Listen to ProcessManagerObserver for ExtensionHost.
+ base::ScopedObservation<ProcessManager, ProcessManagerObserver>
+ process_manager_observation_{this};
base::WeakPtrFactory<OperationManager> weak_factory_{this};
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
index f9c23d755c1..e6611e6b94d 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
@@ -22,19 +22,21 @@ namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled;
namespace SetComposition = extensions::api::input_ime::SetComposition;
namespace CommitText = extensions::api::input_ime::CommitText;
namespace SendKeyEvents = extensions::api::input_ime::SendKeyEvents;
-using chromeos::InputMethodEngineBase;
namespace {
const char kErrorRouterNotAvailable[] = "The router is not available.";
const char kErrorSetKeyEventsFail[] = "Could not send key events.";
-InputMethodEngineBase* GetEngineIfActive(Profile* profile,
- const std::string& extension_id,
- std::string* error) {
+using chromeos::InputMethodEngine;
+using chromeos::InputMethodEngineBase;
+
+InputMethodEngine* GetEngineIfActive(Profile* profile,
+ const std::string& extension_id,
+ std::string* error) {
extensions::InputImeEventRouter* event_router =
extensions::GetInputImeEventRouter(profile);
DCHECK(event_router) << kErrorRouterNotAvailable;
- InputMethodEngineBase* engine =
+ InputMethodEngine* engine =
event_router->GetEngineIfActive(extension_id, error);
return engine;
}
@@ -98,7 +100,7 @@ std::string GetKeyFromEvent(const ui::KeyEvent& event) {
} else {
ch = event.GetCharacter();
}
- return base::UTF16ToUTF8(base::string16(1, ch));
+ return base::UTF16ToUTF8(std::u16string(1, ch));
}
ui::KeyEvent ConvertKeyboardEventToUIKeyEvent(
@@ -152,12 +154,13 @@ void ImeObserver::OnActivate(const std::string& component_id) {
}
void ImeObserver::OnFocus(
+ int context_id,
const IMEEngineHandlerInterface::InputContext& context) {
if (extension_id_.empty() || !HasListener(input_ime::OnFocus::kEventName))
return;
input_ime::InputContext context_value;
- context_value.context_id = context.id;
+ context_value.context_id = context_id;
context_value.type =
input_ime::ParseInputContextType(ConvertInputContextType(context));
context_value.auto_correct = ConvertInputContextAutoCorrect(context);
@@ -200,7 +203,7 @@ void ImeObserver::OnKeyEvent(
}
std::string error;
- InputMethodEngineBase* engine =
+ InputMethodEngine* engine =
GetEngineIfActive(profile_, extension_id_, &error);
if (!engine)
return;
@@ -269,7 +272,7 @@ void ImeObserver::OnCompositionBoundsChanged(
const std::vector<gfx::Rect>& bounds) {}
void ImeObserver::OnSurroundingTextChanged(const std::string& component_id,
- const base::string16& text,
+ const std::u16string& text,
int cursor_pos,
int anchor_pos,
int offset_pos) {
@@ -435,7 +438,7 @@ ExtensionFunction::ResponseAction InputImeKeyEventHandledFunction::Run() {
std::unique_ptr<KeyEventHandled::Params> params(
KeyEventHandled::Params::Create(*args_));
std::string error;
- InputMethodEngineBase* engine = GetEngineIfActive(
+ InputMethodEngine* engine = GetEngineIfActive(
Profile::FromBrowserContext(browser_context()), extension_id(), &error);
if (!engine)
return RespondNow(Error(InformativeError(error, static_function_name())));
@@ -446,7 +449,7 @@ ExtensionFunction::ResponseAction InputImeKeyEventHandledFunction::Run() {
ExtensionFunction::ResponseAction InputImeSetCompositionFunction::Run() {
std::string error;
- InputMethodEngineBase* engine = GetEngineIfActive(
+ InputMethodEngine* engine = GetEngineIfActive(
Profile::FromBrowserContext(browser_context()), extension_id(), &error);
if (!engine)
return RespondNow(Error(InformativeError(error, static_function_name())));
@@ -492,7 +495,7 @@ ExtensionFunction::ResponseAction InputImeSetCompositionFunction::Run() {
ExtensionFunction::ResponseAction InputImeCommitTextFunction::Run() {
std::string error;
- InputMethodEngineBase* engine = GetEngineIfActive(
+ InputMethodEngine* engine = GetEngineIfActive(
Profile::FromBrowserContext(browser_context()), extension_id(), &error);
if (!engine)
return RespondNow(Error(InformativeError(error, static_function_name())));
@@ -500,7 +503,8 @@ ExtensionFunction::ResponseAction InputImeCommitTextFunction::Run() {
std::unique_ptr<CommitText::Params> parent_params(
CommitText::Params::Create(*args_));
const CommitText::Params::Parameters& params = parent_params->parameters;
- if (!engine->CommitText(params.context_id, params.text.c_str(), &error)) {
+ if (!engine->CommitText(params.context_id, base::UTF8ToUTF16(params.text),
+ &error)) {
std::unique_ptr<base::ListValue> results =
std::make_unique<base::ListValue>();
results->Append(std::make_unique<base::Value>(false));
@@ -512,7 +516,7 @@ ExtensionFunction::ResponseAction InputImeCommitTextFunction::Run() {
ExtensionFunction::ResponseAction InputImeSendKeyEventsFunction::Run() {
std::string error;
- InputMethodEngineBase* engine = GetEngineIfActive(
+ InputMethodEngine* engine = GetEngineIfActive(
Profile::FromBrowserContext(browser_context()), extension_id(), &error);
if (!engine)
return RespondNow(Error(InformativeError(error, static_function_name())));
@@ -537,7 +541,8 @@ ExtensionFunction::ResponseAction InputImeSendKeyEventsFunction::Run() {
InputImeAPI::InputImeAPI(content::BrowserContext* context)
: browser_context_(context) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
+ extension_registry_observation_.Observe(
+ ExtensionRegistry::Get(browser_context_));
EventRouter* event_router = EventRouter::Get(browser_context_);
event_router->RegisterObserver(this, input_ime::OnFocus::kEventName);
@@ -546,7 +551,7 @@ InputImeAPI::InputImeAPI(content::BrowserContext* context)
InputImeAPI::~InputImeAPI() = default;
void InputImeAPI::Shutdown() {
- extension_registry_observer_.RemoveAll();
+ extension_registry_observation_.Reset();
InputImeEventRouterFactory::GetInstance()->RemoveProfile(
Profile::FromBrowserContext(browser_context_));
EventRouter::Get(browser_context_)->UnregisterObserver(this);
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h
index d7276fb5d36..c9676c860e6 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h
@@ -11,7 +11,7 @@
#include "base/macros.h"
#include "base/memory/singleton.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
@@ -49,7 +49,8 @@ class ImeObserver : public InputMethodEngineBase::Observer {
// InputMethodEngineBase::Observer overrides.
void OnActivate(const std::string& component_id) override;
- void OnFocus(const IMEEngineHandlerInterface::InputContext& context) override;
+ void OnFocus(int context_id,
+ const IMEEngineHandlerInterface::InputContext& context) override;
void OnBlur(int context_id) override;
void OnKeyEvent(
const std::string& component_id,
@@ -60,7 +61,7 @@ class ImeObserver : public InputMethodEngineBase::Observer {
void OnCompositionBoundsChanged(
const std::vector<gfx::Rect>& bounds) override;
void OnSurroundingTextChanged(const std::string& component_id,
- const base::string16& text,
+ const std::u16string& text,
int cursor_pos,
int anchor_pos,
int offset_pos) override;
@@ -211,8 +212,8 @@ class InputImeAPI : public BrowserContextKeyedAPI,
content::BrowserContext* const browser_context_;
// Listen to extension load, unloaded notifications.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
std::unique_ptr<ui::IMEBridgeObserver> observer_;
};
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
index 5441f456efc..99f17d94caf 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -14,12 +14,12 @@
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/ash/login/lock/screen_locker.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/chromeos/input_method/assistive_window_properties.h"
#include "chrome/browser/chromeos/input_method/input_host_helper.h"
#include "chrome/browser/chromeos/input_method/input_method_engine.h"
#include "chrome/browser/chromeos/input_method/native_input_method_engine.h"
-#include "chrome/browser/chromeos/login/session/user_session_manager.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
#include "chrome/common/extensions/api/input_ime.h"
@@ -256,6 +256,7 @@ class ImeObserverChromeOS : public ui::ImeObserver {
}
void OnFocus(
+ int context_id,
const IMEEngineHandlerInterface::InputContext& context) override {
if (extension_id_.empty())
return;
@@ -265,7 +266,7 @@ class ImeObserverChromeOS : public ui::ImeObserver {
// inputs. We ensure that we only trigger one OnFocus event.
if (ExtensionHasListener(input_method_private::OnFocus::kEventName)) {
input_method_private::InputContext input_context;
- input_context.context_id = context.id;
+ input_context.context_id = context_id;
input_context.type = input_method_private::ParseInputContextType(
ConvertInputContextType(context));
input_context.mode = input_method_private::ParseInputModeType(
@@ -295,7 +296,7 @@ class ImeObserverChromeOS : public ui::ImeObserver {
return;
}
- ImeObserver::OnFocus(context);
+ ImeObserver::OnFocus(context_id, context);
}
void OnAssistiveWindowButtonClicked(
@@ -630,7 +631,7 @@ InputMethodEngine* InputImeEventRouter::GetEngine(
}
}
-InputMethodEngineBase* InputImeEventRouter::GetEngineIfActive(
+InputMethodEngine* InputImeEventRouter::GetEngineIfActive(
const std::string& extension_id,
std::string* error) {
auto it = engine_map_.find(extension_id);
@@ -1032,7 +1033,7 @@ void InputImeAPI::OnExtensionLoaded(content::BrowserContext* browser_context,
// can receive the onActivate event to recover itself upon the
// unexpected unload.
std::string error;
- InputMethodEngineBase* engine =
+ InputMethodEngine* engine =
event_router->GetEngineIfActive(extension->id(), &error);
DCHECK(engine) << error;
// When extension is unloaded unexpectedly and reloaded, OS doesn't pass
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h
index c9ae3b01185..afaeb8373d1 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h
@@ -200,7 +200,7 @@ class InputImeEventRouter : public InputImeEventRouterBase {
void UnregisterAllImes(const std::string& extension_id);
chromeos::InputMethodEngine* GetEngine(const std::string& extension_id);
- chromeos::InputMethodEngineBase* GetEngineIfActive(
+ chromeos::InputMethodEngine* GetEngineIfActive(
const std::string& extension_id,
std::string* error) override;
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_event_router_base.h b/chromium/chrome/browser/extensions/api/input_ime/input_ime_event_router_base.h
index 9c9d5ecabf6..fac91f06325 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_event_router_base.h
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_event_router_base.h
@@ -10,7 +10,7 @@
#include <utility>
#include "base/macros.h"
-#include "chrome/browser/chromeos/input_method/input_method_engine_base.h"
+#include "chrome/browser/chromeos/input_method/input_method_engine.h"
#include "chrome/browser/profiles/profile.h"
#include "ui/base/ime/chromeos/ime_engine_handler_interface.h"
@@ -22,7 +22,7 @@ class InputImeEventRouterBase {
virtual ~InputImeEventRouterBase();
// Gets the input method engine if the extension is active.
- virtual chromeos::InputMethodEngineBase* GetEngineIfActive(
+ virtual chromeos::InputMethodEngine* GetEngineIfActive(
const std::string& extension_id,
std::string* error) = 0;
diff --git a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index a2a1df0089a..ccc5e4d1aad 100644
--- a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -14,7 +14,6 @@
#include "base/containers/contains.h"
#include "base/containers/flat_set.h"
-#include "base/strings/string16.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -59,14 +58,14 @@ namespace extensions {
namespace language_settings_private = api::language_settings_private;
+namespace {
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
using chromeos::input_method::InputMethodDescriptor;
using chromeos::input_method::InputMethodDescriptors;
using chromeos::input_method::InputMethodManager;
using chromeos::input_method::InputMethodUtil;
-namespace {
-
// Returns the set of IDs of all enabled IMEs.
std::unordered_set<std::string> GetEnabledIMEs(
scoped_refptr<InputMethodManager::State> ime_state) {
@@ -135,11 +134,8 @@ std::vector<std::string> GetSortedComponentIMEs(
}
}
}
- if (base::FeatureList::IsEnabled(
- chromeos::features::kLanguageSettingsUpdate)) {
- for (const auto& input_method_id : available_component_imes) {
- component_ime_list.push_back(input_method_id);
- }
+ for (const auto& input_method_id : available_component_imes) {
+ component_ime_list.push_back(input_method_id);
}
return component_ime_list;
@@ -188,6 +184,13 @@ std::vector<std::string> GetSortedThirdPartyIMEs(
}
}
+ // Add the rest of the third party IMEs
+ auto item = descriptors.begin();
+ while (item != descriptors.end()) {
+ ime_list.push_back(item->id());
+ item = descriptors.erase(item);
+ }
+
return ime_list;
}
@@ -202,13 +205,20 @@ std::vector<std::string> GetInputMethodTags(
return tags;
}
-} // namespace
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+std::unique_ptr<translate::TranslatePrefs>
+CreateTranslatePrefsForBrowserContext(
+ content::BrowserContext* browser_context) {
+ return ChromeTranslateClient::CreateTranslatePrefs(
+ Profile::FromBrowserContext(browser_context)->GetPrefs());
+}
+
+} // namespace
+
LanguageSettingsPrivateGetLanguageListFunction::
LanguageSettingsPrivateGetLanguageListFunction()
- : chrome_details_(this),
- language_list_(std::make_unique<base::ListValue>()) {}
+ : language_list_(std::make_unique<base::ListValue>()) {}
LanguageSettingsPrivateGetLanguageListFunction::
~LanguageSettingsPrivateGetLanguageListFunction() = default;
@@ -218,8 +228,7 @@ LanguageSettingsPrivateGetLanguageListFunction::Run() {
// Collect the language codes from the supported accept-languages.
const std::string app_locale = g_browser_process->GetApplicationLocale();
const std::unique_ptr<translate::TranslatePrefs> translate_prefs =
- ChromeTranslateClient::CreateTranslatePrefs(
- chrome_details_.GetProfile()->GetPrefs());
+ CreateTranslatePrefsForBrowserContext(browser_context());
std::vector<translate::TranslateLanguageInfo> languages;
translate::TranslatePrefs::GetLanguageInfoList(
@@ -234,8 +243,8 @@ LanguageSettingsPrivateGetLanguageListFunction::Run() {
// Build the language list.
language_list_->Clear();
#if BUILDFLAG(IS_CHROMEOS_ASH)
- const std::unordered_set<std::string> allowed_ui_locales(
- GetAllowedLanguages(chrome_details_.GetProfile()->GetPrefs()));
+ const std::unordered_set<std::string> allowed_ui_locales(GetAllowedLanguages(
+ Profile::FromBrowserContext(browser_context())->GetPrefs()));
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
for (const auto& entry : languages) {
language_settings_private::Language language;
@@ -246,15 +255,15 @@ LanguageSettingsPrivateGetLanguageListFunction::Run() {
// Set optional fields only if they differ from the default.
if (base::Contains(spellcheck_language_set, entry.code)) {
- language.supports_spellcheck.reset(new bool(true));
+ language.supports_spellcheck = std::make_unique<bool>(true);
}
if (entry.supports_translate) {
- language.supports_translate.reset(new bool(true));
+ language.supports_translate = std::make_unique<bool>(true);
}
std::string temp_locale = entry.code;
if (language::ConvertToActualUILocale(&temp_locale)) {
- language.supports_ui.reset(new bool(true));
+ language.supports_ui = std::make_unique<bool>(true);
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (!allowed_ui_locales.empty() &&
@@ -326,8 +335,7 @@ void LanguageSettingsPrivateGetLanguageListFunction::
#endif // defined(OS_WIN)
LanguageSettingsPrivateEnableLanguageFunction::
- LanguageSettingsPrivateEnableLanguageFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateEnableLanguageFunction() = default;
LanguageSettingsPrivateEnableLanguageFunction::
~LanguageSettingsPrivateEnableLanguageFunction() = default;
@@ -340,8 +348,7 @@ LanguageSettingsPrivateEnableLanguageFunction::Run() {
const std::string& language_code = parameters->language_code;
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
- ChromeTranslateClient::CreateTranslatePrefs(
- chrome_details_.GetProfile()->GetPrefs());
+ CreateTranslatePrefsForBrowserContext(browser_context());
std::vector<std::string> languages;
translate_prefs->GetLanguageList(&languages);
@@ -359,8 +366,7 @@ LanguageSettingsPrivateEnableLanguageFunction::Run() {
}
LanguageSettingsPrivateDisableLanguageFunction::
- LanguageSettingsPrivateDisableLanguageFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateDisableLanguageFunction() = default;
LanguageSettingsPrivateDisableLanguageFunction::
~LanguageSettingsPrivateDisableLanguageFunction() = default;
@@ -373,8 +379,7 @@ LanguageSettingsPrivateDisableLanguageFunction::Run() {
const std::string& language_code = parameters->language_code;
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
- ChromeTranslateClient::CreateTranslatePrefs(
- chrome_details_.GetProfile()->GetPrefs());
+ CreateTranslatePrefsForBrowserContext(browser_context());
std::vector<std::string> languages;
translate_prefs->GetLanguageList(&languages);
@@ -395,8 +400,7 @@ LanguageSettingsPrivateDisableLanguageFunction::Run() {
}
LanguageSettingsPrivateSetEnableTranslationForLanguageFunction::
- LanguageSettingsPrivateSetEnableTranslationForLanguageFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateSetEnableTranslationForLanguageFunction() = default;
LanguageSettingsPrivateSetEnableTranslationForLanguageFunction::
~LanguageSettingsPrivateSetEnableTranslationForLanguageFunction() = default;
@@ -411,8 +415,7 @@ LanguageSettingsPrivateSetEnableTranslationForLanguageFunction::Run() {
const bool enable = parameters->enable;
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
- ChromeTranslateClient::CreateTranslatePrefs(
- chrome_details_.GetProfile()->GetPrefs());
+ CreateTranslatePrefsForBrowserContext(browser_context());
if (enable) {
translate_prefs->UnblockLanguage(language_code);
@@ -423,9 +426,74 @@ LanguageSettingsPrivateSetEnableTranslationForLanguageFunction::Run() {
return RespondNow(NoArguments());
}
+LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction::
+ LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction() = default;
+
+LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction::
+ ~LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction() = default;
+
+ExtensionFunction::ResponseAction
+LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction::Run() {
+ const std::unique_ptr<translate::TranslatePrefs> translate_prefs =
+ CreateTranslatePrefsForBrowserContext(browser_context());
+
+ std::vector<std::string> languages =
+ translate_prefs->GetAlwaysTranslateLanguages();
+
+ std::unique_ptr<base::ListValue> always_translate_languages_ =
+ (std::make_unique<base::ListValue>());
+ for (const auto& entry : languages) {
+ always_translate_languages_->Append(entry);
+ }
+
+ return RespondNow(OneArgument(
+ base::Value::FromUniquePtrValue(std::move(always_translate_languages_))));
+}
+
+LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction::
+ LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction() = default;
+
+LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction::
+ ~LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction() = default;
+
+ExtensionFunction::ResponseAction
+LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction::Run() {
+ const auto params = language_settings_private::
+ SetLanguageAlwaysTranslateState::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ const std::unique_ptr<translate::TranslatePrefs> translate_prefs =
+ CreateTranslatePrefsForBrowserContext(browser_context());
+
+ translate_prefs->SetLanguageAlwaysTranslateState(params->language_code,
+ params->always_translate);
+
+ return RespondNow(NoArguments());
+}
+
+LanguageSettingsPrivateGetNeverTranslateLanguagesFunction::
+ LanguageSettingsPrivateGetNeverTranslateLanguagesFunction() = default;
+
+LanguageSettingsPrivateGetNeverTranslateLanguagesFunction::
+ ~LanguageSettingsPrivateGetNeverTranslateLanguagesFunction() = default;
+
+ExtensionFunction::ResponseAction
+LanguageSettingsPrivateGetNeverTranslateLanguagesFunction::Run() {
+ const std::unique_ptr<translate::TranslatePrefs> translate_prefs =
+ CreateTranslatePrefsForBrowserContext(browser_context());
+
+ std::vector<std::string> languages =
+ translate_prefs->GetNeverTranslateLanguages();
+
+ base::Value never_translate_languages(base::Value::Type::LIST);
+ for (auto& entry : languages) {
+ never_translate_languages.Append(std::move(entry));
+ }
+ return RespondNow(OneArgument(std::move(never_translate_languages)));
+}
+
LanguageSettingsPrivateMoveLanguageFunction::
- LanguageSettingsPrivateMoveLanguageFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateMoveLanguageFunction() = default;
LanguageSettingsPrivateMoveLanguageFunction::
~LanguageSettingsPrivateMoveLanguageFunction() = default;
@@ -444,8 +512,7 @@ LanguageSettingsPrivateMoveLanguageFunction::Run() {
const language_settings_private::MoveType move_type = parameters->move_type;
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
- ChromeTranslateClient::CreateTranslatePrefs(
- chrome_details_.GetProfile()->GetPrefs());
+ CreateTranslatePrefsForBrowserContext(browser_context());
translate::TranslatePrefs::RearrangeSpecifier where =
translate::TranslatePrefs::kNone;
@@ -598,20 +665,47 @@ LanguageSettingsPrivateRemoveSpellcheckWordFunction::Run() {
}
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
- LanguageSettingsPrivateGetTranslateTargetLanguageFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateGetTranslateTargetLanguageFunction() = default;
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
~LanguageSettingsPrivateGetTranslateTargetLanguageFunction() = default;
ExtensionFunction::ResponseAction
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::Run() {
- Profile* profile = chrome_details_.GetProfile();
language::LanguageModel* language_model =
- LanguageModelManagerFactory::GetForBrowserContext(profile)
+ LanguageModelManagerFactory::GetForBrowserContext(browser_context())
->GetPrimaryModel();
return RespondNow(OneArgument(base::Value(TranslateService::GetTargetLanguage(
- profile->GetPrefs(), language_model))));
+ Profile::FromBrowserContext(browser_context())->GetPrefs(),
+ language_model))));
+}
+
+LanguageSettingsPrivateSetTranslateTargetLanguageFunction::
+ LanguageSettingsPrivateSetTranslateTargetLanguageFunction() = default;
+
+LanguageSettingsPrivateSetTranslateTargetLanguageFunction::
+ ~LanguageSettingsPrivateSetTranslateTargetLanguageFunction() = default;
+
+ExtensionFunction::ResponseAction
+LanguageSettingsPrivateSetTranslateTargetLanguageFunction::Run() {
+ const auto parameters =
+ language_settings_private::SetTranslateTargetLanguage::Params::Create(
+ *args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
+ const std::string& language_code = parameters->language_code;
+
+ std::unique_ptr<translate::TranslatePrefs> translate_prefs =
+ CreateTranslatePrefsForBrowserContext(browser_context());
+
+ std::string chrome_language = language_code;
+ translate_prefs->AddToLanguageList(language_code, false);
+
+ if (language_code == translate_prefs->GetRecentTargetLanguage()) {
+ return RespondNow(NoArguments());
+ }
+ translate_prefs->SetRecentTargetLanguage(language_code);
+
+ return RespondNow(NoArguments());
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -640,9 +734,9 @@ void PopulateInputMethodListFromDescriptors(
}
// Map of sorted [display name -> input methods].
- std::map<base::string16, language_settings_private::InputMethod,
- l10n_util::StringComparator<base::string16>>
- input_map(l10n_util::StringComparator<base::string16>(collator.get()));
+ std::map<std::u16string, language_settings_private::InputMethod,
+ l10n_util::StringComparator<std::u16string>>
+ input_map(l10n_util::StringComparator<std::u16string>(collator.get()));
for (const auto& descriptor : descriptors) {
language_settings_private::InputMethod input_method;
@@ -706,8 +800,7 @@ LanguageSettingsPrivateGetInputMethodListsFunction::Run() {
}
LanguageSettingsPrivateAddInputMethodFunction::
- LanguageSettingsPrivateAddInputMethodFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateAddInputMethodFunction() = default;
LanguageSettingsPrivateAddInputMethodFunction::
~LanguageSettingsPrivateAddInputMethodFunction() = default;
@@ -732,7 +825,8 @@ LanguageSettingsPrivateAddInputMethodFunction::Run() {
chromeos::extension_ime_util::IsComponentExtensionIME(
new_input_method_id);
- PrefService* prefs = chrome_details_.GetProfile()->GetPrefs();
+ PrefService* prefs =
+ Profile::FromBrowserContext(browser_context())->GetPrefs();
const char* pref_name = is_component_extension_ime
? prefs::kLanguagePreloadEngines
: prefs::kLanguageEnabledImes;
@@ -761,8 +855,7 @@ LanguageSettingsPrivateAddInputMethodFunction::Run() {
}
LanguageSettingsPrivateRemoveInputMethodFunction::
- LanguageSettingsPrivateRemoveInputMethodFunction()
- : chrome_details_(this) {}
+ LanguageSettingsPrivateRemoveInputMethodFunction() = default;
LanguageSettingsPrivateRemoveInputMethodFunction::
~LanguageSettingsPrivateRemoveInputMethodFunction() = default;
@@ -787,7 +880,8 @@ LanguageSettingsPrivateRemoveInputMethodFunction::Run() {
chromeos::extension_ime_util::IsComponentExtensionIME(input_method_id);
// Use the pref for the corresponding input method type.
- PrefService* prefs = chrome_details_.GetProfile()->GetPrefs();
+ PrefService* prefs =
+ Profile::FromBrowserContext(browser_context())->GetPrefs();
const char* pref_name = is_component_extension_ime
? prefs::kLanguagePreloadEngines
: prefs::kLanguageEnabledImes;
diff --git a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h
index 4a8a64b7004..7cbc552c65e 100644
--- a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h
+++ b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h
@@ -7,7 +7,6 @@
#include "base/macros.h"
#include "build/build_config.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h"
#include "extensions/browser/extension_function.h"
@@ -33,8 +32,6 @@ class LanguageSettingsPrivateGetLanguageListFunction
#endif // defined(OS_WIN)
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
std::unique_ptr<base::ListValue> language_list_;
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateGetLanguageListFunction);
@@ -54,8 +51,6 @@ class LanguageSettingsPrivateEnableLanguageFunction : public ExtensionFunction {
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateEnableLanguageFunction);
};
@@ -74,8 +69,6 @@ class LanguageSettingsPrivateDisableLanguageFunction
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateDisableLanguageFunction);
};
@@ -96,7 +89,6 @@ class LanguageSettingsPrivateSetEnableTranslationForLanguageFunction
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
DISALLOW_COPY_AND_ASSIGN(
LanguageSettingsPrivateSetEnableTranslationForLanguageFunction);
};
@@ -115,10 +107,70 @@ class LanguageSettingsPrivateMoveLanguageFunction : public ExtensionFunction {
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateMoveLanguageFunction);
};
+// Implements the languageSettingsPrivate.getAlwaysTranslateLanguages method.
+class LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction
+ : public ExtensionFunction {
+ public:
+ LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction();
+ DECLARE_EXTENSION_FUNCTION(
+ "languageSettingsPrivate.getAlwaysTranslateLanguages",
+ LANGUAGESETTINGSPRIVATE_GETALWAYSTRANSLATELANGUAGES)
+
+ protected:
+ ~LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction() override;
+
+ // ExtensionFunction overrides.
+ ResponseAction Run() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(
+ LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction);
+};
+
+// Implements the languageSettingsPrivate.setLanguageAlwaysTranslateState
+// method.
+class LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction
+ : public ExtensionFunction {
+ public:
+ LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction();
+ DECLARE_EXTENSION_FUNCTION(
+ "languageSettingsPrivate.setLanguageAlwaysTranslateState",
+ LANGUAGESETTINGSPRIVATE_SETLANGUAGEALWAYSTRANSLATESTATE)
+
+ protected:
+ ~LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction() override;
+
+ // ExtensionFunction overrides.
+ ResponseAction Run() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(
+ LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction);
+};
+
+// Implements the languageSettingsPrivate.getNeverTranslateLanguages method.
+class LanguageSettingsPrivateGetNeverTranslateLanguagesFunction
+ : public ExtensionFunction {
+ public:
+ LanguageSettingsPrivateGetNeverTranslateLanguagesFunction();
+ DECLARE_EXTENSION_FUNCTION(
+ "languageSettingsPrivate.getNeverTranslateLanguages",
+ LANGUAGESETTINGSPRIVATE_GETNEVERTRANSLATELANGUAGES)
+
+ protected:
+ ~LanguageSettingsPrivateGetNeverTranslateLanguagesFunction() override;
+
+ // ExtensionFunction overrides.
+ ResponseAction Run() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(
+ LanguageSettingsPrivateGetNeverTranslateLanguagesFunction);
+};
+
// Implements the languageSettingsPrivate.getSpellcheckDictionaryStatuses
// method.
class LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction
@@ -219,12 +271,30 @@ class LanguageSettingsPrivateGetTranslateTargetLanguageFunction
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(
LanguageSettingsPrivateGetTranslateTargetLanguageFunction);
};
+// Implements the languageSettingsPrivate.setTranslateTargetLanguage method.
+class LanguageSettingsPrivateSetTranslateTargetLanguageFunction
+ : public ExtensionFunction {
+ public:
+ LanguageSettingsPrivateSetTranslateTargetLanguageFunction();
+ DECLARE_EXTENSION_FUNCTION(
+ "languageSettingsPrivate.setTranslateTargetLanguage",
+ LANGUAGESETTINGSPRIVATE_SETTRANSLATETARGETLANGUAGE)
+
+ protected:
+ ~LanguageSettingsPrivateSetTranslateTargetLanguageFunction() override;
+
+ // ExtensionFunction overrides.
+ ResponseAction Run() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(
+ LanguageSettingsPrivateSetTranslateTargetLanguageFunction);
+};
+
// Implements the languageSettingsPrivate.getInputMethodLists method.
class LanguageSettingsPrivateGetInputMethodListsFunction
: public ExtensionFunction {
@@ -257,8 +327,6 @@ class LanguageSettingsPrivateAddInputMethodFunction : public ExtensionFunction {
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateAddInputMethodFunction);
};
@@ -277,8 +345,6 @@ class LanguageSettingsPrivateRemoveInputMethodFunction
ResponseAction Run() override;
private:
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(LanguageSettingsPrivateRemoveInputMethodFunction);
};
diff --git a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
index 2ed72af96b4..4d88955c333 100644
--- a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
@@ -189,6 +189,114 @@ TEST_F(LanguageSettingsPrivateApiTest, GetSpellcheckDictionaryStatusesTest) {
EXPECT_EQ(expected, *actual);
}
+TEST_F(LanguageSettingsPrivateApiTest, SetLanguageAlwaysTranslateStateTest) {
+ std::unique_ptr<translate::TranslatePrefs> translate_prefs_ =
+ ChromeTranslateClient::CreateTranslatePrefs(profile()->GetPrefs());
+
+ EXPECT_FALSE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
+
+ auto function = base::MakeRefCounted<
+ LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction>();
+ api_test_utils::RunFunction(function.get(), "[\"af\", true]", profile());
+ EXPECT_TRUE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
+
+ function = base::MakeRefCounted<
+ LanguageSettingsPrivateSetLanguageAlwaysTranslateStateFunction>();
+ api_test_utils::RunFunction(function.get(), "[\"af\", false]", profile());
+ EXPECT_FALSE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
+}
+
+TEST_F(LanguageSettingsPrivateApiTest, GetAlwaysTranslateLanguagesListTest) {
+ std::unique_ptr<translate::TranslatePrefs> translate_prefs_ =
+ ChromeTranslateClient::CreateTranslatePrefs(profile()->GetPrefs());
+
+ EXPECT_FALSE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
+ translate_prefs_->AddLanguagePairToAlwaysTranslateList("af", "en");
+ EXPECT_TRUE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
+
+ translate_prefs_->AddLanguagePairToAlwaysTranslateList("aa", "es");
+ // Use 'tl' as the translate language which is 'fil' as a Chrome language.
+ translate_prefs_->AddLanguagePairToAlwaysTranslateList("tl", "es");
+ std::vector<std::string> always_translate_languages =
+ translate_prefs_->GetAlwaysTranslateLanguages();
+ ASSERT_EQ(std::vector<std::string>({"aa", "af", "fil"}),
+ always_translate_languages);
+
+ auto function = base::MakeRefCounted<
+ LanguageSettingsPrivateGetAlwaysTranslateLanguagesFunction>();
+
+ std::unique_ptr<base::Value> result =
+ api_test_utils::RunFunctionAndReturnSingleResult(function.get(), "[]",
+ profile());
+
+ ASSERT_NE(nullptr, result) << function->GetError();
+ EXPECT_TRUE(result->is_list());
+
+ ASSERT_EQ(result->GetList().size(), always_translate_languages.size());
+ for (size_t i = 0; i < result->GetList().size(); i++) {
+ EXPECT_EQ(result->GetList()[i].GetString(), always_translate_languages[i]);
+ }
+}
+
+TEST_F(LanguageSettingsPrivateApiTest, SetTranslateTargetLanguageTest) {
+ std::unique_ptr<translate::TranslatePrefs> translate_prefs_ =
+ ChromeTranslateClient::CreateTranslatePrefs(profile()->GetPrefs());
+
+ std::vector<std::string> content_languages_before;
+ translate_prefs_->GetLanguageList(&content_languages_before);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ ASSERT_EQ(std::vector<std::string>({"en-US"}), content_languages_before);
+#else
+ ASSERT_EQ(std::vector<std::string>({"en-US", "en"}),
+ content_languages_before);
+#endif
+ translate_prefs_->SetRecentTargetLanguage("en");
+ ASSERT_EQ(translate_prefs_->GetRecentTargetLanguage(), "en");
+
+ auto function = base::MakeRefCounted<
+ LanguageSettingsPrivateSetTranslateTargetLanguageFunction>();
+
+ std::unique_ptr<base::Value> result =
+ api_test_utils::RunFunctionAndReturnSingleResult(function.get(),
+ "[\"af\"]", profile());
+ ASSERT_EQ(translate_prefs_->GetRecentTargetLanguage(), "af");
+
+ std::vector<std::string> content_languages_after;
+ translate_prefs_->GetLanguageList(&content_languages_after);
+ ASSERT_EQ(std::vector<std::string>({"en-US", "en", "af"}),
+ content_languages_after);
+}
+
+TEST_F(LanguageSettingsPrivateApiTest, GetNeverTranslateLanguagesListTest) {
+ std::unique_ptr<translate::TranslatePrefs> translate_prefs_ =
+ ChromeTranslateClient::CreateTranslatePrefs(profile()->GetPrefs());
+
+ std::vector<std::string> never_translate_languages =
+ translate_prefs_->GetNeverTranslateLanguages();
+ ASSERT_EQ(std::vector<std::string>({"en"}), never_translate_languages);
+ translate_prefs_->BlockLanguage("af");
+ translate_prefs_->BlockLanguage("es");
+ never_translate_languages = translate_prefs_->GetNeverTranslateLanguages();
+ ASSERT_EQ(std::vector<std::string>({"en", "af", "es"}),
+ never_translate_languages);
+
+ auto function = base::MakeRefCounted<
+ LanguageSettingsPrivateGetNeverTranslateLanguagesFunction>();
+
+ std::unique_ptr<base::Value> result =
+ api_test_utils::RunFunctionAndReturnSingleResult(function.get(), "[]",
+ profile());
+
+ ASSERT_NE(nullptr, result) << function->GetError();
+ EXPECT_TRUE(result->is_list());
+
+ ASSERT_EQ(result->GetList().size(), never_translate_languages.size());
+ for (size_t i = 0; i < result->GetList().size(); i++) {
+ EXPECT_EQ(result->GetList()[i].GetString(), never_translate_languages[i]);
+ }
+}
+
TEST_F(LanguageSettingsPrivateApiTest, GetLanguageListTest) {
translate::TranslateDownloadManager::GetInstance()->ResetForTesting();
RunGetLanguageListTest();
@@ -339,17 +447,15 @@ class TestInputMethodManager : public input_method::MockInputMethodManager {
TestState() {
// Set up three IMEs
std::string layout("us");
- std::vector<std::string> languages({"en-US", "en"});
- std::vector<std::string> arc_languages(
- {chromeos::extension_ime_util::kArcImeLanguage});
InputMethodDescriptor extension_ime(
- GetExtensionImeId(), "ExtensionIme", "", layout, languages,
+ GetExtensionImeId(), "ExtensionIme", "", layout, {"vi"},
false /* is_login_keyboard */, GURL(), GURL());
InputMethodDescriptor component_extension_ime(
GetComponentExtensionImeId(), "ComponentExtensionIme", "", layout,
- languages, false /* is_login_keyboard */, GURL(), GURL());
+ {"en-US", "en"}, false /* is_login_keyboard */, GURL(), GURL());
InputMethodDescriptor arc_ime(
- GetArcImeId(), "ArcIme", "", layout, arc_languages,
+ GetArcImeId(), "ArcIme", "", layout,
+ {chromeos::extension_ime_util::kArcImeLanguage},
false /* is_login_keyboard */, GURL(), GURL());
input_methods_ = {extension_ime, component_extension_ime, arc_ime};
}
diff --git a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
index f13ea87b518..74ca32d8694 100644
--- a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
@@ -90,9 +90,9 @@ LanguageSettingsPrivateDelegate::GetHunspellDictionaryStatuses() {
status.is_ready = dictionary->IsReady();
if (!status.is_ready) {
if (dictionary->IsDownloadInProgress())
- status.is_downloading.reset(new bool(true));
+ status.is_downloading = std::make_unique<bool>(true);
if (dictionary->IsDownloadFailure())
- status.download_failed.reset(new bool(true));
+ status.download_failed = std::make_unique<bool>(true);
}
statuses.push_back(std::move(status));
}
diff --git a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index 93f1f2c646a..9974a07777e 100644
--- a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -59,8 +59,8 @@
#include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/arc_util.h"
@@ -171,7 +171,8 @@ class ManagementUninstallFunctionUninstallDialogDelegate
: function_(function) {
ChromeExtensionFunctionDetails details(function);
extension_uninstall_dialog_ = extensions::ExtensionUninstallDialog::Create(
- details.GetProfile(), details.GetNativeWindowForUI(), this);
+ Profile::FromBrowserContext(function->browser_context()),
+ details.GetNativeWindowForUI(), this);
bool uninstall_from_webstore =
function->extension() &&
function->extension()->id() == extensions::kWebStoreAppId;
@@ -203,7 +204,7 @@ class ManagementUninstallFunctionUninstallDialogDelegate
// ExtensionUninstallDialog::Delegate implementation.
void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
- const base::string16& error) override {
+ const std::u16string& error) override {
function_->OnExtensionUninstallDialogClosed(did_start_uninstall, error);
}
@@ -242,7 +243,7 @@ class ChromeAppForLinkDelegate : public extensions::AppForLinkDelegate {
web_app_info->open_as_window = false;
if (!image_result.image.IsEmpty()) {
- web_app_info->icon_bitmaps_any[image_result.image.Width()] =
+ web_app_info->icon_bitmaps.any[image_result.image.Width()] =
image_result.image.AsBitmap();
}
@@ -637,7 +638,7 @@ bool ChromeManagementAPIDelegate::UninstallExtension(
content::BrowserContext* context,
const std::string& transient_extension_id,
extensions::UninstallReason reason,
- base::string16* error) const {
+ std::u16string* error) const {
return extensions::ExtensionSystem::Get(context)
->extension_service()
->UninstallExtension(transient_extension_id, reason, error);
diff --git a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.h b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
index 955e64f4d4f..34080526fb0 100644
--- a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
+++ b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
@@ -72,7 +72,7 @@ class ChromeManagementAPIDelegate : public extensions::ManagementAPIDelegate {
bool UninstallExtension(content::BrowserContext* context,
const std::string& transient_extension_id,
extensions::UninstallReason reason,
- base::string16* error) const override;
+ std::u16string* error) const override;
void SetLaunchType(content::BrowserContext* context,
const std::string& extension_id,
extensions::LaunchType launch_type) const override;
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
index 5d7d97fde0e..1c30f7d2c9b 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -163,25 +163,34 @@ IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
ASSERT_TRUE(listener1.WaitUntilSatisfied());
}
-// TODO(crbug.com/1181677): Test disabled due to many failures.
IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
- DISABLED_SelfUninstall) {
- ExtensionTestMessageListener listener1("success", false);
- ASSERT_TRUE(LoadExtension(
+ SelfUninstall) {
+ // Wait for the helper script to finish before loading the primary
+ // extension. This ensures that the onUninstall event listener is
+ // added before we proceed to the uninstall step.
+ ExtensionTestMessageListener listener1("ready", false);
+ ASSERT_TRUE(LoadExtensionWithParamOptions(
test_data_dir_.AppendASCII("management/self_uninstall_helper")));
- ASSERT_TRUE(
- LoadExtension(test_data_dir_.AppendASCII("management/self_uninstall")));
ASSERT_TRUE(listener1.WaitUntilSatisfied());
+ ExtensionTestMessageListener listener2("success", false);
+ ASSERT_TRUE(LoadExtensionWithParamOptions(
+ test_data_dir_.AppendASCII("management/self_uninstall")));
+ ASSERT_TRUE(listener2.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
SelfUninstallNoPermissions) {
- ExtensionTestMessageListener listener1("success", false);
- ASSERT_TRUE(LoadExtension(
+ // Wait for the helper script to finish before loading the primary
+ // extension. This ensures that the onUninstall event listener is
+ // added before we proceed to the uninstall step.
+ ExtensionTestMessageListener listener1("ready", false);
+ ASSERT_TRUE(LoadExtensionWithParamOptions(
test_data_dir_.AppendASCII("management/self_uninstall_helper")));
- ASSERT_TRUE(LoadExtension(
- test_data_dir_.AppendASCII("management/self_uninstall_noperm")));
ASSERT_TRUE(listener1.WaitUntilSatisfied());
+ ExtensionTestMessageListener listener2("success", false);
+ ASSERT_TRUE(LoadExtensionWithParamOptions(
+ test_data_dir_.AppendASCII("management/self_uninstall_noperm")));
+ ASSERT_TRUE(listener2.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType, Get) {
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
index 092ce03c69d..00e4d179f1e 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
@@ -50,6 +50,8 @@
#include "extensions/common/error_utils.h"
#endif
+using extensions::mojom::ManifestLocation;
+
namespace extensions {
namespace {
@@ -151,7 +153,7 @@ void ManagementApiUnitTest::SetUp() {
EventRouterFactory::GetInstance()->SetTestingFactory(
profile(), base::BindRepeating(&BuildEventRouter));
- browser_window_.reset(new TestBrowserWindow());
+ browser_window_ = std::make_unique<TestBrowserWindow>();
Browser::CreateParams params(profile(), true);
params.type = Browser::TYPE_NORMAL;
params.window = browser_window_.get();
@@ -213,17 +215,21 @@ TEST_F(ManagementApiUnitTest, ManagementSetEnabled) {
// Test that component extensions cannot be disabled, and that policy extensions
// can be disabled only by component/policy extensions.
TEST_F(ManagementApiUnitTest, ComponentPolicyDisabling) {
- auto component =
- ExtensionBuilder("component").SetLocation(Manifest::COMPONENT).Build();
- auto component2 =
- ExtensionBuilder("component2").SetLocation(Manifest::COMPONENT).Build();
- auto policy =
- ExtensionBuilder("policy").SetLocation(Manifest::EXTERNAL_POLICY).Build();
+ auto component = ExtensionBuilder("component")
+ .SetLocation(ManifestLocation::kComponent)
+ .Build();
+ auto component2 = ExtensionBuilder("component2")
+ .SetLocation(ManifestLocation::kComponent)
+ .Build();
+ auto policy = ExtensionBuilder("policy")
+ .SetLocation(ManifestLocation::kExternalPolicy)
+ .Build();
auto policy2 = ExtensionBuilder("policy2")
- .SetLocation(Manifest::EXTERNAL_POLICY)
+ .SetLocation(ManifestLocation::kExternalPolicy)
.Build();
- auto internal =
- ExtensionBuilder("internal").SetLocation(Manifest::INTERNAL).Build();
+ auto internal = ExtensionBuilder("internal")
+ .SetLocation(ManifestLocation::kInternal)
+ .Build();
service()->AddExtension(component.get());
service()->AddExtension(component2.get());
@@ -266,15 +272,18 @@ TEST_F(ManagementApiUnitTest, ComponentPolicyDisabling) {
// Test that policy extensions can be enabled only by component/policy
// extensions.
TEST_F(ManagementApiUnitTest, ComponentPolicyEnabling) {
- auto component =
- ExtensionBuilder("component").SetLocation(Manifest::COMPONENT).Build();
- auto policy =
- ExtensionBuilder("policy").SetLocation(Manifest::EXTERNAL_POLICY).Build();
+ auto component = ExtensionBuilder("component")
+ .SetLocation(ManifestLocation::kComponent)
+ .Build();
+ auto policy = ExtensionBuilder("policy")
+ .SetLocation(ManifestLocation::kExternalPolicy)
+ .Build();
auto policy2 = ExtensionBuilder("policy2")
- .SetLocation(Manifest::EXTERNAL_POLICY)
+ .SetLocation(ManifestLocation::kExternalPolicy)
.Build();
- auto internal =
- ExtensionBuilder("internal").SetLocation(Manifest::INTERNAL).Build();
+ auto internal = ExtensionBuilder("internal")
+ .SetLocation(ManifestLocation::kInternal)
+ .Build();
service()->AddExtension(component.get());
service()->AddExtension(policy.get());
@@ -795,7 +804,7 @@ class TestManagementAPIDelegate : public ManagementAPIDelegate {
bool UninstallExtension(content::BrowserContext* context,
const std::string& transient_extension_id,
UninstallReason reason,
- base::string16* error) const override {
+ std::u16string* error) const override {
return true;
}
bool CreateAppShortcutFunctionDelegate(
diff --git a/chromium/chrome/browser/extensions/api/management/management_apitest.cc b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
index 760a7dbd3d1..f8cfa891391 100644
--- a/chromium/chrome/browser/extensions/api/management/management_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
@@ -39,6 +39,7 @@
using extensions::Extension;
using extensions::Manifest;
+using extensions::mojom::ManifestLocation;
namespace {
@@ -97,7 +98,7 @@ class ExtensionManagementApiTest : public extensions::ExtensionApiTest {
void InstallNamedExtension(const base::FilePath& path,
const std::string& name,
- Manifest::Location install_source) {
+ ManifestLocation install_source) {
const Extension* extension = InstallExtension(path.AppendASCII(name), 1,
install_source);
ASSERT_TRUE(extension);
@@ -112,12 +113,13 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, Basics) {
LoadExtensions();
base::FilePath basedir = test_data_dir_.AppendASCII("management");
- InstallNamedExtension(basedir, "internal_extension", Manifest::INTERNAL);
+ InstallNamedExtension(basedir, "internal_extension",
+ ManifestLocation::kInternal);
InstallNamedExtension(basedir, "external_extension",
- Manifest::EXTERNAL_PREF);
+ ManifestLocation::kExternalPref);
InstallNamedExtension(basedir, "admin_extension",
- Manifest::EXTERNAL_POLICY_DOWNLOAD);
- InstallNamedExtension(basedir, "version_name", Manifest::INTERNAL);
+ ManifestLocation::kExternalPolicyDownload);
+ InstallNamedExtension(basedir, "version_name", ManifestLocation::kInternal);
ASSERT_TRUE(RunExtensionSubtest("management/test", "basics.html"));
}
diff --git a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
index 313345d5fb2..3bc5081d563 100644
--- a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
@@ -9,6 +9,7 @@
#include "base/containers/contains.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
+#include "base/scoped_observation.h"
#include "base/strings/stringprintf.h"
#include "base/task/post_task.h"
#include "base/test/bind.h"
@@ -51,6 +52,7 @@ using extensions::Extension;
using extensions::ExtensionRegistry;
using extensions::ExtensionService;
using extensions::Manifest;
+using extensions::mojom::ManifestLocation;
using policy::PolicyMap;
using testing::_;
using testing::Return;
@@ -72,10 +74,9 @@ class ExtensionHostDestructionObserver
: profile_(profile),
extension_id_(extension_id),
host_(extensions::ProcessManager::Get(profile)
- ->GetBackgroundHostForExtension(extension_id_)),
- extension_host_observer_(this) {
+ ->GetBackgroundHostForExtension(extension_id_)) {
DCHECK(host_);
- extension_host_observer_.Add(host_);
+ extension_host_observation_.Observe(host_);
}
void WaitForDestructionThenWaitForFirstLoad() {
@@ -89,7 +90,8 @@ class ExtensionHostDestructionObserver
// ExtensionHostObserver:
void OnExtensionHostDestroyed(extensions::ExtensionHost* host) override {
if (host == host_) {
- extension_host_observer_.Remove(host_);
+ DCHECK(extension_host_observation_.IsObservingSource(host_));
+ extension_host_observation_.Reset();
run_loop_.Quit();
}
}
@@ -99,8 +101,9 @@ class ExtensionHostDestructionObserver
const extensions::ExtensionId extension_id_;
extensions::ExtensionHost* const host_ = nullptr;
base::RunLoop run_loop_;
- ScopedObserver<extensions::ExtensionHost, extensions::ExtensionHostObserver>
- extension_host_observer_;
+ base::ScopedObservation<extensions::ExtensionHost,
+ extensions::ExtensionHostObserver>
+ extension_host_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ExtensionHostDestructionObserver);
};
@@ -609,12 +612,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalUrlUpdate) {
// before this test function starts.
EXPECT_TRUE(pending_extension_manager->AddFromExternalUpdateUrl(
- kExtensionId,
- std::string(),
- GURL("http://localhost/autoupdate/manifest"),
- Manifest::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS,
- false));
+ kExtensionId, std::string(), GURL("http://localhost/autoupdate/manifest"),
+ ManifestLocation::kExternalPrefDownload, Extension::NO_FLAGS, false));
extensions::TestExtensionRegistryObserver install_observer(registry);
// Run autoupdate and make sure version 2 of the extension was installed.
@@ -639,12 +638,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalUrlUpdate) {
// Try to install the extension again from an external source. It should fail
// because of the killbit.
EXPECT_FALSE(pending_extension_manager->AddFromExternalUpdateUrl(
- kExtensionId,
- std::string(),
- GURL("http://localhost/autoupdate/manifest"),
- Manifest::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS,
- false));
+ kExtensionId, std::string(), GURL("http://localhost/autoupdate/manifest"),
+ ManifestLocation::kExternalPrefDownload, Extension::NO_FLAGS, false));
EXPECT_FALSE(pending_extension_manager->IsIdPending(kExtensionId))
<< "External reinstall of a killed extension shouldn't work.";
EXPECT_TRUE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
@@ -729,7 +724,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalPolicyRefresh) {
registry->enabled_extensions().GetByID(kExtensionId);
ASSERT_TRUE(extension);
ASSERT_EQ("2.0", extension->VersionString());
- EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
+ EXPECT_EQ(ManifestLocation::kExternalPolicyDownload, extension->location());
// Try to disable and uninstall the extension which should fail.
DisableExtension(kExtensionId);
@@ -812,7 +807,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
const Extension* extension =
registry->enabled_extensions().GetByID(kExtensionId);
ASSERT_TRUE(extension);
- EXPECT_EQ(Manifest::INTERNAL, extension->location());
+ EXPECT_EQ(ManifestLocation::kInternal, extension->location());
EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
// Setup the force install policy. It should override the location.
@@ -829,7 +824,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
extension = registry->enabled_extensions().GetByID(kExtensionId);
ASSERT_TRUE(extension);
- EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
+ EXPECT_EQ(ManifestLocation::kExternalPolicyDownload, extension->location());
EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
// Remove the policy, and verify that the extension was uninstalled.
@@ -848,7 +843,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
extension = registry->enabled_extensions().GetByID(kExtensionId);
ASSERT_TRUE(extension);
- EXPECT_EQ(Manifest::INTERNAL, extension->location());
+ EXPECT_EQ(ManifestLocation::kInternal, extension->location());
EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
EXPECT_TRUE(registry->disabled_extensions().is_empty());
@@ -870,7 +865,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
extension = registry->enabled_extensions().GetByID(kExtensionId);
ASSERT_TRUE(extension);
- EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
+ EXPECT_EQ(ManifestLocation::kExternalPolicyDownload, extension->location());
EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
EXPECT_TRUE(registry->disabled_extensions().is_empty());
}
diff --git a/chromium/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc b/chromium/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
index e738d4b2180..da42f1182cb 100644
--- a/chromium/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
@@ -194,8 +194,8 @@ class MDnsAPITest : public extensions::ExtensionServiceTestBase {
MDnsAPI::Get(browser_context())
->SetDnsSdRegistryForTesting(registry_.get());
- render_process_host_.reset(
- new content::MockRenderProcessHost(browser_context()));
+ render_process_host_ =
+ std::make_unique<content::MockRenderProcessHost>(browser_context());
}
// Returns the mDNS API factory function (mock vs. real) to use for the test.
@@ -231,11 +231,8 @@ class MDnsAPITest : public extensions::ExtensionServiceTestBase {
std::string error;
return extensions::Extension::Create(
bogus_file_pathname(name),
- extensions::Manifest::INVALID_LOCATION,
- manifest,
- Extension::NO_FLAGS,
- extension_id,
- &error);
+ extensions::mojom::ManifestLocation::kInvalidLocation, manifest,
+ Extension::NO_FLAGS, extension_id, &error);
}
content::RenderProcessHost* render_process_host() const {
diff --git a/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc b/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
index a8286919ce7..d538ecf9360 100644
--- a/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
@@ -150,7 +150,8 @@ IN_PROC_BROWSER_TEST_F(MDnsAPITest, RegisterTooManyListeners) {
RemoveObserver(A<DnsSdRegistry::DnsSdObserver*>()))
.Times(1);
- EXPECT_TRUE(RunPlatformAppTest("mdns/api-packaged-apps"))
+ EXPECT_TRUE(RunExtensionTest(
+ {.name = "mdns/api-packaged-apps", .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
index b720b713497..104635182d9 100644
--- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
@@ -4,10 +4,11 @@
#include "chrome/browser/extensions/api/messaging/incognito_connectability.h"
+#include <string>
+
#include "base/bind.h"
#include "base/check_op.h"
#include "base/lazy_instance.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h"
#include "chrome/browser/infobars/infobar_service.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc
index e4ef6184982..a7082547316 100644
--- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc
@@ -16,7 +16,7 @@ namespace extensions {
// static
infobars::InfoBar* IncognitoConnectabilityInfoBarDelegate::Create(
InfoBarService* infobar_service,
- const base::string16& message,
+ const std::u16string& message,
IncognitoConnectabilityInfoBarDelegate::InfoBarCallback callback) {
return infobar_service->AddInfoBar(infobar_service->CreateConfirmInfoBar(
std::unique_ptr<ConfirmInfoBarDelegate>(
@@ -25,7 +25,7 @@ infobars::InfoBar* IncognitoConnectabilityInfoBarDelegate::Create(
}
IncognitoConnectabilityInfoBarDelegate::IncognitoConnectabilityInfoBarDelegate(
- const base::string16& message,
+ const std::u16string& message,
InfoBarCallback callback)
: message_(message), answered_(false), callback_(std::move(callback)) {}
@@ -45,11 +45,11 @@ IncognitoConnectabilityInfoBarDelegate::GetIdentifier() const {
return INCOGNITO_CONNECTABILITY_INFOBAR_DELEGATE;
}
-base::string16 IncognitoConnectabilityInfoBarDelegate::GetMessageText() const {
+std::u16string IncognitoConnectabilityInfoBarDelegate::GetMessageText() const {
return message_;
}
-base::string16 IncognitoConnectabilityInfoBarDelegate::GetButtonLabel(
+std::u16string IncognitoConnectabilityInfoBarDelegate::GetButtonLabel(
InfoBarButton button) const {
return l10n_util::GetStringUTF16((button == BUTTON_OK) ? IDS_PERMISSION_ALLOW
: IDS_PERMISSION_DENY);
diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h
index 2630f0f6c20..fef4dbe884b 100644
--- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h
+++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h
@@ -5,8 +5,9 @@
#ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_INFOBAR_DELEGATE_H_
#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_INFOBAR_DELEGATE_H_
+#include <string>
+
#include "base/callback_forward.h"
-#include "base/strings/string16.h"
#include "chrome/browser/extensions/api/messaging/incognito_connectability.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
@@ -22,7 +23,7 @@ class IncognitoConnectabilityInfoBarDelegate : public ConfirmInfoBarDelegate {
// Creates a confirmation infobar and delegate and adds the infobar to
// |infobar_service|.
static infobars::InfoBar* Create(InfoBarService* infobar_service,
- const base::string16& message,
+ const std::u16string& message,
InfoBarCallback callback);
// Marks the infobar as answered so that the callback is not executed when the
@@ -30,18 +31,18 @@ class IncognitoConnectabilityInfoBarDelegate : public ConfirmInfoBarDelegate {
void set_answered() { answered_ = true; }
private:
- IncognitoConnectabilityInfoBarDelegate(const base::string16& message,
+ IncognitoConnectabilityInfoBarDelegate(const std::u16string& message,
InfoBarCallback callback);
~IncognitoConnectabilityInfoBarDelegate() override;
// ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
- base::string16 GetMessageText() const override;
- base::string16 GetButtonLabel(InfoBarButton button) const override;
+ std::u16string GetMessageText() const override;
+ std::u16string GetButtonLabel(InfoBarButton button) const override;
bool Accept() override;
bool Cancel() override;
- base::string16 message_;
+ std::u16string message_;
bool answered_;
InfoBarCallback callback_;
};
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.cc
new file mode 100644
index 00000000000..97d7e38a7af
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.cc
@@ -0,0 +1,55 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/messaging/native_message_built_in_host.h"
+
+#include <string>
+
+#include "content/public/browser/browser_context.h"
+#include "extensions/browser/api/messaging/native_message_host.h"
+#include "extensions/common/constants.h"
+#include "extensions/common/url_pattern.h"
+#include "ui/gfx/native_widget_types.h"
+#include "url/gurl.h"
+
+namespace extensions {
+
+namespace {
+
+bool MatchesSecurityOrigin(const NativeMessageBuiltInHost& host,
+ const std::string& extension_id) {
+ GURL origin(std::string(kExtensionScheme) + "://" + extension_id);
+ for (size_t i = 0; i < host.allowed_origins_count; i++) {
+ URLPattern allowed_origin(URLPattern::SCHEME_ALL, host.allowed_origins[i]);
+ if (allowed_origin.MatchesSecurityOrigin(origin)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
+std::unique_ptr<NativeMessageHost> NativeMessageHost::Create(
+ content::BrowserContext* browser_context,
+ gfx::NativeView native_view,
+ const std::string& source_extension_id,
+ const std::string& native_host_name,
+ bool allow_user_level,
+ std::string* error) {
+ for (size_t i = 0; i < kBuiltInHostsCount; i++) {
+ const auto& host = kBuiltInHosts[i];
+ if (host.name == native_host_name) {
+ if (MatchesSecurityOrigin(host, source_extension_id)) {
+ return (*host.create_function)(browser_context);
+ }
+ *error = kForbiddenError;
+ return nullptr;
+ }
+ }
+ *error = kNotFoundError;
+ return nullptr;
+}
+
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.h b/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.h
new file mode 100644
index 00000000000..71da8c631e1
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_built_in_host.h
@@ -0,0 +1,44 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_BUILT_IN_HOST_H_
+#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_BUILT_IN_HOST_H_
+
+#include <memory>
+
+#include <stddef.h>
+
+namespace content {
+class BrowserContext;
+}
+
+namespace extensions {
+
+class NativeMessageHost;
+
+struct NativeMessageBuiltInHost {
+ // Unique name to identify the built-in host.
+ const char* const name;
+
+ // The extension origins allowed to create the built-in host.
+ const char* const* const allowed_origins;
+
+ // The count of |allowed_origins|.
+ size_t allowed_origins_count;
+
+ // The factory function used to create new instances of this host.
+ std::unique_ptr<NativeMessageHost> (*create_function)(
+ content::BrowserContext*);
+};
+
+// The set of built-in hosts that can be instantiated. These are defined in the
+// platform-specific impl files.
+extern const NativeMessageBuiltInHost kBuiltInHosts[];
+
+// The count of built-in hosts defined in |kBuiltInHosts|.
+extern const size_t kBuiltInHostsCount;
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_BUILT_IN_HOST_H_
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.cc
new file mode 100644
index 00000000000..93151b2177e
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.cc
@@ -0,0 +1,75 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/messaging/native_message_echo_host.h"
+
+#include <utility>
+
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/optional.h"
+#include "base/single_thread_task_runner.h"
+#include "base/stl_util.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/values.h"
+#include "content/public/browser/browser_context.h"
+
+namespace extensions {
+
+// static
+// Must match ScopedTestNativeMessagingHost::kHostName.
+const char* const NativeMessageEchoHost::kHostName =
+ "com.google.chrome.test.echo";
+
+// static
+// Must match ScopedTestNativeMessagingHost::kExtensionId.
+const char* const NativeMessageEchoHost::kOrigins[] = {
+ "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"};
+
+// static
+const int NativeMessageEchoHost::kOriginCount = base::size(kOrigins);
+
+// static
+std::unique_ptr<NativeMessageHost> NativeMessageEchoHost::Create(
+ content::BrowserContext* browser_context) {
+ return std::make_unique<NativeMessageEchoHost>();
+}
+
+NativeMessageEchoHost::NativeMessageEchoHost() = default;
+NativeMessageEchoHost::~NativeMessageEchoHost() = default;
+
+void NativeMessageEchoHost::Start(Client* client) {
+ client_ = client;
+}
+
+void NativeMessageEchoHost::OnMessage(const std::string& request_string) {
+ base::Optional<base::Value> request_value =
+ base::JSONReader::Read(request_string);
+ if (!request_value.has_value()) {
+ client_->CloseChannel(kHostInputOutputError);
+ } else if (request_string.find("stopHostTest") != std::string::npos) {
+ client_->CloseChannel(kNativeHostExited);
+ } else if (request_string.find("bigMessageTest") != std::string::npos) {
+ client_->CloseChannel(kHostInputOutputError);
+ } else {
+ ProcessEcho(base::Value::AsDictionaryValue(request_value.value()));
+ }
+}
+
+scoped_refptr<base::SingleThreadTaskRunner> NativeMessageEchoHost::task_runner()
+ const {
+ return base::ThreadTaskRunnerHandle::Get();
+}
+
+void NativeMessageEchoHost::ProcessEcho(const base::DictionaryValue& request) {
+ base::DictionaryValue response;
+ response.SetInteger("id", ++message_number_);
+ response.Set("echo", request.CreateDeepCopy());
+ response.SetString("caller_url", kOrigins[0]);
+ std::string response_string;
+ base::JSONWriter::Write(response, &response_string);
+ client_->PostMessageFromNativeHost(response_string);
+}
+
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.h b/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.h
new file mode 100644
index 00000000000..7c3e3ea21d7
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_echo_host.h
@@ -0,0 +1,60 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_ECHO_HOST_H_
+#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_ECHO_HOST_H_
+
+#include <memory>
+#include <string>
+
+#include "extensions/browser/api/messaging/native_message_host.h"
+
+namespace base {
+class DictionaryValue;
+class SingleThreadTaskRunner;
+} // namespace base
+
+namespace {
+class BrowserContext;
+}
+
+namespace extensions {
+
+// A test NativeMessageHost used in ExtensionApiTest::NativeMessagingBasic.
+// See //chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
+// The behavior in this implementation must match the expectations defined in
+// //chrome/test/data/native_messaging/native_hosts/echo.py as that script is
+// used to drive the tests.
+class NativeMessageEchoHost : public NativeMessageHost {
+ public:
+ static const char* const kHostName;
+ static const char* const kOrigins[];
+ static const int kOriginCount;
+
+ static std::unique_ptr<NativeMessageHost> Create(
+ content::BrowserContext* browser_context);
+
+ NativeMessageEchoHost();
+ NativeMessageEchoHost(const NativeMessageEchoHost&) = delete;
+ NativeMessageEchoHost& operator=(const NativeMessageEchoHost&) = delete;
+ ~NativeMessageEchoHost() override;
+
+ // NativeMessageHost implementation.
+ void Start(Client* client) override;
+ void OnMessage(const std::string& request_string) override;
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner() const override;
+
+ private:
+ void ProcessEcho(const base::DictionaryValue& request);
+
+ // Counter used to ensure message uniqueness for testing.
+ int message_number_ = 0;
+
+ // |client_| must outlive this test instance.
+ Client* client_ = nullptr;
+};
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_ECHO_HOST_H_
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
index 0459caddfb5..cf54718f3a9 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
@@ -8,93 +8,23 @@
#include <string>
#include <utility>
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/location.h"
-#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/values.h"
+#include "chrome/browser/ash/arc/extensions/arc_support_message_host.h"
+#include "chrome/browser/ash/drive/drivefs_native_message_host.h"
+#include "chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/extensions/arc_support_message_host.h"
-#include "chrome/browser/chromeos/drive/drivefs_native_message_host.h"
-#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
+#include "chrome/browser/extensions/api/messaging/native_message_built_in_host.h"
+#include "chrome/browser/extensions/api/messaging/native_message_echo_host.h"
+#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
-#include "extensions/common/constants.h"
-#include "extensions/common/url_pattern.h"
+#include "remoting/host/it2me/it2me_native_messaging_host_allowed_origins.h"
#include "remoting/host/it2me/it2me_native_messaging_host_chromeos.h"
-#include "ui/gfx/native_widget_types.h"
-#include "url/gurl.h"
namespace extensions {
namespace {
-// A simple NativeMessageHost that mimics the implementation of
-// chrome/test/data/native_messaging/native_hosts/echo.py. It is currently
-// used for testing by ExtensionApiTest::NativeMessagingBasic.
-
-const char* const kEchoHostOrigins[] = {
- // ScopedTestNativeMessagingHost::kExtensionId
- "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"};
-
-class EchoHost : public NativeMessageHost {
- public:
- static std::unique_ptr<NativeMessageHost> Create(
- content::BrowserContext* browser_context) {
- return std::make_unique<EchoHost>();
- }
-
- EchoHost() = default;
-
- void Start(Client* client) override { client_ = client; }
-
- void OnMessage(const std::string& request_string) override {
- std::unique_ptr<base::Value> request_value =
- base::JSONReader::ReadDeprecated(request_string);
- std::unique_ptr<base::DictionaryValue> request(
- static_cast<base::DictionaryValue*>(request_value.release()));
- if (request_string.find("stopHostTest") != std::string::npos) {
- client_->CloseChannel(kNativeHostExited);
- } else if (request_string.find("bigMessageTest") != std::string::npos) {
- client_->CloseChannel(kHostInputOutputError);
- } else {
- ProcessEcho(*request);
- }
- }
-
- scoped_refptr<base::SingleThreadTaskRunner> task_runner() const override {
- return base::ThreadTaskRunnerHandle::Get();
- }
-
- private:
- void ProcessEcho(const base::DictionaryValue& request) {
- base::DictionaryValue response;
- response.SetInteger("id", ++message_number_);
- response.Set("echo", request.CreateDeepCopy());
- response.SetString("caller_url", kEchoHostOrigins[0]);
- std::string response_string;
- base::JSONWriter::Write(response, &response_string);
- client_->PostMessageFromNativeHost(response_string);
- }
-
- int message_number_ = 0;
- Client* client_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(EchoHost);
-};
-
-struct BuiltInHost {
- const char* const name;
- const char* const* const allowed_origins;
- int allowed_origins_count;
- std::unique_ptr<NativeMessageHost> (*create_function)(
- content::BrowserContext*);
-};
-
std::unique_ptr<NativeMessageHost> CreateIt2MeHost(
content::BrowserContext* browser_context) {
return remoting::CreateIt2MeNativeMessagingHostForChromeOS(
@@ -102,67 +32,26 @@ std::unique_ptr<NativeMessageHost> CreateIt2MeHost(
g_browser_process->policy_service());
}
-// If you modify the list of allowed_origins, don't forget to update
-// remoting/host/it2me/com.google.chrome.remote_assistance.json.jinja2
-// to keep the two lists in sync.
-// TODO(kelvinp): Load the native messaging manifest as a resource file into
-// chrome and fetch the list of allowed_origins from the manifest (see
-// crbug/424743).
-const char* const kRemotingIt2MeOrigins[] = {
- "chrome-extension://inomeogfingihgjfjlpeplalcfajhgai/",
- "chrome-extension://hpodccmdligbeohchckkeajbfohibipg/"};
-
-bool MatchesSecurityOrigin(const BuiltInHost& host,
- const std::string& extension_id) {
- GURL origin(std::string(kExtensionScheme) + "://" + extension_id);
- for (int i = 0; i < host.allowed_origins_count; i++) {
- URLPattern allowed_origin(URLPattern::SCHEME_ALL, host.allowed_origins[i]);
- if (allowed_origin.MatchesSecurityOrigin(origin)) {
- return true;
- }
- }
- return false;
-}
-
} // namespace
-std::unique_ptr<NativeMessageHost> NativeMessageHost::Create(
- content::BrowserContext* browser_context,
- gfx::NativeView native_view,
- const std::string& source_extension_id,
- const std::string& native_host_name,
- bool allow_user_level,
- std::string* error) {
- static const BuiltInHost kBuiltInHosts[] = {
- // ScopedTestNativeMessagingHost::kHostName
- {"com.google.chrome.test.echo", kEchoHostOrigins,
- base::size(kEchoHostOrigins), &EchoHost::Create},
- {"com.google.chrome.remote_assistance", kRemotingIt2MeOrigins,
- base::size(kRemotingIt2MeOrigins), &CreateIt2MeHost},
- {arc::ArcSupportMessageHost::kHostName,
- arc::ArcSupportMessageHost::kHostOrigin, 1,
- &arc::ArcSupportMessageHost::Create},
- {chromeos::kWilcoDtcSupportdUiMessageHost,
- chromeos::kWilcoDtcSupportdHostOrigins,
- chromeos::kWilcoDtcSupportdHostOriginsSize,
- &chromeos::CreateExtensionOwnedWilcoDtcSupportdMessageHost},
- {drive::kDriveFsNativeMessageHostName,
- drive::kDriveFsNativeMessageHostOrigins,
- drive::kDriveFsNativeMessageHostOriginsSize,
- &drive::CreateDriveFsNativeMessageHost},
- };
+const NativeMessageBuiltInHost kBuiltInHosts[] = {
+ {NativeMessageEchoHost::kHostName, NativeMessageEchoHost::kOrigins,
+ NativeMessageEchoHost::kOriginCount, &NativeMessageEchoHost::Create},
+ {remoting::kIt2MeNativeMessageHostName, remoting::kIt2MeOrigins,
+ remoting::kIt2MeOriginsSize, &CreateIt2MeHost},
+ {arc::ArcSupportMessageHost::kHostName,
+ arc::ArcSupportMessageHost::kHostOrigin, 1,
+ &arc::ArcSupportMessageHost::Create},
+ {chromeos::kWilcoDtcSupportdUiMessageHost,
+ chromeos::kWilcoDtcSupportdHostOrigins,
+ chromeos::kWilcoDtcSupportdHostOriginsSize,
+ &chromeos::CreateExtensionOwnedWilcoDtcSupportdMessageHost},
+ {drive::kDriveFsNativeMessageHostName,
+ drive::kDriveFsNativeMessageHostOrigins,
+ drive::kDriveFsNativeMessageHostOriginsSize,
+ &drive::CreateDriveFsNativeMessageHost},
+};
- for (const BuiltInHost& host : kBuiltInHosts) {
- if (host.name == native_host_name) {
- if (MatchesSecurityOrigin(host, source_extension_id)) {
- return (*host.create_function)(browser_context);
- }
- *error = kForbiddenError;
- return nullptr;
- }
- }
- *error = kNotFoundError;
- return nullptr;
-}
+const size_t kBuiltInHostsCount = base::size(kBuiltInHosts);
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc
new file mode 100644
index 00000000000..a2b5097f93c
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/browser/api/messaging/native_message_host.h"
+
+#include <memory>
+#include <string>
+
+#include "base/stl_util.h"
+#include "chrome/browser/extensions/api/messaging/native_message_built_in_host.h"
+#include "chrome/browser/extensions/api/messaging/native_message_echo_host.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "remoting/host/it2me/it2me_native_messaging_host_allowed_origins.h"
+#include "remoting/host/it2me/it2me_native_messaging_host_lacros.h"
+
+namespace extensions {
+
+namespace {
+
+std::unique_ptr<NativeMessageHost> CreateIt2MeHost(
+ content::BrowserContext* browser_context) {
+ return remoting::CreateIt2MeNativeMessagingHostForLacros(
+ content::GetIOThreadTaskRunner({}), content::GetUIThreadTaskRunner({}));
+}
+
+} // namespace
+
+const NativeMessageBuiltInHost kBuiltInHosts[] = {
+ {NativeMessageEchoHost::kHostName, NativeMessageEchoHost::kOrigins,
+ NativeMessageEchoHost::kOriginCount, &NativeMessageEchoHost::Create},
+ {remoting::kIt2MeNativeMessageHostName, remoting::kIt2MeOrigins,
+ remoting::kIt2MeOriginsSize, &CreateIt2MeHost},
+};
+
+const size_t kBuiltInHostsCount = base::size(kBuiltInHosts);
+
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_port.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_port.cc
index c5efa12855f..83b62ea91cb 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_message_port.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_port.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/messaging/native_message_port.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -90,9 +91,9 @@ NativeMessagePort::NativeMessagePort(
: weak_channel_delegate_(channel_delegate),
host_task_runner_(native_message_host->task_runner()),
port_id_(port_id) {
- core_.reset(new Core(std::move(native_message_host),
- weak_factory_.GetWeakPtr(),
- base::ThreadTaskRunnerHandle::Get()));
+ core_ = std::make_unique<Core>(std::move(native_message_host),
+ weak_factory_.GetWeakPtr(),
+ base::ThreadTaskRunnerHandle::Get());
}
NativeMessagePort::~NativeMessagePort() {
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host.cc
index ba0419d4514..08f8d195f2a 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host.cc
@@ -7,6 +7,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -84,7 +85,7 @@ NativeMessageProcessHost::~NativeMessageProcessHost() {
#if defined(OS_MAC)
base::ThreadPool::PostTask(
FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
- base::BindOnce(&base::EnsureProcessTerminated, Passed(&process_)));
+ base::BindOnce(&base::EnsureProcessTerminated, std::move(process_)));
#else
base::EnsureProcessTerminated(std::move(process_));
#endif
@@ -168,8 +169,10 @@ void NativeMessageProcessHost::OnHostProcessLaunched(
{base::MayBlock(), base::TaskPriority::USER_VISIBLE,
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}));
- read_stream_.reset(new net::FileStream(std::move(read_file), task_runner));
- write_stream_.reset(new net::FileStream(std::move(write_file), task_runner));
+ read_stream_ =
+ std::make_unique<net::FileStream>(std::move(read_file), task_runner);
+ write_stream_ =
+ std::make_unique<net::FileStream>(std::move(write_file), task_runner);
WaitRead();
DoWrite();
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
index 0da7603918e..e256103a752 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
@@ -210,7 +210,7 @@ TEST_F(NativeMessagingTest, SingleSendMessageRead) {
native_message_host_->Start(this);
ASSERT_TRUE(native_message_host_);
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
EXPECT_EQ(kTestMessage, last_message_);
@@ -285,7 +285,7 @@ TEST_F(NativeMessagingTest, EchoConnect) {
ASSERT_TRUE(native_message_host_);
native_message_host_->OnMessage("{\"text\": \"Hello.\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
ASSERT_FALSE(last_message_.empty());
ASSERT_TRUE(last_message_parsed_);
@@ -303,7 +303,7 @@ TEST_F(NativeMessagingTest, EchoConnect) {
EXPECT_EQ(expected_url, url);
native_message_host_->OnMessage("{\"foo\": \"bar\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
EXPECT_TRUE(last_message_parsed_->GetInteger("id", &id));
EXPECT_EQ(2, id);
@@ -346,7 +346,7 @@ TEST_F(NativeMessagingTest, MAYBE_ReconnectArgs) {
ASSERT_TRUE(native_message_host_);
native_message_host_->OnMessage("{\"text\": \"Hello.\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
ASSERT_FALSE(last_message_.empty());
ASSERT_TRUE(last_message_parsed_);
@@ -400,7 +400,7 @@ TEST_F(NativeMessagingTest, ReconnectArgs_Disabled) {
ASSERT_TRUE(native_message_host_);
native_message_host_->OnMessage("{\"text\": \"Hello.\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
ASSERT_FALSE(last_message_.empty());
ASSERT_TRUE(last_message_parsed_);
@@ -428,7 +428,7 @@ TEST_F(NativeMessagingTest, ReconnectArgsIfNativeConnectionDisallowed) {
ASSERT_TRUE(native_message_host_);
native_message_host_->OnMessage("{\"text\": \"Hello.\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
ASSERT_FALSE(last_message_.empty());
ASSERT_TRUE(last_message_parsed_);
@@ -454,7 +454,7 @@ TEST_F(NativeMessagingTest, UserLevel) {
ASSERT_TRUE(native_message_host_);
native_message_host_->OnMessage("{\"text\": \"Hello.\"}");
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
ASSERT_FALSE(last_message_.empty());
ASSERT_TRUE(last_message_parsed_);
@@ -470,7 +470,7 @@ TEST_F(NativeMessagingTest, DisallowUserLevel) {
ScopedTestNativeMessagingHost::kHostName, false, &error_message);
native_message_host_->Start(this);
ASSERT_TRUE(native_message_host_);
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
// The host should fail to start.
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
index c3fdd232e04..45355f091e1 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
@@ -5,7 +5,8 @@
#include "base/feature_list.h"
#include "base/files/file_util.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
+#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
@@ -32,51 +33,58 @@ namespace {
using ContextType = ExtensionApiTest::ContextType;
-class NativeMessagingApiTest : public ExtensionApiTest {
+class NativeMessagingApiTestBase : public ExtensionApiTest {
protected:
extensions::ScopedTestNativeMessagingHost test_host_;
};
-IN_PROC_BROWSER_TEST_F(NativeMessagingApiTest, NativeMessagingBasic) {
- ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(false));
- ASSERT_TRUE(RunExtensionTest("native_messaging")) << message_;
-}
-
-IN_PROC_BROWSER_TEST_F(NativeMessagingApiTest, UserLevelNativeMessaging) {
- ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(true));
- ASSERT_TRUE(RunExtensionTest("native_messaging")) << message_;
-}
-
-// TODO(crbug.com/1094027): Clean up duplicate test coverage.
-class NativeMessagingLazyApiTest
- : public NativeMessagingApiTest,
- public testing::WithParamInterface<ContextType> {
+class NativeMessagingApiTest : public NativeMessagingApiTestBase,
+ public testing::WithParamInterface<ContextType> {
protected:
- bool RunLazyTest(const std::string& extension_name) {
+ bool RunTest(const char* extension_name) {
+ if (GetParam() == ContextType::kPersistentBackground)
+ return RunExtensionTest({.name = extension_name});
+ std::string lazy_exension_name = base::StrCat({extension_name, "/lazy"});
return RunExtensionTest(
- {.name = extension_name.c_str()},
+ {.name = lazy_exension_name.c_str()},
{.load_as_service_worker = GetParam() == ContextType::kServiceWorker});
}
};
+INSTANTIATE_TEST_SUITE_P(PersistentBackground,
+ NativeMessagingApiTest,
+ ::testing::Values(ContextType::kPersistentBackground));
INSTANTIATE_TEST_SUITE_P(EventPage,
- NativeMessagingLazyApiTest,
+ NativeMessagingApiTest,
::testing::Values(ContextType::kEventPage));
INSTANTIATE_TEST_SUITE_P(ServiceWorker,
- NativeMessagingLazyApiTest,
+ NativeMessagingApiTest,
::testing::Values(ContextType::kServiceWorker));
-IN_PROC_BROWSER_TEST_P(NativeMessagingLazyApiTest, NativeMessagingBasic) {
+// Tests chrome.runtime.sendNativeMessage to a native messaging host.
+IN_PROC_BROWSER_TEST_P(NativeMessagingApiTest, NativeMessagingBasic) {
+ ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(false));
+ ASSERT_TRUE(RunTest("native_messaging")) << message_;
+}
+
+IN_PROC_BROWSER_TEST_P(NativeMessagingApiTest, UserLevelNativeMessaging) {
+ ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(true));
+ ASSERT_TRUE(RunTest("native_messaging")) << message_;
+}
+
+// Tests chrome.runtime.connectNative to a native messaging host.
+IN_PROC_BROWSER_TEST_P(NativeMessagingApiTest, ConnectNative) {
ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(false));
- ASSERT_TRUE(RunLazyTest("native_messaging_lazy")) << message_;
+ ASSERT_TRUE(RunTest("native_messaging_connect")) << message_;
}
-IN_PROC_BROWSER_TEST_P(NativeMessagingLazyApiTest, UserLevelNativeMessaging) {
+IN_PROC_BROWSER_TEST_P(NativeMessagingApiTest,
+ UserLevelNativeMessagingConnectNative) {
ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(true));
- ASSERT_TRUE(RunLazyTest("native_messaging_lazy")) << message_;
+ ASSERT_TRUE(RunTest("native_messaging_connect")) << message_;
}
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
class TestProcessManagerObserver : public ProcessManagerObserver {
public:
@@ -90,7 +98,7 @@ class TestProcessManagerObserver : public ProcessManagerObserver {
base::RunLoop run_loop;
quit_ = run_loop.QuitClosure();
- observer_.Add(process_manager);
+ observation_.Observe(process_manager);
run_loop.Run();
}
@@ -99,13 +107,14 @@ class TestProcessManagerObserver : public ProcessManagerObserver {
if (extension_id != extension_id_) {
return;
}
- observer_.RemoveAll();
+ observation_.Reset();
extension_id_.clear();
std::move(quit_).Run();
}
std::string extension_id_;
- ScopedObserver<ProcessManager, ProcessManagerObserver> observer_{this};
+ base::ScopedObservation<ProcessManager, ProcessManagerObserver> observation_{
+ this};
base::OnceClosure quit_;
DISALLOW_COPY_AND_ASSIGN(TestProcessManagerObserver);
@@ -128,7 +137,7 @@ base::CommandLine CreateNativeMessagingConnectCommandLine(
return command_line;
}
-class NativeMessagingLaunchApiTest : public NativeMessagingApiTest {
+class NativeMessagingLaunchApiTest : public NativeMessagingApiTestBase {
public:
NativeMessagingLaunchApiTest() {
feature_list_.InitAndEnableFeature(features::kOnConnectNative);
@@ -220,8 +229,9 @@ class TestKeepAliveStateObserver : public KeepAliveStateObserver {
void WaitForNoKeepAlive() {
ASSERT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
- ScopedObserver<KeepAliveRegistry, KeepAliveStateObserver> observer(this);
- observer.Add(KeepAliveRegistry::GetInstance());
+ base::ScopedObservation<KeepAliveRegistry, KeepAliveStateObserver> observer(
+ this);
+ observer.Observe(KeepAliveRegistry::GetInstance());
// On Mac, the browser remains alive when no windows are open, so observing
// the KeepAliveRegistry cannot detect when the native messaging keep-alive
@@ -430,7 +440,7 @@ IN_PROC_BROWSER_TEST_F(NativeMessagingLaunchBackgroundModeApiTest,
ASSERT_NO_FATAL_FAILURE(TestKeepAliveStateObserver().WaitForNoKeepAlive());
}
-#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
} // namespace
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
index dd13b16555f..15f5c071559 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
@@ -51,19 +51,19 @@ std::unique_ptr<NativeMessagingHostManifest> NativeMessagingHostManifest::Load(
std::unique_ptr<base::Value> parsed =
deserializer.Deserialize(NULL, error_message);
if (!parsed) {
- return std::unique_ptr<NativeMessagingHostManifest>();
+ return nullptr;
}
base::DictionaryValue* dictionary;
if (!parsed->GetAsDictionary(&dictionary)) {
*error_message = "Invalid manifest file.";
- return std::unique_ptr<NativeMessagingHostManifest>();
+ return nullptr;
}
std::unique_ptr<NativeMessagingHostManifest> result(
new NativeMessagingHostManifest());
if (!result->Parse(dictionary, error_message)) {
- return std::unique_ptr<NativeMessagingHostManifest>();
+ return nullptr;
}
return result;
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_launch_from_native_unittest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_launch_from_native_unittest.cc
index fd0cade8d41..0f505cf8895 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_launch_from_native_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_launch_from_native_unittest.cc
@@ -106,9 +106,9 @@ class ExtensionSupportsConnectionFromNativeAppTest : public ::testing::Test {
EXPECT_TRUE(base::PathService::Get(DIR_TEST_DATA, &path));
std::string error;
- scoped_refptr<Extension> extension(
- Extension::Create(path, Manifest::INTERNAL, *manifest_builder.Build(),
- Extension::NO_FLAGS, &error));
+ scoped_refptr<Extension> extension(Extension::Create(
+ path, mojom::ManifestLocation::kInternal, *manifest_builder.Build(),
+ Extension::NO_FLAGS, &error));
ASSERT_TRUE(extension.get()) << error;
ExtensionRegistry::Get(&profile_)->AddEnabled(extension);
extension_id_ = extension->id();
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_test_util.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_test_util.cc
index 5335f0310e7..4ff388e2dc7 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_test_util.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_test_util.cc
@@ -90,10 +90,10 @@ void ScopedTestNativeMessagingHost::RegisterTestHost(bool user_level) {
HKEY root_key = user_level ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
ASSERT_NO_FATAL_FAILURE(registry_override_.OverrideRegistry(root_key));
#else
- path_override_.reset(new base::ScopedPathOverride(
+ path_override_ = std::make_unique<base::ScopedPathOverride>(
user_level ? chrome::DIR_USER_NATIVE_MESSAGING
: chrome::DIR_NATIVE_MESSAGING,
- temp_dir_.GetPath()));
+ temp_dir_.GetPath());
#endif
base::CopyFile(test_user_data_dir.AppendASCII("echo.py"),
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc b/chromium/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc
index 78e53631a16..7677a9adbc9 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc
@@ -7,11 +7,12 @@
#include <windows.h>
#include <stdint.h>
+#include <string>
+
#include "base/command_line.h"
#include "base/logging.h"
#include "base/process/launch.h"
#include "base/process/process.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
diff --git a/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc b/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
index c839f67c48e..e41b72d0ed0 100644
--- a/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
@@ -132,7 +132,9 @@ class NetworkingCastPrivateApiTest : public ExtensionApiTest {
};
IN_PROC_BROWSER_TEST_F(NetworkingCastPrivateApiTest, Basic) {
- EXPECT_TRUE(RunPlatformAppTest("networking_cast_private")) << message_;
+ EXPECT_TRUE(RunExtensionTest(
+ {.name = "networking_cast_private", .launch_as_platform_app = true}))
+ << message_;
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
index 06f69eb26f4..553cefb3534 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
@@ -162,7 +162,7 @@ class TestNetworkingPrivateDelegate : public NetworkingPrivateDelegate {
std::unique_ptr<base::ListValue> GetEnabledNetworkTypes() override {
std::unique_ptr<base::ListValue> result;
if (!fail_) {
- result.reset(new base::ListValue);
+ result = std::make_unique<base::ListValue>();
result->AppendString(::onc::network_config::kEthernet);
}
return result;
@@ -172,7 +172,7 @@ class TestNetworkingPrivateDelegate : public NetworkingPrivateDelegate {
std::unique_ptr<DeviceStateList> result;
if (fail_)
return result;
- result.reset(new DeviceStateList);
+ result = std::make_unique<DeviceStateList>();
std::unique_ptr<api::networking_private::DeviceStateProperties> properties(
new api::networking_private::DeviceStateProperties);
properties->type = api::networking_private::NETWORK_TYPE_ETHERNET;
@@ -359,8 +359,10 @@ class NetworkingPrivateApiTest : public ExtensionApiTest {
protected:
bool RunNetworkingSubtest(const std::string& subtest) {
- return RunExtensionSubtest("networking_private", "main.html?" + subtest,
- kFlagNone, kFlagLoadAsComponent);
+ const std::string page_url = "main.html?" + subtest;
+ return RunExtensionTest({.name = "networking_private",
+ .page_url = page_url.c_str(),
+ .load_as_component = true});
}
private:
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
index 1e9123cdf4e..101b3ebd547 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -17,19 +17,20 @@
#include "base/strings/stringprintf.h"
#include "base/test/bind.h"
#include "base/threading/thread_restrictions.h"
+#include "chrome/browser/ash/login/helper.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h"
#include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chromeos/cryptohome/cryptohome_parameters.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill/shill_device_client.h"
#include "chromeos/dbus/shill/shill_ipconfig_client.h"
#include "chromeos/dbus/shill/shill_manager_client.h"
#include "chromeos/dbus/shill/shill_profile_client.h"
#include "chromeos/dbus/shill/shill_service_client.h"
+#include "chromeos/dbus/userdataauth/cryptohome_misc_client.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
#include "chromeos/network/managed_network_configuration_handler.h"
#include "chromeos/network/network_certificate_handler.h"
#include "chromeos/network/network_handler.h"
@@ -77,13 +78,13 @@
using testing::Return;
using testing::_;
-using chromeos::CryptohomeClient;
using chromeos::DBusThreadManager;
using chromeos::ShillDeviceClient;
using chromeos::ShillIPConfigClient;
using chromeos::ShillManagerClient;
using chromeos::ShillProfileClient;
using chromeos::ShillServiceClient;
+using chromeos::UserDataAuthClient;
using extensions::ChromeNetworkingCastPrivateDelegate;
using extensions::NetworkingPrivateDelegate;
@@ -194,8 +195,9 @@ class NetworkingPrivateChromeOSApiTest : public extensions::ExtensionApiTest {
bool RunNetworkingSubtest(const std::string& test) {
const std::string arg =
base::StringPrintf("{\"test\": \"%s\"}", test.c_str());
- return RunPlatformAppTestWithArg("networking_private/chromeos",
- arg.c_str());
+ return RunExtensionTest({.name = "networking_private/chromeos",
+ .custom_arg = arg.c_str(),
+ .launch_as_platform_app = true});
}
void SetUpInProcessBrowserTestFixture() override {
@@ -220,7 +222,7 @@ class NetworkingPrivateChromeOSApiTest : public extensions::ExtensionApiTest {
login_user.set_account_id(user_manager::CanonicalizeUserID(
command_line->GetSwitchValueNative(chromeos::switches::kLoginUser)));
const std::string sanitized_user =
- CryptohomeClient::GetStubSanitizedUsername(login_user);
+ UserDataAuthClient::GetStubSanitizedUsername(login_user);
command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile,
sanitized_user);
}
@@ -230,12 +232,18 @@ class NetworkingPrivateChromeOSApiTest : public extensions::ExtensionApiTest {
user_manager::User* user = user_manager->GetActiveUser();
CHECK(user);
std::string userhash;
- CryptohomeClient::Get()->GetSanitizedUsername(
- cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId()),
+ ::user_data_auth::GetSanitizedUsernameRequest request;
+ request.set_username(
+ cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId())
+ .account_id());
+ chromeos::CryptohomeMiscClient::Get()->GetSanitizedUsername(
+ request,
base::BindOnce(
- [](std::string* out, base::Optional<std::string> result) {
+ [](std::string* out,
+ base::Optional<::user_data_auth::GetSanitizedUsernameReply>
+ result) {
CHECK(result.has_value());
- *out = std::move(result).value();
+ *out = result->sanitized_username();
},
&userhash_));
content::RunAllPendingInMessageLoop();
@@ -595,24 +603,6 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellular")) << message_;
}
-IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
- GetCellularPropertiesDefault) {
- SetupCellular();
- const chromeos::NetworkState* cellular =
- chromeos::NetworkHandler::Get()
- ->network_state_handler()
- ->FirstNetworkByType(chromeos::NetworkTypePattern::Cellular());
- ASSERT_TRUE(cellular);
- // Remove the Cellular service. This should create a default Cellular network.
- service_test_->RemoveService(kCellular1ServicePath);
- content::RunAllPendingInMessageLoop();
- cellular = chromeos::NetworkHandler::Get()
- ->network_state_handler()
- ->FirstNetworkByType(chromeos::NetworkTypePattern::Cellular());
- ASSERT_TRUE(cellular);
- EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellularDefault")) << message_;
-}
-
IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetState) {
EXPECT_TRUE(RunNetworkingSubtest("getState")) << message_;
}
@@ -934,7 +924,9 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetCertificateLists) {
// missing permissions).
IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, Alias) {
SetupCellular();
- EXPECT_TRUE(RunPlatformAppTest("networking_private/alias")) << message_;
+ EXPECT_TRUE(RunExtensionTest(
+ {.name = "networking_private/alias", .launch_as_platform_app = true}))
+ << message_;
}
} // namespace
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
index 1d9d2e56cd6..8a2bbcae19b 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
@@ -88,9 +88,10 @@ class NetworkingPrivateServiceClientApiTest
NetworkingPrivateServiceClientApiTest() {}
bool RunNetworkingSubtest(const std::string& subtest) {
- return RunExtensionSubtest("networking_private/service_client",
- "main.html?" + subtest, kFlagNone,
- kFlagLoadAsComponent);
+ const std::string page_url = "main.html?" + subtest;
+ return RunExtensionTest({.name = "networking_private/service_client",
+ .page_url = page_url.c_str(),
+ .load_as_component = true});
}
void SetUpCommandLine(base::CommandLine* command_line) override {
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc
index ea3f6167c4c..506ab3b70e6 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc
@@ -17,7 +17,7 @@ NetworkingPrivateUIDelegateChromeOS::~NetworkingPrivateUIDelegateChromeOS() {}
void NetworkingPrivateUIDelegateChromeOS::ShowAccountDetails(
const std::string& guid) const {
- chromeos::NetworkConnect::Get()->ShowMobileSetup(guid);
+ chromeos::NetworkConnect::Get()->ShowCarrierAccountDetail(guid);
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
index 7ee32b021aa..f4f4142c13b 100644
--- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
+++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
@@ -7,7 +7,6 @@
#include "base/callback.h"
#include "base/check_op.h"
#include "base/metrics/histogram_macros.h"
-#include "base/strings/nullable_string16.h"
#include "base/strings/string_piece.h"
#include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h"
#include "chrome/browser/extensions/api/notifications/extension_notification_display_helper_factory.h"
@@ -87,7 +86,7 @@ void ExtensionNotificationHandler::OnClick(
const GURL& origin,
const std::string& notification_id,
const base::Optional<int>& action_index,
- const base::Optional<base::string16>& reply,
+ const base::Optional<std::u16string>& reply,
base::OnceClosure completed_closure) {
DCHECK(!reply.has_value());
diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h
index 60464d79f35..cc3875e9e30 100644
--- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h
+++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h
@@ -34,7 +34,7 @@ class ExtensionNotificationHandler : public NotificationHandler {
const GURL& origin,
const std::string& notification_id,
const base::Optional<int>& action_index,
- const base::Optional<base::string16>& reply,
+ const base::Optional<std::u16string>& reply,
base::OnceClosure completed_closure) override;
void DisableNotifications(Profile* profile, const GURL& origin) override;
diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc b/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc
index 4c3a5184d5e..3e5eeceed18 100644
--- a/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc
+++ b/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc
@@ -82,7 +82,7 @@ const char kExtraImageProvided[] =
const char kNotificationIdTooLong[] =
"The notification's ID should be %d characters or less";
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !defined(OS_CHROMEOS)
const char kLowPriorityDeprecatedOnPlatform[] =
"Low-priority notifications are deprecated on this platform.";
#endif
@@ -104,33 +104,6 @@ std::string StripScopeFromIdentifier(const std::string& extension_id,
return scoped_id.substr(index_of_separator);
}
-const gfx::ImageSkia CreateSolidColorImage(int width,
- int height,
- SkColor color) {
- SkBitmap bitmap;
- bitmap.allocN32Pixels(width, height);
- bitmap.eraseColor(color);
- return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
-}
-
-// Take the alpha channel of small_image, mask it with the foreground,
-// then add the masked foreground on top of the background
-const gfx::Image GetMaskedSmallImage(const gfx::ImageSkia& small_image) {
- int width = small_image.width();
- int height = small_image.height();
-
- // Background color grey
- const gfx::ImageSkia background = CreateSolidColorImage(
- width, height, message_center::kSmallImageMaskBackgroundColor);
- // Foreground color white
- const gfx::ImageSkia foreground = CreateSolidColorImage(
- width, height, message_center::kSmallImageMaskForegroundColor);
- const gfx::ImageSkia masked_small_image =
- gfx::ImageSkiaOperations::CreateMaskedImage(foreground, small_image);
- return gfx::Image(gfx::ImageSkiaOperations::CreateSuperimposedImage(
- background, masked_small_image));
-}
-
// Converts the |notification_bitmap| (in RGBA format) to the |*return_image|
// (which is in ARGB format).
bool NotificationBitmapToGfxImage(
@@ -237,7 +210,7 @@ bool NotificationsApiFunction::CreateNotification(
return false;
}
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !defined(OS_CHROMEOS)
if (options->priority &&
*options->priority < message_center::DEFAULT_PRIORITY) {
*error = kLowPriorityDeprecatedOnPlatform;
@@ -254,8 +227,8 @@ bool NotificationsApiFunction::CreateNotification(
message_center::NotificationType type =
MapApiTemplateTypeToType(options->type);
- const base::string16 title(base::UTF8ToUTF16(*options->title));
- const base::string16 message(base::UTF8ToUTF16(*options->message));
+ const std::u16string title(base::UTF8ToUTF16(*options->title));
+ const std::u16string message(base::UTF8ToUTF16(*options->message));
gfx::Image icon;
if (!options->icon_bitmap.get() ||
@@ -275,8 +248,8 @@ bool NotificationsApiFunction::CreateNotification(
*error = kUnableToDecodeIconError;
return false;
}
- optional_fields.small_image =
- GetMaskedSmallImage(small_icon_mask.AsImageSkia());
+ optional_fields.small_image = small_icon_mask;
+ optional_fields.small_image_needs_additional_masking = true;
}
if (options->priority.get())
@@ -391,7 +364,7 @@ bool NotificationsApiFunction::UpdateNotification(
api::notifications::NotificationOptions* options,
message_center::Notification* notification,
std::string* error) {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !defined(OS_CHROMEOS)
if (options->priority &&
*options->priority < message_center::DEFAULT_PRIORITY) {
*error = kLowPriorityDeprecatedOnPlatform;
@@ -430,8 +403,8 @@ bool NotificationsApiFunction::UpdateNotification(
*error = kUnableToDecodeIconError;
return false;
}
- notification->set_small_image(
- GetMaskedSmallImage(app_icon_mask.AsImageSkia()));
+ notification->set_small_image(app_icon_mask);
+ notification->set_small_image_needs_additional_masking(true);
}
if (options->priority)
@@ -544,7 +517,7 @@ ExtensionNotificationDisplayHelper* NotificationsApiFunction::GetDisplayHelper()
}
Profile* NotificationsApiFunction::GetProfile() const {
- return details_.GetProfile();
+ return Profile::FromBrowserContext(browser_context());
}
ExtensionFunction::ResponseAction NotificationsApiFunction::Run() {
diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_api.h b/chromium/chrome/browser/extensions/api/notifications/notifications_api.h
index fe44ce856e1..fd9b0a9a312 100644
--- a/chromium/chrome/browser/extensions/api/notifications/notifications_api.h
+++ b/chromium/chrome/browser/extensions/api/notifications/notifications_api.h
@@ -8,11 +8,12 @@
#include <string>
#include "base/memory/ref_counted.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/common/extensions/api/notifications.h"
#include "extensions/browser/extension_function.h"
#include "ui/message_center/public/cpp/notification_types.h"
+class Profile;
+
namespace message_center {
class Notification;
}
@@ -61,9 +62,6 @@ class NotificationsApiFunction : public ExtensionFunction {
message_center::NotificationType MapApiTemplateTypeToType(
api::notifications::TemplateType type);
-
- private:
- ChromeExtensionFunctionDetails details_{this};
};
class NotificationsCreateFunction : public NotificationsApiFunction {
diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
index a826aad0518..32a5223f37e 100644
--- a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
@@ -46,6 +46,7 @@
#include "base/mac/mac_util.h"
#endif
+using ContextType = extensions::ExtensionBrowserTest::ContextType;
using extensions::AppWindow;
using extensions::AppWindowRegistry;
using extensions::Extension;
@@ -218,21 +219,41 @@ class NotificationsApiTest : public extensions::ExtensionApiTest {
std::unique_ptr<NotificationDisplayServiceTester> display_service_tester_;
};
+// TODO(https://crbug.com/1182305): We should merge this class with the base
+// class once the issues mentioned in the bug are resolved.
+class NotificationsApiTestWithBackgroundType
+ : public NotificationsApiTest,
+ public testing::WithParamInterface<ContextType> {
+ protected:
+ bool RunTest(const char* name) {
+ return RunExtensionTest(
+ {.name = name},
+ {.load_as_service_worker = GetParam() == ContextType::kServiceWorker});
+ }
+};
+
} // namespace
-IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestBasicUsage) {
- ASSERT_TRUE(RunExtensionTest("notifications/api/basic_usage")) << message_;
+INSTANTIATE_TEST_SUITE_P(PersistentBackground,
+ NotificationsApiTestWithBackgroundType,
+ testing::Values(ContextType::kPersistentBackground));
+INSTANTIATE_TEST_SUITE_P(ServiceWorker,
+ NotificationsApiTestWithBackgroundType,
+ testing::Values(ContextType::kServiceWorker));
+
+IN_PROC_BROWSER_TEST_P(NotificationsApiTestWithBackgroundType, TestBasicUsage) {
+ ASSERT_TRUE(RunTest("notifications/api/basic_usage")) << message_;
}
-IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestEvents) {
- ASSERT_TRUE(RunExtensionTest("notifications/api/events")) << message_;
+IN_PROC_BROWSER_TEST_P(NotificationsApiTestWithBackgroundType, TestEvents) {
+ ASSERT_TRUE(RunTest("notifications/api/events")) << message_;
}
-IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestCSP) {
- ASSERT_TRUE(RunExtensionTest("notifications/api/csp")) << message_;
+IN_PROC_BROWSER_TEST_P(NotificationsApiTestWithBackgroundType, TestCSP) {
+ ASSERT_TRUE(RunTest("notifications/api/csp")) << message_;
}
-// Native notifications don't support (nor use) observers.
+// Native notifications don't support (or use) observers.
#if !defined(OS_MAC)
IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestByUser) {
const extensions::Extension* extension =
@@ -274,8 +295,9 @@ IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestByUser) {
}
#endif // !defined(OS_MAC)
-IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestPartialUpdate) {
- ASSERT_TRUE(RunExtensionTest("notifications/api/partial_update")) << message_;
+IN_PROC_BROWSER_TEST_P(NotificationsApiTestWithBackgroundType,
+ TestPartialUpdate) {
+ ASSERT_TRUE(RunTest("notifications/api/partial_update")) << message_;
const extensions::Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
@@ -534,3 +556,18 @@ IN_PROC_BROWSER_TEST_F(NotificationsApiTest,
notification->fullscreen_visibility());
}
#endif // !defined(OS_MAC)
+
+IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestSmallImage) {
+ ExtensionTestMessageListener notification_created_listener("created", false);
+ const Extension* extension = LoadAppWithWindowState(
+ "notifications/api/basic_app", WindowState::NORMAL);
+ ASSERT_TRUE(extension) << message_;
+ ASSERT_TRUE(notification_created_listener.WaitUntilSatisfied());
+
+ message_center::Notification* notification =
+ GetNotificationForExtension(extension);
+ ASSERT_TRUE(notification);
+
+ EXPECT_FALSE(notification->small_image().IsEmpty());
+ EXPECT_TRUE(notification->small_image_needs_additional_masking());
+}
diff --git a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc
index da8e7b9e3e6..3ccf5ea1204 100644
--- a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc
+++ b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc
@@ -6,11 +6,12 @@
#include <stddef.h>
+#include <memory>
+#include <string>
#include <utility>
#include "base/bind.h"
#include "base/lazy_instance.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
@@ -55,7 +56,7 @@ std::unique_ptr<omnibox::SuggestResult> GetOmniboxDefaultSuggestion(
if (prefs && prefs->ReadPrefAsDictionary(extension_id,
kOmniboxDefaultSuggestion,
&dict)) {
- suggestion.reset(new omnibox::SuggestResult);
+ suggestion = std::make_unique<omnibox::SuggestResult>();
omnibox::SuggestResult::Populate(*dict, suggestion.get());
}
return suggestion;
@@ -187,7 +188,7 @@ void ExtensionOmniboxEventRouter::OnDeleteSuggestion(
OmniboxAPI::OmniboxAPI(content::BrowserContext* context)
: profile_(Profile::FromBrowserContext(context)),
url_service_(TemplateURLServiceFactory::GetForProfile(profile_)) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
if (url_service_) {
template_url_subscription_ =
url_service_->RegisterOnLoadedCallback(base::BindOnce(
@@ -311,7 +312,7 @@ ACMatchClassifications StyleTypesToACMatchClassifications(
const omnibox::SuggestResult &suggestion) {
ACMatchClassifications match_classifications;
if (suggestion.description_styles) {
- base::string16 description = base::UTF8ToUTF16(suggestion.description);
+ std::u16string description = base::UTF8ToUTF16(suggestion.description);
std::vector<int> styles(description.length(), 0);
for (const omnibox::MatchClassification& style :
@@ -358,7 +359,7 @@ ACMatchClassifications StyleTypesToACMatchClassifications(
void ApplyDefaultSuggestionForExtensionKeyword(
Profile* profile,
const TemplateURL* keyword,
- const base::string16& remaining_input,
+ const std::u16string& remaining_input,
AutocompleteMatch* match) {
DCHECK(keyword->type() == TemplateURL::OMNIBOX_API_EXTENSION);
@@ -367,18 +368,18 @@ void ApplyDefaultSuggestionForExtensionKeyword(
if (!suggestion || suggestion->description.empty())
return; // fall back to the universal default
- const base::string16 kPlaceholderText(base::ASCIIToUTF16("%s"));
- const base::string16 kReplacementText(base::ASCIIToUTF16("<input>"));
+ const std::u16string kPlaceholderText(u"%s");
+ const std::u16string kReplacementText(u"<input>");
- base::string16 description = base::UTF8ToUTF16(suggestion->description);
+ std::u16string description = base::UTF8ToUTF16(suggestion->description);
ACMatchClassifications& description_styles = match->contents_class;
description_styles = StyleTypesToACMatchClassifications(*suggestion);
// Replace "%s" with the user's input and adjust the style offsets to the
// new length of the description.
size_t placeholder(description.find(kPlaceholderText, 0));
- if (placeholder != base::string16::npos) {
- base::string16 replacement =
+ if (placeholder != std::u16string::npos) {
+ std::u16string replacement =
remaining_input.empty() ? kReplacementText : remaining_input;
description.replace(placeholder, kPlaceholderText.length(), replacement);
diff --git a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.h b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.h
index c8515e7730e..11722fcc760 100644
--- a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.h
+++ b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.h
@@ -10,8 +10,7 @@
#include <string>
#include "base/macros.h"
-#include "base/scoped_observer.h"
-#include "base/strings/string16.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/extension_icon_manager.h"
#include "chrome/common/extensions/api/omnibox.h"
#include "components/omnibox/browser/autocomplete_match.h"
@@ -133,8 +132,8 @@ class OmniboxAPI : public BrowserContextKeyedAPI,
PendingExtensions pending_extensions_;
// Listen to extension load, unloaded notifications.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
// Keeps track of favicon-sized omnibox icons for extensions.
ExtensionIconManager omnibox_icon_manager_;
@@ -164,7 +163,7 @@ class OmniboxSetDefaultSuggestionFunction : public ExtensionFunction {
void ApplyDefaultSuggestionForExtensionKeyword(
Profile* profile,
const TemplateURL* keyword,
- const base::string16& remaining_input,
+ const std::u16string& remaining_input,
AutocompleteMatch* match);
// This function converts style information populated by the JSON schema
diff --git a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
index 050730d3bd3..379b2d4efbf 100644
--- a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
@@ -3,7 +3,9 @@
// found in the LICENSE file.
#include "base/format_macros.h"
-#include "base/strings/string16.h"
+
+#include <string>
+
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
@@ -60,7 +62,7 @@ AutocompleteController* GetAutocompleteController(Browser* browser) {
->autocomplete_controller();
}
-base::string16 AutocompleteResultAsString(const AutocompleteResult& result) {
+std::u16string AutocompleteResultAsString(const AutocompleteResult& result) {
std::string output(base::StringPrintf("{%" PRIuS "} ", result.size()));
for (size_t i = 0; i < result.size(); ++i) {
AutocompleteMatch match = result.match_at(i);
@@ -92,8 +94,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_Basic) {
// Test that our extension's keyword is suggested to us when we partially type
// it.
{
- AutocompleteInput input(ASCIIToUTF16("keywor"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"keywor", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
WaitForAutocompleteDone(browser());
@@ -109,13 +110,12 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_Basic) {
EXPECT_FALSE(match.deletable);
match = result.match_at(1);
- EXPECT_EQ(ASCIIToUTF16("kw"), match.keyword);
+ EXPECT_EQ(u"kw", match.keyword);
}
// Test that our extension can send suggestions back to us.
{
- AutocompleteInput input(ASCIIToUTF16("kw suggestio"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"kw suggestio", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
WaitForAutocompleteDone(browser());
@@ -128,30 +128,27 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_Basic) {
const AutocompleteResult& result = autocomplete_controller->result();
ASSERT_EQ(5U, result.size()) << AutocompleteResultAsString(result);
- EXPECT_EQ(ASCIIToUTF16("kw"), result.match_at(0).keyword);
- EXPECT_EQ(ASCIIToUTF16("kw suggestio"), result.match_at(0).fill_into_edit);
+ EXPECT_EQ(u"kw", result.match_at(0).keyword);
+ EXPECT_EQ(u"kw suggestio", result.match_at(0).fill_into_edit);
EXPECT_EQ(AutocompleteMatchType::SEARCH_OTHER_ENGINE,
result.match_at(0).type);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(0).provider->type());
- EXPECT_EQ(ASCIIToUTF16("kw"), result.match_at(1).keyword);
- EXPECT_EQ(ASCIIToUTF16("kw suggestion1"),
- result.match_at(1).fill_into_edit);
+ EXPECT_EQ(u"kw", result.match_at(1).keyword);
+ EXPECT_EQ(u"kw suggestion1", result.match_at(1).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(1).provider->type());
- EXPECT_EQ(ASCIIToUTF16("kw"), result.match_at(2).keyword);
- EXPECT_EQ(ASCIIToUTF16("kw suggestion2"),
- result.match_at(2).fill_into_edit);
+ EXPECT_EQ(u"kw", result.match_at(2).keyword);
+ EXPECT_EQ(u"kw suggestion2", result.match_at(2).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(2).provider->type());
- EXPECT_EQ(ASCIIToUTF16("kw"), result.match_at(3).keyword);
- EXPECT_EQ(ASCIIToUTF16("kw suggestion3"),
- result.match_at(3).fill_into_edit);
+ EXPECT_EQ(u"kw", result.match_at(3).keyword);
+ EXPECT_EQ(u"kw suggestion3", result.match_at(3).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(3).provider->type());
- base::string16 description =
- ASCIIToUTF16("Description with style: <match>, [dim], (url till end)");
+ std::u16string description =
+ u"Description with style: <match>, [dim], (url till end)";
EXPECT_EQ(description, result.match_at(1).contents);
ASSERT_EQ(6u, result.match_at(1).contents_class.size());
@@ -198,7 +195,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_Basic) {
ResultCatcher catcher;
OmniboxView* omnibox_view = location_bar->GetOmniboxView();
omnibox_view->OnBeforePossibleChange();
- omnibox_view->SetUserText(ASCIIToUTF16("kw command"));
+ omnibox_view->SetUserText(u"kw command");
omnibox_view->OnAfterPossibleChange(true);
location_bar->AcceptInput();
// This checks that the keyword provider (via javascript)
@@ -220,12 +217,11 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, OnInputEntered) {
AutocompleteController* autocomplete_controller =
GetAutocompleteController(browser());
omnibox_view->OnBeforePossibleChange();
- omnibox_view->SetUserText(ASCIIToUTF16("kw command"));
+ omnibox_view->SetUserText(u"kw command");
omnibox_view->OnAfterPossibleChange(true);
{
- AutocompleteInput input(ASCIIToUTF16("kw command"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"kw command", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
}
@@ -235,14 +231,13 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, OnInputEntered) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
omnibox_view->OnBeforePossibleChange();
- omnibox_view->SetUserText(ASCIIToUTF16("kw newtab"));
+ omnibox_view->SetUserText(u"kw newtab");
omnibox_view->OnAfterPossibleChange(true);
WaitForAutocompleteDone(browser());
EXPECT_TRUE(autocomplete_controller->done());
{
- AutocompleteInput input(ASCIIToUTF16("kw newtab"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"kw newtab", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
}
@@ -281,8 +276,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_IncognitoSplitMode) {
// Test that we get the incognito-specific suggestions.
{
- AutocompleteInput input(ASCIIToUTF16("kw suggestio"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"kw suggestio", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
WaitForAutocompleteDone(browser());
@@ -294,8 +288,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_IncognitoSplitMode) {
const AutocompleteResult& result = autocomplete_controller->result();
ASSERT_EQ(5U, result.size()) << AutocompleteResultAsString(result);
ASSERT_FALSE(result.match_at(0).keyword.empty());
- EXPECT_EQ(ASCIIToUTF16("kw suggestion3 incognito"),
- result.match_at(3).fill_into_edit);
+ EXPECT_EQ(u"kw suggestion3 incognito", result.match_at(3).fill_into_edit);
}
// Test that our input is sent to the incognito context. The test will do a
@@ -303,7 +296,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_IncognitoSplitMode) {
// incognito context.
{
ResultCatcher catcher;
- AutocompleteInput input(ASCIIToUTF16("kw command incognito"),
+ AutocompleteInput input(u"kw command incognito",
metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
@@ -338,7 +331,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_PopupStaysClosed) {
// Input a keyword query and wait for suggestions from the extension.
omnibox_view->OnBeforePossibleChange();
- omnibox_view->SetUserText(base::ASCIIToUTF16("kw comman"));
+ omnibox_view->SetUserText(u"kw comman");
omnibox_view->OnAfterPossibleChange(true);
WaitForAutocompleteDone(browser());
EXPECT_TRUE(autocomplete_controller->done());
@@ -352,8 +345,7 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_PopupStaysClosed) {
// TODO: Rather than send this second request by talking to the controller
// directly, figure out how to send it via the proper calls to
// location_bar or location_bar->().
- AutocompleteInput input(base::ASCIIToUTF16("kw command"),
- metrics::OmniboxEventProto::NTP,
+ AutocompleteInput input(u"kw command", metrics::OmniboxEventProto::NTP,
ChromeAutocompleteSchemeClassifier(profile));
autocomplete_controller->Start(input);
location_bar->AcceptInput();
@@ -398,24 +390,24 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_DeleteOmniboxSuggestionResult) {
const AutocompleteResult& result = autocomplete_controller->result();
ASSERT_EQ(4U, result.size()) << AutocompleteResultAsString(result);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(0).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(0).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(0).provider->type());
EXPECT_FALSE(result.match_at(0).deletable);
- EXPECT_EQ(base::ASCIIToUTF16("kw n1"), result.match_at(1).fill_into_edit);
+ EXPECT_EQ(u"kw n1", result.match_at(1).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(1).provider->type());
// Verify that the first omnibox extension suggestion is deletable.
EXPECT_TRUE(result.match_at(1).deletable);
- EXPECT_EQ(base::ASCIIToUTF16("kw n2"), result.match_at(2).fill_into_edit);
+ EXPECT_EQ(u"kw n2", result.match_at(2).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(2).provider->type());
// Verify that the second omnibox extension suggestion is not deletable.
EXPECT_FALSE(result.match_at(2).deletable);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(3).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(3).fill_into_edit);
EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
result.match_at(3).type);
EXPECT_FALSE(result.match_at(3).deletable);
@@ -439,9 +431,9 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, MAYBE_DeleteOmniboxSuggestionResult) {
// Verify that the first suggestion result was deleted. There should be one
// less suggestion result, 3 now instead of 4.
ASSERT_EQ(3U, result.size());
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(0).fill_into_edit);
- EXPECT_EQ(base::ASCIIToUTF16("kw n2"), result.match_at(1).fill_into_edit);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(2).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(0).fill_into_edit);
+ EXPECT_EQ(u"kw n2", result.match_at(1).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(2).fill_into_edit);
#endif
}
@@ -477,19 +469,19 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, ExtensionSuggestionsOnlyInKeywordMode) {
const AutocompleteResult& result = autocomplete_controller->result();
ASSERT_EQ(4U, result.size()) << AutocompleteResultAsString(result);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(0).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(0).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(0).provider->type());
- EXPECT_EQ(base::ASCIIToUTF16("kw n1"), result.match_at(1).fill_into_edit);
+ EXPECT_EQ(u"kw n1", result.match_at(1).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(1).provider->type());
- EXPECT_EQ(base::ASCIIToUTF16("kw n2"), result.match_at(2).fill_into_edit);
+ EXPECT_EQ(u"kw n2", result.match_at(2).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(2).provider->type());
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(3).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(3).fill_into_edit);
EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
result.match_at(3).type);
}
@@ -517,11 +509,11 @@ IN_PROC_BROWSER_TEST_F(OmniboxApiTest, ExtensionSuggestionsOnlyInKeywordMode) {
const AutocompleteResult& result = autocomplete_controller->result();
ASSERT_EQ(2U, result.size()) << AutocompleteResultAsString(result);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(0).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(0).fill_into_edit);
EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
result.match_at(0).type);
- EXPECT_EQ(base::ASCIIToUTF16("kw d"), result.match_at(1).fill_into_edit);
+ EXPECT_EQ(u"kw d", result.match_at(1).fill_into_edit);
EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
result.match_at(1).provider->type());
}
diff --git a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
index dc7384ab844..7045765b6b3 100644
--- a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
+++ b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
@@ -117,7 +117,7 @@ ExtensionFunction::ResponseAction PageCaptureSaveAsMHTMLFunction::Run() {
// This Unretained is safe because this object is Released() in
// OnMessageReceived which gets called at some point after callback is run.
permission_helper::HandlePermissionRequest(
- *extension(), {APIPermission::kPageCapture}, web_contents,
+ *extension(), {mojom::APIPermissionID::kPageCapture}, web_contents,
base::BindOnce(
&PageCaptureSaveAsMHTMLFunction::ResolvePermissionRequest,
base::Unretained(this)),
@@ -199,7 +199,8 @@ void PageCaptureSaveAsMHTMLFunction::OnServiceWorkerAck() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
void PageCaptureSaveAsMHTMLFunction::ResolvePermissionRequest(
const PermissionIDSet& allowed_permissions) {
- if (allowed_permissions.ContainsID(APIPermission::kPageCapture)) {
+ if (allowed_permissions.ContainsID(
+ extensions::mojom::APIPermissionID::kPageCapture)) {
base::ThreadPool::PostTask(
FROM_HERE, kCreateTemporaryFileTaskTraits,
base::BindOnce(&PageCaptureSaveAsMHTMLFunction::CreateTemporaryFile,
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/OWNERS b/chromium/chrome/browser/extensions/api/passwords_private/OWNERS
index 6c958ae64f5..d7d0c6aa7c5 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/OWNERS
+++ b/chromium/chrome/browser/extensions/api/passwords_private/OWNERS
@@ -1,3 +1,4 @@
file://chrome/browser/resources/settings/OWNERS
jdoerrie@chromium.org
+vsemeniuk@google.com
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
index 65ceb1e2e1f..899960ef75f 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -10,6 +10,7 @@
#include <iterator>
#include <map>
#include <memory>
+#include <string>
#include <utility>
#include "base/bind.h"
@@ -18,7 +19,6 @@
#include "base/numerics/safe_conversions.h"
#include "base/optional.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/time/time.h"
@@ -238,9 +238,10 @@ PasswordCheckDelegate::PasswordCheckDelegate(
presenter,
BulkLeakCheckServiceFactory::GetForProfile(profile_),
profile_->GetPrefs()) {
- observed_saved_passwords_presenter_.Add(saved_passwords_presenter_);
- observed_insecure_credentials_manager_.Add(&insecure_credentials_manager_);
- observed_bulk_leak_check_service_.Add(
+ observed_saved_passwords_presenter_.Observe(saved_passwords_presenter_);
+ observed_insecure_credentials_manager_.Observe(
+ &insecure_credentials_manager_);
+ observed_bulk_leak_check_service_.Observe(
BulkLeakCheckServiceFactory::GetForProfile(profile_));
// Instructs the provider to initialize and build its cache.
@@ -511,6 +512,9 @@ void PasswordCheckDelegate::
profile_->GetPrefs()->SetDouble(
password_manager::prefs::kLastTimePasswordCheckCompleted,
base::Time::Now().ToDoubleT());
+ profile_->GetPrefs()->SetTime(
+ password_manager::prefs::kSyncedLastTimePasswordCheckCompleted,
+ base::Time::Now());
// Delay the last Check Status update by a second. This avoids flickering of
// the UI if the full check ran from start to finish almost immediately.
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.h b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
index b7f13009fd5..f9b559c4bdc 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
@@ -9,7 +9,7 @@
#include "base/callback_helpers.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_utils.h"
@@ -175,18 +175,20 @@ class PasswordCheckDelegate
base::Time last_completed_weak_check_;
// A scoped observer for |saved_passwords_presenter_|.
- ScopedObserver<password_manager::SavedPasswordsPresenter,
- password_manager::SavedPasswordsPresenter::Observer>
+ base::ScopedObservation<password_manager::SavedPasswordsPresenter,
+ password_manager::SavedPasswordsPresenter::Observer>
observed_saved_passwords_presenter_{this};
// A scoped observer for |insecure_credentials_manager_|.
- ScopedObserver<password_manager::InsecureCredentialsManager,
- password_manager::InsecureCredentialsManager::Observer>
+ base::ScopedObservation<
+ password_manager::InsecureCredentialsManager,
+ password_manager::InsecureCredentialsManager::Observer>
observed_insecure_credentials_manager_{this};
// A scoped observer for the BulkLeakCheckService.
- ScopedObserver<password_manager::BulkLeakCheckServiceInterface,
- password_manager::BulkLeakCheckServiceInterface::Observer>
+ base::ScopedObservation<
+ password_manager::BulkLeakCheckServiceInterface,
+ password_manager::BulkLeakCheckServiceInterface::Observer>
observed_bulk_leak_check_service_{this};
// An id generator for insecure credentials. Required to match
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
index 08e7e09a828..86b26a1f021 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -74,7 +74,6 @@ using api::passwords_private::InsecureCredential;
using api::passwords_private::PasswordCheckStatus;
using password_manager::BulkLeakCheckDelegateInterface;
using password_manager::BulkLeakCheckService;
-using password_manager::CompromisedCredentials;
using password_manager::InsecureCredentialTypeFlags;
using password_manager::InsecureType;
using password_manager::IsLeaked;
@@ -135,12 +134,12 @@ BulkLeakCheckService* CreateAndUseBulkLeakCheckService(
})));
}
-CompromisedCredentials MakeCompromised(
+password_manager::InsecureCredential MakeInsecureCredential(
base::StringPiece signon_realm,
base::StringPiece username,
base::TimeDelta time_since_creation = base::TimeDelta(),
InsecureType compromise_type = InsecureType::kLeaked) {
- return CompromisedCredentials(
+ return password_manager::InsecureCredential(
std::string(signon_realm), base::ASCIIToUTF16(username),
base::Time::Now() - time_since_creation, compromise_type, IsMuted(false));
}
@@ -345,18 +344,18 @@ TEST_F(PasswordCheckDelegateTest, GetCompromisedCredentialsOrders) {
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername1));
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername2));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1,
- base::TimeDelta::FromMinutes(1),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername2,
- base::TimeDelta::FromMinutes(2),
- InsecureType::kPhished));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername2,
- base::TimeDelta::FromMinutes(3),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername1,
- base::TimeDelta::FromMinutes(4),
- InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername2, base::TimeDelta::FromMinutes(2),
+ InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(3),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername1, base::TimeDelta::FromMinutes(4),
+ InsecureType::kPhished));
RunUntilIdle();
EXPECT_THAT(
@@ -393,18 +392,18 @@ TEST_F(PasswordCheckDelegateTest, GetCompromisedCredentialsHandlesTimes) {
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername1));
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername2));
- store().AddInsecureCredential(
- MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromSeconds(59),
- InsecureType::kLeaked));
- store().AddInsecureCredential(
- MakeCompromised(kExampleCom, kUsername2, base::TimeDelta::FromSeconds(60),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername1,
- base::TimeDelta::FromDays(100),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername2,
- base::TimeDelta::FromDays(800),
- InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromSeconds(59),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername2, base::TimeDelta::FromSeconds(60),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername1, base::TimeDelta::FromDays(100),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername2, base::TimeDelta::FromDays(800),
+ InsecureType::kLeaked));
RunUntilIdle();
EXPECT_THAT(
@@ -443,24 +442,24 @@ TEST_F(PasswordCheckDelegateTest,
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername1));
store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername2));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1,
- base::TimeDelta::FromMinutes(1),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername2,
- base::TimeDelta::FromMinutes(2),
- InsecureType::kLeaked));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername1,
- base::TimeDelta::FromMinutes(3),
- InsecureType::kPhished));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername2,
- base::TimeDelta::FromMinutes(4),
- InsecureType::kPhished));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1,
- base::TimeDelta::FromMinutes(5),
- InsecureType::kPhished));
- store().AddInsecureCredential(MakeCompromised(kExampleOrg, kUsername2,
- base::TimeDelta::FromMinutes(6),
- InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername2, base::TimeDelta::FromMinutes(2),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername1, base::TimeDelta::FromMinutes(3),
+ InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(4),
+ InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromMinutes(5),
+ InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(6),
+ InsecureType::kLeaked));
RunUntilIdle();
EXPECT_THAT(
@@ -494,15 +493,15 @@ TEST_F(PasswordCheckDelegateTest, GetCompromisedCredentialsInjectsAndroid) {
"Example App", kExampleCom));
// Test Android credential without affiliation information.
store().AddLogin(MakeSavedAndroidPassword(kExampleApp, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1,
- base::TimeDelta::FromMinutes(5),
- InsecureType::kLeaked));
- store().AddInsecureCredential(
- MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername2,
- base::TimeDelta::FromDays(3), InsecureType::kPhished));
- store().AddInsecureCredential(
- MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername1,
- base::TimeDelta::FromDays(4), InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromMinutes(5),
+ InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ MakeAndroidRealm(kExampleApp), kUsername2, base::TimeDelta::FromDays(3),
+ InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ MakeAndroidRealm(kExampleApp), kUsername1, base::TimeDelta::FromDays(4),
+ InsecureType::kPhished));
RunUntilIdle();
// Verify that the compromised credentials match what is stored in the
@@ -545,7 +544,8 @@ TEST_F(PasswordCheckDelegateTest, OnGetCompromisedCredentials) {
// expected event.
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
RunUntilIdle();
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
EXPECT_EQ(events::PASSWORDS_PRIVATE_ON_COMPROMISED_CREDENTIALS_INFO_CHANGED,
event_router_observer().events().at(kEventName)->histogram_value);
@@ -553,7 +553,8 @@ TEST_F(PasswordCheckDelegateTest, OnGetCompromisedCredentials) {
TEST_F(PasswordCheckDelegateTest, GetPlaintextInsecurePasswordRejectsWrongId) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -570,7 +571,8 @@ TEST_F(PasswordCheckDelegateTest, GetPlaintextInsecurePasswordRejectsWrongId) {
TEST_F(PasswordCheckDelegateTest,
GetPlaintextInsecurePasswordRejectsWrongSignonRealm) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -587,7 +589,8 @@ TEST_F(PasswordCheckDelegateTest,
TEST_F(PasswordCheckDelegateTest,
GetPlaintextInsecurePasswordRejectsWrongUsername) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -604,7 +607,8 @@ TEST_F(PasswordCheckDelegateTest,
TEST_F(PasswordCheckDelegateTest,
GetPlaintextInsecurePasswordReturnsCorrectPassword) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -626,7 +630,8 @@ TEST_F(PasswordCheckDelegateTest,
// Test that changing a insecure password fails if the ids don't match.
TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialIdMismatch) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -641,7 +646,8 @@ TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialIdMismatch) {
// credential no longer exists.
TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialStaleData) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -656,7 +662,8 @@ TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialStaleData) {
// Test that changing a insecure password succeeds.
TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialSuccess) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -679,7 +686,8 @@ TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialRemovesDupes) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1,
"different_element"));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
EXPECT_EQ(2u, store().stored_passwords().at(kExampleCom).size());
@@ -699,7 +707,8 @@ TEST_F(PasswordCheckDelegateTest, ChangeInsecureCredentialRemovesDupes) {
// Test that removing a insecure password fails if the ids don't match.
TEST_F(PasswordCheckDelegateTest, RemoveInsecureCredentialIdMismatch) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -714,7 +723,8 @@ TEST_F(PasswordCheckDelegateTest, RemoveInsecureCredentialIdMismatch) {
// credential no longer exists.
TEST_F(PasswordCheckDelegateTest, RemoveInsecureCredentialStaleData) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -728,7 +738,8 @@ TEST_F(PasswordCheckDelegateTest, RemoveInsecureCredentialStaleData) {
// Test that removing a insecure password succeeds.
TEST_F(PasswordCheckDelegateTest, RemoveInsecureCredentialSuccess) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1));
+ store().AddInsecureCredential(
+ MakeInsecureCredential(kExampleCom, kUsername1));
RunUntilIdle();
InsecureCredential credential =
@@ -789,7 +800,7 @@ TEST_F(PasswordCheckDelegateTest, OnLeakFoundCreatesCredential) {
RunUntilIdle();
EXPECT_THAT(store().insecure_credentials(),
- ElementsAre(CompromisedCredentials(
+ ElementsAre(password_manager::InsecureCredential(
kExampleCom, base::ASCIIToUTF16(kUsername1),
base::Time::Now(), InsecureType::kLeaked, IsMuted(false))));
}
@@ -821,16 +832,16 @@ TEST_F(PasswordCheckDelegateTest, OnLeakFoundCreatesMultipleCredential) {
EXPECT_THAT(
store().insecure_credentials(),
UnorderedElementsAre(
- CompromisedCredentials(kExampleCom, base::ASCIIToUTF16(kUsername1),
- base::Time::Now(), InsecureType::kLeaked,
- IsMuted(false)),
- CompromisedCredentials(kExampleOrg, base::ASCIIToUTF16(kUsername1),
- base::Time::Now(), InsecureType::kLeaked,
- IsMuted(false)),
- CompromisedCredentials(
+ password_manager::InsecureCredential(
+ kExampleCom, base::ASCIIToUTF16(kUsername1), base::Time::Now(),
+ InsecureType::kLeaked, IsMuted(false)),
+ password_manager::InsecureCredential(
+ kExampleOrg, base::ASCIIToUTF16(kUsername1), base::Time::Now(),
+ InsecureType::kLeaked, IsMuted(false)),
+ password_manager::InsecureCredential(
kExampleCom, base::ASCIIToUTF16(kUsername2Upper),
base::Time::Now(), InsecureType::kLeaked, IsMuted(false)),
- CompromisedCredentials(
+ password_manager::InsecureCredential(
kExampleOrg, base::ASCIIToUTF16(kUsername2Email),
base::Time::Now(), InsecureType::kLeaked, IsMuted(false))));
}
@@ -1100,9 +1111,9 @@ TEST_F(PasswordCheckDelegateTest,
TEST_F(PasswordCheckDelegateTest, WellKnownChangePasswordUrl) {
store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
- store().AddInsecureCredential(MakeCompromised(kExampleCom, kUsername1,
- base::TimeDelta::FromMinutes(1),
- InsecureType::kLeaked));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1),
+ InsecureType::kLeaked));
RunUntilIdle();
GURL change_password_url(
@@ -1114,15 +1125,15 @@ TEST_F(PasswordCheckDelegateTest, WellKnownChangePasswordUrl) {
TEST_F(PasswordCheckDelegateTest, WellKnownChangePasswordUrl_androidrealm) {
store().AddLogin(
MakeSavedAndroidPassword(kExampleApp, kUsername1, "", kExampleCom));
- store().AddInsecureCredential(
- MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername1,
- base::TimeDelta::FromDays(3), InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ MakeAndroidRealm(kExampleApp), kUsername1, base::TimeDelta::FromDays(3),
+ InsecureType::kPhished));
store().AddLogin(MakeSavedAndroidPassword(kExampleApp, kUsername2,
"Example App", kExampleCom));
- store().AddInsecureCredential(
- MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername2,
- base::TimeDelta::FromDays(3), InsecureType::kPhished));
+ store().AddInsecureCredential(MakeInsecureCredential(
+ MakeAndroidRealm(kExampleApp), kUsername2, base::TimeDelta::FromDays(3),
+ InsecureType::kPhished));
RunUntilIdle();
EXPECT_EQ(delegate().GetCompromisedCredentials().at(0).change_password_url,
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
index 64babfff049..6e6963cea07 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -128,7 +128,7 @@ ResponseAction PasswordsPrivateRequestPlaintextPasswordFunction::Run() {
}
void PasswordsPrivateRequestPlaintextPasswordFunction::GotPassword(
- base::Optional<base::string16> password) {
+ base::Optional<std::u16string> password) {
if (password) {
Respond(OneArgument(base::Value(std::move(*password))));
return;
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
index 6d1ec0d17d0..f4a91faad1e 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h"
#include "components/password_manager/core/browser/bulk_leak_check_service.h"
#include "extensions/browser/extension_function.h"
@@ -120,7 +119,7 @@ class PasswordsPrivateRequestPlaintextPasswordFunction
ResponseAction Run() override;
private:
- void GotPassword(base::Optional<base::string16> password);
+ void GotPassword(base::Optional<std::u16string> password);
};
class PasswordsPrivateGetSavedPasswordListFunction : public ExtensionFunction {
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index 0e6419292ed..a4ea19d9f93 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -7,6 +7,7 @@
#include <algorithm>
#include <memory>
#include <sstream>
+#include <string>
#include "base/bind.h"
#include "base/command_line.h"
@@ -16,7 +17,6 @@
#include "base/observer_list.h"
#include "base/optional.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/string_piece_forward.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
@@ -59,8 +59,10 @@ class PasswordsPrivateApiTest : public ExtensionApiTest {
protected:
bool RunPasswordsSubtest(const std::string& subtest) {
- return RunExtensionSubtest("passwords_private", "main.html?" + subtest,
- kFlagNone, kFlagLoadAsComponent);
+ const std::string page_url = "main.html?" + subtest;
+ return RunExtensionTest({.name = "passwords_private",
+ .page_url = page_url.c_str(),
+ .load_as_component = true});
}
bool importPasswordsWasTriggered() {
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
index dad22bcbedf..6cc11441714 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -13,7 +13,6 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "base/strings/string_piece_forward.h"
#include "chrome/browser/ui/passwords/settings/password_manager_presenter.h"
#include "chrome/browser/ui/passwords/settings/password_ui_view.h"
@@ -36,7 +35,7 @@ namespace extensions {
class PasswordsPrivateDelegate : public KeyedService {
public:
using PlaintextPasswordCallback =
- base::OnceCallback<void(base::Optional<base::string16>)>;
+ base::OnceCallback<void(base::Optional<std::u16string>)>;
using StartPasswordCheckCallback =
base::OnceCallback<void(password_manager::BulkLeakCheckService::State)>;
@@ -62,8 +61,8 @@ class PasswordsPrivateDelegate : public KeyedService {
// |new_username|: The new username.
// |new_password|: The new password.
virtual bool ChangeSavedPassword(const std::vector<int>& ids,
- const base::string16& new_username,
- const base::string16& new_password) = 0;
+ const std::u16string& new_username,
+ const std::u16string& new_password) = 0;
// Removes the saved password entries corresponding to the |ids| generated for
// each entry of the password list. Any invalid id will be ignored.
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index e5aff7a8ab6..1fd386860a0 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -4,9 +4,11 @@
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/check.h"
#include "base/notreached.h"
#include "base/numerics/safe_conversions.h"
@@ -216,8 +218,8 @@ void PasswordsPrivateDelegateImpl::GetPasswordExceptionsList(
bool PasswordsPrivateDelegateImpl::ChangeSavedPassword(
const std::vector<int>& ids,
- const base::string16& new_username,
- const base::string16& new_password) {
+ const std::u16string& new_username,
+ const std::u16string& new_password) {
const std::vector<std::string> sort_keys =
GetSortKeys(password_id_generator_, ids);
@@ -306,7 +308,7 @@ void PasswordsPrivateDelegateImpl::RequestPlaintextPassword(
// Copying occurs here so javascript doesn't need plaintext password.
callback = base::BindOnce(
[](PlaintextPasswordCallback callback,
- base::Optional<base::string16> password) {
+ base::Optional<std::u16string> password) {
if (!password) {
std::move(callback).Run(base::nullopt);
return;
@@ -315,7 +317,7 @@ void PasswordsPrivateDelegateImpl::RequestPlaintextPassword(
ui::ClipboardBuffer::kCopyPaste);
clipboard_writer.WriteText(*password);
clipboard_writer.MarkAsConfidential();
- std::move(callback).Run(base::string16());
+ std::move(callback).Run(std::u16string());
},
std::move(callback));
}
@@ -377,8 +379,9 @@ void PasswordsPrivateDelegateImpl::SetPasswordList(
password_manager::IgnoreStore(true)));
if (!form->federation_origin.opaque()) {
- entry.federation_text.reset(new std::string(l10n_util::GetStringFUTF8(
- IDS_PASSWORDS_VIA_FEDERATION, GetDisplayFederation(*form))));
+ entry.federation_text =
+ std::make_unique<std::string>(l10n_util::GetStringFUTF8(
+ IDS_PASSWORDS_VIA_FEDERATION, GetDisplayFederation(*form)));
}
entry.from_account_store = form->IsUsingAccountStore();
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index 47f9f59ce52..37c00c7e407 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -15,7 +15,6 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
-#include "base/strings/string16.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/api/passwords_private/password_check_delegate.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h"
@@ -51,8 +50,8 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
void GetSavedPasswordsList(UiEntriesCallback callback) override;
void GetPasswordExceptionsList(ExceptionEntriesCallback callback) override;
bool ChangeSavedPassword(const std::vector<int>& ids,
- const base::string16& new_username,
- const base::string16& new_password) override;
+ const std::u16string& new_username,
+ const std::u16string& new_password) override;
void RemoveSavedPasswords(const std::vector<int>& ids) override;
void RemovePasswordExceptions(const std::vector<int>& ids) override;
void UndoRemoveSavedPasswordOrException() override;
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index a7df580c495..c432c8dc25f 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -180,8 +180,8 @@ password_manager::PasswordForm CreateSampleForm() {
password_manager::PasswordForm form;
form.signon_realm = "http://abc1.com";
form.url = GURL("http://abc1.com");
- form.username_value = base::ASCIIToUTF16("test@gmail.com");
- form.password_value = base::ASCIIToUTF16("test");
+ form.username_value = u"test@gmail.com";
+ form.password_value = u"test";
return form;
}
@@ -365,9 +365,8 @@ TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPassword) {
int sample_form_id = delegate.GetPasswordIdGeneratorForTesting().GenerateId(
password_manager::CreateSortKey(sample_form));
- EXPECT_TRUE(delegate.ChangeSavedPassword({sample_form_id},
- base::ASCIIToUTF16("new_user"),
- base::ASCIIToUTF16("new_pass")));
+ EXPECT_TRUE(
+ delegate.ChangeSavedPassword({sample_form_id}, u"new_user", u"new_pass"));
// Spin the loop to allow PasswordStore tasks posted when changing the
// password to be completed.
@@ -400,12 +399,12 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResult) {
.WillOnce(Return(true));
MockPlaintextPasswordCallback password_callback;
- EXPECT_CALL(password_callback, Run(Eq(base::string16())));
+ EXPECT_CALL(password_callback, Run(Eq(std::u16string())));
delegate.RequestPlaintextPassword(
0, api::passwords_private::PLAINTEXT_REASON_COPY, password_callback.Get(),
nullptr);
- base::string16 result;
+ std::u16string result;
test_clipboard_->ReadText(ui::ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr, &result);
EXPECT_EQ(form.password_value, result);
@@ -478,10 +477,10 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResultFail) {
0, api::passwords_private::PLAINTEXT_REASON_COPY, password_callback.Get(),
nullptr);
// Clipboard should not be modifiend in case Reauth failed
- base::string16 result;
+ std::u16string result;
test_clipboard_->ReadText(ui::ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr, &result);
- EXPECT_EQ(base::string16(), result);
+ EXPECT_EQ(std::u16string(), result);
EXPECT_EQ(before_call, test_clipboard_->GetLastModifiedTime());
// Since Reauth had failed password was not copied and metric wasn't recorded
@@ -503,7 +502,7 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestPassedReauthOnView) {
.WillOnce(Return(true));
MockPlaintextPasswordCallback password_callback;
- EXPECT_CALL(password_callback, Run(Eq(base::ASCIIToUTF16("test"))));
+ EXPECT_CALL(password_callback, Run(Eq(u"test")));
delegate.RequestPlaintextPassword(
0, api::passwords_private::PLAINTEXT_REASON_VIEW, password_callback.Get(),
nullptr);
@@ -609,7 +608,7 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestReauthOnGetPlaintextCompPassword) {
PasswordsPrivateDelegateImpl delegate(&profile_);
password_manager::PasswordForm form = CreateSampleForm();
- password_manager::CompromisedCredentials compromised_credentials;
+ password_manager::InsecureCredential compromised_credentials;
compromised_credentials.signon_realm = form.signon_realm;
compromised_credentials.username = form.username_value;
store_->AddLogin(form);
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc b/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
index 3abc5b82fc2..cd8d3e2e73e 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
@@ -4,7 +4,8 @@
#include "chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h"
-#include "base/strings/string16.h"
+#include <string>
+
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h"
@@ -63,8 +64,8 @@ void TestPasswordsPrivateDelegate::GetPasswordExceptionsList(
bool TestPasswordsPrivateDelegate::ChangeSavedPassword(
const std::vector<int>& ids,
- const base::string16& new_username,
- const base::string16& new_password) {
+ const std::u16string& new_username,
+ const std::u16string& new_password) {
for (int id : ids) {
if (static_cast<size_t>(id) >= current_entries_.size()) {
return false;
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h b/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
index 28f1bd2faac..77fc4468963 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
@@ -27,8 +27,8 @@ class TestPasswordsPrivateDelegate : public PasswordsPrivateDelegate {
// list of entries has each of the ids, vector of ids isn't empty and if the
// new password isn't empty.
bool ChangeSavedPassword(const std::vector<int>& ids,
- const base::string16& new_username,
- const base::string16& new_password) override;
+ const std::u16string& new_username,
+ const std::u16string& new_password) override;
void RemoveSavedPasswords(const std::vector<int>& id) override;
void RemovePasswordExceptions(const std::vector<int>& ids) override;
// Simplified version of undo logic, only use for testing.
@@ -116,8 +116,7 @@ class TestPasswordsPrivateDelegate : public PasswordsPrivateDelegate {
std::vector<api::passwords_private::ExceptionEntry>
last_deleted_exceptions_batch_;
- base::Optional<base::string16> plaintext_password_ =
- base::ASCIIToUTF16("plaintext");
+ base::Optional<std::u16string> plaintext_password_ = u"plaintext";
// List of insecure credentials.
std::vector<api::passwords_private::InsecureCredential> insecure_credentials_;
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
index daaf9b59f4d..9b9f237b583 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
@@ -191,9 +191,8 @@ PermissionsRequestFunction::PermissionsRequestFunction() {}
PermissionsRequestFunction::~PermissionsRequestFunction() {}
ExtensionFunction::ResponseAction PermissionsRequestFunction::Run() {
- if (!user_gesture() &&
- !ignore_user_gesture_for_tests &&
- extension_->location() != Manifest::COMPONENT) {
+ if (!user_gesture() && !ignore_user_gesture_for_tests &&
+ extension_->location() != mojom::ManifestLocation::kComponent) {
return RespondNow(Error(kUserGestureRequiredError));
}
@@ -300,7 +299,8 @@ ExtensionFunction::ResponseAction PermissionsRequestFunction::Run() {
->GetPermissionMessages(message_provider->GetAllPermissionIDs(
*total_new_permissions, extension()->GetType()))
.empty();
- if (has_no_warnings || extension_->location() == Manifest::COMPONENT) {
+ if (has_no_warnings ||
+ extension_->location() == mojom::ManifestLocation::kComponent) {
OnInstallPromptDone(ExtensionInstallPrompt::Result::ACCEPTED);
return did_respond() ? AlreadyResponded() : RespondLater();
}
@@ -316,8 +316,8 @@ ExtensionFunction::ResponseAction PermissionsRequestFunction::Run() {
return did_respond() ? AlreadyResponded() : RespondLater();
}
- install_ui_.reset(new ExtensionInstallPrompt(
- Profile::FromBrowserContext(browser_context()), native_window));
+ install_ui_ = std::make_unique<ExtensionInstallPrompt>(
+ Profile::FromBrowserContext(browser_context()), native_window);
install_ui_->ShowDialog(
base::BindOnce(&PermissionsRequestFunction::OnInstallPromptDone,
base::RetainedRef(this)),
@@ -338,21 +338,22 @@ void PermissionsRequestFunction::OnInstallPromptDone(
return;
}
PermissionsUpdater permissions_updater(browser_context());
- if (!requested_withheld_->IsEmpty()) {
- requesting_withheld_permissions_ = true;
+ requesting_withheld_permissions_ = !requested_withheld_->IsEmpty();
+ requesting_optional_permissions_ = !requested_optional_->IsEmpty();
+ if (requesting_withheld_permissions_) {
permissions_updater.GrantRuntimePermissions(
*extension(), *requested_withheld_,
base::BindOnce(&PermissionsRequestFunction::OnRuntimePermissionsGranted,
base::RetainedRef(this)));
}
- if (!requested_optional_->IsEmpty()) {
- requesting_optional_permissions_ = true;
+ if (requesting_optional_permissions_) {
permissions_updater.GrantOptionalPermissions(
*extension(), *requested_optional_,
base::BindOnce(
&PermissionsRequestFunction::OnOptionalPermissionsGranted,
base::RetainedRef(this)));
}
+
// Grant{Runtime|Optional}Permissions calls above can finish synchronously.
if (!did_respond())
RespondIfRequestsFinished();
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc
index bb3f8668c89..2abf412c2cb 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc
@@ -6,6 +6,8 @@
#include <stddef.h>
+#include <memory>
+
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/values.h"
@@ -55,7 +57,8 @@ std::unique_ptr<APIPermission> UnpackPermissionWithArguments(
// Explicitly check the permissions that accept arguments until
// https://crbug.com/162042 is fixed.
const APIPermissionInfo* usb_device_permission_info =
- PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice);
+ PermissionsInfo::GetInstance()->GetByID(
+ mojom::APIPermissionID::kUsbDevice);
if (permission_name == usb_device_permission_info->name()) {
permission =
std::make_unique<UsbDevicePermission>(usb_device_permission_info);
@@ -233,7 +236,7 @@ UnpackPermissionSetResult::~UnpackPermissionSetResult() = default;
std::unique_ptr<Permissions> PackPermissionSet(const PermissionSet& set) {
std::unique_ptr<Permissions> permissions(new Permissions());
- permissions->permissions.reset(new std::vector<std::string>());
+ permissions->permissions = std::make_unique<std::vector<std::string>>();
for (const APIPermission* api : set.apis()) {
std::unique_ptr<base::Value> value(api->ToValue());
if (!value) {
@@ -249,7 +252,7 @@ std::unique_ptr<Permissions> PackPermissionSet(const PermissionSet& set) {
// TODO(rpaquay): We currently don't expose manifest permissions
// to apps/extensions via the permissions API.
- permissions->origins.reset(new std::vector<std::string>());
+ permissions->origins = std::make_unique<std::vector<std::string>>();
for (const URLPattern& pattern : set.effective_hosts())
permissions->origins->push_back(pattern.GetAsString());
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
index 33b40869f15..a0a99f5efa9 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
@@ -25,6 +25,7 @@
#include "url/gurl.h"
using extensions::api::permissions::Permissions;
+using extensions::mojom::APIPermissionID;
using extensions::permissions_api_helpers::PackPermissionSet;
using extensions::permissions_api_helpers::UnpackPermissionSet;
using extensions::permissions_api_helpers::UnpackPermissionSetResult;
@@ -35,8 +36,8 @@ namespace extensions {
// Tests that we can convert PermissionSets to the generated types.
TEST(ExtensionPermissionsAPIHelpers, Pack) {
APIPermissionSet apis;
- apis.insert(APIPermission::kTab);
- apis.insert(APIPermission::kFileBrowserHandler);
+ apis.insert(APIPermissionID::kTab);
+ apis.insert(APIPermissionID::kFileBrowserHandler);
// Note: kFileBrowserHandler implies kFileBrowserHandlerInternal.
URLPatternSet explicit_hosts(
@@ -75,7 +76,7 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack_Basic) {
std::string error;
APIPermissionSet optional_apis;
- optional_apis.insert(APIPermission::kTab);
+ optional_apis.insert(APIPermissionID::kTab);
URLPatternSet optional_explicit_hosts(
{URLPattern(Extension::kValidHostPermissionSchemes, "http://a.com/*")});
PermissionSet optional_permissions(
@@ -95,7 +96,8 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack_Basic) {
ASSERT_TRUE(unpack_result);
EXPECT_TRUE(error.empty());
EXPECT_EQ(1u, unpack_result->optional_apis.size());
- EXPECT_TRUE(unpack_result->optional_apis.count(APIPermission::kTab));
+ EXPECT_TRUE(
+ unpack_result->optional_apis.count(mojom::APIPermissionID::kTab));
}
// The api permissions don't need to be present either.
@@ -269,11 +271,11 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack_HostSeparation) {
// Tests that host permissions are properly partitioned according to the
// required/optional permission sets.
TEST(ExtensionPermissionsAPIHelpers, Unpack_APISeparation) {
- constexpr APIPermission::ID kRequired1 = APIPermission::kTab;
- constexpr APIPermission::ID kRequired2 = APIPermission::kStorage;
- constexpr APIPermission::ID kOptional1 = APIPermission::kCookie;
- constexpr APIPermission::ID kOptional2 = APIPermission::kAlarms;
- constexpr APIPermission::ID kUnlisted1 = APIPermission::kIdle;
+ constexpr APIPermissionID kRequired1 = APIPermissionID::kTab;
+ constexpr APIPermissionID kRequired2 = APIPermissionID::kStorage;
+ constexpr APIPermissionID kOptional1 = APIPermissionID::kCookie;
+ constexpr APIPermissionID kOptional2 = APIPermissionID::kAlarms;
+ constexpr APIPermissionID kUnlisted1 = APIPermissionID::kIdle;
APIPermissionSet required_apis;
required_apis.insert(kRequired1);
@@ -474,7 +476,8 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack_UsbDevicePermission) {
ASSERT_TRUE(device_list) << "Failed to parse device list JSON.";
auto usb_device_permission = std::make_unique<UsbDevicePermission>(
- PermissionsInfo::GetInstance()->GetByID(APIPermission::ID::kUsbDevice));
+ PermissionsInfo::GetInstance()->GetByID(
+ mojom::APIPermissionID::kUsbDevice));
std::string error;
std::vector<std::string> unhandled_permissions;
bool from_value_result = usb_device_permission->FromValue(
@@ -499,7 +502,7 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack_UsbDevicePermission) {
ASSERT_TRUE(unpack_result) << error;
ASSERT_EQ(1U, unpack_result->optional_apis.size());
- EXPECT_EQ(APIPermission::ID::kUsbDevice,
+ EXPECT_EQ(mojom::APIPermissionID::kUsbDevice,
unpack_result->optional_apis.begin()->id());
EXPECT_TRUE(unpack_result->optional_apis.begin()->Contains(
usb_device_permission.get()));
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
index e0e44e23637..e2c9ad1ad9c 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/permissions/permissions_api.h"
+#include <memory>
+
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/strings/stringprintf.h"
@@ -43,7 +45,7 @@ scoped_refptr<const Extension> CreateExtensionWithPermissions(
if (allow_file_access)
creation_flags |= Extension::ALLOW_FILE_ACCESS;
return ExtensionBuilder()
- .SetLocation(Manifest::INTERNAL)
+ .SetLocation(mojom::ManifestLocation::kInternal)
.SetManifest(DictionaryBuilder()
.Set("name", name)
.Set("description", "foo")
@@ -138,7 +140,7 @@ class PermissionsAPIUnitTest : public ExtensionServiceTestWithInstall {
ExtensionServiceTestWithInstall::SetUp();
PermissionsRequestFunction::SetAutoConfirmForTests(true);
InitializeEmptyExtensionService();
- browser_window_.reset(new TestBrowserWindow());
+ browser_window_ = std::make_unique<TestBrowserWindow>();
Browser::CreateParams params(profile(), true);
params.type = Browser::TYPE_NORMAL;
params.window = browser_window_.get();
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
index c2741c95443..5f3496ea2f9 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
@@ -60,8 +60,8 @@ class PermissionsApiTestWithContextType
}
};
-IN_PROC_BROWSER_TEST_F(PermissionsApiTest, PermissionsFail) {
- ASSERT_TRUE(RunExtensionTest("permissions/disabled")) << message_;
+IN_PROC_BROWSER_TEST_P(PermissionsApiTestWithContextType, PermissionsFail) {
+ ASSERT_TRUE(RunTest("permissions/disabled")) << message_;
// Since the experimental APIs require a flag, this will fail even though
// it's enabled.
@@ -76,13 +76,13 @@ IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, PermissionsSucceed) {
ASSERT_TRUE(RunExtensionTest("permissions/enabled")) << message_;
}
-IN_PROC_BROWSER_TEST_F(PermissionsApiTest, ExperimentalPermissionsFail) {
+IN_PROC_BROWSER_TEST_P(PermissionsApiTestWithContextType,
+ ExperimentalPermissionsFail) {
// At the time this test is being created, there is no experimental
// function that will not be graduating soon, and does not require a
// tab id as an argument. So, we need the tab permission to get
// a tab id.
- ASSERT_TRUE(RunExtensionTest("permissions/experimental_disabled"))
- << message_;
+ ASSERT_TRUE(RunTest("permissions/experimental_disabled")) << message_;
}
// TODO(crbug/1065399): Flaky on ChromeOS and Linux non-dbg builds.
@@ -117,7 +117,7 @@ IN_PROC_BROWSER_TEST_P(PermissionsApiTestWithContextType,
OptionalPermissionsGranted) {
// Mark all the tested APIs as granted to bypass the confirmation UI.
APIPermissionSet apis;
- apis.insert(APIPermission::kBookmark);
+ apis.insert(extensions::mojom::APIPermissionID::kBookmark);
URLPatternSet explicit_hosts;
AddPattern(&explicit_hosts, "http://*.c.com/*");
@@ -148,7 +148,7 @@ IN_PROC_BROWSER_TEST_F(PermissionsApiTest, OptionalPermissionsDeny) {
// Mark the management permission as already granted since we auto reject
// user prompts.
APIPermissionSet apis;
- apis.insert(APIPermission::kManagement);
+ apis.insert(mojom::APIPermissionID::kManagement);
ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile());
prefs->AddRuntimeGrantedPermissions(
@@ -164,10 +164,11 @@ IN_PROC_BROWSER_TEST_F(PermissionsApiTest, OptionalPermissionsDeny) {
// Tests that the permissions.request function must be called from within a
// user gesture.
-IN_PROC_BROWSER_TEST_F(PermissionsApiTest, OptionalPermissionsGesture) {
+IN_PROC_BROWSER_TEST_P(PermissionsApiTestWithContextType,
+ OptionalPermissionsGesture) {
PermissionsRequestFunction::SetIgnoreUserGestureForTests(false);
ASSERT_TRUE(StartEmbeddedTestServer());
- EXPECT_TRUE(RunExtensionTest("permissions/optional_gesture")) << message_;
+ EXPECT_TRUE(RunTest("permissions/optional_gesture")) << message_;
}
// Tests that the user gesture is retained in the permissions.request function
@@ -240,10 +241,10 @@ IN_PROC_BROWSER_TEST_F(PermissionsApiTest, FileLoad) {
// Test requesting, querying, and removing host permissions for host
// permissions that are a subset of the optional permissions.
-IN_PROC_BROWSER_TEST_F(PermissionsApiTest, HostSubsets) {
+IN_PROC_BROWSER_TEST_P(PermissionsApiTestWithContextType, HostSubsets) {
PermissionsRequestFunction::SetAutoConfirmForTests(true);
PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
- EXPECT_TRUE(RunExtensionTest("permissions/host_subsets")) << message_;
+ EXPECT_TRUE(RunTest("permissions/host_subsets")) << message_;
}
// Tests that requesting an optional permission from a background page, with
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/DIR_METADATA b/chromium/chrome/browser/extensions/api/platform_keys/DIR_METADATA
index 3ecb4771a12..69ef05a819e 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/platform_keys/DIR_METADATA
@@ -1,3 +1,3 @@
monorail {
- component: "Enterprise"
+ component: "OS>Software>Enterprise>Certificates"
}
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
index 2c0e6384eef..4bf4bd41b53 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
+++ b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
@@ -129,22 +129,27 @@ PlatformKeysInternalGetPublicKeyBySpkiFunction::Run() {
if (!chromeos::platform_keys::GetPublicKeyBySpki(key_info.public_key_spki_der,
&key_info.key_type,
&key_info.key_size_bits) ||
- key_info.key_type != net::X509Certificate::kPublicKeyTypeRSA) {
+ (key_info.key_type != net::X509Certificate::kPublicKeyTypeRSA &&
+ key_info.key_type != net::X509Certificate::kPublicKeyTypeECDSA)) {
return RespondNow(Error(StatusToString(
chromeos::platform_keys::Status::kErrorAlgorithmNotSupported)));
}
- // Currently, the only supported combination is:
- // A SPKI declaring rsaEncryption used with the RSASSA-PKCS1-v1.5 algorithm.
- if (params->algorithm_name != kWebCryptoRsassaPkcs1v15) {
+ // Currently, the only supported combinations are either an SPKI declaring
+ // rsaEncryption used with the RSASSA-PKCS1-v1.5 algorithm or an SPKI
+ // declaring id-ecPublicKey used with P-256 curve name.
+ api_pki::GetPublicKeyBySpki::Results::Algorithm algorithm;
+ if (params->algorithm_name == kWebCryptoRsassaPkcs1v15) {
+ chromeos::platform_keys::BuildWebCryptoRSAAlgorithmDictionary(
+ key_info, &algorithm.additional_properties);
+ } else if (params->algorithm_name == kWebCryptoEcdsa) {
+ chromeos::platform_keys::BuildWebCryptoEcdsaAlgorithmDictionary(
+ key_info, &algorithm.additional_properties);
+ } else {
return RespondNow(Error(StatusToString(
chromeos::platform_keys::Status::kErrorAlgorithmNotSupported)));
}
- api_pki::GetPublicKeyBySpki::Results::Algorithm algorithm;
- chromeos::platform_keys::BuildWebCryptoRSAAlgorithmDictionary(
- key_info, &algorithm.additional_properties);
-
return RespondNow(ArgumentList(api_pki::GetPublicKeyBySpki::Results::Create(
public_key_spki_der, algorithm)));
}
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h
index 5567a59222f..83a6822e7ca 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h
+++ b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h
@@ -8,7 +8,7 @@
#include <memory>
#include "base/macros.h"
-#include "chrome/browser/chromeos/login/test/https_forwarder.h"
+#include "chrome/browser/ash/login/test/https_forwarder.h"
#include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
#include "chrome/browser/extensions/mixin_based_extension_apitest.h"
#include "chromeos/tpm/stub_install_attributes.h"
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
index 5a04b1dd895..6d0ab734476 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
+++ b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
@@ -9,6 +9,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
@@ -93,7 +94,7 @@ void BrowserContextKeyedAPIFactory<
VerifyTrustAPI::VerifyTrustAPI(content::BrowserContext* context)
: io_part_(new IOPart) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- registry_observer_.Add(ExtensionRegistry::Get(context));
+ registry_observation_.Observe(ExtensionRegistry::Get(context));
}
VerifyTrustAPI::~VerifyTrustAPI() {
@@ -198,25 +199,21 @@ void VerifyTrustAPI::IOPart::Verify(std::unique_ptr<Params> params,
net::CertVerifyResult* const verify_result_ptr = verify_result.get();
RequestState* request_state = new RequestState();
- // Using AdaptCallbackForRepeating() is safe here, because |bound_callback|
- // can be called only once (at the end of this function or by |verifier|,
- // depending on whether Verify() can be completed synchronously).
- // TODO(crbug.com/730593): AdaptCallbackForRepeating() is being deprecated and
- // should be avoided. In this case it's caused by "sometimes asynchronous" API
- // issue which is common in net code (see crbug.com/730593#c12).
- base::RepeatingCallback<void(int)> bound_callback =
- base::AdaptCallbackForRepeating(
- base::BindOnce(&IOPart::CallBackWithResult, base::Unretained(this),
- std::move(callback), base::Passed(&verify_result),
- base::Owned(request_state)));
+ using VerificationCallback = base::OnceCallback<void(int)>;
+ VerificationCallback bound_callback = base::BindOnce(
+ &IOPart::CallBackWithResult, base::Unretained(this), std::move(callback),
+ std::move(verify_result), base::Owned(request_state));
+ std::pair<VerificationCallback, VerificationCallback> split_callback =
+ base::SplitOnceCallback(std::move(bound_callback));
const int return_value = verifier->Verify(
net::CertVerifier::RequestParams(std::move(cert_chain), details.hostname,
flags, ocsp_response, sct_list),
- verify_result_ptr, bound_callback, &request_state->request, *net_log);
+ verify_result_ptr, std::move(split_callback.first),
+ &request_state->request, *net_log);
if (return_value != net::ERR_IO_PENDING) {
- bound_callback.Run(return_value);
+ std::move(split_callback.second).Run(return_value);
return;
}
}
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.h b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
index 29e6df1de8c..00f46a288db 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
+++ b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
@@ -11,7 +11,7 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry.h"
@@ -97,8 +97,8 @@ class VerifyTrustAPI : public BrowserContextKeyedAPI,
// IOThread.
std::unique_ptr<IOPart, content::BrowserThread::DeleteOnIOThread> io_part_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ registry_observation_{this};
base::WeakPtrFactory<VerifyTrustAPI> weak_factory_{this};
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api.cc b/chromium/chrome/browser/extensions/api/preference/preference_api.cc
index 78f159442f6..7d382ba94ac 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_api.cc
+++ b/chromium/chrome/browser/extensions/api/preference/preference_api.cc
@@ -54,6 +54,8 @@
#include "ash/public/cpp/ash_pref_names.h" // nogncheck
#endif
+using extensions::mojom::APIPermissionID;
+
namespace extensions {
namespace {
@@ -66,14 +68,14 @@ struct PrefMappingEntry {
const char* browser_pref;
// Permission required to read and observe this preference.
- // Use APIPermission::kInvalid for |read_permission| to express that the read
- // permission should not be granted.
- APIPermission::ID read_permission;
+ // Use APIPermissionID::kInvalid for |read_permission| to express that
+ // the read permission should not be granted.
+ APIPermissionID read_permission;
// Permission required to write this preference.
- // Use APIPermission::kInvalid for |write_permission| to express that the
- // write permission should not be granted.
- APIPermission::ID write_permission;
+ // Use APIPermissionID::kInvalid for |write_permission| to express that
+ // the write permission should not be granted.
+ APIPermissionID write_permission;
};
const char kOnPrefChangeFormat[] = "types.ChromeSetting.%s.onChange";
@@ -83,100 +85,100 @@ const char kConversionErrorMessage[] =
const PrefMappingEntry kPrefMapping[] = {
{"alternateErrorPagesEnabled",
- embedder_support::kAlternateErrorPagesEnabled, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
+ embedder_support::kAlternateErrorPagesEnabled, APIPermissionID::kPrivacy,
+ APIPermissionID::kPrivacy},
{"autofillEnabled", autofill::prefs::kAutofillEnabledDeprecated,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"autofillAddressEnabled", autofill::prefs::kAutofillProfileEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"autofillCreditCardEnabled", autofill::prefs::kAutofillCreditCardEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"hyperlinkAuditingEnabled", prefs::kEnableHyperlinkAuditing,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"networkPredictionEnabled", prefs::kNetworkPredictionOptions,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"passwordSavingEnabled",
password_manager::prefs::kCredentialsEnableService,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
- {"protectedContentEnabled", prefs::kEnableDRM, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
- {"proxy", proxy_config::prefs::kProxy, APIPermission::kProxy,
- APIPermission::kProxy},
- {"referrersEnabled", prefs::kEnableReferrers, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
- {"doNotTrackEnabled", prefs::kEnableDoNotTrack, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
+ {"protectedContentEnabled", prefs::kEnableDRM, APIPermissionID::kPrivacy,
+ APIPermissionID::kPrivacy},
+ {"proxy", proxy_config::prefs::kProxy, APIPermissionID::kProxy,
+ APIPermissionID::kProxy},
+ {"referrersEnabled", prefs::kEnableReferrers, APIPermissionID::kPrivacy,
+ APIPermissionID::kPrivacy},
+ {"doNotTrackEnabled", prefs::kEnableDoNotTrack, APIPermissionID::kPrivacy,
+ APIPermissionID::kPrivacy},
{"safeBrowsingEnabled", prefs::kSafeBrowsingEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"safeBrowsingExtendedReportingEnabled",
- prefs::kSafeBrowsingScoutReportingEnabled, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
+ prefs::kSafeBrowsingScoutReportingEnabled, APIPermissionID::kPrivacy,
+ APIPermissionID::kPrivacy},
{"searchSuggestEnabled", prefs::kSearchSuggestEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"spellingServiceEnabled", spellcheck::prefs::kSpellCheckUseSpellingService,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"thirdPartyCookiesAllowed", prefs::kCookieControlsMode,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"privacySandboxEnabled", prefs::kPrivacySandboxApisEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"translationServiceEnabled", prefs::kOfferTranslateEnabled,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
{"webRTCIPHandlingPolicy", prefs::kWebRTCIPHandlingPolicy,
- APIPermission::kPrivacy, APIPermission::kPrivacy},
- {"webRTCUDPPortRange", prefs::kWebRTCUDPPortRange, APIPermission::kPrivacy,
- APIPermission::kPrivacy},
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
+ {"webRTCUDPPortRange", prefs::kWebRTCUDPPortRange,
+ APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
// accessibilityFeatures.animationPolicy is available for
// all platforms but the others from accessibilityFeatures
// is only available for OS_CHROMEOS.
{"animationPolicy", prefs::kAnimationPolicy,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
#if BUILDFLAG(IS_CHROMEOS_ASH)
{"autoclick", ash::prefs::kAccessibilityAutoclickEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"caretHighlight", ash::prefs::kAccessibilityCaretHighlightEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"cursorColor", ash::prefs::kAccessibilityCursorColorEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"cursorHighlight", ash::prefs::kAccessibilityCursorHighlightEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"dictation", ash::prefs::kAccessibilityDictationEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"dockedMagnifier", ash::prefs::kDockedMagnifierEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"focusHighlight", ash::prefs::kAccessibilityFocusHighlightEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"highContrast", ash::prefs::kAccessibilityHighContrastEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"largeCursor", ash::prefs::kAccessibilityLargeCursorEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"screenMagnifier", ash::prefs::kAccessibilityScreenMagnifierEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"selectToSpeak", ash::prefs::kAccessibilitySelectToSpeakEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"spokenFeedback", ash::prefs::kAccessibilitySpokenFeedbackEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"stickyKeys", ash::prefs::kAccessibilityStickyKeysEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"switchAccess", ash::prefs::kAccessibilitySwitchAccessEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
{"virtualKeyboard", ash::prefs::kAccessibilityVirtualKeyboardEnabled,
- APIPermission::kAccessibilityFeaturesRead,
- APIPermission::kAccessibilityFeaturesModify},
+ APIPermissionID::kAccessibilityFeaturesRead,
+ APIPermissionID::kAccessibilityFeaturesModify},
#endif
};
@@ -263,8 +265,8 @@ class PrefMapping {
bool FindBrowserPrefForExtensionPref(const std::string& extension_pref,
std::string* browser_pref,
- APIPermission::ID* read_permission,
- APIPermission::ID* write_permission) {
+ APIPermissionID* read_permission,
+ APIPermissionID* write_permission) {
auto it = mapping_.find(extension_pref);
if (it != mapping_.end()) {
*browser_pref = it->second.pref_name;
@@ -277,7 +279,7 @@ class PrefMapping {
bool FindEventForBrowserPref(const std::string& browser_pref,
std::string* event_name,
- APIPermission::ID* permission) {
+ APIPermissionID* permission) {
auto it = event_mapping_.find(browser_pref);
if (it != event_mapping_.end()) {
*event_name = it->second.pref_name;
@@ -331,12 +333,12 @@ class PrefMapping {
struct PrefMapData {
PrefMapData()
- : read_permission(APIPermission::kInvalid),
- write_permission(APIPermission::kInvalid) {}
+ : read_permission(APIPermissionID::kInvalid),
+ write_permission(APIPermissionID::kInvalid) {}
PrefMapData(const std::string& pref_name,
- APIPermission::ID read,
- APIPermission::ID write)
+ APIPermissionID read,
+ APIPermissionID write)
: pref_name(pref_name),
read_permission(read),
write_permission(write) {}
@@ -345,10 +347,10 @@ class PrefMapping {
std::string pref_name;
// Permission needed to read the preference.
- APIPermission::ID read_permission;
+ APIPermissionID read_permission;
// Permission needed to write the preference.
- APIPermission::ID write_permission;
+ APIPermissionID write_permission;
};
using PrefMap = std::map<std::string, PrefMapData>;
@@ -380,7 +382,7 @@ PreferenceEventRouter::PreferenceEventRouter(Profile* profile)
base::Unretained(this), registrar_.prefs()));
}
DCHECK(!profile_->IsOffTheRecord());
- observed_profiles_.Add(profile_);
+ observed_profiles_.AddObservation(profile_);
if (profile->HasPrimaryOTRProfile())
OnOffTheRecordProfileCreated(profile->GetPrimaryOTRProfile());
else
@@ -394,7 +396,7 @@ void PreferenceEventRouter::OnPrefChanged(PrefService* pref_service,
bool incognito = (pref_service != profile_->GetPrefs());
std::string event_name;
- APIPermission::ID permission = APIPermission::kInvalid;
+ APIPermissionID permission = APIPermissionID::kInvalid;
bool rv = PrefMapping::GetInstance()->FindEventForBrowserPref(
browser_pref, &event_name, &permission);
DCHECK(rv);
@@ -441,12 +443,12 @@ void PreferenceEventRouter::OnPrefChanged(PrefService* pref_service,
void PreferenceEventRouter::OnOffTheRecordProfileCreated(
Profile* off_the_record) {
- observed_profiles_.Add(off_the_record);
+ observed_profiles_.AddObservation(off_the_record);
ObserveOffTheRecordPrefs(off_the_record->GetPrefs());
}
void PreferenceEventRouter::OnProfileWillBeDestroyed(Profile* profile) {
- observed_profiles_.Remove(profile);
+ observed_profiles_.RemoveObservation(profile);
if (profile->IsOffTheRecord()) {
// The real PrefService is about to be destroyed so we must make sure we
// get the "dummy" one.
@@ -544,7 +546,7 @@ PreferenceAPI::PreferenceAPI(content::BrowserContext* context)
: profile_(Profile::FromBrowserContext(context)) {
for (const auto& pref : kPrefMapping) {
std::string event_name;
- APIPermission::ID permission = APIPermission::kInvalid;
+ APIPermissionID permission = APIPermissionID::kInvalid;
bool rv = PrefMapping::GetInstance()->FindEventForBrowserPref(
pref.browser_pref, &event_name, &permission);
DCHECK(rv);
@@ -659,8 +661,8 @@ ExtensionFunction::ResponseAction GetPreferenceFunction::Run() {
// Obtain pref.
std::string browser_pref;
- APIPermission::ID read_permission = APIPermission::kInvalid;
- APIPermission::ID write_permission = APIPermission::kInvalid;
+ APIPermissionID read_permission = APIPermissionID::kInvalid;
+ APIPermissionID write_permission = APIPermissionID::kInvalid;
EXTENSION_FUNCTION_VALIDATE(
PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
pref_key, &browser_pref, &read_permission, &write_permission));
@@ -762,8 +764,8 @@ ExtensionFunction::ResponseAction SetPreferenceFunction::Run() {
// Obtain pref.
std::string browser_pref;
- APIPermission::ID read_permission = APIPermission::kInvalid;
- APIPermission::ID write_permission = APIPermission::kInvalid;
+ APIPermissionID read_permission = APIPermissionID::kInvalid;
+ APIPermissionID write_permission = APIPermissionID::kInvalid;
EXTENSION_FUNCTION_VALIDATE(
PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
pref_key, &browser_pref, &read_permission, &write_permission));
@@ -863,8 +865,8 @@ ExtensionFunction::ResponseAction ClearPreferenceFunction::Run() {
}
std::string browser_pref;
- APIPermission::ID read_permission = APIPermission::kInvalid;
- APIPermission::ID write_permission = APIPermission::kInvalid;
+ APIPermissionID read_permission = APIPermissionID::kInvalid;
+ APIPermissionID write_permission = APIPermissionID::kInvalid;
EXTENSION_FUNCTION_VALIDATE(
PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
pref_key, &browser_pref, &read_permission, &write_permission));
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api.h b/chromium/chrome/browser/extensions/api/preference/preference_api.h
index 787e65b55a1..404df5ece07 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_api.h
+++ b/chromium/chrome/browser/extensions/api/preference/preference_api.h
@@ -10,7 +10,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_multi_source_observation.h"
#include "chrome/browser/extensions/api/content_settings/content_settings_store.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_observer.h"
@@ -51,7 +51,8 @@ class PreferenceEventRouter : public ProfileObserver {
// Weak, owns us (transitively via ExtensionService).
Profile* profile_;
- ScopedObserver<Profile, ProfileObserver> observed_profiles_{this};
+ base::ScopedMultiSourceObservation<Profile, ProfileObserver>
+ observed_profiles_{this};
DISALLOW_COPY_AND_ASSIGN(PreferenceEventRouter);
};
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc b/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
index b606d2075e2..43d821baf49 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
@@ -183,7 +183,8 @@ void ExtensionControlledPrefsTest::EnsureExtensionUninstalled(
break;
}
}
- prefs()->OnExtensionUninstalled(extension_id, Manifest::INTERNAL, false);
+ prefs()->OnExtensionUninstalled(extension_id,
+ mojom::ManifestLocation::kInternal, false);
}
class ControlledPrefsInstallOneExtension
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_helpers.cc b/chromium/chrome/browser/extensions/api/preference/preference_helpers.cc
index c7089c7b296..500add594e8 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/preference/preference_helpers.cc
@@ -87,7 +87,7 @@ void DispatchEventToExtensions(Profile* profile,
events::HistogramValue histogram_value,
const std::string& event_name,
base::ListValue* args,
- APIPermission::ID permission,
+ mojom::APIPermissionID permission,
bool incognito,
const std::string& browser_pref) {
EventRouter* router = EventRouter::Get(profile);
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_helpers.h b/chromium/chrome/browser/extensions/api/preference/preference_helpers.h
index 1b884290320..796c44f541a 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_helpers.h
+++ b/chromium/chrome/browser/extensions/api/preference/preference_helpers.h
@@ -9,6 +9,7 @@
#include "extensions/browser/extension_event_histogram_value.h"
#include "extensions/browser/extension_prefs_scope.h"
+#include "extensions/common/mojom/api_permission_id.mojom-shared.h"
#include "extensions/common/permissions/permission_set.h"
class Profile;
@@ -40,7 +41,7 @@ void DispatchEventToExtensions(Profile* profile,
events::HistogramValue histogram_value,
const std::string& event_name,
base::ListValue* args,
- extensions::APIPermission::ID permission,
+ mojom::APIPermissionID permission,
bool incognito,
const std::string& browser_pref);
diff --git a/chromium/chrome/browser/extensions/api/processes/processes_api.cc b/chromium/chrome/browser/extensions/api/processes/processes_api.cc
index 112a293b669..133eaa8496e 100644
--- a/chromium/chrome/browser/extensions/api/processes/processes_api.cc
+++ b/chromium/chrome/browser/extensions/api/processes/processes_api.cc
@@ -110,6 +110,9 @@ api::processes::ProcessType GetProcessType(
case task_manager::Task::PLUGIN_VM:
case task_manager::Task::SANDBOX_HELPER:
case task_manager::Task::ZYGOTE:
+ // TODO(crbug.com/1186464): Do not expose lacros tasks for now. Defer
+ // the decision until further discussion is made.
+ case task_manager::Task::LACROS:
return api::processes::PROCESS_TYPE_OTHER;
}
@@ -142,7 +145,7 @@ void FillProcessData(
task_info.title = base::UTF16ToUTF8(task_manager->GetTitle(task_id));
const SessionID tab_id = task_manager->GetTabId(task_id);
if (tab_id.is_valid())
- task_info.tab_id.reset(new int(tab_id.id()));
+ task_info.tab_id = std::make_unique<int>(tab_id.id());
out_process->tasks.push_back(std::move(task_info));
}
@@ -447,7 +450,8 @@ void ProcessesAPI::OnListenerRemoved(const EventListenerInfo& details) {
ProcessesEventRouter* ProcessesAPI::processes_event_router() {
if (!processes_event_router_.get())
- processes_event_router_.reset(new ProcessesEventRouter(browser_context_));
+ processes_event_router_ =
+ std::make_unique<ProcessesEventRouter>(browser_context_);
return processes_event_router_.get();
}
diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_api.cc b/chromium/chrome/browser/extensions/api/proxy/proxy_api.cc
index d1070806fdb..3bc960617b0 100644
--- a/chromium/chrome/browser/extensions/api/proxy/proxy_api.cc
+++ b/chromium/chrome/browser/extensions/api/proxy/proxy_api.cc
@@ -58,11 +58,10 @@ void ProxyEventRouter::OnProxyError(
}
}
-void ProxyEventRouter::OnPACScriptError(
- EventRouterForwarder* event_router,
- void* profile,
- int line_number,
- const base::string16& error) {
+void ProxyEventRouter::OnPACScriptError(EventRouterForwarder* event_router,
+ void* profile,
+ int line_number,
+ const std::u16string& error) {
std::unique_ptr<base::ListValue> args(new base::ListValue());
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
dict->SetBoolean(proxy_api_constants::kProxyEventFatal, false);
diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_api.h b/chromium/chrome/browser/extensions/api/proxy/proxy_api.h
index 46fb5215528..4cb1d1a302a 100644
--- a/chromium/chrome/browser/extensions/api/proxy/proxy_api.h
+++ b/chromium/chrome/browser/extensions/api/proxy/proxy_api.h
@@ -12,7 +12,6 @@
#include "base/macros.h"
#include "base/memory/singleton.h"
-#include "base/strings/string16.h"
#include "chrome/browser/extensions/api/preference/preference_api.h"
#include "components/proxy_config/proxy_prefs.h"
@@ -58,7 +57,7 @@ class ProxyEventRouter {
void OnPACScriptError(EventRouterForwarder* event_router,
void* profile,
int line_number,
- const base::string16& error);
+ const std::u16string& error);
private:
friend struct base::DefaultSingletonTraits<ProxyEventRouter>;
diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
index 1a56cf910e8..248fa1b14a8 100644
--- a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
@@ -113,7 +113,7 @@ bool GetPacUrlFromExtensionPref(const base::DictionaryValue* proxy_config,
return true;
// TODO(battre): Handle UTF-8 URLs (http://crbug.com/72692).
- base::string16 pac_url16;
+ std::u16string pac_url16;
if (pac_dict->HasKey(proxy_api_constants::kProxyConfigPacScriptUrl) &&
!pac_dict->GetString(proxy_api_constants::kProxyConfigPacScriptUrl,
&pac_url16)) {
@@ -140,7 +140,7 @@ bool GetPacDataFromExtensionPref(const base::DictionaryValue* proxy_config,
if (!pac_dict)
return true;
- base::string16 pac_data16;
+ std::u16string pac_data16;
if (pac_dict->HasKey(proxy_api_constants::kProxyConfigPacScriptData) &&
!pac_dict->GetString(proxy_api_constants::kProxyConfigPacScriptData,
&pac_data16)) {
@@ -175,7 +175,7 @@ bool GetProxyServer(const base::DictionaryValue* proxy_server,
scheme = default_scheme;
// TODO(battre): handle UTF-8 in hostnames (http://crbug.com/72692).
- base::string16 host16;
+ std::u16string host16;
if (!proxy_server->GetString(proxy_api_constants::kProxyConfigRuleHost,
&host16)) {
LOG(ERROR) << "Could not parse a 'rules.*.host' entry.";
@@ -283,7 +283,7 @@ bool JoinUrlList(const base::ListValue* list,
result.append(joiner);
// TODO(battre): handle UTF-8 (http://crbug.com/72692).
- base::string16 entry;
+ std::u16string entry;
if (!list->GetString(i, &entry)) {
LOG(ERROR) << "'rules.bypassList' could not be parsed.";
*bad_message = true;
diff --git a/chromium/chrome/browser/extensions/api/resources_private/resources_private_api.cc b/chromium/chrome/browser/extensions/api/resources_private/resources_private_api.cc
index 2615de5256d..abaa862f036 100644
--- a/chromium/chrome/browser/extensions/api/resources_private/resources_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/resources_private/resources_private_api.cc
@@ -9,6 +9,7 @@
#include <utility>
#include "base/values.h"
+#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/common/extensions/api/resources_private.h"
#include "chrome/grit/generated_resources.h"
@@ -19,6 +20,12 @@
#if BUILDFLAG(ENABLE_PDF)
#include "chrome/browser/pdf/pdf_extension_util.h"
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#endif // BUILDFLAG(ENABLE_PDF)
// To add a new component to this API, simply:
@@ -36,6 +43,20 @@ void AddStringsForIdentity(base::DictionaryValue* dict) {
l10n_util::GetStringUTF16(IDS_EXTENSION_CONFIRM_PERMISSIONS));
}
+#if BUILDFLAG(ENABLE_PDF)
+bool IsPdfAnnotationsEnabled(content::BrowserContext* context) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ PrefService* prefs =
+ context ? Profile::FromBrowserContext(context)->GetPrefs() : nullptr;
+ if (prefs && prefs->IsManagedPreference(prefs::kPdfAnnotationsEnabled) &&
+ !prefs->GetBoolean(prefs::kPdfAnnotationsEnabled)) {
+ return false;
+ }
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+ return true;
+}
+#endif // BUILDFLAG(ENABLE_PDF)
+
} // namespace
namespace get_strings = api::resources_private::GetStrings;
@@ -59,7 +80,8 @@ ExtensionFunction::ResponseAction ResourcesPrivateGetStringsFunction::Run() {
case api::resources_private::COMPONENT_PDF: {
pdf_extension_util::AddStrings(pdf_extension_util::PdfViewerContext::kAll,
dict.get());
- pdf_extension_util::AddAdditionalData(dict.get());
+ pdf_extension_util::AddAdditionalData(
+ IsPdfAnnotationsEnabled(browser_context()), dict.get());
} break;
#endif // BUILDFLAG(ENABLE_PDF)
case api::resources_private::COMPONENT_NONE:
diff --git a/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc b/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
index fa1229617db..ca8de89ef5c 100644
--- a/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
@@ -9,5 +9,7 @@
using ResourcesPrivateApiTest = extensions::ExtensionApiTest;
IN_PROC_BROWSER_TEST_F(ResourcesPrivateApiTest, GetStrings) {
- ASSERT_TRUE(RunComponentExtensionTest("resources_private/get_strings"));
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "resources_private/get_strings", .load_as_component = true}))
+ << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
index 6f32a950a9c..87e3a539200 100644
--- a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
@@ -134,7 +134,7 @@ ChromeRuntimeAPIDelegate::ChromeRuntimeAPIDelegate(
registrar_.Add(this,
extensions::NOTIFICATION_EXTENSION_UPDATE_FOUND,
content::NotificationService::AllSources());
- extension_registry_observer_.Add(
+ extension_registry_observation_.Observe(
extensions::ExtensionRegistry::Get(browser_context_));
}
diff --git a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h
index 6b30d2842f4..b64a0c6877d 100644
--- a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h
+++ b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h
@@ -10,7 +10,7 @@
#include <utility>
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/api/runtime/runtime_api.h"
@@ -90,9 +90,9 @@ class ChromeRuntimeAPIDelegate : public extensions::RuntimeAPIDelegate,
struct UpdateCheckInfo;
std::map<std::string, UpdateCheckInfo> update_check_info_;
- ScopedObserver<extensions::ExtensionRegistry,
- extensions::ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<extensions::ExtensionRegistry,
+ extensions::ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ChromeRuntimeAPIDelegate);
};
diff --git a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
index 7c079b14da5..37b56dc6e2d 100644
--- a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
@@ -13,7 +13,7 @@
#include "base/location.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/single_thread_task_runner.h"
#include "base/test/simple_test_tick_clock.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -337,7 +337,7 @@ class ExtensionLoadWaiter : public ExtensionRegistryObserver {
public:
explicit ExtensionLoadWaiter(content::BrowserContext* context)
: context_(context) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(context_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(context_));
}
void WaitForReload() { run_loop_.Run(); }
@@ -367,8 +367,8 @@ class ExtensionLoadWaiter : public ExtensionRegistryObserver {
private:
base::RunLoop run_loop_;
content::BrowserContext* context_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(ExtensionLoadWaiter);
};
diff --git a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
index bbd4a4b06a3..1e1a0310ee3 100644
--- a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
@@ -183,7 +183,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeRuntimeGetPlatformInfo) {
// Tests chrome.runtime.getPackageDirectory with an app.
IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
ChromeRuntimeGetPackageDirectoryEntryApp) {
- ASSERT_TRUE(RunPlatformAppTest("api_test/runtime/get_package_directory/app"))
+ ASSERT_TRUE(
+ RunExtensionTest({.name = "api_test/runtime/get_package_directory/app",
+ .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index e2ec5f92ec4..f8605328919 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -242,22 +242,14 @@ void SafeBrowsingPrivateEventRouter::OnPolicySpecifiedPasswordReuseDetected(
return;
}
- ReportRealtimeEvent(
- kKeyPasswordReuseEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& user_name,
- const bool is_phishing_url, const std::string& profile_user_name) {
- // Convert |params| to a real-time event dictionary
- // and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyUserName, user_name);
- event.SetBoolKey(kKeyIsPhishingUrl, is_phishing_url);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- return event;
- },
- params.url, params.user_name, params.is_phishing_url,
- GetProfileUserName()));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, params.url);
+ event.SetStringKey(kKeyUserName, params.user_name);
+ event.SetBoolKey(kKeyIsPhishingUrl, params.is_phishing_url);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+
+ ReportRealtimeEvent(kKeyPasswordReuseEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnPolicySpecifiedPasswordChanged(
@@ -280,19 +272,12 @@ void SafeBrowsingPrivateEventRouter::OnPolicySpecifiedPasswordChanged(
return;
}
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUserName, user_name);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+
ReportRealtimeEvent(kKeyPasswordChangedEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& user_name,
- const std::string& profile_user_name) {
- // Convert |params| to a real-time event dictionary
- // and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUserName, user_name);
- event.SetStringKey(kKeyProfileUserName,
- profile_user_name);
- return event;
- },
- user_name, GetProfileUserName()));
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnDangerousDownloadOpened(
@@ -326,36 +311,25 @@ void SafeBrowsingPrivateEventRouter::OnDangerousDownloadOpened(
return;
}
- ReportRealtimeEvent(
- kKeyDangerousDownloadEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& user_name, const std::string& mime_type,
- const std::string& threat_type, const int64_t content_size) {
- // Convert |params| to a real-time event dictionary and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, user_name);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
- event.SetStringKey(kKeyEventResult,
- safe_browsing::EventResultToString(
- safe_browsing::EventResult::BYPASSED));
- event.SetBoolKey(kKeyClickedThrough, true);
- event.SetStringKey(kKeyThreatType, threat_type);
- return event;
- },
- params.url, params.file_name, params.download_digest_sha256,
- params.user_name, mime_type, DangerTypeToThreatType(danger_type),
- content_size));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, params.url);
+ event.SetStringKey(kKeyFileName, params.file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, params.download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, params.user_name);
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
+ event.SetStringKey(
+ kKeyEventResult,
+ safe_browsing::EventResultToString(safe_browsing::EventResult::BYPASSED));
+ event.SetBoolKey(kKeyClickedThrough, true);
+ event.SetStringKey(kKeyThreatType, DangerTypeToThreatType(danger_type));
+
+ ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnSecurityInterstitialShown(
@@ -394,27 +368,17 @@ void SafeBrowsingPrivateEventRouter::OnSecurityInterstitialShown(
prefs->GetBoolean(prefs::kSafeBrowsingProceedAnywayDisabled)
? safe_browsing::EventResult::BLOCKED
: safe_browsing::EventResult::WARNED;
- ReportRealtimeEvent(
- kKeyInterstitialEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& reason,
- int net_error_code, const std::string& user_name,
- safe_browsing::EventResult event_result) {
- // Convert |params| to a real-time event dictionary and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyReason, reason);
- event.SetIntKey(kKeyNetErrorCode, net_error_code);
- event.SetStringKey(kKeyProfileUserName, user_name);
- event.SetBoolKey(kKeyClickedThrough, false);
- event.SetStringKey(
- kKeyEventResult,
- safe_browsing::EventResultToString(event_result));
-
- return event;
- },
- params.url, params.reason, net_error_code, params.user_name,
- event_result));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, params.url);
+ event.SetStringKey(kKeyReason, params.reason);
+ event.SetIntKey(kKeyNetErrorCode, net_error_code);
+ event.SetStringKey(kKeyProfileUserName, params.user_name);
+ event.SetBoolKey(kKeyClickedThrough, false);
+ event.SetStringKey(kKeyEventResult,
+ safe_browsing::EventResultToString(event_result));
+
+ ReportRealtimeEvent(kKeyInterstitialEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnSecurityInterstitialProceeded(
@@ -448,24 +412,18 @@ void SafeBrowsingPrivateEventRouter::OnSecurityInterstitialProceeded(
return;
}
- ReportRealtimeEvent(
- kKeyInterstitialEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& reason,
- int net_error_code, const std::string& user_name) {
- // Convert |params| to a real-time event dictionary and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyReason, reason);
- event.SetIntKey(kKeyNetErrorCode, net_error_code);
- event.SetStringKey(kKeyProfileUserName, user_name);
- event.SetBoolKey(kKeyClickedThrough, true);
- event.SetStringKey(kKeyEventResult,
- safe_browsing::EventResultToString(
- safe_browsing::EventResult::BYPASSED));
- return event;
- },
- params.url, params.reason, net_error_code, params.user_name));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, params.url);
+ event.SetStringKey(kKeyReason, params.reason);
+ event.SetIntKey(kKeyNetErrorCode, net_error_code);
+ event.SetStringKey(kKeyProfileUserName, params.user_name);
+ event.SetBoolKey(kKeyClickedThrough, true);
+ event.SetStringKey(
+ kKeyEventResult,
+ safe_browsing::EventResultToString(safe_browsing::EventResult::BYPASSED));
+
+ ReportRealtimeEvent(kKeyInterstitialEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnAnalysisConnectorResult(
@@ -509,52 +467,32 @@ void SafeBrowsingPrivateEventRouter::OnDangerousDeepScanningResult(
return;
}
- ReportRealtimeEvent(
- kKeyDangerousDownloadEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name,
- const std::string& threat_type, const std::string& mime_type,
- const std::string& trigger, const int64_t content_size,
- safe_browsing::EventResult event_result,
- const std::string& malware_family,
- const std::string& malware_category,
- const std::string& evidence_locker_filepath) {
- // Create a real-time event dictionary from the arguments and
- // report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyThreatType, threat_type);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, trigger);
- event.SetStringKey(
- kKeyEventResult,
- safe_browsing::EventResultToString(event_result));
- event.SetBoolKey(
- kKeyClickedThrough,
- event_result == safe_browsing::EventResult::BYPASSED);
- if (!malware_family.empty())
- event.SetStringKey(kKeyMalwareFamily, malware_family);
- if (!malware_category.empty())
- event.SetStringKey(kKeyMalwareCategory, malware_category);
- if (!evidence_locker_filepath.empty()) {
- event.SetStringKey(kKeyEvidenceLockerFilePath,
- evidence_locker_filepath);
- }
- return event;
- },
- url.spec(), file_name, download_digest_sha256, GetProfileUserName(),
- threat_type, mime_type, trigger, content_size, event_result,
- malware_family, malware_category, evidence_locker_filepath));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyThreatType, threat_type);
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, trigger);
+ event.SetStringKey(kKeyEventResult,
+ safe_browsing::EventResultToString(event_result));
+ event.SetBoolKey(kKeyClickedThrough,
+ event_result == safe_browsing::EventResult::BYPASSED);
+ if (!malware_family.empty())
+ event.SetStringKey(kKeyMalwareFamily, malware_family);
+ if (!malware_category.empty())
+ event.SetStringKey(kKeyMalwareCategory, malware_category);
+ if (!evidence_locker_filepath.empty()) {
+ event.SetStringKey(kKeyEvidenceLockerFilePath, evidence_locker_filepath);
+ }
+
+ ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnSensitiveDataEvent(
@@ -572,48 +510,30 @@ void SafeBrowsingPrivateEventRouter::OnSensitiveDataEvent(
return;
}
- ReportRealtimeEvent(
- kKeySensitiveDataEvent, std::move(settings.value()),
- base::BindOnce(
- [](const enterprise_connectors::ContentAnalysisResponse::Result&
- result,
- const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name, const std::string& mime_type,
- const std::string& trigger, const int64_t content_size,
- safe_browsing::EventResult event_result) {
- // Create a real-time event dictionary from the arguments and
- // report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, trigger);
- event.SetStringKey(
- kKeyEventResult,
- safe_browsing::EventResultToString(event_result));
- event.SetBoolKey(
- kKeyClickedThrough,
- event_result == safe_browsing::EventResult::BYPASSED);
- if (!result.evidence_locker_filepath().empty()) {
- event.SetStringKey(kKeyEvidenceLockerFilePath,
- result.evidence_locker_filepath());
- }
-
- AddAnalysisConnectorVerdictToEvent(result, &event);
-
- return event;
- },
- result, url.spec(), file_name, download_digest_sha256,
- GetProfileUserName(), mime_type, trigger, content_size,
- event_result));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, trigger);
+ event.SetStringKey(kKeyEventResult,
+ safe_browsing::EventResultToString(event_result));
+ event.SetBoolKey(kKeyClickedThrough,
+ event_result == safe_browsing::EventResult::BYPASSED);
+ if (!result.evidence_locker_filepath().empty()) {
+ event.SetStringKey(kKeyEvidenceLockerFilePath,
+ result.evidence_locker_filepath());
+ }
+
+ AddAnalysisConnectorVerdictToEvent(result, &event);
+
+ ReportRealtimeEvent(kKeySensitiveDataEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnAnalysisConnectorWarningBypassed(
@@ -631,47 +551,30 @@ void SafeBrowsingPrivateEventRouter::OnAnalysisConnectorWarningBypassed(
return;
}
- ReportRealtimeEvent(
- kKeySensitiveDataEvent, std::move(settings.value()),
- base::BindOnce(
- [](const enterprise_connectors::ContentAnalysisResponse::Result&
- result,
- const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name, const std::string& mime_type,
- const std::string& trigger,
- safe_browsing::DeepScanAccessPoint /* access_point */,
- const int64_t content_size) {
- // Create a real-time event dictionary from the arguments and
- // report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, trigger);
- event.SetStringKey(kKeyEventResult,
- safe_browsing::EventResultToString(
- safe_browsing::EventResult::BYPASSED));
- event.SetBoolKey(kKeyClickedThrough, true);
- if (!result.evidence_locker_filepath().empty()) {
- event.SetStringKey(kKeyEvidenceLockerFilePath,
- result.evidence_locker_filepath());
- }
-
- AddAnalysisConnectorVerdictToEvent(result, &event);
-
- return event;
- },
- result, url.spec(), file_name, download_digest_sha256,
- GetProfileUserName(), mime_type, trigger, access_point,
- content_size));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, trigger);
+ event.SetStringKey(
+ kKeyEventResult,
+ safe_browsing::EventResultToString(safe_browsing::EventResult::BYPASSED));
+ event.SetBoolKey(kKeyClickedThrough, true);
+ if (!result.evidence_locker_filepath().empty()) {
+ event.SetStringKey(kKeyEvidenceLockerFilePath,
+ result.evidence_locker_filepath());
+ }
+
+ AddAnalysisConnectorVerdictToEvent(result, &event);
+
+ ReportRealtimeEvent(kKeySensitiveDataEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnUnscannedFileEvent(
@@ -690,42 +593,25 @@ void SafeBrowsingPrivateEventRouter::OnUnscannedFileEvent(
return;
}
- ReportRealtimeEvent(
- kKeyUnscannedFileEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name, const std::string& mime_type,
- const std::string& trigger,
- safe_browsing::DeepScanAccessPoint access_point,
- const std::string& reason, const int64_t content_size,
- safe_browsing::EventResult event_result) {
- // Create a real-time event dictionary from the arguments and
- // report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyContentType, mime_type);
- event.SetStringKey(kKeyUnscannedReason, reason);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, trigger);
- event.SetStringKey(
- kKeyEventResult,
- safe_browsing::EventResultToString(event_result));
- event.SetBoolKey(
- kKeyClickedThrough,
- event_result == safe_browsing::EventResult::BYPASSED);
- return event;
- },
- url.spec(), file_name, download_digest_sha256, GetProfileUserName(),
- mime_type, trigger, access_point, reason, content_size,
- event_result));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyContentType, mime_type);
+ event.SetStringKey(kKeyUnscannedReason, reason);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, trigger);
+ event.SetStringKey(kKeyEventResult,
+ safe_browsing::EventResultToString(event_result));
+ event.SetBoolKey(kKeyClickedThrough,
+ event_result == safe_browsing::EventResult::BYPASSED);
+
+ ReportRealtimeEvent(kKeyUnscannedFileEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnDangerousDownloadEvent(
@@ -755,37 +641,24 @@ void SafeBrowsingPrivateEventRouter::OnDangerousDownloadEvent(
return;
}
- ReportRealtimeEvent(
- kKeyDangerousDownloadEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name,
- const std::string& threat_type, const std::string& mime_type,
- const int64_t content_size,
- safe_browsing::EventResult event_result) {
- // Create a real-time event dictionary and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyThreatType, threat_type);
- event.SetBoolKey(kKeyClickedThrough, false);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
- event.SetStringKey(
- kKeyEventResult,
- safe_browsing::EventResultToString(event_result));
- return event;
- },
- url.spec(), file_name, download_digest_sha256, GetProfileUserName(),
- threat_type, mime_type, content_size, event_result));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyThreatType, threat_type);
+ event.SetBoolKey(kKeyClickedThrough, false);
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
+ event.SetStringKey(kKeyEventResult,
+ safe_browsing::EventResultToString(event_result));
+
+ ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(settings.value()),
+ std::move(event));
}
void SafeBrowsingPrivateEventRouter::OnDangerousDownloadWarningBypassed(
@@ -813,36 +686,25 @@ void SafeBrowsingPrivateEventRouter::OnDangerousDownloadWarningBypassed(
return;
}
- ReportRealtimeEvent(
- kKeyDangerousDownloadEvent, std::move(settings.value()),
- base::BindOnce(
- [](const std::string& url, const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& profile_user_name,
- const std::string& threat_type, const std::string& mime_type,
- const int64_t content_size) {
- // Create a real-time event dictionary and report it.
- base::Value event(base::Value::Type::DICTIONARY);
- event.SetStringKey(kKeyUrl, url);
- event.SetStringKey(kKeyFileName, file_name);
- event.SetStringKey(kKeyDownloadDigestSha256,
- download_digest_sha256);
- event.SetStringKey(kKeyProfileUserName, profile_user_name);
- event.SetStringKey(kKeyThreatType, threat_type);
- event.SetBoolKey(kKeyClickedThrough, true);
- event.SetStringKey(kKeyContentType, mime_type);
- // |content_size| can be set to -1 to indicate an unknown size, in
- // which case the field is not set.
- if (content_size >= 0)
- event.SetIntKey(kKeyContentSize, content_size);
- event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
- event.SetStringKey(kKeyEventResult,
- safe_browsing::EventResultToString(
- safe_browsing::EventResult::BYPASSED));
- return event;
- },
- url.spec(), file_name, download_digest_sha256, GetProfileUserName(),
- threat_type, mime_type, content_size));
+ base::Value event(base::Value::Type::DICTIONARY);
+ event.SetStringKey(kKeyUrl, url.spec());
+ event.SetStringKey(kKeyFileName, file_name);
+ event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+ event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+ event.SetStringKey(kKeyThreatType, threat_type);
+ event.SetBoolKey(kKeyClickedThrough, true);
+ event.SetStringKey(kKeyContentType, mime_type);
+ // |content_size| can be set to -1 to indicate an unknown size, in
+ // which case the field is not set.
+ if (content_size >= 0)
+ event.SetIntKey(kKeyContentSize, content_size);
+ event.SetStringKey(kKeyTrigger, kTriggerFileDownload);
+ event.SetStringKey(
+ kKeyEventResult,
+ safe_browsing::EventResultToString(safe_browsing::EventResult::BYPASSED));
+
+ ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(settings.value()),
+ std::move(event));
}
// static
@@ -1054,8 +916,8 @@ SafeBrowsingPrivateEventRouter::GetReportingSettings() {
void SafeBrowsingPrivateEventRouter::ReportRealtimeEvent(
const std::string& name,
- enterprise_connectors::ReportingSettings settings,
- EventBuilder event_builder) {
+ const enterprise_connectors::ReportingSettings& settings,
+ base::Value event) {
if (rejected_dm_token_timers_.contains(settings.dm_token)) {
return;
}
@@ -1090,7 +952,7 @@ void SafeBrowsingPrivateEventRouter::ReportRealtimeEvent(
base::Value wrapper(base::Value::Type::DICTIONARY);
wrapper.SetStringKey("time", now_str);
- wrapper.SetKey(name, std::move(event_builder).Run());
+ wrapper.SetKey(name, std::move(event));
auto upload_callback = base::BindOnce(
[](base::Value wrapper, bool uploaded) {
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
index cd98054bcb0..66bc18c1d8c 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -226,13 +226,11 @@ class SafeBrowsingPrivateEventRouter
protected:
// Report safe browsing event through real-time reporting channel, if enabled.
// Declared as virtual for tests. Declared as protected to be called directly
- // by tests. Events are created lazily to avoid doing useless work if they are
- // discarded.
- using EventBuilder = base::OnceCallback<base::Value()>;
+ // by tests.
virtual void ReportRealtimeEvent(
const std::string&,
- enterprise_connectors::ReportingSettings settings,
- EventBuilder event_builder);
+ const enterprise_connectors::ReportingSettings& settings,
+ base::Value event);
private:
// Initialize a real-time report client if needed. This client is used only
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index 270ae98d9b2..9038ff25101 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -5,11 +5,11 @@
#include <memory>
#include <set>
+#include <string>
#include <utility>
#include "base/bind.h"
#include "base/json/json_reader.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/mock_callback.h"
#include "base/test/scoped_feature_list.h"
@@ -43,9 +43,9 @@
#include "testing/gtest/include/gtest/gtest.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chromeos/tpm/stub_install_attributes.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/scoped_user_manager.h"
@@ -1098,7 +1098,7 @@ class SafeBrowsingIsRealtimeReportingEnabledTest
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
- auto user_manager = std::make_unique<chromeos::FakeChromeUserManager>();
+ auto user_manager = std::make_unique<ash::FakeChromeUserManager>();
const AccountId account_id(
AccountId::FromUserEmail(profile_->GetProfileUserName()));
const user_manager::User* user = user_manager->AddUserWithAffiliation(
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.cc b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.cc
index 22375abb9e6..f2800b47fea 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.cc
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.cc
@@ -108,6 +108,14 @@ safe_browsing_private::ReferrerChainEntry ReferrerToReferrerChainEntry(
entry.maybe_launched_by_external_app = std::make_unique<bool>(
referrer.maybe_launched_by_external_application());
}
+ if (referrer.has_is_subframe_url_removed()) {
+ entry.is_subframe_url_removed =
+ std::make_unique<bool>(referrer.is_subframe_url_removed());
+ }
+ if (referrer.has_is_subframe_referrer_url_removed()) {
+ entry.is_subframe_referrer_url_removed =
+ std::make_unique<bool>(referrer.is_subframe_referrer_url_removed());
+ }
return entry;
}
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util_unittest.cc b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util_unittest.cc
index bb888889faf..262eacc882d 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util_unittest.cc
@@ -22,6 +22,8 @@ const bool kIsRetargeting = false;
const double kNavTime = 12345;
const char kServerRedirectUrl[] = "https://example.com/redirect";
const bool kMaybeLaunched = false;
+const bool kIsSubframeUrlRemoved = false;
+const bool kIsSubframeReferrerUrlRemoved = false;
void InitializeFakeReferrerChainEntry(
std::string url,
@@ -39,6 +41,8 @@ void InitializeFakeReferrerChainEntry(
referrer->set_navigation_initiation(
safe_browsing::ReferrerChainEntry_NavigationInitiation_BROWSER_INITIATED);
referrer->set_maybe_launched_by_external_application(kMaybeLaunched);
+ referrer->set_is_subframe_url_removed(kIsSubframeUrlRemoved);
+ referrer->set_is_subframe_referrer_url_removed(kIsSubframeReferrerUrlRemoved);
}
void ValidateReferrerChain(
@@ -55,6 +59,9 @@ void ValidateReferrerChain(
EXPECT_EQ(referrer.navigation_initiation,
safe_browsing_private::NAVIGATION_INITIATION_BROWSER_INITIATED);
EXPECT_EQ(*referrer.maybe_launched_by_external_app, kMaybeLaunched);
+ EXPECT_EQ(*referrer.is_subframe_url_removed, kIsSubframeUrlRemoved);
+ EXPECT_EQ(*referrer.is_subframe_referrer_url_removed,
+ kIsSubframeReferrerUrlRemoved);
}
} // namespace
diff --git a/chromium/chrome/browser/extensions/api/scripting/scripting_api.cc b/chromium/chrome/browser/extensions/api/scripting/scripting_api.cc
index 5ad3ca902a1..cbff2eaa60d 100644
--- a/chromium/chrome/browser/extensions/api/scripting/scripting_api.cc
+++ b/chromium/chrome/browser/extensions/api/scripting/scripting_api.cc
@@ -18,6 +18,10 @@
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
+#include "extensions/common/mojom/action_type.mojom-shared.h"
+#include "extensions/common/mojom/css_origin.mojom-shared.h"
+#include "extensions/common/mojom/host_id.mojom.h"
+#include "extensions/common/mojom/run_location.mojom-shared.h"
#include "extensions/common/permissions/api_permission.h"
#include "extensions/common/permissions/permissions_data.h"
@@ -32,19 +36,20 @@ constexpr char kExactlyOneOfCssAndFilesError[] =
// Note: CSS always injects as soon as possible, so we default to
// document_start. Because of tab loading, there's no guarantee this will
// *actually* inject before page load, but it will at least inject "soon".
-constexpr UserScript::RunLocation kCSSRunLocation = UserScript::DOCUMENT_START;
+constexpr mojom::RunLocation kCSSRunLocation =
+ mojom::RunLocation::kDocumentStart;
// Converts the given `style_origin` to a CSSOrigin.
-CSSOrigin ConvertStyleOriginToCSSOrigin(
+mojom::CSSOrigin ConvertStyleOriginToCSSOrigin(
api::scripting::StyleOrigin style_origin) {
- CSSOrigin css_origin = CSSOrigin::kAuthor;
+ mojom::CSSOrigin css_origin = mojom::CSSOrigin::kAuthor;
switch (style_origin) {
case api::scripting::STYLE_ORIGIN_NONE:
case api::scripting::STYLE_ORIGIN_AUTHOR:
- css_origin = CSSOrigin::kAuthor;
+ css_origin = mojom::CSSOrigin::kAuthor;
break;
case api::scripting::STYLE_ORIGIN_USER:
- css_origin = CSSOrigin::kUser;
+ css_origin = mojom::CSSOrigin::kUser;
break;
}
@@ -89,7 +94,7 @@ bool HasPermissionToInjectIntoFrame(const PermissionsData& permissions,
const url::SchemeHostPort& tuple_or_precursor_tuple =
origin.GetTupleOrPrecursorTupleIfOpaque();
if (!tuple_or_precursor_tuple.IsValid()) {
- if (permissions.HasAPIPermission(APIPermission::kTab)) {
+ if (permissions.HasAPIPermission(mojom::APIPermissionID::kTab)) {
*error = ErrorUtils::FormatErrorMessage(
manifest_errors::kCannotAccessPageWithUrl, url.spec());
} else {
@@ -114,7 +119,7 @@ bool CanAccessTarget(const PermissionsData& permissions,
bool include_incognito_information,
ScriptExecutor** script_executor_out,
ScriptExecutor::FrameScope* frame_scope_out,
- std::vector<int>* frame_ids_out,
+ std::set<int>* frame_ids_out,
std::string* error_out) {
content::WebContents* tab = nullptr;
TabHelper* tab_helper = nullptr;
@@ -139,15 +144,11 @@ bool CanAccessTarget(const PermissionsData& permissions,
? ScriptExecutor::INCLUDE_SUB_FRAMES
: ScriptExecutor::SPECIFIED_FRAMES;
- std::vector<int> frame_ids;
+ std::set<int> frame_ids;
if (target.frame_ids) {
- // Ensure IDs are unique.
- frame_ids = *target.frame_ids;
- std::sort(frame_ids.begin(), frame_ids.end());
- auto new_end = std::unique(frame_ids.begin(), frame_ids.end());
- frame_ids.erase(new_end, frame_ids.end());
+ frame_ids.insert(target.frame_ids->begin(), target.frame_ids->end());
} else {
- frame_ids.push_back(ExtensionApiFrameIdMap::kTopFrameId);
+ frame_ids.insert(ExtensionApiFrameIdMap::kTopFrameId);
}
// TODO(devlin): If `allFrames` is true, we error out if the extension
@@ -285,7 +286,7 @@ bool ScriptingExecuteScriptFunction::Execute(std::string code_to_execute,
std::string* error) {
ScriptExecutor* script_executor = nullptr;
ScriptExecutor::FrameScope frame_scope = ScriptExecutor::SPECIFIED_FRAMES;
- std::vector<int> frame_ids;
+ std::set<int> frame_ids;
if (!CanAccessTarget(*extension()->permissions_data(), injection_.target,
browser_context(), include_incognito_information(),
&script_executor, &frame_scope, &frame_ids, error)) {
@@ -293,12 +294,12 @@ bool ScriptingExecuteScriptFunction::Execute(std::string code_to_execute,
}
script_executor->ExecuteScript(
- HostID(HostID::EXTENSIONS, extension()->id()), UserScript::ADD_JAVASCRIPT,
- std::move(code_to_execute), frame_scope, frame_ids,
- ScriptExecutor::MATCH_ABOUT_BLANK, UserScript::DOCUMENT_IDLE,
- ScriptExecutor::DEFAULT_PROCESS,
+ mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()),
+ mojom::ActionType::kAddJavascript, std::move(code_to_execute),
+ frame_scope, frame_ids, ScriptExecutor::MATCH_ABOUT_BLANK,
+ mojom::RunLocation::kDocumentIdle, ScriptExecutor::DEFAULT_PROCESS,
/* webview_src */ GURL(), std::move(script_url), user_gesture(),
- CSSOrigin::kAuthor, ScriptExecutor::JSON_SERIALIZED_RESULT,
+ mojom::CSSOrigin::kAuthor, ScriptExecutor::JSON_SERIALIZED_RESULT,
base::BindOnce(&ScriptingExecuteScriptFunction::OnScriptExecuted, this));
return true;
@@ -399,7 +400,7 @@ bool ScriptingInsertCSSFunction::Execute(std::string code_to_execute,
std::string* error) {
ScriptExecutor* script_executor = nullptr;
ScriptExecutor::FrameScope frame_scope = ScriptExecutor::SPECIFIED_FRAMES;
- std::vector<int> frame_ids;
+ std::set<int> frame_ids;
if (!CanAccessTarget(*extension()->permissions_data(), injection_.target,
browser_context(), include_incognito_information(),
&script_executor, &frame_scope, &frame_ids, error)) {
@@ -408,9 +409,9 @@ bool ScriptingInsertCSSFunction::Execute(std::string code_to_execute,
DCHECK(script_executor);
script_executor->ExecuteScript(
- HostID(HostID::EXTENSIONS, extension()->id()), UserScript::ADD_CSS,
- std::move(code_to_execute), frame_scope, frame_ids,
- ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation,
+ mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()),
+ mojom::ActionType::kAddCss, std::move(code_to_execute), frame_scope,
+ frame_ids, ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation,
ScriptExecutor::DEFAULT_PROCESS,
/* webview_src */ GURL(), std::move(script_url), user_gesture(),
ConvertStyleOriginToCSSOrigin(injection_.origin),
@@ -465,7 +466,7 @@ ExtensionFunction::ResponseAction ScriptingRemoveCSSFunction::Run() {
ScriptExecutor* script_executor = nullptr;
ScriptExecutor::FrameScope frame_scope = ScriptExecutor::SPECIFIED_FRAMES;
- std::vector<int> frame_ids;
+ std::set<int> frame_ids;
if (!CanAccessTarget(*extension()->permissions_data(), injection.target,
browser_context(), include_incognito_information(),
&script_executor, &frame_scope, &frame_ids, &error)) {
@@ -476,8 +477,8 @@ ExtensionFunction::ResponseAction ScriptingRemoveCSSFunction::Run() {
DCHECK(code.empty() || !script_url.is_valid());
script_executor->ExecuteScript(
- HostID(HostID::EXTENSIONS, extension()->id()), UserScript::REMOVE_CSS,
- std::move(code), frame_scope, frame_ids,
+ mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()),
+ mojom::ActionType::kRemoveCss, std::move(code), frame_scope, frame_ids,
ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation,
ScriptExecutor::DEFAULT_PROCESS,
/* webview_src */ GURL(), std::move(script_url), user_gesture(),
diff --git a/chromium/chrome/browser/extensions/api/search/search_api_apitest.cc b/chromium/chrome/browser/extensions/api/search/search_api_apitest.cc
index 388e480255b..a6c55066b62 100644
--- a/chromium/chrome/browser/extensions/api/search/search_api_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/search/search_api_apitest.cc
@@ -18,7 +18,13 @@ IN_PROC_BROWSER_TEST_F(SearchApiTest, Normal) {
}
// Test incognito browser in extension default spanning mode.
-IN_PROC_BROWSER_TEST_F(SearchApiTest, Incognito) {
+// Disabled due to flakes on Ozone testers; see https://crbug.com/1188651.
+#if defined(USE_OZONE)
+#define MAYBE_Incognito DISABLED_Incognito
+#else
+#define MAYBE_Incognito Incognito
+#endif
+IN_PROC_BROWSER_TEST_F(SearchApiTest, MAYBE_Incognito) {
ResultCatcher catcher;
CreateIncognitoBrowser(browser()->profile());
ASSERT_TRUE(RunExtensionTest({.name = "search/query/incognito"},
diff --git a/chromium/chrome/browser/extensions/api/sessions/session_id.cc b/chromium/chrome/browser/extensions/api/sessions/session_id.cc
index e2ea1bd32b7..9baf3780d28 100644
--- a/chromium/chrome/browser/extensions/api/sessions/session_id.cc
+++ b/chromium/chrome/browser/extensions/api/sessions/session_id.cc
@@ -29,7 +29,7 @@ std::unique_ptr<SessionId> SessionId::Parse(const std::string& session_id) {
if (!base::StringToInt(
session_tag.empty() ? session_id : session_id.substr(separator + 1),
&id)) {
- return std::unique_ptr<SessionId>();
+ return nullptr;
}
return base::WrapUnique(new SessionId(session_tag, id));
}
diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc
index fa30a4353f0..435ab446db1 100644
--- a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc
+++ b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -17,6 +17,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "chrome/browser/extensions/api/sessions/session_id.h"
+#include "chrome/browser/extensions/api/tab_groups/tab_groups_util.h"
#include "chrome/browser/extensions/api/tabs/windows_util.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/window_controller.h"
@@ -88,15 +89,15 @@ api::tabs::Tab CreateTabModelHelper(
const GURL& url = current_navigation.virtual_url();
std::string title = base::UTF16ToUTF8(current_navigation.title());
- tab_struct.session_id.reset(new std::string(session_id));
- tab_struct.url.reset(new std::string(url.spec()));
- tab_struct.fav_icon_url.reset(
- new std::string(current_navigation.favicon_url().spec()));
+ tab_struct.session_id = std::make_unique<std::string>(session_id);
+ tab_struct.url = std::make_unique<std::string>(url.spec());
+ tab_struct.fav_icon_url =
+ std::make_unique<std::string>(current_navigation.favicon_url().spec());
if (!title.empty()) {
- tab_struct.title.reset(new std::string(title));
+ tab_struct.title = std::make_unique<std::string>(title);
} else {
- tab_struct.title.reset(new std::string(
- base::UTF16ToUTF8(url_formatter::FormatUrl(url))));
+ tab_struct.title = std::make_unique<std::string>(
+ base::UTF16ToUTF8(url_formatter::FormatUrl(url)));
}
tab_struct.index = index;
tab_struct.pinned = pinned;
@@ -116,7 +117,7 @@ std::unique_ptr<api::windows::Window> CreateWindowModelHelper(
const api::windows::WindowState& state) {
std::unique_ptr<api::windows::Window> window_struct(new api::windows::Window);
window_struct->tabs = std::move(tabs);
- window_struct->session_id.reset(new std::string(session_id));
+ window_struct->session_id = std::make_unique<std::string>(session_id);
window_struct->incognito = false;
window_struct->always_on_top = false;
window_struct->focused = false;
@@ -128,7 +129,8 @@ std::unique_ptr<api::windows::Window> CreateWindowModelHelper(
std::unique_ptr<api::sessions::Session> CreateSessionModelHelper(
int last_modified,
std::unique_ptr<api::tabs::Tab> tab,
- std::unique_ptr<api::windows::Window> window) {
+ std::unique_ptr<api::windows::Window> window,
+ std::unique_ptr<api::tab_groups::TabGroup> group) {
std::unique_ptr<api::sessions::Session> session_struct(
new api::sessions::Session());
session_struct->last_modified = last_modified;
@@ -136,6 +138,8 @@ std::unique_ptr<api::sessions::Session> CreateSessionModelHelper(
session_struct->tab = std::move(tab);
else if (window)
session_struct->window = std::move(window);
+ else if (group)
+ NOTREACHED(); // TODO(crbug.com/1192309): Implement group support.
else
NOTREACHED();
return session_struct;
@@ -171,25 +175,36 @@ SessionsGetRecentlyClosedFunction::CreateWindowModel(
api::windows::WINDOW_TYPE_NORMAL, api::windows::WINDOW_STATE_NORMAL);
}
+std::unique_ptr<api::tab_groups::TabGroup>
+SessionsGetRecentlyClosedFunction::CreateGroupModel(
+ const sessions::TabRestoreService::Group& group) {
+ DCHECK(!group.tabs.empty());
+
+ return tab_groups_util::CreateTabGroupObject(group.group_id,
+ group.visual_data);
+}
+
std::unique_ptr<api::sessions::Session>
SessionsGetRecentlyClosedFunction::CreateSessionModel(
const sessions::TabRestoreService::Entry& entry) {
std::unique_ptr<api::tabs::Tab> tab;
std::unique_ptr<api::windows::Window> window;
+ std::unique_ptr<api::tab_groups::TabGroup> group;
switch (entry.type) {
case sessions::TabRestoreService::TAB:
- tab.reset(new api::tabs::Tab(CreateTabModel(
- static_cast<const sessions::TabRestoreService::Tab&>(entry), false)));
+ tab = std::make_unique<api::tabs::Tab>(CreateTabModel(
+ static_cast<const sessions::TabRestoreService::Tab&>(entry), false));
break;
case sessions::TabRestoreService::WINDOW:
window = CreateWindowModel(
static_cast<const sessions::TabRestoreService::Window&>(entry));
break;
- default:
- NOTREACHED();
+ case sessions::TabRestoreService::GROUP:
+ group = CreateGroupModel(
+ static_cast<const sessions::TabRestoreService::Group&>(entry));
}
return CreateSessionModelHelper(entry.timestamp.ToTimeT(), std::move(tab),
- std::move(window));
+ std::move(window), std::move(group));
}
ExtensionFunction::ResponseAction SessionsGetRecentlyClosedFunction::Run() {
@@ -219,7 +234,16 @@ ExtensionFunction::ResponseAction SessionsGetRecentlyClosedFunction::Run() {
// We prune the list to contain max 25 entries at any time and removes
// uninteresting entries.
for (const auto& entry : tab_restore_service->entries()) {
- result.push_back(std::move(*CreateSessionModel(*entry)));
+ // TODO(crbug.com/1192309): Support group entries in the Sessions API,
+ // rather than sharding the group out into individual tabs.
+ if (entry->type == sessions::TabRestoreService::GROUP) {
+ auto& group =
+ static_cast<const sessions::TabRestoreService::Group&>(*entry);
+ for (const auto& tab : group.tabs)
+ result.push_back(std::move(*CreateSessionModel(*tab)));
+ } else {
+ result.push_back(std::move(*CreateSessionModel(*entry)));
+ }
}
return RespondNow(ArgumentList(GetRecentlyClosed::Results::Create(result)));
@@ -319,10 +343,10 @@ SessionsGetDevicesFunction::CreateWindowModel(
CreateWindowModelHelper(std::move(tabs), session_id, type, state));
// TODO(dwankri): Dig deeper to resolve bounds not being optional, so closed
// windows in GetRecentlyClosed can have set values in Window helper.
- window_struct->left.reset(new int(window.bounds.x()));
- window_struct->top.reset(new int(window.bounds.y()));
- window_struct->width.reset(new int(window.bounds.width()));
- window_struct->height.reset(new int(window.bounds.height()));
+ window_struct->left = std::make_unique<int>(window.bounds.x());
+ window_struct->top = std::make_unique<int>(window.bounds.y());
+ window_struct->width = std::make_unique<int>(window.bounds.width());
+ window_struct->height = std::make_unique<int>(window.bounds.height());
return window_struct;
}
@@ -337,9 +361,10 @@ SessionsGetDevicesFunction::CreateSessionModel(
// empty.
return !window_model
? nullptr
- : CreateSessionModelHelper(window.timestamp.ToTimeT(),
- std::unique_ptr<api::tabs::Tab>(),
- std::move(window_model));
+ : CreateSessionModelHelper(
+ window.timestamp.ToTimeT(),
+ std::unique_ptr<api::tabs::Tab>(), std::move(window_model),
+ std::unique_ptr<api::tab_groups::TabGroup>());
}
api::sessions::Device SessionsGetDevicesFunction::CreateDeviceModel(
@@ -408,7 +433,8 @@ ExtensionFunction::ResponseValue SessionsRestoreFunction::GetRestoredTabResult(
contents, scrub_tab_behavior, extension()));
std::unique_ptr<api::sessions::Session> restored_session(
CreateSessionModelHelper(base::Time::Now().ToTimeT(), std::move(tab),
- std::unique_ptr<api::windows::Window>()));
+ std::unique_ptr<api::windows::Window>(),
+ std::unique_ptr<api::tab_groups::TabGroup>()));
return ArgumentList(Restore::Results::Create(*restored_session));
}
@@ -428,7 +454,7 @@ SessionsRestoreFunction::GetRestoredWindowResult(int window_id) {
api::windows::Window::FromValue(*window_value));
return ArgumentList(Restore::Results::Create(*CreateSessionModelHelper(
base::Time::Now().ToTimeT(), std::unique_ptr<api::tabs::Tab>(),
- std::move(window))));
+ std::move(window), std::unique_ptr<api::tab_groups::TabGroup>())));
}
ExtensionFunction::ResponseValue
@@ -631,8 +657,8 @@ SessionsAPI::GetFactoryInstance() {
}
void SessionsAPI::OnListenerAdded(const EventListenerInfo& details) {
- sessions_event_router_.reset(
- new SessionsEventRouter(Profile::FromBrowserContext(browser_context_)));
+ sessions_event_router_ = std::make_unique<SessionsEventRouter>(
+ Profile::FromBrowserContext(browser_context_));
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_api.h b/chromium/chrome/browser/extensions/api/sessions/sessions_api.h
index 2841e654bac..ba77563628b 100644
--- a/chromium/chrome/browser/extensions/api/sessions/sessions_api.h
+++ b/chromium/chrome/browser/extensions/api/sessions/sessions_api.h
@@ -9,6 +9,7 @@
#include "base/macros.h"
#include "chrome/common/extensions/api/sessions.h"
+#include "chrome/common/extensions/api/tab_groups.h"
#include "chrome/common/extensions/api/tabs.h"
#include "chrome/common/extensions/api/windows.h"
#include "components/sessions/core/tab_restore_service.h"
@@ -40,6 +41,8 @@ class SessionsGetRecentlyClosedFunction : public ExtensionFunction {
bool active);
std::unique_ptr<api::windows::Window> CreateWindowModel(
const sessions::TabRestoreService::Window& window);
+ std::unique_ptr<api::tab_groups::TabGroup> CreateGroupModel(
+ const sessions::TabRestoreService::Group& group);
std::unique_ptr<api::sessions::Session> CreateSessionModel(
const sessions::TabRestoreService::Entry& entry);
};
diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 22efe59b25a..d2ec2c89533 100644
--- a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -188,7 +188,7 @@ void ExtensionSessionsTest::SetUpOnMainThread() {
void ExtensionSessionsTest::CreateTestExtension() {
extension_ = ExtensionBuilder("Test")
.AddPermissions({"sessions", "tabs"})
- .SetLocation(Manifest::INTERNAL)
+ .SetLocation(mojom::ManifestLocation::kInternal)
.Build();
}
diff --git a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc
index 825b0d8df47..db7161dd289 100644
--- a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc
+++ b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc
@@ -124,7 +124,7 @@ std::unique_ptr<TemplateURLData> ConvertSearchProvider(
SettingsOverridesAPI::SettingsOverridesAPI(content::BrowserContext* context)
: profile_(Profile::FromBrowserContext(context)),
url_service_(TemplateURLServiceFactory::GetForProfile(profile_)) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
}
SettingsOverridesAPI::~SettingsOverridesAPI() {
diff --git a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h
index baf7419ef7b..8b742703f09 100644
--- a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h
+++ b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h
@@ -10,7 +10,7 @@
#include <string>
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "components/search_engines/template_url_service.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry.h"
@@ -55,8 +55,8 @@ class SettingsOverridesAPI : public BrowserContextKeyedAPI,
TemplateURLService* url_service_;
// Listen to extension load, unloaded notifications.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(SettingsOverridesAPI);
};
diff --git a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
index 41731f390c3..379b49cf108 100644
--- a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
@@ -42,8 +42,8 @@ const int kTestExtensionPrepopulatedId = 3;
// chrome/test/data/extensions/settings_override/manifest.json
std::unique_ptr<TemplateURLData> TestExtensionSearchEngine(PrefService* prefs) {
auto result = std::make_unique<TemplateURLData>();
- result->SetShortName(base::ASCIIToUTF16("name.de"));
- result->SetKeyword(base::ASCIIToUTF16("keyword.de"));
+ result->SetShortName(u"name.de");
+ result->SetKeyword(u"keyword.de");
result->SetURL("http://www.foo.de/s?q={searchTerms}&id=10");
result->favicon_url = GURL("http://www.foo.de/favicon.ico?id=10");
result->suggestions_url = "http://www.foo.de/suggest?q={searchTerms}&id=10";
@@ -152,8 +152,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, PRE_OverridenDSEPersists) {
// Check that default provider is normal before extension is
// installed and loaded.
EXPECT_EQ(TemplateURL::NORMAL, default_provider->type());
- EXPECT_NE(base::ASCIIToUTF16("name.de"), default_provider->short_name());
- EXPECT_NE(base::ASCIIToUTF16("keyword.de"), default_provider->keyword());
+ EXPECT_NE(u"name.de", default_provider->short_name());
+ EXPECT_NE(u"keyword.de", default_provider->keyword());
// Install extension that overrides DSE.
const extensions::Extension* extension = LoadExtension(
@@ -185,7 +185,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverridenDSEPersists) {
TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
std::string new_tab_url_ext = ext_turl.new_tab_url_ref().ReplaceSearchTerms(
- TemplateURLRef::SearchTermsArgs(base::string16()),
+ TemplateURLRef::SearchTermsArgs(std::u16string()),
UIThreadSearchTermsData());
EXPECT_EQ(new_tab_url_ext, search::GetNewTabPageURL(profile).spec());
@@ -273,7 +273,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionsDisabledWithSettingsOverrideAPI,
ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
TestExtensionRegistryObserver observer(registry);
auto provider = std::make_unique<MockExternalProvider>(
- extension_service(), Manifest::EXTERNAL_PREF);
+ extension_service(), mojom::ManifestLocation::kExternalPref);
provider->UpdateOrAddExtension(
kExternalId, "2.1",
test_data_dir_.AppendASCII("api_test/settings_overrides/homepage.crx"));
diff --git a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
index dc0692379ab..37097579608 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/settings_private/prefs_util.h"
+#include <memory>
+
#include "base/feature_list.h"
#include "build/branding_buildflags.h"
#include "build/build_config.h"
@@ -57,16 +59,16 @@
#include "ash/constants/ash_pref_names.h"
#include "ash/public/cpp/ambient/ambient_prefs.h"
#include "ash/public/cpp/ash_pref_names.h" // nogncheck
+#include "chrome/browser/ash/guest_os/guest_os_pref_names.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/ash/settings/supervised_user_cros_settings_provider.h"
#include "chrome/browser/ash/system/timezone_util.h"
#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
#include "chrome/browser/chromeos/full_restore/full_restore_prefs.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_pref_names.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h"
#include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.h"
@@ -80,7 +82,7 @@ namespace {
#if BUILDFLAG(IS_CHROMEOS_ASH)
bool IsPrivilegedCrosSetting(const std::string& pref_name) {
- if (!chromeos::CrosSettings::IsCrosSettings(pref_name))
+ if (!ash::CrosSettings::IsCrosSettings(pref_name))
return false;
if (!ash::system::PerUserTimezoneEnabled()) {
// kSystemTimezone should be changeable by all users.
@@ -97,7 +99,7 @@ bool IsRestrictedCrosSettingForChildUser(Profile* profile,
if (!profile->IsChild())
return false;
- return chromeos::CrosSettings::Get()
+ return ash::CrosSettings::Get()
->supervised_user_cros_settings_provider()
->HandlesSetting(pref_name);
}
@@ -109,7 +111,7 @@ const base::Value* GetRestrictedCrosSettingValueForChildUser(
// pre-set.
DCHECK(IsRestrictedCrosSettingForChildUser(profile, pref_name));
- return chromeos::CrosSettings::Get()
+ return ash::CrosSettings::Get()
->supervised_user_cros_settings_provider()
->Get(pref_name);
}
@@ -186,6 +188,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() {
// Appearance settings.
(*s_allowlist)[::prefs::kCurrentThemeID] =
settings_api::PrefType::PREF_TYPE_STRING;
+ (*s_allowlist)[::prefs::kPolicyThemeColor] =
+ settings_api::PrefType::PREF_TYPE_NUMBER;
// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
// of lacros-chrome is complete.
#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -314,6 +318,12 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() {
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_allowlist)[language::prefs::kFluentLanguages] =
settings_api::PrefType::PREF_TYPE_LIST;
+ (*s_allowlist)[language::prefs::kSelectedLanguages] =
+ settings_api::PrefType::PREF_TYPE_STRING;
+ (*s_allowlist)[language::prefs::kForcedLanguages] =
+ settings_api::PrefType::PREF_TYPE_LIST;
+ (*s_allowlist)[translate::TranslatePrefs::kPrefTranslateRecentTarget] =
+ settings_api::PrefType::PREF_TYPE_STRING;
#if BUILDFLAG(IS_CHROMEOS_ASH)
(*s_allowlist)[::prefs::kLanguageImeMenuActivated] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
@@ -409,6 +419,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() {
#if !defined(OS_ANDROID)
(*s_allowlist)[::prefs::kLiveCaptionEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ (*s_allowlist)[::prefs::kLiveCaptionLanguageCode] =
+ settings_api::PrefType::PREF_TYPE_STRING;
#endif
#if !BUILDFLAG(IS_CHROMEOS_ASH)
(*s_allowlist)[::prefs::kAccessibilityFocusHighlightEnabled] =
@@ -421,8 +433,6 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() {
// Accounts / Users / People.
(*s_allowlist)[chromeos::kAccountsPrefAllowGuest] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_allowlist)[chromeos::kAccountsPrefSupervisedUsersEnabled] =
- settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_allowlist)[chromeos::kAccountsPrefShowUserNamesOnSignIn] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_allowlist)[chromeos::kAccountsPrefAllowNewUser] =
@@ -822,7 +832,7 @@ std::unique_ptr<settings_api::PrefObject> PrefsUtil::GetCrosSettingsPref(
#if BUILDFLAG(IS_CHROMEOS_ASH)
const base::Value* value = CrosSettings::Get()->GetPref(name);
if (!value) {
- LOG(ERROR) << "Cros settings pref not found: " << name;
+ LOG(WARNING) << "Cros settings pref not found: " << name;
return nullptr;
}
pref_object->key = name;
@@ -855,7 +865,7 @@ std::unique_ptr<settings_api::PrefObject> PrefsUtil::GetPref(
pref = pref_service->FindPreference(name);
if (!pref)
return nullptr;
- pref_object.reset(new settings_api::PrefObject());
+ pref_object = std::make_unique<settings_api::PrefObject>();
pref_object->key = pref->name();
pref_object->type = GetType(name, pref->GetType());
pref_object->value.reset(pref->GetValue()->DeepCopy());
@@ -944,12 +954,14 @@ std::unique_ptr<settings_api::PrefObject> PrefsUtil::GetPref(
pref_object->controlled_by =
settings_api::ControlledBy::CONTROLLED_BY_EXTENSION;
pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
- pref_object->extension_id.reset(new std::string(extension->id()));
- pref_object->controlled_by_name.reset(new std::string(extension->name()));
+ pref_object->extension_id = std::make_unique<std::string>(extension->id());
+ pref_object->controlled_by_name =
+ std::make_unique<std::string>(extension->name());
bool can_be_disabled =
!ExtensionSystem::Get(profile_)->management_policy()->MustRemainEnabled(
extension, nullptr);
- pref_object->extension_can_be_disabled.reset(new bool(can_be_disabled));
+ pref_object->extension_can_be_disabled =
+ std::make_unique<bool>(can_be_disabled);
return pref_object;
}
@@ -1042,9 +1054,8 @@ settings_private::SetPrefResult PrefsUtil::SetCrosSettingsPref(
return settings_private::SetPrefResult::PREF_NOT_MODIFIABLE;
}
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
- profile_);
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile_);
if (service && service->HandlesSetting(pref_name) &&
service->Set(pref_name, *value)) {
@@ -1060,9 +1071,8 @@ settings_private::SetPrefResult PrefsUtil::SetCrosSettingsPref(
bool PrefsUtil::AppendToListCrosSetting(const std::string& pref_name,
const base::Value& value) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
- profile_);
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile_);
return service && service->HandlesSetting(pref_name) &&
service->AppendToList(pref_name, value);
@@ -1075,9 +1085,8 @@ bool PrefsUtil::AppendToListCrosSetting(const std::string& pref_name,
bool PrefsUtil::RemoveFromListCrosSetting(const std::string& pref_name,
const base::Value& value) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
- profile_);
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile_);
return service && service->HandlesSetting(pref_name) &&
service->RemoveFromList(pref_name, value);
diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
index a6a1fa5e278..85ec42e53ea 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
@@ -60,8 +60,10 @@ class SettingsPrivateApiTest : public ExtensionApiTest {
protected:
bool RunSettingsSubtest(const std::string& subtest) {
- return RunExtensionSubtest("settings_private", "main.html?" + subtest,
- kFlagNone, kFlagLoadAsComponent);
+ const std::string page_url = "main.html?" + subtest;
+ return RunExtensionTest({.name = "settings_private",
+ .page_url = page_url.c_str(),
+ .load_as_component = true});
}
void SetPrefPolicy(const std::string& key, policy::PolicyLevel level) {
@@ -78,7 +80,7 @@ class SettingsPrivateApiTest : public ExtensionApiTest {
testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::ScopedTestingCrosSettings scoped_testing_cros_settings_;
+ ash::ScopedTestingCrosSettings scoped_testing_cros_settings_;
#endif
DISALLOW_COPY_AND_ASSIGN(SettingsPrivateApiTest);
diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc
index 877aebd6539..9a73cdb95c6 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc
@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "base/values.h"
-#include "chrome/browser/chromeos/login/test/guest_session_mixin.h"
+#include "chrome/browser/ash/login/test/guest_session_mixin.h"
#include "chrome/browser/extensions/api/settings_private/prefs_util_enums.h"
#include "chrome/browser/extensions/api/settings_private/settings_private_api.h"
#include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h"
diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
index caee81009ac..a2fa171171d 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h"
+#include <memory>
#include <utility>
#include "base/values.h"
@@ -23,7 +24,7 @@ namespace extensions {
SettingsPrivateDelegate::SettingsPrivateDelegate(Profile* profile)
: profile_(profile) {
- prefs_util_.reset(new PrefsUtil(profile));
+ prefs_util_ = std::make_unique<PrefsUtil>(profile);
}
SettingsPrivateDelegate::~SettingsPrivateDelegate() {
diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
index 76c8b6b5be1..903a5c9ccad 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc
@@ -101,7 +101,7 @@ void SettingsPrivateEventRouter::StartOrStopListeningForPrefsChanges() {
if (prefs_util_->IsCrosSetting(pref_name)) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::CallbackListSubscription subscription =
- chromeos::CrosSettings::Get()->AddSettingsObserver(
+ ash::CrosSettings::Get()->AddSettingsObserver(
pref_name.c_str(),
base::BindRepeating(
&SettingsPrivateEventRouter::OnPreferenceChanged,
diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc b/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
index 792533e9de5..bd8c28b9125 100644
--- a/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
+++ b/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
@@ -97,7 +97,7 @@ std::unique_ptr<DeviceInfo> GetDeviceInfoForClientId(
return device;
}
}
- return std::unique_ptr<DeviceInfo>();
+ return nullptr;
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc b/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
index 705184ea56c..b50355abf9a 100644
--- a/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
@@ -24,9 +24,11 @@ std::unique_ptr<DeviceInfo> CreateDevice(const std::string& guid,
return std::make_unique<DeviceInfo>(
guid, name, "chrome_version", "user_agent",
sync_pb::SyncEnums_DeviceType_TYPE_LINUX, device_id, "manufacturer",
- "model", base::Time(), syncer::DeviceInfoUtil::GetPulseInterval(),
+ "model", "full_hardware_class", base::Time(),
+ syncer::DeviceInfoUtil::GetPulseInterval(),
/*send_tab_to_self_receiving_enabled=*/true,
- /*sharing_info=*/base::nullopt, /*fcm_registration_token=*/std::string(),
+ /*sharing_info=*/base::nullopt, /*paask_info=*/base::nullopt,
+ /*fcm_registration_token=*/std::string(),
/*interested_data_types=*/syncer::ModelTypeSet());
}
} // namespace
diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
index 618dd9cd9a7..62366f6beed 100644
--- a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
@@ -34,9 +34,11 @@ std::unique_ptr<DeviceInfo> CreateDevice(const std::string& guid,
return std::make_unique<DeviceInfo>(
guid, name, "chrome_version", "user_agent",
sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id", "manufacturer",
- "model", base::Time(), syncer::DeviceInfoUtil::GetPulseInterval(),
+ "model", "full_hardware_class", base::Time(),
+ syncer::DeviceInfoUtil::GetPulseInterval(),
/*send_tab_to_self_receiving_enabled=*/true,
/*sharing_info=*/base::nullopt,
+ /*passk_info=*/base::nullopt,
/*fcm_registration_token=*/std::string(),
/*interested_data_types=*/syncer::ModelTypeSet());
}
diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
index aa0cb34d1f1..381f172cb4f 100644
--- a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
+++ b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
@@ -103,7 +103,7 @@ SignedInDevicesManager::SignedInDevicesManager(content::BrowserContext* context)
// Register for unload event so we could clear all our listeners when
// extensions have unloaded.
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
}
SignedInDevicesManager::~SignedInDevicesManager() = default;
diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
index 512d83d32fe..b5ec792cf65 100644
--- a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
+++ b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
@@ -11,7 +11,7 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "components/sync_device_info/device_info_tracker.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
@@ -96,8 +96,8 @@ class SignedInDevicesManager : public BrowserContextKeyedAPI,
std::vector<std::unique_ptr<SignedInDevicesChangeObserver>> change_observers_;
// Listen to extension unloaded notification.
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
FRIEND_TEST_ALL_PREFIXES(SignedInDevicesManager, UpdateListener);
diff --git a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
index 8fcf46d776c..cefa7069dac 100644
--- a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
+++ b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/storage/managed_value_store_cache.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -14,7 +15,7 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/one_shot_event.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/api/storage/policy_value_store.h"
#include "chrome/browser/policy/profile_policy_connector.h"
@@ -98,8 +99,8 @@ class ManagedValueStoreCache::ExtensionTracker
Profile* profile_;
policy::PolicyDomain policy_domain_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
policy::SchemaRegistry* schema_registry_;
base::WeakPtrFactory<ExtensionTracker> weak_factory_{this};
@@ -112,7 +113,7 @@ ManagedValueStoreCache::ExtensionTracker::ExtensionTracker(
: profile_(profile),
policy_domain_(policy_domain),
schema_registry_(profile->GetPolicySchemaRegistryService()->registry()) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
// Load schemas when the extension system is ready. It might be ready now.
ExtensionSystem::Get(profile_)->ready().Post(
FROM_HERE, base::BindOnce(&ExtensionTracker::OnExtensionsReady,
@@ -239,7 +240,8 @@ ManagedValueStoreCache::ManagedValueStoreCache(
policy_service_->AddObserver(policy_domain_, this);
- extension_tracker_.reset(new ExtensionTracker(profile_, policy_domain_));
+ extension_tracker_ =
+ std::make_unique<ExtensionTracker>(profile_, policy_domain_);
if (policy_service_->IsInitializationComplete(policy_domain_))
OnPolicyServiceInitialized(policy_domain_);
diff --git a/chromium/chrome/browser/extensions/api/storage/policy_value_store.cc b/chromium/chrome/browser/extensions/api/storage/policy_value_store.cc
index f5c20f6439c..d65064c093c 100644
--- a/chromium/chrome/browser/extensions/api/storage/policy_value_store.cc
+++ b/chromium/chrome/browser/extensions/api/storage/policy_value_store.cc
@@ -75,25 +75,33 @@ void PolicyValueStore::SetCurrentPolicy(const policy::PolicyMap& policy) {
ValueStoreChangeList changes;
- WriteResult result = delegate_->Remove(removed_keys);
- if (result.status().ok()) {
- changes.insert(changes.end(), result.changes().begin(),
- result.changes().end());
+ {
+ WriteResult result = delegate_->Remove(removed_keys);
+ if (result.status().ok()) {
+ auto new_changes = result.PassChanges();
+ changes.insert(changes.end(),
+ std::make_move_iterator(new_changes.begin()),
+ std::make_move_iterator(new_changes.end()));
+ }
}
- // IGNORE_QUOTA because these settings aren't writable by the extension, and
- // are configured by the domain administrator.
- ValueStore::WriteOptions options = ValueStore::IGNORE_QUOTA;
- result = delegate_->Set(options, current_policy);
- if (result.status().ok()) {
- changes.insert(changes.end(), result.changes().begin(),
- result.changes().end());
+ {
+ // IGNORE_QUOTA because these settings aren't writable by the extension, and
+ // are configured by the domain administrator.
+ ValueStore::WriteOptions options = ValueStore::IGNORE_QUOTA;
+ WriteResult result = delegate_->Set(options, current_policy);
+ if (result.status().ok()) {
+ auto new_changes = result.PassChanges();
+ changes.insert(changes.end(),
+ std::make_move_iterator(new_changes.begin()),
+ std::make_move_iterator(new_changes.end()));
+ }
}
if (!changes.empty()) {
observers_->Notify(FROM_HERE, &SettingsObserver::OnSettingsChanged,
extension_id_, settings_namespace::MANAGED,
- ValueStoreChange::ToJson(changes));
+ ValueStoreChange::ToValue(std::move(changes)));
}
}
diff --git a/chromium/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc b/chromium/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
index 8aac4c7f8c9..17faf88c36f 100644
--- a/chromium/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
+#include "base/json/json_writer.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/policy/core/common/external_data_fetcher.h"
@@ -35,12 +36,30 @@ namespace {
const char kTestExtensionId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
const char kDatabaseUMAClientName[] = "Test";
+std::string ValueToJson(const base::Value& changes) {
+ std::string json;
+ bool success = base::JSONWriter::Write(changes, &json);
+ DCHECK(success);
+ return json;
+}
+
+std::string ValueStoreChangeToJson(ValueStoreChangeList changes) {
+ return ValueToJson(ValueStoreChange::ToValue(std::move(changes)));
+}
+
class MockSettingsObserver : public SettingsObserver {
public:
- MOCK_METHOD3(OnSettingsChanged, void(
- const std::string& extension_id,
- settings_namespace::Namespace settings_namespace,
- const std::string& changes_json));
+ MOCK_METHOD3(OnSettingsChangedJSON,
+ void(const std::string& extension_id,
+ settings_namespace::Namespace settings_namespace,
+ const std::string& changes_json));
+
+ void OnSettingsChanged(const std::string& extension_id,
+ settings_namespace::Namespace settings_namespace,
+ const base::Value& changes) override {
+ OnSettingsChangedJSON(extension_id, settings_namespace,
+ ValueToJson(changes));
+ }
};
// Extends PolicyValueStore by overriding the mutating methods, so that the
@@ -100,10 +119,10 @@ class PolicyValueStoreTest : public testing::Test {
ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
observers_ = new SettingsObserverList();
observers_->AddObserver(&observer_);
- store_.reset(new PolicyValueStore(
+ store_ = std::make_unique<PolicyValueStore>(
kTestExtensionId, observers_,
std::make_unique<LeveldbValueStore>(kDatabaseUMAClientName,
- scoped_temp_dir_.GetPath())));
+ scoped_temp_dir_.GetPath()));
}
void TearDown() override {
@@ -176,10 +195,9 @@ TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
{
ValueStoreChangeList changes;
changes.push_back(ValueStoreChange("aaa", base::nullopt, value.Clone()));
- EXPECT_CALL(observer_,
- OnSettingsChanged(kTestExtensionId,
- settings_namespace::MANAGED,
- ValueStoreChange::ToJson(changes)));
+ EXPECT_CALL(observer_, OnSettingsChangedJSON(
+ kTestExtensionId, settings_namespace::MANAGED,
+ ValueStoreChangeToJson(std::move(changes))));
}
policy::PolicyMap policies;
@@ -192,10 +210,9 @@ TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
{
ValueStoreChangeList changes;
changes.push_back(ValueStoreChange("bbb", base::nullopt, value.Clone()));
- EXPECT_CALL(observer_,
- OnSettingsChanged(kTestExtensionId,
- settings_namespace::MANAGED,
- ValueStoreChange::ToJson(changes)));
+ EXPECT_CALL(observer_, OnSettingsChangedJSON(
+ kTestExtensionId, settings_namespace::MANAGED,
+ ValueStoreChangeToJson(std::move(changes))));
}
policies.Set("bbb", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
@@ -209,10 +226,9 @@ TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
ValueStoreChangeList changes;
changes.push_back(
ValueStoreChange("bbb", value.Clone(), new_value.Clone()));
- EXPECT_CALL(observer_,
- OnSettingsChanged(kTestExtensionId,
- settings_namespace::MANAGED,
- ValueStoreChange::ToJson(changes)));
+ EXPECT_CALL(observer_, OnSettingsChangedJSON(
+ kTestExtensionId, settings_namespace::MANAGED,
+ ValueStoreChangeToJson(std::move(changes))));
}
policies.Set("bbb", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
@@ -225,10 +241,9 @@ TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
ValueStoreChangeList changes;
changes.push_back(
ValueStoreChange("bbb", new_value.Clone(), base::nullopt));
- EXPECT_CALL(observer_,
- OnSettingsChanged(kTestExtensionId,
- settings_namespace::MANAGED,
- ValueStoreChange::ToJson(changes)));
+ EXPECT_CALL(observer_, OnSettingsChangedJSON(
+ kTestExtensionId, settings_namespace::MANAGED,
+ ValueStoreChangeToJson(std::move(changes))));
}
policies.Erase("bbb");
@@ -236,7 +251,7 @@ TEST_F(PolicyValueStoreTest, NotifyOnChanges) {
Mock::VerifyAndClearExpectations(&observer_);
// Don't notify when there aren't any changes.
- EXPECT_CALL(observer_, OnSettingsChanged(_, _, _)).Times(0);
+ EXPECT_CALL(observer_, OnSettingsChangedJSON(_, _, _)).Times(0);
SetCurrentPolicy(policies);
Mock::VerifyAndClearExpectations(&observer_);
}
diff --git a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc
index ce7dd47c74b..d2e24e25569 100644
--- a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc
+++ b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/storage/setting_sync_data.h"
+#include <memory>
#include <utility>
#include "base/json/json_reader.h"
@@ -58,7 +59,7 @@ void SettingSyncData::ExtractSyncData(const syncer::SyncData& sync_data) {
if (!value_) {
LOG(WARNING) << "Specifics for " << extension_id_ << "/" << key_
<< " had bad JSON for value: " << extension_specifics.value();
- value_.reset(new base::DictionaryValue());
+ value_ = std::make_unique<base::DictionaryValue>();
}
}
diff --git a/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
index 6eb26b3e3c3..917066f7b33 100644
--- a/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -181,7 +181,7 @@ class ExtensionSettingsSyncTest : public testing::Test {
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- profile_.reset(new TestingProfile(temp_dir_.GetPath()));
+ profile_ = std::make_unique<TestingProfile>(temp_dir_.GetPath());
content::RunAllTasksUntilIdle();
storage_factory_->Reset();
@@ -243,7 +243,7 @@ class ExtensionSettingsSyncTest : public testing::Test {
std::unique_ptr<SettingSyncDataList>& list_for_extension =
as_map[sync_data->extension_id()];
if (!list_for_extension)
- list_for_extension.reset(new SettingSyncDataList());
+ list_for_extension = std::make_unique<SettingSyncDataList>();
list_for_extension->push_back(std::move(sync_data));
}
return as_map;
@@ -852,8 +852,9 @@ TEST_F(ExtensionSettingsSyncTest, FailingStartSyncingDisablesSync) {
// Restarting sync should make bad start syncing again.
sync_processor_->ClearChanges();
GetSyncableService(model_type)->StopSyncing(model_type);
- sync_processor_wrapper_.reset(
- new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
+ sync_processor_wrapper_ =
+ std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
+ sync_processor_.get());
GetSyncableService(model_type)
->MergeDataAndStartSyncing(
model_type, syncer::SyncDataList(),
@@ -1121,8 +1122,9 @@ TEST_F(ExtensionSettingsSyncTest, FailureToReadChangesToPushDisablesSync) {
// to be pushed to sync successfully, as should future changes to bad.
sync_processor_->ClearChanges();
GetSyncableService(model_type)->StopSyncing(model_type);
- sync_processor_wrapper_.reset(
- new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
+ sync_processor_wrapper_ =
+ std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
+ sync_processor_.get());
GetSyncableService(model_type)
->MergeDataAndStartSyncing(
model_type, syncer::SyncDataList(),
@@ -1208,8 +1210,9 @@ TEST_F(ExtensionSettingsSyncTest, FailureToPushLocalStateDisablesSync) {
// Restarting sync makes everything work again.
sync_processor_->ClearChanges();
GetSyncableService(model_type)->StopSyncing(model_type);
- sync_processor_wrapper_.reset(
- new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
+ sync_processor_wrapper_ =
+ std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
+ sync_processor_.get());
GetSyncableService(model_type)
->MergeDataAndStartSyncing(
model_type, syncer::SyncDataList(),
@@ -1298,8 +1301,9 @@ TEST_F(ExtensionSettingsSyncTest, FailureToPushLocalChangeDisablesSync) {
// Restarting sync makes everything work again.
sync_processor_->ClearChanges();
GetSyncableService(model_type)->StopSyncing(model_type);
- sync_processor_wrapper_.reset(
- new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
+ sync_processor_wrapper_ =
+ std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
+ sync_processor_.get());
GetSyncableService(model_type)
->MergeDataAndStartSyncing(
model_type, syncer::SyncDataList(),
diff --git a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
index f45980704da..542cb66c920 100644
--- a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
+++ b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/storage/sync_storage_backend.h"
+#include <memory>
#include <utility>
#include "base/logging.h"
@@ -278,8 +279,8 @@ std::unique_ptr<SettingsSyncProcessor>
SyncStorageBackend::CreateSettingsSyncProcessor(
const std::string& extension_id) const {
CHECK(sync_processor_.get());
- return std::unique_ptr<SettingsSyncProcessor>(new SettingsSyncProcessor(
- extension_id, sync_type_, sync_processor_.get()));
+ return std::make_unique<SettingsSyncProcessor>(extension_id, sync_type_,
+ sync_processor_.get());
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
index c0fdf60e0a1..9c36ba7a64b 100644
--- a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
+++ b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
@@ -198,7 +198,7 @@ SyncableSettingsStorage::SendLocalSettingsToSync(
}
base::Optional<syncer::ModelError> error =
- sync_processor_->SendChanges(changes);
+ sync_processor_->SendChanges(std::move(changes));
if (error.has_value())
StopSyncing();
return error;
@@ -337,7 +337,7 @@ base::Optional<syncer::ModelError> SyncableSettingsStorage::ProcessSyncChanges(
observers_->Notify(FROM_HERE, &SettingsObserver::OnSettingsChanged,
extension_id_, settings_namespace::SYNC,
- ValueStoreChange::ToJson(changes));
+ ValueStoreChange::ToValue(std::move(changes)));
// TODO(kalman): Something sensible with multiple errors.
if (errors.empty())
diff --git a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
index 902cecad20c..cddba703ab0 100644
--- a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
+++ b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
@@ -128,7 +128,7 @@ ExtensionIndicatorIcon::ExtensionIndicatorIcon(
// Get the icon image and tool tip for the status icon. The extension name is
// used as the tool tip.
gfx::ImageSkia icon_skia = manifest_icon_.image().AsImageSkia();
- base::string16 tool_tip = base::UTF8ToUTF16(extension_->name());
+ std::u16string tool_tip = base::UTF8ToUTF16(extension_->name());
status_icon_ = status_tray_->CreateStatusIcon(StatusTray::OTHER_ICON,
icon_skia, tool_tip);
@@ -142,7 +142,7 @@ SystemIndicatorManager::SystemIndicator::~SystemIndicator() = default;
SystemIndicatorManager::SystemIndicatorManager(Profile* profile,
StatusTray* status_tray)
: profile_(profile), status_tray_(status_tray) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
+ extension_registry_observation_.Observe(ExtensionRegistry::Get(profile_));
}
SystemIndicatorManager::~SystemIndicatorManager() {
diff --git a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
index 4055d018928..7a8472ea05c 100644
--- a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
+++ b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
@@ -10,7 +10,7 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "base/threading/thread_checker.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/extension_registry.h"
@@ -85,8 +85,8 @@ class SystemIndicatorManager : public ExtensionRegistryObserver,
SystemIndicatorMap system_indicators_;
base::ThreadChecker thread_checker_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(SystemIndicatorManager);
};
diff --git a/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc b/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
index 991df385605..f4b0496efaf 100644
--- a/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
@@ -25,8 +25,10 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, GetIncognitoModeAvailability) {
PrefService* pref_service = browser()->profile()->GetPrefs();
pref_service->SetInteger(prefs::kIncognitoModeAvailability, 1);
- EXPECT_TRUE(RunComponentExtensionTest(
- "system/get_incognito_mode_availability")) << message_;
+ EXPECT_TRUE(
+ RunExtensionTest({.name = "system/get_incognito_mode_availability",
+ .load_as_component = true}))
+ << message_;
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -68,8 +70,9 @@ IN_PROC_BROWSER_TEST_F(GetUpdateStatusApiTest, Progress) {
fake_update_engine_client_->PushLastStatus(status_updating);
fake_update_engine_client_->PushLastStatus(status_boot_needed);
- ASSERT_TRUE(RunComponentExtensionTest(
- "system/get_update_status")) << message_;
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "system/get_update_status", .load_as_component = true}))
+ << message_;
}
#endif
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/DIR_METADATA b/chromium/chrome/browser/extensions/api/tab_capture/DIR_METADATA
index ce3ee4c96e9..c46eabd56bc 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/tab_capture/DIR_METADATA
@@ -1,3 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
monorail {
- component: "Blink>GetUserMedia>Tab"
+ component: "Internals>Media>SurfaceCapture"
}
+team_email: "media-capture-dev@chromium.org"
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
index 2fa4ff38ebc..d3f726239f3 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc
@@ -173,13 +173,13 @@ void AddMediaStreamSourceConstraints(content::WebContents* target_contents,
if (options->audio && *options->audio) {
if (!options->audio_constraints)
- options->audio_constraints.reset(new MediaStreamConstraint);
+ options->audio_constraints = std::make_unique<MediaStreamConstraint>();
constraints_to_modify[0] = options->audio_constraints.get();
}
if (options->video && *options->video) {
if (!options->video_constraints)
- options->video_constraints.reset(new MediaStreamConstraint);
+ options->video_constraints = std::make_unique<MediaStreamConstraint>();
constraints_to_modify[1] = options->video_constraints.get();
}
@@ -248,7 +248,7 @@ ExtensionFunction::ResponseAction TabCaptureCaptureFunction::Run() {
// extension icon click or our extension is allowlisted.
if (!extension()->permissions_data()->HasAPIPermissionForTab(
sessions::SessionTabHelper::IdForTab(target_contents).id(),
- APIPermission::kTabCaptureForTab) &&
+ mojom::APIPermissionID::kTabCaptureForTab) &&
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kAllowlistedExtensionID) != extension_id &&
!SimpleFeature::IsIdInArray(extension_id, kMediaRouterExtensionIds,
@@ -439,7 +439,7 @@ ExtensionFunction::ResponseAction TabCaptureGetMediaStreamIdFunction::Run() {
// extension icon click or our extension is allowlisted.
if (!extension()->permissions_data()->HasAPIPermissionForTab(
sessions::SessionTabHelper::IdForTab(target_contents).id(),
- APIPermission::kTabCaptureForTab) &&
+ mojom::APIPermissionID::kTabCaptureForTab) &&
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kAllowlistedExtensionID) != extension_id) {
return RespondNow(Error(kGrantError));
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index 0a0e8db1302..87325eb182f 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
+
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/location.h"
@@ -91,7 +93,7 @@ TEST(TabCaptureCaptureOffscreenTabTest, DetermineInitialSize) {
options));
// Use specified mandatory maximum size.
- options.video_constraints.reset(new MediaStreamConstraint());
+ options.video_constraints = std::make_unique<MediaStreamConstraint>();
base::DictionaryValue* properties =
&options.video_constraints->mandatory.additional_properties;
properties->SetInteger("maxWidth", 123);
@@ -102,7 +104,7 @@ TEST(TabCaptureCaptureOffscreenTabTest, DetermineInitialSize) {
// Use default size if larger than mandatory minimum size. Else, use
// mandatory minimum size.
- options.video_constraints.reset(new MediaStreamConstraint());
+ options.video_constraints = std::make_unique<MediaStreamConstraint>();
properties = &options.video_constraints->mandatory.additional_properties;
properties->SetInteger("minWidth", 123);
properties->SetInteger("minHeight", 456);
@@ -116,9 +118,9 @@ TEST(TabCaptureCaptureOffscreenTabTest, DetermineInitialSize) {
options));
// Use specified optional maximum size, if no mandatory size was specified.
- options.video_constraints.reset(new MediaStreamConstraint());
- options.video_constraints->optional.reset(
- new MediaStreamConstraint::Optional());
+ options.video_constraints = std::make_unique<MediaStreamConstraint>();
+ options.video_constraints->optional =
+ std::make_unique<MediaStreamConstraint::Optional>();
properties = &options.video_constraints->optional->additional_properties;
properties->SetInteger("maxWidth", 456);
properties->SetInteger("maxHeight", 123);
@@ -136,9 +138,9 @@ TEST(TabCaptureCaptureOffscreenTabTest, DetermineInitialSize) {
// Use default size if larger than optional minimum size. Else, use optional
// minimum size.
- options.video_constraints.reset(new MediaStreamConstraint());
- options.video_constraints->optional.reset(
- new MediaStreamConstraint::Optional());
+ options.video_constraints = std::make_unique<MediaStreamConstraint>();
+ options.video_constraints->optional =
+ std::make_unique<MediaStreamConstraint::Optional>();
properties = &options.video_constraints->optional->additional_properties;
properties->SetInteger("minWidth", 9999);
properties->SetInteger("minHeight", 8888);
@@ -357,8 +359,10 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GrantForChromePages) {
// Tests that a tab in incognito mode can be captured.
IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, CaptureInSplitIncognitoMode) {
AddExtensionToCommandLineAllowlist();
- ASSERT_TRUE(RunExtensionSubtest("tab_capture", "start_tab_capture.html",
- kFlagEnableIncognito, kFlagUseIncognito))
+ ASSERT_TRUE(RunExtensionTest({.name = "tab_capture",
+ .page_url = "start_tab_capture.html",
+ .open_in_incognito = true},
+ {.allow_in_incognito = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
index 9bcecd34e1b..7ee2e9d5769 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
@@ -279,7 +279,15 @@ class TabCapturePerformanceTest : public TabCapturePerformanceTestBase,
} // namespace
-IN_PROC_BROWSER_TEST_P(TabCapturePerformanceTest, Performance) {
+// Failing on Linux/Mac: https://crbug.com/1182662
+// Using MSAN on ChromeOS causes problems due to its hardware OpenGL library.
+#if defined(OS_LINUX) || defined(OS_MAC) || \
+ (BUILDFLAG(IS_CHROMEOS_ASH) && defined(MEMORY_SANITIZER))
+#define MAYBE_Performance DISABLED_Performance
+#else
+#define MAYBE_Performance Performance
+#endif
+IN_PROC_BROWSER_TEST_P(TabCapturePerformanceTest, MAYBE_Performance) {
if (!is_full_performance_run()) {
// TODO(crbug.com/1042457): Flaky failures across multiple CQ builders.
return;
@@ -337,14 +345,11 @@ IN_PROC_BROWSER_TEST_P(TabCapturePerformanceTest, Performance) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
-// On ChromeOS, software compositing is not an option, and using MSAN on
-// ChromeOS causes problems due to its hardware OpenGL library.
-#if !defined(MEMORY_SANITIZER)
+// On ChromeOS, software compositing is not an option.
INSTANTIATE_TEST_SUITE_P(All,
TabCapturePerformanceTest,
testing::Values(kUseGpu,
kTestThroughWebRTC | kUseGpu));
-#endif
#else
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
index ce3fe53c6c6..50e30be0d95 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
@@ -122,7 +122,8 @@ class TabCaptureRegistry::LiveRequest : public content::WebContentsObserver {
TabCaptureRegistry::TabCaptureRegistry(content::BrowserContext* context)
: browser_context_(context) {
MediaCaptureDevicesDispatcher::GetInstance()->AddObserver(this);
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
+ extension_registry_observation_.Observe(
+ ExtensionRegistry::Get(browser_context_));
}
TabCaptureRegistry::~TabCaptureRegistry() {
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
index 586d8949b21..4129f5c2d49 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
@@ -10,7 +10,7 @@
#include <vector>
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
#include "chrome/common/extensions/api/tab_capture.h"
#include "content/public/browser/desktop_media_id.h"
@@ -116,8 +116,8 @@ class TabCaptureRegistry : public BrowserContextKeyedAPI,
content::BrowserContext* const browser_context_;
std::vector<std::unique_ptr<LiveRequest>> requests_;
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
- extension_registry_observer_{this};
+ base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
+ extension_registry_observation_{this};
DISALLOW_COPY_AND_ASSIGN(TabCaptureRegistry);
};
diff --git a/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc b/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
index a1079a10ec9..75e8b42ef68 100644
--- a/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
+++ b/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
@@ -5,11 +5,11 @@
#include "chrome/browser/extensions/api/tab_groups/tab_groups_api.h"
#include <memory>
+#include <string>
#include <utility>
#include <vector>
#include "base/strings/pattern.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/tab_groups/tab_groups_constants.h"
#include "chrome/browser/extensions/api/tab_groups/tab_groups_util.h"
@@ -183,7 +183,7 @@ ExtensionFunction::ResponseAction TabGroupsUpdateFunction::Run() {
if (params->update_properties.color != api::tab_groups::COLOR_NONE)
color = tab_groups_util::ColorToColorId(params->update_properties.color);
- base::string16 title = visual_data->title();
+ std::u16string title = visual_data->title();
if (params->update_properties.title.get())
title = base::UTF8ToUTF16(*params->update_properties.title);
diff --git a/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc b/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
index 4934de996d4..6e46fec82a1 100644
--- a/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
@@ -10,7 +10,6 @@
#include <vector>
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/tab_groups/tab_groups_constants.h"
@@ -174,18 +173,15 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsQueryTitle) {
const tab_groups::TabGroupColorId color = tab_groups::TabGroupColorId::kGrey;
tab_groups::TabGroupId group1 = tab_strip_model->AddToNewGroup({0});
- tab_groups::TabGroupVisualData visual_data1(
- base::ASCIIToUTF16("Sample title"), color);
+ tab_groups::TabGroupVisualData visual_data1(u"Sample title", color);
tab_group_model->GetTabGroup(group1)->SetVisualData(visual_data1);
tab_groups::TabGroupId group2 = tab_strip_model->AddToNewGroup({1});
- tab_groups::TabGroupVisualData visual_data2(
- base::ASCIIToUTF16("Sample title suffixed"), color);
+ tab_groups::TabGroupVisualData visual_data2(u"Sample title suffixed", color);
tab_group_model->GetTabGroup(group2)->SetVisualData(visual_data2);
tab_groups::TabGroupId group3 = tab_strip_model->AddToNewGroup({2});
- tab_groups::TabGroupVisualData visual_data3(
- base::ASCIIToUTF16("Prefixed Sample title"), color);
+ tab_groups::TabGroupVisualData visual_data3(u"Prefixed Sample title", color);
tab_group_model->GetTabGroup(group3)->SetVisualData(visual_data3);
// Query by title and verify results.
@@ -212,17 +208,17 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsQueryColor) {
// Create 3 groups with different colors.
tab_groups::TabGroupId group1 = tab_strip_model->AddToNewGroup({0});
tab_groups::TabGroupVisualData visual_data1(
- base::string16(), tab_groups::TabGroupColorId::kGrey);
+ std::u16string(), tab_groups::TabGroupColorId::kGrey);
tab_group_model->GetTabGroup(group1)->SetVisualData(visual_data1);
tab_groups::TabGroupId group2 = tab_strip_model->AddToNewGroup({1});
tab_groups::TabGroupVisualData visual_data2(
- base::string16(), tab_groups::TabGroupColorId::kRed);
+ std::u16string(), tab_groups::TabGroupColorId::kRed);
tab_group_model->GetTabGroup(group2)->SetVisualData(visual_data2);
tab_groups::TabGroupId group3 = tab_strip_model->AddToNewGroup({2});
tab_groups::TabGroupVisualData visual_data3(
- base::string16(), tab_groups::TabGroupColorId::kBlue);
+ std::u16string(), tab_groups::TabGroupColorId::kBlue);
tab_group_model->GetTabGroup(group3)->SetVisualData(visual_data3);
// Query by color and verify results.
@@ -249,7 +245,7 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsGetSuccess) {
// Create a group.
tab_groups::TabGroupId group = tab_strip_model->AddToNewGroup({0, 1, 2});
tab_groups::TabGroupVisualData visual_data(
- base::ASCIIToUTF16("Title"), tab_groups::TabGroupColorId::kBlue);
+ u"Title", tab_groups::TabGroupColorId::kBlue);
tab_group_model->GetTabGroup(group)->SetVisualData(visual_data);
int group_id = tab_groups_util::GetGroupId(group);
@@ -292,7 +288,7 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsUpdateSuccess) {
// Create a group.
tab_groups::TabGroupId group = tab_strip_model->AddToNewGroup({0, 1, 2});
tab_groups::TabGroupVisualData visual_data(
- base::ASCIIToUTF16("Initial title"), tab_groups::TabGroupColorId::kBlue);
+ u"Initial title", tab_groups::TabGroupColorId::kBlue);
tab_group_model->GetTabGroup(group)->SetVisualData(visual_data);
int group_id = tab_groups_util::GetGroupId(group);
@@ -308,7 +304,7 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsUpdateSuccess) {
// Verify the new group metadata.
const tab_groups::TabGroupVisualData* new_visual_data =
tab_group_model->GetTabGroup(group)->visual_data();
- EXPECT_EQ(new_visual_data->title(), base::ASCIIToUTF16("New title"));
+ EXPECT_EQ(new_visual_data->title(), u"New title");
EXPECT_EQ(new_visual_data->color(), tab_groups::TabGroupColorId::kRed);
}
@@ -509,7 +505,7 @@ TEST_F(TabGroupsApiUnitTest, TabGroupsOnUpdated) {
TestEventRouterObserver event_observer(EventRouter::Get(browser_context()));
- tab_groups::TabGroupVisualData visual_data(base::ASCIIToUTF16("Title"),
+ tab_groups::TabGroupVisualData visual_data(u"Title",
tab_groups::TabGroupColorId::kRed);
tab_strip_model->group_model()->GetTabGroup(group)->SetVisualData(
visual_data);
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
index ddd17b8f91f..f42d13754d0 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -8,6 +8,7 @@
#include <algorithm>
#include <limits>
#include <memory>
+#include <string>
#include <utility>
#include <vector>
@@ -23,10 +24,10 @@
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/pattern.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/task/thread_pool.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/tab_groups/tab_groups_constants.h"
@@ -92,10 +93,10 @@
#include "extensions/common/constants.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
-#include "extensions/common/host_id.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/default_locale_handler.h"
#include "extensions/common/message_bundle.h"
+#include "extensions/common/mojom/host_id.mojom.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/common/user_script.h"
#include "net/base/escape.h"
@@ -275,7 +276,7 @@ bool IsValidStateForWindowsCreateFunction(
bool ExtensionHasLockedFullscreenPermission(const Extension* extension) {
return extension->permissions_data()->HasAPIPermission(
- APIPermission::kLockWindowFullscreenPrivate);
+ mojom::APIPermissionID::kLockWindowFullscreenPrivate);
}
std::unique_ptr<api::tabs::Tab> CreateTabObjectHelper(
@@ -1124,7 +1125,7 @@ ExtensionFunction::ResponseAction TabsQueryFunction::Run() {
// not matched.
if (!extension_->permissions_data()->HasAPIPermissionForTab(
ExtensionTabUtil::GetTabId(web_contents),
- APIPermission::kTab) &&
+ mojom::APIPermissionID::kTab) &&
!extension_->permissions_data()->HasHostPermission(
web_contents->GetURL())) {
continue;
@@ -1953,13 +1954,18 @@ TabsCaptureVisibleTabFunction::TabsCaptureVisibleTabFunction()
: chrome_details_(this) {
}
-bool TabsCaptureVisibleTabFunction::IsScreenshotEnabled(
+WebContentsCaptureClient::ScreenshotAccess
+TabsCaptureVisibleTabFunction::GetScreenshotAccess(
content::WebContents* web_contents) const {
- PrefService* service = chrome_details_.GetProfile()->GetPrefs();
- if (service->GetBoolean(prefs::kDisableScreenshots)) {
- return false;
- }
- return !tabs_util::IsScreenshotRestricted(web_contents);
+ PrefService* service =
+ Profile::FromBrowserContext(browser_context())->GetPrefs();
+ if (service->GetBoolean(prefs::kDisableScreenshots))
+ return ScreenshotAccess::kDisabledByPreferences;
+
+ if (tabs_util::IsScreenshotRestricted(web_contents))
+ return ScreenshotAccess::kDisabledByDlp;
+
+ return ScreenshotAccess::kEnabled;
}
bool TabsCaptureVisibleTabFunction::ClientAllowsTransparency() {
@@ -2027,8 +2033,27 @@ ExtensionFunction::ResponseAction TabsCaptureVisibleTabFunction::Run() {
}
void TabsCaptureVisibleTabFunction::OnCaptureSuccess(const SkBitmap& bitmap) {
+ base::ThreadPool::PostTask(
+ FROM_HERE, {base::TaskPriority::USER_VISIBLE},
+ base::BindOnce(&TabsCaptureVisibleTabFunction::EncodeBitmapOnWorkerThread,
+ this, base::ThreadTaskRunnerHandle::Get(), bitmap));
+}
+
+void TabsCaptureVisibleTabFunction::EncodeBitmapOnWorkerThread(
+ scoped_refptr<base::TaskRunner> reply_task_runner,
+ const SkBitmap& bitmap) {
std::string base64_result;
- if (!EncodeBitmap(bitmap, &base64_result)) {
+ bool success = EncodeBitmap(bitmap, &base64_result);
+ reply_task_runner->PostTask(
+ FROM_HERE,
+ base::BindOnce(&TabsCaptureVisibleTabFunction::OnBitmapEncodedOnUIThread,
+ this, success, std::move(base64_result)));
+}
+
+void TabsCaptureVisibleTabFunction::OnBitmapEncodedOnUIThread(
+ bool success,
+ std::string base64_result) {
+ if (!success) {
OnCaptureFailure(FAILURE_REASON_ENCODING_FAILED);
return;
}
@@ -2056,6 +2081,8 @@ std::string TabsCaptureVisibleTabFunction::CaptureResultToErrorMessage(
break;
case FAILURE_REASON_SCREEN_SHOTS_DISABLED:
return tabs_constants::kScreenshotsDisabled;
+ case FAILURE_REASON_SCREEN_SHOTS_DISABLED_BY_DLP:
+ return tabs_constants::kScreenshotsDisabledByDlp;
case OK:
NOTREACHED() << "CaptureResultToErrorMessage should not be called"
" with a successful result";
@@ -2211,7 +2238,8 @@ ExecuteCodeFunction::InitResult ExecuteCodeInTabFunction::Init() {
execute_tab_id_ = tab_id;
details_ = std::move(details);
- set_host_id(HostID(HostID::EXTENSIONS, extension()->id()));
+ set_host_id(
+ mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()));
return set_init_result(SUCCESS);
}
@@ -2270,7 +2298,7 @@ bool ExecuteCodeInTabFunction::CanExecuteScriptOnPage(std::string* error) {
execute_tab_id_, error)) {
if (is_about_url &&
extension()->permissions_data()->active_permissions().HasAPIPermission(
- APIPermission::kTab)) {
+ mojom::APIPermissionID::kTab)) {
*error = ErrorUtils::FormatErrorMessage(
manifest_errors::kCannotAccessAboutUrl,
rfh->GetLastCommittedURL().spec(),
@@ -2434,9 +2462,8 @@ ExtensionFunction::ResponseAction TabsGetZoomSettingsFunction::Run() {
ZoomController::ZoomMode zoom_mode = zoom_controller->zoom_mode();
api::tabs::ZoomSettings zoom_settings;
ZoomModeToZoomSettings(zoom_mode, &zoom_settings);
- zoom_settings.default_zoom_factor.reset(
- new double(blink::PageZoomLevelToZoomFactor(
- zoom_controller->GetDefaultZoomLevel())));
+ zoom_settings.default_zoom_factor = std::make_unique<double>(
+ blink::PageZoomLevelToZoomFactor(zoom_controller->GetDefaultZoomLevel()));
return RespondNow(
ArgumentList(api::tabs::GetZoomSettings::Results::Create(zoom_settings)));
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.h b/chromium/chrome/browser/extensions/api/tabs/tabs_api.h
index 4cae5ca5768..72b5b75ab2d 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.h
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/compiler_specific.h"
+#include "base/memory/scoped_refptr.h"
#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/common/extensions/api/tabs.h"
#include "components/translate/core/browser/translate_driver.h"
@@ -24,6 +25,11 @@
class GURL;
class SkBitmap;
class TabStripModel;
+
+namespace base {
+class TaskRunner;
+}
+
namespace content {
class WebContents;
}
@@ -246,11 +252,17 @@ class TabsCaptureVisibleTabFunction
content::WebContents* GetWebContentsForID(int window_id, std::string* error);
// extensions::WebContentsCaptureClient:
- bool IsScreenshotEnabled(content::WebContents* web_contents) const override;
+ ScreenshotAccess GetScreenshotAccess(
+ content::WebContents* web_contents) const override;
bool ClientAllowsTransparency() override;
void OnCaptureSuccess(const SkBitmap& bitmap) override;
void OnCaptureFailure(CaptureResult result) override;
+ void EncodeBitmapOnWorkerThread(
+ scoped_refptr<base::TaskRunner> reply_task_runner,
+ const SkBitmap& bitmap);
+ void OnBitmapEncodedOnUIThread(bool success, std::string base64_result);
+
private:
DECLARE_EXTENSION_FUNCTION("tabs.captureVisibleTab", TABS_CAPTUREVISIBLETAB)
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
index bb33332d802..bc644c42d10 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/tabs/tabs_api.h"
+#include <memory>
+
#include "base/containers/contains.h"
#include "base/optional.h"
#include "base/run_loop.h"
@@ -21,6 +23,7 @@
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/pref_names.h"
#include "chrome/test/base/test_browser_window.h"
#include "components/sessions/content/session_tab_helper.h"
#include "components/tab_groups/tab_group_id.h"
@@ -116,7 +119,7 @@ void TabsApiUnitTest::SetUp() {
ExtensionServiceTestBase::SetUp();
InitializeEmptyExtensionService();
- browser_window_.reset(new TestBrowserWindow());
+ browser_window_ = std::make_unique<TestBrowserWindow>();
Browser::CreateParams params(profile(), true);
params.type = Browser::TYPE_NORMAL;
params.window = browser_window_.get();
@@ -1196,6 +1199,39 @@ TEST_F(TabsApiUnitTest, ScreenshotsRestricted) {
// Run the function and check result.
std::string error = extension_function_test_utils::RunFunctionAndReturnError(
function.get(), "[{}]", browser(), api_test_utils::NONE);
+ EXPECT_EQ(tabs_constants::kScreenshotsDisabledByDlp, error);
+
+ // Clean up.
+ browser()->tab_strip_model()->CloseAllTabs();
+}
+
+// Screenshot should return an error when disabled in user profile preferences.
+TEST_F(TabsApiUnitTest, ScreenshotDisabledInProfilePreferences) {
+ // Setup the function and extension.
+ scoped_refptr<const Extension> extension = ExtensionBuilder("Screenshot")
+ .AddPermission("tabs")
+ .AddPermission("<all_urls>")
+ .Build();
+ auto function = base::MakeRefCounted<TabsCaptureVisibleTabFunction>();
+ function->set_extension(extension.get());
+
+ // Add a visible tab.
+ std::unique_ptr<content::WebContents> web_contents =
+ content::WebContentsTester::CreateTestWebContents(profile(), nullptr);
+ content::WebContentsTester* web_contents_tester =
+ content::WebContentsTester::For(web_contents.get());
+ const GURL kGoogle("http://www.google.com");
+ web_contents_tester->NavigateAndCommit(kGoogle);
+ browser()->tab_strip_model()->AppendWebContents(std::move(web_contents),
+ /*foreground=*/true);
+
+ // Disable screenshot.
+ browser()->profile()->GetPrefs()->SetBoolean(prefs::kDisableScreenshots,
+ true);
+
+ // Run the function and check result.
+ std::string error = extension_function_test_utils::RunFunctionAndReturnError(
+ function.get(), "[{}]", browser(), api_test_utils::NONE);
EXPECT_EQ(tabs_constants::kScreenshotsDisabled, error);
// Clean up.
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc
index e438ed25f0a..0e1640ae85a 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc
@@ -107,6 +107,9 @@ const char kSupportedInWindowsOnlyError[] = "Supported in Windows only";
const char kInvalidWindowTypeError[] = "Invalid value for type";
const char kInvalidWindowStateError[] = "Invalid value for state";
const char kScreenshotsDisabled[] = "Taking screenshots has been disabled";
+const char kScreenshotsDisabledByDlp[] =
+ "Administrator policy disables screen capture when confidential content is "
+ "visible";
const char kCannotUpdateMuteCaptured[] =
"Cannot update mute state for tab *, tab has audio or video currently "
"being captured";
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h
index 3e257f524d8..2be27625a23 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h
@@ -103,6 +103,7 @@ extern const char kSupportedInWindowsOnlyError[];
extern const char kInvalidWindowTypeError[];
extern const char kInvalidWindowStateError[];
extern const char kScreenshotsDisabled[];
+extern const char kScreenshotsDisabledByDlp[];
extern const char kCannotUpdateMuteCaptured[];
extern const char kCannotDetermineLanguageOfUnloadedTab[];
extern const char kMissingLockWindowFullscreenPrivatePermission[];
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc
index c0f7e7897d3..4a50c3222d0 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc
@@ -169,7 +169,7 @@ TabsEventRouter::TabsEventRouter(Profile* profile)
BrowserList::AddObserver(this);
browser_tab_strip_tracker_.Init();
- tab_manager_scoped_observer_.Add(g_browser_process->GetTabManager());
+ tab_manager_scoped_observation_.Observe(g_browser_process->GetTabManager());
}
TabsEventRouter::~TabsEventRouter() {
@@ -619,7 +619,7 @@ void TabsEventRouter::DispatchTabUpdatedEvent(
}
void TabsEventRouter::RegisterForTabNotifications(WebContents* contents) {
- favicon_scoped_observer_.Add(
+ favicon_scoped_observations_.AddObservation(
favicon::ContentFaviconDriver::FromWebContents(contents));
ZoomController::FromWebContents(contents)->AddObserver(this);
@@ -630,7 +630,7 @@ void TabsEventRouter::RegisterForTabNotifications(WebContents* contents) {
}
void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) {
- favicon_scoped_observer_.Remove(
+ favicon_scoped_observations_.RemoveObservation(
favicon::ContentFaviconDriver::FromWebContents(contents));
ZoomController::FromWebContents(contents)->RemoveObserver(this);
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.h b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.h
index c6c6e7777e3..c8a795b0bb5 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.h
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.h
@@ -10,7 +10,8 @@
#include <string>
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_multi_source_observation.h"
+#include "base/scoped_observation.h"
#include "chrome/browser/extensions/api/tabs/tabs_api.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_observer.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
@@ -204,14 +205,15 @@ class TabsEventRouter : public TabStripModelObserver,
// The main profile that owns this event router.
Profile* profile_;
- ScopedObserver<favicon::FaviconDriver, favicon::FaviconDriverObserver>
- favicon_scoped_observer_{this};
+ base::ScopedMultiSourceObservation<favicon::FaviconDriver,
+ favicon::FaviconDriverObserver>
+ favicon_scoped_observations_{this};
BrowserTabStripTracker browser_tab_strip_tracker_;
- ScopedObserver<resource_coordinator::TabManager,
- resource_coordinator::TabLifecycleObserver>
- tab_manager_scoped_observer_{this};
+ base::ScopedObservation<resource_coordinator::TabManager,
+ resource_coordinator::TabLifecycleObserver>
+ tab_manager_scoped_observation_{this};
DISALLOW_COPY_AND_ASSIGN(TabsEventRouter);
};
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
index 4d817eacf17..0ee5c90278f 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
@@ -158,6 +158,22 @@ IN_PROC_BROWSER_TEST_P(NonPersistentExtensionTabsTest, MAYBE_TabCurrentWindow) {
<< message_;
}
+// Crashes on Lacros and Linux-ozone-rel. http://crbug.com/1196709
+#if BUILDFLAG(IS_CHROMEOS_LACROS) || defined(USE_OZONE)
+#define MAYBE_TabGetLastFocusedWindow DISABLED_TabGetLastFocusedWindow
+#else
+#define MAYBE_TabGetLastFocusedWindow TabGetLastFocusedWindow
+#endif
+
+// Tests chrome.windows.getLastFocused.
+IN_PROC_BROWSER_TEST_P(NonPersistentExtensionTabsTest,
+ MAYBE_TabGetLastFocusedWindow) {
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "tabs/last_focused_window"},
+ {.load_as_service_worker = GetParam() == ContextType::kServiceWorker}))
+ << message_;
+}
+
INSTANTIATE_TEST_SUITE_P(EventPage,
NonPersistentExtensionTabsTest,
::testing::Values(ContextType::kEventPage));
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
index 7c589f6eb89..5230b81ab5f 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
@@ -8,9 +8,9 @@
#include "ash/public/cpp/assistant/assistant_state.h"
#include "base/metrics/histogram_macros.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/ash/assistant/assistant_util.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_content_manager.h"
#include "chrome/browser/ui/ash/chrome_capture_mode_delegate.h"
#include "chrome/browser/ui/ash/chrome_screenshot_grabber.h"
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_windows_api.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_windows_api.cc
index 18b784de8e5..8968abaa76d 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_windows_api.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_windows_api.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/api/tabs/tabs_windows_api.h"
+#include <memory>
+
#include "base/lazy_instance.h"
#include "chrome/browser/extensions/api/tabs/tabs_event_router.h"
#include "chrome/browser/extensions/api/tabs/windows_event_router.h"
@@ -56,9 +58,10 @@ TabsWindowsAPI* TabsWindowsAPI::Get(content::BrowserContext* context) {
}
TabsEventRouter* TabsWindowsAPI::tabs_event_router() {
- if (!tabs_event_router_.get())
- tabs_event_router_.reset(
- new TabsEventRouter(Profile::FromBrowserContext(browser_context_)));
+ if (!tabs_event_router_.get()) {
+ tabs_event_router_ = std::make_unique<TabsEventRouter>(
+ Profile::FromBrowserContext(browser_context_));
+ }
return tabs_event_router_.get();
}
diff --git a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc
index 734cefc15a8..bcba098078c 100644
--- a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc
@@ -150,8 +150,8 @@ WindowsEventRouter::WindowsEventRouter(Profile* profile)
focused_window_id_(extension_misc::kUnknownWindowId) {
DCHECK(!profile->IsOffTheRecord());
- observed_app_registry_.Add(AppWindowRegistry::Get(profile_));
- observed_controller_list_.Add(WindowControllerList::GetInstance());
+ observed_app_registry_.Observe(AppWindowRegistry::Get(profile_));
+ observed_controller_list_.Observe(WindowControllerList::GetInstance());
// Needed for when no suitable window can be passed to an extension as the
// currently focused window. On Mac (even in a toolkit-views build) always
// rely on the notification sent by AppControllerMac after AppKit sends
diff --git a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.h b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.h
index 3a34d613aa4..427a0ea1e88 100644
--- a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.h
+++ b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.h
@@ -10,7 +10,7 @@
#include <string>
#include "base/macros.h"
-#include "base/scoped_observer.h"
+#include "base/scoped_observation.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/window_controller_list.h"
#include "chrome/browser/extensions/window_controller_list_observer.h"
@@ -97,11 +97,11 @@ class WindowsEventRouter : public AppWindowRegistry::Observer,
AppWindowMap app_windows_;
// Observed AppWindowRegistry.
- ScopedObserver<AppWindowRegistry, AppWindowRegistry::Observer>
+ base::ScopedObservation<AppWindowRegistry, AppWindowRegistry::Observer>
observed_app_registry_{this};
// Observed WindowControllerList.
- ScopedObserver<WindowControllerList, WindowControllerListObserver>
+ base::ScopedObservation<WindowControllerList, WindowControllerListObserver>
observed_controller_list_{this};
DISALLOW_COPY_AND_ASSIGN(WindowsEventRouter);
diff --git a/chromium/chrome/browser/extensions/api/terminal/OWNERS b/chromium/chrome/browser/extensions/api/terminal/OWNERS
index 4a587edf74f..4afab4189fa 100644
--- a/chromium/chrome/browser/extensions/api/terminal/OWNERS
+++ b/chromium/chrome/browser/extensions/api/terminal/OWNERS
@@ -1,3 +1,3 @@
joelhockey@chromium.org
-juwa@google.com
+lxj@google.com
vapier@chromium.org
diff --git a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
index b225d23f01a..b740d3ba969 100644
--- a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
@@ -13,6 +13,7 @@
#include "base/strings/stringprintf.h"
#include "base/system/sys_info.h"
#include "base/time/time.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/util/version_loader.h"
#include "components/version_info/version_info.h"
@@ -53,6 +54,8 @@ CrostiniStartupStatus::~CrostiniStartupStatus() = default;
void CrostiniStartupStatus::OnCrostiniRestarted(
crostini::CrostiniResult result) {
+ crostini::RecordAppLaunchResultHistogram(
+ crostini::CrostiniAppLaunchAppType::kTerminal, result);
if (result != crostini::CrostiniResult::SUCCESS) {
PrintAfterStage(
kColor1RedBright,
@@ -86,10 +89,7 @@ void CrostiniStartupStatus::ShowProgressAtInterval() {
}
void CrostiniStartupStatus::OnStageStarted(InstallerState stage) {
- stage_ = stage;
- if (stage_index_ < kMaxStage) {
- ++stage_index_;
- }
+ stage_index_ = static_cast<int>(stage) + 1;
if (!verbose_) {
return;
}
diff --git a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.h b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.h
index 9191f235010..d7125db125d 100644
--- a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.h
+++ b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.h
@@ -49,8 +49,6 @@ class CrostiniStartupStatus
int spinner_index_ = 0;
int stage_index_ = 0;
int end_of_line_index_ = 0;
- crostini::mojom::InstallerState stage_ =
- crostini::mojom::InstallerState::kStart;
base::WeakPtrFactory<CrostiniStartupStatus> weak_factory_{this};
};
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
index cebbbfe3e3e..9d116ce8ded 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
@@ -49,12 +49,12 @@ IN_PROC_BROWSER_TEST_F(TerminalPrivateBrowserTest, OpenTerminalProcessChecks) {
crostini_features.set_is_allowed_now(false);
ExpectJsResult(script, "vmshell not allowed");
- // 'Error starting crostini for terminal: 22' when crostini is allowed.
+ // 'Error starting crostini for terminal: 20' when crostini is allowed.
// This is the specific error we expect to see in a test environment
- // (LOAD_COMPONENT_FAILED), but the point of the test is to see that we get
+ // (SSHFS_MOUNT_ERROR), but the point of the test is to see that we get
// past the vmshell allowed checks.
crostini_features.set_is_allowed_now(true);
- ExpectJsResult(script, "Waiting for component update dialog response");
+ ExpectJsResult(script, "Error starting crostini for terminal: 20");
// openTerminalProcess not defined.
ExpectJsResult("typeof chrome.terminalPrivate.openTerminalProcess",
diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 5b825466cff..57717822876 100644
--- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -19,9 +19,8 @@
#include "base/metrics/field_trial_params.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ash/login/lock/screen_locker.h"
-#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
+#include "chrome/browser/ash/login/ui/user_adding_screen.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
@@ -209,7 +208,7 @@ bool ChromeVirtualKeyboardDelegate::HideKeyboard() {
return true;
}
-bool ChromeVirtualKeyboardDelegate::InsertText(const base::string16& text) {
+bool ChromeVirtualKeyboardDelegate::InsertText(const std::u16string& text) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
ui::TextInputClient* tic = GetFocusedTextInputClient();
if (!tic || tic->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
@@ -269,13 +268,9 @@ bool ChromeVirtualKeyboardDelegate::ShowLanguageSettings() {
base::RecordAction(
base::UserMetricsAction("VirtualKeyboard.OpenLanguageSettings"));
- const std::string path =
- base::FeatureList::IsEnabled(
- ::chromeos::features::kLanguageSettingsUpdate)
- ? chromeos::settings::mojom::kInputSubpagePath
- : chromeos::settings::mojom::kLanguagesAndInputDetailsSubpagePath;
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
- ProfileManager::GetActiveUserProfile(), path);
+ ProfileManager::GetActiveUserProfile(),
+ chromeos::settings::mojom::kInputSubpagePath);
return true;
}
@@ -562,10 +557,6 @@ void ChromeVirtualKeyboardDelegate::OnHasInputDevices(
GenerateFeatureFlag("systemlatinphysicaltyping",
base::FeatureList::IsEnabled(
chromeos::features::kSystemLatinPhysicalTyping)));
- features->AppendString(
- GenerateFeatureFlag("languagesettingsupdate",
- base::FeatureList::IsEnabled(
- chromeos::features::kLanguageSettingsUpdate)));
features->AppendString(GenerateFeatureFlag(
"multilingualtyping",
base::FeatureList::IsEnabled(chromeos::features::kMultilingualTyping)));
diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
index 5ab0e8fecdb..ebc19270f15 100644
--- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
+++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
@@ -36,7 +36,7 @@ class ChromeVirtualKeyboardDelegate
OnKeyboardSettingsCallback on_settings_callback) override;
void OnKeyboardConfigChanged() override;
bool HideKeyboard() override;
- bool InsertText(const base::string16& text) override;
+ bool InsertText(const std::u16string& text) override;
bool OnKeyboardLoaded() override;
void SetHotrodKeyboard(bool enable) override;
bool LockKeyboard(bool state) override;
diff --git a/chromium/chrome/browser/extensions/api/vpn_provider/DIR_METADATA b/chromium/chrome/browser/extensions/api/vpn_provider/DIR_METADATA
index 3ecb4771a12..4adfe8d26ea 100644
--- a/chromium/chrome/browser/extensions/api/vpn_provider/DIR_METADATA
+++ b/chromium/chrome/browser/extensions/api/vpn_provider/DIR_METADATA
@@ -1,3 +1,6 @@
+buganizer: {
+ component_id: 156085
+}
monorail {
- component: "Enterprise"
+ component: "OS>Systems>Network"
}
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
index 6c60478a0e2..16df23ec517 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
@@ -29,19 +29,13 @@ const char* const kValidSchemes[] = {
} // namespace
-FrameNavigationState::FrameState::FrameState() {
- error_occurred = false;
- is_loading = false;
- is_parsing = false;
-}
-
// static
bool FrameNavigationState::allow_extension_scheme_ = false;
-FrameNavigationState::FrameNavigationState() {
-}
+RENDER_DOCUMENT_HOST_USER_DATA_KEY_IMPL(FrameNavigationState)
-FrameNavigationState::~FrameNavigationState() {}
+FrameNavigationState::FrameNavigationState(content::RenderFrameHost*) {}
+FrameNavigationState::~FrameNavigationState() = default;
// static
bool FrameNavigationState::IsValidUrl(const GURL& url) {
@@ -55,102 +49,47 @@ bool FrameNavigationState::IsValidUrl(const GURL& url) {
return allow_extension_scheme_ && url.scheme() == kExtensionScheme;
}
-bool FrameNavigationState::CanSendEvents(
- content::RenderFrameHost* frame_host) const {
- auto it = frame_host_state_map_.find(frame_host);
- if (it == frame_host_state_map_.end() || it->second.error_occurred) {
- return false;
- }
- return IsValidUrl(it->second.url);
+bool FrameNavigationState::CanSendEvents() const {
+ return !error_occurred_ && IsValidUrl(url_);
}
-void FrameNavigationState::StartTrackingDocumentLoad(
- content::RenderFrameHost* frame_host,
- const GURL& url,
- bool is_same_document,
- bool is_error_page) {
- FrameState& frame_state = frame_host_state_map_[frame_host];
- frame_state.error_occurred = is_error_page;
- frame_state.url = url;
+void FrameNavigationState::StartTrackingDocumentLoad(const GURL& url,
+ bool is_same_document,
+ bool is_error_page) {
+ error_occurred_ = is_error_page;
+ url_ = url;
if (!is_same_document) {
- frame_state.is_loading = true;
- frame_state.is_parsing = true;
+ is_loading_ = true;
+ is_parsing_ = true;
}
}
-void FrameNavigationState::FrameHostCreated(
- content::RenderFrameHost* frame_host) {
- frame_hosts_.insert(frame_host);
-}
-
-void FrameNavigationState::FrameHostDeleted(
- content::RenderFrameHost* frame_host) {
- frame_host_state_map_.erase(frame_host);
- frame_hosts_.erase(frame_host);
-}
-
-bool FrameNavigationState::IsValidFrame(
- content::RenderFrameHost* frame_host) const {
- return frame_host_state_map_.find(frame_host) != frame_host_state_map_.end();
+GURL FrameNavigationState::GetUrl() const {
+ return url_;
}
-GURL FrameNavigationState::GetUrl(content::RenderFrameHost* frame_host) const {
- auto it = frame_host_state_map_.find(frame_host);
- if (it == frame_host_state_map_.end())
- return GURL();
-
- return it->second.url;
+void FrameNavigationState::SetErrorOccurredInFrame() {
+ error_occurred_ = true;
}
-void FrameNavigationState::SetErrorOccurredInFrame(
- content::RenderFrameHost* frame_host) {
- auto it = frame_host_state_map_.find(frame_host);
- if (it == frame_host_state_map_.end()) {
- NOTREACHED();
- return;
- }
- it->second.error_occurred = true;
+bool FrameNavigationState::GetErrorOccurredInFrame() const {
+ return error_occurred_;
}
-bool FrameNavigationState::GetErrorOccurredInFrame(
- content::RenderFrameHost* frame_host) const {
- auto it = frame_host_state_map_.find(frame_host);
- DCHECK(it != frame_host_state_map_.end());
- return it == frame_host_state_map_.end() || it->second.error_occurred;
+void FrameNavigationState::SetDocumentLoadCompleted() {
+ is_loading_ = false;
}
-void FrameNavigationState::SetDocumentLoadCompleted(
- content::RenderFrameHost* frame_host) {
- auto it = frame_host_state_map_.find(frame_host);
- if (it == frame_host_state_map_.end()) {
- NOTREACHED();
- return;
- }
- it->second.is_loading = false;
+bool FrameNavigationState::GetDocumentLoadCompleted() const {
+ return !is_loading_;
}
-bool FrameNavigationState::GetDocumentLoadCompleted(
- content::RenderFrameHost* frame_host) const {
- auto it = frame_host_state_map_.find(frame_host);
- DCHECK(it != frame_host_state_map_.end());
- return it == frame_host_state_map_.end() || !it->second.is_loading;
-}
-
-void FrameNavigationState::SetParsingFinished(
- content::RenderFrameHost* frame_host) {
- auto it = frame_host_state_map_.find(frame_host);
- if (it == frame_host_state_map_.end()) {
- NOTREACHED();
- return;
- }
- it->second.is_parsing = false;
+void FrameNavigationState::SetParsingFinished() {
+ is_parsing_ = false;
}
-bool FrameNavigationState::GetParsingFinished(
- content::RenderFrameHost* frame_host) const {
- auto it = frame_host_state_map_.find(frame_host);
- DCHECK(it != frame_host_state_map_.end());
- return it == frame_host_state_map_.end() || !it->second.is_parsing;
+bool FrameNavigationState::GetParsingFinished() const {
+ return !is_parsing_;
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h
index 83b5c59866a..90c2e87b3ea 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h
+++ b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h
@@ -10,6 +10,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
+#include "content/public/browser/render_document_host_user_data.h"
#include "url/gurl.h"
namespace content {
@@ -18,69 +19,51 @@ class RenderFrameHost;
namespace extensions {
-// Tracks the loading state of all frame hosts in a given tab currently known
-// to the webNavigation API. It is mainly used to track in which frames an error
-// occurred so no further events for this frame are being sent.
-class FrameNavigationState {
+// Used to track the loading state of RenderFrameHost instances in a given tab
+// currently known to the webNavigation API. It is mainly used to track in which
+// frames an error occurred so no further events for this frame are being sent.
+// TODO(carlscab): DocumentState seems like a better name as this track per
+// document state.
+class FrameNavigationState
+ : public content::RenderDocumentHostUserData<FrameNavigationState> {
public:
- typedef std::set<content::RenderFrameHost*>::const_iterator const_iterator;
-
- FrameNavigationState();
- ~FrameNavigationState();
+ ~FrameNavigationState() override;
// True if in general webNavigation events may be sent for the given URL.
static bool IsValidUrl(const GURL& url);
- // Use these to iterate over all frame hosts known by this object.
- const_iterator begin() const { return frame_hosts_.begin(); }
- const_iterator end() const { return frame_hosts_.end(); }
-
- // True if navigation events for the given frame can be sent.
- bool CanSendEvents(content::RenderFrameHost* frame_host) const;
+ // True if navigation events for the this frame can be sent.
+ bool CanSendEvents() const;
- // Starts to track a document load in |frame_host| to |url|.
- void StartTrackingDocumentLoad(content::RenderFrameHost* frame_host,
- const GURL& url,
+ // Starts to track a document load to |url|.
+ void StartTrackingDocumentLoad(const GURL& url,
bool is_same_document,
bool is_error_page);
- // Adds the |frame_host| to the set of RenderFrameHosts associated with the
- // WebContents this object is tracking. This method and FrameHostDeleted
- // are used to track the set of current RenderFrameHosts, which is used to
- // implement the GetFrame and GetAllFrames extension APIs.
- void FrameHostCreated(content::RenderFrameHost* frame_host);
-
- // Removes the |frame_host| from the set of RenderFrameHosts associated with
- // the WebContents this object is tracking.
- void FrameHostDeleted(content::RenderFrameHost* frame_host);
-
- // Returns true if |frame_host| is a known frame host.
- bool IsValidFrame(content::RenderFrameHost* frame_host) const;
-
// Returns the URL corresponding to a tracked |frame_host|.
// TODO(dcheng): Why is this needed? Can't this information be extracted from
// RenderFrameHost?
- GURL GetUrl(content::RenderFrameHost* frame_host) const;
+ GURL GetUrl() const;
- // Marks |frame_host| as in an error state, i.e. the onErrorOccurred event was
+ // Marks this frame as in an error state, i.e. the onErrorOccurred event was
// fired for it, and no further events should be sent for it.
- void SetErrorOccurredInFrame(content::RenderFrameHost* frame_host);
+ void SetErrorOccurredInFrame();
- // True if |frame_host| is marked as being in an error state.
- bool GetErrorOccurredInFrame(content::RenderFrameHost* frame_host) const;
+ // True if this frame is marked as being in an error state.
+ bool GetErrorOccurredInFrame() const;
- // Marks |frame_host| as having finished its last document load, i.e. the
+ // Marks this frame as having finished its last document load, i.e. the
// onCompleted event was fired for this frame.
- void SetDocumentLoadCompleted(content::RenderFrameHost* frame_host);
+ void SetDocumentLoadCompleted();
- // True if |frame_host| is currently not loading a document.
- bool GetDocumentLoadCompleted(content::RenderFrameHost* frame_host) const;
+ // True if this frame is currently not loading a document.
+ bool GetDocumentLoadCompleted() const;
- // Marks |frame_host| as having finished parsing.
- void SetParsingFinished(content::RenderFrameHost* frame_host);
+ // Marks this frame as having finished parsing.
+ void SetParsingFinished();
// True if |frame_host| has finished parsing.
- bool GetParsingFinished(content::RenderFrameHost* frame_host) const;
+ bool GetParsingFinished() const;
#ifdef UNIT_TEST
static void set_allow_extension_scheme(bool allow_extension_scheme) {
@@ -89,21 +72,15 @@ class FrameNavigationState {
#endif
private:
- struct FrameState {
- FrameState();
-
- bool error_occurred; // True if an error has occurred in this frame.
- bool is_loading; // True if there is a document load going on.
- bool is_parsing; // True if the frame is still parsing.
- GURL url; // URL of this frame.
- };
- typedef std::map<content::RenderFrameHost*, FrameState> FrameHostToStateMap;
+ friend class content::RenderDocumentHostUserData<FrameNavigationState>;
+ RENDER_DOCUMENT_HOST_USER_DATA_KEY_DECL();
- // Tracks the state of known frame hosts.
- FrameHostToStateMap frame_host_state_map_;
+ explicit FrameNavigationState(content::RenderFrameHost*);
- // Set of all known frame hosts.
- std::set<content::RenderFrameHost*> frame_hosts_;
+ bool error_occurred_ = false; // True if an error has occurred in this frame.
+ bool is_loading_ = false; // True if there is a document load going on.
+ bool is_parsing_ = false; // True if the frame is still parsing.
+ GURL url_; // URL of this frame.
// If true, also allow events from chrome-extension:// URLs.
static bool allow_extension_scheme_;
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc
index c39357c9100..c4e69f5659b 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc
@@ -11,172 +11,55 @@
namespace extensions {
-class FrameNavigationStateTest : public ChromeRenderViewHostTestHarness {
- public:
- void SetUp() override {
- ChromeRenderViewHostTestHarness::SetUp();
-
- content::RenderFrameHostTester::For(main_rfh())
- ->InitializeRenderFrameIfNeeded();
- }
-
- protected:
- FrameNavigationStateTest() {}
- ~FrameNavigationStateTest() override {}
-
- FrameNavigationState navigation_state_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FrameNavigationStateTest);
-};
-
-// Test that a frame is correctly tracked, and removed once the tab contents
-// goes away.
-TEST_F(FrameNavigationStateTest, TrackFrame) {
- const GURL url1("http://www.google.com/");
- const GURL url2("http://mail.google.com/");
-
- // Create a main frame.
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url1, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh()));
-
- // Add a sub frame.
- content::RenderFrameHost* sub_frame =
- content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
- navigation_state_.StartTrackingDocumentLoad(sub_frame, url2, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame));
-
- // Check frame state.
- EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
- EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame));
-
- // Drop the frames.
- navigation_state_.FrameHostDeleted(sub_frame);
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
-
- navigation_state_.FrameHostDeleted(main_rfh());
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
-}
+class FrameNavigationStateTest : public ChromeRenderViewHostTestHarness {};
// Test that no events can be sent for a frame after an error occurred, but
// before a new navigation happened in this frame.
TEST_F(FrameNavigationStateTest, ErrorState) {
const GURL url("http://www.google.com/");
+ auto* navigation_state =
+ FrameNavigationState::GetOrCreateForCurrentDocument(main_rfh());
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
-
- // After an error occurred, no further events should be sent.
- navigation_state_.SetErrorOccurredInFrame(main_rfh());
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
-
- // Navigations to a network error page should be ignored.
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), GURL(), false, true);
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
-
- // However, when the frame navigates again, it should send events again.
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh()));
-}
-
-// Tests that for a sub frame, no events are send after an error occurred, but
-// before a new navigation happened in this frame.
-TEST_F(FrameNavigationStateTest, ErrorStateFrame) {
- const GURL url("http://www.google.com/");
-
- content::RenderFrameHost* sub_frame =
- content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url, false, false);
- navigation_state_.StartTrackingDocumentLoad(sub_frame, url, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
+ navigation_state->StartTrackingDocumentLoad(url, false, false);
+ EXPECT_TRUE(navigation_state->CanSendEvents());
+ EXPECT_FALSE(navigation_state->GetErrorOccurredInFrame());
// After an error occurred, no further events should be sent.
- navigation_state_.SetErrorOccurredInFrame(sub_frame);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
+ navigation_state->SetErrorOccurredInFrame();
+ EXPECT_FALSE(navigation_state->CanSendEvents());
+ EXPECT_TRUE(navigation_state->GetErrorOccurredInFrame());
// Navigations to a network error page should be ignored.
- navigation_state_.StartTrackingDocumentLoad(sub_frame, GURL(), false, true);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
+ navigation_state->StartTrackingDocumentLoad(GURL(), false, true);
+ EXPECT_FALSE(navigation_state->CanSendEvents());
+ EXPECT_TRUE(navigation_state->GetErrorOccurredInFrame());
// However, when the frame navigates again, it should send events again.
- navigation_state_.StartTrackingDocumentLoad(sub_frame, url, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
+ navigation_state->StartTrackingDocumentLoad(url, false, false);
+ EXPECT_TRUE(navigation_state->CanSendEvents());
+ EXPECT_FALSE(navigation_state->GetErrorOccurredInFrame());
}
// Tests that no events are send for a not web-safe scheme.
TEST_F(FrameNavigationStateTest, WebSafeScheme) {
const GURL url("unsafe://www.google.com/");
+ auto* navigation_state =
+ FrameNavigationState::GetOrCreateForCurrentDocument(main_rfh());
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url, false, false);
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
+ navigation_state->StartTrackingDocumentLoad(url, false, false);
+ EXPECT_FALSE(navigation_state->CanSendEvents());
}
// Test for <iframe srcdoc=""> frames.
TEST_F(FrameNavigationStateTest, SrcDoc) {
- const GURL url("http://www.google.com/");
- const GURL blank("about:blank");
const GURL srcdoc("about:srcdoc");
+ auto* navigation_state =
+ FrameNavigationState::GetOrCreateForCurrentDocument(main_rfh());
- content::RenderFrameHost* sub_frame =
- content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url, false, false);
- navigation_state_.StartTrackingDocumentLoad(sub_frame, srcdoc, false, false);
-
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
-
- EXPECT_EQ(url, navigation_state_.GetUrl(main_rfh()));
- EXPECT_EQ(srcdoc, navigation_state_.GetUrl(sub_frame));
-
- EXPECT_TRUE(navigation_state_.IsValidUrl(srcdoc));
-}
-
-// Test that an individual frame can be detached.
-TEST_F(FrameNavigationStateTest, DetachFrame) {
- const GURL url1("http://www.google.com/");
- const GURL url2("http://mail.google.com/");
-
- // Create a main frame.
- EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh()));
- navigation_state_.StartTrackingDocumentLoad(main_rfh(), url1, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh()));
- EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh()));
-
- // Add a sub frame.
- content::RenderFrameHost* sub_frame =
- content::RenderFrameHostTester::For(main_rfh())->AppendChild("child");
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
- navigation_state_.StartTrackingDocumentLoad(sub_frame, url2, false, false);
- EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame));
-
- // Check frame state.
- EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
- EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame));
-
- // Drop one frame.
- navigation_state_.FrameHostDeleted(sub_frame);
- EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh()));
- EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame));
- EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame));
+ navigation_state->StartTrackingDocumentLoad(srcdoc, false, false);
+ EXPECT_TRUE(navigation_state->CanSendEvents());
+ EXPECT_EQ(srcdoc, navigation_state->GetUrl());
+ EXPECT_TRUE(FrameNavigationState::IsValidUrl(srcdoc));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
index 973a6c05afb..f3b53fc4db6 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
@@ -25,6 +25,7 @@
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_api_frame_id_map.h"
#include "extensions/browser/view_type_utils.h"
+#include "extensions/common/mojom/view_type.mojom.h"
#include "net/base/net_errors.h"
namespace GetFrame = extensions::api::web_navigation::GetFrame;
@@ -34,18 +35,6 @@ namespace extensions {
namespace web_navigation = api::web_navigation;
-namespace {
-
-using TabObserverMap =
- std::map<content::WebContents*, WebNavigationTabObserver*>;
-
-TabObserverMap& GetTabObserverMap() {
- static base::NoDestructor<TabObserverMap> s;
- return *s;
-}
-
-} // namespace
-
// WebNavigtionEventRouter -------------------------------------------
WebNavigationEventRouter::PendingWebContents::PendingWebContents() = default;
@@ -95,7 +84,8 @@ void WebNavigationEventRouter::OnTabStripModelChanged(
if (!tab_observer) {
// If you hit this DCHECK(), please add reproduction steps to
// http://crbug.com/109464.
- DCHECK(GetViewType(replace->old_contents) != VIEW_TYPE_TAB_CONTENTS);
+ DCHECK(GetViewType(replace->old_contents) !=
+ mojom::ViewType::kTabContents);
return;
}
if (!FrameNavigationState::IsValidUrl(replace->old_contents->GetURL()) ||
@@ -124,15 +114,16 @@ void WebNavigationEventRouter::RecordNewWebContents(
if (!tab_observer) {
// If you hit this DCHECK(), please add reproduction steps to
// http://crbug.com/109464.
- DCHECK(GetViewType(source_web_contents) != VIEW_TYPE_TAB_CONTENTS);
+ DCHECK(GetViewType(source_web_contents) != mojom::ViewType::kTabContents);
return;
}
- const FrameNavigationState& frame_navigation_state =
- tab_observer->frame_navigation_state();
- content::RenderFrameHost* frame_host = content::RenderFrameHost::FromID(
- source_render_process_id, source_render_frame_id);
- if (!frame_navigation_state.CanSendEvents(frame_host))
+ auto* frame_host = content::RenderFrameHost::FromID(source_render_process_id,
+ source_render_frame_id);
+ auto* frame_navigation_state =
+ FrameNavigationState::GetForCurrentDocument(frame_host);
+
+ if (!frame_navigation_state || !frame_navigation_state->CanSendEvents())
return;
int source_extension_frame_id =
@@ -178,42 +169,34 @@ void WebNavigationEventRouter::PendingWebContentsDestroyed(
WebNavigationTabObserver::WebNavigationTabObserver(
content::WebContents* web_contents)
- : WebContentsObserver(web_contents) {
- GetTabObserverMap().insert(TabObserverMap::value_type(web_contents, this));
- navigation_state_.FrameHostCreated(web_contents->GetMainFrame());
-}
+ : WebContentsObserver(web_contents) {}
WebNavigationTabObserver::~WebNavigationTabObserver() {}
// static
WebNavigationTabObserver* WebNavigationTabObserver::Get(
content::WebContents* web_contents) {
- auto i = GetTabObserverMap().find(web_contents);
- return i == GetTabObserverMap().end() ? NULL : i->second;
+ return FromWebContents(web_contents);
}
void WebNavigationTabObserver::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
- if (navigation_state_.CanSendEvents(render_frame_host) &&
- !navigation_state_.GetDocumentLoadCompleted(render_frame_host)) {
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
+ if (navigation_state && navigation_state->CanSendEvents() &&
+ !navigation_state->GetDocumentLoadCompleted()) {
web_navigation_api_helpers::DispatchOnErrorOccurred(
- web_contents(), render_frame_host,
- navigation_state_.GetUrl(render_frame_host), net::ERR_ABORTED);
- navigation_state_.SetErrorOccurredInFrame(render_frame_host);
+ web_contents(), render_frame_host, navigation_state->GetUrl(),
+ net::ERR_ABORTED);
+ navigation_state->SetErrorOccurredInFrame();
}
}
-void WebNavigationTabObserver::FrameDeleted(
- content::RenderFrameHost* render_frame_host) {
- navigation_state_.FrameHostDeleted(render_frame_host);
-}
-
void WebNavigationTabObserver::RenderFrameHostChanged(
content::RenderFrameHost* old_host,
content::RenderFrameHost* new_host) {
if (old_host)
RenderFrameHostPendingDeletion(old_host);
- navigation_state_.FrameHostCreated(new_host);
}
void WebNavigationTabObserver::DidStartNavigation(
@@ -262,67 +245,70 @@ void WebNavigationTabObserver::DidFinishNavigation(
void WebNavigationTabObserver::DOMContentLoaded(
content::RenderFrameHost* render_frame_host) {
- if (!navigation_state_.CanSendEvents(render_frame_host))
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
+ if (!navigation_state || !navigation_state->CanSendEvents())
return;
- navigation_state_.SetParsingFinished(render_frame_host);
+ navigation_state->SetParsingFinished();
web_navigation_api_helpers::DispatchOnDOMContentLoaded(
- web_contents(), render_frame_host,
- navigation_state_.GetUrl(render_frame_host));
+ web_contents(), render_frame_host, navigation_state->GetUrl());
- if (!navigation_state_.GetDocumentLoadCompleted(render_frame_host))
+ if (!navigation_state->GetDocumentLoadCompleted())
return;
// The load might already have finished by the time we finished parsing. For
// compatibility reasons, we artifically delay the load completed signal until
// after parsing was completed.
web_navigation_api_helpers::DispatchOnCompleted(
- web_contents(), render_frame_host,
- navigation_state_.GetUrl(render_frame_host));
+ web_contents(), render_frame_host, navigation_state->GetUrl());
}
void WebNavigationTabObserver::DidFinishLoad(
content::RenderFrameHost* render_frame_host,
const GURL& validated_url) {
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
// When showing replacement content, we might get load signals for frames
- // that weren't reguarly loaded.
- if (!navigation_state_.IsValidFrame(render_frame_host))
+ // that weren't regularly loaded.
+ if (!navigation_state)
return;
- navigation_state_.SetDocumentLoadCompleted(render_frame_host);
- if (!navigation_state_.CanSendEvents(render_frame_host))
+ navigation_state->SetDocumentLoadCompleted();
+ if (!navigation_state->CanSendEvents())
return;
// A new navigation might have started before the old one completed.
// Ignore the old navigation completion in that case.
- if (navigation_state_.GetUrl(render_frame_host) != validated_url)
+ if (navigation_state->GetUrl() != validated_url)
return;
// The load might already have finished by the time we finished parsing. For
// compatibility reasons, we artifically delay the load completed signal until
// after parsing was completed.
- if (!navigation_state_.GetParsingFinished(render_frame_host))
+ if (!navigation_state->GetParsingFinished())
return;
web_navigation_api_helpers::DispatchOnCompleted(
- web_contents(), render_frame_host,
- navigation_state_.GetUrl(render_frame_host));
+ web_contents(), render_frame_host, navigation_state->GetUrl());
}
void WebNavigationTabObserver::DidFailLoad(
content::RenderFrameHost* render_frame_host,
const GURL& validated_url,
int error_code) {
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
// When showing replacement content, we might get load signals for frames
// that weren't regularly loaded.
- if (!navigation_state_.IsValidFrame(render_frame_host))
+ if (!navigation_state)
return;
- if (navigation_state_.CanSendEvents(render_frame_host)) {
+ if (navigation_state->CanSendEvents()) {
web_navigation_api_helpers::DispatchOnErrorOccurred(
- web_contents(), render_frame_host,
- navigation_state_.GetUrl(render_frame_host), error_code);
+ web_contents(), render_frame_host, navigation_state->GetUrl(),
+ error_code);
}
- navigation_state_.SetErrorOccurredInFrame(render_frame_host);
+ navigation_state->SetErrorOccurredInFrame();
}
void WebNavigationTabObserver::DidOpenRequestedURL(
@@ -334,7 +320,9 @@ void WebNavigationTabObserver::DidOpenRequestedURL(
ui::PageTransition transition,
bool started_from_context_menu,
bool renderer_initiated) {
- if (!navigation_state_.CanSendEvents(source_render_frame_host))
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(source_render_frame_host);
+ if (!navigation_state || !navigation_state->CanSendEvents())
return;
// We only send the onCreatedNavigationTarget if we end up creating a new
@@ -365,10 +353,6 @@ void WebNavigationTabObserver::DidOpenRequestedURL(
!new_contents_is_present_in_tabstrip);
}
-void WebNavigationTabObserver::WebContentsDestroyed() {
- GetTabObserverMap().erase(web_contents());
-}
-
void WebNavigationTabObserver::DispatchCachedOnBeforeNavigate() {
if (!pending_on_before_navigate_event_)
return;
@@ -387,10 +371,11 @@ void WebNavigationTabObserver::HandleCommit(
IsReferenceFragmentNavigation(navigation_handle->GetRenderFrameHost(),
navigation_handle->GetURL());
- navigation_state_.StartTrackingDocumentLoad(
- navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(),
- navigation_handle->IsSameDocument(),
- false); // is_error_page
+ FrameNavigationState::GetOrCreateForCurrentDocument(
+ navigation_handle->GetRenderFrameHost())
+ ->StartTrackingDocumentLoad(navigation_handle->GetURL(),
+ navigation_handle->IsSameDocument(),
+ /*is_error_page=*/false);
events::HistogramValue histogram_value = events::UNKNOWN;
std::string event_name;
@@ -411,10 +396,11 @@ void WebNavigationTabObserver::HandleCommit(
void WebNavigationTabObserver::HandleError(
content::NavigationHandle* navigation_handle) {
if (navigation_handle->HasCommitted()) {
- navigation_state_.StartTrackingDocumentLoad(
- navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(),
- navigation_handle->IsSameDocument(),
- true); // is_error_page
+ FrameNavigationState::GetOrCreateForCurrentDocument(
+ navigation_handle->GetRenderFrameHost())
+ ->StartTrackingDocumentLoad(navigation_handle->GetURL(),
+ navigation_handle->IsSameDocument(),
+ /*is_error_page=*/true);
}
web_navigation_api_helpers::DispatchOnErrorOccurred(navigation_handle);
@@ -424,14 +410,17 @@ void WebNavigationTabObserver::HandleError(
bool WebNavigationTabObserver::IsReferenceFragmentNavigation(
content::RenderFrameHost* render_frame_host,
const GURL& url) {
- GURL existing_url = navigation_state_.GetUrl(render_frame_host);
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
+
+ GURL existing_url = navigation_state ? navigation_state->GetUrl() : GURL();
if (existing_url == url)
return false;
url::Replacements<char> replacements;
replacements.ClearRef();
return existing_url.ReplaceComponents(replacements) ==
- url.ReplaceComponents(replacements);
+ url.ReplaceComponents(replacements);
}
void WebNavigationTabObserver::RenderFrameHostPendingDeletion(
@@ -439,23 +428,17 @@ void WebNavigationTabObserver::RenderFrameHostPendingDeletion(
// The |pending_delete_rfh| and its children are now pending deletion.
// Stop tracking them.
- // 1) Collect them.
- std::vector<content::RenderFrameHost*> to_be_deleted;
- for (content::RenderFrameHost* render_frame_host : navigation_state_) {
- if (render_frame_host == pending_delete_rfh ||
- render_frame_host->IsDescendantOf(pending_delete_rfh)) {
- to_be_deleted.push_back(render_frame_host);
- }
- }
-
- // 2) Delete them.
- for (content::RenderFrameHost* render_frame_host : to_be_deleted) {
- // The RenderFrame may still be loading. Call RenderFrameDeleted()
- // immediately to properly dispatch a load error occurred.
- RenderFrameDeleted(render_frame_host);
-
- navigation_state_.FrameHostDeleted(render_frame_host);
- }
+ web_contents()->ForEachFrame(base::BindRepeating(
+ [](content::RenderFrameHost* pending_delete_rfh,
+ WebNavigationTabObserver* observer,
+ content::RenderFrameHost* render_frame_host) {
+ if (render_frame_host == pending_delete_rfh ||
+ render_frame_host->IsDescendantOf(pending_delete_rfh)) {
+ observer->RenderFrameDeleted(render_frame_host);
+ FrameNavigationState::DeleteForCurrentDocument(render_frame_host);
+ }
+ },
+ pending_delete_rfh, this));
}
ExtensionFunction::ResponseAction WebNavigationGetFrameFunction::Run() {
@@ -476,23 +459,25 @@ ExtensionFunction::ResponseAction WebNavigationGetFrameFunction::Run() {
WebNavigationTabObserver::Get(web_contents);
DCHECK(observer);
- const FrameNavigationState& frame_navigation_state =
- observer->frame_navigation_state();
-
content::RenderFrameHost* render_frame_host =
ExtensionApiFrameIdMap::Get()->GetRenderFrameHostById(web_contents,
frame_id);
- if (!frame_navigation_state.IsValidFrame(render_frame_host))
+
+ auto* frame_navigation_state =
+ render_frame_host
+ ? FrameNavigationState::GetForCurrentDocument(render_frame_host)
+ : nullptr;
+ if (!frame_navigation_state)
return RespondNow(OneArgument(base::Value()));
- GURL frame_url = frame_navigation_state.GetUrl(render_frame_host);
- if (!frame_navigation_state.IsValidUrl(frame_url))
+ GURL frame_url = frame_navigation_state->GetUrl();
+ if (!FrameNavigationState::IsValidUrl(frame_url))
return RespondNow(OneArgument(base::Value()));
GetFrame::Results::Details frame_details;
frame_details.url = frame_url.spec();
frame_details.error_occurred =
- frame_navigation_state.GetErrorOccurredInFrame(render_frame_host);
+ frame_navigation_state->GetErrorOccurredInFrame();
frame_details.parent_frame_id =
ExtensionApiFrameIdMap::GetFrameId(render_frame_host->GetParent());
return RespondNow(ArgumentList(GetFrame::Results::Create(frame_details)));
@@ -516,23 +501,30 @@ ExtensionFunction::ResponseAction WebNavigationGetAllFramesFunction::Run() {
WebNavigationTabObserver::Get(web_contents);
DCHECK(observer);
- const FrameNavigationState& navigation_state =
- observer->frame_navigation_state();
-
std::vector<GetAllFrames::Results::DetailsType> result_list;
- for (auto it = navigation_state.begin(); it != navigation_state.end(); ++it) {
- GURL frame_url = navigation_state.GetUrl(*it);
- if (!navigation_state.IsValidUrl(frame_url))
- continue;
- GetAllFrames::Results::DetailsType frame;
- frame.url = frame_url.spec();
- frame.frame_id = ExtensionApiFrameIdMap::GetFrameId(*it);
- frame.parent_frame_id =
- ExtensionApiFrameIdMap::GetFrameId((*it)->GetParent());
- frame.process_id = (*it)->GetProcess()->GetID();
- frame.error_occurred = navigation_state.GetErrorOccurredInFrame(*it);
- result_list.push_back(std::move(frame));
- }
+
+ web_contents->ForEachFrame(base::BindRepeating(
+ [](std::vector<GetAllFrames::Results::DetailsType>& result_list,
+ content::RenderFrameHost* render_frame_host) {
+ auto* navigation_state =
+ FrameNavigationState::GetForCurrentDocument(render_frame_host);
+
+ if (!navigation_state ||
+ !FrameNavigationState::IsValidUrl(navigation_state->GetUrl())) {
+ return;
+ }
+
+ GetAllFrames::Results::DetailsType frame;
+ frame.url = navigation_state->GetUrl().spec();
+ frame.frame_id = ExtensionApiFrameIdMap::GetFrameId(render_frame_host);
+ frame.parent_frame_id =
+ ExtensionApiFrameIdMap::GetFrameId(render_frame_host->GetParent());
+ frame.process_id = render_frame_host->GetProcess()->GetID();
+ frame.error_occurred = navigation_state->GetErrorOccurredInFrame();
+ result_list.push_back(std::move(frame));
+ },
+ std::ref(result_list)));
+
return RespondNow(ArgumentList(GetAllFrames::Results::Create(result_list)));
}
@@ -557,8 +549,7 @@ WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context)
web_navigation::OnTabReplaced::kEventName);
}
-WebNavigationAPI::~WebNavigationAPI() {
-}
+WebNavigationAPI::~WebNavigationAPI() {}
void WebNavigationAPI::Shutdown() {
EventRouter::Get(browser_context_)->UnregisterObserver(this);
@@ -574,8 +565,8 @@ WebNavigationAPI::GetFactoryInstance() {
}
void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) {
- web_navigation_event_router_.reset(new WebNavigationEventRouter(
- Profile::FromBrowserContext(browser_context_)));
+ web_navigation_event_router_ = std::make_unique<WebNavigationEventRouter>(
+ Profile::FromBrowserContext(browser_context_));
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h
index 497cab0dc73..19fc05175fb 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h
+++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h
@@ -38,13 +38,8 @@ class WebNavigationTabObserver
// Returns the object for the given |web_contents|.
static WebNavigationTabObserver* Get(content::WebContents* web_contents);
- const FrameNavigationState& frame_navigation_state() const {
- return navigation_state_;
- }
-
// content::WebContentsObserver implementation.
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
- void FrameDeleted(content::RenderFrameHost* render_frame_host) override;
void RenderFrameHostChanged(content::RenderFrameHost* old_host,
content::RenderFrameHost* new_host) override;
void DidStartNavigation(
@@ -65,7 +60,6 @@ class WebNavigationTabObserver
ui::PageTransition transition,
bool started_from_context_menu,
bool renderer_initiated) override;
- void WebContentsDestroyed() override;
// This method dispatches the already created onBeforeNavigate event.
void DispatchCachedOnBeforeNavigate();
@@ -86,9 +80,6 @@ class WebNavigationTabObserver
// and its children.
void RenderFrameHostPendingDeletion(content::RenderFrameHost*);
- // Tracks the state of the frames we are sending events for.
- FrameNavigationState navigation_state_;
-
// The latest onBeforeNavigate event this frame has generated. It is stored
// as it might not be sent immediately, but delayed until the tab is added to
// the tab strip and is ready to dispatch events.
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index 3166295ba55..f191092a380 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -51,6 +51,7 @@
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
#include "third_party/blink/public/common/input/web_input_event.h"
+#include "third_party/blink/public/common/switches.h"
#include "third_party/blink/public/mojom/context_menu/context_menu.mojom.h"
using content::WebContents;
@@ -206,6 +207,13 @@ class WebNavigationApiTest : public ExtensionApiTest {
host_resolver()->AddRule("*", "127.0.0.1");
}
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ ExtensionApiTest::SetUpCommandLine(command_line);
+ // Some builders are flaky due to slower loading interacting
+ // with deferred commits.
+ command_line->AppendSwitch(blink::switches::kAllowPreCommitInput);
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(WebNavigationApiTest);
};
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
index 1220977e1e8..e51d535734e 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -475,8 +475,8 @@ TEST(ExtensionWebRequestHelpersTest,
TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) {
const bool cancel = true;
- base::string16 username = base::ASCIIToUTF16("foo");
- base::string16 password = base::ASCIIToUTF16("bar");
+ std::u16string username = u"foo";
+ std::u16string password = u"bar";
net::AuthCredentials credentials(username, password);
EventResponseDelta delta = CalculateOnAuthRequiredDelta(
@@ -1910,9 +1910,9 @@ TEST(ExtensionWebRequestHelpersTest,
TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
helpers::IgnoredActions ignored_actions;
EventResponseDeltas deltas;
- base::string16 username = base::ASCIIToUTF16("foo");
- base::string16 password = base::ASCIIToUTF16("bar");
- base::string16 password2 = base::ASCIIToUTF16("baz");
+ std::u16string username = u"foo";
+ std::u16string password = u"bar";
+ std::u16string password2 = u"baz";
// Check that we can handle if not returning credentials.
{
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index da499c53a8e..1a2f5d497f8 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -54,7 +54,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/login/login_handler.h"
-#include "chrome/browser/ui/search/local_ntp_test_utils.h"
+#include "chrome/browser/ui/search/ntp_test_utils.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
@@ -530,23 +530,9 @@ enum class ProfileMode {
class ExtensionWebRequestApiAuthRequiredTest
: public ExtensionWebRequestApiTest,
public testing::WithParamInterface<ProfileMode> {
- public:
- int GetBrowserTestFlags() {
- switch (GetParam()) {
- case ProfileMode::kUserProfile:
- return kFlagNone;
- case ProfileMode::kIncognito:
- return kFlagEnableIncognito;
- }
- }
-
- int GetApiTestFlags() {
- switch (GetParam()) {
- case ProfileMode::kUserProfile:
- return kFlagNone;
- case ProfileMode::kIncognito:
- return kFlagUseIncognito;
- }
+ protected:
+ bool GetEnableIncognito() const {
+ return GetParam() == ProfileMode::kIncognito;
}
};
@@ -558,9 +544,11 @@ IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest,
ASSERT_TRUE(StartEmbeddedTestServer());
// Pass "debug" as a custom arg to debug test flakiness.
- ASSERT_TRUE(RunExtensionSubtestWithArgAndFlags(
- "webrequest", "test_auth_required.html", "debug", GetBrowserTestFlags(),
- GetApiTestFlags()))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_auth_required.html",
+ .custom_arg = "debug",
+ .open_in_incognito = GetEnableIncognito()},
+ {.allow_in_incognito = GetEnableIncognito()}))
<< message_;
}
@@ -573,9 +561,11 @@ IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest,
ASSERT_TRUE(StartEmbeddedTestServer());
// Pass "debug" as a custom arg to debug test flakiness.
- ASSERT_TRUE(RunExtensionSubtestWithArgAndFlags(
- "webrequest", "test_auth_required_async.html", "debug",
- GetBrowserTestFlags(), GetApiTestFlags()))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_auth_required_async.html",
+ .custom_arg = "debug",
+ .open_in_incognito = GetEnableIncognito()},
+ {.allow_in_incognito = GetEnableIncognito()}))
<< message_;
}
@@ -586,9 +576,10 @@ IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest,
CancelLoginDialog login_dialog_helper;
ASSERT_TRUE(StartEmbeddedTestServer());
- ASSERT_TRUE(RunExtensionSubtestWithArgAndFlags(
- "webrequest", "test_auth_required_parallel.html", nullptr,
- GetBrowserTestFlags(), GetApiTestFlags()))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_auth_required_parallel.html",
+ .open_in_incognito = GetEnableIncognito()},
+ {.allow_in_incognito = GetEnableIncognito()}))
<< message_;
}
@@ -646,8 +637,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestRedirects) {
IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
WebRequestRedirectsWithExtraHeaders) {
ASSERT_TRUE(StartEmbeddedTestServer());
- ASSERT_TRUE(RunExtensionSubtestWithArg("webrequest", "test_redirects.html",
- "useExtraHeaders"))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_redirects.html",
+ .custom_arg = "useExtraHeaders"}))
<< message_;
}
@@ -670,8 +662,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
std::string config_string;
base::JSONWriter::Write(custom_args, &config_string);
- ASSERT_TRUE(RunExtensionSubtestWithArg(
- "webrequest", "test_redirects_from_secure.html", config_string.c_str()))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_redirects_from_secure.html",
+ .custom_arg = config_string.c_str()}))
<< message_;
}
@@ -686,8 +679,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
WebRequestSubresourceRedirectsWithExtraHeaders) {
ASSERT_TRUE(StartEmbeddedTestServer());
- ASSERT_TRUE(RunExtensionSubtestWithArg(
- "webrequest", "test_subresource_redirects.html", "useExtraHeaders"))
+ ASSERT_TRUE(RunExtensionTest({.name = "webrequest",
+ .page_url = "test_subresource_redirects.html",
+ .custom_arg = "useExtraHeaders"}))
<< message_;
}
@@ -1828,7 +1822,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
network::ResourceRequest resource_request;
resource_request.url = embedded_test_server()->GetURL("/hung");
factory->CreateLoaderAndStart(
- loader.InitWithNewPipeAndPassReceiver(), 0, 0,
+ loader.InitWithNewPipeAndPassReceiver(), 0,
network::mojom::kURLLoadOptionNone, resource_request,
client.CreateRemote(),
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -1868,7 +1862,7 @@ class NTPInterceptionWebRequestAPITest : public ExtensionApiTest {
ASSERT_TRUE(https_test_server_.Start());
GURL ntp_url = https_test_server_.GetURL("/fake_ntp.html");
- local_ntp_test_utils::SetUserSelectedDefaultSearchProvider(
+ ntp_test_utils::SetUserSelectedDefaultSearchProvider(
profile(), https_test_server_.base_url().spec(), ntp_url.spec());
}
@@ -2049,7 +2043,7 @@ IN_PROC_BROWSER_TEST_F(LocalNTPInterceptionWebRequestAPITest,
ASSERT_FALSE(GetAndResetOneGoogleBarRequestSeen());
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
- ASSERT_EQ(local_ntp_test_utils::GetFinalNtpUrl(browser()->profile()),
+ ASSERT_EQ(ntp_test_utils::GetFinalNtpUrl(browser()->profile()),
browser()
->tab_strip_model()
->GetActiveWebContents()
@@ -2749,6 +2743,154 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest, ServiceWorkerScript) {
}
}
+// An extension should be able to modify the request header for module service
+// worker script by using WebRequest API.
+IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest,
+ ModuleServiceWorkerScript) {
+ // The extension to be used in this test adds foo=bar request header.
+ constexpr char kScriptPath[] = "/echoheader_service_worker.js";
+ // The request handler below will run on the EmbeddedTestServer's IO thread.
+ // Hence guard access to |served_service_worker_count| and |foo_header_value|
+ // using a lock.
+ base::Lock lock;
+ int served_service_worker_count = 0;
+ std::string foo_header_value;
+
+ // Capture the value of a request header foo, which should be added if
+ // extension modifies the request header.
+ embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+ [&](const net::test_server::HttpRequest& request)
+ -> std::unique_ptr<net::test_server::HttpResponse> {
+ if (request.relative_url != kScriptPath)
+ return nullptr;
+
+ base::AutoLock auto_lock(lock);
+ ++served_service_worker_count;
+ foo_header_value.clear();
+ if (base::Contains(request.headers, "foo"))
+ foo_header_value = request.headers.at("foo");
+
+ auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+ response->set_code(net::HTTP_OK);
+ response->set_content_type("text/javascript");
+ response->AddCustomHeader("Cache-Control", "no-cache");
+ response->set_content("// empty");
+ return response;
+ }));
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ InstallRequestHeaderModifyingExtension();
+
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ GURL url = embedded_test_server()->GetURL(
+ "/service_worker/create_service_worker.html");
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+ // Register a service worker. `EvalJs` is blocked until the request handler
+ // serves the worker script. The worker script should have "foo: bar" request
+ // header added by the extension.
+ std::string script =
+ content::JsReplace("register($1, './in-scope', 'module');", kScriptPath);
+ EXPECT_EQ("DONE", EvalJs(web_contents, script));
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(1, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
+
+ // Update the worker. `EvalJs` is blocked until the request handler serves the
+ // worker script. The worker should have "foo: bar" request header in the
+ // request for update checking.
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+ EXPECT_EQ("DONE", EvalJs(web_contents, "update('./in-scope');"));
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(2, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
+}
+
+// An extension should be able to modify the request header for module service
+// worker script with static import by using WebRequest API.
+IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest,
+ ModuleServiceWorkerScriptWithStaticImport) {
+ // The extension to be used in this test adds foo=bar request header.
+ constexpr char kScriptPath[] = "/static-import-worker.js";
+ constexpr char kImportedScriptPath[] = "/echoheader_service_worker.js";
+ // The request handler below will run on the EmbeddedTestServer's IO thread.
+ // Hence guard access to |served_service_worker_count| and |foo_header_value|
+ // using a lock.
+ base::Lock lock;
+ int served_service_worker_count = 0;
+ std::string foo_header_value;
+
+ // Capture the value of a request header foo, which should be added if
+ // extension modifies the request header.
+ embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+ [&](const net::test_server::HttpRequest& request)
+ -> std::unique_ptr<net::test_server::HttpResponse> {
+ // Handle the top-level worker script.
+ if (request.relative_url == kScriptPath) {
+ base::AutoLock auto_lock(lock);
+ ++served_service_worker_count;
+ auto response =
+ std::make_unique<net::test_server::BasicHttpResponse>();
+ response->set_code(net::HTTP_OK);
+ response->set_content_type("text/javascript");
+ response->AddCustomHeader("Cache-Control", "no-cache");
+ response->set_content("import './echoheader_service_worker.js';");
+ return response;
+ }
+ // Handle the static-imported script.
+ if (request.relative_url == kImportedScriptPath) {
+ base::AutoLock auto_lock(lock);
+ ++served_service_worker_count;
+ foo_header_value.clear();
+ if (base::Contains(request.headers, "foo"))
+ foo_header_value = request.headers.at("foo");
+ auto response =
+ std::make_unique<net::test_server::BasicHttpResponse>();
+ response->set_code(net::HTTP_OK);
+ response->set_content_type("text/javascript");
+ response->AddCustomHeader("Cache-Control", "no-cache");
+ response->set_content("// empty");
+ return response;
+ }
+ return nullptr;
+ }));
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ InstallRequestHeaderModifyingExtension();
+
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ GURL url = embedded_test_server()->GetURL(
+ "/service_worker/create_service_worker.html");
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+ // Register a service worker. The worker script should have "foo: bar" request
+ // header added by the extension.
+ std::string script =
+ content::JsReplace("register($1, './in-scope', 'module');", kScriptPath);
+ EXPECT_EQ("DONE", EvalJs(web_contents, script));
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(2, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
+
+ // Update the worker. The worker should have "foo: bar" request header in the
+ // request for update checking.
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+ EXPECT_EQ("DONE", EvalJs(web_contents, "update('./in-scope');"));
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(4, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
+}
+
// Ensure that extensions can intercept service worker navigation preload
// requests.
IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest,
@@ -2981,7 +3123,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, AppCacheRequests) {
"content/test/data", GURL(origin));
GURL main_url(origin + "/appcache/simple_page_with_manifest.html");
- base::string16 expected_title = base::ASCIIToUTF16("AppCache updated");
+ std::u16string expected_title = u"AppCache updated";
// Load the main page first to make sure it is cached. After the first
// navigation, load the extension, then navigate again.
@@ -3027,6 +3169,26 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, AppCacheRequests) {
1);
}
+// Ensure that when an extension blocks a main-frame request, the resultant
+// error page attributes this to an extension.
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
+ ErrorPageForBlockedMainFrameNavigation) {
+ ASSERT_TRUE(StartEmbeddedTestServer());
+ ASSERT_TRUE(
+ RunExtensionSubtest("webrequest", "test_simple_cancel_navigation.html"))
+ << message_;
+
+ std::string body;
+ WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
+ ASSERT_TRUE(content::ExecuteScriptAndExtractString(
+ tab, "window.domAutomationController.send(document.body.textContent)",
+ &body));
+
+ EXPECT_TRUE(
+ base::Contains(body, "This page has been blocked by an extension"));
+ EXPECT_TRUE(base::Contains(body, "Try disabling your extensions."));
+}
+
// Regression test for http://crbug.com/996940. Requests that redirected to an
// appcache handled URL could have request ID collisions.
// This test is flaky on Linux: https://crbug.com/1094834.
@@ -3050,7 +3212,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
"content/test/data", GURL(origin));
GURL main_url(origin + "/appcache/simple_page_with_manifest.html");
- base::string16 expected_title = base::ASCIIToUTF16("AppCache updated");
+ std::u16string expected_title = u"AppCache updated";
// Load the main page first to make sure it is cached. After the first
// navigation, load the extension, then navigate again.
@@ -3164,7 +3326,7 @@ class SubresourceWebBundlesWebRequestApiTest
return GetParam() ? ExtraInfoSpec::kExtraHeaders : ExtraInfoSpec::kDefault;
}
- bool TryLoadScript(const char* script_src) {
+ bool TryLoadScript(const std::string& script_src) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
bool success = false;
@@ -3181,7 +3343,7 @@ class SubresourceWebBundlesWebRequestApiTest
document.body.appendChild(script);
})();
)",
- script_src);
+ script_src.c_str());
EXPECT_TRUE(ExecuteScriptAndExtractBool(web_contents->GetMainFrame(),
script, &success));
return success;
@@ -3244,6 +3406,8 @@ INSTANTIATE_TEST_SUITE_P(All,
// subresources.
IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
RequestIntercepted) {
+ const std::string urn_uuid_script_url =
+ "urn:uuid:6a059ece-62f4-4c79-a9e2-1c641cbdbaaf";
// Create an extension that intercepts requests.
TestExtensionDir test_dir;
test_dir.WriteManifest(R"({
@@ -3262,6 +3426,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
window.numMainResourceRequests = 0;
window.numWebBundleRequests = 0;
window.numScriptRequests = 0;
+ window.numUrnUUIDScriptRequests = 0;
chrome.webRequest.onBeforeRequest.addListener(function(details) {
if (details.url.includes('test.html'))
window.numMainResourceRequests++;
@@ -3269,10 +3434,13 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
window.numWebBundleRequests++;
else if (details.url.includes('test.js'))
window.numScriptRequests++;
+ else if (details.url === '%s')
+ window.numUrnUUIDScriptRequests++;
}, {urls: ['<all_urls>']}, [%s]);
chrome.test.sendMessage('ready');
)",
+ urn_uuid_script_url.c_str(),
opt_extra_info_spec.c_str()));
const Extension* extension = nullptr;
{
@@ -3282,7 +3450,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
EXPECT_TRUE(listener.WaitUntilSatisfied());
}
- const char kPageHtml[] = R"(
+ const std::string page_html = base::StringPrintf(R"(
<title>Loaded</title>
<body>
<script>
@@ -3290,21 +3458,28 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
const wbn_url =
new URL('./web_bundle.wbn', location.href).toString();
const script_url = new URL('./test.js', location.href).toString();
+ const urn_uuid_script_url = '%s';
const link = document.createElement('link');
link.rel = 'webbundle';
link.href = wbn_url;
- link.resources = script_url;
+ link.resources = script_url + ' ' + urn_uuid_script_url;
document.body.appendChild(link);
const script = document.createElement('script');
script.src = script_url;
+ script.addEventListener('load', () => {
+ const urn_uuid_script = document.createElement('script');
+ urn_uuid_script.src = urn_uuid_script_url;
+ document.body.appendChild(urn_uuid_script);
+ });
document.body.appendChild(script);
})();
</script>
</body>
- )";
+ )",
+ urn_uuid_script_url.c_str());
std::string web_bundle;
RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
- RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+ RegisterRequestHandler("/test.html", "text/html", page_html);
ASSERT_TRUE(StartEmbeddedTestServer());
// Create a web bundle.
@@ -3315,21 +3490,25 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
// TODO(crbug.com/966753): Stop using |script_url_str| when
// https://github.com/WICG/webpackage/issues/590 is resolved.
web_package::test::WebBundleBuilder builder(script_url_str, "");
- auto location = builder.AddResponse(
+ auto script_location = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}},
+ "document.title = 'ScriptDone';");
+ auto urn_uuid_script_location = builder.AddResponse(
{{":status", "200"}, {"content-type", "application/javascript"}},
- "document.title = 'Done';");
- builder.AddIndexEntry(script_url_str, "", {location});
+ "document.title += ':UrnUUIDScriptDone';");
+ builder.AddIndexEntry(script_url_str, "", {script_location});
+ builder.AddIndexEntry(urn_uuid_script_url, "", {urn_uuid_script_location});
std::vector<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());
GURL page_url = embedded_test_server()->GetURL("/test.html");
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
- base::string16 expected_title = base::ASCIIToUTF16("Done");
+ std::u16string expected_title = u"ScriptDone:UrnUUIDScriptDone";
content::TitleWatcher title_watcher(web_contents, expected_title);
ui_test_utils::NavigateToURL(browser(), page_url);
EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
- // Check that the script in the web bundle is correctly loaded even when the
+ // Check that the scripts in the web bundle are correctly loaded even when the
// extension intercepted the request.
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -3339,6 +3518,8 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
"window.numWebBundleRequests"));
EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
"window.numScriptRequests"));
+ EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+ "window.numUrnUUIDScriptRequests"));
}
// Ensure web request API can block the requests for the subresources inside the
@@ -3354,6 +3535,10 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
"background": { "scripts": ["background.js"] },
"permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
})");
+ std::string pass_urn_uuid_js_url =
+ "urn:uuid:bf50ad1f-899e-42ca-95ac-ca592aa2ecb5";
+ std::string cancel_urn_uuid_js_url =
+ "urn:uuid:9cc02e52-05b6-466a-8c0e-f22ee86825a8";
std::string opt_extra_info_spec = "'blocking'";
if (GetExtraInfoSpec() == ExtraInfoSpec::kExtraHeaders)
opt_extra_info_spec += ", 'extraHeaders'";
@@ -3361,6 +3546,8 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
base::StringPrintf(R"(
window.numPassScriptRequests = 0;
window.numCancelScriptRequests = 0;
+ window.numUrnUUIDPassScriptRequests = 0;
+ window.numUrnUUIDCancelScriptRequests = 0;
chrome.webRequest.onBeforeRequest.addListener(function(details) {
if (details.url.includes('pass.js')) {
window.numPassScriptRequests++;
@@ -3368,11 +3555,19 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
} else if (details.url.includes('cancel.js')) {
window.numCancelScriptRequests++;
return {cancel: true};
+ } else if (details.url === '%s') {
+ window.numUrnUUIDPassScriptRequests++;
+ return {cancel: false};
+ } else if (details.url === '%s') {
+ window.numUrnUUIDCancelScriptRequests++;
+ return {cancel: true};
}
}, {urls: ['<all_urls>']}, [%s]);
chrome.test.sendMessage('ready');
)",
+ pass_urn_uuid_js_url.c_str(),
+ cancel_urn_uuid_js_url.c_str(),
opt_extra_info_spec.c_str()));
const Extension* extension = nullptr;
{
@@ -3381,7 +3576,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
ASSERT_TRUE(extension);
EXPECT_TRUE(listener.WaitUntilSatisfied());
}
- const char kPageHtml[] = R"(
+ std::string page_html = base::StringPrintf(R"(
<title>Loaded</title>
<body>
<script>
@@ -3390,19 +3585,26 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
const pass_js_url = new URL('./pass.js', location.href).toString();
const cancel_js_url =
new URL('./cancel.js', location.href).toString();
+ const pass_urn_uuid_js_url = '%s';
+ const cancel_urn_uuid_js_url = '%s';
const link = document.createElement('link');
link.rel = 'webbundle';
link.href = wbn_url;
- link.resources = pass_js_url + ' ' + cancel_js_url;
+ link.resources.add(pass_js_url,
+ cancel_js_url,
+ pass_urn_uuid_js_url,
+ cancel_urn_uuid_js_url);
document.body.appendChild(link);
})();
</script>
</body>
- )";
+ )",
+ pass_urn_uuid_js_url.c_str(),
+ cancel_urn_uuid_js_url.c_str());
std::string web_bundle;
RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
- RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+ RegisterRequestHandler("/test.html", "text/html", page_html);
ASSERT_TRUE(StartEmbeddedTestServer());
// Create a web bundle.
@@ -3416,8 +3618,16 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
"document.title = 'script loaded';");
auto cancel_js_location = builder.AddResponse(
{{":status", "200"}, {"content-type", "application/javascript"}}, "");
+ auto urn_uuid_pass_js_location = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}},
+ "document.title = 'urn uuid script loaded';");
+ auto urn_uuid_cancel_js_location = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}}, "");
builder.AddIndexEntry(pass_js_url_str, "", {pass_js_location});
builder.AddIndexEntry(cancel_js_url_str, "", {cancel_js_location});
+ builder.AddIndexEntry(pass_urn_uuid_js_url, "", {urn_uuid_pass_js_location});
+ builder.AddIndexEntry(cancel_urn_uuid_js_url, "",
+ {urn_uuid_cancel_js_location});
std::vector<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());
@@ -3427,19 +3637,34 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
ui_test_utils::NavigateToURL(browser(), page_url);
EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
- base::string16 expected_title = base::ASCIIToUTF16("script loaded");
- content::TitleWatcher title_watcher(web_contents, expected_title);
+ std::u16string expected_title1 = u"script loaded";
+ content::TitleWatcher title_watcher1(web_contents, expected_title1);
EXPECT_TRUE(TryLoadScript("pass.js"));
// Check that the script in the web bundle is correctly loaded even when the
// extension with blocking handler intercepted the request.
- EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+ EXPECT_EQ(expected_title1, title_watcher1.WaitAndGetTitle());
EXPECT_FALSE(TryLoadScript("cancel.js"));
+ std::u16string expected_title2 = u"urn uuid script loaded";
+ content::TitleWatcher title_watcher2(web_contents, expected_title2);
+ EXPECT_TRUE(TryLoadScript(pass_urn_uuid_js_url));
+ // Check that the urn UUID script in the web bundle is correctly loaded even
+ // when the extension with blocking handler intercepted the request.
+ EXPECT_EQ(expected_title2, title_watcher2.WaitAndGetTitle());
+
+ EXPECT_FALSE(TryLoadScript(cancel_urn_uuid_js_url));
+
EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
"window.numPassScriptRequests"));
EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
"window.numCancelScriptRequests"));
+ EXPECT_EQ(1,
+ GetCountFromBackgroundPage(extension, profile(),
+ "window.numUrnUUIDPassScriptRequests"));
+ EXPECT_EQ(
+ 1, GetCountFromBackgroundPage(extension, profile(),
+ "window.numUrnUUIDCancelScriptRequests"));
}
// Ensure web request API can change the headers of the subresources inside the
@@ -3523,8 +3748,110 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, ChangeHeader) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
- base::string16 expected_title =
- base::ASCIIToUTF16("200:bar-changed, inserted");
+ std::u16string expected_title = u"200:bar-changed, inserted";
+ content::TitleWatcher title_watcher(
+ browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
+
+ ui_test_utils::NavigateToURL(browser(), page_url);
+
+ EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+ EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+}
+
+// Ensure web request API can change the response headers of the urn uuid URL
+// subresources inside the web bundle.
+// Note: Currently we can't directly check the response headers of urn uuid URL
+// resources, because CORS requests are not allowed for urn uuid URLs. So we
+// change the content-type header of a JavaScript file and monitor the error
+// handler. Subresources in web bundles should be treated as if an artificial
+// `X-Content-Type-Options: nosniff` header field is set. So when the
+// content-type is not suitable for script execution, the script should fail to
+// load.
+IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
+ ChangeHeaderUrnUuidUrlResource) {
+ std::string uun_uuid_url = "urn:uuid:71940cde-d20b-4fb5-b920-38a58a92c516";
+ // Create an extension that changes the header of the subresources inside the
+ // web bundle.
+ TestExtensionDir test_dir;
+ test_dir.WriteManifest(R"({
+ "name": "Web Request Subresource Web Bundles Test",
+ "manifest_version": 2,
+ "version": "0.1",
+ "background": { "scripts": ["background.js"] },
+ "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
+ })");
+ std::string opt_extra_info_spec = "'blocking', 'responseHeaders'";
+ if (GetExtraInfoSpec() == ExtraInfoSpec::kExtraHeaders)
+ opt_extra_info_spec += ", 'extraHeaders'";
+ test_dir.WriteFile(
+ FILE_PATH_LITERAL("background.js"),
+ base::StringPrintf(R"(
+ chrome.webRequest.onHeadersReceived.addListener(function(details) {
+ if (details.url != '%s') {
+ return;
+ }
+ const headers = details.responseHeaders;
+ for (let i = 0; i < headers.length; i++) {
+ if (headers[i].name.toLowerCase() == 'content-type') {
+ headers[i].value = 'unknown/type';
+ }
+ }
+ return {responseHeaders: headers};
+ }, {urls: ['<all_urls>']}, [%s]);
+
+ chrome.test.sendMessage('ready');
+ )",
+ uun_uuid_url.c_str(), opt_extra_info_spec.c_str()));
+ const Extension* extension = nullptr;
+ {
+ ExtensionTestMessageListener listener("ready", false);
+ extension = LoadExtension(test_dir.UnpackedPath());
+ ASSERT_TRUE(extension);
+ EXPECT_TRUE(listener.WaitUntilSatisfied());
+ }
+ std::string page_html = base::StringPrintf(R"(
+ <title>Loaded</title>
+ <body>
+ <script>
+ (async () => {
+ const wbn_url = new URL('./web_bundle.wbn', location.href).toString();
+ const urn_uuid_url = '%s';
+ const link = document.createElement('link');
+ link.rel = 'webbundle';
+ link.href = wbn_url;
+ link.resources = urn_uuid_url;
+ document.body.appendChild(link);
+ const script = document.createElement('script');
+ script.src = urn_uuid_url;
+ script.addEventListener('error', () => {
+ document.title = 'failed to load';
+ });
+ document.body.appendChild(script);
+ })();
+ </script>
+ </body>
+ )",
+ uun_uuid_url.c_str());
+
+ std::string web_bundle;
+ RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+ RegisterRequestHandler("/test.html", "text/html", page_html);
+ ASSERT_TRUE(StartEmbeddedTestServer());
+
+ // Create a web bundle.
+ web_package::test::WebBundleBuilder builder(uun_uuid_url, "");
+ auto uun_uuid_script = builder.AddResponse(
+ {{":status", "200"}, {"content-type", "application/javascript"}},
+ "document.title = 'loaded';");
+ builder.AddIndexEntry(uun_uuid_url, "", {uun_uuid_script});
+ std::vector<uint8_t> bundle = builder.CreateBundle();
+ web_bundle = std::string(bundle.begin(), bundle.end());
+
+ GURL page_url = embedded_test_server()->GetURL("/test.html");
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+
+ std::u16string expected_title = u"failed to load";
content::TitleWatcher title_watcher(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
@@ -3657,7 +3984,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
ui_test_utils::NavigateToURL(browser(), page_url);
EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
{
- base::string16 expected_title = base::ASCIIToUTF16("redirected");
+ std::u16string expected_title = u"redirected";
content::TitleWatcher title_watcher(web_contents, expected_title);
EXPECT_TRUE(TryLoadScript("redirect.js"));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -3666,8 +3993,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
// In the current implementation, extensions can redirect the request to
// the other resource in the web bundle even if the resource is not listed
// in the resources attribute.
- base::string16 expected_title =
- base::ASCIIToUTF16("redirected_to_unlisted");
+ std::u16string expected_title = u"redirected_to_unlisted";
content::TitleWatcher title_watcher(web_contents, expected_title);
EXPECT_TRUE(TryLoadScript("redirect_to_unlisted.js"));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -3677,6 +4003,9 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest,
EXPECT_FALSE(TryLoadScript("redirect_to_server.js"));
}
+// TODO(crbug.com/1082020) When we implement variant matching of subresource
+// web bundles, we should add test for request header modification.
+
enum class RedirectType {
kOnBeforeRequest,
kOnHeadersReceived,
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
index 6b57d40ab2c..f95ddd838d4 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
@@ -4,6 +4,8 @@
#include "extensions/browser/api/web_request/web_request_event_details.h"
+#include <memory>
+
#include "base/stl_util.h"
#include "base/values.h"
#include "extensions/browser/api/web_request/web_request_api_constants.h"
@@ -29,9 +31,9 @@ TEST(WebRequestEventDetailsTest, WhitelistedCopyForPublicSession) {
orig->render_process_id_ = 1;
orig->extra_info_spec_ = 3;
- orig->request_body_.reset(new base::DictionaryValue);
- orig->request_headers_.reset(new base::ListValue);
- orig->response_headers_.reset(new base::ListValue);
+ orig->request_body_ = std::make_unique<base::DictionaryValue>();
+ orig->request_headers_ = std::make_unique<base::ListValue>();
+ orig->response_headers_ = std::make_unique<base::ListValue>();
for (const char* safe_attr : safe_attributes) {
orig->dict_.SetString(safe_attr, safe_attr);
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
index 95f017a9cdf..4a95a878b29 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -34,6 +34,7 @@ using extensions::Manifest;
using extensions::PermissionsData;
using extensions::WebRequestInfo;
using extensions::WebRequestInfoInitParams;
+using extensions::mojom::ManifestLocation;
class ExtensionWebRequestHelpersTestWithThreadsTest
: public extensions::ExtensionServiceTestBase {
@@ -46,7 +47,7 @@ class ExtensionWebRequestHelpersTestWithThreadsTest
// This extension has Web Request permissions, and *.com a host permission.
scoped_refptr<Extension> com_extension_;
// This extension is the same as com_extension, except it's installed from
- // Manifest::EXTERNAL_POLICY_DOWNLOAD.
+ // ManifestLocation::kExternalPolicyDownload.
scoped_refptr<Extension> com_policy_extension_;
};
@@ -56,28 +57,20 @@ void ExtensionWebRequestHelpersTestWithThreadsTest::SetUp() {
permission_helper_ = extensions::PermissionHelper::Get(browser_context());
std::string error;
- permissionless_extension_ = LoadManifestUnchecked("permissions",
- "web_request_no_host.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- "ext_id_1",
- &error);
+ permissionless_extension_ =
+ LoadManifestUnchecked("permissions", "web_request_no_host.json",
+ ManifestLocation::kInvalidLocation,
+ Extension::NO_FLAGS, "ext_id_1", &error);
ASSERT_TRUE(permissionless_extension_.get()) << error;
- com_extension_ =
- LoadManifestUnchecked("permissions",
- "web_request_com_host_permissions.json",
- Manifest::INVALID_LOCATION,
- Extension::NO_FLAGS,
- "ext_id_2",
- &error);
+ com_extension_ = LoadManifestUnchecked(
+ "permissions", "web_request_com_host_permissions.json",
+ ManifestLocation::kInvalidLocation, Extension::NO_FLAGS, "ext_id_2",
+ &error);
ASSERT_TRUE(com_extension_.get()) << error;
- com_policy_extension_ =
- LoadManifestUnchecked("permissions",
- "web_request_com_host_permissions.json",
- Manifest::EXTERNAL_POLICY_DOWNLOAD,
- Extension::NO_FLAGS,
- "ext_id_3",
- &error);
+ com_policy_extension_ = LoadManifestUnchecked(
+ "permissions", "web_request_com_host_permissions.json",
+ ManifestLocation::kExternalPolicyDownload, Extension::NO_FLAGS,
+ "ext_id_3", &error);
ASSERT_TRUE(com_policy_extension_.get()) << error;
ExtensionRegistry::Get(browser_context())
->AddEnabled(permissionless_extension_);
@@ -108,9 +101,9 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest,
WebRequestPermissions::HideRequest(permission_helper_, request_2));
}
-// Ensure requests made by the local NTP are hidden from extensions. Regression
-// test for crbug.com/931013.
-TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, LocalNTPRequests) {
+// Ensure requests made by the local WebUINTP are hidden from extensions.
+// Regression test for crbug.com/931013.
+TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, LocalWebUINTPRequests) {
const GURL example_com("http://example.com");
auto create_request_params =
@@ -127,7 +120,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, LocalNTPRequests) {
};
url::Origin ntp_origin =
- url::Origin::Create(GURL(chrome::kChromeSearchLocalNtpUrl));
+ url::Origin::Create(GURL(chrome::kChromeUINewTabPageURL));
// Sub-resource browser initiated requests are hidden from extensions.
WebRequestInfoInitParams info_params_1 = create_request_params(
diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
index 24b2f031b62..1c9b20b111c 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -307,10 +307,10 @@ IN_PROC_BROWSER_TEST_F(HangoutServicesBrowserTest,
ASSERT_TRUE(content::ExecuteScript(tab, "browsertestRunAllTests();"));
- content::TitleWatcher title_watcher(tab, base::ASCIIToUTF16("success"));
- title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("failure"));
- base::string16 result = title_watcher.WaitAndGetTitle();
- EXPECT_EQ(base::ASCIIToUTF16("success"), result);
+ content::TitleWatcher title_watcher(tab, u"success");
+ title_watcher.AlsoWaitForTitle(u"failure");
+ std::u16string result = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(u"success", result);
}
#endif // BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION)
diff --git a/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/DIR_METADATA b/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/DIR_METADATA
new file mode 100644
index 00000000000..07a577b37e4
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals>Media>ScreenCapture"
+}
+team_email: "media-capture-dev@chromium.org"
diff --git a/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc b/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc
index d212ed13a78..f940fe43f2c 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc
@@ -63,7 +63,7 @@ WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::Run() {
!network::IsUrlPotentiallyTrustworthy(origin)) {
return RespondNow(Error(kUrlNotSecure));
}
- base::string16 target_name =
+ std::u16string target_name =
base::UTF8ToUTF16(network::IsUrlPotentiallyTrustworthy(origin)
? net::GetHostAndOptionalPort(origin)
: origin.spec());
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
index 3f1decf1d8c..840bf97407c 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
@@ -43,7 +43,8 @@ bool CanEnableAudioDebugRecordingsFromExtension(
if (extension) {
enabled_by_permissions =
extension->permissions_data()->active_permissions().HasAPIPermission(
- extensions::APIPermission::kWebrtcLoggingPrivateAudioDebug);
+ extensions::mojom::APIPermissionID::
+ kWebrtcLoggingPrivateAudioDebug);
}
#endif
return base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
index 476d82faa9c..b707b401be6 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -93,7 +93,7 @@ void InitializeTestMetaData(base::ListValue* parameters) {
meta_data_entry->SetString("value", kTestLoggingSessionIdValue);
std::unique_ptr<base::ListValue> meta_data(new base::ListValue());
meta_data->Append(std::move(meta_data_entry));
- meta_data_entry.reset(new base::DictionaryValue());
+ meta_data_entry = std::make_unique<base::DictionaryValue>();
meta_data_entry->SetString("key", "url");
meta_data_entry->SetString("value", kTestLoggingUrl);
meta_data->Append(std::move(meta_data_entry));
@@ -398,17 +398,21 @@ class WebrtcLoggingPrivateApiTest : public extensions::ExtensionApiTest {
void SetUpPeerConnection(const std::string& session_id = "") {
auto* manager = WebRtcEventLogManager::GetInstance();
- auto* rph =
- web_contents()->GetMainFrame()->GetRenderViewHost()->GetProcess();
- const int render_process_id = rph->GetID();
+ content::RenderFrameHost* render_frame_host =
+ web_contents()->GetMainFrame();
+ const content::GlobalFrameRoutingId frame_id =
+ render_frame_host->GetGlobalFrameRoutingId();
+ const base::ProcessId pid =
+ render_frame_host->GetProcess()->GetProcess().Pid();
const int lid = 0;
- manager->PeerConnectionAdded(render_process_id, lid, base::NullCallback());
+ manager->OnPeerConnectionAdded(frame_id, lid, pid, /*url=*/std::string(),
+ /*rtc_configuration=*/std::string(),
+ /*constraints=*/std::string());
if (!session_id.empty()) {
- manager->PeerConnectionSessionIdSet(render_process_id, lid, session_id,
- base::NullCallback());
+ manager->OnPeerConnectionSessionIdSet(frame_id, lid, session_id);
}
}
@@ -806,7 +810,7 @@ IN_PROC_BROWSER_TEST_F(
IN_PROC_BROWSER_TEST_F(
WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
StartEventLoggingForNeverAddedPeerConnectionFails) {
- // Note that manager->PeerConnectionAdded() is not called.
+ // Note that manager->OnPeerConnectionAdded() is not called.
const std::string session_id = "id";
const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
constexpr bool expect_success = false;
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
index f9336578432..5e02cac3c7f 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
@@ -31,9 +31,10 @@ IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
TestGetLogsDirectoryCreatesWebRtcLogsDirectory) {
base::ScopedAllowBlockingForTesting allow_blocking;
ASSERT_FALSE(base::PathExists(webrtc_logs_path()));
- ASSERT_TRUE(RunPlatformAppTestWithArg(
- "api_test/webrtc_logging_private/get_logs_directory",
- "test_without_directory"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/webrtc_logging_private/get_logs_directory",
+ .custom_arg = "test_without_directory",
+ .launch_as_platform_app = true}))
<< message_;
ASSERT_TRUE(base::PathExists(webrtc_logs_path()));
ASSERT_TRUE(base::IsDirectoryEmpty(webrtc_logs_path()));
@@ -46,17 +47,20 @@ IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
base::FilePath test_file_path = webrtc_logs_path().AppendASCII("test.file");
std::string contents = "test file contents";
ASSERT_TRUE(base::WriteFile(test_file_path, contents));
- ASSERT_TRUE(RunPlatformAppTestWithArg(
- "api_test/webrtc_logging_private/get_logs_directory",
- "test_with_file_in_directory"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/webrtc_logging_private/get_logs_directory",
+ .custom_arg = "test_with_file_in_directory",
+ .launch_as_platform_app = true}))
<< message_;
}
#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
TestNoGetLogsDirectoryPermissionsFromHangoutsExtension) {
- ASSERT_TRUE(RunComponentExtensionTest(
- "api_test/webrtc_logging_private/no_get_logs_directory_permissions"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name =
+ "api_test/webrtc_logging_private/no_get_logs_directory_permissions",
+ .load_as_component = true}))
<< message_;
}
@@ -64,9 +68,10 @@ IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
TestStartAudioDebugRecordingsForWebviewFromApp) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableAudioDebugRecordingsFromExtension);
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/webrtc_logging_private/audio_debug/"
- "start_audio_debug_recordings_for_webview_from_app"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/webrtc_logging_private/audio_debug/"
+ "start_audio_debug_recordings_for_webview_from_app",
+ .launch_as_platform_app = true}))
<< message_;
}
@@ -74,15 +79,17 @@ IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
IN_PROC_BROWSER_TEST_F(
WebrtcLoggingPrivateApiBrowserTest,
TestStartAudioDebugRecordingsForWebviewFromAppWithoutSwitch) {
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/webrtc_logging_private/audio_debug/"
- "start_audio_debug_recordings_for_webview_from_app"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/webrtc_logging_private/audio_debug/"
+ "start_audio_debug_recordings_for_webview_from_app",
+ .launch_as_platform_app = true}))
<< message_;
}
#endif
IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest, TestStartStopStart) {
- ASSERT_TRUE(
- RunPlatformAppTest("api_test/webrtc_logging_private/start_stop_start"))
+ ASSERT_TRUE(RunExtensionTest(
+ {.name = "api_test/webrtc_logging_private/start_stop_start",
+ .launch_as_platform_app = true}))
<< message_;
}
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
index 8e42fec63ac..ae9f5ce99a6 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
@@ -23,6 +23,8 @@
#include "extensions/common/manifest.h"
#include "extensions/common/permissions/permission_set.h"
+using extensions::mojom::APIPermissionID;
+
namespace extensions {
namespace {
constexpr char kExtensionId[] = "abcdefghijklmnopabcdefghijklmnop";
@@ -356,13 +358,13 @@ TEST_F(ExtensionInstallStatusTest, ExtensionBlockedByPermissions) {
// Extension with audio permission is still installable but not with storage.
APIPermissionSet api_permissions;
- api_permissions.insert(APIPermission::kAudio);
+ api_permissions.insert(APIPermissionID::kAudio);
EXPECT_EQ(ExtensionInstallStatus::kInstallable,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
PermissionSet(api_permissions.Clone(), ManifestPermissionSet(),
URLPatternSet(), URLPatternSet())));
- api_permissions.insert(APIPermission::kStorage);
+ api_permissions.insert(APIPermissionID::kStorage);
EXPECT_EQ(ExtensionInstallStatus::kBlockedByPolicy,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
@@ -431,13 +433,13 @@ TEST_F(ExtensionInstallStatusTest, ExtensionBlockedByPermissionsWithUpdateUrl) {
})");
APIPermissionSet api_permissions;
- api_permissions.insert(APIPermission::kAudio);
+ api_permissions.insert(APIPermissionID::kAudio);
EXPECT_EQ(ExtensionInstallStatus::kInstallable,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
PermissionSet(api_permissions.Clone(), ManifestPermissionSet(),
URLPatternSet(), URLPatternSet())));
- api_permissions.insert(APIPermission::kDownloads);
+ api_permissions.insert(APIPermissionID::kDownloads);
EXPECT_EQ(ExtensionInstallStatus::kBlockedByPolicy,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
@@ -508,7 +510,7 @@ TEST_F(ExtensionInstallStatusTest,
// Per-id allowlisted has higher priority than blocked permissions.
APIPermissionSet api_permissions;
- api_permissions.insert(APIPermission::kStorage);
+ api_permissions.insert(APIPermissionID::kStorage);
EXPECT_EQ(ExtensionInstallStatus::kInstallable,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
@@ -533,7 +535,7 @@ TEST_F(ExtensionInstallStatusTest, NonWebstoreUpdateUrlPolicy) {
}
})");
APIPermissionSet api_permissions;
- api_permissions.insert(APIPermission::kDownloads);
+ api_permissions.insert(APIPermissionID::kDownloads);
EXPECT_EQ(ExtensionInstallStatus::kInstallable,
GetWebstoreExtensionInstallStatus(
kExtensionId, profile(), Manifest::Type::TYPE_EXTENSION,
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index 1982ae4822c..ef6d0d7ccec 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h"
#include <stddef.h>
+
+#include <memory>
#include <utility>
#include <vector>
@@ -13,6 +15,7 @@
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -24,11 +27,14 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/webstore_private/extension_install_status.h"
#include "chrome/browser/extensions/crx_installer.h"
+#include "chrome/browser/extensions/extension_allowlist.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/install_tracker.h"
#include "chrome/browser/extensions/scoped_active_install.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/safe_browsing_metrics_collector.h"
+#include "chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h"
#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/signin/identity_manager_factory.h"
@@ -97,6 +103,7 @@ class PendingApprovals {
std::unique_ptr<WebstoreInstaller::Approval> PopApproval(
Profile* profile,
const std::string& id);
+ void Clear();
private:
using ApprovalList =
@@ -126,7 +133,11 @@ std::unique_ptr<WebstoreInstaller::Approval> PendingApprovals::PopApproval(
return approval;
}
}
- return std::unique_ptr<WebstoreInstaller::Approval>();
+ return nullptr;
+}
+
+void PendingApprovals::Clear() {
+ approvals_.clear();
}
api::webstore_private::Result WebstoreInstallHelperResultToApiResult(
@@ -312,6 +323,55 @@ ExtensionInstallStatus AddExtensionToPendingList(const ExtensionId& id,
return new_status;
}
+// Returns the extension's icon if it exists, otherwise the default icon of the
+// extension type.
+gfx::ImageSkia GetIconImage(const SkBitmap& icon, bool is_app) {
+ if (!icon.empty())
+ return gfx::ImageSkia::CreateFrom1xBitmap(icon);
+
+ return is_app ? extensions::util::GetDefaultAppIcon()
+ : extensions::util::GetDefaultExtensionIcon();
+}
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class WebStoreInstallAllowlistParameter {
+ kUndefined = 0,
+ kAllowlisted = 1,
+ kNotAllowlisted = 2,
+ kMaxValue = kNotAllowlisted,
+};
+
+// Track the value of the allowlist parameter received from Chrome Web Store.
+void ReportWebStoreInstallEsbAllowlistParameter(
+ const bool* allowlist_parameter) {
+ WebStoreInstallAllowlistParameter value;
+
+ if (!allowlist_parameter)
+ value = WebStoreInstallAllowlistParameter::kUndefined;
+ else if (*allowlist_parameter)
+ value = WebStoreInstallAllowlistParameter::kAllowlisted;
+ else
+ value = WebStoreInstallAllowlistParameter::kNotAllowlisted;
+
+ base::UmaHistogramEnumeration(
+ "Extensions.WebStoreInstall.EsbAllowlistParameter", value);
+}
+
+// Track if a user accepts to install a not allowlisted extensions.
+void ReportWebStoreInstallNotAllowlistedInstalled(bool installed,
+ bool friction_dialog_shown) {
+ if (friction_dialog_shown) {
+ base::UmaHistogramBoolean(
+ "Extensions.WebStoreInstall.NotAllowlistedInstalledWithFriction",
+ installed);
+ } else {
+ base::UmaHistogramBoolean(
+ "Extensions.WebStoreInstall.NotAllowlistedInstalledWithoutFriction",
+ installed);
+ }
+}
+
} // namespace
// static
@@ -327,14 +387,17 @@ WebstorePrivateApi::PopApprovalForTesting(Profile* profile,
return g_pending_approvals.Get().PopApproval(profile, extension_id);
}
+void WebstorePrivateApi::ClearPendingApprovalsForTesting() {
+ g_pending_approvals.Get().Clear();
+}
+
WebstorePrivateBeginInstallWithManifest3Function::
- WebstorePrivateBeginInstallWithManifest3Function()
- : chrome_details_(this) {}
+ WebstorePrivateBeginInstallWithManifest3Function() = default;
WebstorePrivateBeginInstallWithManifest3Function::
~WebstorePrivateBeginInstallWithManifest3Function() = default;
-base::string16 WebstorePrivateBeginInstallWithManifest3Function::
+std::u16string WebstorePrivateBeginInstallWithManifest3Function::
GetBlockedByPolicyErrorMessageForTesting() const {
return blocked_by_policy_error_message_;
}
@@ -344,6 +407,8 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() {
params_ = Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(params_);
+ profile_ = Profile::FromBrowserContext(browser_context());
+
if (!crx_file::id_util::IdIsValid(details().id)) {
return RespondNow(BuildResponse(api::webstore_private::RESULT_INVALID_ID,
kWebstoreInvalidIdError));
@@ -370,7 +435,8 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() {
kAlreadyInstalledError));
}
ActiveInstallData install_data(details().id);
- scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data));
+ scoped_active_install_ =
+ std::make_unique<ScopedActiveInstall>(tracker, install_data);
network::mojom::URLLoaderFactory* loader_factory = nullptr;
if (!icon_url.is_empty()) {
@@ -433,14 +499,13 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
return;
}
- Profile* profile = chrome_details_.GetProfile();
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
// Check if the supervised user is allowed to install extensions.
// NOTE: we do not block themes.
if (!dummy_extension_->is_theme()) {
SupervisedUserService* service =
- SupervisedUserServiceFactory::GetForProfile(profile);
- if (profile->IsChild() && !service->CanInstallExtensions()) {
+ SupervisedUserServiceFactory::GetForProfile(profile_);
+ if (profile_->IsChild() && !service->CanInstallExtensions()) {
ShowBlockedByParentDialog(
dummy_extension_.get(), web_contents,
base::BindOnce(&WebstorePrivateBeginInstallWithManifest3Function::
@@ -453,7 +518,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
// Check the management policy before the installation process begins.
ExtensionInstallStatus install_status = GetWebstoreExtensionInstallStatus(
- id, profile, dummy_extension_->manifest()->type(),
+ id, profile_, dummy_extension_->manifest()->type(),
PermissionsParser::GetRequiredPermissions(dummy_extension_.get()));
if (install_status == kBlockedByPolicy) {
ShowBlockedByPolicyDialog(
@@ -464,8 +529,8 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
return;
}
- install_prompt_.reset(new ExtensionInstallPrompt(web_contents));
if (install_status == kCanRequest || install_status == kRequestPending) {
+ install_prompt_ = std::make_unique<ExtensionInstallPrompt>(web_contents);
install_prompt_->ShowDialog(
base::BindRepeating(&WebstorePrivateBeginInstallWithManifest3Function::
OnRequestPromptDone,
@@ -477,28 +542,13 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
: ExtensionInstallPrompt::EXTENSION_PENDING_REQUEST_PROMPT),
ExtensionInstallPrompt::GetDefaultShowDialogCallback());
} else {
- auto prompt = std::make_unique<ExtensionInstallPrompt::Prompt>(
- ExtensionInstallPrompt::INSTALL_PROMPT);
+ ReportWebStoreInstallEsbAllowlistParameter(details().esb_allowlist.get());
-#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
-
- if (!dummy_extension_->is_theme()) {
- // We don't prompt for parent permission for themes, so no need
- // to configure the install prompt to indicate that this is a child
- // asking a parent for installation permission.
- prompt->set_requires_parent_permission(profile->IsChild());
- if (profile->IsChild()) {
- prompt->AddObserver(&supervised_user_extensions_metrics_recorder_);
- }
+ if (ShouldShowFrictionDialog(profile_)) {
+ ShowInstallFrictionDialog(web_contents);
+ } else {
+ ShowInstallDialog(web_contents);
}
-#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
-
- install_prompt_->ShowDialog(
- base::BindRepeating(&WebstorePrivateBeginInstallWithManifest3Function::
- OnInstallPromptDone,
- this),
- dummy_extension_.get(), &icon_, std::move(prompt),
- ExtensionInstallPrompt::GetDefaultShowDialogCallback());
}
// Control flow finishes up in OnInstallPromptDone, OnRequestPromptDone or
// OnBlockByPolicyPromptDone.
@@ -537,7 +587,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnParentPermissionDone(
void WebstorePrivateBeginInstallWithManifest3Function::
OnParentPermissionReceived() {
SupervisedUserService* service =
- SupervisedUserServiceFactory::GetForProfile(chrome_details_.GetProfile());
+ SupervisedUserServiceFactory::GetForProfile(profile_);
service->AddExtensionApproval(*dummy_extension_);
HandleInstallProceed();
@@ -572,8 +622,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::
bool WebstorePrivateBeginInstallWithManifest3Function::
PromptForParentApproval() {
- Profile* profile = chrome_details_.GetProfile();
- DCHECK(profile->IsChild());
+ DCHECK(profile_->IsChild());
content::WebContents* web_contents = GetSenderWebContents();
if (!web_contents) {
// The browser window has gone away.
@@ -588,7 +637,7 @@ bool WebstorePrivateBeginInstallWithManifest3Function::
parent_permission_dialog_ =
ParentPermissionDialog::CreateParentPermissionDialogForExtension(
- profile, web_contents->GetTopLevelNativeWindow(),
+ profile_, web_contents->GetTopLevelNativeWindow(),
gfx::ImageSkia::CreateFrom1xBitmap(icon_), dummy_extension_.get(),
std::move(done_callback));
parent_permission_dialog_->ShowDialog();
@@ -606,6 +655,40 @@ void WebstorePrivateBeginInstallWithManifest3Function::
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+void WebstorePrivateBeginInstallWithManifest3Function::OnFrictionPromptDone(
+ bool result) {
+ content::WebContents* web_contents = GetSenderWebContents();
+ if (!result || !web_contents) {
+ ReportWebStoreInstallNotAllowlistedInstalled(
+ /*installed=*/false, /*friction_dialog_shown=*/true);
+
+ Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
+ kWebstoreUserCancelledError));
+ // Matches the AddRef in Run().
+ Release();
+ return;
+ }
+
+ ReportFrictionAcceptedEvent();
+ ShowInstallDialog(web_contents);
+}
+
+void WebstorePrivateBeginInstallWithManifest3Function::
+ ReportFrictionAcceptedEvent() {
+ if (!profile_) {
+ return;
+ }
+ auto* metrics_collector =
+ safe_browsing::SafeBrowsingMetricsCollectorFactory::GetForProfile(
+ profile_);
+ // `metrics_collector` can be null in incognito.
+ if (metrics_collector) {
+ metrics_collector->AddSafeBrowsingEventToPref(
+ safe_browsing::SafeBrowsingMetricsCollector::EventType::
+ EXTENSION_ALLOWLIST_INSTALL_BYPASS);
+ }
+}
+
void WebstorePrivateBeginInstallWithManifest3Function::OnInstallPromptDone(
ExtensionInstallPrompt::Result result) {
switch (result) {
@@ -613,11 +696,10 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnInstallPromptDone(
case ExtensionInstallPrompt::Result::ACCEPTED_AND_OPTION_CHECKED: {
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
// Handle parent permission for child accounts on ChromeOS.
- Profile* profile = chrome_details_.GetProfile();
if (!dummy_extension_->is_theme() // Parent permission not required for
// theme installation
- && g_browser_process->profile_manager()->IsValidProfile(profile) &&
- profile->IsChild()) {
+ && g_browser_process->profile_manager()->IsValidProfile(profile_) &&
+ profile_->IsChild()) {
if (PromptForParentApproval()) {
// If are showing parent permission dialog, return instead of
// break, so that we don't release the ref below.
@@ -647,7 +729,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnRequestPromptDone(
ExtensionInstallPrompt::Result result) {
switch (result) {
case ExtensionInstallPrompt::Result::ACCEPTED:
- AddExtensionToPendingList(details().id, chrome_details_.GetProfile());
+ AddExtensionToPendingList(details().id, profile_);
break;
case ExtensionInstallPrompt::Result::USER_CANCELED:
case ExtensionInstallPrompt::Result::ABORTED:
@@ -675,14 +757,14 @@ void WebstorePrivateBeginInstallWithManifest3Function::HandleInstallProceed() {
// allowlist entry is only valid for some number of minutes.
std::unique_ptr<WebstoreInstaller::Approval> approval(
WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
- chrome_details_.GetProfile(), details().id,
- std::move(parsed_manifest_), false));
+ profile_, details().id, std::move(parsed_manifest_), false));
approval->use_app_installed_bubble = !!details().app_install_bubble;
// If we are enabling the launcher, we should not show the app list in order
// to train the user to open it themselves at least once.
approval->skip_post_install_ui = !!details().enable_launcher;
approval->dummy_extension = dummy_extension_.get();
approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_);
+ approval->bypassed_safebrowsing_friction = friction_dialog_shown_;
if (details().authuser)
approval->authuser = *details().authuser;
g_pending_approvals.Get().PushApproval(std::move(approval));
@@ -695,6 +777,12 @@ void WebstorePrivateBeginInstallWithManifest3Function::HandleInstallProceed() {
// specific histogram here.
ExtensionService::RecordPermissionMessagesHistogram(
dummy_extension_.get(), "WebStoreInstall");
+
+ // Record when the user accepted to install a not allowlisted extension.
+ if (details().esb_allowlist && !*details().esb_allowlist) {
+ ReportWebStoreInstallNotAllowlistedInstalled(
+ /*installed=*/true, friction_dialog_shown_);
+ }
Respond(BuildResponse(api::webstore_private::RESULT_SUCCESS, std::string()));
}
@@ -713,6 +801,11 @@ void WebstorePrivateBeginInstallWithManifest3Function::HandleInstallAbort(
ExtensionService::RecordPermissionMessagesHistogram(dummy_extension_.get(),
histogram_name.c_str());
+ if (details().esb_allowlist && !*details().esb_allowlist) {
+ ReportWebStoreInstallNotAllowlistedInstalled(
+ /*installed=*/false, friction_dialog_shown_);
+ }
+
Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
kWebstoreUserCancelledError));
}
@@ -736,6 +829,59 @@ WebstorePrivateBeginInstallWithManifest3Function::CreateResults(
return BeginInstallWithManifest3::Results::Create(result);
}
+bool WebstorePrivateBeginInstallWithManifest3Function::ShouldShowFrictionDialog(
+ Profile* profile) {
+ // Consider an extension to be allowlisted if either we have no indication in
+ // the `esb_allowlist` param or if the param is explicitly set.
+ bool consider_allowlisted =
+ !details().esb_allowlist || *details().esb_allowlist;
+
+ // Never show friction if the extension is considered allowlisted.
+ if (consider_allowlisted)
+ return false;
+
+ // Only show friction if the allowlist warnings are enabled for the profile.
+ auto* extension_system = ExtensionSystem::Get(profile);
+ return extension_system->extension_service()->allowlist()->warnings_enabled();
+}
+
+void WebstorePrivateBeginInstallWithManifest3Function::
+ ShowInstallFrictionDialog(content::WebContents* contents) {
+ friction_dialog_shown_ = true;
+ chrome::ShowExtensionInstallFrictionDialog(
+ contents,
+ base::BindOnce(&WebstorePrivateBeginInstallWithManifest3Function::
+ OnFrictionPromptDone,
+ this));
+}
+
+void WebstorePrivateBeginInstallWithManifest3Function::ShowInstallDialog(
+ content::WebContents* contents) {
+ auto prompt = std::make_unique<ExtensionInstallPrompt::Prompt>(
+ ExtensionInstallPrompt::INSTALL_PROMPT);
+
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ if (!dummy_extension_->is_theme()) {
+ const bool is_child = profile_->IsChild();
+ // We don't prompt for parent permission for themes, so no need
+ // to configure the install prompt to indicate that this is a child
+ // asking a parent for installation permission.
+ prompt->set_requires_parent_permission(is_child);
+ if (is_child) {
+ prompt->AddObserver(&supervised_user_extensions_metrics_recorder_);
+ }
+ }
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
+ install_prompt_ = std::make_unique<ExtensionInstallPrompt>(contents);
+ install_prompt_->ShowDialog(
+ base::BindOnce(&WebstorePrivateBeginInstallWithManifest3Function::
+ OnInstallPromptDone,
+ this),
+ dummy_extension_.get(), &icon_, std::move(prompt),
+ ExtensionInstallPrompt::GetDefaultShowDialogCallback());
+}
+
void WebstorePrivateBeginInstallWithManifest3Function::
ShowBlockedByPolicyDialog(const Extension* extension,
const SkBitmap& icon,
@@ -755,11 +901,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::
base::UTF8ToUTF16(message_from_admin));
}
- gfx::ImageSkia image =
- (icon.empty()
- ? (extension->is_app() ? extensions::util::GetDefaultAppIcon()
- : extensions::util::GetDefaultExtensionIcon())
- : gfx::ImageSkia::CreateFrom1xBitmap(icon));
+ gfx::ImageSkia image = GetIconImage(icon, extension->is_app());
if (extensions::ScopedTestDialogAutoConfirm::GetAutoConfirmValue() !=
extensions::ScopedTestDialogAutoConfirm::NONE) {
@@ -774,7 +916,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::
}
WebstorePrivateCompleteInstallFunction::
- WebstorePrivateCompleteInstallFunction() : chrome_details_(this) {}
+ WebstorePrivateCompleteInstallFunction() = default;
WebstorePrivateCompleteInstallFunction::
~WebstorePrivateCompleteInstallFunction() = default;
@@ -784,19 +926,19 @@ WebstorePrivateCompleteInstallFunction::Run() {
std::unique_ptr<CompleteInstall::Params> params(
CompleteInstall::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
+ Profile* const profile = Profile::FromBrowserContext(browser_context());
// TODO(https://crbug.com/1125475): Enable Extensions for Ephemeral Guest
// profiles.
- if (chrome_details_.GetProfile()->IsGuestSession() ||
- chrome_details_.GetProfile()->IsEphemeralGuestProfile() ||
- chrome_details_.GetProfile()->IsOffTheRecord()) {
+ if (profile->IsGuestSession() || profile->IsEphemeralGuestProfile() ||
+ profile->IsOffTheRecord()) {
return RespondNow(Error(kIncognitoError));
}
if (!crx_file::id_util::IdIsValid(params->expected_id))
return RespondNow(Error(kWebstoreInvalidIdError));
- approval_ = g_pending_approvals.Get().PopApproval(
- chrome_details_.GetProfile(), params->expected_id);
+ approval_ =
+ g_pending_approvals.Get().PopApproval(profile, params->expected_id);
if (!approval_) {
return RespondNow(Error(kNoPreviousBeginInstallWithManifestError,
params->expected_id));
@@ -808,8 +950,8 @@ WebstorePrivateCompleteInstallFunction::Run() {
Error(function_constants::kCouldNotFindSenderWebContents));
}
- scoped_active_install_.reset(new ScopedActiveInstall(
- InstallTracker::Get(browser_context()), params->expected_id));
+ scoped_active_install_ = std::make_unique<ScopedActiveInstall>(
+ InstallTracker::Get(browser_context()), params->expected_id);
// Balanced in OnExtensionInstallSuccess() or OnExtensionInstallFailure().
AddRef();
@@ -817,8 +959,8 @@ WebstorePrivateCompleteInstallFunction::Run() {
// The extension will install through the normal extension install flow, but
// the allowlist entry will bypass the normal permissions install dialog.
scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller(
- chrome_details_.GetProfile(), this, web_contents, params->expected_id,
- std::move(approval_), WebstoreInstaller::INSTALL_SOURCE_OTHER);
+ profile, this, web_contents, params->expected_id, std::move(approval_),
+ WebstoreInstaller::INSTALL_SOURCE_OTHER);
installer->Start();
return RespondLater();
@@ -861,7 +1003,7 @@ void WebstorePrivateCompleteInstallFunction::OnInstallSuccess(
}
WebstorePrivateEnableAppLauncherFunction::
- WebstorePrivateEnableAppLauncherFunction() : chrome_details_(this) {}
+ WebstorePrivateEnableAppLauncherFunction() = default;
WebstorePrivateEnableAppLauncherFunction::
~WebstorePrivateEnableAppLauncherFunction() {}
@@ -874,7 +1016,7 @@ WebstorePrivateEnableAppLauncherFunction::Run() {
}
WebstorePrivateGetBrowserLoginFunction::
- WebstorePrivateGetBrowserLoginFunction() : chrome_details_(this) {}
+ WebstorePrivateGetBrowserLoginFunction() = default;
WebstorePrivateGetBrowserLoginFunction::
~WebstorePrivateGetBrowserLoginFunction() {}
@@ -882,26 +1024,27 @@ WebstorePrivateGetBrowserLoginFunction::
ExtensionFunction::ResponseAction
WebstorePrivateGetBrowserLoginFunction::Run() {
GetBrowserLogin::Results::Info info;
- info.login = IdentityManagerFactory::GetForProfile(
- chrome_details_.GetProfile()->GetOriginalProfile())
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
- .email;
+ info.login =
+ IdentityManagerFactory::GetForProfile(
+ Profile::FromBrowserContext(browser_context())->GetOriginalProfile())
+ ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
+ .email;
return RespondNow(ArgumentList(GetBrowserLogin::Results::Create(info)));
}
-WebstorePrivateGetStoreLoginFunction::
- WebstorePrivateGetStoreLoginFunction() : chrome_details_(this) {}
+WebstorePrivateGetStoreLoginFunction::WebstorePrivateGetStoreLoginFunction() =
+ default;
WebstorePrivateGetStoreLoginFunction::
~WebstorePrivateGetStoreLoginFunction() {}
ExtensionFunction::ResponseAction WebstorePrivateGetStoreLoginFunction::Run() {
return RespondNow(ArgumentList(GetStoreLogin::Results::Create(
- GetWebstoreLogin(chrome_details_.GetProfile()))));
+ GetWebstoreLogin(Profile::FromBrowserContext(browser_context())))));
}
-WebstorePrivateSetStoreLoginFunction::
- WebstorePrivateSetStoreLoginFunction() : chrome_details_(this) {}
+WebstorePrivateSetStoreLoginFunction::WebstorePrivateSetStoreLoginFunction() =
+ default;
WebstorePrivateSetStoreLoginFunction::
~WebstorePrivateSetStoreLoginFunction() {}
@@ -910,7 +1053,8 @@ ExtensionFunction::ResponseAction WebstorePrivateSetStoreLoginFunction::Run() {
std::unique_ptr<SetStoreLogin::Params> params(
SetStoreLogin::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- SetWebstoreLogin(chrome_details_.GetProfile(), params->login);
+ SetWebstoreLogin(Profile::FromBrowserContext(browser_context()),
+ params->login);
return RespondNow(NoArguments());
}
@@ -948,14 +1092,14 @@ WebstorePrivateGetIsLauncherEnabledFunction::Run() {
}
WebstorePrivateIsInIncognitoModeFunction::
- WebstorePrivateIsInIncognitoModeFunction() : chrome_details_(this) {}
+ WebstorePrivateIsInIncognitoModeFunction() = default;
WebstorePrivateIsInIncognitoModeFunction::
~WebstorePrivateIsInIncognitoModeFunction() {}
ExtensionFunction::ResponseAction
WebstorePrivateIsInIncognitoModeFunction::Run() {
- Profile* profile = chrome_details_.GetProfile();
+ Profile* profile = Profile::FromBrowserContext(browser_context());
// TODO(https://crbug.com/1125475): Enable Extensions for Ephemeral Guest
// profiles.
return RespondNow(ArgumentList(IsInIncognitoMode::Results::Create(
@@ -964,7 +1108,7 @@ WebstorePrivateIsInIncognitoModeFunction::Run() {
}
WebstorePrivateLaunchEphemeralAppFunction::
- WebstorePrivateLaunchEphemeralAppFunction() : chrome_details_(this) {}
+ WebstorePrivateLaunchEphemeralAppFunction() = default;
WebstorePrivateLaunchEphemeralAppFunction::
~WebstorePrivateLaunchEphemeralAppFunction() {}
@@ -988,8 +1132,7 @@ WebstorePrivateGetEphemeralAppsEnabledFunction::Run() {
}
WebstorePrivateIsPendingCustodianApprovalFunction::
- WebstorePrivateIsPendingCustodianApprovalFunction()
- : chrome_details_(this) {}
+ WebstorePrivateIsPendingCustodianApprovalFunction() = default;
WebstorePrivateIsPendingCustodianApprovalFunction::
~WebstorePrivateIsPendingCustodianApprovalFunction() {}
@@ -1000,11 +1143,8 @@ WebstorePrivateIsPendingCustodianApprovalFunction::Run() {
IsPendingCustodianApproval::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- Profile* profile = chrome_details_.GetProfile();
-
- if (!profile->IsSupervised()) {
+ if (!Profile::FromBrowserContext(browser_context())->IsSupervised())
return RespondNow(BuildResponse(false));
- }
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
@@ -1033,15 +1173,14 @@ WebstorePrivateIsPendingCustodianApprovalFunction::BuildResponse(bool result) {
}
WebstorePrivateGetReferrerChainFunction::
- WebstorePrivateGetReferrerChainFunction()
- : chrome_details_(this) {}
+ WebstorePrivateGetReferrerChainFunction() = default;
WebstorePrivateGetReferrerChainFunction::
~WebstorePrivateGetReferrerChainFunction() {}
ExtensionFunction::ResponseAction
WebstorePrivateGetReferrerChainFunction::Run() {
- Profile* profile = chrome_details_.GetProfile();
+ Profile* profile = Profile::FromBrowserContext(browser_context());
if (!SafeBrowsingNavigationObserverManager::IsEnabledAndReady(profile))
return RespondNow(ArgumentList(
api::webstore_private::GetReferrerChain::Results::Create("")));
@@ -1089,8 +1228,7 @@ WebstorePrivateGetReferrerChainFunction::Run() {
}
WebstorePrivateGetExtensionStatusFunction::
- WebstorePrivateGetExtensionStatusFunction()
- : chrome_details_(this) {}
+ WebstorePrivateGetExtensionStatusFunction() = default;
WebstorePrivateGetExtensionStatusFunction::
~WebstorePrivateGetExtensionStatusFunction() = default;
@@ -1100,7 +1238,6 @@ WebstorePrivateGetExtensionStatusFunction::Run() {
GetExtensionStatus::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
- Profile* profile = chrome_details_.GetProfile();
const ExtensionId& extension_id = params->id;
if (!crx_file::id_util::IdIsValid(extension_id)) {
@@ -1108,7 +1245,7 @@ WebstorePrivateGetExtensionStatusFunction::Run() {
}
if (!params->manifest)
- return RespondNow(BuildResponseWithoutManifest(extension_id, profile));
+ return RespondNow(BuildResponseWithoutManifest(extension_id));
data_decoder::DataDecoder::ParseJsonIsolated(
*(params->manifest),
@@ -1120,10 +1257,9 @@ WebstorePrivateGetExtensionStatusFunction::Run() {
ExtensionFunction::ResponseValue
WebstorePrivateGetExtensionStatusFunction::BuildResponseWithoutManifest(
- const ExtensionId& extension_id,
- Profile* profile) {
- ExtensionInstallStatus status =
- GetWebstoreExtensionInstallStatus(extension_id, profile);
+ const ExtensionId& extension_id) {
+ ExtensionInstallStatus status = GetWebstoreExtensionInstallStatus(
+ extension_id, Profile::FromBrowserContext(browser_context()));
api::webstore_private::ExtensionInstallStatus api_status =
ConvertExtensionInstallStatusForAPI(status);
return ArgumentList(GetExtensionStatus::Results::Create(api_status));
@@ -1137,14 +1273,14 @@ void WebstorePrivateGetExtensionStatusFunction::OnManifestParsed(
return;
}
- if (!g_browser_process->profile_manager()->IsValidProfile(
- chrome_details_.GetProfile())) {
+ Profile* const profile = Profile::FromBrowserContext(browser_context());
+ if (!g_browser_process->profile_manager()->IsValidProfile(profile)) {
Respond(Error(kWebstoreUserCancelledError));
}
std::string error;
auto dummy_extension =
- Extension::Create(base::FilePath(), Manifest::INTERNAL,
+ Extension::Create(base::FilePath(), mojom::ManifestLocation::kInternal,
base::Value::AsDictionaryValue(*result.value),
Extension::FROM_WEBSTORE, extension_id, &error);
@@ -1154,7 +1290,7 @@ void WebstorePrivateGetExtensionStatusFunction::OnManifestParsed(
}
ExtensionInstallStatus status = GetWebstoreExtensionInstallStatus(
- extension_id, chrome_details_.GetProfile(), dummy_extension->GetType(),
+ extension_id, profile, dummy_extension->GetType(),
PermissionsParser::GetRequiredPermissions(dummy_extension.get()));
api::webstore_private::ExtensionInstallStatus api_status =
ConvertExtensionInstallStatusForAPI(status);
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
index b4b3e646698..d21e0bc299f 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -8,10 +8,8 @@
#include <memory>
#include <string>
-#include "base/strings/string16.h"
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_delegate.h"
#include "chrome/browser/extensions/active_install_data.h"
-#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/extensions/extension_install_prompt.h"
#include "chrome/browser/extensions/webstore_install_helper.h"
#include "chrome/browser/extensions/webstore_installer.h"
@@ -28,6 +26,8 @@
#include "chrome/browser/ui/supervised_user/parent_permission_dialog.h"
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+class Profile;
+
namespace content {
class GpuFeatureChecker;
}
@@ -49,6 +49,9 @@ class WebstorePrivateApi {
static std::unique_ptr<WebstoreInstaller::Approval> PopApprovalForTesting(
Profile* profile,
const std::string& extension_id);
+
+ // Clear the pending approvals. This should be used for testing only.
+ static void ClearPendingApprovalsForTesting();
};
class WebstorePrivateBeginInstallWithManifest3Function
@@ -60,7 +63,10 @@ class WebstorePrivateBeginInstallWithManifest3Function
WebstorePrivateBeginInstallWithManifest3Function();
- base::string16 GetBlockedByPolicyErrorMessageForTesting() const;
+ std::u16string GetBlockedByPolicyErrorMessageForTesting() const;
+ bool GetFrictionDialogShownForTesting() const {
+ return friction_dialog_shown_;
+ }
private:
using Params = api::webstore_private::BeginInstallWithManifest3::Params;
@@ -95,6 +101,7 @@ class WebstorePrivateBeginInstallWithManifest3Function
void OnBlockedByParentDialogDone();
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ void OnFrictionPromptDone(bool result);
void OnInstallPromptDone(ExtensionInstallPrompt::Result result);
void OnRequestPromptDone(ExtensionInstallPrompt::Result result);
void OnBlockByPolicyPromptDone();
@@ -108,6 +115,10 @@ class WebstorePrivateBeginInstallWithManifest3Function
std::unique_ptr<base::ListValue> CreateResults(
api::webstore_private::Result result) const;
+ bool ShouldShowFrictionDialog(Profile* profile);
+ void ShowInstallFrictionDialog(content::WebContents* contents);
+ void ShowInstallDialog(content::WebContents* contents);
+
// Shows block dialog when |extension| is blocked by policy on the Window that
// |contents| belongs to. |done_callback| will be invoked once the dialog is
// closed by user.
@@ -117,12 +128,17 @@ class WebstorePrivateBeginInstallWithManifest3Function
content::WebContents* contents,
base::OnceClosure done_callback);
- const Params::Details& details() const { return params_->details; }
+ // Adds friction accepted events to Safe Browsing metrics collector for
+ // further metrics logging. Called when a user decides to accept the friction
+ // prompt. Note that the extension may not be eventually installed.
+ void ReportFrictionAcceptedEvent();
- ChromeExtensionFunctionDetails chrome_details_;
+ const Params::Details& details() const { return params_->details; }
std::unique_ptr<Params> params_;
+ Profile* profile_ = nullptr;
+
std::unique_ptr<ScopedActiveInstall> scoped_active_install_;
std::unique_ptr<base::DictionaryValue> parsed_manifest_;
@@ -132,7 +148,7 @@ class WebstorePrivateBeginInstallWithManifest3Function
// ExtensionInstallPrompt to prompt for confirmation of the install.
scoped_refptr<Extension> dummy_extension_;
- base::string16 blocked_by_policy_error_message_;
+ std::u16string blocked_by_policy_error_message_;
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
std::unique_ptr<ParentPermissionDialog> parent_permission_dialog_;
@@ -141,6 +157,8 @@ class WebstorePrivateBeginInstallWithManifest3Function
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
std::unique_ptr<ExtensionInstallPrompt> install_prompt_;
+
+ bool friction_dialog_shown_ = false;
};
class WebstorePrivateCompleteInstallFunction
@@ -167,8 +185,6 @@ class WebstorePrivateCompleteInstallFunction
void OnInstallSuccess(const std::string& id);
- ChromeExtensionFunctionDetails chrome_details_;
-
std::unique_ptr<WebstoreInstaller::Approval> approval_;
std::unique_ptr<ScopedActiveInstall> scoped_active_install_;
};
@@ -185,8 +201,6 @@ class WebstorePrivateEnableAppLauncherFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateGetBrowserLoginFunction : public ExtensionFunction {
@@ -201,8 +215,6 @@ class WebstorePrivateGetBrowserLoginFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateGetStoreLoginFunction : public ExtensionFunction {
@@ -217,8 +229,6 @@ class WebstorePrivateGetStoreLoginFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateSetStoreLoginFunction : public ExtensionFunction {
@@ -233,8 +243,6 @@ class WebstorePrivateSetStoreLoginFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateGetWebGLStatusFunction : public ExtensionFunction {
@@ -283,8 +291,6 @@ class WebstorePrivateIsInIncognitoModeFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateLaunchEphemeralAppFunction : public ExtensionFunction {
@@ -306,8 +312,6 @@ class WebstorePrivateLaunchEphemeralAppFunction : public ExtensionFunction {
ExtensionFunction::ResponseValue BuildResponse(
api::webstore_private::Result result,
const std::string& error);
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateGetEphemeralAppsEnabledFunction
@@ -340,8 +344,6 @@ class WebstorePrivateIsPendingCustodianApprovalFunction
ExtensionFunction::ResponseAction Run() override;
ExtensionFunction::ResponseValue BuildResponse(bool result);
-
- ChromeExtensionFunctionDetails chrome_details_;
};
class WebstorePrivateGetReferrerChainFunction : public ExtensionFunction {
@@ -357,8 +359,6 @@ class WebstorePrivateGetReferrerChainFunction : public ExtensionFunction {
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(WebstorePrivateGetReferrerChainFunction);
};
@@ -373,16 +373,13 @@ class WebstorePrivateGetExtensionStatusFunction : public ExtensionFunction {
~WebstorePrivateGetExtensionStatusFunction() override;
ExtensionFunction::ResponseValue BuildResponseWithoutManifest(
- const ExtensionId& extension_id,
- Profile* profile);
+ const ExtensionId& extension_id);
void OnManifestParsed(const ExtensionId& extension_id,
data_decoder::DataDecoder::ValueOrError result);
// ExtensionFunction:
ExtensionFunction::ResponseAction Run() override;
- ChromeExtensionFunctionDetails chrome_details_;
-
DISALLOW_COPY_AND_ASSIGN(WebstorePrivateGetExtensionStatusFunction);
};
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index 3efe251fb99..95f9f5baf25 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
#include <vector>
#include "base/files/file_path.h"
@@ -10,6 +11,7 @@
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
@@ -27,6 +29,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_test_util.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "content/public/browser/gpu_data_manager.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
@@ -34,10 +37,12 @@
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
+#include "extensions/browser/allowlist_state.h"
#include "extensions/browser/api/management/management_api.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/install/extension_install_ui.h"
+#include "extensions/common/extension_features.h"
#include "gpu/config/gpu_feature_type.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
@@ -48,7 +53,7 @@
// flag to #if defined(OS_CHROMEOS)
#include "base/test/metrics/histogram_tester.h"
#include "base/test/metrics/user_action_tester.h"
-#include "chrome/browser/chromeos/login/test/logged_in_user_mixin.h"
+#include "chrome/browser/ash/login/test/logged_in_user_mixin.h"
#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
@@ -71,6 +76,8 @@ namespace extensions {
namespace {
+constexpr char kExtensionId[] = "enfkhcelefdadlmkffamgdlgplcionje";
+
class WebstoreInstallListener : public WebstoreInstaller::Delegate {
public:
WebstoreInstallListener()
@@ -148,8 +155,8 @@ class ExtensionWebstorePrivateApiTest : public MixinBasedExtensionApiTest {
ASSERT_TRUE(StartEmbeddedTestServer());
extensions::ExtensionInstallUI::set_disable_ui_for_tests();
- auto_confirm_install_.reset(
- new ScopedTestDialogAutoConfirm(ScopedTestDialogAutoConfirm::ACCEPT));
+ auto_confirm_install_ = std::make_unique<ScopedTestDialogAutoConfirm>(
+ ScopedTestDialogAutoConfirm::ACCEPT);
ASSERT_TRUE(webstore_install_dir_.CreateUniqueTempDir());
webstore_install_dir_copy_ = webstore_install_dir_.GetPath();
@@ -183,7 +190,7 @@ class ExtensionWebstorePrivateApiTest : public MixinBasedExtensionApiTest {
extension_test_util::SetGalleryUpdateURL(crx_url);
GURL page_url = GetTestServerURL(page);
- return RunPageTest(page_url.spec());
+ return RunExtensionTest({.page_url = page_url.spec().c_str()});
}
content::WebContents* GetWebContents() {
@@ -309,12 +316,13 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, AppInstallBubble) {
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IsInIncognitoMode) {
GURL page_url = GetTestServerURL("incognito.html");
- ASSERT_TRUE(RunPageTest(page_url.spec(), kFlagNone, kFlagUseIncognito));
+ ASSERT_TRUE(RunExtensionTest(
+ {.page_url = page_url.spec().c_str(), .open_in_incognito = true}));
}
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IsNotInIncognitoMode) {
GURL page_url = GetTestServerURL("not_incognito.html");
- ASSERT_TRUE(RunPageTest(page_url.spec()));
+ ASSERT_TRUE(RunExtensionTest({.page_url = page_url.spec().c_str()}));
}
// Tests using the iconUrl parameter to the install function.
@@ -325,7 +333,6 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IconUrl) {
// Tests that the Approvals are properly created in beginInstall.
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, BeginInstall) {
std::string appId = "iladmdjkfniedhfhcfoefgojhgaiaccc";
- std::string extensionId = "enfkhcelefdadlmkffamgdlgplcionje";
ASSERT_TRUE(RunInstallTest("begin_install.html", "extension.crx"));
std::unique_ptr<WebstoreInstaller::Approval> approval =
@@ -336,9 +343,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, BeginInstall) {
EXPECT_EQ("2", approval->authuser);
EXPECT_EQ(browser()->profile(), approval->profile);
- approval = WebstorePrivateApi::PopApprovalForTesting(
- browser()->profile(), extensionId);
- EXPECT_EQ(extensionId, approval->extension_id);
+ approval = WebstorePrivateApi::PopApprovalForTesting(browser()->profile(),
+ kExtensionId);
+ EXPECT_EQ(kExtensionId, approval->extension_id);
EXPECT_FALSE(approval->use_app_installed_bubble);
EXPECT_FALSE(approval->skip_post_install_ui);
EXPECT_TRUE(approval->authuser.empty());
@@ -628,7 +635,7 @@ class ExtensionWebstorePrivateGetReferrerChainApiTest
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateGetReferrerChainApiTest,
GetReferrerChain) {
GURL page_url = GetTestServerURLWithReferrers("referrer_chain.html");
- ASSERT_TRUE(RunPageTest(page_url.spec()));
+ ASSERT_TRUE(RunExtensionTest({.page_url = page_url.spec().c_str()}));
}
// Tests that the GetReferrerChain API returns an empty string for profiles
@@ -641,7 +648,60 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateGetReferrerChainApiTest,
pref_service->SetBoolean(prefs::kSafeBrowsingEnabled, false);
GURL page_url = GetTestServerURLWithReferrers("empty_referrer_chain.html");
- ASSERT_TRUE(RunPageTest(page_url.spec()));
+ ASSERT_TRUE(RunExtensionTest({.page_url = page_url.spec().c_str()}));
+}
+
+class ExtensionWebstorePrivateApiAllowlistEnforcementTest
+ : public ExtensionWebstorePrivateApiTest {
+ public:
+ ExtensionWebstorePrivateApiAllowlistEnforcementTest() {
+ feature_list_.InitWithFeatures(
+ {extensions_features::kSafeBrowsingCrxAllowlistShowWarnings,
+ extensions_features::kSafeBrowsingCrxAllowlistAutoDisable},
+ {});
+ }
+
+ private:
+ base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiAllowlistEnforcementTest,
+ EnhancedSafeBrowsingNotAllowlisted) {
+ safe_browsing::SetSafeBrowsingState(browser()->profile()->GetPrefs(),
+ safe_browsing::ENHANCED_PROTECTION);
+ ASSERT_TRUE(
+ RunInstallTest("safebrowsing_not_allowlisted.html", "extension.crx"));
+
+ EXPECT_EQ(ALLOWLIST_NOT_ALLOWLISTED,
+ extension_service()->allowlist()->GetExtensionAllowlistState(
+ kExtensionId));
+ EXPECT_EQ(
+ ALLOWLIST_ACKNOWLEDGE_ENABLED_BY_USER,
+ extension_service()->allowlist()->GetExtensionAllowlistAcknowledgeState(
+ kExtensionId));
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiAllowlistEnforcementTest,
+ EnhancedSafeBrowsingAllowlisted) {
+ safe_browsing::SetSafeBrowsingState(browser()->profile()->GetPrefs(),
+ safe_browsing::ENHANCED_PROTECTION);
+ ASSERT_TRUE(RunInstallTest("safebrowsing_allowlisted.html", "extension.crx"));
+
+ EXPECT_EQ(ALLOWLIST_UNDEFINED,
+ extension_service()->allowlist()->GetExtensionAllowlistState(
+ kExtensionId));
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiAllowlistEnforcementTest,
+ StandardSafeBrowsingNotAllowlisted) {
+ safe_browsing::SetSafeBrowsingState(browser()->profile()->GetPrefs(),
+ safe_browsing::STANDARD_PROTECTION);
+ ASSERT_TRUE(
+ RunInstallTest("safebrowsing_not_allowlisted.html", "extension.crx"));
+
+ EXPECT_EQ(ALLOWLIST_UNDEFINED,
+ extension_service()->allowlist()->GetExtensionAllowlistState(
+ kExtensionId));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
index e8d300d1bf6..1768582f392 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
@@ -24,7 +24,9 @@
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/pref_names.h"
#include "extensions/common/extension_builder.h"
+#include "extensions/common/extension_features.h"
#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
+#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
namespace {
@@ -349,7 +351,7 @@ class WebstorePrivateBeginInstallWithManifest3Test
manifest);
}
- void VerifyExtensionRequestFunctionResult(ExtensionFunction* function) {
+ void VerifyUserCancelledFunctionResult(ExtensionFunction* function) {
const base::Value* result = nullptr;
ASSERT_TRUE(function->GetResultList() &&
function->GetResultList()->Get(0, &result));
@@ -359,7 +361,7 @@ class WebstorePrivateBeginInstallWithManifest3Test
void VerifyBlockedByPolicyFunctionResult(
WebstorePrivateBeginInstallWithManifest3Function* function,
- const base::string16& expected_blocked_message) {
+ const std::u16string& expected_blocked_message) {
const base::Value* result;
ASSERT_TRUE(function->GetResultList() &&
function->GetResultList()->Get(0, &result));
@@ -373,6 +375,8 @@ class WebstorePrivateBeginInstallWithManifest3Test
return ExtensionBuilder("extension").SetID(id).Build();
}
+ ExtensionService* extension_service() { return service_; }
+
private:
ExtensionService* service_ = nullptr;
};
@@ -396,7 +400,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
}
- VerifyExtensionRequestFunctionResult(function.get());
+ VerifyUserCancelledFunctionResult(function.get());
VerifyPendingList({{kExtensionId, base::Time::Now()}}, profile());
// Show pending request dialog which can only be canceled.
@@ -410,7 +414,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
}
- VerifyExtensionRequestFunctionResult(function.get());
+ VerifyUserCancelledFunctionResult(function.get());
VerifyPendingList({{kExtensionId, base::Time::Now()}}, profile());
}
@@ -429,7 +433,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
api_test_utils::RunFunction(function.get(),
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
- VerifyExtensionRequestFunctionResult(function.get());
+ VerifyUserCancelledFunctionResult(function.get());
VerifyPendingList({}, profile());
}
@@ -509,7 +513,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
VerifyPendingList({}, profile());
- VerifyBlockedByPolicyFunctionResult(function.get(), base::string16());
+ VerifyBlockedByPolicyFunctionResult(function.get(), std::u16string());
}
TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
@@ -526,7 +530,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
api_test_utils::RunFunction(function.get(),
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
- VerifyBlockedByPolicyFunctionResult(function.get(), base::string16());
+ VerifyBlockedByPolicyFunctionResult(function.get(), std::u16string());
}
TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
@@ -543,7 +547,7 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
api_test_utils::RunFunction(function.get(),
GenerateArgs(kExtensionId, kExtensionManifest),
profile());
- VerifyBlockedByPolicyFunctionResult(function.get(), base::string16());
+ VerifyBlockedByPolicyFunctionResult(function.get(), std::u16string());
}
TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
@@ -565,4 +569,129 @@ TEST_F(WebstorePrivateBeginInstallWithManifest3Test,
EXPECT_EQ(std::string(), response->GetString());
}
+struct FrictionDialogTestCase {
+ std::string test_name;
+ bool esb_user;
+ std::string esb_allowlist;
+ bool expected_friction_shown;
+ ScopedTestDialogAutoConfirm::AutoConfirm dialog_action =
+ ScopedTestDialogAutoConfirm::ACCEPT;
+};
+
+std::ostream& operator<<(std::ostream& out,
+ const FrictionDialogTestCase& test_case) {
+ out << test_case.test_name;
+ return out;
+}
+
+const FrictionDialogTestCase kFrictionDialogTestCases[] = {
+ {/*test_name=*/"EsbUserAndNotAllowlisted",
+ /*esb_user=*/true,
+ /*esb_allowlist=*/"false",
+ /*expected_friction_shown=*/true},
+
+ {/*test_name=*/"EsbUserAndAllowlisted",
+ /*esb_user=*/true,
+ /*esb_allowlist=*/"true",
+ /*expected_friction_shown=*/false},
+
+ {/*test_name=*/"EsbUserAndUndefined",
+ /*esb_user=*/true,
+ /*esb_allowlist=*/"undefined",
+ /*expected_friction_shown=*/false},
+ {/*test_name=*/"NonEsbUserAndNotAllowlisted",
+ /*esb_user=*/false,
+ /*esb_allowlist=*/"false",
+ /*expected_friction_shown=*/false},
+
+ {/*test_name=*/"CancelFrictionDialog",
+ /*esb_user=*/true,
+ /*esb_allowlist=*/"false",
+ /*expected_friction_shown=*/true,
+ /*dialog_action=*/ScopedTestDialogAutoConfirm::CANCEL}};
+
+class WebstorePrivateBeginInstallWithManifest3FrictionDialogTest
+ : public WebstorePrivateBeginInstallWithManifest3Test,
+ public testing::WithParamInterface<FrictionDialogTestCase> {
+ public:
+ WebstorePrivateBeginInstallWithManifest3FrictionDialogTest() {
+ feature_list_.InitAndEnableFeature(
+ extensions_features::kSafeBrowsingCrxAllowlistShowWarnings);
+ }
+
+ void SetUp() override {
+ WebstorePrivateBeginInstallWithManifest3Test::SetUp();
+
+ // Clear the pending approvals. Leftover approvals can stay pending when
+ // testing the `webstorePrivate.beginInstallWithManifest3` function
+ // without calling `webstorePrivate.completeInstall`.
+ WebstorePrivateApi::ClearPendingApprovalsForTesting();
+ }
+
+ private:
+ base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_P(WebstorePrivateBeginInstallWithManifest3FrictionDialogTest,
+ FrictionDialogTests) {
+ FrictionDialogTestCase test_case = GetParam();
+
+ if (test_case.esb_user) {
+ // Enable Enhanced Protection
+ safe_browsing::SetSafeBrowsingState(profile()->GetPrefs(),
+ safe_browsing::ENHANCED_PROTECTION);
+ }
+ extension_service()->Init();
+
+ std::unique_ptr<content::WebContents> web_contents =
+ content::WebContentsTester::CreateTestWebContents(profile(), nullptr);
+ auto function =
+ base::MakeRefCounted<WebstorePrivateBeginInstallWithManifest3Function>();
+ function->SetRenderFrameHost(web_contents->GetMainFrame());
+ ScopedTestDialogAutoConfirm auto_confirm(test_case.dialog_action);
+
+ std::string args =
+ test_case.esb_allowlist == "undefined"
+ ? base::StringPrintf(R"([{"id":"%s", "manifest":"%s"}])",
+ kExtensionId, kExtensionManifest)
+ : base::StringPrintf(
+ R"([{"id":"%s", "manifest":"%s", "esbAllowlist":%s}])",
+ kExtensionId, kExtensionManifest,
+ test_case.esb_allowlist.c_str());
+
+ if (test_case.dialog_action == ScopedTestDialogAutoConfirm::ACCEPT) {
+ std::unique_ptr<base::Value> response =
+ RunFunctionAndReturnValue(function.get(), args);
+
+ // The API returns empty string when extension is installed successfully.
+ ASSERT_TRUE(response);
+ ASSERT_TRUE(response->is_string());
+ EXPECT_EQ(std::string(), response->GetString());
+ } else {
+ api_test_utils::RunFunction(function.get(), args, profile());
+ VerifyUserCancelledFunctionResult(function.get());
+ }
+
+ EXPECT_EQ(test_case.expected_friction_shown,
+ function->GetFrictionDialogShownForTesting());
+
+ std::unique_ptr<WebstoreInstaller::Approval> approval =
+ WebstorePrivateApi::PopApprovalForTesting(profile(), kExtensionId);
+ if (test_case.dialog_action == ScopedTestDialogAutoConfirm::ACCEPT) {
+ ASSERT_TRUE(approval);
+ EXPECT_EQ(test_case.expected_friction_shown,
+ approval->bypassed_safebrowsing_friction);
+ } else {
+ EXPECT_FALSE(approval);
+ }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ All,
+ WebstorePrivateBeginInstallWithManifest3FrictionDialogTest,
+ testing::ValuesIn(kFrictionDialogTestCases),
+ [](const testing::TestParamInfo<FrictionDialogTestCase>& info) {
+ return info.param.test_name;
+ });
+
} // namespace extensions
diff --git a/chromium/chrome/browser/feature_engagement/BUILD.gn b/chromium/chrome/browser/feature_engagement/BUILD.gn
new file mode 100644
index 00000000000..616b883e200
--- /dev/null
+++ b/chromium/chrome/browser/feature_engagement/BUILD.gn
@@ -0,0 +1,32 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitor.java",
+ "java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitorDelegate.java",
+ "java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java",
+ "java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java",
+ ]
+
+ deps = [
+ "//base:base_java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/tab:java",
+ "//components/feature_engagement/public:public_java",
+ "//components/ukm/android:java",
+ "//content/public/android:content_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_core_core_java",
+ "//ui/android:ui_full_java",
+ ]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+generate_jni("jni_headers") {
+ sources = [ "java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java" ]
+}
diff --git a/chromium/chrome/browser/feed/android/BUILD.gn b/chromium/chrome/browser/feed/android/BUILD.gn
index 69f8f3cafcb..fa4517330f1 100644
--- a/chromium/chrome/browser/feed/android/BUILD.gn
+++ b/chromium/chrome/browser/feed/android/BUILD.gn
@@ -9,28 +9,111 @@ import("//chrome/browser/buildflags.gni")
android_library("java") {
sources = [
+ "java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java",
+ "java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java",
+ "java/src/org/chromium/chrome/browser/feed/FeedUma.java",
+ "java/src/org/chromium/chrome/browser/feed/VideoPreviewsType.java",
+ "java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementCoordinator.java",
+ "java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementItemProperties.java",
+ "java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementItemView.java",
+ "java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementItemViewBinder.java",
+ "java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementMediator.java",
+ "java/src/org/chromium/chrome/browser/feed/settings/FeedAutoplaySettingsFragment.java",
+ "java/src/org/chromium/chrome/browser/feed/settings/RadioButtonGroupVideoPreviewsPreference.java",
"java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java",
"java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroController.java",
+ "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroView.java",
+ "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java",
+ "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java",
]
deps = [
- ":java_resources",
+ ":web_feed_java_resources",
"//base:base_java",
+ "//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/appmenu:java",
+ "//chrome/browser/ui/messages/android:java",
"//chrome/browser/util:java",
+ "//chrome/browser/xsurface:java",
+ "//components/browser_ui/settings/android:java",
"//components/browser_ui/widget/android:java",
+ "//components/favicon/android:java",
+ "//components/feed/core/v2:feedv2_core_java",
+ "//components/url_formatter/android:url_formatter_java",
"//content/public/android:content_main_dex_java",
"//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
+ "//third_party/androidx:androidx_browser_browser_java",
+ "//third_party/androidx:androidx_preference_preference_java",
"//ui/android:ui_no_recycler_view_java",
"//url:gurl_java",
]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
resources_package = "org.chromium.chrome.browser.feed.webfeed"
}
-android_resources("java_resources") {
+android_resources("web_feed_java_resources") {
+ sources = [
+ "java/res/layout/feed_management_activity.xml",
+ "java/res/layout/feed_management_list_item.xml",
+ "java/res/layout/radio_button_group_video_previews_preference.xml",
+ "java/res/layout/web_feed_main_menu_item.xml",
+ "java/res/values/dimens.xml",
+ "java/res/values/styles.xml",
+ "java/res/xml/feed_autoplay_preferences.xml",
+ ]
deps = [
- "//chrome/android:chrome_app_java_resources",
"//chrome/browser/ui/android/strings:ui_strings_grd",
"//chrome/browser/user_education:java_resources",
+ "//components/browser_ui/styles/android:java_resources",
+ "//components/browser_ui/widget/android:java_resources",
+ ]
+}
+
+generate_jni("jni_headers") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java",
+ "java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java",
+ "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java",
+ ]
+}
+
+android_library("javatests") {
+ testonly = true
+
+ sources = [
+ "java/src/org/chromium/chrome/browser/feed/settings/FeedAutoplaySettingsFragmentTest.java",
+ "javatests/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java",
+ "javatests/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java",
+ ]
+
+ deps = [
+ ":java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//chrome/android:chrome_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/settings:test_support_java",
+ "//chrome/browser/ui/android/appmenu:java",
+ "//chrome/browser/ui/messages/android:java",
+ "//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/settings/android:java",
+ "//components/browser_ui/widget/android:java",
+ "//components/favicon/android:java",
+ "//components/feed/core/v2:feedv2_core_java",
+ "//components/prefs/android:java",
+ "//components/url_formatter/android:url_formatter_java",
+ "//components/user_prefs/android:java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/android_deps:espresso_java",
+ "//third_party/android_support_test_runner:runner_java",
+ "//third_party/androidx:androidx_preference_preference_java",
+ "//third_party/androidx:androidx_test_runner_java",
+ "//third_party/junit",
+ "//third_party/mockito:mockito_java",
+ "//ui/android:ui_java_test_support",
+ "//ui/android:ui_no_recycler_view_java",
+ "//url:gurl_java",
]
}
diff --git a/chromium/chrome/browser/feedback/android/BUILD.gn b/chromium/chrome/browser/feedback/android/BUILD.gn
index b3b4628dbeb..9af0435011c 100644
--- a/chromium/chrome/browser/feedback/android/BUILD.gn
+++ b/chromium/chrome/browser/feedback/android/BUILD.gn
@@ -50,7 +50,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//components/browser_ui/util/android:java",
"//components/variations/android:variations_java",
diff --git a/chromium/chrome/browser/flags/BUILD.gn b/chromium/chrome/browser/flags/BUILD.gn
index 1d12d592ded..52e982170c1 100644
--- a/chromium/chrome/browser/flags/BUILD.gn
+++ b/chromium/chrome/browser/flags/BUILD.gn
@@ -19,7 +19,6 @@ android_library("java") {
]
deps = [
"//base:base_java",
- "//base:jni_java",
"//build:chromeos_buildflags",
"//chrome/browser/preferences:java",
"//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chromium/chrome/browser/gsa/BUILD.gn b/chromium/chrome/browser/gsa/BUILD.gn
index 42f664bd1c7..9c4883e0ab9 100644
--- a/chromium/chrome/browser/gsa/BUILD.gn
+++ b/chromium/chrome/browser/gsa/BUILD.gn
@@ -27,5 +27,6 @@ android_library("java") {
"//components/signin/public/android:java",
"//components/sync/android:sync_java",
"//third_party/androidx:androidx_annotation_annotation_java",
+ "//url:gurl_java",
]
}
diff --git a/chromium/chrome/browser/image_descriptions/BUILD.gn b/chromium/chrome/browser/image_descriptions/BUILD.gn
index 3dd3d92d28e..65c48e34925 100644
--- a/chromium/chrome/browser/image_descriptions/BUILD.gn
+++ b/chromium/chrome/browser/image_descriptions/BUILD.gn
@@ -16,7 +16,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/device:java",
"//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
diff --git a/chromium/chrome/browser/image_fetcher/BUILD.gn b/chromium/chrome/browser/image_fetcher/BUILD.gn
index 1e5b5514dac..b1aff44fa56 100644
--- a/chromium/chrome/browser/image_fetcher/BUILD.gn
+++ b/chromium/chrome/browser/image_fetcher/BUILD.gn
@@ -7,7 +7,6 @@ import("//build/config/android/rules.gni")
android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/util:java",
"//components/browser_ui/util/android:java",
diff --git a/chromium/chrome/browser/installable/digital_asset_links/BUILD.gn b/chromium/chrome/browser/installable/digital_asset_links/BUILD.gn
deleted file mode 100644
index abf79d19519..00000000000
--- a/chromium/chrome/browser/installable/digital_asset_links/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2021 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/android/rules.gni")
-
-# Since only one target uses the generated enums, we can leave it as a
-# srcjar. If in the future, more targets want to depend on these enums,
-# we will need to introduce an android_library that contains the srcjar
-# that multiple other targets can depend on.
-java_cpp_enum("enums_srcjar") {
- sources = [ "digital_asset_links_handler.h" ]
-}
diff --git a/chromium/chrome/browser/language/android/BUILD.gn b/chromium/chrome/browser/language/android/BUILD.gn
index 62004420b5a..5685e58b16f 100644
--- a/chromium/chrome/browser/language/android/BUILD.gn
+++ b/chromium/chrome/browser/language/android/BUILD.gn
@@ -9,6 +9,7 @@ android_library("base_module_java") {
sources = [
"java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java",
"java/src/org/chromium/chrome/browser/language/GlobalAppLocaleController.java",
+ "java/src/org/chromium/chrome/browser/language/LanguageSplitInstaller.java",
]
deps = [
"//base:base_java",
@@ -20,12 +21,17 @@ android_library("base_module_java") {
android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/language/settings/AddLanguageFragment.java",
- "java/src/org/chromium/chrome/browser/language/settings/AvailableUiLanguages.java",
+ "java/src/org/chromium/chrome/browser/language/settings/AlwaysTranslateListFragment.java",
+ "java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java",
+ "java/src/org/chromium/chrome/browser/language/settings/ContentLanguagesPreference.java",
"java/src/org/chromium/chrome/browser/language/settings/LanguageItem.java",
+ "java/src/org/chromium/chrome/browser/language/settings/LanguageItemListFragment.java",
+ "java/src/org/chromium/chrome/browser/language/settings/LanguageItemListPreference.java",
"java/src/org/chromium/chrome/browser/language/settings/LanguageItemPickerPreference.java",
"java/src/org/chromium/chrome/browser/language/settings/LanguageListBaseAdapter.java",
- "java/src/org/chromium/chrome/browser/language/settings/LanguageListPreference.java",
+ "java/src/org/chromium/chrome/browser/language/settings/LanguageSettings.java",
"java/src/org/chromium/chrome/browser/language/settings/LanguagesManager.java",
+ "java/src/org/chromium/chrome/browser/language/settings/NeverTranslateListFragment.java",
# Todo(https://crbug.com/1176981): Remove cyclical dependancy with Translate bridge.
"java/src/org/chromium/chrome/browser/translate/TranslateBridge.java",
@@ -34,11 +40,12 @@ android_library("java") {
":base_module_java",
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
+ "//chrome/browser/settings:java",
"//chrome/browser/tab:java",
+ "//chrome/browser/ui/messages/android:java",
"//components/browser_ui/settings/android:java",
"//components/browser_ui/widget/android:java",
"//components/embedder_support/android:browser_context_java",
@@ -67,8 +74,12 @@ android_resources("java_resources") {
"java/res/layout/accept_languages_item.xml",
"java/res/layout/accept_languages_list.xml",
"java/res/layout/add_languages_main.xml",
+ "java/res/layout/language_list_with_add_button.xml",
"java/res/layout/languages_preference.xml",
+ "java/res/layout/preference_category_no_title_or_padding.xml",
"java/res/menu/languages_action_bar_menu.xml",
+ "java/res/xml/languages_detailed_preferences.xml",
+ "java/res/xml/languages_preferences.xml",
]
deps = [
"//chrome/browser/ui/android/strings:ui_strings_grd",
diff --git a/chromium/chrome/browser/lens/BUILD.gn b/chromium/chrome/browser/lens/BUILD.gn
new file mode 100644
index 00000000000..679208a65cf
--- /dev/null
+++ b/chromium/chrome/browser/lens/BUILD.gn
@@ -0,0 +1,82 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+import("//chrome/browser/buildflags.gni")
+
+android_library("java") {
+ sources = [ "java/src/org/chromium/chrome/browser/lens/LensController.java" ]
+
+ deps = [
+ ":java_resources",
+ "//base:base_java",
+ "//chrome/browser/contextmenu:java",
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//ui/android:ui_java",
+ ]
+
+ public_deps = [
+ ":delegate_java",
+ ":util_java",
+ ]
+
+ resources_package = "org.chromium.chrome.browser.lens"
+}
+
+android_library("delegate_java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java",
+ "java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java",
+ ]
+
+ deps = [
+ ":java_resources",
+ ":util_java",
+ "//base:base_java",
+ "//chrome/browser/contextmenu:java",
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//ui/android:ui_java",
+ ]
+ resources_package = "org.chromium.chrome.browser.lens"
+
+ # Add the actual implementation where necessary so that downstream targets
+ # can provide their own implementations.
+ jar_excluded_patterns = [ "*/LensControllerDelegateImpl.class" ]
+}
+
+android_library("delegate_public_impl_java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java",
+ ]
+
+ deps = [
+ ":delegate_java",
+ ":util_java",
+ ]
+}
+
+android_library("util_java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/lens/LensEntryPoint.java",
+ "java/src/org/chromium/chrome/browser/lens/LensFeature.java",
+ "java/src/org/chromium/chrome/browser/lens/LensIntentParams.java",
+ "java/src/org/chromium/chrome/browser/lens/LensMetrics.java",
+ "java/src/org/chromium/chrome/browser/lens/LensQueryParams.java",
+ "java/src/org/chromium/chrome/browser/lens/LensQueryResult.java",
+ "java/src/org/chromium/chrome/browser/lens/LensUma.java",
+ ]
+ deps = [
+ "//base:base_java",
+ "//chrome/browser/flags:java",
+ "//content/public/android:content_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ ]
+}
+
+android_resources("java_resources") {
+ sources = [ "java/res/drawable/lens_icon.xml" ]
+}
diff --git a/chromium/chrome/browser/media/feeds/BUILD.gn b/chromium/chrome/browser/media/feeds/BUILD.gn
deleted file mode 100644
index 7180747ead2..00000000000
--- a/chromium/chrome/browser/media/feeds/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//third_party/protobuf/proto_library.gni")
-
-mojom("mojo_bindings") {
- sources = [ "media_feeds_store.mojom" ]
-
- public_deps = [
- "//services/media_session/public/mojom",
- "//ui/gfx/geometry/mojom",
- "//url/mojom:url_mojom_origin",
- ]
-}
-
-proto_library("proto") {
- sources = [ "media_feeds.proto" ]
-}
diff --git a/chromium/chrome/browser/media/feeds/media_feeds_store.mojom b/chromium/chrome/browser/media/feeds/media_feeds_store.mojom
deleted file mode 100644
index e6fa5922be8..00000000000
--- a/chromium/chrome/browser/media/feeds/media_feeds_store.mojom
+++ /dev/null
@@ -1,478 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module media_feeds.mojom;
-
-import "services/media_session/public/mojom/media_session.mojom";
-import "mojo/public/mojom/base/string16.mojom";
-import "mojo/public/mojom/base/time.mojom";
-import "url/mojom/origin.mojom";
-import "ui/gfx/geometry/mojom/geometry.mojom";
-import "url/mojom/url.mojom";
-import "mojo/public/mojom/base/unguessable_token.mojom";
-
-struct MediaFeed {
- // The ID of the field in storage.
- int64 id;
-
- // The URL for the discovered feed.
- url.mojom.Url url;
-
- // The last time this feed was discovered.
- mojo_base.mojom.Time last_discovery_time;
-
- // The last time this feed was fetched.
- mojo_base.mojom.Time? last_fetch_time;
-
- // Whether the user has forcibly opted out of the feed.
- FeedUserStatus user_status;
-
- // The result of the last fetch of this feed.
- FetchResult last_fetch_result;
-
- // The number of times in a row the feed has failed to be fetched.
- int64 fetch_failed_count;
-
- // The time we previously fetched the feed that did not hit the cache.
- mojo_base.mojom.Time? last_fetch_time_not_cache_hit;
-
- // The number of items in the last feed fetch.
- int64 last_fetch_item_count;
-
- // The number of items in the last feed fetch that are eligible for play next.
- int64 last_fetch_play_next_count;
-
- // A field mask of the content types in the last feed fetch.
- int64 last_fetch_content_types;
-
- // The logos for the feed.
- array<MediaImage> logos;
-
- // A display name for the feed.
- string display_name;
-
- // The audio+video watchtime percentile for this feed's origin. Calculated as
- // the number of other origins with less watchtime divided by the total
- // number of other origins. The value is between 0.0 and 100.0.
- double origin_audio_video_watchtime_percentile;
-
- // The last time this feed was displayed in the UI.
- mojo_base.mojom.Time? last_display_time;
-
- // The number of items in the last feed fetch that has been confirmed as
- // safe by the Safe Search API.
- int64 last_fetch_safe_item_count;
-
- // The reason why the feed has been reset. If not kNone, this means the items
- // have been deleted and the feed status has been reset to default.
- ResetReason reset_reason;
-
- // Token used to invalidate ongoing fetches for the feed. If there is a token
- // mismatch when feed fetch data returns (the reset token when the fetch began
- // does not match the feed's current reset token), the data is stale and
- // shouldn't be stored because the feed has been reset.
- mojo_base.mojom.UnguessableToken? reset_token;
-
- // Contains details about the user signed into the website.
- UserIdentifier? user_identifier;
-
- // If set then changes to the cookie name provided on the feed origin or any
- // associated origin will trigger the feed to be reset.
- string cookie_name_filter;
-
- // The result of safe search checking this media feed.
- SafeSearchResult safe_search_result;
-
- // The aggregate watchtime for the media feed.
- mojo_base.mojom.TimeDelta? aggregate_watchtime;
-
- // The favicon of the page that hosts the Media Feed.
- url.mojom.Url? favicon;
-};
-
-// Contains details about the user signed into the website.
-// https://wicg.github.io/media-feeds/#dfn-currently-logged-in-user
-struct UserIdentifier {
- // The name of the user’s account.
- string name;
-
- // The email address of the users’ account.
- string? email;
-
- // The image of the user’s account.
- MediaImage? image;
-};
-
-// The result of fetching the feed. This enum is committed to storage so do not
-// change the numbering.
-enum FetchResult {
- // The feed has never been fetched.
- kNone = 0,
-
- // The feed was fetched successfully.
- kSuccess = 1,
-
- // The feed failed to fetch because of a backend server error.
- kFailedBackendError = 2,
-
- // The feed failed to fetch because of a network error.
- kFailedNetworkError = 3,
-
- // The feed failed to fetch because the feed data was invalid.
- kInvalidFeed = 4,
-
- // The feed was reset while the feed was being fetched.
- kFailedDueToResetWhileInflight = 5,
-};
-
-// The reason why a feed has been reset. This enum is committed to storage so
-// do not change the numbering.
-enum ResetReason {
- // The feed has not been reset.
- kNone = 0,
-
- // The feed has been reset because the cookies have expired or been deleted
- // on the feed origin.
- kCookies = 1,
-
- // The feed has been reset because the user has visited the feed origin.
- kVisit = 2,
-
- // The feed has been reset because the user cleared the cache.
- kCache = 3,
-};
-
-// Whether the user has forcibly opted out of the feed. This enum is committed
-// to storage so do not change the numbering.
-enum FeedUserStatus {
- // The browser should determine whether to fetch the feed based on metrics.
- kAuto = 0,
-
- // The user has opted out of seeing the feed.
- kDisabled = 1,
-
- // The user has opted into seeing the feed.
- kEnabled = 2,
-};
-
-// The type of the feed item. This enum is committed to storage so do not
-// change the numbering.
-enum MediaFeedItemType {
- // 1 << 0. Any video. https://schema.org/VideoObject
- kVideo = 1,
-
- // 1 << 1. A TV series. https://schema.org/TVSeries
- kTVSeries = 2,
-
- // 1 << 2. A movie. https://schema.org/Movie
- kMovie = 4,
-};
-
-// The action status for the feed item. This enum is committed to storage so
-// do not change the numbering.
-// https://schema.org/actionStatus
-enum MediaFeedItemActionStatus {
- kUnknown = 0,
-
- // The user is currently watching this media.
- // https://schema.org/ActiveActionStatus
- kActive = 1,
-
- // The user has not started watching this media.
- // https://schema.org/PotentialActionStatus
- kPotential = 2,
-
- // The user has finished watching this media.
- // https://schema.org/CompletedActionStatus
- kCompleted = 3,
-};
-
-// Official rating for a piece of content (e.g. MPAA PG-13).
-// https://schema.org/contentRating
-struct ContentRating {
- // The rating agency (e.g. MPAA).
- string agency;
-
- // The content rating.
- string value;
-};
-
-// A counter for a type of interaction e.g. how many likes or dislikes.
-// https://schema.org/InteractionCounter
-enum InteractionCounterType {
- kWatch,
- kLike,
- kDislike,
-};
-
-// The author of the content.
-// https://schema.org/author
-struct Author {
- // A displayable name for the author.
- string name;
-
- // The URL of the author.
- url.mojom.Url url;
-};
-
-// A third party identifier for a piece of content.
-// https://schema.org/identifier
-struct Identifier {
- enum Type {
- kTMSRootId,
- kTMSId,
- kPartnerId,
- };
-
- Type type;
- string value;
-};
-
-// An action to start watching a piece of content.
-// https://schema.org/WatchAction
-struct Action {
- // The URL to watch the content.
- url.mojom.Url url;
-
- // The time the content will start playing.
- mojo_base.mojom.TimeDelta? start_time;
-};
-
-// The content that should be suggested to play next if the user has finished
-// watching the current content.
-struct PlayNextCandidate {
- // A displayable name of the play next content.
- string name;
-
- // The season and episode number of the content.
- int64 season_number;
- int64 episode_number;
-
- // The action to launch the content.
- Action action;
-
- // The duration of the content.
- mojo_base.mojom.TimeDelta duration;
-
- // The identifiers for the content. We will store up to one of each type.
- array<Identifier> identifiers;
-
- // The images for the episode.
- array<MediaImage> images;
-};
-
-// https://schema.org/TVEpisode
-struct TVEpisode {
- // The displayable name of the episode.
- string name;
-
- // The season and episode number of the episode.
- int64 episode_number;
- int64 season_number;
-
- // The duration of the content.
- mojo_base.mojom.TimeDelta duration;
-
- // The identifiers for the episode. We will store up to one of each type.
- array<Identifier> identifiers;
-
- // Information about a live stream event.
- LiveDetails? live;
-
- // The images for the episode.
- array<MediaImage> images;
-};
-
-// Details specific to live content.
-struct LiveDetails {
- // The date/time the feed item became live.
- mojo_base.mojom.Time start_time;
-
- // The date/time the feed item finished becoming live.
- mojo_base.mojom.Time? end_time;
-};
-
-// The result of checking an item against the Safe Search API.
-enum SafeSearchResult {
- // We haven't checked this item against the API.
- kUnknown,
-
- // We checked this item and it was classified as safe.
- kSafe,
-
- // We checked this item and it was classified as unsafe (e.g. adult).
- kUnsafe,
-};
-
-// Content attributes describe the image's type and defines its suggested
-// usages.
-enum ContentAttribute {
- // An unknown or unexpected content attribute.
- kUnknown,
-
- // The image is an artistic render of the show. Usually a poster or banner.
- kIconic,
-
- // The image is a still/framegrab from the media item.
- kSceneStill,
-
- // The image is a poster image for the show.
- kPoster,
-
- // Suitable for being used as a background and does not contain text.
- kBackground,
-
- // The image is suitable for use on a dark background.
- kForDarkBackground,
-
- // The image is suitable for use on a light background.
- kForLightBackground,
-
- // The predominant figure is positioned at the center of the image.
- kCentered,
-
- // The predominant figure is positioned to the right of the image and the left
- // side is empty and can be used for text overlays.
- kRightCentered,
-
- // The predominant figure is positioned to the left of the image and the right
- // side is empty and can be used for text overlays.
- kLeftCentered,
-
- // The image has a transparent background.
- kHasTransparentBackground,
-
- // The content's title appears in the image.
- kHasTitle,
-
- // The content's title does not appear in the image.
- kNoTitle
-};
-
-// A media image for use with media feeds. This can be a thumbnail representing
-// content in a media feed item, or it can be a logo for the feed.
-struct MediaImage {
- // URL of the image
- url.mojom.Url src;
-
- // Size of the image. Width and height in pixels.
- gfx.mojom.Size size;
-
- // Describes the image's type and defines its suggested usages.
- array<ContentAttribute> content_attributes;
-};
-
-// Whether the feed item can be considered "family friendly". If this is not
-// specified then this will be |kUnknown|. This enum is committed to storage
-// so do not change the numbering.
-enum IsFamilyFriendly {
- kUnknown = 0,
- kYes = 1,
- kNo = 2,
-};
-
-// The Media Feed Item is an individual item stored in a Media Feed. It
-// represents a single recommendation such as a video or TV show.
-// https://wicg.github.io/media-feeds/index.html#media-feed-item
-struct MediaFeedItem {
- // The ID of the feed item in storage.
- int64 id;
-
- // The type of this feed item such as a video or TV show.
- MediaFeedItemType type;
-
- // The name of the feed item to be displayed to the user.
- mojo_base.mojom.String16 name;
-
- // The author that created the content.
- Author? author;
-
- // The date/time this feed item was published.
- mojo_base.mojom.Time date_published;
-
- // Whether the media item is considered "family friendly".
- IsFamilyFriendly is_family_friendly;
-
- // The action status for this feed item.
- MediaFeedItemActionStatus action_status;
-
- // The action to be taken on the content.
- Action action;
-
- // The interaction counters for this content (e.g. number of likes).
- map<InteractionCounterType, uint64> interaction_counters;
-
- // The content ratings for this content.
- array<ContentRating> content_ratings;
-
- // The genre of this feed item.
- array<string> genre;
-
- // The duration of this feed item.
- mojo_base.mojom.TimeDelta? duration;
-
- // Information about a live stream event.
- LiveDetails? live;
-
- // The TV episode data associated with the content.
- TVEpisode? tv_episode;
-
- // The content that should be played after this.
- PlayNextCandidate? play_next_candidate;
-
- // The identifiers for the content. We will store up to one of each type.
- array<Identifier> identifiers;
-
- // How many times this feed item has been displayed in the Chrome UI.
- uint64 shown_count;
-
- // Whether the user has previously clicked on this feed item.
- bool clicked;
-
- // The images for the feed item.
- array<MediaImage> images;
-
- // The result of safe search checking this media item.
- SafeSearchResult safe_search_result;
-};
-
-// Information for debugging Media Feeds for the internal WebUI.
-struct DebugInformation {
- // Whether the MediaFeedsSafeSearch feature is enabled.
- bool safe_search_feature_enabled;
-
- // The value of the Media Feeds Safe Search checking consent pref.
- bool safe_search_pref_value;
-
- // Whether the MediaFeedsBackgroundFetching feature is enabled.
- bool background_fetching_feature_enabled;
-
- // The value of the Media Feeds background fetching pref.
- bool background_fetching_pref_value;
-};
-
-// MediaFeedStore allows the Media Feeds WebUI to access data from the Media
-// Feeds backend in the browser process for diagnostic purposes.
-interface MediaFeedsStore {
- // Gets debugging information for media feeds.
- GetDebugInformation() => (DebugInformation info);
-
- // Updates the Safe Search checking enabled pref to |value|.
- SetSafeSearchEnabledPref(bool value) => ();
-
- // Updates the background fetching enabled pref to |value|.
- SetBackgroundFetchingPref(bool value) => ();
-
- // Gets all the discovered media feeds.
- GetMediaFeeds() => (array<MediaFeed> feeds);
-
- // Gets the items for the media feed.
- GetItemsForMediaFeed(int64 feed_id) => (array<MediaFeedItem> items);
-
- // Fetch the details of a previously-discovered media feed and store them in
- // media history. The feed ID is the unique ID for the feed from the Media
- // History store. The logs contain information about any problems fetching or
- // parsing the feed.
- FetchMediaFeed(int64 feed_id) => (string logs);
-};
diff --git a/chromium/chrome/browser/media/router/BUILD.gn b/chromium/chrome/browser/media/router/BUILD.gn
index 78f40a0f380..c9f142c95dc 100644
--- a/chromium/chrome/browser/media/router/BUILD.gn
+++ b/chromium/chrome/browser/media/router/BUILD.gn
@@ -18,11 +18,33 @@ source_set("data_decoder_util") {
]
}
+static_library("media_router_feature") {
+ sources = [
+ "media_router_feature.cc",
+ "media_router_feature.h",
+ ]
+ public_deps = [ "//base" ]
+ deps = [
+ "//chrome/browser/profiles:profile",
+ "//chrome/common:constants",
+ "//components/prefs:prefs",
+ "//components/user_prefs:user_prefs",
+ "//content/public/browser",
+ "//content/public/common",
+ "//crypto",
+ "//extensions/buildflags:buildflags",
+ "//media",
+ "//ui/base:buildflags",
+ ]
+}
+
static_library("router") {
deps = [
":data_decoder_util",
+ ":media_router_feature",
"//base",
"//chrome:strings",
+ "//chrome/browser/profiles",
"//chrome/common:constants",
"//components/cast_channel",
"//components/keyed_service/content",
@@ -42,6 +64,7 @@ static_library("router") {
"//components/media_router/browser",
"//components/media_router/common",
"//components/media_router/common/mojom:media_router",
+ "//components/sessions:sessions",
]
sources = [
"chrome_media_router_factory.cc",
@@ -54,6 +77,9 @@ static_library("router") {
deps += [
"discovery",
"//build:chromeos_buildflags",
+ "//chrome/browser:browser_process",
+ "//chrome/browser/profiles:profile",
+ "//components/embedder_support:browser_util",
"//components/mirroring/mojom:host",
"//components/mirroring/mojom:service",
@@ -65,10 +91,14 @@ static_library("router") {
"//components/paint_preview/buildflags",
"//components/signin/public/base:signin_buildflags",
"//components/translate/content/common",
+ "//components/ukm/content:content",
+ "//components/version_info:version_info",
"//extensions/browser",
"//extensions/buildflags",
"//extensions/common",
"//mojo/public/cpp/bindings",
+ "//services/metrics/public/cpp:ukm_builders",
+ "//third_party/openscreen/src/cast/common/channel/proto:channel_proto",
"//ui/base:buildflags",
]
@@ -141,6 +171,8 @@ static_library("router") {
"mojo/media_route_provider_util_win.cc",
"mojo/media_route_provider_util_win.h",
]
+
+ deps += [ "//chrome/installer/util:with_no_strings" ]
}
if (enable_openscreen) {
@@ -168,6 +200,7 @@ if (!is_android) {
deps = [
"discovery",
"//chrome/test:test_support",
+ "//components/media_router/browser:test_support",
"//components/media_router/common/mojom:media_router",
"//components/media_router/common/mojom:media_router_test_interfaces",
"//extensions/browser",
@@ -201,13 +234,21 @@ source_set("unittests") {
]
deps = [
+ ":media_router_feature",
":router",
"//base",
"//base/test:test_support",
+ "//chrome/test:test_support",
+ "//components/cast_channel:cast_channel",
+ "//components/cast_channel:test_support",
"//components/media_router/browser:test_support",
"//components/media_router/common:test_support",
+ "//content/test:test_support",
+ "//media:test_support",
+ "//services/data_decoder/public/cpp:test_support",
"//testing/gmock",
"//testing/gtest",
+ "//ui/display:test_support",
]
if (!is_android) {
@@ -261,6 +302,7 @@ source_set("unittests") {
]
deps += [
":test_support",
+ "//chrome/browser/media/router/discovery:discovery",
"//chrome/test:test_support",
"//components/sync_preferences:test_support",
"//content/test:test_support",
diff --git a/chromium/chrome/browser/media/router/discovery/BUILD.gn b/chromium/chrome/browser/media/router/discovery/BUILD.gn
index bfbcf9224b8..be0df101a1c 100644
--- a/chromium/chrome/browser/media/router/discovery/BUILD.gn
+++ b/chromium/chrome/browser/media/router/discovery/BUILD.gn
@@ -13,6 +13,7 @@ static_library("discovery") {
"//chrome/app:generated_resources",
"//chrome/browser:browser_process",
"//chrome/browser/media/router:data_decoder_util",
+ "//chrome/browser/media/router:media_router_feature",
"//chrome/common:constants",
"//components/cast_channel",
"//components/media_router/browser",
diff --git a/chromium/chrome/browser/media/router/features.gni b/chromium/chrome/browser/media/router/features.gni
index 854aa06fee7..29a584ebd6c 100644
--- a/chromium/chrome/browser/media/router/features.gni
+++ b/chromium/chrome/browser/media/router/features.gni
@@ -5,9 +5,11 @@
import("//build/config/chrome_build.gni")
declare_args() {
- # Exclude openscreen in NaCl, since there is no packet support
- # in that build configuration. Once NaCl goes away, this check should be
- # removed.
+ # TODO(crbug.com/702997): Exclude openscreen in NaCl, since there is no packet
+ # support in that build configuration. Once NaCl goes away, this check should
+ # be removed.
+ # NOTE: This option refers to the inclusion of code for the Open Screen
+ # Protocol, not the entire openscreen library.
enable_openscreen =
!is_nacl &&
(target_os == "linux" || target_os == "chromeos" || target_os == "mac")
diff --git a/chromium/chrome/browser/media/webrtc/DIR_METADATA b/chromium/chrome/browser/media/webrtc/DIR_METADATA
index 130628707ee..5ae03028de7 100644
--- a/chromium/chrome/browser/media/webrtc/DIR_METADATA
+++ b/chromium/chrome/browser/media/webrtc/DIR_METADATA
@@ -1,3 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
monorail: {
- component: "Blink>WebRTC"
+ component: "UI>Browser>MediaCapture"
}
+team_email: "media-capture-dev@chromium.org"
diff --git a/chromium/chrome/browser/media/webrtc/OWNERS b/chromium/chrome/browser/media/webrtc/OWNERS
index a4c9aee5797..f9d6aa4e6a7 100644
--- a/chromium/chrome/browser/media/webrtc/OWNERS
+++ b/chromium/chrome/browser/media/webrtc/OWNERS
@@ -1,9 +1,6 @@
tommi@chromium.org
guidou@chromium.org
-# For WebRTC desktop capturer related changes only
-braveyao@chromium.org
-
# For WebRTC browser tests.
per-file *webrtc*browsertest*=hbos@chromium.org
@@ -15,6 +12,10 @@ per-file media_stream_capture_indicator*=jophba@chromium.org
per-file media_stream_device*=raymes@chromium.org
per-file media_permission*=raymes@chromium.org
+# For DesktopMediaList and DesktopMediaPicker.
+per-file *desktop_media_list*=eladalon@chromium.org
+per-file *desktop_media_picker*=eladalon@chromium.org
+
# For WebRTC event logging code.
per-file webrtc_event_log_*=eladalon@chromium.org
diff --git a/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
index 4f249120a95..c6d3ee4886f 100644
--- a/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
+++ b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
@@ -11,13 +11,13 @@
#include "components/permissions/permission_request_id.h"
#include "components/permissions/permissions_client.h"
#include "content/public/browser/browser_thread.h"
-#include "third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom-shared.h"
+#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
CameraPanTiltZoomPermissionContext::CameraPanTiltZoomPermissionContext(
content::BrowserContext* browser_context)
: PermissionContextBase(browser_context,
ContentSettingsType::CAMERA_PAN_TILT_ZOOM,
- blink::mojom::FeaturePolicyFeature::kNotFound) {
+ blink::mojom::PermissionsPolicyFeature::kNotFound) {
host_content_settings_map_ =
permissions::PermissionsClient::Get()->GetSettingsMap(browser_context);
host_content_settings_map_->AddObserver(this);
diff --git a/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list.cc b/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list.cc
index c06c55defc2..baa4c3e7e6b 100644
--- a/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list.cc
+++ b/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list.cc
@@ -9,6 +9,7 @@
#include "base/hash/hash.h"
#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
#include "build/build_config.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
@@ -100,7 +101,7 @@ CurrentTabDesktopMediaList::CurrentTabDesktopMediaList(
}
// The source never changes - it always applies to the current tab.
- UpdateSourcesList({SourceDescription(media_id_, base::string16())});
+ UpdateSourcesList({SourceDescription(media_id_, std::u16string())});
}
CurrentTabDesktopMediaList::~CurrentTabDesktopMediaList() = default;
diff --git a/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list_unittest.cc b/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list_unittest.cc
index e95d776804c..cf1b9db5ece 100644
--- a/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/current_tab_desktop_media_list_unittest.cc
@@ -30,8 +30,8 @@
#include "testing/gmock/include/gmock/gmock.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/login/users/scoped_test_user_manager.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
using content::WebContents;
@@ -186,8 +186,8 @@ class CurrentTabDesktopMediaListTest : public testing::Test {
std::unique_ptr<base::RunLoop> run_loop_;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
- chromeos::ScopedTestUserManager test_user_manager_;
+ ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
+ ash::ScopedTestUserManager test_user_manager_;
#endif
DISALLOW_COPY_AND_ASSIGN(CurrentTabDesktopMediaListTest);
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
index 44ac3066857..91bca2f1fc8 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -27,9 +27,11 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/screen_capture_notification_ui.h"
#include "chrome/browser/ui/simple_message_box.h"
+#include "chrome/browser/ui/ui_features.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
+#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_thread.h"
@@ -64,12 +66,13 @@
#endif // defined(OS_MAC)
using content::BrowserThread;
+using extensions::mojom::ManifestLocation;
namespace {
// Helper to get title of the calling application shown in the screen capture
// notification.
-base::string16 GetApplicationTitle(content::WebContents* web_contents,
+std::u16string GetApplicationTitle(content::WebContents* web_contents,
const extensions::Extension* extension) {
// Use extension name as title for extensions and host/origin for drive-by
// web.
@@ -90,8 +93,15 @@ base::string16 GetApplicationTitle(content::WebContents* web_contents,
// notification.
bool ShouldDisplayNotification(const extensions::Extension* extension) {
return !(extension &&
- (extension->location() == extensions::Manifest::COMPONENT ||
- extension->location() == extensions::Manifest::EXTERNAL_COMPONENT));
+ (extension->location() == ManifestLocation::kComponent ||
+ extension->location() == ManifestLocation::kExternalComponent));
+}
+
+// Returns true if an on-screen notification should not be displayed after
+// desktop capture is taken for the |url|.
+bool HasNotificationExemption(const GURL& url) {
+ return (url.spec() == chrome::kChromeUIFeedbackURL &&
+ base::FeatureList::IsEnabled(features::kWebUIFeedback));
}
#if !defined(OS_ANDROID)
@@ -173,7 +183,7 @@ void DesktopCaptureAccessHandler::ProcessScreenCaptureAccessRequest(
MediaCaptureDevicesDispatcher::IsOriginForCasting(
request.security_origin) ||
IsExtensionAllowedForScreenCapture(extension) ||
- IsBuiltInExtension(request.security_origin);
+ IsBuiltInFeedbackUI(request.security_origin);
const bool origin_is_secure =
network::IsUrlPotentiallyTrustworthy(request.security_origin) ||
@@ -197,7 +207,7 @@ void DesktopCaptureAccessHandler::ProcessScreenCaptureAccessRequest(
// chrome::ShowQuestionMessageBox() starts a nested run loop which may
// allow |web_contents| to be destroyed on the UI thread before the messag
// box is closed. See http://crbug.com/326690.
- base::string16 application_title =
+ std::u16string application_title =
GetApplicationTitle(web_contents, extension);
#if !defined(OS_ANDROID)
gfx::NativeWindow parent_window =
@@ -208,13 +218,14 @@ void DesktopCaptureAccessHandler::ProcessScreenCaptureAccessRequest(
// Some extensions do not require user approval, because they provide their
// own user approval UI.
- bool is_approved = IsDefaultApproved(extension);
+ bool is_approved = IsDefaultApproved(extension) ||
+ IsDefaultApproved(request.security_origin);
if (!is_approved) {
- base::string16 application_name =
+ std::u16string application_name =
base::UTF8ToUTF16(request.security_origin.spec());
if (extension)
application_name = base::UTF8ToUTF16(extension->name());
- base::string16 confirmation_text = l10n_util::GetStringFUTF16(
+ std::u16string confirmation_text = l10n_util::GetStringFUTF16(
request.audio_type == blink::mojom::MediaStreamType::NO_SERVICE
? IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TEXT
: IDS_MEDIA_SCREEN_AND_AUDIO_CAPTURE_CONFIRMATION_TEXT,
@@ -254,7 +265,8 @@ void DesktopCaptureAccessHandler::ProcessScreenCaptureAccessRequest(
// Determine if the extension is required to display a notification.
const bool display_notification =
- display_notification_ && ShouldDisplayNotification(extension);
+ display_notification_ && ShouldDisplayNotification(extension) &&
+ !HasNotificationExemption(request.security_origin);
if (!content::WebContents::FromRenderFrameHost(
content::RenderFrameHost::FromID(request.render_process_id,
@@ -286,11 +298,18 @@ void DesktopCaptureAccessHandler::ProcessScreenCaptureAccessRequest(
bool DesktopCaptureAccessHandler::IsDefaultApproved(
const extensions::Extension* extension) {
return extension &&
- (extension->location() == extensions::Manifest::COMPONENT ||
- extension->location() == extensions::Manifest::EXTERNAL_COMPONENT ||
+ (extension->location() == ManifestLocation::kComponent ||
+ extension->location() == ManifestLocation::kExternalComponent ||
IsExtensionAllowedForScreenCapture(extension));
}
+bool DesktopCaptureAccessHandler::IsDefaultApproved(const GURL& url) {
+ // allow the Feedback WebUI chrome://feedback/ to take screenshot without
+ // user's approval. The screenshot will not be shared by default. So the
+ // user can still decide whether the screenshot taken is shared or not.
+ return url.spec() == chrome::kChromeUIFeedbackURL;
+}
+
bool DesktopCaptureAccessHandler::SupportsStreamType(
content::WebContents* web_contents,
const blink::mojom::MediaStreamType type,
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.h b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.h
index 15e3fc45df3..0f1be04bdbf 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.h
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler.h
@@ -81,6 +81,10 @@ class DesktopCaptureAccessHandler : public CaptureAccessHandlerBase,
// approved.
static bool IsDefaultApproved(const extensions::Extension* extension);
+ // Returns whether desktop capture is always approved for |url|.
+ // Currently chrome://feedback/ is default approved.
+ static bool IsDefaultApproved(const GURL& url);
+
// WebContentsCollection::Observer:
void WebContentsDestroyed(content::WebContents* web_contents) override;
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
index 459a97c62e1..54d64b8fa8b 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
@@ -352,7 +352,7 @@ TEST_F(DesktopCaptureAccessHandlerTest, ScreenCaptureAccessSuccess) {
switches::kAllowHttpScreenCapture);
extensions::ExtensionBuilder extensionBuilder("Component Extension");
- extensionBuilder.SetLocation(extensions::Manifest::COMPONENT);
+ extensionBuilder.SetLocation(extensions::mojom::ManifestLocation::kComponent);
auto extension = extensionBuilder.Build();
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -389,7 +389,7 @@ TEST_F(DesktopCaptureAccessHandlerTest, ScreenCaptureAccessDlpRestricted) {
switches::kAllowHttpScreenCapture);
extensions::ExtensionBuilder extensionBuilder("Component Extension");
- extensionBuilder.SetLocation(extensions::Manifest::COMPONENT);
+ extensionBuilder.SetLocation(extensions::mojom::ManifestLocation::kComponent);
auto extension = extensionBuilder.Build();
std::unique_ptr<aura::Window> primary_root_window =
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.cc b/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.cc
index ccee2df5b38..969ca4979ca 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.cc
@@ -59,9 +59,9 @@ DesktopMediaIDToDisplayMediaInformation(
logical_surface, cursor);
}
-base::string16 GetStopSharingUIString(
- const base::string16& application_title,
- const base::string16& registered_extension_name,
+std::u16string GetStopSharingUIString(
+ const std::u16string& application_title,
+ const std::u16string& registered_extension_name,
bool capture_audio,
content::DesktopMediaID::Type capture_type) {
if (!capture_audio) {
@@ -128,7 +128,7 @@ base::string16 GetStopSharingUIString(
}
}
}
- return base::string16();
+ return std::u16string();
}
std::string DeviceNamePrefix(
@@ -166,8 +166,8 @@ std::unique_ptr<content::MediaStreamUI> GetDevicesForDesktopCapture(
bool capture_audio,
bool disable_local_echo,
bool display_notification,
- const base::string16& application_title,
- const base::string16& registered_extension_name) {
+ const std::u16string& application_title,
+ const std::u16string& registered_extension_name) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DVLOG(2) << __func__ << ": media_id " << media_id.ToString()
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.h b/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.h
index 2bdfe18cd21..a576757c836 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.h
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_devices_util.h
@@ -25,7 +25,7 @@ std::unique_ptr<content::MediaStreamUI> GetDevicesForDesktopCapture(
bool capture_audio,
bool disable_local_echo,
bool display_notification,
- const base::string16& application_title,
- const base::string16& registered_extension_name);
+ const std::u16string& application_title,
+ const std::u16string& registered_extension_name);
#endif // CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_CAPTURE_DEVICES_UTIL_H_
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_list.h b/chromium/chrome/browser/media/webrtc/desktop_media_list.h
index cf7deb67821..d7b52b0d1b8 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_media_list.h
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_list.h
@@ -5,9 +5,9 @@
#ifndef CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_LIST_H_
#define CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_LIST_H_
+#include <string>
#include <vector>
-#include "base/strings/string16.h"
#include "base/time/time.h"
#include "content/public/browser/desktop_media_id.h"
#include "ui/gfx/image/image_skia.h"
@@ -39,7 +39,7 @@ class DesktopMediaList {
content::DesktopMediaID id;
// Name of the source that should be shown to the user.
- base::string16 name;
+ std::u16string name;
// The thumbnail for the source.
gfx::ImageSkia thumbnail;
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_list_base.cc b/chromium/chrome/browser/media/webrtc/desktop_media_list_base.cc
index bce801e2538..a3e1de40e84 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_media_list_base.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_list_base.cc
@@ -78,7 +78,7 @@ DesktopMediaList::Type DesktopMediaListBase::GetMediaListType() const {
DesktopMediaListBase::SourceDescription::SourceDescription(
DesktopMediaID id,
- const base::string16& name)
+ const std::u16string& name)
: id(id), name(name) {}
void DesktopMediaListBase::UpdateSourcesList(
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_list_base.h b/chromium/chrome/browser/media/webrtc/desktop_media_list_base.h
index 0c2b98182a8..a1038183d5b 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_media_list_base.h
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_list_base.h
@@ -42,10 +42,10 @@ class DesktopMediaListBase : public DesktopMediaList {
using RefreshCallback = UpdateCallback;
struct SourceDescription {
- SourceDescription(content::DesktopMediaID id, const base::string16& name);
+ SourceDescription(content::DesktopMediaID id, const std::u16string& name);
content::DesktopMediaID id;
- base::string16 name;
+ std::u16string name;
};
DesktopMediaListBase(base::TimeDelta update_period,
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_picker.h b/chromium/chrome/browser/media/webrtc/desktop_media_picker.h
index 46908361790..d2e56e0de6a 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_media_picker.h
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_picker.h
@@ -13,7 +13,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "content/public/browser/desktop_media_id.h"
#include "content/public/browser/media_stream_request.h"
#include "content/public/browser/web_contents_observer.h"
@@ -53,11 +52,11 @@ class DesktopMediaPicker {
ui::ModalType modality = ui::ModalType::MODAL_TYPE_CHILD;
// The name used in the dialog for what is requesting the picker to be
// shown.
- base::string16 app_name;
+ std::u16string app_name;
// Can be the same as target_name. If it is not then this is used in the
// dialog for what is specific target within the app_name is requesting the
// picker.
- base::string16 target_name;
+ std::u16string target_name;
// Whether audio capture should be shown as an option in the picker.
bool request_audio = false;
// Whether audio capture option should be approved by default if shown.
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc b/chromium/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
index 77f00e3d280..fb3c960fbc8 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
@@ -117,7 +117,7 @@ TEST_F(DesktopMediaPickerControllerTest, ShowSingleScreen) {
DesktopMediaList::Source source;
source.id = media_id_;
- source.name = base::ASCIIToUTF16("fake name");
+ source.name = u"fake name";
EXPECT_CALL(factory_, CreatePicker(nullptr)).Times(0);
EXPECT_CALL(factory_, CreateMediaList(source_types_, nullptr));
diff --git a/chromium/chrome/browser/media/webrtc/display_media_access_handler.cc b/chromium/chrome/browser/media/webrtc/display_media_access_handler.cc
index 6d0cd156c42..72538034b0e 100644
--- a/chromium/chrome/browser/media/webrtc/display_media_access_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -31,6 +31,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
+#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/chromeos/policy/dlp/dlp_content_manager.h"
@@ -149,7 +150,7 @@ void DisplayMediaAccessHandler::HandleRequest(
return;
}
if (!rfh->IsFeatureEnabled(
- blink::mojom::FeaturePolicyFeature::kDisplayCapture)) {
+ blink::mojom::PermissionsPolicyFeature::kDisplayCapture)) {
bad_message::ReceivedBadMessage(
rfh->GetProcess(), bad_message::BadMessageReason::
RFH_DISPLAY_CAPTURE_PERMISSION_MISSING);
diff --git a/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc b/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
index 8c7ced99a5d..3f4273d37b3 100644
--- a/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
@@ -254,7 +254,7 @@ TEST_F(DisplayMediaAccessHandlerTest, CorrectHostAsksForPermissions) {
access_handler_->UpdateMediaRequestState(
render_process_id, render_frame_id, page_request_id, video_stream_type,
content::MEDIA_REQUEST_STATE_CLOSING);
- EXPECT_EQ(base::UTF8ToUTF16("http://127.0.0.1:8000"), params.app_name);
+ EXPECT_EQ(u"http://127.0.0.1:8000", params.app_name);
}
TEST_F(DisplayMediaAccessHandlerTest, CorrectHostAsksForPermissionsNormalURLs) {
@@ -288,7 +288,7 @@ TEST_F(DisplayMediaAccessHandlerTest, CorrectHostAsksForPermissionsNormalURLs) {
access_handler_->UpdateMediaRequestState(
render_process_id, render_frame_id, page_request_id, video_stream_type,
content::MEDIA_REQUEST_STATE_CLOSING);
- EXPECT_EQ(base::UTF8ToUTF16("www.google.com"), params.app_name);
+ EXPECT_EQ(u"www.google.com", params.app_name);
}
TEST_F(DisplayMediaAccessHandlerTest, WebContentsDestroyed) {
diff --git a/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.cc b/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.cc
index 04fa4b5671d..7a5537e9f5b 100644
--- a/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.cc
+++ b/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.cc
@@ -49,7 +49,7 @@ void FakeDesktopMediaList::SetSourceThumbnail(int index) {
observer_->OnSourceThumbnailChanged(this, index);
}
-void FakeDesktopMediaList::SetSourceName(int index, base::string16 name) {
+void FakeDesktopMediaList::SetSourceName(int index, std::u16string name) {
sources_[index].name = name;
observer_->OnSourceNameChanged(this, index);
}
diff --git a/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.h b/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.h
index 2192be4b016..812eb728637 100644
--- a/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.h
+++ b/chromium/chrome/browser/media/webrtc/fake_desktop_media_list.h
@@ -19,7 +19,7 @@ class FakeDesktopMediaList : public DesktopMediaList {
void RemoveSource(int index);
void MoveSource(int old_index, int new_index);
void SetSourceThumbnail(int index);
- void SetSourceName(int index, base::string16 name);
+ void SetSourceName(int index, std::u16string name);
// DesktopMediaList implementation:
void SetUpdatePeriod(base::TimeDelta period) override;
diff --git a/chromium/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc b/chromium/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
index 99688e16f93..7bd6634b3bc 100644
--- a/chromium/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
+++ b/chromium/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
@@ -93,7 +93,7 @@ std::unique_ptr<DesktopMediaPicker> FakeDesktopMediaPickerFactory::CreatePicker(
const content::MediaStreamRequest* request) {
EXPECT_LE(current_test_, tests_count_);
if (current_test_ >= tests_count_)
- return std::unique_ptr<DesktopMediaPicker>();
+ return nullptr;
++current_test_;
picker_ = new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1);
return std::unique_ptr<DesktopMediaPicker>(picker_);
diff --git a/chromium/chrome/browser/media/webrtc/media_authorization_wrapper_mac.h b/chromium/chrome/browser/media/webrtc/media_authorization_wrapper_mac.h
index cbce02f111b..1f51cd631e1 100644
--- a/chromium/chrome/browser/media/webrtc/media_authorization_wrapper_mac.h
+++ b/chromium/chrome/browser/media/webrtc/media_authorization_wrapper_mac.h
@@ -19,7 +19,7 @@ class MediaAuthorizationWrapper {
// is the minimum requirement for Chromium, switch types.
virtual NSInteger AuthorizationStatusForMediaType(NSString* media_type) = 0;
virtual void RequestAccessForMediaType(NSString* media_type,
- base::RepeatingClosure callback,
+ base::OnceClosure callback,
const base::TaskTraits& traits) = 0;
};
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
index aa23936e63c..cb8750c6c8c 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
@@ -69,11 +69,11 @@ const extensions::Extension* GetExtension(WebContents* web_contents) {
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
-base::string16 GetTitle(WebContents* web_contents) {
+std::u16string GetTitle(WebContents* web_contents) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
- return base::string16();
+ return std::u16string();
#if BUILDFLAG(ENABLE_EXTENSIONS)
const extensions::Extension* const extension = GetExtension(web_contents);
@@ -149,7 +149,7 @@ class MediaStreamCaptureIndicator::WebContentsDeviceUsage
std::unique_ptr<content::MediaStreamUI> RegisterMediaStream(
const blink::MediaStreamDevices& devices,
std::unique_ptr<MediaStreamUI> ui,
- const base::string16 application_title);
+ const std::u16string application_title);
// Increment ref-counts up based on the type of each device provided.
void AddDevices(const blink::MediaStreamDevices& devices,
@@ -192,7 +192,7 @@ class MediaStreamCaptureIndicator::UIDelegate : public content::MediaStreamUI {
UIDelegate(base::WeakPtr<WebContentsDeviceUsage> device_usage,
const blink::MediaStreamDevices& devices,
std::unique_ptr<::MediaStreamUI> ui,
- const base::string16 application_title)
+ const std::u16string application_title)
: device_usage_(device_usage),
devices_(devices),
ui_(std::move(ui)),
@@ -251,7 +251,7 @@ class MediaStreamCaptureIndicator::UIDelegate : public content::MediaStreamUI {
base::WeakPtr<WebContentsDeviceUsage> device_usage_;
const blink::MediaStreamDevices devices_;
const std::unique_ptr<::MediaStreamUI> ui_;
- const base::string16 application_title_;
+ const std::u16string application_title_;
bool started_ = false;
DISALLOW_COPY_AND_ASSIGN(UIDelegate);
@@ -261,7 +261,7 @@ std::unique_ptr<content::MediaStreamUI>
MediaStreamCaptureIndicator::WebContentsDeviceUsage::RegisterMediaStream(
const blink::MediaStreamDevices& devices,
std::unique_ptr<MediaStreamUI> ui,
- const base::string16 application_title) {
+ const std::u16string application_title) {
return std::make_unique<UIDelegate>(weak_factory_.GetWeakPtr(), devices,
std::move(ui),
std::move(application_title));
@@ -367,7 +367,7 @@ MediaStreamCaptureIndicator::RegisterMediaStream(
content::WebContents* web_contents,
const blink::MediaStreamDevices& devices,
std::unique_ptr<MediaStreamUI> ui,
- const base::string16 application_title) {
+ const std::u16string application_title) {
DCHECK(web_contents);
auto& usage = usage_map_[web_contents];
if (!usage)
@@ -508,7 +508,7 @@ void MediaStreamCaptureIndicator::MaybeCreateStatusTrayIcon(bool audio,
return;
gfx::ImageSkia image;
- base::string16 tool_tip;
+ std::u16string tool_tip;
GetStatusTrayIconInfo(audio, video, &image, &tool_tip);
DCHECK(!image.isNull());
DCHECK(!tool_tip.empty());
@@ -590,7 +590,7 @@ void MediaStreamCaptureIndicator::GetStatusTrayIconInfo(
bool audio,
bool video,
gfx::ImageSkia* image,
- base::string16* tool_tip) {
+ std::u16string* tool_tip) {
#if defined(OS_ANDROID)
NOTREACHED();
#else // !defined(OS_ANDROID)
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.h b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.h
index 18dc1a8161f..1a8f1acf2a8 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.h
+++ b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.h
@@ -78,7 +78,7 @@ class MediaStreamCaptureIndicator
content::WebContents* web_contents,
const blink::MediaStreamDevices& devices,
std::unique_ptr<MediaStreamUI> ui = nullptr,
- const base::string16 application_title = base::string16());
+ const std::u16string application_title = std::u16string());
// Overrides from StatusIconMenuModel::Delegate implementation.
void ExecuteCommand(int command_id, int event_flags) override;
@@ -138,7 +138,7 @@ class MediaStreamCaptureIndicator
void GetStatusTrayIconInfo(bool audio,
bool video,
gfx::ImageSkia* image,
- base::string16* tool_tip);
+ std::u16string* tool_tip);
// Checks if |web_contents| or any portal WebContents in its tree is using
// a device for capture. The type of capture is specified using |pred|.
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc b/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
index 97bcc9ed2a7..9c986266a66 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
@@ -11,17 +11,17 @@
#include "content/public/common/content_features.h"
#include "content/public/common/url_constants.h"
#include "extensions/common/constants.h"
-#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
+#include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom.h"
namespace {
-blink::mojom::FeaturePolicyFeature GetFeaturePolicyFeature(
+blink::mojom::PermissionsPolicyFeature GetPermissionsPolicyFeature(
ContentSettingsType type) {
if (type == ContentSettingsType::MEDIASTREAM_MIC)
- return blink::mojom::FeaturePolicyFeature::kMicrophone;
+ return blink::mojom::PermissionsPolicyFeature::kMicrophone;
DCHECK_EQ(ContentSettingsType::MEDIASTREAM_CAMERA, type);
- return blink::mojom::FeaturePolicyFeature::kCamera;
+ return blink::mojom::PermissionsPolicyFeature::kCamera;
}
} // namespace
@@ -31,7 +31,7 @@ MediaStreamDevicePermissionContext::MediaStreamDevicePermissionContext(
const ContentSettingsType content_settings_type)
: PermissionContextBase(browser_context,
content_settings_type,
- GetFeaturePolicyFeature(content_settings_type)),
+ GetPermissionsPolicyFeature(content_settings_type)),
content_settings_type_(content_settings_type) {
DCHECK(content_settings_type_ == ContentSettingsType::MEDIASTREAM_MIC ||
content_settings_type_ == ContentSettingsType::MEDIASTREAM_CAMERA);
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
index 413b0d375d4..b475087df03 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
#include <string>
#include "base/bind.h"
@@ -215,8 +216,8 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
permissions::PermissionRequestManager* manager =
permissions::PermissionRequestManager::FromWebContents(
browser()->tab_strip_model()->GetActiveWebContents());
- prompt_factory_.reset(
- new permissions::MockPermissionPromptFactory(manager));
+ prompt_factory_ =
+ std::make_unique<permissions::MockPermissionPromptFactory>(manager);
// Cleanup.
media_stream_devices_.clear();
@@ -997,7 +998,7 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
- RequestCamAndMicBlockedByFeaturePolicy) {
+ RequestCamAndMicBlockedByPermissionsPolicy) {
InitWithUrl(embedded_test_server()->GetURL("/iframe_blank.html"));
// Create a cross-origin request by using localhost as the iframe origin.
@@ -1027,7 +1028,7 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
- RequestCamBlockedByFeaturePolicy) {
+ RequestCamBlockedByPermissionsPolicy) {
InitWithUrl(embedded_test_server()->GetURL("/iframe_blank.html"));
// Create a cross-origin request by using localhost as the iframe origin.
diff --git a/chromium/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chromium/chrome/browser/media/webrtc/native_desktop_media_list.cc
index 8958de11bc1..0d38b92ccb7 100644
--- a/chromium/chrome/browser/media/webrtc/native_desktop_media_list.cc
+++ b/chromium/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/media/webrtc/native_desktop_media_list.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
@@ -18,6 +19,7 @@
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_features.h"
#include "media/base/video_util.h"
#include "third_party/libyuv/include/libyuv/scale_argb.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -33,6 +35,10 @@
#include "ui/snapshot/snapshot_aura.h"
#endif
+#if defined(OS_MAC)
+#include "components/remote_cocoa/browser/scoped_cg_window_id.h"
+#endif
+
using content::DesktopMediaID;
namespace {
@@ -169,12 +175,12 @@ void NativeDesktopMediaList::Worker::Refresh(
webrtc::DesktopCapturer::SourceList sources;
if (!capturer_->GetSourceList(&sources)) {
- // Will pass empty results list to RefreshForAuraWindows().
+ // Will pass empty results list to RefreshForVizFrameSinkWindows().
sources.clear();
}
bool mutiple_sources = sources.size() > 1;
- base::string16 title;
+ std::u16string title;
for (size_t i = 0; i < sources.size(); ++i) {
DesktopMediaID::Type type = DesktopMediaID::Type::TYPE_NONE;
switch (type_) {
@@ -205,8 +211,9 @@ void NativeDesktopMediaList::Worker::Refresh(
}
content::GetUIThreadTaskRunner({})->PostTask(
- FROM_HERE, base::BindOnce(&NativeDesktopMediaList::RefreshForAuraWindows,
- media_list_, result, update_thumnails));
+ FROM_HERE,
+ base::BindOnce(&NativeDesktopMediaList::RefreshForVizFrameSinkWindows,
+ media_list_, result, update_thumnails));
}
void NativeDesktopMediaList::Worker::RefreshThumbnails(
@@ -309,8 +316,9 @@ NativeDesktopMediaList::NativeDesktopMediaList(
#endif
thread_.StartWithOptions(base::Thread::Options(thread_type, 0));
- worker_.reset(new Worker(thread_.task_runner(), weak_factory_.GetWeakPtr(),
- type, std::move(capturer)));
+ worker_ = std::make_unique<Worker>(thread_.task_runner(),
+ weak_factory_.GetWeakPtr(), type,
+ std::move(capturer));
thread_.task_runner()->PostTask(
FROM_HERE,
@@ -339,17 +347,18 @@ void NativeDesktopMediaList::Refresh(bool update_thumnails) {
view_dialog_id_.id, update_thumnails));
}
-void NativeDesktopMediaList::RefreshForAuraWindows(
+void NativeDesktopMediaList::RefreshForVizFrameSinkWindows(
std::vector<SourceDescription> sources,
bool update_thumnails) {
DCHECK(can_refresh());
-#if defined(USE_AURA)
- // Associate aura id with native id.
+ // Assign |source.id.window_id| if |source.id.id| corresponds to a
+ // viz::FrameSinkId.
for (auto& source : sources) {
if (source.id.type != DesktopMediaID::TYPE_WINDOW)
continue;
+#if defined(USE_AURA)
aura::WindowTreeHost* const host =
aura::WindowTreeHost::GetForAcceleratedWidget(
*reinterpret_cast<gfx::AcceleratedWidget*>(&source.id.id));
@@ -359,8 +368,13 @@ void NativeDesktopMediaList::RefreshForAuraWindows(
DesktopMediaID::TYPE_WINDOW, aura_window);
source.id.window_id = aura_id.window_id;
}
+#elif defined(OS_MAC)
+ if (base::FeatureList::IsEnabled(features::kWindowCaptureMacV2)) {
+ if (remote_cocoa::ScopedCGWindowID::Get(source.id.id))
+ source.id.window_id = source.id.id;
+ }
+#endif
}
-#endif // defined(USE_AURA)
UpdateSourcesList(sources);
@@ -381,7 +395,7 @@ void NativeDesktopMediaList::RefreshForAuraWindows(
}
// OnAuraThumbnailCaptured() and UpdateNativeThumbnailsFinished() are
- // guaranteed to be executed after RefreshForAuraWindows() and
+ // guaranteed to be executed after RefreshForVizFrameSinkWindows() and
// CaptureAuraWindowThumbnail() in the browser UI thread.
// Therefore pending_aura_capture_requests_ will be set the number of aura
// windows to be captured and pending_native_thumbnail_capture_ will be set
diff --git a/chromium/chrome/browser/media/webrtc/native_desktop_media_list.h b/chromium/chrome/browser/media/webrtc/native_desktop_media_list.h
index e116301d044..77fba82bf0d 100644
--- a/chromium/chrome/browser/media/webrtc/native_desktop_media_list.h
+++ b/chromium/chrome/browser/media/webrtc/native_desktop_media_list.h
@@ -36,8 +36,8 @@ class NativeDesktopMediaList : public DesktopMediaListBase {
// thumbnails and schedules next refresh.
void Refresh(bool update_thumnails) override;
- void RefreshForAuraWindows(std::vector<SourceDescription> sources,
- bool update_thumnails);
+ void RefreshForVizFrameSinkWindows(std::vector<SourceDescription> sources,
+ bool update_thumnails);
void UpdateNativeThumbnailsFinished();
#if defined(USE_AURA)
diff --git a/chromium/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc b/chromium/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
index ba9d1413e3b..1916f181cbc 100644
--- a/chromium/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
@@ -305,7 +305,7 @@ class NativeDesktopMediaListTest : public ChromeViewsTestBase {
for (size_t i = 0; i < window_count; ++i) {
EXPECT_EQ(model_->GetSource(i).id.type, DesktopMediaID::TYPE_WINDOW);
- EXPECT_EQ(model_->GetSource(i).name, base::UTF8ToUTF16("Test window"));
+ EXPECT_EQ(model_->GetSource(i).name, u"Test window");
int index = has_view_dialog ? i + 1 : i;
int native_id = window_list_[index].id;
EXPECT_EQ(model_->GetSource(i).id.id, native_id);
diff --git a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
index 819fb30d05c..f41033e055b 100644
--- a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
@@ -288,7 +288,7 @@ void PermissionBubbleMediaAccessHandler::OnMediaStreamRequestResponse(
content::MediaStreamRequest request,
const blink::MediaStreamDevices& devices,
blink::mojom::MediaStreamRequestResult result,
- bool blocked_by_feature_policy,
+ bool blocked_by_permissions_policy,
ContentSetting audio_setting,
ContentSetting video_setting) {
if (pending_requests_.find(web_contents) == pending_requests_.end()) {
@@ -296,10 +296,10 @@ void PermissionBubbleMediaAccessHandler::OnMediaStreamRequestResponse(
return;
}
- // If the kill switch is, or the request was blocked because of feature
+ // If the kill switch is, or the request was blocked because of permissions
// policy we don't update the tab context.
if (result != blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON &&
- !blocked_by_feature_policy) {
+ !blocked_by_permissions_policy) {
UpdatePageSpecificContentSettings(web_contents, request, audio_setting,
video_setting);
}
diff --git a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
index e3af3231d31..d2804a19f5c 100644
--- a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
+++ b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
@@ -62,7 +62,7 @@ class PermissionBubbleMediaAccessHandler
content::MediaStreamRequest request,
const blink::MediaStreamDevices& devices,
blink::mojom::MediaStreamRequestResult result,
- bool blocked_by_feature_policy,
+ bool blocked_by_permissions_policy,
ContentSetting audio_setting,
ContentSetting video_setting);
void OnAccessRequestResponse(content::WebContents* web_contents,
diff --git a/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc b/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc
index 008b6cae25c..3aac8199dc8 100644
--- a/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc
+++ b/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc
@@ -62,7 +62,7 @@ ScreenCaptureInfoBarDelegateAndroid::GetIdentifier() const {
return SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID;
}
-base::string16 ScreenCaptureInfoBarDelegateAndroid::GetMessageText() const {
+std::u16string ScreenCaptureInfoBarDelegateAndroid::GetMessageText() const {
return l10n_util::GetStringFUTF16(
IDS_MEDIA_CAPTURE_SCREEN_INFOBAR_TEXT,
url_formatter::FormatUrlForSecurityDisplay(request_.security_origin));
@@ -72,7 +72,7 @@ int ScreenCaptureInfoBarDelegateAndroid::GetIconId() const {
return IDR_ANDROID_INFOBAR_MEDIA_STREAM_SCREEN;
}
-base::string16 ScreenCaptureInfoBarDelegateAndroid::GetButtonLabel(
+std::u16string ScreenCaptureInfoBarDelegateAndroid::GetButtonLabel(
InfoBarButton button) const {
return l10n_util::GetStringUTF16((button == BUTTON_OK) ? IDS_PERMISSION_ALLOW
: IDS_PERMISSION_DENY);
diff --git a/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h b/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h
index 829212ce022..69344c61ffe 100644
--- a/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h
+++ b/chromium/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h
@@ -31,9 +31,9 @@ class ScreenCaptureInfoBarDelegateAndroid : public ConfirmInfoBarDelegate {
// ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
- base::string16 GetMessageText() const override;
+ std::u16string GetMessageText() const override;
int GetIconId() const override;
- base::string16 GetButtonLabel(InfoBarButton button) const override;
+ std::u16string GetButtonLabel(InfoBarButton button) const override;
bool Accept() override;
bool Cancel() override;
void InfoBarDismissed() override;
diff --git a/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm b/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
index f32930a9b9f..1f01da0b819 100644
--- a/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
+++ b/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
@@ -52,14 +52,15 @@ class MediaAuthorizationWrapperImpl : public MediaAuthorizationWrapper {
}
void RequestAccessForMediaType(AVMediaType media_type,
- base::RepeatingClosure callback,
+ base::OnceClosure callback,
const base::TaskTraits& traits) final {
if (@available(macOS 10.14, *)) {
- [AVCaptureDevice
- requestAccessForMediaType:media_type
- completionHandler:^(BOOL granted) {
- base::PostTask(FROM_HERE, traits, std::move(callback));
- }];
+ __block base::OnceClosure block_callback = std::move(callback);
+ [AVCaptureDevice requestAccessForMediaType:media_type
+ completionHandler:^(BOOL granted) {
+ base::PostTask(FROM_HERE, traits,
+ std::move(block_callback));
+ }];
} else {
NOTREACHED();
base::PostTask(FROM_HERE, traits, std::move(callback));
@@ -114,10 +115,8 @@ SystemPermission CheckSystemMediaCapturePermission(AVMediaType media_type) {
return SystemPermission::kAllowed;
}
-// Use RepeatingCallback since it must be copyable for use in the block. It's
-// only called once though.
void RequestSystemMediaCapturePermission(AVMediaType media_type,
- base::RepeatingClosure callback,
+ base::OnceClosure callback,
const base::TaskTraits& traits) {
if (UsingFakeMediaDevices()) {
base::PostTask(FROM_HERE, traits, std::move(callback));
@@ -168,16 +167,14 @@ SystemPermission CheckSystemScreenCapturePermission() {
void RequestSystemAudioCapturePermisson(base::OnceClosure callback,
const base::TaskTraits& traits) {
- RequestSystemMediaCapturePermission(
- AVMediaTypeAudio, base::AdaptCallbackForRepeating(std::move(callback)),
- traits);
+ RequestSystemMediaCapturePermission(AVMediaTypeAudio, std::move(callback),
+ traits);
}
void RequestSystemVideoCapturePermisson(base::OnceClosure callback,
const base::TaskTraits& traits) {
- RequestSystemMediaCapturePermission(
- AVMediaTypeVideo, base::AdaptCallbackForRepeating(std::move(callback)),
- traits);
+ RequestSystemMediaCapturePermission(AVMediaTypeVideo, std::move(callback),
+ traits);
}
void SetMediaAuthorizationWrapperForTesting(
diff --git a/chromium/chrome/browser/media/webrtc/tab_desktop_media_list_unittest.cc b/chromium/chrome/browser/media/webrtc/tab_desktop_media_list_unittest.cc
index 690a2d48fe7..f363612da5e 100644
--- a/chromium/chrome/browser/media/webrtc/tab_desktop_media_list_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/tab_desktop_media_list_unittest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/media/webrtc/tab_desktop_media_list.h"
+#include <memory>
+
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
@@ -33,8 +35,8 @@
#include "testing/gmock/include/gmock/gmock.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/login/users/scoped_test_user_manager.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
using content::WebContents;
@@ -135,7 +137,7 @@ class TabDesktopMediaListTest : public testing::Test {
entry = contents->GetController().GetLastCommittedEntry();
}
- contents->UpdateTitleForEntry(entry, base::ASCIIToUTF16("Test tab"));
+ contents->UpdateTitleForEntry(entry, u"Test tab");
content::FaviconStatus favicon_info;
favicon_info.image =
@@ -147,7 +149,7 @@ class TabDesktopMediaListTest : public testing::Test {
}
void SetUp() override {
- rvh_test_enabler_.reset(new content::RenderViewHostTestEnabler());
+ rvh_test_enabler_ = std::make_unique<content::RenderViewHostTestEnabler>();
// Create a new temporary directory, and store the path.
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
TestingBrowserProcess::GetGlobal()->SetProfileManager(
@@ -192,7 +194,7 @@ class TabDesktopMediaListTest : public testing::Test {
}
void CreateDefaultList() {
- list_.reset(new TabDesktopMediaList());
+ list_ = std::make_unique<TabDesktopMediaList>();
list_->SetThumbnailSize(gfx::Size(kThumbnailSize, kThumbnailSize));
// Set update period to reduce the time it takes to run tests.
@@ -249,8 +251,8 @@ class TabDesktopMediaListTest : public testing::Test {
content::BrowserTaskEnvironment task_environment_;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
- chromeos::ScopedTestUserManager test_user_manager_;
+ ash::ScopedCrosSettingsTestHelper cros_settings_test_helper_;
+ ash::ScopedTestUserManager test_user_manager_;
#endif
DISALLOW_COPY_AND_ASSIGN(TabDesktopMediaListTest);
@@ -327,14 +329,14 @@ TEST_F(TabDesktopMediaListTest, UpdateTitle) {
ASSERT_TRUE(contents);
content::NavigationController& controller = contents->GetController();
contents->UpdateTitleForEntry(controller.GetLastCommittedEntry(),
- base::ASCIIToUTF16("New test tab"));
+ u"New test tab");
EXPECT_CALL(observer_, OnSourceNameChanged(list_.get(), 0))
.WillOnce(QuitMessageLoop());
base::RunLoop().Run();
- EXPECT_EQ(list_->GetSource(0).name, base::UTF8ToUTF16("New test tab"));
+ EXPECT_EQ(list_->GetSource(0).name, u"New test tab");
list_.reset();
}
diff --git a/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc b/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
index 91fbd4b94c0..7b7eebd2204 100644
--- a/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
+++ b/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/media/webrtc/test_stats_dictionary.h"
+#include <memory>
+
#include "base/check.h"
#include "base/json/json_writer.h"
@@ -43,8 +45,7 @@ std::unique_ptr<TestStatsDictionary> TestStatsReportDictionary::Get(
const base::DictionaryValue* dictionary;
if (!report_->GetDictionary(id, &dictionary))
return nullptr;
- return std::unique_ptr<TestStatsDictionary>(
- new TestStatsDictionary(this, dictionary));
+ return std::make_unique<TestStatsDictionary>(this, dictionary);
}
std::vector<TestStatsDictionary> TestStatsReportDictionary::GetAll() {
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
index 8644522d175..bf59f3e63fc 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -9,7 +9,6 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/memory/ptr_util.h"
-#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
@@ -21,15 +20,17 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/network_service_instance.h"
+#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
namespace webrtc_event_logging {
namespace {
-using BrowserContext = content::BrowserContext;
-using BrowserThread = content::BrowserThread;
-using RenderProcessHost = content::RenderProcessHost;
+using content::BrowserContext;
+using content::BrowserThread;
+using content::RenderFrameHost;
+using content::RenderProcessHost;
using BrowserContextId = WebRtcEventLogManager::BrowserContextId;
@@ -61,7 +62,8 @@ class PeerConnectionTrackerProxyImpl
WebRtcEventLogPeerConnectionKey key,
int output_period_ms) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- RenderProcessHost* host = RenderProcessHost::FromID(key.render_process_id);
+ auto* host =
+ RenderFrameHost::FromID(key.render_process_id, key.render_frame_id);
if (!host) {
return; // The host has been asynchronously removed; not a problem.
}
@@ -71,7 +73,8 @@ class PeerConnectionTrackerProxyImpl
static void DisableWebRtcEventLoggingInternal(
WebRtcEventLogPeerConnectionKey key) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- RenderProcessHost* host = RenderProcessHost::FromID(key.render_process_id);
+ auto* host =
+ RenderFrameHost::FromID(key.render_process_id, key.render_frame_id);
if (!host) {
return; // The host has been asynchronously removed; not a problem.
}
@@ -108,8 +111,8 @@ inline void MaybeReply(const base::Location& location,
base::OnceCallback<void(Args...)> reply,
Args... args) {
if (reply) {
- base::PostTask(location, {BrowserThread::UI},
- base::BindOnce(std::move(reply), args...));
+ content::GetUIThreadTaskRunner({})->PostTask(
+ location, base::BindOnce(std::move(reply), args...));
}
}
@@ -227,160 +230,54 @@ void WebRtcEventLogManager::DisableForBrowserContext(
std::move(reply)));
}
-void WebRtcEventLogManager::PeerConnectionAdded(
- int render_process_id,
+void WebRtcEventLogManager::OnPeerConnectionAdded(
+ content::GlobalFrameRoutingId frame_id,
int lid,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id);
- if (!rph) {
- // RPH died before processing of this notification.
- MaybeReply(FROM_HERE, std::move(reply), false);
- return;
- }
-
- auto it = observed_render_process_hosts_.find(rph);
- if (it == observed_render_process_hosts_.end()) {
- // This is the first PeerConnection which we see that's associated
- // with this RPH.
- rph->AddObserver(this);
- observed_render_process_hosts_.insert(rph);
- }
-
- const auto browser_context_id = GetBrowserContextId(rph->GetBrowserContext());
- DCHECK_NE(browser_context_id, kNullBrowserContextId);
+ base::ProcessId pid,
+ const std::string& url,
+ const std::string& rtc_configuration,
+ const std::string& constraints) {
+ OnPeerConnectionAdded(frame_id, lid, base::NullCallback());
+}
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &WebRtcEventLogManager::PeerConnectionAddedInternal,
- base::Unretained(this),
- PeerConnectionKey(render_process_id, lid, browser_context_id),
- std::move(reply)));
+void WebRtcEventLogManager::OnPeerConnectionRemoved(
+ content::GlobalFrameRoutingId frame_id,
+ int lid) {
+ OnPeerConnectionRemoved(frame_id, lid, base::NullCallback());
}
-void WebRtcEventLogManager::PeerConnectionRemoved(
- int render_process_id,
+void WebRtcEventLogManager::OnPeerConnectionUpdated(
+ content::GlobalFrameRoutingId frame_id,
int lid,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- const auto browser_context_id = GetBrowserContextId(render_process_id);
- if (browser_context_id == kNullBrowserContextId) {
- // RPH died before processing of this notification. This is handled by
- // RenderProcessExited() / RenderProcessHostDestroyed.
- MaybeReply(FROM_HERE, std::move(reply), false);
- return;
+ const std::string& type,
+ const std::string& value) {
+ // TODO(810383): Get rid of magic value.
+ if (type == "stop") {
+ OnPeerConnectionStopped(frame_id, lid, base::NullCallback());
}
-
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &WebRtcEventLogManager::PeerConnectionRemovedInternal,
- base::Unretained(this),
- PeerConnectionKey(render_process_id, lid, browser_context_id),
- std::move(reply)));
}
-void WebRtcEventLogManager::PeerConnectionStopped(
- int render_process_id,
+void WebRtcEventLogManager::OnPeerConnectionSessionIdSet(
+ content::GlobalFrameRoutingId frame_id,
int lid,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- return PeerConnectionRemoved(render_process_id, lid, std::move(reply));
+ const std::string& session_id) {
+ OnPeerConnectionSessionIdSet(frame_id, lid, session_id, base::NullCallback());
}
-void WebRtcEventLogManager::PeerConnectionSessionIdSet(
- int render_process_id,
+void WebRtcEventLogManager::OnWebRtcEventLogWrite(
+ content::GlobalFrameRoutingId frame_id,
int lid,
- const std::string& session_id,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- const auto browser_context_id = GetBrowserContextId(render_process_id);
- if (browser_context_id == kNullBrowserContextId) {
- // RPH died before processing of this notification. This is handled by
- // RenderProcessExited() / RenderProcessHostDestroyed.
- MaybeReply(FROM_HERE, std::move(reply), false);
- return;
- }
-
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &WebRtcEventLogManager::PeerConnectionSessionIdSetInternal,
- base::Unretained(this),
- PeerConnectionKey(render_process_id, lid, browser_context_id),
- session_id, std::move(reply)));
-}
-
-void WebRtcEventLogManager::EnableLocalLogging(
- const base::FilePath& base_path,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- EnableLocalLogging(base_path, kDefaultMaxLocalLogFileSizeBytes,
- std::move(reply));
+ const std::string& message) {
+ OnWebRtcEventLogWrite(frame_id, lid, message, base::NullCallback());
}
void WebRtcEventLogManager::EnableLocalLogging(
- const base::FilePath& base_path,
- size_t max_file_size_bytes,
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(!base_path.empty());
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&WebRtcEventLogManager::EnableLocalLoggingInternal,
- base::Unretained(this), base_path, max_file_size_bytes,
- std::move(reply)));
+ const base::FilePath& base_path) {
+ EnableLocalLogging(base_path, base::NullCallback());
}
-void WebRtcEventLogManager::DisableLocalLogging(
- base::OnceCallback<void(bool)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&WebRtcEventLogManager::DisableLocalLoggingInternal,
- base::Unretained(this), std::move(reply)));
-}
-
-void WebRtcEventLogManager::OnWebRtcEventLogWrite(
- int render_process_id,
- int lid,
- const std::string& message,
- base::OnceCallback<void(std::pair<bool, bool>)> reply) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- const BrowserContext* browser_context = GetBrowserContext(render_process_id);
- if (!browser_context) {
- // RPH died before processing of this notification.
- MaybeReply(FROM_HERE, std::move(reply), std::make_pair(false, false));
- return;
- }
-
- const auto browser_context_id = GetBrowserContextId(browser_context);
- DCHECK_NE(browser_context_id, kNullBrowserContextId);
-
- // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
- // will not be dereferenced after destruction.
- task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &WebRtcEventLogManager::OnWebRtcEventLogWriteInternal,
- base::Unretained(this),
- PeerConnectionKey(render_process_id, lid, browser_context_id),
- message, std::move(reply)));
+void WebRtcEventLogManager::DisableLocalLogging() {
+ DisableLocalLogging(base::NullCallback());
}
void WebRtcEventLogManager::StartRemoteLogging(
@@ -577,6 +474,169 @@ void WebRtcEventLogManager::RenderProcessHostExitedDestroyed(
base::Unretained(this), host->GetID()));
}
+void WebRtcEventLogManager::OnPeerConnectionAdded(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ // TODO(crbug.com/1178670): Should this look at RFH shutdown instead of RPH?
+ RenderProcessHost* rph = RenderProcessHost::FromID(frame_id.child_id);
+ if (!rph) {
+ // RPH died before processing of this notification.
+ MaybeReply(FROM_HERE, std::move(reply), false);
+ return;
+ }
+
+ auto it = observed_render_process_hosts_.find(rph);
+ if (it == observed_render_process_hosts_.end()) {
+ // This is the first PeerConnection which we see that's associated
+ // with this RPH.
+ rph->AddObserver(this);
+ observed_render_process_hosts_.insert(rph);
+ }
+
+ const auto browser_context_id = GetBrowserContextId(rph->GetBrowserContext());
+ DCHECK_NE(browser_context_id, kNullBrowserContextId);
+
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &WebRtcEventLogManager::OnPeerConnectionAddedInternal,
+ base::Unretained(this),
+ PeerConnectionKey(frame_id.child_id, lid, browser_context_id,
+ frame_id.frame_routing_id),
+ std::move(reply)));
+}
+
+void WebRtcEventLogManager::OnPeerConnectionRemoved(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ const auto browser_context_id = GetBrowserContextId(frame_id.child_id);
+ if (browser_context_id == kNullBrowserContextId) {
+ // RPH died before processing of this notification. This is handled by
+ // RenderProcessExited() / RenderProcessHostDestroyed.
+ MaybeReply(FROM_HERE, std::move(reply), false);
+ return;
+ }
+
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &WebRtcEventLogManager::OnPeerConnectionRemovedInternal,
+ base::Unretained(this),
+ PeerConnectionKey(frame_id.child_id, lid, browser_context_id,
+ frame_id.frame_routing_id),
+ std::move(reply)));
+}
+
+void WebRtcEventLogManager::OnPeerConnectionStopped(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply) {
+ // From the logger's perspective, we treat stopping a peer connection the
+ // same as we do its removal. Should a stopped peer connection be later
+ // removed, the removal callback will assume the value |false|.
+ OnPeerConnectionRemoved(frame_id, lid, std::move(reply));
+}
+
+void WebRtcEventLogManager::OnPeerConnectionSessionIdSet(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& session_id,
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ const auto browser_context_id = GetBrowserContextId(frame_id.child_id);
+ if (browser_context_id == kNullBrowserContextId) {
+ // RPH died before processing of this notification. This is handled by
+ // RenderProcessExited() / RenderProcessHostDestroyed.
+ MaybeReply(FROM_HERE, std::move(reply), false);
+ return;
+ }
+
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &WebRtcEventLogManager::OnPeerConnectionSessionIdSetInternal,
+ base::Unretained(this),
+ PeerConnectionKey(frame_id.child_id, lid, browser_context_id,
+ frame_id.frame_routing_id),
+ session_id, std::move(reply)));
+}
+
+void WebRtcEventLogManager::OnWebRtcEventLogWrite(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& message,
+ base::OnceCallback<void(std::pair<bool, bool>)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ const BrowserContext* browser_context = GetBrowserContext(frame_id.child_id);
+ if (!browser_context) {
+ // RPH died before processing of this notification.
+ MaybeReply(FROM_HERE, std::move(reply), std::make_pair(false, false));
+ return;
+ }
+
+ const auto browser_context_id = GetBrowserContextId(browser_context);
+ DCHECK_NE(browser_context_id, kNullBrowserContextId);
+
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &WebRtcEventLogManager::OnWebRtcEventLogWriteInternal,
+ base::Unretained(this),
+ PeerConnectionKey(frame_id.child_id, lid, browser_context_id,
+ frame_id.frame_routing_id),
+ message, std::move(reply)));
+}
+
+void WebRtcEventLogManager::EnableLocalLogging(
+ const base::FilePath& base_path,
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ EnableLocalLogging(base_path, kDefaultMaxLocalLogFileSizeBytes,
+ std::move(reply));
+}
+
+void WebRtcEventLogManager::EnableLocalLogging(
+ const base::FilePath& base_path,
+ size_t max_file_size_bytes,
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(!base_path.empty());
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(&WebRtcEventLogManager::EnableLocalLoggingInternal,
+ base::Unretained(this), base_path, max_file_size_bytes,
+ std::move(reply)));
+}
+
+void WebRtcEventLogManager::DisableLocalLogging(
+ base::OnceCallback<void(bool)> reply) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+ // will not be dereferenced after destruction.
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(&WebRtcEventLogManager::DisableLocalLoggingInternal,
+ base::Unretained(this), std::move(reply)));
+}
+
void WebRtcEventLogManager::OnLocalLogStarted(PeerConnectionKey peer_connection,
const base::FilePath& file_path) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
@@ -797,40 +857,53 @@ void WebRtcEventLogManager::
MaybeReply(FROM_HERE, std::move(reply));
}
-void WebRtcEventLogManager::PeerConnectionAddedInternal(
+void WebRtcEventLogManager::OnPeerConnectionAddedInternal(
PeerConnectionKey key,
base::OnceCallback<void(bool)> reply) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
- const bool local_result = local_logs_manager_.PeerConnectionAdded(key);
- const bool remote_result = remote_logs_manager_.PeerConnectionAdded(key);
+ const bool local_result = local_logs_manager_.OnPeerConnectionAdded(key);
+ const bool remote_result = remote_logs_manager_.OnPeerConnectionAdded(key);
DCHECK_EQ(local_result, remote_result);
MaybeReply(FROM_HERE, std::move(reply), local_result);
}
-void WebRtcEventLogManager::PeerConnectionRemovedInternal(
+void WebRtcEventLogManager::OnPeerConnectionRemovedInternal(
PeerConnectionKey key,
base::OnceCallback<void(bool)> reply) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
- const bool local_result = local_logs_manager_.PeerConnectionRemoved(key);
- const bool remote_result = remote_logs_manager_.PeerConnectionRemoved(key);
+ const bool local_result = local_logs_manager_.OnPeerConnectionRemoved(key);
+ const bool remote_result = remote_logs_manager_.OnPeerConnectionRemoved(key);
DCHECK_EQ(local_result, remote_result);
MaybeReply(FROM_HERE, std::move(reply), local_result);
}
-void WebRtcEventLogManager::PeerConnectionSessionIdSetInternal(
+void WebRtcEventLogManager::OnPeerConnectionSessionIdSetInternal(
PeerConnectionKey key,
const std::string& session_id,
base::OnceCallback<void(bool)> reply) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
const bool result =
- remote_logs_manager_.PeerConnectionSessionIdSet(key, session_id);
+ remote_logs_manager_.OnPeerConnectionSessionIdSet(key, session_id);
MaybeReply(FROM_HERE, std::move(reply), result);
}
+void WebRtcEventLogManager::OnWebRtcEventLogWriteInternal(
+ PeerConnectionKey key,
+ const std::string& message,
+ base::OnceCallback<void(std::pair<bool, bool>)> reply) {
+ DCHECK(task_runner_->RunsTasksInCurrentSequence());
+
+ const bool local_result = local_logs_manager_.EventLogWrite(key, message);
+ const bool remote_result = remote_logs_manager_.EventLogWrite(key, message);
+
+ MaybeReply(FROM_HERE, std::move(reply),
+ std::make_pair(local_result, remote_result));
+}
+
void WebRtcEventLogManager::EnableLocalLoggingInternal(
const base::FilePath& base_path,
size_t max_file_size_bytes,
@@ -852,19 +925,6 @@ void WebRtcEventLogManager::DisableLocalLoggingInternal(
MaybeReply(FROM_HERE, std::move(reply), result);
}
-void WebRtcEventLogManager::OnWebRtcEventLogWriteInternal(
- PeerConnectionKey key,
- const std::string& message,
- base::OnceCallback<void(std::pair<bool, bool>)> reply) {
- DCHECK(task_runner_->RunsTasksInCurrentSequence());
-
- const bool local_result = local_logs_manager_.EventLogWrite(key, message);
- const bool remote_result = remote_logs_manager_.EventLogWrite(key, message);
-
- MaybeReply(FROM_HERE, std::move(reply),
- std::make_pair(local_result, remote_result));
-}
-
void WebRtcEventLogManager::StartRemoteLoggingInternal(
int render_process_id,
BrowserContextId browser_context_id,
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.h b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.h
index 55dcf8a55d9..778288a79d5 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.h
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager.h
@@ -13,6 +13,7 @@
#include "base/callback.h"
#include "base/containers/flat_set.h"
#include "base/files/file_path.h"
+#include "base/gtest_prod_util.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/clock.h"
#include "base/time/time.h"
@@ -22,6 +23,8 @@
#include "chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/upload_list/upload_list.h"
+#include "content/public/browser/global_routing_id.h"
+#include "content/public/browser/peer_connection_tracker_host_observer.h"
#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/webrtc_event_logger.h"
@@ -32,6 +35,8 @@ class BrowserContext;
class NetworkConnectionTracker;
} // namespace content
+FORWARD_DECLARE_TEST(WebRtcEventLogCollectionAllowedPolicyTest, RunTest);
+
namespace webrtc_event_logging {
// This is a singleton class running in the browser UI thread (ownership of
@@ -44,10 +49,12 @@ namespace webrtc_event_logging {
// destroyed from ~BrowserProcessImpl(), at which point any tasks posted to the
// internal SequencedTaskRunner, or coming from another thread, would no longer
// execute.
-class WebRtcEventLogManager final : public content::RenderProcessHostObserver,
- public content::WebRtcEventLogger,
- public WebRtcLocalEventLogsObserver,
- public WebRtcRemoteEventLogsObserver {
+class WebRtcEventLogManager final
+ : public content::RenderProcessHostObserver,
+ public content::PeerConnectionTrackerHostObserver,
+ public content::WebRtcEventLogger,
+ public WebRtcLocalEventLogsObserver,
+ public WebRtcRemoteEventLogsObserver {
public:
using BrowserContextId = WebRtcEventLogPeerConnectionKey::BrowserContextId;
@@ -94,42 +101,29 @@ class WebRtcEventLogManager final : public content::RenderProcessHostObserver,
void DisableForBrowserContext(content::BrowserContext* browser_context,
base::OnceClosure reply);
- void PeerConnectionAdded(int render_process_id,
- int lid, // Renderer-local PeerConnection ID.
- base::OnceCallback<void(bool)> reply) override;
-
- void PeerConnectionRemoved(int render_process_id,
- int lid, // Renderer-local PeerConnection ID.
- base::OnceCallback<void(bool)> reply) override;
-
- // From the logger's perspective, we treat stopping a peer connection the
- // same as we do its removal. Should a stopped peer connection be later
- // removed, the removal callback will assume the value |false|.
- void PeerConnectionStopped(int render_process_id,
- int lid, // Renderer-local PeerConnection ID.
- base::OnceCallback<void(bool)> reply) override;
-
- void PeerConnectionSessionIdSet(
- int render_process_id,
- int lid,
- const std::string& session_id,
- base::OnceCallback<void(bool)> reply) override;
-
- // The file's actual path is derived from |base_path| by adding a timestamp,
- // the render process ID and the PeerConnection's local ID.
- void EnableLocalLogging(const base::FilePath& base_path,
- base::OnceCallback<void(bool)> reply) override;
- void EnableLocalLogging(const base::FilePath& base_path,
- size_t max_file_size_bytes,
- base::OnceCallback<void(bool)> reply);
-
- void DisableLocalLogging(base::OnceCallback<void(bool)> reply) override;
-
- void OnWebRtcEventLogWrite(
- int render_process_id,
- int lid, // Renderer-local PeerConnection ID.
- const std::string& message,
- base::OnceCallback<void(std::pair<bool, bool>)> reply) override;
+ // content::PeerConnectionTrackerHostObserver implementation.
+ void OnPeerConnectionAdded(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::ProcessId pid,
+ const std::string& url,
+ const std::string& rtc_configuration,
+ const std::string& constraints) override;
+ void OnPeerConnectionRemoved(content::GlobalFrameRoutingId frame_id,
+ int lid) override;
+ void OnPeerConnectionUpdated(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& type,
+ const std::string& value) override;
+ void OnPeerConnectionSessionIdSet(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& session_id) override;
+ void OnWebRtcEventLogWrite(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& message) override;
+
+ // content::WebRtcEventLogger implementation.
+ void EnableLocalLogging(const base::FilePath& base_path) override;
+ void DisableLocalLogging() override;
// Start logging a peer connection's WebRTC events to a file, which will
// later be uploaded to a remote server. If a reply is provided, it will be
@@ -190,6 +184,8 @@ class WebRtcEventLogManager final : public content::RenderProcessHostObserver,
base::OnceClosure reply);
private:
+ FRIEND_TEST_ALL_PREFIXES(::WebRtcEventLogCollectionAllowedPolicyTest,
+ RunTest);
friend class WebRtcEventLogManagerTestBase;
friend class ::WebRTCInternalsIntegrationBrowserTest;
@@ -223,6 +219,65 @@ class WebRtcEventLogManager final : public content::RenderProcessHostObserver,
// by this function.
void RenderProcessHostExitedDestroyed(content::RenderProcessHost* host);
+ // Each method overridden from content::PeerConnectionTrackerHostObserver and
+ // content::WebRtcEventLogger has an overload that posts back a reply on the
+ // UI thread with the result of the operation. Used for testing only.
+
+ // An overload of OnPeerConnectionAdded() that replies true if and only if the
+ // operation was successful. A failure can happen if a peer connection with
+ // this exact key was previously added, but not removed. Another failure mode
+ // is if the RPH of the frame was destroyed.
+ void OnPeerConnectionAdded(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply);
+
+ // An overload of OnPeerConnectionRemoved() that replies true if and only if
+ // the operation was successful. A failure can happen is a peer connection
+ // with this key was not previously added or if it has since already been
+ // removed. Another failure mode is if the RPH of the frame was destroyed.
+ void OnPeerConnectionRemoved(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply);
+
+ // Handles a "stop" peer connection update. Replies true if and only if the
+ // operation was successful. Same failure mode as OnPeerConnectionRemoved().
+ void OnPeerConnectionStopped(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ base::OnceCallback<void(bool)> reply);
+
+ // An overload of OnPeerConnectionSessionIdSet() that replies true if and only
+ // if the operation was successful.
+ void OnPeerConnectionSessionIdSet(content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& session_id,
+ base::OnceCallback<void(bool)> reply);
+
+ // An overload of OnWebRtcEventLogWrite() that replies with a pair of bool.
+ // The first bool is associated with local logging and the second bool is
+ // associated with remote-bound logging. Each bool assumes the value true if
+ // and only if the message was written in its entirety into a
+ // local/remote-bound log file.
+ void OnWebRtcEventLogWrite(
+ content::GlobalFrameRoutingId frame_id,
+ int lid,
+ const std::string& message,
+ base::OnceCallback<void(std::pair<bool, bool>)> reply);
+
+ // An overload of EnableLocalLogging() replies true if the logging was
+ // actually enabled. i.e. The logging was not already enabled before the call.
+ void EnableLocalLogging(const base::FilePath& base_path,
+ base::OnceCallback<void(bool)> reply);
+
+ // Same as the above, but allows the caller to customize the maximum size of
+ // the log file.
+ void EnableLocalLogging(const base::FilePath& base_path,
+ size_t max_file_size_bytes,
+ base::OnceCallback<void(bool)> reply);
+
+ // An overload of DisableLocalLogging() that replies true if the logging was
+ // actually disabled. i.e. The logging was enabled before the call.
+ void DisableLocalLogging(base::OnceCallback<void(bool)> reply);
+
// WebRtcLocalEventLogsObserver implementation:
void OnLocalLogStarted(PeerConnectionKey peer_connection,
const base::FilePath& file_path) override;
@@ -272,14 +327,15 @@ class WebRtcEventLogManager final : public content::RenderProcessHostObserver,
const base::FilePath& browser_context_dir,
base::OnceClosure reply);
- void PeerConnectionAddedInternal(PeerConnectionKey key,
- base::OnceCallback<void(bool)> reply);
- void PeerConnectionRemovedInternal(PeerConnectionKey key,
+ void OnPeerConnectionAddedInternal(PeerConnectionKey key,
base::OnceCallback<void(bool)> reply);
+ void OnPeerConnectionRemovedInternal(PeerConnectionKey key,
+ base::OnceCallback<void(bool)> reply);
- void PeerConnectionSessionIdSetInternal(PeerConnectionKey key,
- const std::string& session_id,
- base::OnceCallback<void(bool)> reply);
+ void OnPeerConnectionSessionIdSetInternal(
+ PeerConnectionKey key,
+ const std::string& session_id,
+ base::OnceCallback<void(bool)> reply);
void EnableLocalLoggingInternal(const base::FilePath& base_path,
size_t max_file_size_bytes,
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h
index 7dd07476c68..b823fdee141 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h
@@ -12,6 +12,7 @@
#include "base/optional.h"
#include "base/time/time.h"
#include "build/build_config.h"
+#include "ipc/ipc_message.h"
class Profile;
@@ -169,24 +170,32 @@ struct WebRtcEventLogPeerConnectionKey {
constexpr WebRtcEventLogPeerConnectionKey()
: WebRtcEventLogPeerConnectionKey(
- /* render_process_id = */ 0,
- /* lid = */ 0,
- reinterpret_cast<BrowserContextId>(nullptr)) {}
+ /*render_process_id=*/0,
+ /*lid=*/0,
+ reinterpret_cast<BrowserContextId>(nullptr),
+ /*render_frame_id=*/MSG_ROUTING_NONE) {}
constexpr WebRtcEventLogPeerConnectionKey(int render_process_id,
int lid,
- BrowserContextId browser_context_id)
+ BrowserContextId browser_context_id,
+ int render_frame_id)
: render_process_id(render_process_id),
lid(lid),
- browser_context_id(browser_context_id) {}
+ browser_context_id(browser_context_id),
+ render_frame_id(render_frame_id) {}
bool operator==(const WebRtcEventLogPeerConnectionKey& other) const {
// Each RPH is associated with exactly one BrowserContext.
DCHECK(render_process_id != other.render_process_id ||
browser_context_id == other.browser_context_id);
+ // If render_process_id and lid are the same, then render_frame_id is also
+ // the same.
+ DCHECK(render_process_id != other.render_process_id || lid != other.lid ||
+ render_frame_id == other.render_frame_id);
const bool equal = std::tie(render_process_id, lid) ==
std::tie(other.render_process_id, other.lid);
+
return equal;
}
@@ -194,6 +203,10 @@ struct WebRtcEventLogPeerConnectionKey {
// Each RPH is associated with exactly one BrowserContext.
DCHECK(render_process_id != other.render_process_id ||
browser_context_id == other.browser_context_id);
+ // If render_process_id and lid are the same, then render_frame_id is also
+ // the same.
+ DCHECK(render_process_id != other.render_process_id || lid != other.lid ||
+ render_frame_id == other.render_frame_id);
return std::tie(render_process_id, lid) <
std::tie(other.render_process_id, other.lid);
@@ -209,6 +222,11 @@ struct WebRtcEventLogPeerConnectionKey {
// is associated with a BrowserContext, and that BrowserContext is almost
// always necessary, so it makes sense to remember it along with the key.
BrowserContextId browser_context_id;
+
+ // The frame ID is not actually part of the key, since `lid` is kept unique
+ // per renderer process. The frame ID is needed to obtain the RenderFrameHost
+ // used for communicating with the renderer process.
+ int render_frame_id;
};
// Sentinel value for an unknown BrowserContext.
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
index 5d4b6f7d430..54093663fbf 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
@@ -21,7 +21,7 @@
#include "third_party/zlib/google/compression_utils.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/test/base/testing_profile.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/scoped_user_manager.h"
@@ -683,9 +683,9 @@ TEST_P(DoesProfileDefaultToLoggingEnabledForUserTypeParametrizedTest,
TestingProfile::Builder profile_builder;
profile_builder.OverridePolicyConnectorIsManagedForTesting(true);
std::unique_ptr<TestingProfile> testing_profile = profile_builder.Build();
- std::unique_ptr<testing::NiceMock<chromeos::FakeChromeUserManager>>
- fake_user_manager_ = std::make_unique<
- testing::NiceMock<chromeos::FakeChromeUserManager>>();
+ std::unique_ptr<testing::NiceMock<ash::FakeChromeUserManager>>
+ fake_user_manager_ =
+ std::make_unique<testing::NiceMock<ash::FakeChromeUserManager>>();
// We use a standard Gaia account by default:
AccountId account_id = AccountId::FromUserEmailGaiaId("name", "id");
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc
index d13b25244aa..3e079a740c3 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc
@@ -40,7 +40,7 @@ WebRtcLocalEventLogManager::~WebRtcLocalEventLogManager() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
-bool WebRtcLocalEventLogManager::PeerConnectionAdded(
+bool WebRtcLocalEventLogManager::OnPeerConnectionAdded(
const PeerConnectionKey& key) {
DCHECK_CALLED_ON_VALID_SEQUENCE(io_task_sequence_checker_);
@@ -59,7 +59,7 @@ bool WebRtcLocalEventLogManager::PeerConnectionAdded(
return true;
}
-bool WebRtcLocalEventLogManager::PeerConnectionRemoved(
+bool WebRtcLocalEventLogManager::OnPeerConnectionRemoved(
const PeerConnectionKey& key) {
DCHECK_CALLED_ON_VALID_SEQUENCE(io_task_sequence_checker_);
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.h b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.h
index 6ebf3e49185..8294b2aefc1 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.h
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_local.h
@@ -26,8 +26,8 @@ class WebRtcLocalEventLogManager final {
explicit WebRtcLocalEventLogManager(WebRtcLocalEventLogsObserver* observer);
~WebRtcLocalEventLogManager();
- bool PeerConnectionAdded(const PeerConnectionKey& key);
- bool PeerConnectionRemoved(const PeerConnectionKey& key);
+ bool OnPeerConnectionAdded(const PeerConnectionKey& key);
+ bool OnPeerConnectionRemoved(const PeerConnectionKey& key);
bool EnableLogging(const base::FilePath& base_path,
size_t max_file_size_bytes);
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
index 04c740308bd..d08a5a09ff6 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
@@ -355,7 +355,7 @@ void WebRtcRemoteEventLogManager::DisableForBrowserContext(
ManageUploadSchedule();
}
-bool WebRtcRemoteEventLogManager::PeerConnectionAdded(
+bool WebRtcRemoteEventLogManager::OnPeerConnectionAdded(
const PeerConnectionKey& key) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
@@ -369,7 +369,7 @@ bool WebRtcRemoteEventLogManager::PeerConnectionAdded(
return result.second;
}
-bool WebRtcRemoteEventLogManager::PeerConnectionRemoved(
+bool WebRtcRemoteEventLogManager::OnPeerConnectionRemoved(
const PeerConnectionKey& key) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
@@ -389,7 +389,7 @@ bool WebRtcRemoteEventLogManager::PeerConnectionRemoved(
return true;
}
-bool WebRtcRemoteEventLogManager::PeerConnectionSessionIdSet(
+bool WebRtcRemoteEventLogManager::OnPeerConnectionSessionIdSet(
const PeerConnectionKey& key,
const std::string& session_id) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
index c042e583469..c472ab8020e 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
@@ -75,14 +75,14 @@ class WebRtcRemoteEventLogManager final
// The return value of both methods indicates only the consistency of the
// information with previously received information (e.g. can't remove a
// peer connection that was never added, etc.).
- bool PeerConnectionAdded(const PeerConnectionKey& key);
- bool PeerConnectionRemoved(const PeerConnectionKey& key);
+ bool OnPeerConnectionAdded(const PeerConnectionKey& key);
+ bool OnPeerConnectionRemoved(const PeerConnectionKey& key);
// Called to inform |this| that a peer connection has been associated
// with |session_id|. After this, it is possible to refer to that peer
// connection using StartRemoteLogging() by providing |session_id|.
- bool PeerConnectionSessionIdSet(const PeerConnectionKey& key,
- const std::string& session_id);
+ bool OnPeerConnectionSessionIdSet(const PeerConnectionKey& key,
+ const std::string& session_id);
// Attempt to start logging the WebRTC events of an active peer connection.
// Logging is subject to several restrictions:
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
index a1a19df28c4..fb3a1bdf0e5 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
@@ -50,6 +50,7 @@
#include "components/prefs/testing_pref_store.h"
#include "components/sync_preferences/pref_service_mock_factory.h"
#include "components/sync_preferences/pref_service_syncable.h"
+#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/network_service_instance.h"
#include "content/public/test/browser_task_environment.h"
#include "content/public/test/mock_render_process_host.h"
@@ -68,7 +69,7 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/scoped_user_manager.h"
#endif
@@ -131,11 +132,12 @@ base::Time GetLastModificationTime(const base::FilePath& file_path) {
// Common default/arbitrary values.
constexpr int kLid = 478;
constexpr size_t kWebAppId = 42;
+constexpr int kFrameId = 57;
PeerConnectionKey GetPeerConnectionKey(RenderProcessHost* rph, int lid) {
const BrowserContext* browser_context = rph->GetBrowserContext();
const auto browser_context_id = GetBrowserContextId(browser_context);
- return PeerConnectionKey(rph->GetID(), lid, browser_context_id);
+ return PeerConnectionKey(rph->GetID(), lid, browser_context_id, kFrameId);
}
bool CreateRemoteBoundLogFile(const base::FilePath& dir,
@@ -361,7 +363,7 @@ class WebRtcEventLogManagerTestBase : public ::testing::Test {
void WaitForReply() {
run_loop_->Run();
- run_loop_.reset(new base::RunLoop); // Allow re-blocking.
+ run_loop_ = std::make_unique<base::RunLoop>(); // Allow re-blocking.
}
void Reply() { run_loop_->QuitWhenIdle(); }
@@ -414,39 +416,47 @@ class WebRtcEventLogManagerTestBase : public ::testing::Test {
output_str1, output_str2);
}
- bool PeerConnectionAdded(const PeerConnectionKey& key) {
+ bool OnPeerConnectionAdded(const PeerConnectionKey& key) {
bool result;
- event_log_manager_->PeerConnectionAdded(key.render_process_id, key.lid,
- ReplyClosure(&result));
+ event_log_manager_->OnPeerConnectionAdded(
+ content::GlobalFrameRoutingId(key.render_process_id,
+ key.render_frame_id),
+ key.lid, ReplyClosure(&result));
WaitForReply();
return result;
}
- bool PeerConnectionRemoved(const PeerConnectionKey& key) {
+ bool OnPeerConnectionRemoved(const PeerConnectionKey& key) {
bool result;
- event_log_manager_->PeerConnectionRemoved(key.render_process_id, key.lid,
- ReplyClosure(&result));
+ event_log_manager_->OnPeerConnectionRemoved(
+ content::GlobalFrameRoutingId(key.render_process_id,
+ key.render_frame_id),
+ key.lid, ReplyClosure(&result));
WaitForReply();
return result;
}
- bool PeerConnectionSessionIdSet(const PeerConnectionKey& key,
- const std::string& session_id) {
+ bool OnPeerConnectionSessionIdSet(const PeerConnectionKey& key,
+ const std::string& session_id) {
bool result;
- event_log_manager_->PeerConnectionSessionIdSet(
- key.render_process_id, key.lid, session_id, ReplyClosure(&result));
+ event_log_manager_->OnPeerConnectionSessionIdSet(
+ content::GlobalFrameRoutingId(key.render_process_id,
+ key.render_frame_id),
+ key.lid, session_id, ReplyClosure(&result));
WaitForReply();
return result;
}
- bool PeerConnectionSessionIdSet(const PeerConnectionKey& key) {
- return PeerConnectionSessionIdSet(key, GetUniqueId(key));
+ bool OnPeerConnectionSessionIdSet(const PeerConnectionKey& key) {
+ return OnPeerConnectionSessionIdSet(key, GetUniqueId(key));
}
- bool PeerConnectionStopped(const PeerConnectionKey& key) {
+ bool OnPeerConnectionStopped(const PeerConnectionKey& key) {
bool result;
- event_log_manager_->PeerConnectionStopped(key.render_process_id, key.lid,
- ReplyClosure(&result));
+ event_log_manager_->OnPeerConnectionStopped(
+ content::GlobalFrameRoutingId(key.render_process_id,
+ key.render_frame_id),
+ key.lid, ReplyClosure(&result));
WaitForReply();
return result;
}
@@ -569,8 +579,10 @@ class WebRtcEventLogManagerTestBase : public ::testing::Test {
std::pair<bool, bool> OnWebRtcEventLogWrite(const PeerConnectionKey& key,
const std::string& message) {
std::pair<bool, bool> result;
- event_log_manager_->OnWebRtcEventLogWrite(key.render_process_id, key.lid,
- message, ReplyClosure(&result));
+ event_log_manager_->OnWebRtcEventLogWrite(
+ content::GlobalFrameRoutingId(key.render_process_id,
+ key.render_frame_id),
+ key.lid, message, ReplyClosure(&result));
WaitForReply();
return result;
}
@@ -742,13 +754,13 @@ class WebRtcEventLogManagerTestBase : public ::testing::Test {
upload_suppressing_rph_ = std::make_unique<MockRenderProcessHost>(
upload_suppressing_browser_context_.get());
const auto key = GetPeerConnectionKey(upload_suppressing_rph_.get(), 0);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
}
void UnsuppressUploading() {
DCHECK(upload_suppressing_rph_) << "Uploading not suppressed.";
const auto key = GetPeerConnectionKey(upload_suppressing_rph_.get(), 0);
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
upload_suppressing_rph_.reset();
}
@@ -941,12 +953,12 @@ class WebRtcEventLogManagerTestCacheClearing
base::Optional<base::FilePath> file_path;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- EXPECT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key));
+ EXPECT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_TRUE(StartRemoteLogging(key));
if (pending) {
// Transition from ACTIVE to PENDING.
- EXPECT_TRUE(PeerConnectionRemoved(key));
+ EXPECT_TRUE(OnPeerConnectionRemoved(key));
}
return file_path;
}
@@ -1357,89 +1369,89 @@ class FileListExpectingWebRtcEventLogUploader : public WebRtcEventLogUploader {
} // namespace
-TEST_F(WebRtcEventLogManagerTest, PeerConnectionAddedReturnsTrue) {
+TEST_F(WebRtcEventLogManagerTest, OnPeerConnectionAddedReturnsTrue) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- EXPECT_TRUE(PeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionAdded(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionAddedReturnsFalseIfAlreadyAdded) {
+ OnPeerConnectionAddedReturnsFalseIfAlreadyAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_FALSE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_FALSE(OnPeerConnectionAdded(key));
}
-TEST_F(WebRtcEventLogManagerTest, PeerConnectionRemovedReturnsTrue) {
+TEST_F(WebRtcEventLogManagerTest, OnPeerConnectionRemovedReturnsTrue) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionRemovedReturnsFalseIfNeverAdded) {
+ OnPeerConnectionRemovedReturnsFalseIfNeverAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- EXPECT_FALSE(PeerConnectionRemoved(key));
+ EXPECT_FALSE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionRemovedReturnsFalseIfAlreadyRemoved) {
+ OnPeerConnectionRemovedReturnsFalseIfAlreadyRemoved) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
- EXPECT_FALSE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
+ EXPECT_FALSE(OnPeerConnectionRemoved(key));
}
-TEST_F(WebRtcEventLogManagerTest, PeerConnectionSessionIdSetReturnsTrue) {
+TEST_F(WebRtcEventLogManagerTest, OnPeerConnectionSessionIdSetReturnsTrue) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetReturnsFalseIfEmptyString) {
+ OnPeerConnectionSessionIdSetReturnsFalseIfEmptyString) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_FALSE(PeerConnectionSessionIdSet(key, ""));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_FALSE(OnPeerConnectionSessionIdSet(key, ""));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetReturnsFalseIfPeerConnectionNeverAdded) {
+ OnPeerConnectionSessionIdSetReturnsFalseIfPeerConnectionNeverAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- EXPECT_FALSE(PeerConnectionSessionIdSet(key, kSessionId));
+ EXPECT_FALSE(OnPeerConnectionSessionIdSet(key, kSessionId));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetReturnsFalseIfPeerConnectionAlreadyRemoved) {
+ OnPeerConnectionSessionIdSetReturnsFalseIfPeerConnectionAlreadyRemoved) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
- EXPECT_FALSE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
+ EXPECT_FALSE(OnPeerConnectionSessionIdSet(key, kSessionId));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetReturnsTrueIfAlreadyCalledSameId) {
+ OnPeerConnectionSessionIdSetReturnsTrueIfAlreadyCalledSameId) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetReturnsFalseIfAlreadyCalledDifferentId) {
+ OnPeerConnectionSessionIdSetReturnsFalseIfAlreadyCalledDifferentId) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, "id1"));
- EXPECT_FALSE(PeerConnectionSessionIdSet(key, "id2"));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, "id1"));
+ EXPECT_FALSE(OnPeerConnectionSessionIdSet(key, "id2"));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionSessionIdSetCalledOnRecreatedPeerConnectionSanity) {
+ OnPeerConnectionSessionIdSetCalledOnRecreatedPeerConnectionSanity) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
- ASSERT_TRUE(PeerConnectionRemoved(key));
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
}
TEST_F(WebRtcEventLogManagerTest, EnableLocalLoggingReturnsTrue) {
@@ -1471,7 +1483,7 @@ TEST_F(WebRtcEventLogManagerTest,
OnWebRtcEventLogWriteReturnsFalseAndFalseWhenAllLoggingDisabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
// Note that EnableLocalLogging() and StartRemoteLogging() weren't called.
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
}
@@ -1479,7 +1491,7 @@ TEST_F(WebRtcEventLogManagerTest,
OnWebRtcEventLogWriteReturnsFalseAndFalseForUnknownPeerConnection) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
ASSERT_TRUE(EnableLocalLogging());
- // Note that PeerConnectionAdded() wasn't called.
+ // Note that OnPeerConnectionAdded() wasn't called.
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
}
@@ -1487,15 +1499,15 @@ TEST_F(WebRtcEventLogManagerTest,
OnWebRtcEventLogWriteReturnsLocalTrueWhenPcKnownAndLocalLoggingOn) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(true, false));
}
TEST_F(WebRtcEventLogManagerTest,
OnWebRtcEventLogWriteReturnsRemoteTrueWhenPcKnownAndRemoteLogging) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, true));
}
@@ -1503,8 +1515,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
OnWebRtcEventLogWriteReturnsTrueAndTrueeWhenAllLoggingEnabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ASSERT_TRUE(StartRemoteLogging(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(true, true));
@@ -1524,37 +1536,37 @@ TEST_F(WebRtcEventLogManagerTest,
}
TEST_F(WebRtcEventLogManagerTest,
- OnLocalLogStartedCalledForPeerConnectionAddedAndLocalLoggingEnabled) {
+ OnLocalLogStartedCalledForOnPeerConnectionAddedAndLocalLoggingEnabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(EnableLocalLogging());
}
TEST_F(WebRtcEventLogManagerTest,
- OnLocalLogStartedCalledForLocalLoggingEnabledAndPeerConnectionAdded) {
+ OnLocalLogStartedCalledForLocalLoggingEnabledAndOnPeerConnectionAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
}
TEST_F(WebRtcEventLogManagerTest,
OnLocalLogStoppedCalledAfterLocalLoggingDisabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(EnableLocalLogging());
ASSERT_TRUE(DisableLocalLogging());
}
TEST_F(WebRtcEventLogManagerTest,
- OnLocalLogStoppedCalledAfterPeerConnectionRemoved) {
+ OnLocalLogStoppedCalledAfterOnPeerConnectionRemoved) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest, LocalLogCreatesEmptyFileWhenStarted) {
@@ -1564,12 +1576,12 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogCreatesEmptyFileWhenStarted) {
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*file_path, std::string());
}
@@ -1582,7 +1594,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogCreateAndWriteToFile) {
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1590,7 +1602,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogCreateAndWriteToFile) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(true, false));
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*file_path, log);
}
@@ -1603,7 +1615,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogMultipleWritesToSameFile) {
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1616,7 +1628,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogMultipleWritesToSameFile) {
}
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(
*file_path,
@@ -1634,7 +1646,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogFileSizeLimitNotExceeded) {
const size_t file_size_limit_bytes = log.length() / 2;
ASSERT_TRUE(EnableLocalLogging(file_size_limit_bytes));
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1658,7 +1670,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogSanityOverUnlimitedFileSizes) {
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging(kWebRtcEventLogManagerUnlimitedFileSize));
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1668,7 +1680,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogSanityOverUnlimitedFileSizes) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, log2), std::make_pair(true, false));
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*file_path, log1 + log2);
}
@@ -1681,7 +1693,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogNoWriteAfterLogStopped) {
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1689,7 +1701,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogNoWriteAfterLogStopped) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, log_before),
std::make_pair(true, false));
EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
const std::string log_after = "log_after_stop";
ASSERT_EQ(OnWebRtcEventLogWrite(key, log_after),
@@ -1713,7 +1725,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogOnlyWritesTheLogsAfterStarted) {
.WillOnce(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1723,7 +1735,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogOnlyWritesTheLogsAfterStarted) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, log2), std::make_pair(true, false));
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*file_path, log2);
}
@@ -1737,7 +1749,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLoggingRestartCreatesNewFile) {
std::vector<base::Optional<PeerConnectionKey>> keys(logs.size());
std::vector<base::Optional<base::FilePath>> file_paths(logs.size());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
for (size_t i = 0; i < logs.size(); ++i) {
ON_CALL(local_observer_, OnLocalLogStarted(_, _))
@@ -1773,7 +1785,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogMultipleActiveFiles) {
for (size_t i = 0; i < keys.size(); ++i) {
ON_CALL(local_observer_, OnLocalLogStarted(keys[i], _))
.WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
- ASSERT_TRUE(PeerConnectionAdded(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[i]));
ASSERT_TRUE(file_paths[i]);
ASSERT_FALSE(file_paths[i]->empty());
}
@@ -1801,12 +1813,12 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogLimitActiveLocalLogFiles) {
for (int i = 0; i < kMaxLocalLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
}
EXPECT_CALL(local_observer_, OnLocalLogStarted(_, _)).Times(0);
const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
- ASSERT_TRUE(PeerConnectionAdded(last_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(last_key));
}
// When a log reaches its maximum size limit, it is closed, and no longer
@@ -1820,7 +1832,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogFilledLogNotCountedTowardsLogsLimit) {
for (int i = 0; i < kMaxLocalLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
}
// By writing to one of the logs, we fill it and end up closing it, allowing
@@ -1832,7 +1844,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogFilledLogNotCountedTowardsLogsLimit) {
// We now have room for one additional log.
const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
EXPECT_CALL(local_observer_, OnLocalLogStarted(last_key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(last_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(last_key));
}
TEST_F(WebRtcEventLogManagerTest,
@@ -1844,19 +1856,19 @@ TEST_F(WebRtcEventLogManagerTest,
for (int i = 0; i < kMaxLocalLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
}
// When one peer connection is removed, one log is stopped, thereby allowing
// an additional log to be opened.
const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
EXPECT_CALL(local_observer_, OnLocalLogStopped(removed_key)).Times(1);
- ASSERT_TRUE(PeerConnectionRemoved(removed_key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(removed_key));
// We now have room for one additional log.
const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
EXPECT_CALL(local_observer_, OnLocalLogStarted(last_key, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(last_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(last_key));
}
TEST_F(WebRtcEventLogManagerTest, LocalLogIllegalPath) {
@@ -1865,7 +1877,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogIllegalPath) {
EXPECT_CALL(local_observer_, OnLocalLogStopped(_)).Times(0);
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
// See the documentation of the function for why |true| is expected despite
// the path being illegal.
@@ -1884,7 +1896,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogLegalPathWithoutPermissionsSanity) {
EXPECT_CALL(local_observer_, OnLocalLogStopped(_)).Times(0);
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
// See the documentation of the function for why |true| is expected despite
// the path being illegal.
@@ -1916,7 +1928,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogEmptyStringHandledGracefully) {
ON_CALL(local_observer_, OnLocalLogStarted(key, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -1957,7 +1969,7 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogFilenameMatchesExpectedFormat) {
local_logs_base_dir_.GetPath().Append(user_defined);
ASSERT_TRUE(EnableLocalLogging(local_logs_base_path));
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -2004,7 +2016,7 @@ TEST_F(WebRtcEventLogManagerTest,
local_logs_base_dir_.GetPath().Append(user_defined_portion);
ASSERT_TRUE(EnableLocalLogging(local_logs_base_path));
- ASSERT_TRUE(PeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
ASSERT_TRUE(file_path_1);
ASSERT_FALSE(file_path_1->empty());
@@ -2037,25 +2049,25 @@ TEST_F(WebRtcEventLogManagerTest,
OnRemoteLogStartedNotCalledIfRemoteLoggingNotEnabled) {
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(_, _, _)).Times(0);
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key));
}
TEST_F(WebRtcEventLogManagerTest,
OnRemoteLogStoppedNotCalledIfRemoteLoggingNotEnabled) {
EXPECT_CALL(remote_observer_, OnRemoteLogStopped(_)).Times(0);
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- EXPECT_TRUE(PeerConnectionSessionIdSet(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest,
OnRemoteLogStartedCalledIfRemoteLoggingEnabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
}
@@ -2063,10 +2075,10 @@ TEST_F(WebRtcEventLogManagerTest,
OnRemoteLogStoppedCalledIfRemoteLoggingEnabledThenPcRemoved) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest,
@@ -2090,8 +2102,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfUnknownSessionId) {
const auto key = GetPeerConnectionKey(rph_.get(), 0);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, "wrong_id", nullptr, &error_message));
EXPECT_EQ(error_message,
@@ -2101,16 +2113,16 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsTrueIfKnownSessionId) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
EXPECT_TRUE(StartRemoteLogging(key, kSessionId));
}
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfRestartAttempt) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
ASSERT_TRUE(StartRemoteLogging(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId, nullptr, &error_message));
@@ -2120,8 +2132,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfUnlimitedFileSize) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId,
kWebRtcEventLogManagerUnlimitedFileSize, 0,
@@ -2132,8 +2144,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsTrueIfFileSizeAtOrBelowLimit) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
EXPECT_TRUE(StartRemoteLogging(key, kSessionId, kMaxRemoteLogFileSizeBytes, 0,
kWebAppId));
}
@@ -2145,8 +2157,8 @@ TEST_F(WebRtcEventLogManagerTest,
->MinFileSizeBytes();
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId, min_size - 1, 0, kWebAppId,
nullptr, &error_message));
@@ -2156,8 +2168,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfExcessivelyLargeFileSize) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId,
kMaxRemoteLogFileSizeBytes + 1, 0, kWebAppId,
@@ -2168,8 +2180,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfExcessivelyLargeOutputPeriodMs) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId, kMaxRemoteLogFileSizeBytes,
kMaxOutputPeriodMs + 1, kWebAppId, nullptr,
@@ -2180,9 +2192,9 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsFalseIfPeerConnectionAlreadyClosed) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, kSessionId, nullptr, &error_message));
EXPECT_EQ(error_message,
@@ -2192,9 +2204,9 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingDoesNotReturnIdWhenUnsuccessful) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
std::string log_id;
ASSERT_FALSE(StartRemoteLogging(key, kSessionId, &log_id));
@@ -2205,8 +2217,8 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingReturnsLegalIdWhenSuccessful) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
std::string log_id;
ASSERT_TRUE(StartRemoteLogging(key, kSessionId, &log_id));
@@ -2223,8 +2235,8 @@ TEST_F(WebRtcEventLogManagerTest,
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
std::string log_id;
ASSERT_TRUE(StartRemoteLogging(key, &log_id));
@@ -2252,17 +2264,19 @@ TEST_F(WebRtcEventLogManagerTest, StartRemoteLoggingCreatesEmptyFile) {
.Times(1)
.WillOnce(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
// Close file before examining its contents.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectRemoteFileContents(*file_path, std::string());
}
-TEST_F(WebRtcEventLogManagerTest, RemoteLogFileCreatedInCorrectDirectory) {
+// TODO(crbug.com/1185008): Fix this flaky test.
+TEST_F(WebRtcEventLogManagerTest,
+ DISABLED_RemoteLogFileCreatedInCorrectDirectory) {
// Set up separate browser contexts; each one will get one log.
constexpr size_t kLogsNum = 3;
std::unique_ptr<TestingProfile> browser_contexts[kLogsNum];
@@ -2285,8 +2299,8 @@ TEST_F(WebRtcEventLogManagerTest, RemoteLogFileCreatedInCorrectDirectory) {
// Start one log for each browser context.
for (const auto& rph : rphs) {
const auto key = GetPeerConnectionKey(&*rph, kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
}
@@ -2310,10 +2324,10 @@ TEST_F(WebRtcEventLogManagerTest,
// The ID is shared, but that's not a problem, because the renderer process
// are different.
const std::string id = "shared_id";
- ASSERT_TRUE(PeerConnectionAdded(keys[0]));
- PeerConnectionSessionIdSet(keys[0], id);
- ASSERT_TRUE(PeerConnectionAdded(keys[1]));
- PeerConnectionSessionIdSet(keys[1], id);
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[0]));
+ OnPeerConnectionSessionIdSet(keys[0], id);
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[1]));
+ OnPeerConnectionSessionIdSet(keys[1], id);
// Make sure the logs get written to separate files.
base::Optional<base::FilePath> file_paths[2];
@@ -2339,23 +2353,23 @@ TEST_F(WebRtcEventLogManagerTest,
.Times(1)
.WillOnce(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
const char* const log = "1 + 1 = 3";
EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, true));
// Close file before examining its contents.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectRemoteFileContents(*file_path, log);
}
TEST_F(WebRtcEventLogManagerTest, WriteToBothLocalAndRemoteFiles) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> local_path;
EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _))
@@ -2379,7 +2393,7 @@ TEST_F(WebRtcEventLogManagerTest, WriteToBothLocalAndRemoteFiles) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(true, true));
// Ensure the flushing of the file to disk before attempting to read them.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*local_path, log);
ExpectRemoteFileContents(*remote_path, log);
@@ -2392,8 +2406,8 @@ TEST_F(WebRtcEventLogManagerTest, MultipleWritesToSameRemoteBoundLogfile) {
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -2404,7 +2418,7 @@ TEST_F(WebRtcEventLogManagerTest, MultipleWritesToSameRemoteBoundLogfile) {
}
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectRemoteFileContents(
*file_path,
@@ -2420,8 +2434,8 @@ TEST_F(WebRtcEventLogManagerTest,
const std::string log = "tpyo";
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
ASSERT_TRUE(
StartRemoteLogging(key, kSessionId, GzippedSize(log) - 1, 0, kWebAppId));
@@ -2431,7 +2445,7 @@ TEST_F(WebRtcEventLogManagerTest,
ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
// No partial writes occurred.
ExpectRemoteFileContents(*file_path, std::string());
@@ -2447,8 +2461,8 @@ TEST_F(WebRtcEventLogManagerTest,
const std::string log1 = "abcabc";
const std::string log2 = "defghijklmnopqrstuvwxyz";
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key, kSessionId));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key, kSessionId));
ASSERT_TRUE(
StartRemoteLogging(key, kSessionId, 1 + GzippedSize(log1), 0, kWebAppId));
@@ -2473,8 +2487,8 @@ TEST_F(WebRtcEventLogManagerTest,
for (size_t i = 0; i < keys.size(); ++i) {
ON_CALL(remote_observer_, OnRemoteLogStarted(keys[i], _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
- ASSERT_TRUE(PeerConnectionAdded(keys[i]));
- ASSERT_TRUE(PeerConnectionSessionIdSet(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(keys[i]));
ASSERT_TRUE(StartRemoteLogging(keys[i]));
ASSERT_TRUE(file_paths[i]);
ASSERT_FALSE(file_paths[i]->empty());
@@ -2489,7 +2503,7 @@ TEST_F(WebRtcEventLogManagerTest,
// Make sure the file woulds be closed, so that we could safely read them.
for (auto& key : keys) {
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
for (size_t i = 0; i < keys.size(); ++i) {
@@ -2497,8 +2511,9 @@ TEST_F(WebRtcEventLogManagerTest,
}
}
+// TODO(crbug.com/1112027): Fix this flaky test.
TEST_F(WebRtcEventLogManagerTest,
- LogMultipleActiveRemoteLogsDifferentBrowserContexts) {
+ DISABLED_LogMultipleActiveRemoteLogsDifferentBrowserContexts) {
constexpr size_t kLogsNum = 3;
std::unique_ptr<TestingProfile> browser_contexts[kLogsNum];
std::vector<std::unique_ptr<MockRenderProcessHost>> rphs;
@@ -2517,8 +2532,8 @@ TEST_F(WebRtcEventLogManagerTest,
for (size_t i = 0; i < keys.size(); ++i) {
ON_CALL(remote_observer_, OnRemoteLogStarted(keys[i], _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
- ASSERT_TRUE(PeerConnectionAdded(keys[i]));
- ASSERT_TRUE(PeerConnectionSessionIdSet(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(keys[i]));
ASSERT_TRUE(StartRemoteLogging(keys[i]));
ASSERT_TRUE(file_paths[i]);
ASSERT_FALSE(file_paths[i]->empty());
@@ -2533,7 +2548,7 @@ TEST_F(WebRtcEventLogManagerTest,
// Make sure the file woulds be closed, so that we could safely read them.
for (auto& key : keys) {
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
for (size_t i = 0; i < keys.size(); ++i) {
@@ -2552,9 +2567,9 @@ TEST_F(WebRtcEventLogManagerTest, DifferentRemoteLogsMayHaveDifferentMaximums) {
}
for (size_t i = 0; i < keys.size(); ++i) {
- ASSERT_TRUE(PeerConnectionAdded(keys[i]));
+ ASSERT_TRUE(OnPeerConnectionAdded(keys[i]));
const std::string session_id = GetUniqueId(keys[i]);
- ASSERT_TRUE(PeerConnectionSessionIdSet(keys[i], session_id));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(keys[i], session_id));
ASSERT_TRUE(StartRemoteLogging(keys[i], session_id, GzippedSize(logs[i]), 0,
kWebAppId));
}
@@ -2578,8 +2593,8 @@ TEST_F(WebRtcEventLogManagerTest, RemoteLogFileClosedWhenCapacityReached) {
const std::string log = "Let X equal X.";
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log), 0,
kWebAppId));
ASSERT_TRUE(file_path);
@@ -2608,12 +2623,12 @@ TEST_F(WebRtcEventLogManagerTest,
LoadMainTestProfile();
EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
- // Graceful handling of PeerConnectionAdded: True returned because the
+ // Graceful handling of OnPeerConnectionAdded: True returned because the
// remote-logs' manager can still safely reason about the state of peer
// connections even if one of its browser contexts is defective.)
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- EXPECT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ EXPECT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
// Graceful handling of StartRemoteLogging: False returned because it's
// impossible to write the log to a file.
@@ -2627,10 +2642,10 @@ TEST_F(WebRtcEventLogManagerTest,
const char* const log = "This is not a log.";
EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
- // Graceful handling of PeerConnectionRemoved: True returned because the
+ // Graceful handling of OnPeerConnectionRemoved: True returned because the
// remote-logs' manager can still safely reason about the state of peer
// connections even if one of its browser contexts is defective.
- EXPECT_TRUE(PeerConnectionRemoved(key));
+ EXPECT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest, GracefullyHandleFailureToStartRemoteLogFile) {
@@ -2646,8 +2661,8 @@ TEST_F(WebRtcEventLogManagerTest, GracefullyHandleFailureToStartRemoteLogFile) {
// StartRemoteLogging() will now fail.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
EXPECT_EQ(error_message, kStartRemoteLoggingFailureFileCreationError);
@@ -2659,8 +2674,8 @@ TEST_F(WebRtcEventLogManagerTest, GracefullyHandleFailureToStartRemoteLogFile) {
TEST_F(WebRtcEventLogManagerTest, RemoteLogLimitActiveLogFiles) {
for (int i = 0; i < kMaxActiveRemoteLogFiles + 1; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
}
for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
@@ -2681,8 +2696,8 @@ TEST_F(WebRtcEventLogManagerTest,
for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _)).Times(1);
ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log), 0,
kWebAppId));
@@ -2698,8 +2713,8 @@ TEST_F(WebRtcEventLogManagerTest,
const auto new_key =
GetPeerConnectionKey(rph_.get(), kMaxActiveRemoteLogFiles);
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(new_key, _, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(new_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(new_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(new_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(new_key));
ASSERT_TRUE(StartRemoteLogging(new_key));
}
@@ -2707,8 +2722,8 @@ TEST_F(WebRtcEventLogManagerTest,
RemoteLogForRemovedPeerConnectionNotCountedTowardsLogsLimit) {
for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _)).Times(1);
ASSERT_TRUE(StartRemoteLogging(key));
}
@@ -2716,14 +2731,14 @@ TEST_F(WebRtcEventLogManagerTest,
// By removing a peer connection associated with one of the logs, we allow
// an additional log.
const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
- ASSERT_TRUE(PeerConnectionRemoved(removed_key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(removed_key));
// We now have room for one additional log.
const auto last_key =
GetPeerConnectionKey(rph_.get(), kMaxActiveRemoteLogFiles);
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(last_key, _, _)).Times(1);
- ASSERT_TRUE(PeerConnectionAdded(last_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(last_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(last_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(last_key));
ASSERT_TRUE(StartRemoteLogging(last_key));
}
@@ -2734,10 +2749,10 @@ TEST_F(WebRtcEventLogManagerTest,
// Produce kMaxPendingRemoteLogFiles pending logs.
for (int i = 0; i < kMaxPendingRemoteLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rph_.get(), i);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
}
// It is now impossible to start another *active* log for that BrowserContext,
@@ -2745,8 +2760,8 @@ TEST_F(WebRtcEventLogManagerTest,
// once completed).
const auto forbidden =
GetPeerConnectionKey(rph_.get(), kMaxPendingRemoteLogFiles);
- ASSERT_TRUE(PeerConnectionAdded(forbidden));
- ASSERT_TRUE(PeerConnectionSessionIdSet(forbidden));
+ ASSERT_TRUE(OnPeerConnectionAdded(forbidden));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(forbidden));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(forbidden, nullptr, &error_message));
EXPECT_EQ(error_message,
@@ -2769,19 +2784,19 @@ TEST_F(WebRtcEventLogManagerTest,
for (int i = 0; i < kMaxPendingRemoteLogFiles; ++i) {
const auto key = GetPeerConnectionKey(rphs[0].get(), i);
// The log could be opened:
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
// The log changes state from ACTIVE to PENDING:
- EXPECT_TRUE(PeerConnectionRemoved(key));
+ EXPECT_TRUE(OnPeerConnectionRemoved(key));
}
// Not allowed to start any more remote-bound logs for the BrowserContext on
// which the limit was reached.
const auto key0 =
GetPeerConnectionKey(rphs[0].get(), kMaxPendingRemoteLogFiles);
- ASSERT_TRUE(PeerConnectionAdded(key0));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key0));
+ ASSERT_TRUE(OnPeerConnectionAdded(key0));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key0));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key0, nullptr, &error_message));
EXPECT_EQ(error_message,
@@ -2789,8 +2804,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Other BrowserContexts aren't limit by the previous one's limit.
const auto key1 = GetPeerConnectionKey(rphs[1].get(), 0);
- ASSERT_TRUE(PeerConnectionAdded(key1));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key1));
+ ASSERT_TRUE(OnPeerConnectionAdded(key1));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key1));
EXPECT_TRUE(StartRemoteLogging(key1));
}
@@ -2896,7 +2911,7 @@ TEST_F(WebRtcEventLogManagerTest,
}
TEST_P(WebRtcEventLogManagerTest,
- WhenPeerConnectionRemovedFinishedRemoteLogUploadedAndFileDeleted) {
+ WhenOnPeerConnectionRemovedFinishedRemoteLogUploadedAndFileDeleted) {
// |upload_result| show that the files are deleted independent of the
// upload's success / failure.
const bool upload_result = GetParam();
@@ -2905,8 +2920,8 @@ TEST_P(WebRtcEventLogManagerTest,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
@@ -2918,7 +2933,7 @@ TEST_P(WebRtcEventLogManagerTest,
&expected_files, upload_result, &run_loop));
// Peer connection removal triggers next upload.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
@@ -2935,8 +2950,8 @@ TEST_P(WebRtcEventLogManagerTest, DestroyedRphTriggersLogUpload) {
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
@@ -2963,19 +2978,19 @@ TEST_F(WebRtcEventLogManagerTest, UploadOnlyWhenNoActivePeerConnections) {
const auto tracked = GetPeerConnectionKey(rph_.get(), 1);
// Suppresses the uploading of the "tracked" peer connection's log.
- ASSERT_TRUE(PeerConnectionAdded(untracked));
- ASSERT_TRUE(PeerConnectionSessionIdSet(untracked));
+ ASSERT_TRUE(OnPeerConnectionAdded(untracked));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(untracked));
// The tracked peer connection's log is not uploaded when finished, because
// another peer connection is still active.
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(tracked, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(tracked));
- ASSERT_TRUE(PeerConnectionSessionIdSet(tracked));
+ ASSERT_TRUE(OnPeerConnectionAdded(tracked));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(tracked));
ASSERT_TRUE(StartRemoteLogging(tracked));
ASSERT_TRUE(log_file);
- ASSERT_TRUE(PeerConnectionRemoved(tracked));
+ ASSERT_TRUE(OnPeerConnectionRemoved(tracked));
// Perform another action synchronously, so that we may be assured that the
// observer's lack of callbacks was not a timing fluke.
@@ -2990,7 +3005,7 @@ TEST_F(WebRtcEventLogManagerTest, UploadOnlyWhenNoActivePeerConnections) {
SetWebRtcEventLogUploaderFactoryForTesting(
std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
&expected_uploads, true, &run_loop));
- ASSERT_TRUE(PeerConnectionRemoved(untracked));
+ ASSERT_TRUE(OnPeerConnectionRemoved(untracked));
WaitForPendingTasks(&run_loop);
}
@@ -3062,8 +3077,8 @@ TEST_F(WebRtcEventLogManagerTest, RemoteLogEmptyStringHandledGracefully) {
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -3071,7 +3086,7 @@ TEST_F(WebRtcEventLogManagerTest, RemoteLogEmptyStringHandledGracefully) {
for (size_t i = 0; i < logs.size(); ++i) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, logs[i]), std::make_pair(false, true));
}
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectRemoteFileContents(
*file_path,
@@ -3101,8 +3116,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Fail to start a log associated with the permission-lacking directory.
const auto without_permissions_key =
GetPeerConnectionKey(rphs[without_permissions].get(), 0);
- ASSERT_TRUE(PeerConnectionAdded(without_permissions_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(without_permissions_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(without_permissions_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(without_permissions_key));
std::string error;
ASSERT_FALSE(StartRemoteLogging(without_permissions_key, nullptr, &error));
EXPECT_EQ(error, kStartRemoteLoggingFailureFileCreationError);
@@ -3111,8 +3126,8 @@ TEST_F(WebRtcEventLogManagerTest,
for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
const auto with_permissions_key =
GetPeerConnectionKey(rphs[with_permissions].get(), i);
- ASSERT_TRUE(PeerConnectionAdded(with_permissions_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(with_permissions_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(with_permissions_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(with_permissions_key));
EXPECT_TRUE(StartRemoteLogging(with_permissions_key));
}
}
@@ -3131,29 +3146,29 @@ TEST_F(WebRtcEventLogManagerTest,
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_TRUE(webrtc_state_change_instructions_.empty());
}
TEST_F(WebRtcEventLogManagerTest,
- StartWebRtcSendingEventLogsWhenLocalEnabledThenPeerConnectionAdded) {
+ StartWebRtcSendingEventLogsWhenLocalEnabledThenOnPeerConnectionAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ExpectWebRtcStateChangeInstruction(key, true);
}
TEST_F(WebRtcEventLogManagerTest,
- StartWebRtcSendingEventLogsWhenPeerConnectionAddedThenLocalEnabled) {
+ StartWebRtcSendingEventLogsWhenOnPeerConnectionAddedThenLocalEnabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ExpectWebRtcStateChangeInstruction(key, true);
}
@@ -3163,8 +3178,8 @@ TEST_F(WebRtcEventLogManagerTest,
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ExpectWebRtcStateChangeInstruction(key, true);
}
@@ -3176,8 +3191,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ExpectWebRtcStateChangeInstruction(key, true);
@@ -3188,37 +3203,37 @@ TEST_F(WebRtcEventLogManagerTest,
// #1 - Local logging was the cause of the logs.
TEST_F(WebRtcEventLogManagerTest,
- InstructWebRtcToStopSendingEventLogsWhenPeerConnectionRemoved1) {
+ InstructWebRtcToStopSendingEventLogsWhenOnPeerConnectionRemoved1) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ExpectWebRtcStateChangeInstruction(key, true);
// Test
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectWebRtcStateChangeInstruction(key, false);
}
// #2 - Remote logging was the cause of the logs.
TEST_F(WebRtcEventLogManagerTest,
- InstructWebRtcToStopSendingEventLogsWhenPeerConnectionRemoved2) {
+ InstructWebRtcToStopSendingEventLogsWhenOnPeerConnectionRemoved2) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ExpectWebRtcStateChangeInstruction(key, true);
// Test
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectWebRtcStateChangeInstruction(key, false);
}
@@ -3230,8 +3245,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ExpectWebRtcStateChangeInstruction(key, true);
@@ -3248,8 +3263,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ExpectWebRtcStateChangeInstruction(key, true);
@@ -3265,8 +3280,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ASSERT_TRUE(StartRemoteLogging(key));
ExpectWebRtcStateChangeInstruction(key, true);
@@ -3276,7 +3291,7 @@ TEST_F(WebRtcEventLogManagerTest,
EXPECT_TRUE(webrtc_state_change_instructions_.empty());
// Cleanup
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectWebRtcStateChangeInstruction(key, false);
}
@@ -3287,14 +3302,14 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup
SetPeerConnectionTrackerProxyForTesting(
std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
ASSERT_TRUE(StartRemoteLogging(key));
ExpectWebRtcStateChangeInstruction(key, true);
// Test
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectWebRtcStateChangeInstruction(key, false);
ASSERT_TRUE(DisableLocalLogging());
EXPECT_TRUE(webrtc_state_change_instructions_.empty());
@@ -3306,13 +3321,13 @@ TEST_F(WebRtcEventLogManagerTest,
TEST_F(WebRtcEventLogManagerTest, SanityOverRecreatingTheSamePeerConnection) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
OnWebRtcEventLogWrite(key, "log1");
- ASSERT_TRUE(PeerConnectionRemoved(key));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
OnWebRtcEventLogWrite(key, "log2");
}
@@ -3330,8 +3345,8 @@ TEST_F(WebRtcEventLogManagerTest, LogAllPossibleCharacters) {
.WillByDefault(Invoke(SaveFilePathTo(&remote_log_file_path)));
ASSERT_TRUE(EnableLocalLogging());
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(local_log_file_path);
ASSERT_FALSE(local_log_file_path->empty());
@@ -3345,7 +3360,7 @@ TEST_F(WebRtcEventLogManagerTest, LogAllPossibleCharacters) {
ASSERT_EQ(OnWebRtcEventLogWrite(key, all_chars), std::make_pair(true, true));
// Make sure the file would be closed, so that we could safely read it.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ExpectLocalFileContents(*local_log_file_path, all_chars);
ExpectRemoteFileContents(*remote_log_file_path, all_chars);
@@ -3353,8 +3368,8 @@ TEST_F(WebRtcEventLogManagerTest, LogAllPossibleCharacters) {
TEST_F(WebRtcEventLogManagerTest, LocalLogsClosedWhenRenderProcessHostExits) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
// The expectation for OnLocalLogStopped() will be saturated by this
@@ -3366,8 +3381,8 @@ TEST_F(WebRtcEventLogManagerTest, LocalLogsClosedWhenRenderProcessHostExits) {
TEST_F(WebRtcEventLogManagerTest, RemoteLogsClosedWhenRenderProcessHostExits) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
// The expectation for OnRemoteLogStopped() will be saturated by this
@@ -3388,10 +3403,10 @@ TEST_F(WebRtcEventLogManagerTest,
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ASSERT_TRUE(file_path);
ASSERT_FALSE(file_path->empty());
@@ -3413,36 +3428,36 @@ TEST_F(WebRtcEventLogManagerTest,
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionAddedOverDestroyedRphReturnsFalse) {
+ OnPeerConnectionAddedOverDestroyedRphReturnsFalse) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
rph_.reset();
- EXPECT_FALSE(PeerConnectionAdded(key));
+ EXPECT_FALSE(OnPeerConnectionAdded(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionRemovedOverDestroyedRphReturnsFalse) {
+ OnPeerConnectionRemovedOverDestroyedRphReturnsFalse) {
// Setup - make sure the |false| returned by the function being tested is
// related to the RPH being dead, and not due other restrictions.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
// Test
rph_.reset();
- EXPECT_FALSE(PeerConnectionRemoved(key));
+ EXPECT_FALSE(OnPeerConnectionRemoved(key));
}
TEST_F(WebRtcEventLogManagerTest,
- PeerConnectionStoppedOverDestroyedRphReturnsFalse) {
+ OnPeerConnectionStoppedOverDestroyedRphReturnsFalse) {
// Setup - make sure the |false| returned by the function being tested is
// related to the RPH being dead, and not due other restrictions.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
// Test
rph_.reset();
- EXPECT_FALSE(PeerConnectionStopped(key));
+ EXPECT_FALSE(OnPeerConnectionStopped(key));
}
TEST_F(WebRtcEventLogManagerTest,
@@ -3450,8 +3465,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup - make sure the |false| returned by the function being tested is
// related to the RPH being dead, and not due other restrictions.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
// Test
rph_.reset();
@@ -3465,8 +3480,8 @@ TEST_F(WebRtcEventLogManagerTest,
// Setup - make sure the |false| returned by the function being tested is
// related to the RPH being dead, and not due other restrictions.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
// Test
@@ -3492,11 +3507,11 @@ TEST_F(WebRtcEventLogManagerTest, DifferentProfilesCanHaveDifferentPolicies) {
std::make_unique<MockRenderProcessHost>(policy_enabled_profile.get());
const auto enabled_key = GetPeerConnectionKey(policy_enabled_rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(disabled_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(disabled_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(disabled_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(disabled_key));
- ASSERT_TRUE(PeerConnectionAdded(enabled_key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(enabled_key));
+ ASSERT_TRUE(OnPeerConnectionAdded(enabled_key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(enabled_key));
EXPECT_FALSE(StartRemoteLogging(disabled_key));
EXPECT_TRUE(StartRemoteLogging(enabled_key));
@@ -3508,8 +3523,8 @@ TEST_F(WebRtcEventLogManagerTest,
ASSERT_LT(web_app_id, kMinWebRtcEventLogWebAppId); // Avoid wrap-around.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_FALSE(StartRemoteLogging(key, GetUniqueId(key),
kMaxRemoteLogFileSizeBytes, 0, web_app_id));
}
@@ -3520,8 +3535,8 @@ TEST_F(WebRtcEventLogManagerTest,
ASSERT_GT(web_app_id, kMaxWebRtcEventLogWebAppId); // Avoid wrap-around.
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_FALSE(StartRemoteLogging(key, GetUniqueId(key),
kMaxRemoteLogFileSizeBytes, 0, web_app_id));
}
@@ -3530,8 +3545,8 @@ TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingWithInRangeWebAppIdAllowedMin) {
const size_t web_app_id = kMinWebRtcEventLogWebAppId;
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_TRUE(StartRemoteLogging(key, GetUniqueId(key),
kMaxRemoteLogFileSizeBytes, 0, web_app_id));
}
@@ -3540,8 +3555,8 @@ TEST_F(WebRtcEventLogManagerTest,
StartRemoteLoggingWithInRangeWebAppIdAllowedMax) {
const size_t web_app_id = kMaxWebRtcEventLogWebAppId;
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_TRUE(StartRemoteLogging(key, GetUniqueId(key),
kMaxRemoteLogFileSizeBytes, 0, web_app_id));
}
@@ -3555,8 +3570,8 @@ TEST_F(WebRtcEventLogManagerTest,
kMaxWebRtcEventLogWebAppId};
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_TRUE(StartRemoteLogging(
key, GetUniqueId(key), kMaxRemoteLogFileSizeBytes, 0, web_app_ids[0]));
EXPECT_FALSE(StartRemoteLogging(
@@ -3571,8 +3586,8 @@ TEST_F(WebRtcEventLogManagerTest,
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&file_path)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
const size_t expected_web_app_id = kWebAppId;
ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key),
kMaxRemoteLogFileSizeBytes, 0,
@@ -3614,8 +3629,8 @@ TEST_F(WebRtcEventLogManagerTestCacheClearing,
// Setup
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> file_path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.Times(1)
@@ -3686,8 +3701,8 @@ TEST_F(WebRtcEventLogManagerTestCacheClearing,
// Setup
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> file_path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.Times(1)
@@ -3880,30 +3895,30 @@ TEST_F(WebRtcEventLogManagerTestCacheClearing,
}
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
- SanityPeerConnectionAdded) {
+ SanityOnPeerConnectionAdded) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- EXPECT_TRUE(PeerConnectionAdded(key));
+ EXPECT_TRUE(OnPeerConnectionAdded(key));
}
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
- SanityPeerConnectionRemoved) {
+ SanityOnPeerConnectionRemoved) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
- EXPECT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
+ EXPECT_TRUE(OnPeerConnectionRemoved(key));
}
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
- SanityPeerConnectionStopped) {
+ SanityOnPeerConnectionStopped) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- PeerConnectionStopped(key); // No crash.
+ OnPeerConnectionStopped(key); // No crash.
}
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
SanityEnableLocalLogging) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(EnableLocalLogging());
}
@@ -3916,8 +3931,8 @@ TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
SanityStartRemoteLogging) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
std::string error_message;
EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
EXPECT_EQ(error_message, kStartRemoteLoggingFailureFeatureDisabled);
@@ -3926,8 +3941,8 @@ TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
SanityOnWebRtcEventLogWrite) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_FALSE(StartRemoteLogging(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
}
@@ -3948,8 +3963,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy, StartsEnabledAllowsRemoteLogging) {
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -3965,8 +3980,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy, StartsDisabledRejectsRemoteLogging) {
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -3981,8 +3996,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy, NotManagedRejectsRemoteLogging) {
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -3992,7 +4007,7 @@ WebRtcEventLogManagerTestPolicy::GetScopedUserManager(
user_manager::UserType user_type) {
const AccountId kAccountId = AccountId::FromUserEmailGaiaId("name", "id");
auto mock_user_manager =
- std::make_unique<testing::NiceMock<chromeos::FakeChromeUserManager>>();
+ std::make_unique<testing::NiceMock<ash::FakeChromeUserManager>>();
// On Chrome OS, there are different user types, some of which can be
// affiliated with the device if the device is enterprise-enrolled, i.e. the
// logged in account belongs to the org that owns the device. For our
@@ -4024,8 +4039,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -4056,8 +4071,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -4074,8 +4089,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
#endif
@@ -4091,8 +4106,8 @@ void WebRtcEventLogManagerTestPolicy::TestManagedProfileAfterBeingExplicitlySet(
auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
explicitly_set_value);
@@ -4123,8 +4138,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
allow_remote_logging = !allow_remote_logging;
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
@@ -4151,8 +4166,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
allow_remote_logging);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -4171,8 +4186,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
allow_remote_logging = !allow_remote_logging;
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
@@ -4199,8 +4214,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
allow_remote_logging);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
}
@@ -4224,8 +4239,8 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(allow_remote_logging)
<< "Must turn on before StartRemoteLogging, to test the right thing.";
ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
@@ -4238,7 +4253,7 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
&expected_files, true, &run_loop));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
@@ -4263,12 +4278,12 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
const auto key = GetPeerConnectionKey(rph.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(allow_remote_logging)
<< "Must turn off after StartRemoteLogging, to test the right thing.";
ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
allow_remote_logging = !allow_remote_logging;
profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
@@ -4302,15 +4317,15 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(allow_remote_logging)
<< "Must turn off after StartRemoteLogging, to test the right thing.";
ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
ASSERT_TRUE(log_file);
// Make the file PENDING.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ASSERT_TRUE(base::PathExists(*log_file)); // Test sanity; exists before.
allow_remote_logging = !allow_remote_logging;
@@ -4346,15 +4361,15 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(allow_remote_logging)
<< "Must turn off after StartRemoteLogging, to test the right thing.";
ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
ASSERT_TRUE(log_file);
// Log file's upload commences.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
ASSERT_TRUE(base::PathExists(*log_file)); // Test sanity; exists before.
@@ -4398,12 +4413,12 @@ TEST_F(WebRtcEventLogManagerTestPolicy,
// Produce an empty log file in the BrowserContext. It's not uploaded
// because uploading is suppressed.
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(allow_remote_logging)
<< "Must turn off after StartRemoteLogging, to test the right thing.";
ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
// Reload the BrowserContext, but this time with the policy disabling
// the feature.
@@ -4463,8 +4478,8 @@ TEST_F(WebRtcEventLogManagerTestUploadSuppressionDisablingFlag,
SuppressUploading();
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4479,7 +4494,7 @@ TEST_F(WebRtcEventLogManagerTestUploadSuppressionDisablingFlag,
std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
&expected_files, true, &run_loop));
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
@@ -4491,8 +4506,8 @@ TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
@@ -4503,7 +4518,7 @@ TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
&empty_expected_files_list, true, &run_loop));
// Peer connection removal MAY trigger upload, depending on network.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
@@ -4516,8 +4531,8 @@ TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
@@ -4529,7 +4544,7 @@ TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
&expected_files, true, &run_loop));
// Peer connection removal MAY trigger upload, depending on network.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
@@ -4542,14 +4557,14 @@ TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
// That a peer connection upload is not initiated by this point, is verified
// by previous tests.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks();
// Test focus - an upload will be initiated after changing the network type.
@@ -4621,8 +4636,8 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay, DoNotInitiateUploadBeforeDelay) {
SetUp(kIntentionallyExcessiveDelayMs);
const auto key = GetPeerConnectionKey(rph_.get(), 1);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
std::list<WebRtcLogFileInfo> empty_list;
@@ -4632,7 +4647,7 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay, DoNotInitiateUploadBeforeDelay) {
&empty_list, true, &run_loop));
// Change log file from ACTIVE to PENDING.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
// Wait a bit and see that the upload was not initiated. (Due to technical
// constraints, we cannot wait forever.)
@@ -4643,7 +4658,7 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay, DoNotInitiateUploadBeforeDelay) {
WaitForPendingTasks(&run_loop);
}
-// WhenPeerConnectionRemovedFinishedRemoteLogUploadedAndFileDeleted has some
+// WhenOnPeerConnectionRemovedFinishedRemoteLogUploadedAndFileDeleted has some
// overlap with this, but we still include this test for explicitness and
// clarity.
TEST_F(WebRtcEventLogManagerTestUploadDelay, InitiateUploadAfterDelay) {
@@ -4653,8 +4668,8 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay, InitiateUploadAfterDelay) {
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
ASSERT_TRUE(log_file);
@@ -4666,20 +4681,20 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay, InitiateUploadAfterDelay) {
&expected_files, true, &run_loop));
// Change log file from ACTIVE to PENDING.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
TEST_F(WebRtcEventLogManagerTestUploadDelay,
- PeerConnectionAddedDuringDelaySuppressesUpload) {
+ OnPeerConnectionAddedDuringDelaySuppressesUpload) {
SetUp(kIntentionallyExcessiveDelayMs);
const auto key1 = GetPeerConnectionKey(rph_.get(), 1);
const auto key2 = GetPeerConnectionKey(rph_.get(), 2);
- ASSERT_TRUE(PeerConnectionAdded(key1));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key1));
+ ASSERT_TRUE(OnPeerConnectionAdded(key1));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key1));
ASSERT_TRUE(StartRemoteLogging(key1));
std::list<WebRtcLogFileInfo> empty_list;
@@ -4689,14 +4704,14 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay,
&empty_list, true, &run_loop));
// Change log file from ACTIVE to PENDING.
- ASSERT_TRUE(PeerConnectionRemoved(key1));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key1));
// Test focus - after adding a peer connection, the conditions for the upload
// are no longer considered to hold.
// (Test implemented with a glimpse into the black box due to technical
// limitations and the desire to avoid flakiness.)
- ASSERT_TRUE(PeerConnectionAdded(key2));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key2));
+ ASSERT_TRUE(OnPeerConnectionAdded(key2));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key2));
EXPECT_FALSE(UploadConditionsHold());
WaitForPendingTasks(&run_loop);
@@ -4708,8 +4723,8 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay,
const auto key = GetPeerConnectionKey(rph_.get(), 1);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key));
std::list<WebRtcLogFileInfo> empty_list;
@@ -4719,7 +4734,7 @@ TEST_F(WebRtcEventLogManagerTestUploadDelay,
&empty_list, true, &run_loop));
// Change log file from ACTIVE to PENDING.
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
// Test focus - after clearing browser cache, the conditions for the upload
// are no longer considered to hold, because the file about to be uploaded
@@ -4743,8 +4758,8 @@ TEST_F(WebRtcEventLogManagerTestCompression,
base::Optional<base::FilePath> log_file;
ON_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
.WillByDefault(Invoke(SaveFilePathTo(&log_file)));
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log) - 1, 0,
kWebAppId));
ASSERT_TRUE(log_file);
@@ -4764,42 +4779,35 @@ TEST_F(WebRtcEventLogManagerTestCompression,
// If the file is incorrectly still eligible for an upload, this will trigger
// the upload (which will be a test failure).
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
WaitForPendingTasks(&run_loop);
}
-TEST_F(WebRtcEventLogManagerTestIncognito,
- NoRemoteBoundLogsDirectoryCreatedWhenProfileLoaded) {
- const base::FilePath remote_logs_path =
- RemoteBoundLogsDir(incognito_profile_);
- EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
-}
-
TEST_F(WebRtcEventLogManagerTestIncognito, StartRemoteLoggingFails) {
const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_FALSE(StartRemoteLogging(key));
}
TEST_F(WebRtcEventLogManagerTestIncognito,
StartRemoteLoggingDoesNotCreateDirectoryOrFiles) {
const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_FALSE(StartRemoteLogging(key));
const base::FilePath remote_logs_path =
RemoteBoundLogsDir(incognito_profile_);
- EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
+ EXPECT_TRUE(base::IsDirectoryEmpty(remote_logs_path));
}
TEST_F(WebRtcEventLogManagerTestIncognito,
OnWebRtcEventLogWriteReturnsFalseForRemotePart) {
const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
ASSERT_FALSE(StartRemoteLogging(key));
EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
}
@@ -4807,8 +4815,8 @@ TEST_F(WebRtcEventLogManagerTestIncognito,
TEST_F(WebRtcEventLogManagerTestHistory,
CorrectHistoryReturnedForActivelyWrittenLog) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4831,8 +4839,8 @@ TEST_F(WebRtcEventLogManagerTestHistory,
TEST_F(WebRtcEventLogManagerTestHistory, CorrectHistoryReturnedForPendingLog) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4843,7 +4851,7 @@ TEST_F(WebRtcEventLogManagerTestHistory, CorrectHistoryReturnedForPendingLog) {
ASSERT_FALSE(path->BaseName().MaybeAsASCII().empty());
SuppressUploading();
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
const auto history = GetHistory(browser_context_id_);
ASSERT_EQ(history.size(), 1u);
@@ -4864,8 +4872,8 @@ TEST_F(WebRtcEventLogManagerTestHistory,
std::make_unique<NullWebRtcEventLogUploader::Factory>(true, 1));
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4875,7 +4883,7 @@ TEST_F(WebRtcEventLogManagerTestHistory,
ASSERT_TRUE(path);
ASSERT_FALSE(path->BaseName().MaybeAsASCII().empty());
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
const auto history = GetHistory(browser_context_id_);
ASSERT_EQ(history.size(), 1u);
@@ -4898,8 +4906,8 @@ TEST_F(WebRtcEventLogManagerTestHistory,
TEST_F(WebRtcEventLogManagerTestHistory,
ExpiredLogFilesReplacedByHistoryFilesAndGetHistoryReportsAccordingly) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> log_path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4910,7 +4918,7 @@ TEST_F(WebRtcEventLogManagerTestHistory,
ASSERT_FALSE(log_path->BaseName().MaybeAsASCII().empty());
SuppressUploading();
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
UnloadMainTestProfile();
@@ -4952,8 +4960,8 @@ TEST_F(WebRtcEventLogManagerTestHistory,
TEST_F(WebRtcEventLogManagerTestHistory, ClearingCacheRemovesHistoryFiles) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> log_path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -4964,7 +4972,7 @@ TEST_F(WebRtcEventLogManagerTestHistory, ClearingCacheRemovesHistoryFiles) {
ASSERT_FALSE(log_path->BaseName().MaybeAsASCII().empty());
SuppressUploading();
- ASSERT_TRUE(PeerConnectionRemoved(key));
+ ASSERT_TRUE(OnPeerConnectionRemoved(key));
UnloadMainTestProfile();
@@ -5003,8 +5011,8 @@ TEST_F(WebRtcEventLogManagerTestHistory, ClearingCacheRemovesHistoryFiles) {
TEST_F(WebRtcEventLogManagerTestHistory,
ClearingCacheDoesNotLeaveBehindHistoryForRemovedLogs) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
base::Optional<base::FilePath> log_path;
EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _, _))
@@ -5041,8 +5049,8 @@ class WebRtcEventLogManagerTestOnMobileDevices
TEST_F(WebRtcEventLogManagerTestOnMobileDevices, RemoteBoundLoggingDisabled) {
const auto key = GetPeerConnectionKey(rph_.get(), kLid);
- ASSERT_TRUE(PeerConnectionAdded(key));
- ASSERT_TRUE(PeerConnectionSessionIdSet(key));
+ ASSERT_TRUE(OnPeerConnectionAdded(key));
+ ASSERT_TRUE(OnPeerConnectionSessionIdSet(key));
EXPECT_FALSE(StartRemoteLogging(key));
}
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
index bc630bcbf9d..be65bcd5f92 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -22,7 +22,7 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/policy/dlp/dlp_content_manager.h"
+#include "chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_content_restriction_set.h"
#endif
@@ -177,18 +177,17 @@ IN_PROC_BROWSER_TEST_P(WebRtcScreenCaptureBrowserTestWithPicker,
const policy::DlpContentRestrictionSet kScreenShareRestricted(
policy::DlpContentRestriction::kScreenShare);
- const policy::DlpContentRestrictionSet kEmptyRestrictionSet;
- policy::DlpContentManager* dlp_content_manager =
- policy::DlpContentManager::Get();
- dlp_content_manager->OnConfidentialityChanged(tab, kScreenShareRestricted);
+ policy::DlpContentManagerTestHelper helper_;
+ helper_.ChangeConfidentiality(tab, kScreenShareRestricted);
content::WaitForLoadStop(tab);
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
tab->GetMainFrame(), "waitVideoMuted();", &result));
EXPECT_EQ(result, "muted");
- dlp_content_manager->OnConfidentialityChanged(tab, kEmptyRestrictionSet);
+ const policy::DlpContentRestrictionSet kEmptyRestrictionSet;
+ helper_.ChangeConfidentiality(tab, kEmptyRestrictionSet);
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
tab->GetMainFrame(), "waitVideoUnmuted();", &result));
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc b/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
index 69680324b0e..0c76fe2adfa 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/media/webrtc/webrtc_logging_controller.h"
+#include <memory>
#include <string>
#include <utility>
@@ -536,7 +537,7 @@ void WebRtcLoggingController::CreateRtpDumpHandlerAndStart(
// GetLogDirectoryAndEnsureExists returns on the FILE thread for a previous
// StartRtpDump.
if (!rtp_dump_handler_)
- rtp_dump_handler_.reset(new WebRtcRtpDumpHandler(dump_dir));
+ rtp_dump_handler_ = std::make_unique<WebRtcRtpDumpHandler>(dump_dir);
DoStartRtpDump(type, std::move(callback));
}
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc
index ff8bee8412d..96030fc1a59 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc
@@ -585,7 +585,7 @@ IN_PROC_BROWSER_TEST_F(WebRtcPanTiltZoomFakeCameraDevicesBrowserTest,
// Hide page.
tab->WasHidden();
- base::string16 expected_title = base::ASCIIToUTF16("hidden");
+ std::u16string expected_title = u"hidden";
EXPECT_EQ(expected_title,
content::TitleWatcher(tab, expected_title).WaitAndGetTitle());
@@ -609,7 +609,7 @@ IN_PROC_BROWSER_TEST_F(WebRtcPanTiltZoomFakeCameraDevicesBrowserTest,
// Show page.
tab->WasShown();
- expected_title = base::ASCIIToUTF16("visible");
+ expected_title = u"visible";
EXPECT_EQ(expected_title,
content::TitleWatcher(tab, expected_title).WaitAndGetTitle());
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc b/chromium/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
index ec1cb4269e1..39df8ab9fb8 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
@@ -79,8 +79,8 @@ class WebRtcRtpDumpHandlerTest : public testing::Test {
}
void ResetDumpHandler(const base::FilePath& dir, bool end_dump_success) {
- handler_.reset(new WebRtcRtpDumpHandler(
- dir.empty() ? base::FilePath(FILE_PATH_LITERAL("dummy")) : dir));
+ handler_ = std::make_unique<WebRtcRtpDumpHandler>(
+ dir.empty() ? base::FilePath(FILE_PATH_LITERAL("dummy")) : dir);
std::unique_ptr<WebRtcRtpDumpWriter> writer(new FakeDumpWriter(
10,
@@ -217,7 +217,7 @@ TEST_F(WebRtcRtpDumpHandlerTest, CannotStartMoreThanFiveDumps) {
std::unique_ptr<WebRtcRtpDumpHandler> handlers[6];
for (size_t i = 0; i < base::size(handlers); ++i) {
- handlers[i].reset(new WebRtcRtpDumpHandler(base::FilePath()));
+ handlers[i] = std::make_unique<WebRtcRtpDumpHandler>(base::FilePath());
if (i < base::size(handlers) - 1) {
EXPECT_TRUE(handlers[i]->StartDump(RTP_DUMP_INCOMING, &error));
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc b/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
index ac22f099f9b..c5dd17582e7 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/media/webrtc/webrtc_text_log_handler.h"
#include <map>
+#include <memory>
#include <string>
#include <utility>
#include <vector>
@@ -205,9 +206,9 @@ bool WebRtcTextLogHandler::StartLogging(WebRtcLogUploader* log_uploader,
logging_state_ = STARTING;
DCHECK(!log_buffer_);
- log_buffer_.reset(new WebRtcLogBuffer());
+ log_buffer_ = std::make_unique<WebRtcLogBuffer>();
if (!meta_data_)
- meta_data_.reset(new WebRtcLogMetaDataMap());
+ meta_data_ = std::make_unique<WebRtcLogMetaDataMap>();
content::GetNetworkService()->GetNetworkList(
net::EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
@@ -450,7 +451,8 @@ void WebRtcTextLogHandler::OnGetNetworkInterfaceListFinish(
// Chrome version
LogToCircularBuffer("Chrome version: " + version_info::GetVersionNumber() +
- " " + chrome::GetChannelName());
+ " " +
+ chrome::GetChannelName(chrome::WithExtendedStable(true)));
// OS
LogToCircularBuffer(base::SysInfo::OperatingSystemName() + " " +
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
index 3c5d080d6e3..48246c059fd 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -88,9 +88,11 @@ void PrintMeanAndMax(const std::string& var_name,
CalculateMeanAndMax(vars, &mean, &std_dev, &max);
perf_test::PrintResultMeanAndError(
kTestResultString, name_modifier, var_name + " Mean",
- base::StringPrintf("%.0lf,%.0lf", mean, std_dev), "μs", true);
+ base::StringPrintf("%.0lf,%.0lf", mean, std_dev), "μs_smallerIsBetter",
+ true);
perf_test::PrintResult(kTestResultString, name_modifier, var_name + " Max",
- base::StringPrintf("%.0lf", max), "μs", true);
+ base::StringPrintf("%.0lf", max), "μs_smallerIsBetter",
+ true);
}
void FindEvents(trace_analyzer::TraceAnalyzer* analyzer,
@@ -413,8 +415,8 @@ class WebRtcVideoDisplayPerfBrowserTest
test_config_.fps, smoothness_indicator.c_str());
perf_test::PrintResult(
kTestResultString, name_modifier, "Skipped frames",
- base::StringPrintf("%.2lf", skipped_frame_percentage_), "percent",
- true);
+ base::StringPrintf("%.2lf", skipped_frame_percentage_),
+ "percent_smallerIsBetter", true);
// We identify intervals in a way that can help us easily bisect the source
// of added latency in case of a regression. From these intervals, "Render
// Algorithm" can take random amount of times based on the vsync cycle it is
diff --git a/chromium/chrome/browser/media/webrtc/window_icon_util_linux.cc b/chromium/chrome/browser/media/webrtc/window_icon_util_linux.cc
new file mode 100644
index 00000000000..dfa9ce61367
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/window_icon_util_linux.cc
@@ -0,0 +1,37 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/webrtc/window_icon_util.h"
+
+#include "content/public/browser/desktop_media_id.h"
+#include "ui/aura/client/aura_constants.h"
+
+#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"
+#include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/platform_utils.h"
+#endif
+#if defined(USE_X11)
+#include "ui/base/x/x11_util.h"
+#endif
+
+gfx::ImageSkia GetWindowIcon(content::DesktopMediaID id) {
+ // TODO(https://crbug.com/1094460): Hook up Window Icons for lacros.
+ DCHECK_EQ(content::DesktopMediaID::TYPE_WINDOW, id.type);
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ if (auto* platform_utils =
+ ui::OzonePlatform::GetInstance()->GetPlatformUtils()) {
+ return platform_utils->GetNativeWindowIcon(id.id);
+ }
+ NOTIMPLEMENTED_LOG_ONCE();
+ return gfx::ImageSkia();
+ }
+#endif
+#if defined(USE_X11)
+ return ui::GetNativeWindowIcon(id.id);
+#endif
+ NOTREACHED();
+ return gfx::ImageSkia();
+}
diff --git a/chromium/chrome/browser/media/webrtc/window_icon_util_ozone.cc b/chromium/chrome/browser/media/webrtc/window_icon_util_ozone.cc
deleted file mode 100644
index f9d305c040a..00000000000
--- a/chromium/chrome/browser/media/webrtc/window_icon_util_ozone.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/media/webrtc/window_icon_util.h"
-
-#include "content/public/browser/desktop_media_id.h"
-#include "ui/aura/client/aura_constants.h"
-
-gfx::ImageSkia GetWindowIcon(content::DesktopMediaID id) {
- // TODO(https://crbug.com/1094460): Hook up Window Icons for lacros.
- DCHECK_EQ(content::DesktopMediaID::TYPE_WINDOW, id.type);
- // TODO(tonikitoo): can we make the implementation of
- // chrome/browser/media/webrtc/window_icon_util_chromeos.cc generic
- // enough so we can reuse it here?
- NOTIMPLEMENTED();
- return gfx::ImageSkia();
-}
diff --git a/chromium/chrome/browser/media/webrtc/window_icon_util_x11.cc b/chromium/chrome/browser/media/webrtc/window_icon_util_x11.cc
deleted file mode 100644
index ac296f5454d..00000000000
--- a/chromium/chrome/browser/media/webrtc/window_icon_util_x11.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/media/webrtc/window_icon_util.h"
-
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/xproto_util.h"
-
-gfx::ImageSkia GetWindowIcon(content::DesktopMediaID id) {
- DCHECK(id.type == content::DesktopMediaID::TYPE_WINDOW);
-
- std::vector<uint32_t> data;
- if (!GetArrayProperty(static_cast<x11::Window>(id.id),
- x11::GetAtom("_NET_WM_ICON"), &data)) {
- return gfx::ImageSkia();
- }
-
- // The format of |data| is concatenation of sections like
- // [width, height, pixel data of size width * height], and the total bytes
- // number of |data| is |size|. And here we are picking the largest icon.
- int width = 0;
- int height = 0;
- int start = 0;
- size_t i = 0;
- while (i + 1 < data.size()) {
- if ((i == 0 || static_cast<int>(data[i] * data[i + 1]) > width * height) &&
- (i + 1 + data[i] * data[i + 1] < data.size())) {
- width = static_cast<int>(data[i]);
- height = static_cast<int>(data[i + 1]);
- start = i + 2;
- }
- i = i + 2 + static_cast<int>(data[i] * data[i + 1]);
- }
-
- SkBitmap result;
- SkImageInfo info = SkImageInfo::MakeN32(width, height, kUnpremul_SkAlphaType);
- result.allocPixels(info);
-
- uint32_t* pixels_data = reinterpret_cast<uint32_t*>(result.getPixels());
-
- for (long y = 0; y < height; ++y) {
- for (long x = 0; x < width; ++x) {
- pixels_data[result.rowBytesAsPixels() * y + x] =
- static_cast<uint32_t>(data[start + width * y + x]);
- }
- }
-
- return gfx::ImageSkia::CreateFrom1xBitmap(result);
-}
diff --git a/chromium/chrome/browser/nearby_sharing/contacts/BUILD.gn b/chromium/chrome/browser/nearby_sharing/contacts/BUILD.gn
index d2cd56a5482..344ddfe7619 100644
--- a/chromium/chrome/browser/nearby_sharing/contacts/BUILD.gn
+++ b/chromium/chrome/browser/nearby_sharing/contacts/BUILD.gn
@@ -14,6 +14,8 @@ source_set("contacts") {
"nearby_share_contact_manager.h",
"nearby_share_contact_manager_impl.cc",
"nearby_share_contact_manager_impl.h",
+ "nearby_share_contacts_sorter.cc",
+ "nearby_share_contacts_sorter.h",
]
deps = [
@@ -53,6 +55,7 @@ source_set("unit_tests") {
sources = [
"nearby_share_contact_downloader_impl_unittest.cc",
"nearby_share_contact_manager_impl_unittest.cc",
+ "nearby_share_contacts_sorter_unittest.cc",
]
deps = [
diff --git a/chromium/chrome/browser/net/OWNERS b/chromium/chrome/browser/net/OWNERS
index 23041d8fbaa..62ad72d99ac 100644
--- a/chromium/chrome/browser/net/OWNERS
+++ b/chromium/chrome/browser/net/OWNERS
@@ -2,3 +2,4 @@ file://net/OWNERS
per-file disk_cache_dir_policy_handler*=atwilson@chromium.org
per-file network_quality*=file://net/nqe/OWNERS
+per-file private_network_access_browsertest*=titouan@chromium.org
diff --git a/chromium/chrome/browser/net/chrome_accept_encoding_header_browsertest.cc b/chromium/chrome/browser/net/chrome_accept_encoding_header_browsertest.cc
new file mode 100644
index 00000000000..d1e8b95c0d4
--- /dev/null
+++ b/chromium/chrome/browser/net/chrome_accept_encoding_header_browsertest.cc
@@ -0,0 +1,49 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "media/media_buildflags.h"
+#include "net/test/embedded_test_server/http_request.h"
+
+using ChromeAcceptEncodingHeaderTest = InProcessBrowserTest;
+
+IN_PROC_BROWSER_TEST_F(ChromeAcceptEncodingHeaderTest, Check) {
+ net::EmbeddedTestServer server(net::EmbeddedTestServer::TYPE_HTTPS);
+ server.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
+ std::string navigation_accept_encoding_header,
+ subresource_accept_encoding_header;
+ base::RunLoop navigation_loop, subresource_loop;
+ server.RegisterRequestMonitor(base::BindLambdaForTesting(
+ [&](const net::test_server::HttpRequest& request) {
+ if (request.relative_url == "/fetch.html") {
+ auto it = request.headers.find("Accept-Encoding");
+ if (it != request.headers.end())
+ navigation_accept_encoding_header = it->second;
+ navigation_loop.Quit();
+ } else if (request.relative_url == "/fetch.html?viaFetch") {
+ auto it = request.headers.find("Accept-Encoding");
+ if (it != request.headers.end())
+ subresource_accept_encoding_header = it->second;
+ subresource_loop.Quit();
+ }
+ }));
+ ASSERT_TRUE(server.Start());
+ GURL url = server.GetURL("/fetch.html");
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ navigation_loop.Run();
+ subresource_loop.Run();
+
+ ASSERT_EQ("gzip, deflate, br", navigation_accept_encoding_header);
+ ASSERT_EQ("gzip, deflate, br", subresource_accept_encoding_header);
+
+ // Since the server uses local variables.
+ ASSERT_TRUE(server.ShutdownAndWaitUntilComplete());
+}
diff --git a/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc b/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
index fc03fb1fd30..dd4f37ab0fa 100644
--- a/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
+++ b/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
@@ -11,9 +11,28 @@
#include "content/public/test/browser_test_utils.h"
#include "media/media_buildflags.h"
#include "net/test/embedded_test_server/http_request.h"
+#include "third_party/blink/public/common/buildflags.h"
+#include "third_party/blink/public/common/features.h"
using ChromeAcceptHeaderTest = InProcessBrowserTest;
+#if BUILDFLAG(ENABLE_AV1_DECODER) || BUILDFLAG(ENABLE_JXL_DECODER)
+namespace {
+std::string GetOptionalImageCodecs() {
+ std::string result;
+#if BUILDFLAG(ENABLE_JXL_DECODER)
+ if (base::FeatureList::IsEnabled(blink::features::kJXL)) {
+ result.append("image/jxl,");
+ }
+#endif
+#if BUILDFLAG(ENABLE_AV1_DECODER)
+ result.append("image/avif,");
+#endif
+ return result;
+}
+} // namespace
+#endif // BUILDFLAG(ENABLE_AV1_DECODER) || BUILDFLAG(ENABLE_JXL_DECODER)
+
IN_PROC_BROWSER_TEST_F(ChromeAcceptHeaderTest, Check) {
net::EmbeddedTestServer server(net::EmbeddedTestServer::TYPE_HTTP);
server.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
@@ -42,23 +61,23 @@ IN_PROC_BROWSER_TEST_F(ChromeAcceptHeaderTest, Check) {
// With MimeHandlerViewInCrossProcessFrame, embedded PDF will go through the
// navigation code path and behaves similarly to PDF loaded inside <iframe>.
-#if BUILDFLAG(ENABLE_AV1_DECODER)
- const char* expected_plugin_accept_header =
- "text/html,application/xhtml+xml,application/xml;q=0.9,"
- "image/avif,image/webp,image/apng,*/*;q=0.8,"
- "application/signed-exchange;v=b3;q=0.9";
-#else
- const char* expected_plugin_accept_header =
+ std::string expected_plugin_accept_header =
"text/html,application/xhtml+xml,application/xml;q=0.9,image/"
"webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
+#if BUILDFLAG(ENABLE_AV1_DECODER) || BUILDFLAG(ENABLE_JXL_DECODER)
+ expected_plugin_accept_header =
+ "text/html,application/xhtml+xml,application/xml;q=0.9," +
+ GetOptionalImageCodecs() +
+ "image/webp,image/apng,*/*;q=0.8,"
+ "application/signed-exchange;v=b3;q=0.9";
#endif
ASSERT_EQ(expected_plugin_accept_header, plugin_accept_header);
-#if BUILDFLAG(ENABLE_AV1_DECODER)
- const char* expected_favicon_accept_header =
- "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
-#else
- const char* expected_favicon_accept_header =
+ std::string expected_favicon_accept_header =
+ "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
+#if BUILDFLAG(ENABLE_AV1_DECODER) || BUILDFLAG(ENABLE_JXL_DECODER)
+ expected_favicon_accept_header =
+ GetOptionalImageCodecs() +
"image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
#endif
ASSERT_EQ(expected_favicon_accept_header, favicon_accept_header);
diff --git a/chromium/chrome/browser/net/chrome_report_sender_unittest.cc b/chromium/chrome/browser/net/chrome_report_sender_unittest.cc
index a558284d8cb..942ef6d374f 100644
--- a/chromium/chrome/browser/net/chrome_report_sender_unittest.cc
+++ b/chromium/chrome/browser/net/chrome_report_sender_unittest.cc
@@ -34,7 +34,6 @@ class FakeSharedURLLoaderFactory : public network::SharedURLLoaderFactory {
// network::SharedURLLoaderFactory
void CreateLoaderAndStart(
mojo::PendingReceiver<network::mojom::URLLoader> receiver,
- int32_t routing_id,
int32_t request_id,
uint32_t options,
const network::ResourceRequest& url_request,
diff --git a/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc
new file mode 100644
index 00000000000..550a2853242
--- /dev/null
+++ b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc
@@ -0,0 +1,46 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "convert_explicitly_allowed_network_ports_pref.h"
+
+#include <string>
+
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+
+std::vector<uint16_t> ConvertExplicitlyAllowedNetworkPortsPref(
+ PrefService* local_state) {
+ std::vector<uint16_t> explicitly_allowed_network_ports;
+ const base::ListValue* explicitly_allowed_network_ports_list_value =
+ local_state->GetList(prefs::kExplicitlyAllowedNetworkPorts);
+ DCHECK(explicitly_allowed_network_ports_list_value);
+ auto list_view = explicitly_allowed_network_ports_list_value->GetList();
+ if (list_view.empty()) {
+ return explicitly_allowed_network_ports;
+ }
+ explicitly_allowed_network_ports.reserve(list_view.size());
+ for (const base::Value& value : list_view) {
+ const base::Optional<int> optional_int = value.GetIfInt();
+ if (!optional_int) {
+ // We handle this case because prefs can be corrupt, but it shouldn't
+ // happen normally.
+ DLOG(WARNING) << "Ignoring non-int value";
+ continue;
+ }
+
+ const int int_value = optional_int.value();
+ if (int_value < 1 || int_value > 65535) {
+ // Out of range for a port number. Ignored.
+ DLOG(WARNING) << "Ignoring out-of-range value: " << int_value;
+ continue;
+ }
+
+ explicitly_allowed_network_ports.push_back(
+ static_cast<uint16_t>(int_value));
+ }
+ return explicitly_allowed_network_ports;
+}
diff --git a/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h
new file mode 100644
index 00000000000..e01dab727c7
--- /dev/null
+++ b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h
@@ -0,0 +1,20 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_CONVERT_EXPLICITLY_ALLOWED_NETWORK_PORTS_PREF_H_
+#define CHROME_BROWSER_NET_CONVERT_EXPLICITLY_ALLOWED_NETWORK_PORTS_PREF_H_
+
+#include <stdint.h>
+
+#include <vector>
+
+class PrefService;
+
+// Reads the preference kExplicitlyAllowedNetworkPorts and
+// converts it to a vector of 16-bit unsigned integers. Ignores anything that
+// is outside the 16-bit port range.
+std::vector<uint16_t> ConvertExplicitlyAllowedNetworkPortsPref(
+ PrefService* local_state);
+
+#endif // CHROME_BROWSER_NET_CONVERT_EXPLICITLY_ALLOWED_NETWORK_PORTS_PREF_H_
diff --git a/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref_unittest.cc b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref_unittest.cc
new file mode 100644
index 00000000000..3ca2c634ed8
--- /dev/null
+++ b/chromium/chrome/browser/net/convert_explicitly_allowed_network_ports_pref_unittest.cc
@@ -0,0 +1,88 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h"
+
+#include <memory>
+#include <string>
+
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+
+class ConvertExplicitlyAllowedNetworkPortsPrefTest : public ::testing::Test {
+ public:
+ ConvertExplicitlyAllowedNetworkPortsPrefTest() {
+ local_state_.registry()->RegisterListPref(
+ prefs::kExplicitlyAllowedNetworkPorts);
+ }
+
+ void SetManagedPref(base::Value ports) {
+ local_state_.SetManagedPref(
+ prefs::kExplicitlyAllowedNetworkPorts,
+ base::Value::ToUniquePtrValue(std::move(ports)));
+ }
+
+ PrefService* local_state() { return &local_state_; }
+
+ private:
+ TestingPrefServiceSimple local_state_;
+};
+
+TEST_F(ConvertExplicitlyAllowedNetworkPortsPrefTest, EmptyList) {
+ SetManagedPref(base::Value(base::Value::Type::LIST));
+ auto ports = ConvertExplicitlyAllowedNetworkPortsPref(local_state());
+ EXPECT_THAT(ports, IsEmpty());
+}
+
+TEST_F(ConvertExplicitlyAllowedNetworkPortsPrefTest, ValidList) {
+ base::Value list(base::Value::Type::LIST);
+ list.Append(base::Value(20));
+ list.Append(base::Value(21));
+ list.Append(base::Value(22));
+ SetManagedPref(std::move(list));
+ auto ports = ConvertExplicitlyAllowedNetworkPortsPref(local_state());
+ EXPECT_THAT(ports, ElementsAre(20, 21, 22));
+}
+
+// This shouldn't happen, but we handle it.
+TEST_F(ConvertExplicitlyAllowedNetworkPortsPrefTest, ListOfBools) {
+ base::Value list(base::Value::Type::LIST);
+ list.Append(base::Value(false));
+ list.Append(base::Value(true));
+ SetManagedPref(std::move(list));
+ auto ports = ConvertExplicitlyAllowedNetworkPortsPref(local_state());
+ EXPECT_THAT(ports, IsEmpty());
+}
+
+// This really shouldn't happen.
+TEST_F(ConvertExplicitlyAllowedNetworkPortsPrefTest, MixedTypesList) {
+ base::Value list(base::Value::Type::LIST);
+ list.Append(base::Value(true));
+ list.Append(base::Value("79"));
+ list.Append(base::Value(554));
+ SetManagedPref(std::move(list));
+ auto ports = ConvertExplicitlyAllowedNetworkPortsPref(local_state());
+ EXPECT_THAT(ports, ElementsAre(554));
+}
+
+TEST_F(ConvertExplicitlyAllowedNetworkPortsPrefTest, OutOfRangeIntegers) {
+ constexpr int kValues[] = {
+ -1, // Too small.
+ 100000, // Too big.
+ 119, // Valid.
+ };
+ base::Value list(base::Value::Type::LIST);
+ for (const auto& value : kValues) {
+ list.Append(base::Value(value));
+ }
+ SetManagedPref(std::move(list));
+ auto ports = ConvertExplicitlyAllowedNetworkPortsPref(local_state());
+ EXPECT_THAT(ports, ElementsAre(119));
+}
diff --git a/chromium/chrome/browser/net/cookie_policy_browsertest.cc b/chromium/chrome/browser/net/cookie_policy_browsertest.cc
index 098cbbd86dd..c2e8ebab5df 100644
--- a/chromium/chrome/browser/net/cookie_policy_browsertest.cc
+++ b/chromium/chrome/browser/net/cookie_policy_browsertest.cc
@@ -33,6 +33,8 @@ using content::BrowserThread;
namespace {
+enum class TestType { kFrame, kWorker };
+
class CookiePolicyBrowserTest : public InProcessBrowserTest {
protected:
CookiePolicyBrowserTest()
@@ -121,10 +123,168 @@ class CookiePolicyBrowserTest : public InProcessBrowserTest {
return ChildFrameAt(GetFrame(), 0);
}
- protected:
+ void TestThirdPartyIFrameStorage(TestType test_type) {
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/browsing_data/site_data.html");
+
+ ExpectStorage(test_type, GetFrame(), false);
+ SetStorage(test_type, GetFrame());
+ ExpectStorage(test_type, GetFrame(), true);
+
+ SetBlockThirdPartyCookies(true);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetFrame(), false);
+
+ // Allow all requests to b.com to access storage.
+ auto cookie_settings =
+ CookieSettingsFactory::GetForProfile(browser()->profile());
+ GURL a_url = https_server_.GetURL("a.com", "/");
+ GURL b_url = https_server_.GetURL("b.com", "/");
+ cookie_settings->SetCookieSetting(b_url,
+ ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetFrame(), true);
+
+ // Remove ALLOW setting.
+ cookie_settings->ResetCookieSetting(b_url);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetFrame(), false);
+
+ // Allow all third-parties on a.com to access storage.
+ cookie_settings->SetThirdPartyCookieSetting(
+ a_url, ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetFrame(), true);
+ }
+
+ void TestNestedThirdPartyIFrameStorage(TestType test_type) {
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
+
+ ExpectStorage(test_type, GetNestedFrame(), false);
+ SetStorage(test_type, GetNestedFrame());
+ ExpectStorage(test_type, GetNestedFrame(), true);
+
+ SetBlockThirdPartyCookies(true);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), false);
+
+ // Allow all requests to b.com to access storage.
+ auto cookie_settings =
+ CookieSettingsFactory::GetForProfile(browser()->profile());
+ GURL a_url = https_server_.GetURL("a.com", "/");
+ GURL c_url = https_server_.GetURL("c.com", "/");
+ cookie_settings->SetCookieSetting(c_url,
+ ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), true);
+
+ // Remove ALLOW setting.
+ cookie_settings->ResetCookieSetting(c_url);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), false);
+
+ // Allow all third-parties on a.com to access storage.
+ cookie_settings->SetThirdPartyCookieSetting(
+ a_url, ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), true);
+ }
+
+ void TestNestedFirstPartyIFrameStorage(TestType test_type) {
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
+
+ ExpectStorage(test_type, GetNestedFrame(), false);
+ SetStorage(test_type, GetNestedFrame());
+ ExpectStorage(test_type, GetNestedFrame(), true);
+
+ SetBlockThirdPartyCookies(true);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), false);
+
+ // Allow all requests to b.com to access storage.
+ auto cookie_settings =
+ CookieSettingsFactory::GetForProfile(browser()->profile());
+ GURL a_url = https_server_.GetURL("a.com", "/");
+ cookie_settings->SetCookieSetting(a_url,
+ ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), true);
+
+ // Remove ALLOW setting.
+ cookie_settings->ResetCookieSetting(a_url);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), false);
+
+ // Allow all third-parties on a.com to access storage.
+ cookie_settings->SetThirdPartyCookieSetting(
+ a_url, ContentSetting::CONTENT_SETTING_ALLOW);
+
+ NavigateToPageWithFrame("a.com");
+ NavigateFrameTo("b.com", "/iframe.html");
+ NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
+ ExpectStorage(test_type, GetNestedFrame(), true);
+ }
+
net::test_server::EmbeddedTestServer https_server_;
private:
+ void ExpectStorage(TestType test_type,
+ content::RenderFrameHost* frame,
+ bool expected) {
+ switch (test_type) {
+ case TestType::kFrame:
+ storage::test::ExpectStorageForFrame(frame, expected);
+ return;
+ case TestType::kWorker:
+ storage::test::ExpectStorageForWorker(frame, expected);
+ return;
+ }
+ }
+
+ void SetStorage(TestType test_type, content::RenderFrameHost* frame) {
+ switch (test_type) {
+ case TestType::kFrame:
+ storage::test::SetStorageForFrame(frame);
+ return;
+ case TestType::kWorker:
+ storage::test::SetStorageForWorker(frame);
+ return;
+ }
+ }
+
DISALLOW_COPY_AND_ASSIGN(CookiePolicyBrowserTest);
};
@@ -428,138 +588,34 @@ IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
ExpectNestedFrameContent("None");
}
-IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest, ThirdPartyIFrameStorage) {
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetFrame(), false);
- storage::test::SetStorageForFrame(GetFrame());
- storage::test::ExpectStorageForFrame(GetFrame(), true);
-
- SetBlockThirdPartyCookies(true);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetFrame(), false);
-
- // Allow all requests to b.com to access storage.
- auto cookie_settings =
- CookieSettingsFactory::GetForProfile(browser()->profile());
- GURL a_url = https_server_.GetURL("a.com", "/");
- GURL b_url = https_server_.GetURL("b.com", "/");
- cookie_settings->SetCookieSetting(b_url,
- ContentSetting::CONTENT_SETTING_ALLOW);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetFrame(), true);
-
- // Remove ALLOW setting.
- cookie_settings->ResetCookieSetting(b_url);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetFrame(), false);
-
- // Allow all third-parties on a.com to access storage.
- cookie_settings->SetThirdPartyCookieSetting(
- a_url, ContentSetting::CONTENT_SETTING_ALLOW);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetFrame(), true);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ ThirdPartyIFrameStorageForFrame) {
+ TestThirdPartyIFrameStorage(TestType::kFrame);
}
-IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest, NestedThirdPartyIFrameStorage) {
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
-
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
- storage::test::SetStorageForFrame(GetNestedFrame());
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
-
- SetBlockThirdPartyCookies(true);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
-
- // Allow all requests to b.com to access storage.
- auto cookie_settings =
- CookieSettingsFactory::GetForProfile(browser()->profile());
- GURL a_url = https_server_.GetURL("a.com", "/");
- GURL c_url = https_server_.GetURL("c.com", "/");
- cookie_settings->SetCookieSetting(c_url,
- ContentSetting::CONTENT_SETTING_ALLOW);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
-
- // Remove ALLOW setting.
- cookie_settings->ResetCookieSetting(c_url);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
-
- // Allow all third-parties on a.com to access storage.
- cookie_settings->SetThirdPartyCookieSetting(
- a_url, ContentSetting::CONTENT_SETTING_ALLOW);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("c.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ ThirdPartyIFrameStorageForWorker) {
+ TestThirdPartyIFrameStorage(TestType::kWorker);
}
-IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest, NestedFirstPartyIFrameStorage) {
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
-
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
- storage::test::SetStorageForFrame(GetNestedFrame());
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
-
- SetBlockThirdPartyCookies(true);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
-
- // Allow all requests to b.com to access storage.
- auto cookie_settings =
- CookieSettingsFactory::GetForProfile(browser()->profile());
- GURL a_url = https_server_.GetURL("a.com", "/");
- cookie_settings->SetCookieSetting(a_url,
- ContentSetting::CONTENT_SETTING_ALLOW);
-
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
-
- // Remove ALLOW setting.
- cookie_settings->ResetCookieSetting(a_url);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ NestedThirdPartyIFrameStorageForFrame) {
+ TestNestedThirdPartyIFrameStorage(TestType::kFrame);
+}
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), false);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ NestedThirdPartyIFrameStorageForWorker) {
+ TestNestedThirdPartyIFrameStorage(TestType::kWorker);
+}
- // Allow all third-parties on a.com to access storage.
- cookie_settings->SetThirdPartyCookieSetting(
- a_url, ContentSetting::CONTENT_SETTING_ALLOW);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ NestedFirstPartyIFrameStorageForFrame) {
+ TestNestedFirstPartyIFrameStorage(TestType::kFrame);
+}
- NavigateToPageWithFrame("a.com");
- NavigateFrameTo("b.com", "/iframe.html");
- NavigateNestedFrameTo("a.com", "/browsing_data/site_data.html");
- storage::test::ExpectStorageForFrame(GetNestedFrame(), true);
+IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest,
+ NestedFirstPartyIFrameStorageForWorker) {
+ TestNestedFirstPartyIFrameStorage(TestType::kWorker);
}
// Test third-party cookie blocking of features that allow to communicate
diff --git a/chromium/chrome/browser/net/errorpage_browsertest.cc b/chromium/chrome/browser/net/errorpage_browsertest.cc
index e5312e2f0dd..daa040983d4 100644
--- a/chromium/chrome/browser/net/errorpage_browsertest.cc
+++ b/chromium/chrome/browser/net/errorpage_browsertest.cc
@@ -39,6 +39,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/browsing_data/content/browsing_data_helper.h"
+#include "components/embedder_support/switches.h"
#include "components/error_page/content/browser/net_error_auto_reloader.h"
#include "components/google/core/common/google_util.h"
#include "components/language/core/browser/pref_names.h"
@@ -422,7 +423,7 @@ IN_PROC_BROWSER_TEST_F(DNSErrorPageTest, DNSError_DoReload) {
// notification that they've run, and scripts that trigger a navigation may
// not send that notification.
web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.getElementById('reload-button').click();"),
+ u"document.getElementById('reload-button').click();",
base::NullCallback());
nav_observer.Wait();
ExpectDisplayingErrorPage(browser(), net::ERR_NAME_NOT_RESOLVED);
@@ -444,7 +445,7 @@ IN_PROC_BROWSER_TEST_F(DNSErrorPageTest,
// Do a same-document navigation on the error page, which should not result
// in a new navigation.
web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.location='#';"), base::NullCallback());
+ u"document.location='#';", base::NullCallback());
content::WaitForLoadStop(web_contents);
// Page being displayed should not change.
ExpectDisplayingErrorPage(browser(), net::ERR_NAME_NOT_RESOLVED);
@@ -455,7 +456,7 @@ IN_PROC_BROWSER_TEST_F(DNSErrorPageTest,
// notification that they've run, and scripts that trigger a navigation may
// not send that notification.
web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.getElementById('reload-button').click();"),
+ u"document.getElementById('reload-button').click();",
base::NullCallback());
nav_observer2.Wait();
ExpectDisplayingErrorPage(browser(), net::ERR_NAME_NOT_RESOLVED);
@@ -655,7 +656,7 @@ IN_PROC_BROWSER_TEST_F(DNSErrorPageTest, Incognito) {
class ErrorPageAutoReloadTest : public InProcessBrowserTest {
public:
void SetUpCommandLine(base::CommandLine* command_line) override {
- command_line->AppendSwitch(switches::kEnableAutoReload);
+ command_line->AppendSwitch(embedder_support::kEnableAutoReload);
}
void TearDownOnMainThread() override { url_loader_interceptor_.reset(); }
@@ -773,7 +774,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadTest, ManualReloadNotSuppressed) {
browser()->tab_strip_model()->GetActiveWebContents();
content::TestNavigationObserver nav_observer(web_contents, 1);
web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.getElementById('reload-button').click();"),
+ u"document.getElementById('reload-button').click();",
base::NullCallback());
nav_observer.Wait();
EXPECT_FALSE(IsDisplayingText(
@@ -798,13 +799,13 @@ IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadTest,
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
- const base::string16 kExpectedTitle = base::ASCIIToUTF16("Test One");
+ const std::u16string kExpectedTitle = u"Test One";
content::TitleWatcher title_watcher(web_contents, kExpectedTitle);
// Same-document navigation on an error page should not interrupt the
// scheduled auto-reload which should still be pending on the WebContents.
web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.location='#';"), base::NullCallback());
+ u"document.location='#';", base::NullCallback());
// Wait for the second auto reload to happen. It will succeed and update the
// WebContents' title.
diff --git a/chromium/chrome/browser/net/explicitly_allowed_network_ports_browsertest.cc b/chromium/chrome/browser/net/explicitly_allowed_network_ports_browsertest.cc
new file mode 100644
index 00000000000..43b7d327488
--- /dev/null
+++ b/chromium/chrome/browser/net/explicitly_allowed_network_ports_browsertest.cc
@@ -0,0 +1,132 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "chrome/browser/policy/policy_test_utils.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/chrome_test_utils.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/policy_constants.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/base/net_errors.h"
+#include "net/base/port_util.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/network/public/cpp/network_switches.h"
+#include "url/gurl.h"
+
+namespace {
+
+using policy::PolicyMap;
+
+class ExplicitlyAllowedNetworkPortsBrowserTest : public policy::PolicyTest {
+ protected:
+ ExplicitlyAllowedNetworkPortsBrowserTest() : scoped_allowable_port_(79) {}
+
+ network::mojom::NetworkContext* network_context() {
+ return content::BrowserContext::GetDefaultStoragePartition(
+ browser()->profile())
+ ->GetNetworkContext();
+ }
+
+ void EnablePort79ByPolicy() {
+ PolicyMap policies;
+ base::Value list(base::Value::Type::LIST);
+ // Port 25 is just ignored, because it is not on the allowable ports list.
+ list.Append(base::Value("25"));
+ list.Append(base::Value("79"));
+ SetPolicy(&policies, policy::key::kExplicitlyAllowedNetworkPorts,
+ std::move(list));
+ UpdateProviderPolicy(policies);
+ }
+
+ private:
+ net::ScopedAllowablePortForTesting scoped_allowable_port_;
+};
+
+// The fact that port 79 is blocked by default is verified in the browsertest
+// CommandLineFlagsBrowserTest.Port79DefaultBlocked, so we don't retest it here.
+
+// Tests that the policy is successfully sent to the network service.
+//
+// The request may succeed or fail depending on the platform and what services
+// are running, so the test just verifies the reason for failure is not
+// ERR_UNSAFE_PORT.
+IN_PROC_BROWSER_TEST_F(ExplicitlyAllowedNetworkPortsBrowserTest,
+ Unblock79Succeeds) {
+ EnablePort79ByPolicy();
+
+ // This might still be racy because the network process might not apply the
+ // policy before we make the network request. It's unclear how to fix this if
+ // it happens.
+
+ EXPECT_NE(net::ERR_UNSAFE_PORT,
+ content::LoadBasicRequest(network_context(),
+ GURL("http://127.0.0.1:79")));
+}
+
+class ExplicitlyAllowedNetworkPortsBackgroundFetchBrowserTest
+ : public ExplicitlyAllowedNetworkPortsBrowserTest {
+ public:
+ std::string PerformBackgroundFetch() {
+ auto handle = embedded_test_server()->StartAndReturnHandle();
+ // We don't actually use the functions on this page, we just need a URL
+ // that is in the right scope for the service worker.
+ ui_test_utils::NavigateToURL(
+ browser(), embedded_test_server()->GetURL(
+ "/background_fetch/background_fetch.html"));
+
+ return EvalJs(chrome_test_utils::GetActiveWebContents(this), R"(
+(async () => {
+ await navigator.serviceWorker.register('/background_fetch/sw.js');
+ const registration = await navigator.serviceWorker.ready;
+ try {
+ await registration.backgroundFetch.fetch(
+ 'bg-fetch-id', 'http://localhost:79/background_fetch/types_of_cheese.txt');
+ return 'NOT BLOCKED';
+ } catch (e) {
+ if (e.name === 'TypeError' &&
+ e.message.endsWith('that port is not allowed.')) {
+ return 'BLOCKED';
+ } else {
+ throw(e);
+ }
+ }
+})();
+)")
+ .ExtractString();
+ }
+};
+
+// Tests that the policy is successfully sent to the render process. There
+// aren't actually many APIs in the render process that use the restricted port
+// list. BackgroundFetch is probably the most convenient, although it requires a
+// service worker. If BackgroundFetch stops using the restricted port list then
+// this test will stop working and we will have to find another API to use.
+
+// First verify that BackgroundFetch still throws an exception for blocked
+// ports.
+IN_PROC_BROWSER_TEST_F(ExplicitlyAllowedNetworkPortsBackgroundFetchBrowserTest,
+ BlockedPortsThrow) {
+ EXPECT_EQ(PerformBackgroundFetch(), "BLOCKED");
+}
+
+IN_PROC_BROWSER_TEST_F(ExplicitlyAllowedNetworkPortsBackgroundFetchBrowserTest,
+ UnblockedPortsDontThrow) {
+ EnablePort79ByPolicy();
+
+ // This might still be racy because the render process might not apply the
+ // policy before we run this JavaScript. It's unclear how to fix this if it
+ // happens.
+
+ EXPECT_EQ(PerformBackgroundFetch(), "NOT BLOCKED");
+}
+
+} // namespace
diff --git a/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc
new file mode 100644
index 00000000000..7e0098b8648
--- /dev/null
+++ b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc
@@ -0,0 +1,60 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h"
+
+#include "base/check.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/common/pref_names.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "net/base/port_util.h"
+
+namespace policy {
+
+ExplicitlyAllowedNetworkPortsPolicyHandler::
+ ExplicitlyAllowedNetworkPortsPolicyHandler()
+ : ListPolicyHandler(policy::key::kExplicitlyAllowedNetworkPorts,
+ base::Value::Type::STRING) {}
+
+bool ExplicitlyAllowedNetworkPortsPolicyHandler::CheckListEntry(
+ const base::Value& value) {
+ const std::string* as_string = value.GetIfString();
+ DCHECK(as_string); // ListPolicyHandler guarantees this.
+
+ int as_int;
+
+ if (!base::StringToInt(*as_string, &as_int)) {
+ return false;
+ }
+
+ if (!net::IsPortValid(as_int)) {
+ return false;
+ }
+
+ if (!net::IsAllowablePort(as_int)) {
+ return false;
+ }
+
+ return true;
+}
+
+void ExplicitlyAllowedNetworkPortsPolicyHandler::ApplyList(
+ base::Value filtered_list,
+ PrefValueMap* prefs) {
+ base::ListValue integer_list;
+ auto list_view = filtered_list.GetList();
+ for (const base::Value& value : list_view) {
+ const std::string& as_string = value.GetString();
+ int as_int;
+ const bool success = base::StringToInt(as_string, &as_int);
+ DCHECK(success);
+ integer_list.Append(as_int);
+ }
+ prefs->SetValue(prefs::kExplicitlyAllowedNetworkPorts,
+ std::move(integer_list));
+}
+
+} // namespace policy
diff --git a/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h
new file mode 100644
index 00000000000..3e892c6dba3
--- /dev/null
+++ b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h
@@ -0,0 +1,33 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_EXPLICITLY_ALLOWED_NETWORK_PORTS_POLICY_HANDLER_H_
+#define CHROME_BROWSER_NET_EXPLICITLY_ALLOWED_NETWORK_PORTS_POLICY_HANDLER_H_
+
+#include "components/policy/core/browser/configuration_policy_handler.h"
+
+namespace policy {
+
+// Checks and converts the strings in
+// policy::key::kExplicitlyAllowedNetworkPorts to integers in
+// prefs::kExplicityAllowedNetworkPorts. The reason that the policy uses strings
+// is that it permits us to document explicitly what values are supported and
+// for how long.
+class ExplicitlyAllowedNetworkPortsPolicyHandler final
+ : public ListPolicyHandler {
+ public:
+ ExplicitlyAllowedNetworkPortsPolicyHandler();
+
+ protected:
+ // Filters out strings that do not cleanly convert to integers in the port
+ // range 1 to 65535.
+ bool CheckListEntry(const base::Value& value) override;
+
+ // Converts the values to integers.
+ void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+};
+
+} // namespace policy
+
+#endif // CHROME_BROWSER_NET_EXPLICITLY_ALLOWED_NETWORK_PORTS_POLICY_HANDLER_H_
diff --git a/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc
new file mode 100644
index 00000000000..659589a5db4
--- /dev/null
+++ b/chromium/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc
@@ -0,0 +1,149 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h"
+
+#include <string>
+
+#include "base/values.h"
+#include "chrome/common/pref_names.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "net/base/port_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace policy {
+
+class ExplicitlyAllowedNetworkPortsPolicyHandlerTest : public testing::Test {
+ protected:
+ // Port 6000 is used by these tests as a port that can always be allowed.
+ ExplicitlyAllowedNetworkPortsPolicyHandlerTest()
+ : scoped_allowable_port_(6000) {}
+
+ void SetPolicyValue(base::Value value) {
+ policies_.Set(policy::key::kExplicitlyAllowedNetworkPorts,
+ POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+ POLICY_SOURCE_PLATFORM, std::move(value), nullptr);
+ }
+
+ void CheckAndApplyPolicySettings() {
+ if (handler_.CheckPolicySettings(policies_, &errors_)) {
+ handler_.ApplyPolicySettings(policies_, &prefs_);
+ }
+ }
+
+ PolicyErrorMap& errors() { return errors_; }
+ bool has_error() {
+ return errors_.HasError(policy::key::kExplicitlyAllowedNetworkPorts);
+ }
+
+ const base::Value* pref_value() {
+ const base::Value* value = nullptr;
+ if (!prefs_.GetValue(prefs::kExplicitlyAllowedNetworkPorts, &value))
+ return nullptr;
+
+ return value;
+ }
+
+ private:
+ PolicyMap policies_;
+ PolicyErrorMap errors_;
+ PrefValueMap prefs_;
+ ExplicitlyAllowedNetworkPortsPolicyHandler handler_;
+ net::ScopedAllowablePortForTesting scoped_allowable_port_;
+};
+
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, Unset) {
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(errors().empty());
+ auto* value = pref_value();
+ EXPECT_FALSE(value);
+}
+
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, Empty) {
+ SetPolicyValue(base::ListValue());
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(errors().empty());
+ auto* value = pref_value();
+ ASSERT_TRUE(value);
+ ASSERT_TRUE(value->is_list());
+ EXPECT_TRUE(value->GetList().empty());
+}
+
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, Valid) {
+ base::ListValue policy_value;
+ policy_value.Append(base::Value("6000"));
+ SetPolicyValue(std::move(policy_value));
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(errors().empty());
+ auto* value = pref_value();
+ ASSERT_TRUE(value);
+ ASSERT_TRUE(value->is_list());
+ ASSERT_EQ(value->GetList().size(), 1u);
+ const auto& element = value->GetList()[0];
+ EXPECT_TRUE(element.is_int());
+ ASSERT_TRUE(element.GetIfInt());
+ EXPECT_EQ(element.GetIfInt().value(), 6000);
+}
+
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, NotAList) {
+ SetPolicyValue(base::Value(base::Value::Type::INTEGER));
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(has_error());
+ EXPECT_FALSE(pref_value());
+}
+
+// Non-string types are removed from the list, but the policy is still applied.
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, MixedTypes) {
+ base::ListValue policy_value;
+ policy_value.Append(base::Value(79));
+ policy_value.Append(base::Value("6000"));
+ SetPolicyValue(std::move(policy_value));
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(has_error());
+ auto* value = pref_value();
+ ASSERT_TRUE(value);
+ ASSERT_TRUE(value->is_list());
+ ASSERT_EQ(value->GetList().size(), 1u);
+ const auto& element = value->GetList()[0];
+ EXPECT_TRUE(element.is_int());
+ ASSERT_TRUE(element.GetIfInt());
+ EXPECT_EQ(element.GetIfInt().value(), 6000);
+}
+
+// Invalid strings are removed, but the policy is still applied.
+TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, InvalidStrings) {
+ const std::string kValues[] = {
+ "-1", // Too small.
+ "100000", // Too big.
+ "smtp", // Not a number.
+ "25.0", // Not an integer.
+ "2E2", // Not an integer.
+ "", // Not an integer.
+ "1 1", // Contains a space.
+ "100000000000", // Much too big.
+ "\"514\"", // Contains extra quotes.
+ "6000", // Valid.
+ };
+ base::ListValue policy_value;
+ for (const auto& value : kValues) {
+ policy_value.Append(base::Value(value));
+ }
+ SetPolicyValue(std::move(policy_value));
+ CheckAndApplyPolicySettings();
+ EXPECT_TRUE(has_error());
+ auto* value = pref_value();
+ ASSERT_TRUE(value);
+ ASSERT_TRUE(value->is_list());
+ ASSERT_EQ(value->GetList().size(), 1u);
+ const auto& element = value->GetList()[0];
+ EXPECT_TRUE(element.is_int());
+ ASSERT_TRUE(element.GetIfInt());
+ EXPECT_EQ(element.GetIfInt().value(), 6000);
+}
+
+} // namespace policy
diff --git a/chromium/chrome/browser/net/explicitly_allowed_ports_switch_browsertest.cc b/chromium/chrome/browser/net/explicitly_allowed_ports_switch_browsertest.cc
new file mode 100644
index 00000000000..aede1d556f2
--- /dev/null
+++ b/chromium/chrome/browser/net/explicitly_allowed_ports_switch_browsertest.cc
@@ -0,0 +1,56 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "url/gurl.h"
+
+namespace content {
+
+class ExplicitlyAllowedPortsSwitchBrowserTest : public InProcessBrowserTest {
+ protected:
+ network::mojom::NetworkContext* network_context() {
+ return content::BrowserContext::GetDefaultStoragePartition(
+ browser()->profile())
+ ->GetNetworkContext();
+ }
+};
+
+// Tests that when no special command line flags are passed, requests to port 79
+// (finger) fail with ERR_UNSAFE_PORT.
+IN_PROC_BROWSER_TEST_F(ExplicitlyAllowedPortsSwitchBrowserTest,
+ Port79DefaultBlocked) {
+ EXPECT_EQ(net::ERR_UNSAFE_PORT,
+ content::LoadBasicRequest(network_context(),
+ GURL("http://127.0.0.1:79")));
+}
+
+class ExplicitlyAllowPort79BrowserTest
+ : public ExplicitlyAllowedPortsSwitchBrowserTest {
+ public:
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ command_line->AppendSwitchASCII(switches::kExplicitlyAllowedPorts, "79");
+ }
+};
+
+// Tests that when run with the flag --explicitly-allowed-ports=79, requests to
+// port 79 (finger) are permitted.
+//
+// The request may succeed or fail depending on the platform and what services
+// are running, so the test just verifies the reason for failure is not
+// ERR_UNSAFE_PORT.
+IN_PROC_BROWSER_TEST_F(ExplicitlyAllowPort79BrowserTest, Load) {
+ EXPECT_NE(net::ERR_UNSAFE_PORT,
+ content::LoadBasicRequest(network_context(),
+ GURL("http://127.0.0.1:79")));
+}
+
+} // namespace content
diff --git a/chromium/chrome/browser/net/net_error_diagnostics_dialog_chromeos.cc b/chromium/chrome/browser/net/net_error_diagnostics_dialog_chromeos.cc
index 6793e1861b6..3a2c36e4d3c 100644
--- a/chromium/chrome/browser/net/net_error_diagnostics_dialog_chromeos.cc
+++ b/chromium/chrome/browser/net/net_error_diagnostics_dialog_chromeos.cc
@@ -4,14 +4,11 @@
#include "chrome/browser/net/net_error_diagnostics_dialog.h"
-#include "apps/launcher.h"
#include "ash/constants/ash_features.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
#include "chromeos/components/connectivity_diagnostics/url_constants.h"
-#include "extensions/browser/extension_registry.h"
bool CanShowNetworkDiagnosticsDialog(content::WebContents* web_contents) {
// The ChromeOS network diagnostics dialog can be shown in incognito and guest
@@ -24,15 +21,6 @@ void ShowNetworkDiagnosticsDialog(content::WebContents* web_contents,
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
- if (base::FeatureList::IsEnabled(
- chromeos::features::kConnectivityDiagnosticsWebUi)) {
- LaunchSystemWebAppAsync(profile,
- web_app::SystemAppType::CONNECTIVITY_DIAGNOSTICS);
- } else {
- const extensions::Extension* extension =
- extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension(
- "kodldpbjkkmmnilagfdheibampofhaom");
- apps::LaunchPlatformAppWithUrl(web_contents->GetBrowserContext(), extension,
- "", GURL::EmptyGURL(), GURL(failed_url));
- }
+ LaunchSystemWebAppAsync(profile,
+ web_app::SystemAppType::CONNECTIVITY_DIAGNOSTICS);
}
diff --git a/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc b/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
index 7e0b653bf38..8fdcd33378e 100644
--- a/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
+++ b/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
@@ -10,6 +10,7 @@
#include <windows.h> // NOLINT
#include <memory>
+#include <string>
#include "base/bind.h"
#include "base/callback_helpers.h"
@@ -20,7 +21,6 @@
#include "base/memory/weak_ptr.h"
#include "base/native_library.h"
#include "base/scoped_native_library.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task_runner.h"
#include "base/threading/thread.h"
diff --git a/chromium/chrome/browser/net/net_error_tab_helper_unittest.cc b/chromium/chrome/browser/net/net_error_tab_helper_unittest.cc
index 85414b717b9..9ead35d2e5b 100644
--- a/chromium/chrome/browser/net/net_error_tab_helper_unittest.cc
+++ b/chromium/chrome/browser/net/net_error_tab_helper_unittest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/net/net_error_tab_helper.h"
+#include <memory>
+
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/error_page/common/net_error_info.h"
#include "content/public/browser/browser_thread.h"
@@ -125,7 +127,7 @@ class NetErrorTabHelperTest : public ChromeRenderViewHostTestHarness {
subframe_ = content::RenderFrameHostTester::For(main_rfh())
->AppendChild("subframe");
- tab_helper_.reset(new TestNetErrorTabHelper(web_contents()));
+ tab_helper_ = std::make_unique<TestNetErrorTabHelper>(web_contents());
NetErrorTabHelper::set_state_for_testing(
NetErrorTabHelper::TESTING_FORCE_ENABLED);
}
diff --git a/chromium/chrome/browser/net/net_export_helper.cc b/chromium/chrome/browser/net/net_export_helper.cc
index da735ae32bf..b02a4898e7c 100644
--- a/chromium/chrome/browser/net/net_export_helper.cc
+++ b/chromium/chrome/browser/net/net_export_helper.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/net/net_export_helper.h"
+#include <memory>
+
#include "base/values.h"
#include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -33,7 +35,7 @@ std::unique_ptr<base::DictionaryValue> GetPrerenderInfo(Profile* profile) {
if (no_state_prefetch_manager) {
value = no_state_prefetch_manager->CopyAsValue();
} else {
- value.reset(new base::DictionaryValue());
+ value = std::make_unique<base::DictionaryValue>();
value->SetBoolean("enabled", false);
value->SetBoolean("omnibox_enabled", false);
}
diff --git a/chromium/chrome/browser/net/network_context_configuration_browsertest.cc b/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
index c0148de0e69..7d07cac7814 100644
--- a/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -40,6 +40,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/common/pref_names.h"
+#include "components/embedder_support/switches.h"
#include "components/embedder_support/user_agent_utils.h"
#include "components/language/core/browser/pref_names.h"
#include "components/network_session_configurator/common/network_switches.h"
@@ -313,9 +314,10 @@ class NetworkContextConfigurationBrowserTest
content::StoragePartition* GetStoragePartitionForContextType(
NetworkContextType network_context_type) {
const auto kOnDiskConfig = content::StoragePartitionConfig::Create(
- "foo", /*partition_name=*/"", /*in_memory=*/false);
+ browser()->profile(), "foo", /*partition_name=*/"",
+ /*in_memory=*/false);
const auto kInMemoryConfig = content::StoragePartitionConfig::Create(
- "foo", /*partition_name=*/"", /*in_memory=*/true);
+ browser()->profile(), "foo", /*partition_name=*/"", /*in_memory=*/true);
switch (network_context_type) {
case NetworkContextType::kSystem:
@@ -335,10 +337,19 @@ class NetworkContextConfigurationBrowserTest
case NetworkContextType::kInMemoryApp:
return content::BrowserContext::GetStoragePartition(
browser()->profile(), kInMemoryConfig);
- case NetworkContextType::kOnDiskAppWithIncognitoProfile:
+ case NetworkContextType::kOnDiskAppWithIncognitoProfile: {
DCHECK(incognito_);
+ // Note: Even though we are requesting an on-disk config, the function
+ // will return an in-memory config because incognito profiles are not
+ // supposed to to use on-disk storage.
+ const auto kIncognitoConfig = content::StoragePartitionConfig::Create(
+ incognito_->profile(), "foo", /*partition_name=*/"",
+ /*in_memory=*/false);
+ DCHECK(kIncognitoConfig.in_memory());
+
return content::BrowserContext::GetStoragePartition(
- incognito_->profile(), kOnDiskConfig);
+ incognito_->profile(), kIncognitoConfig);
+ }
}
NOTREACHED();
return nullptr;
@@ -870,7 +881,7 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, Cache) {
}
// Make a request whose response should be cached.
- GURL request_url = embedded_test_server()->GetURL("/cachetime");
+ GURL request_url = embedded_test_server()->GetURL(kCacheRandomPath);
url::Origin request_origin =
url::Origin::Create(embedded_test_server()->base_url());
std::unique_ptr<network::ResourceRequest> request =
@@ -894,9 +905,6 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, Cache) {
ASSERT_TRUE(simple_loader_helper.response_body());
EXPECT_GT(simple_loader_helper.response_body()->size(), 0u);
- // Stop the server.
- ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
-
// Make the request again, and make sure it's cached or not, according to
// expectations. Reuse the content::ResourceRequest, but nothing else.
std::unique_ptr<network::ResourceRequest> request2 =
@@ -915,15 +923,14 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, Cache) {
simple_loader2->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
loader_factory(), simple_loader_helper2.GetCallback());
simple_loader_helper2.WaitForCallback();
+ ASSERT_TRUE(simple_loader_helper2.response_body());
if (GetHttpCacheType() == StorageType::kNone) {
- // If there's no cache, and no server running, the request should have
- // failed.
- EXPECT_FALSE(simple_loader_helper2.response_body());
- EXPECT_EQ(net::ERR_CONNECTION_REFUSED, simple_loader2->NetError());
+ // If there's no cache, the request should have returned a different
+ // response than before.
+ EXPECT_NE(*simple_loader_helper.response_body(),
+ *simple_loader_helper2.response_body());
} else {
- // Otherwise, the request should have succeeded, and returned the same
- // result as before.
- ASSERT_TRUE(simple_loader_helper2.response_body());
+ // Otherwise, the request should have returned the same result as before.
EXPECT_EQ(*simple_loader_helper.response_body(),
*simple_loader_helper2.response_body());
}
@@ -1263,8 +1270,13 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest,
MakeLongLivedRequestThatHangsUntilShutdown();
}
+#if defined(OS_CHROMEOS)
+#define MAYBE_UserAgentAndLanguagePrefs DISABLED_UserAgentAndLanguagePrefs
+#else
+#define MAYBE_UserAgentAndLanguagePrefs UserAgentAndLanguagePrefs
+#endif
IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest,
- UserAgentAndLanguagePrefs) {
+ MAYBE_UserAgentAndLanguagePrefs) {
if (IsRestartStateWithInProcessNetworkService())
return;
// The system and SafeBrowsing network contexts aren't associated with any
@@ -1999,7 +2011,7 @@ class NetworkContextConfigurationReportingAndNelBrowserTest
}
void SetUpCommandLine(base::CommandLine* command_line) override {
- command_line->AppendSwitch(switches::kShortReportingDelay);
+ command_line->AppendSwitch(embedder_support::kShortReportingDelay);
// This switch will cause traffic to *any* port to go to https_server_,
// regardless of which arbitrary port https_server_ decides to run on.
// NEL and Reporting policies are only valid for a single origin.
@@ -2161,8 +2173,8 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationReportingAndNelBrowserTest,
}
// Instantiates tests with a prefix indicating which NetworkContext is being
-// tested, and a suffix of "/0" if the network service is disabled, "/1" if it's
-// enabled, and "/2" if it's enabled and restarted.
+// tested, and a suffix of "/0" if the network service is enabled, "/1" if it's
+// enabled and restarted.
#define TEST_CASES(network_context_type) \
TestCase({NetworkServiceState::kEnabled, network_context_type}), \
TestCase({NetworkServiceState::kRestarted, network_context_type})
diff --git a/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc b/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
index 8d9840bf749..a345d66a753 100644
--- a/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
@@ -63,7 +63,7 @@ class TestNetworkQualityObserver
return;
ASSERT_NE(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
run_loop_wait_effective_connection_type);
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_wait_effective_connection_type_ =
run_loop_wait_effective_connection_type;
run_loop_->Run();
diff --git a/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc b/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
index eb60adcc8cb..823e2d0129d 100644
--- a/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
#include <string>
#include "base/bind.h"
@@ -126,7 +127,7 @@ class TestNetworkQualityObserver
run_loop_wait_effective_connection_type_ =
run_loop_wait_effective_connection_type;
run_loop_->Run();
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
}
private:
diff --git a/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc b/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
index b907565703d..03e4cf4ea0d 100644
--- a/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
+
#include "base/bind.h"
#include "base/check_op.h"
#include "base/deferred_sequenced_task_runner.h"
@@ -87,7 +89,7 @@ class TestNetworkQualityObserver
run_loop_wait_effective_connection_type_ =
run_loop_wait_effective_connection_type;
run_loop_->Run();
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
}
size_t num_notifications() const { return num_notifications_; }
diff --git a/chromium/chrome/browser/net/nss_context.cc b/chromium/chrome/browser/net/nss_context.cc
index 50382cc3f6d..e5305c98637 100644
--- a/chromium/chrome/browser/net/nss_context.cc
+++ b/chromium/chrome/browser/net/nss_context.cc
@@ -11,7 +11,6 @@
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/resource_context.h"
using content::BrowserThread;
@@ -30,7 +29,7 @@ void DidGetCertDBOnIOThread(
// Gets NSSCertDatabase for the resource context.
void GetCertDBOnIOThread(
- content::ResourceContext* context,
+ NssCertDatabaseGetter database_getter,
scoped_refptr<base::SequencedTaskRunner> response_task_runner,
base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -40,7 +39,7 @@ void GetCertDBOnIOThread(
auto completion_callback = base::AdaptCallbackForRepeating(base::BindOnce(
&DidGetCertDBOnIOThread, response_task_runner, std::move(callback)));
net::NSSCertDatabase* cert_db =
- GetNSSCertDatabaseForResourceContext(context, completion_callback);
+ std::move(database_getter).Run(completion_callback);
if (cert_db)
completion_callback.Run(cert_db);
@@ -55,6 +54,6 @@ void GetNSSCertDatabaseForProfile(
content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE,
- base::BindOnce(&GetCertDBOnIOThread, profile->GetResourceContext(),
+ base::BindOnce(&GetCertDBOnIOThread, CreateNSSCertDatabaseGetter(profile),
base::ThreadTaskRunnerHandle::Get(), std::move(callback)));
}
diff --git a/chromium/chrome/browser/net/nss_context.h b/chromium/chrome/browser/net/nss_context.h
index 9a389e746e5..b8b34db008e 100644
--- a/chromium/chrome/browser/net/nss_context.h
+++ b/chromium/chrome/browser/net/nss_context.h
@@ -20,27 +20,25 @@ class NSSCertDatabase;
}
namespace content {
-class ResourceContext;
+class BrowserContext;
} // namespace content
-// Returns a pointer to the NSSCertDatabase for the user associated with
-// |context|, if it is ready. If it is not ready and |callback| is non-null, the
-// |callback| will be run once the DB is initialized. Ownership is not
-// transferred, but the caller may save the pointer, which will remain valid for
-// the lifetime of the ResourceContext.
-// Must be called only on the IO thread.
-net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
- content::ResourceContext* context,
- base::OnceCallback<void(net::NSSCertDatabase*)> callback)
- WARN_UNUSED_RESULT;
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// Enables the system key slot in the NSSCertDatabase for the user associated
-// with |context|.
-// Must be called only on the IO thread.
-void EnableNSSSystemKeySlotForResourceContext(
- content::ResourceContext* context);
-#endif
+// NssCertDatabaseGetter is a callback that MUST only be invoked on the IO
+// thread, and will either synchronously return the associated NSSCertDatabase*
+// (if available), or nullptr along with a commitment to asynchronously invoke
+// the caller-supplied callback once the NSSCertDatabase* has been initialized.
+// Ownership of the NSSCertDatabase is not transferred, and the lifetime should
+// only be considered valid for the current Task.
+//
+// TODO(https://crbug.com/1186373): Provide better lifetime guarantees.
+using NssCertDatabaseGetter = base::OnceCallback<net::NSSCertDatabase*(
+ base::OnceCallback<void(net::NSSCertDatabase*)> callback)>;
+
+// Must be called on the UI thread. Returns a Getter that may only be invoked on
+// the IO thread. To avoid UAF, the getter must be immediately posted to the IO
+// thread and then invoked.
+NssCertDatabaseGetter CreateNSSCertDatabaseGetter(
+ content::BrowserContext* browser_context);
// Gets a pointer to the NSSCertDatabase for the user associated with |context|.
// It's a wrapper around |GetNSSCertDatabaseForResourceContext| which makes
diff --git a/chromium/chrome/browser/net/nss_context_chromeos.cc b/chromium/chrome/browser/net/nss_context_chromeos.cc
index 482f261b4bb..91770a88b23 100644
--- a/chromium/chrome/browser/net/nss_context_chromeos.cc
+++ b/chromium/chrome/browser/net/nss_context_chromeos.cc
@@ -4,129 +4,14 @@
#include "chrome/browser/net/nss_context.h"
-#include <utility>
-
#include "base/bind.h"
-#include "base/callback_list.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/weak_ptr.h"
-#include "base/supports_user_data.h"
-#include "chrome/browser/profiles/profile_io_data.h"
+#include "chrome/browser/net/nss_service_chromeos.h"
+#include "chrome/browser/net/nss_service_chromeos_factory.h"
#include "content/public/browser/browser_thread.h"
-#include "crypto/nss_util_internal.h"
-#include "net/cert/nss_cert_database_chromeos.h"
-
-namespace {
-
-void* kDatabaseManagerKey = &kDatabaseManagerKey;
-
-class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
- public:
- typedef base::OnceCallback<void(net::NSSCertDatabaseChromeOS*)>
- GetNSSCertDatabaseCallback;
- explicit NSSCertDatabaseChromeOSManager(const std::string& username_hash)
- : username_hash_(username_hash) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- crypto::ScopedPK11Slot private_slot(crypto::GetPrivateSlotForChromeOSUser(
- username_hash,
- base::BindOnce(&NSSCertDatabaseChromeOSManager::DidGetPrivateSlot,
- weak_ptr_factory_.GetWeakPtr())));
- if (private_slot)
- DidGetPrivateSlot(std::move(private_slot));
- }
-
- ~NSSCertDatabaseChromeOSManager() override {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- }
-
- net::NSSCertDatabaseChromeOS* GetNSSCertDatabase(
- GetNSSCertDatabaseCallback callback) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
- if (nss_cert_database_)
- return nss_cert_database_.get();
-
- ready_callback_list_.AddUnsafe(std::move(callback));
- return NULL;
- }
-
- private:
- using ReadyCallbackList =
- base::OnceCallbackList<GetNSSCertDatabaseCallback::RunType>;
-
- void DidGetPrivateSlot(crypto::ScopedPK11Slot private_slot) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- nss_cert_database_.reset(new net::NSSCertDatabaseChromeOS(
- crypto::GetPublicSlotForChromeOSUser(username_hash_),
- std::move(private_slot)));
-
- ready_callback_list_.Notify(nss_cert_database_.get());
- }
-
- std::string username_hash_;
- std::unique_ptr<net::NSSCertDatabaseChromeOS> nss_cert_database_;
- ReadyCallbackList ready_callback_list_;
- base::WeakPtrFactory<NSSCertDatabaseChromeOSManager> weak_ptr_factory_{this};
-
- DISALLOW_COPY_AND_ASSIGN(NSSCertDatabaseChromeOSManager);
-};
-
-std::string GetUsername(content::ResourceContext* context) {
- return ProfileIOData::FromResourceContext(context)->username_hash();
-}
-
-net::NSSCertDatabaseChromeOS* GetNSSCertDatabaseChromeOS(
- content::ResourceContext* context,
- NSSCertDatabaseChromeOSManager::GetNSSCertDatabaseCallback callback) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- NSSCertDatabaseChromeOSManager* manager =
- static_cast<NSSCertDatabaseChromeOSManager*>(
- context->GetUserData(kDatabaseManagerKey));
- if (!manager) {
- manager = new NSSCertDatabaseChromeOSManager(GetUsername(context));
- context->SetUserData(kDatabaseManagerKey, base::WrapUnique(manager));
- }
- return manager->GetNSSCertDatabase(std::move(callback));
-}
-
-void CallWithNSSCertDatabase(
- base::OnceCallback<void(net::NSSCertDatabase*)> callback,
- net::NSSCertDatabaseChromeOS* db) {
- std::move(callback).Run(db);
-}
-
-void SetSystemSlot(crypto::ScopedPK11Slot system_slot,
- net::NSSCertDatabaseChromeOS* db) {
- db->SetSystemSlot(std::move(system_slot));
-}
-
-void SetSystemSlotOfDBForResourceContext(content::ResourceContext* context,
- crypto::ScopedPK11Slot system_slot) {
- base::RepeatingCallback<void(net::NSSCertDatabaseChromeOS*)> callback =
- base::BindRepeating(&SetSystemSlot, base::Passed(&system_slot));
-
- net::NSSCertDatabaseChromeOS* db =
- GetNSSCertDatabaseChromeOS(context, callback);
- if (db)
- callback.Run(db);
-}
-
-} // namespace
-
-net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
- content::ResourceContext* context,
- base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
- return GetNSSCertDatabaseChromeOS(
- context, base::BindOnce(&CallWithNSSCertDatabase, std::move(callback)));
-}
-void EnableNSSSystemKeySlotForResourceContext(
- content::ResourceContext* context) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- base::RepeatingCallback<void(crypto::ScopedPK11Slot)> callback =
- base::BindRepeating(&SetSystemSlotOfDBForResourceContext, context);
- crypto::ScopedPK11Slot system_slot = crypto::GetSystemNSSKeySlot(callback);
- if (system_slot)
- callback.Run(std::move(system_slot));
+NssCertDatabaseGetter CreateNSSCertDatabaseGetter(
+ content::BrowserContext* browser_context) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ return NssServiceChromeOSFactory::GetForContext(browser_context)
+ ->CreateNSSCertDatabaseGetterForIOThread();
}
diff --git a/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc b/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
index a85293b0c04..1c7b632bd66 100644
--- a/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
+++ b/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
@@ -8,10 +8,10 @@
#include "base/bind.h"
#include "base/run_loop.h"
+#include "chrome/browser/ash/login/login_manager_test.h"
+#include "chrome/browser/ash/login/test/login_manager_mixin.h"
+#include "chrome/browser/ash/login/ui/user_adding_screen.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/login/login_manager_test.h"
-#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
-#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
#include "chrome/browser/profiles/profile.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
@@ -39,10 +39,10 @@ class DBTester {
bool DoGetDBTests() {
base::RunLoop run_loop;
content::GetIOThreadTaskRunner({})->PostTask(
- FROM_HERE,
- base::BindOnce(&DBTester::GetDBAndDoTestsOnIOThread,
- base::Unretained(this), profile_->GetResourceContext(),
- run_loop.QuitClosure()));
+ FROM_HERE, base::BindOnce(&DBTester::GetDBAndDoTestsOnIOThread,
+ base::Unretained(this),
+ CreateNSSCertDatabaseGetter(profile_),
+ run_loop.QuitClosure()));
run_loop.Run();
return !!db_;
}
@@ -51,10 +51,10 @@ class DBTester {
void DoGetDBAgainTests() {
base::RunLoop run_loop;
content::GetIOThreadTaskRunner({})->PostTask(
- FROM_HERE,
- base::BindOnce(&DBTester::DoGetDBAgainTestsOnIOThread,
- base::Unretained(this), profile_->GetResourceContext(),
- run_loop.QuitClosure()));
+ FROM_HERE, base::BindOnce(&DBTester::DoGetDBAgainTestsOnIOThread,
+ base::Unretained(this),
+ CreateNSSCertDatabaseGetter(profile_),
+ run_loop.QuitClosure()));
run_loop.Run();
}
@@ -66,10 +66,11 @@ class DBTester {
}
private:
- void GetDBAndDoTestsOnIOThread(content::ResourceContext* context,
+ void GetDBAndDoTestsOnIOThread(NssCertDatabaseGetter database_getter,
const base::RepeatingClosure& done_callback) {
- net::NSSCertDatabase* db = GetNSSCertDatabaseForResourceContext(
- context, base::BindOnce(&DBTester::DoTestsOnIOThread,
+ net::NSSCertDatabase* db =
+ std::move(database_getter)
+ .Run(base::BindOnce(&DBTester::DoTestsOnIOThread,
base::Unretained(this), done_callback));
if (db) {
DVLOG(1) << "got db synchronously";
@@ -93,10 +94,10 @@ class DBTester {
std::move(done_callback));
}
- void DoGetDBAgainTestsOnIOThread(content::ResourceContext* context,
+ void DoGetDBAgainTestsOnIOThread(NssCertDatabaseGetter database_getter,
base::OnceClosure done_callback) {
- net::NSSCertDatabase* db = GetNSSCertDatabaseForResourceContext(
- context, base::BindOnce(&NotCalledDbCallback));
+ net::NSSCertDatabase* db =
+ std::move(database_getter).Run(base::BindOnce(&NotCalledDbCallback));
// Should always be synchronous now.
EXPECT_TRUE(db);
// Should return the same db as before.
diff --git a/chromium/chrome/browser/net/nss_context_linux.cc b/chromium/chrome/browser/net/nss_context_linux.cc
index c5ea31f77ef..54db021f2b6 100644
--- a/chromium/chrome/browser/net/nss_context_linux.cc
+++ b/chromium/chrome/browser/net/nss_context_linux.cc
@@ -11,10 +11,8 @@
namespace {
net::NSSCertDatabase* g_nss_cert_database = NULL;
-} // namespace
net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
- content::ResourceContext* context,
base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
// This initialization is not thread safe. This CHECK ensures that this code
// is only run on a single thread.
@@ -37,3 +35,14 @@ net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
}
return g_nss_cert_database;
}
+
+} // namespace
+
+NssCertDatabaseGetter CreateNSSCertDatabaseGetter(
+ content::BrowserContext* browser_context) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // Not used, but should not be nullptr, since it's used by the ChromeOS Ash
+ // implementation of this method.
+ DCHECK(browser_context);
+ return base::BindOnce(&GetNSSCertDatabaseForResourceContext);
+}
diff --git a/chromium/chrome/browser/net/nss_service_chromeos.cc b/chromium/chrome/browser/net/nss_service_chromeos.cc
new file mode 100644
index 00000000000..d46f17ec039
--- /dev/null
+++ b/chromium/chrome/browser/net/nss_service_chromeos.cc
@@ -0,0 +1,314 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/nss_service_chromeos.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/callback_list.h"
+#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
+#include "base/supports_user_data.h"
+#include "chrome/browser/ash/login/startup_utils.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/net/nss_context.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/userdataauth/cryptohome_pkcs11_client.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "chromeos/tpm/tpm_token_info_getter.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "crypto/nss_util.h"
+#include "crypto/nss_util_internal.h"
+#include "net/cert/nss_cert_database_chromeos.h"
+
+using content::BrowserThread;
+
+namespace {
+
+// The following four functions are responsible for initializing NSS for each
+// profile on ChromeOS Ash, which has a separate NSS database and TPM slot
+// per-profile.
+//
+// Initialization basically follows these steps:
+// 1) Get some info from user_manager::UserManager about the User for this
+// profile.
+// 2) Tell nss_util to initialize the software slot for this profile.
+// 3) Wait for the TPM module to be loaded by nss_util if it isn't already.
+// 4) Ask CryptohomePkcs11Client which TPM slot id corresponds to this profile.
+// 5) Tell nss_util to use that slot id on the TPM module.
+//
+// Some of these steps must happen on the UI thread, others must happen on the
+// IO thread:
+// UI thread IO Thread
+//
+// NssServiceChromeOS::NssServiceChromeOS
+// |
+// ProfileHelper::Get()->GetUserByProfile()
+// \---------------------------------------v
+// StartNSSInitOnIOThread
+// |
+// crypto::InitializeNSSForChromeOSUser
+// |
+// crypto::IsTPMTokenReady
+// |
+// StartTPMSlotInitializationOnIOThread
+// v---------------------------------------/
+// GetTPMInfoForUserOnUIThread
+// |
+// chromeos::TPMTokenInfoGetter::Start
+// |
+// DidGetTPMInfoForUserOnUIThread
+// \---------------------------------------v
+// crypto::InitializeTPMForChromeOSUser
+
+void DidGetTPMInfoForUserOnUIThread(
+ std::unique_ptr<chromeos::TPMTokenInfoGetter> getter,
+ const std::string& username_hash,
+ base::Optional<user_data_auth::TpmTokenInfo> token_info) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (token_info.has_value() && token_info->slot() != -1) {
+ DVLOG(1) << "Got TPM slot for " << username_hash << ": "
+ << token_info->slot();
+ content::GetIOThreadTaskRunner({})->PostTask(
+ FROM_HERE, base::BindOnce(&crypto::InitializeTPMForChromeOSUser,
+ username_hash, token_info->slot()));
+ } else {
+ NOTREACHED() << "TPMTokenInfoGetter reported invalid token.";
+ }
+}
+
+void GetTPMInfoForUserOnUIThread(const AccountId& account_id,
+ const std::string& username_hash) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DVLOG(1) << "Getting TPM info from cryptohome for "
+ << " " << account_id.Serialize() << " " << username_hash;
+ std::unique_ptr<chromeos::TPMTokenInfoGetter> scoped_token_info_getter =
+ chromeos::TPMTokenInfoGetter::CreateForUserToken(
+ account_id, chromeos::CryptohomePkcs11Client::Get(),
+ base::ThreadTaskRunnerHandle::Get());
+ chromeos::TPMTokenInfoGetter* token_info_getter =
+ scoped_token_info_getter.get();
+
+ // Bind |token_info_getter| to the callback to ensure it does not go away
+ // before TPM token info is fetched.
+ token_info_getter->Start(base::BindOnce(&DidGetTPMInfoForUserOnUIThread,
+ std::move(scoped_token_info_getter),
+ username_hash));
+}
+
+void StartTPMSlotInitializationOnIOThread(const AccountId& account_id,
+ const std::string& username_hash) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ content::GetUIThreadTaskRunner({})->PostTask(
+ FROM_HERE,
+ base::BindOnce(&GetTPMInfoForUserOnUIThread, account_id, username_hash));
+}
+
+void StartNSSInitOnIOThread(const AccountId& account_id,
+ const std::string& username_hash,
+ const base::FilePath& path) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DVLOG(1) << "Starting NSS init for " << account_id.Serialize()
+ << " hash:" << username_hash;
+
+ // Make sure NSS is initialized for the user.
+ crypto::InitializeNSSForChromeOSUser(username_hash, path);
+
+ // Check if it's OK to initialize TPM for the user before continuing. This
+ // may not be the case if the TPM slot initialization was previously
+ // requested for the same user.
+ if (!crypto::ShouldInitializeTPMForChromeOSUser(username_hash))
+ return;
+
+ crypto::WillInitializeTPMForChromeOSUser(username_hash);
+
+ if (crypto::IsTPMTokenEnabledForNSS()) {
+ if (crypto::IsTPMTokenReady(
+ base::BindOnce(&StartTPMSlotInitializationOnIOThread, account_id,
+ username_hash))) {
+ StartTPMSlotInitializationOnIOThread(account_id, username_hash);
+ } else {
+ DVLOG(1) << "Waiting for tpm ready ...";
+ }
+ } else {
+ crypto::InitializePrivateSoftwareSlotForChromeOSUser(username_hash);
+ }
+}
+
+// Used to convert a callback that takes a net::NSSCertDatabase to one that
+// takes a net::NSSCertDatabaseChromeOS.
+void CallWithNSSCertDatabase(
+ base::OnceCallback<void(net::NSSCertDatabase*)> callback,
+ net::NSSCertDatabaseChromeOS* db) {
+ std::move(callback).Run(db);
+}
+
+} // namespace
+
+// Creates and manages a NSSCertDatabaseChromeOS. Created on the UI thread, but
+// all other calls are made on the IO thread.
+class NssServiceChromeOS::NSSCertDatabaseChromeOSManager {
+ public:
+ typedef base::OnceCallback<void(net::NSSCertDatabaseChromeOS*)>
+ GetNSSCertDatabaseCallback;
+
+ NSSCertDatabaseChromeOSManager(std::string username_hash,
+ bool user_is_affiliated)
+ : username_hash_(std::move(username_hash)) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (user_is_affiliated) {
+ content::GetIOThreadTaskRunner({})->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &NSSCertDatabaseChromeOSManager::EnableNSSSystemKeySlot,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+ }
+
+ NSSCertDatabaseChromeOSManager(const NSSCertDatabaseChromeOSManager&) =
+ delete;
+ NSSCertDatabaseChromeOSManager& operator=(
+ const NSSCertDatabaseChromeOSManager&) = delete;
+
+ ~NSSCertDatabaseChromeOSManager() { DCHECK_CURRENTLY_ON(BrowserThread::IO); }
+
+ net::NSSCertDatabaseChromeOS* GetNSSCertDatabaseChromeOS(
+ NSSCertDatabaseChromeOSManager::GetNSSCertDatabaseCallback callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ if (nss_cert_database_)
+ return nss_cert_database_.get();
+
+ ready_callback_list_.AddUnsafe(std::move(callback));
+
+ // If database creation has already started, nothing else to do.
+ if (database_creation_started_)
+ return nullptr;
+
+ // Otherwise, start creating the database.
+ database_creation_started_ = true;
+ crypto::ScopedPK11Slot private_slot(crypto::GetPrivateSlotForChromeOSUser(
+ username_hash_,
+ base::BindOnce(&NSSCertDatabaseChromeOSManager::DidGetPrivateSlot,
+ weak_ptr_factory_.GetWeakPtr())));
+ if (private_slot)
+ DidGetPrivateSlot(std::move(private_slot));
+
+ return nullptr;
+ }
+
+ // Just like GetNSSCertDatabaseChromeOS(), but uses net::NSSCertDatabase
+ // instead of net::NSSCertDatabaseChromeOS.
+ net::NSSCertDatabase* GetNSSCertDatabase(
+ base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
+ return GetNSSCertDatabaseChromeOS(
+ base::BindOnce(&CallWithNSSCertDatabase, std::move(callback)));
+ }
+
+ private:
+ using ReadyCallbackList =
+ base::OnceCallbackList<GetNSSCertDatabaseCallback::RunType>;
+
+ void EnableNSSSystemKeySlot() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ // This should only be called once.
+ DCHECK(!pending_system_slot_);
+
+ crypto::ScopedPK11Slot system_slot = crypto::GetSystemNSSKeySlot(
+ base::BindOnce(&NSSCertDatabaseChromeOSManager::SetSystemSlotOfDB,
+ weak_ptr_factory_.GetWeakPtr()));
+ if (system_slot)
+ SetSystemSlotOfDB(std::move(system_slot));
+ }
+
+ void SetSystemSlotOfDB(crypto::ScopedPK11Slot system_slot) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ DCHECK(system_slot);
+
+ pending_system_slot_ = std::move(system_slot);
+
+ base::RepeatingCallback<void(net::NSSCertDatabaseChromeOS*)> callback =
+ base::BindRepeating(&NSSCertDatabaseChromeOSManager::SetSystemSlot,
+ weak_ptr_factory_.GetWeakPtr());
+
+ net::NSSCertDatabaseChromeOS* db = GetNSSCertDatabaseChromeOS(callback);
+ if (db)
+ SetSystemSlot(db);
+ }
+
+ void SetSystemSlot(net::NSSCertDatabaseChromeOS* db) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ db->SetSystemSlot(std::move(pending_system_slot_));
+ }
+
+ void DidGetPrivateSlot(crypto::ScopedPK11Slot private_slot) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ nss_cert_database_ = std::make_unique<net::NSSCertDatabaseChromeOS>(
+ crypto::GetPublicSlotForChromeOSUser(username_hash_),
+ std::move(private_slot));
+
+ ready_callback_list_.Notify(nss_cert_database_.get());
+ }
+
+ const std::string username_hash_;
+ bool database_creation_started_ = false;
+
+ crypto::ScopedPK11Slot pending_system_slot_;
+
+ std::unique_ptr<net::NSSCertDatabaseChromeOS> nss_cert_database_;
+ ReadyCallbackList ready_callback_list_;
+
+ base::WeakPtrFactory<NSSCertDatabaseChromeOSManager> weak_ptr_factory_{this};
+};
+
+NssServiceChromeOS::NssServiceChromeOS(Profile* profile) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ const user_manager::User* user =
+ chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
+ // No need to initialize NSS for users with empty username hash:
+ // Getters for a user's NSS slots always return a null slot if the user's
+ // username hash is empty, even when the NSS is not initialized for the
+ // user.
+ std::string username_hash;
+ bool user_is_affiliated = false;
+ if (user && !user->username_hash().empty()) {
+ username_hash = user->username_hash();
+ DCHECK(!username_hash.empty());
+ content::GetIOThreadTaskRunner({})->PostTask(
+ FROM_HERE, base::BindOnce(&StartNSSInitOnIOThread, user->GetAccountId(),
+ username_hash, profile->GetPath()));
+
+ user_is_affiliated = user->IsAffiliated();
+ }
+
+ DCHECK(!(username_hash.empty() && user_is_affiliated));
+
+ nss_cert_database_manager_ = std::make_unique<NSSCertDatabaseChromeOSManager>(
+ std::move(username_hash), user_is_affiliated);
+}
+
+NssServiceChromeOS::~NssServiceChromeOS() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ content::GetIOThreadTaskRunner({})->DeleteSoon(
+ FROM_HERE, std::move(nss_cert_database_manager_));
+}
+
+NssCertDatabaseGetter
+NssServiceChromeOS::CreateNSSCertDatabaseGetterForIOThread() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ return base::BindOnce(&NSSCertDatabaseChromeOSManager::GetNSSCertDatabase,
+ base::Unretained(nss_cert_database_manager_.get()));
+}
diff --git a/chromium/chrome/browser/net/nss_service_chromeos.h b/chromium/chrome/browser/net/nss_service_chromeos.h
new file mode 100644
index 00000000000..2299816b509
--- /dev/null
+++ b/chromium/chrome/browser/net/nss_service_chromeos.h
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_H_
+#define CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "chrome/browser/net/nss_context.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+class Profile;
+
+// ChromeOS Ash service that owns and initializates the per-Profile certificate
+// database.
+class NssServiceChromeOS : public KeyedService {
+ public:
+ explicit NssServiceChromeOS(Profile* profile);
+ NssServiceChromeOS(const NssServiceChromeOS&) = delete;
+ NssServiceChromeOS& operator=(const NssServiceChromeOS&) = delete;
+ ~NssServiceChromeOS() override;
+
+ // Returns an NssCertDatabaseGetter that may only be invoked on the IO thread.
+ // To avoid UAF, the getter must be immediately posted to the IO thread and
+ // then invoked. While the returned getter must be invoked on the IO thread,
+ // this method itself may only be invoked on the UI thread, where the
+ // NssServiceChromeOS lives.
+ NssCertDatabaseGetter CreateNSSCertDatabaseGetterForIOThread();
+
+ private:
+ // Owns and manages access to the net::NSSCertDatabaseChromeOS.
+ class NSSCertDatabaseChromeOSManager;
+
+ // Created on the UI thread, but after that, initialized, accessed, and
+ // destroyed exclusively on the IO thread.
+ std::unique_ptr<NSSCertDatabaseChromeOSManager> nss_cert_database_manager_;
+};
+
+#endif // CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_H_
diff --git a/chromium/chrome/browser/net/nss_service_chromeos_factory.cc b/chromium/chrome/browser/net/nss_service_chromeos_factory.cc
new file mode 100644
index 00000000000..747245eafe6
--- /dev/null
+++ b/chromium/chrome/browser/net/nss_service_chromeos_factory.cc
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/nss_service_chromeos_factory.h"
+
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "chrome/browser/net/nss_service_chromeos.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+NssServiceChromeOS* NssServiceChromeOSFactory::GetForContext(
+ content::BrowserContext* browser_context) {
+ return static_cast<NssServiceChromeOS*>(
+ GetInstance().GetServiceForBrowserContext(browser_context, true));
+}
+
+NssServiceChromeOSFactory::NssServiceChromeOSFactory()
+ : BrowserContextKeyedServiceFactory(
+ "NssServiceChromeOSFactory",
+ BrowserContextDependencyManager::GetInstance()) {}
+
+NssServiceChromeOSFactory::~NssServiceChromeOSFactory() = default;
+
+NssServiceChromeOSFactory& NssServiceChromeOSFactory::GetInstance() {
+ static base::NoDestructor<NssServiceChromeOSFactory> instance;
+ return *instance;
+}
+
+KeyedService* NssServiceChromeOSFactory::BuildServiceInstanceFor(
+ content::BrowserContext* profile) const {
+ return new NssServiceChromeOS(Profile::FromBrowserContext(profile));
+}
+
+content::BrowserContext* NssServiceChromeOSFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ // Create separate service for incognito profiles.
+ return context;
+}
diff --git a/chromium/chrome/browser/net/nss_service_chromeos_factory.h b/chromium/chrome/browser/net/nss_service_chromeos_factory.h
new file mode 100644
index 00000000000..dd8c68f59e2
--- /dev/null
+++ b/chromium/chrome/browser/net/nss_service_chromeos_factory.h
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_FACTORY_H_
+#define CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_FACTORY_H_
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class NssServiceChromeOS;
+
+namespace content {
+class BrowserContext;
+}
+
+class NssServiceChromeOSFactory : public BrowserContextKeyedServiceFactory {
+ public:
+ // Returns the NssServiceChromeOS for |browser_context|.
+ static NssServiceChromeOS* GetForContext(
+ content::BrowserContext* browser_context);
+
+ private:
+ friend base::NoDestructor<NssServiceChromeOSFactory>;
+
+ NssServiceChromeOSFactory();
+ NssServiceChromeOSFactory(const NssServiceChromeOSFactory&) = delete;
+ NssServiceChromeOSFactory& operator=(const NssServiceChromeOSFactory&) =
+ delete;
+ ~NssServiceChromeOSFactory() override;
+
+ static NssServiceChromeOSFactory& GetInstance();
+
+ // BrowserContextKeyedServiceFactory implementation:
+ KeyedService* BuildServiceInstanceFor(
+ content::BrowserContext* profile) const override;
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override;
+};
+
+#endif // CHROME_BROWSER_NET_NSS_SERVICE_CHROMEOS_FACTORY_H_
diff --git a/chromium/chrome/browser/net/private_network_access_browsertest.cc b/chromium/chrome/browser/net/private_network_access_browsertest.cc
index 62fa70af1fe..480194a096a 100644
--- a/chromium/chrome/browser/net/private_network_access_browsertest.cc
+++ b/chromium/chrome/browser/net/private_network_access_browsertest.cc
@@ -9,12 +9,19 @@
#include "base/strings/string_piece.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/dom_distiller/tab_utils.h"
+#include "chrome/browser/dom_distiller/test_distillation_observers.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/install_verifier.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "components/dom_distiller/content/browser/distiller_javascript_utils.h"
+#include "components/dom_distiller/content/browser/test_distillability_observer.h"
+#include "components/dom_distiller/core/dom_distiller_features.h"
+#include "components/dom_distiller/core/dom_distiller_switches.h"
+#include "components/dom_distiller/core/url_constants.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/common/url_constants.h"
@@ -156,15 +163,20 @@ class PrivateNetworkAccessBrowserTest : public InProcessBrowserTest {
// function because GetChromeTestDataDir() is a test fixture method itself.
// We return a unique_ptr because EmbeddedTestServer is not movable and C++17
// support is not available at time of writing.
- std::unique_ptr<net::EmbeddedTestServer> NewServer() {
- auto server = std::make_unique<net::EmbeddedTestServer>();
+ std::unique_ptr<net::EmbeddedTestServer> NewServer(
+ net::EmbeddedTestServer::Type server_type =
+ net::EmbeddedTestServer::TYPE_HTTP) {
+ std::unique_ptr<net::EmbeddedTestServer> server =
+ std::make_unique<net::EmbeddedTestServer>(server_type);
server->AddDefaultHandlers(GetChromeTestDataDir());
EXPECT_TRUE(server->Start());
return server;
}
private:
- void SetUpOnMainThread() final { host_resolver()->AddRule("*", "127.0.0.1"); }
+ void SetUpOnMainThread() override {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ }
};
// This test verifies that no feature is counted for the initial navigation from
@@ -340,11 +352,29 @@ class PrivateNetworkAccessWithFeatureEnabledBrowserTest
: public PrivateNetworkAccessBrowserTest {
public:
PrivateNetworkAccessWithFeatureEnabledBrowserTest() {
- features_.InitAndEnableFeature(
- features::kBlockInsecurePrivateNetworkRequests);
+ std::vector<base::Feature> enabled_features = {
+ features::kBlockInsecurePrivateNetworkRequests,
+ dom_distiller::kReaderMode,
+ };
+ std::vector<base::Feature> disabled_features;
+ features_.InitWithFeatures(enabled_features, disabled_features);
+ }
+
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ command_line->AppendSwitch(switches::kEnableDomDistiller);
}
private:
+ void SetUpOnMainThread() override {
+ // The distiller needs to run in an isolated environment. For tests we
+ // can simply use the last value available.
+ if (!dom_distiller::DistillerJavaScriptWorldIdIsSet()) {
+ dom_distiller::SetDistillerJavaScriptWorldId(
+ content::ISOLATED_WORLD_ID_CONTENT_END);
+ }
+ host_resolver()->AddRule("*", "127.0.0.1");
+ }
+
base::test::ScopedFeatureList features_;
};
@@ -423,7 +453,7 @@ IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessWithFeatureEnabledBrowserTest,
IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessWithFeatureEnabledBrowserTest,
SpecialSchemeChromeSearch) {
EXPECT_TRUE(content::NavigateToURL(
- web_contents(), GURL("chrome-search://local-ntp/local-ntp.html")));
+ web_contents(), GURL("chrome-search://most-visited/title.html")));
ASSERT_TRUE(web_contents()->GetMainFrame()->GetLastCommittedURL().SchemeIs(
chrome::kChromeSearchScheme));
@@ -471,7 +501,7 @@ IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessWithFeatureEnabledBrowserTest,
extensions::ExtensionBuilder builder("test");
builder.SetPath(temp_dir.GetPath())
.SetVersion("1.0")
- .SetLocation(extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD)
+ .SetLocation(extensions::mojom::ManifestLocation::kExternalPolicyDownload)
.SetManifestKey("web_accessible_resources", std::move(resources));
extensions::ExtensionService* service =
@@ -501,4 +531,44 @@ IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessWithFeatureEnabledBrowserTest,
content::ISOLATED_WORLD_ID_CONTENT_END));
}
+// This test verifies that the chrome-distiller:// scheme is considered public
+// for the purpose of Private Network Access.
+IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessWithFeatureEnabledBrowserTest,
+ SpecialSchemeChromeDistiller) {
+ // Load the base page to be distilled. Note that HTTPS has to be used
+ // otherwise the page won't be distillable.
+ std::unique_ptr<net::EmbeddedTestServer> https_server =
+ NewServer(net::EmbeddedTestServer::TYPE_HTTPS);
+ GURL article_url = https_server->GetURL("/dom_distiller/simple_article.html");
+
+ dom_distiller::TestDistillabilityObserver distillability_observer(
+ web_contents());
+ dom_distiller::DistillabilityResult expected_result;
+ expected_result.is_distillable = true;
+ expected_result.is_last = false;
+ expected_result.is_mobile_friendly = false;
+
+ EXPECT_TRUE(content::NavigateToURL(web_contents(), article_url));
+ // This blocks until the page is found to be distillable.
+ distillability_observer.WaitForResult(expected_result);
+
+ // Distill the page. It will be placed in a new WebContents replacing the old
+ // one.
+ DistillCurrentPageAndView(web_contents());
+ dom_distiller::DistilledPageObserver(web_contents())
+ .WaitUntilFinishedLoading();
+
+ EXPECT_TRUE(web_contents()->GetMainFrame()->GetLastCommittedURL().SchemeIs(
+ dom_distiller::kDomDistillerScheme));
+
+ std::unique_ptr<net::EmbeddedTestServer> server = NewServer();
+ GURL fetch_url = LocalNonSecureWithCrossOriginCors(*server);
+
+ // Note: CSP is blocking javascript eval, unless we run it in an isolated
+ // world.
+ EXPECT_EQ(false, content::EvalJs(web_contents(), FetchScript(fetch_url),
+ content::EXECUTE_SCRIPT_DEFAULT_OPTIONS,
+ content::ISOLATED_WORLD_ID_CONTENT_END));
+}
+
} // namespace
diff --git a/chromium/chrome/browser/net/profile_network_context_service.cc b/chromium/chrome/browser/net/profile_network_context_service.cc
index 33681db0535..b41fe282dea 100644
--- a/chromium/chrome/browser/net/profile_network_context_service.cc
+++ b/chromium/chrome/browser/net/profile_network_context_service.cc
@@ -7,6 +7,7 @@
#include <string>
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/check_op.h"
#include "base/command_line.h"
#include "base/feature_list.h"
@@ -30,11 +31,11 @@
#include "chrome/common/chrome_content_client.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_paths_internal.h"
-#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "components/certificate_transparency/pref_names.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/embedder_support/pref_names.h"
+#include "components/embedder_support/switches.h"
#include "components/language/core/browser/language_prefs.h"
#include "components/language/core/browser/pref_names.h"
#include "components/metrics/metrics_pref_names.h"
@@ -618,11 +619,11 @@ bool GetHttpCacheBackendResetParam(PrefService* local_state) {
base::FieldTrial* field_trial = base::FeatureList::GetFieldTrial(
net::features::kSplitCacheByNetworkIsolationKey);
std::string current_field_trial_status =
- (field_trial ? field_trial->group_name() : "None") + " ";
- field_trial = base::FeatureList::GetFieldTrial(
- net::features::kAppendFrameOriginToNetworkIsolationKey);
- current_field_trial_status +=
(field_trial ? field_trial->group_name() : "None");
+ // This used to be used for keying on main frame only vs main frame +
+ // innermost frame, but the feature was removed, and now it's always keyed on
+ // both.
+ current_field_trial_status += " None";
// This used to be for keying on scheme + eTLD+1 vs origin, but the trial was
// removed, and now it's always keyed on eTLD+1. Still keeping a third "None"
// to avoid resetting the disk cache.
@@ -657,7 +658,7 @@ void ProfileNetworkContextService::ConfigureNetworkContextParamsInternal(
network_context_params->enable_referrers = enable_referrers_.GetValue();
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kShortReportingDelay)) {
+ if (command_line->HasSwitch(embedder_support::kShortReportingDelay)) {
network_context_params->reporting_delivery_interval =
base::TimeDelta::FromMilliseconds(100);
}
@@ -777,13 +778,14 @@ void ProfileNetworkContextService::ConfigureNetworkContextParamsInternal(
cert_verifier::mojom::CertVerifierCreationParams::CertVerifierImpl::
kSystem &&
TrialComparisonCertVerifierController::MaybeAllowedForProfile(profile_)) {
- mojo::PendingRemote<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::PendingRemote<
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client;
auto config_client_receiver =
config_client.InitWithNewPipeAndPassReceiver();
cert_verifier_creation_params->trial_comparison_cert_verifier_params =
- network::mojom::TrialComparisonCertVerifierParams::New();
+ cert_verifier::mojom::TrialComparisonCertVerifierParams::New();
if (!trial_comparison_cert_verifier_controller_) {
trial_comparison_cert_verifier_controller_ =
@@ -852,7 +854,7 @@ void ProfileNetworkContextService::ConfigureNetworkContextParamsInternal(
// Should be initialized with existing per-profile CORS access lists.
network_context_params->cors_origin_access_list =
- profile_->GetSharedCorsOriginAccessList()
+ content::BrowserContext::GetSharedCorsOriginAccessList(profile_)
->GetOriginAccessList()
.CreateCorsOriginAccessPatternsList();
diff --git a/chromium/chrome/browser/net/profile_network_context_service.h b/chromium/chrome/browser/net/profile_network_context_service.h
index 44a7648f449..61572b29017 100644
--- a/chromium/chrome/browser/net/profile_network_context_service.h
+++ b/chromium/chrome/browser/net/profile_network_context_service.h
@@ -104,7 +104,7 @@ class ProfileNetworkContextService
FRIEND_TEST_ALL_PREFIXES(ProfileNetworkContextServiceDiskCacheBrowsertest,
DiskCacheSize);
FRIEND_TEST_ALL_PREFIXES(
- ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ ProfileNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
Test);
friend class AmbientAuthenticationTestHelper;
diff --git a/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc b/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
index d1bb15f3974..d7bc7835a17 100644
--- a/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
+++ b/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
@@ -252,9 +252,8 @@ class ProfileNetworkContextServiceCacheSameBrowsertest
~ProfileNetworkContextServiceCacheSameBrowsertest() override = default;
void SetUp() override {
- scoped_feature_list_.InitWithFeatures(
- {}, {net::features::kSplitCacheByNetworkIsolationKey,
- net::features::kAppendFrameOriginToNetworkIsolationKey});
+ scoped_feature_list_.InitAndDisableFeature(
+ net::features::kSplitCacheByNetworkIsolationKey);
ProfileNetworkContextServiceBrowsertest::SetUp();
}
@@ -296,9 +295,8 @@ class ProfileNetworkContextServiceCacheChangeBrowsertest
: public ProfileNetworkContextServiceBrowsertest {
public:
ProfileNetworkContextServiceCacheChangeBrowsertest() {
- scoped_feature_list_.InitWithFeaturesAndParameters(
- {{net::features::kAppendFrameOriginToNetworkIsolationKey, {}}},
- {net::features::kSplitCacheByNetworkIsolationKey});
+ scoped_feature_list_.InitAndEnableFeatureWithParameters(
+ net::features::kSplitCacheByNetworkIsolationKey, {});
}
~ProfileNetworkContextServiceCacheChangeBrowsertest() override = default;
@@ -322,7 +320,7 @@ IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceCacheChangeBrowsertest,
DCHECK_EQ(
local_state->GetString(
"profile_network_context_service.http_cache_finch_experiment_groups"),
- "None scoped_feature_list_trial_group None");
+ "scoped_feature_list_trial_group None None");
// Set the local state for the next test.
local_state->SetString(
"profile_network_context_service.http_cache_finch_experiment_groups",
@@ -342,7 +340,7 @@ IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceCacheChangeBrowsertest,
DCHECK_EQ(
local_state->GetString(
"profile_network_context_service.http_cache_finch_experiment_groups"),
- "None scoped_feature_list_trial_group None");
+ "scoped_feature_list_trial_group None None");
}
class AmbientAuthenticationTestWithPolicy
@@ -510,7 +508,7 @@ void UnblockOnProfileCreation(base::RunLoop* run_loop,
}
} // namespace
-class ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
+class ProfileNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest
: public policy::PolicyTest,
public testing::WithParamInterface<bool> {
public:
@@ -552,8 +550,7 @@ class ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
profile_manager->GenerateNextProfileDirectoryPath();
base::RunLoop run_loop;
profile_manager->CreateProfileAsync(
- new_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop),
- base::string16(), std::string());
+ new_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop));
run_loop.Run();
return profile_manager->GetProfileByPath(new_path);
}
@@ -568,7 +565,7 @@ class ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
};
IN_PROC_BROWSER_TEST_P(
- ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ ProfileNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
Test) {
{
content::BrowserContext::GetDefaultStoragePartition(CreateNewProfile())
@@ -616,7 +613,7 @@ IN_PROC_BROWSER_TEST_P(
INSTANTIATE_TEST_SUITE_P(
All,
- ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ ProfileNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
::testing::Bool());
#endif // BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
diff --git a/chromium/chrome/browser/net/proxy_browsertest.cc b/chromium/chrome/browser/net/proxy_browsertest.cc
index 27a35c8b8c0..520868cd2ff 100644
--- a/chromium/chrome/browser/net/proxy_browsertest.cc
+++ b/chromium/chrome/browser/net/proxy_browsertest.cc
@@ -79,8 +79,7 @@ class LoginPromptObserver : public content::NotificationObserver {
content::Details<LoginNotificationDetails>(details).ptr();
// |login_details->handler()| is the associated LoginHandler object.
// SetAuth() will close the login dialog.
- login_details->handler()->SetAuth(base::ASCIIToUTF16("foo"),
- base::ASCIIToUTF16("bar"));
+ login_details->handler()->SetAuth(u"foo", u"bar");
auth_handled_ = true;
}
}
@@ -112,8 +111,8 @@ IN_PROC_BROWSER_TEST_F(ProxyBrowserTest, BasicAuthWSConnect) {
registrar.Add(&observer, chrome::NOTIFICATION_AUTH_NEEDED,
content::Source<content::NavigationController>(controller));
- content::TitleWatcher watcher(tab, base::ASCIIToUTF16("PASS"));
- watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
+ content::TitleWatcher watcher(tab, u"PASS");
+ watcher.AlsoWaitForTitle(u"FAIL");
// Visit a page that tries to establish WebSocket connection. The title
// of the page will be 'PASS' on success.
@@ -123,7 +122,7 @@ IN_PROC_BROWSER_TEST_F(ProxyBrowserTest, BasicAuthWSConnect) {
ws_server.GetURL("proxied_request_check.html")
.ReplaceComponents(replacements));
- const base::string16 result = watcher.WaitAndGetTitle();
+ const std::u16string result = watcher.WaitAndGetTitle();
EXPECT_TRUE(base::EqualsASCII(result, "PASS"));
EXPECT_TRUE(observer.auth_handled());
}
diff --git a/chromium/chrome/browser/net/reporting_browsertest.cc b/chromium/chrome/browser/net/reporting_browsertest.cc
index 5fa0a636271..042c12aa30f 100644
--- a/chromium/chrome/browser/net/reporting_browsertest.cc
+++ b/chromium/chrome/browser/net/reporting_browsertest.cc
@@ -19,6 +19,7 @@
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/result_codes.h"
#include "content/public/common/url_constants.h"
#include "content/public/test/browser_test.h"
@@ -38,15 +39,21 @@ namespace {
const char kReportingHost[] = "example.com";
-class ReportingBrowserTest : public CertVerifierBrowserTest {
+class ReportingBrowserTest : public CertVerifierBrowserTest,
+ public ::testing::WithParamInterface<bool> {
public:
ReportingBrowserTest()
: https_server_(net::test_server::EmbeddedTestServer::TYPE_HTTPS) {
+ std::vector<base::Feature> required_features = {
+ network::features::kReporting, network::features::kNetworkErrorLogging,
+ features::kCrashReporting,
+ net::features::kPartitionNelAndReportingByNetworkIsolationKey};
+ if (UseDocumentReporting()) {
+ required_features.push_back(net::features::kDocumentReporting);
+ }
scoped_feature_list_.InitWithFeatures(
// enabled_features
- {network::features::kReporting, network::features::kNetworkErrorLogging,
- features::kCrashReporting,
- net::features::kPartitionNelAndReportingByNetworkIsolationKey},
+ required_features,
// disabled_features
{});
}
@@ -74,6 +81,12 @@ class ReportingBrowserTest : public CertVerifierBrowserTest {
return https_server_.GetURL(kReportingHost, "/upload");
}
+ std::string GetReportingHeader() const {
+ return UseDocumentReporting() ? "Reporting-Endpoints: default=\"" +
+ GetCollectorURL().spec() + "\"\r\n"
+ : GetReportToHeader();
+ }
+
std::string GetReportToHeader() const {
return "Report-To: {\"endpoints\":[{\"url\":\"" + GetCollectorURL().spec() +
"\"}],\"max_age\":86400}\r\n";
@@ -85,6 +98,9 @@ class ReportingBrowserTest : public CertVerifierBrowserTest {
"1.0}\r\n";
}
+ protected:
+ bool UseDocumentReporting() const { return GetParam(); }
+
private:
base::test::ScopedFeatureList scoped_feature_list_;
net::EmbeddedTestServer https_server_;
@@ -141,14 +157,14 @@ std::unique_ptr<base::Value> ParseReportUpload(const std::string& payload) {
} // namespace
-IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, TestReportingHeadersProcessed) {
+IN_PROC_BROWSER_TEST_P(ReportingBrowserTest, TestReportingHeadersProcessed) {
NavigateParams params(browser(), GetReportingEnabledURL(),
ui::PAGE_TRANSITION_LINK);
Navigate(&params);
original_response()->WaitForRequest();
original_response()->Send("HTTP/1.1 204 OK\r\n");
- original_response()->Send(GetReportToHeader());
+ original_response()->Send(GetReportingHeader());
original_response()->Send(GetNELHeader());
original_response()->Send("\r\n");
original_response()->Done();
@@ -187,7 +203,7 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, TestReportingHeadersProcessed) {
EXPECT_EQ(*expected, *actual);
}
-IN_PROC_BROWSER_TEST_F(ReportingBrowserTest,
+IN_PROC_BROWSER_TEST_P(ReportingBrowserTest,
ReportingRespectsNetworkIsolationKeys) {
// Navigate main frame to a kReportingHost URL and learn NEL and Reporting
// information for that host.
@@ -259,7 +275,7 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest,
#define MAYBE_CrashReportUnresponsive CrashReportUnresponsive
#endif
-IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReport) {
+IN_PROC_BROWSER_TEST_P(ReportingBrowserTest, MAYBE_CrashReport) {
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
content::TestNavigationObserver navigation_observer(contents);
@@ -271,7 +287,7 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReport) {
original_response()->WaitForRequest();
original_response()->Send("HTTP/1.1 200 OK\r\n");
- original_response()->Send(GetReportToHeader());
+ original_response()->Send(GetReportingHeader());
original_response()->Send("\r\n");
original_response()->Done();
navigation_observer.Wait();
@@ -298,7 +314,7 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReport) {
EXPECT_EQ(GetReportingEnabledURL().spec(), url->GetString());
}
-IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReportUnresponsive) {
+IN_PROC_BROWSER_TEST_P(ReportingBrowserTest, MAYBE_CrashReportUnresponsive) {
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
content::TestNavigationObserver navigation_observer(contents);
@@ -310,7 +326,7 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReportUnresponsive) {
original_response()->WaitForRequest();
original_response()->Send("HTTP/1.1 200 OK\r\n");
- original_response()->Send(GetReportToHeader());
+ original_response()->Send(GetReportingHeader());
original_response()->Send("\r\n");
original_response()->Done();
navigation_observer.Wait();
@@ -337,3 +353,5 @@ IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, MAYBE_CrashReportUnresponsive) {
EXPECT_EQ(GetReportingEnabledURL().spec(), url->GetString());
EXPECT_EQ("unresponsive", reason->GetString());
}
+
+INSTANTIATE_TEST_SUITE_P(All, ReportingBrowserTest, ::testing::Bool());
diff --git a/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc b/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
index bd82a3e5b9d..318617001d6 100644
--- a/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
+++ b/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
@@ -5,17 +5,24 @@
#include <memory>
#include "base/command_line.h"
+#include "base/path_service.h"
#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/net/storage_test_utils.h"
#include "chrome/browser/policy/policy_test_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/network_session_configurator/common/network_switches.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
+#include "content/public/common/content_paths.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/base/features.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -53,6 +60,69 @@ class SameSiteCookiesPolicyTest : public PolicyTest,
base::test::ScopedFeatureList feature_list_;
};
+class SchemefulSameSiteCookiesPolicyIntegrationTest
+ : public policy::PolicyTest {
+ protected:
+ SchemefulSameSiteCookiesPolicyIntegrationTest()
+ : http_server_(net::EmbeddedTestServer::TYPE_HTTP),
+ https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
+
+ void SetUpOnMainThread() override {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ https_server_.AddDefaultHandlers(GetChromeTestDataDir());
+ https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
+ http_server_.AddDefaultHandlers(GetChromeTestDataDir());
+ ASSERT_TRUE(https_server_.Start());
+ ASSERT_TRUE(http_server_.Start());
+ }
+
+ GURL GetURL(const std::string& host, const std::string& path, bool secure) {
+ if (secure)
+ return https_server_.GetURL(host, path);
+
+ return http_server_.GetURL(host, path);
+ }
+
+ GURL GetURL(const std::string& host, bool secure) {
+ return GetURL(host, "/", secure);
+ }
+
+ content::RenderFrameHost* GetChildFrame() {
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ return ChildFrameAt(web_contents->GetMainFrame(), 0);
+ }
+
+ content::RenderFrameHost* GetMainFrame() {
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ return web_contents->GetMainFrame();
+ }
+
+ void NavigateToHttpPageWithFrame(const std::string& host) {
+ GURL main_url(http_server_.GetURL(host, "/iframe.html"));
+ ui_test_utils::NavigateToURL(browser(), main_url);
+ }
+
+ void NavigateFrameToHttps(const std::string& host, const std::string& path) {
+ GURL page = https_server_.GetURL(host, path);
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ EXPECT_TRUE(NavigateIframeToURL(web_contents, "test", page));
+ }
+
+ void ExpectFrameContent(content::RenderFrameHost* frame,
+ const std::string& expected) {
+ storage::test::ExpectFrameContent(frame, expected);
+ }
+
+ net::test_server::EmbeddedTestServer http_server_;
+ net::test_server::EmbeddedTestServer https_server_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SchemefulSameSiteCookiesPolicyIntegrationTest);
+};
+
IN_PROC_BROWSER_TEST_P(SameSiteCookiesPolicyTest,
DefaultLegacyCookieAccessSettingIsAllow) {
PolicyMap policies;
@@ -344,4 +414,106 @@ INSTANTIATE_TEST_SUITE_P(All,
SameSiteCookiesPolicyTest,
::testing::Bool());
+IN_PROC_BROWSER_TEST_F(SchemefulSameSiteCookiesPolicyIntegrationTest,
+ AllowCrossSchemeFrameLegacyCookies) {
+ PolicyMap policies;
+ // Set a policy to force legacy access for all cookies.
+ PolicyTest::SetPolicy(&policies,
+ policy::key::kLegacySameSiteCookieBehaviorEnabled,
+ base::Value(1));
+ PolicyTest::UpdateProviderPolicy(policies);
+
+ // Set a cookie that will only be sent with legacy behavior.
+ content::SetCookie(browser()->profile(), GetURL("a.test", false),
+ "strictcookie=1;SameSite=Strict");
+
+ // Construct a cross-scheme same domain iframe (Main frame http://a.test,
+ // iframe https://a.test).
+ //
+ // Start by navigating to an insecure page with an iframe.
+ NavigateToHttpPageWithFrame("a.test");
+ storage::test::ExpectCookiesOnHost(browser()->profile(),
+ GetURL("a.test", false /* secure */),
+ "strictcookie=1");
+
+ // Then navigate the frame to a secure page and check to see if the cookie is
+ // sent.
+ NavigateFrameToHttps("a.test", "/echoheader?cookie");
+ // The legacy cookie should have been sent.
+ ExpectFrameContent(GetChildFrame(), "strictcookie=1");
+}
+
+IN_PROC_BROWSER_TEST_F(SchemefulSameSiteCookiesPolicyIntegrationTest,
+ DisallowCrossSchemeFrameNonLegacyCookies) {
+ PolicyMap policies;
+ // Set a policy to force non-legacy access for all cookies.
+ PolicyTest::SetPolicy(&policies,
+ policy::key::kLegacySameSiteCookieBehaviorEnabled,
+ base::Value(2));
+ PolicyTest::UpdateProviderPolicy(policies);
+
+ // Set a cookie that will only be sent with legacy behavior.
+ content::SetCookie(browser()->profile(), GetURL("a.test", false),
+ "strictcookie=1;SameSite=Strict");
+
+ // Construct a cross-scheme same domain iframe (Main frame http://a.test,
+ // iframe https://a.test).
+ //
+ // Start by navigating to an insecure page with an iframe.
+ NavigateToHttpPageWithFrame("a.test");
+ storage::test::ExpectCookiesOnHost(browser()->profile(),
+ GetURL("a.test", false /* secure */),
+ "strictcookie=1");
+
+ // Then navigate the frame to a secure page and check to see if the cookie is
+ // sent.
+ NavigateFrameToHttps("a.test", "/echoheader?cookie");
+ // The non-legacy cookie should not have been sent.
+ ExpectFrameContent(GetChildFrame(), "None");
+}
+
+IN_PROC_BROWSER_TEST_F(SchemefulSameSiteCookiesPolicyIntegrationTest,
+ AllowStrictOnCrossSchemeNavigation) {
+ PolicyMap policies;
+ // Set a policy to force legacy access for all cookies.
+ PolicyTest::SetPolicy(&policies,
+ policy::key::kLegacySameSiteCookieBehaviorEnabled,
+ base::Value(1));
+ PolicyTest::UpdateProviderPolicy(policies);
+
+ // Set a cookie that will only be sent with legacy behavior.
+ content::SetCookie(browser()->profile(), GetURL("a.test", true),
+ "strictcookie=1;SameSite=Strict");
+
+ // Just go somewhere on http://a.test. Doesn't matter where.
+ NavigateToHttpPageWithFrame("a.test");
+
+ GURL secure_echo_url = GetURL("a.test", "/echoheader?cookie", true);
+ ASSERT_TRUE(NavigateToURLFromRenderer(GetMainFrame(), secure_echo_url));
+
+ ExpectFrameContent(GetMainFrame(), "strictcookie=1");
+}
+
+IN_PROC_BROWSER_TEST_F(SchemefulSameSiteCookiesPolicyIntegrationTest,
+ DisallowStrictOnCrossSchemeNavigation) {
+ PolicyMap policies;
+ // Set a policy to force non-legacy access for all cookies.
+ PolicyTest::SetPolicy(&policies,
+ policy::key::kLegacySameSiteCookieBehaviorEnabled,
+ base::Value(2));
+ PolicyTest::UpdateProviderPolicy(policies);
+
+ // Set a cookie that will only be sent with legacy behavior.
+ content::SetCookie(browser()->profile(), GetURL("a.test", false),
+ "strictcookie=1;SameSite=Strict");
+
+ // Just go somewhere on http://a.test. Doesn't matter where.
+ NavigateToHttpPageWithFrame("a.test");
+
+ GURL secure_echo_url = GetURL("a.test", "/echoheader?cookie", true);
+ ASSERT_TRUE(NavigateToURLFromRenderer(GetMainFrame(), secure_echo_url));
+
+ ExpectFrameContent(GetMainFrame(), "None");
+}
+
} // namespace policy
diff --git a/chromium/chrome/browser/net/service_providers_win.h b/chromium/chrome/browser/net/service_providers_win.h
index dc09d2466dd..302155dc0b1 100644
--- a/chromium/chrome/browser/net/service_providers_win.h
+++ b/chromium/chrome/browser/net/service_providers_win.h
@@ -8,7 +8,6 @@
#include <string>
#include <vector>
-#include "base/strings/string16.h"
struct WinsockNamespaceProvider {
std::wstring name;
diff --git a/chromium/chrome/browser/net/storage_test_utils.cc b/chromium/chrome/browser/net/storage_test_utils.cc
index f01d56232ea..732363775f6 100644
--- a/chromium/chrome/browser/net/storage_test_utils.cc
+++ b/chromium/chrome/browser/net/storage_test_utils.cc
@@ -9,11 +9,14 @@
namespace storage {
namespace test {
-const std::vector<std::string> kStorageTypes{
- "Cookie", "LocalStorage", "FileSystem",
- "FileSystemAccess", "SessionStorage", "IndexedDb",
- "WebSql", "CacheStorage", "ServiceWorker",
- "CookieStore", "WorkerFileSystemAccess", "StorageFoundation"};
+const std::vector<std::string> kStorageTypesForFrame{
+ "Cookie", "LocalStorage", "FileSystem", "FileSystemAccess",
+ "SessionStorage", "IndexedDb", "WebSql", "CacheStorage",
+ "ServiceWorker", "CookieStore", "StorageFoundation"};
+
+const std::vector<std::string> kStorageTypesForWorker{
+ "WorkerFileSystemAccess", "WorkerCacheStorage", "WorkerIndexedDb",
+ "WorkerStorageFoundation"};
const std::vector<std::string> kCrossTabCommunicationTypes{
"SharedWorker",
@@ -48,20 +51,38 @@ void ExpectCookiesOnHost(content::BrowserContext* context,
}
void SetStorageForFrame(content::RenderFrameHost* frame) {
- for (const auto& data_type : kStorageTypes) {
+ for (const auto& data_type : kStorageTypesForFrame) {
bool data = false;
EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
frame, "set" + data_type + "()", &data));
- EXPECT_TRUE(data) << data_type;
+ EXPECT_TRUE(data) << "SetStorageForFrame for " << data_type;
+ }
+}
+
+void SetStorageForWorker(content::RenderFrameHost* frame) {
+ for (const auto& data_type : kStorageTypesForWorker) {
+ bool data = false;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+ frame, "set" + data_type + "()", &data));
+ EXPECT_TRUE(data) << "SetStorageForWorker for " << data_type;
}
}
void ExpectStorageForFrame(content::RenderFrameHost* frame, bool expected) {
- for (const auto& data_type : kStorageTypes) {
+ for (const auto& data_type : kStorageTypesForFrame) {
bool data = false;
EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
frame, "has" + data_type + "();", &data));
- EXPECT_EQ(expected, data) << data_type;
+ EXPECT_EQ(expected, data) << "ExpectStorageForFrame for " << data_type;
+ }
+}
+
+void ExpectStorageForWorker(content::RenderFrameHost* frame, bool expected) {
+ for (const auto& data_type : kStorageTypesForWorker) {
+ bool data = false;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+ frame, "has" + data_type + "();", &data));
+ EXPECT_EQ(expected, data) << "ExpectStorageForWorker for " << data_type;
}
}
diff --git a/chromium/chrome/browser/net/storage_test_utils.h b/chromium/chrome/browser/net/storage_test_utils.h
index b997843b400..76b9796b4eb 100644
--- a/chromium/chrome/browser/net/storage_test_utils.h
+++ b/chromium/chrome/browser/net/storage_test_utils.h
@@ -30,7 +30,9 @@ void ExpectCookiesOnHost(content::BrowserContext* context,
// Helpers to set and check various types of storage on a given frame. Typically
// used on page like //chrome/test/data/browsing_data/site_data.html
void SetStorageForFrame(content::RenderFrameHost* frame);
+void SetStorageForWorker(content::RenderFrameHost* frame);
void ExpectStorageForFrame(content::RenderFrameHost* frame, bool expected);
+void ExpectStorageForWorker(content::RenderFrameHost* frame, bool expected);
// Helpers to set and check various types of cross tab info for a given frame.
// Typically used on page like //chrome/test/data/browsing_data/site_data.html
diff --git a/chromium/chrome/browser/net/system_network_context_manager.cc b/chromium/chrome/browser/net/system_network_context_manager.cc
index c15186c8bd7..5cdfeec7a24 100644
--- a/chromium/chrome/browser/net/system_network_context_manager.cc
+++ b/chromium/chrome/browser/net/system_network_context_manager.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/component_updater/crl_set_component_installer.h"
#include "chrome/browser/component_updater/first_party_sets_component_installer.h"
#include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h"
+#include "chrome/browser/net/convert_explicitly_allowed_network_ports_pref.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/ssl/sct_reporting_service.h"
#include "chrome/browser/ssl/ssl_config_service_manager.h"
@@ -65,6 +66,7 @@
#include "services/network/network_service.h"
#include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h"
#include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/network_switches.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/mojom/cert_verifier_service.mojom.h"
#include "services/network/public/mojom/network_context.mojom.h"
@@ -212,7 +214,6 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
void CreateLoaderAndStart(
mojo::PendingReceiver<network::mojom::URLLoader> receiver,
- int32_t routing_id,
int32_t request_id,
uint32_t options,
const network::ResourceRequest& url_request,
@@ -223,7 +224,7 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
if (!manager_)
return;
manager_->GetURLLoaderFactory()->CreateLoaderAndStart(
- std::move(receiver), routing_id, request_id, options, url_request,
+ std::move(receiver), request_id, options, url_request,
std::move(client), traffic_annotation);
}
@@ -390,6 +391,12 @@ SystemNetworkContextManager::SystemNetworkContextManager(
prefs::kEnableReferrers, local_state_,
base::BindRepeating(&SystemNetworkContextManager::UpdateReferrersEnabled,
base::Unretained(this)));
+
+ pref_change_registrar_.Add(
+ prefs::kExplicitlyAllowedNetworkPorts,
+ base::BindRepeating(
+ &SystemNetworkContextManager::UpdateExplicitlyAllowedNetworkPorts,
+ base::Unretained(this)));
}
SystemNetworkContextManager::~SystemNetworkContextManager() {
@@ -445,6 +452,8 @@ void SystemNetworkContextManager::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(prefs::kBuiltinCertificateVerifierEnabled,
false);
#endif
+
+ registry->RegisterListPref(prefs::kExplicitlyAllowedNetworkPorts);
}
// static
@@ -554,6 +563,8 @@ void SystemNetworkContextManager::OnNetworkServiceCreated(
network_service->SetPreloadedFirstPartySets(raw_sets);
}));
}
+
+ UpdateExplicitlyAllowedNetworkPorts();
}
void SystemNetworkContextManager::DisableQuic() {
@@ -594,7 +605,10 @@ void SystemNetworkContextManager::ConfigureDefaultNetworkContextParams(
if (base::FeatureList::IsEnabled(blink::features::kFreezeUserAgent)) {
quic_user_agent_id = "";
} else {
- quic_user_agent_id = chrome::GetChannelName();
+ // Extended stable reports as regular stable due to the similarity, and to
+ // avoid adding more signal to the user agent string.
+ quic_user_agent_id =
+ chrome::GetChannelName(chrome::WithExtendedStable(false));
if (!quic_user_agent_id.empty())
quic_user_agent_id.push_back(' ');
quic_user_agent_id.append(
@@ -751,6 +765,14 @@ SystemNetworkContextManager::CreateNetworkContextParams() {
return network_context_params;
}
+void SystemNetworkContextManager::UpdateExplicitlyAllowedNetworkPorts() {
+ // Currently there are no uses of net::IsPortAllowedForScheme() in the browser
+ // process. If someone adds one then we'll have to also call
+ // net::SetExplicitlyAllowedPorts() directly here, on the appropriate thread.
+ content::GetNetworkService()->SetExplicitlyAllowedPorts(
+ ConvertExplicitlyAllowedNetworkPortsPref(local_state_));
+}
+
void SystemNetworkContextManager::UpdateReferrersEnabled() {
GetContext()->SetEnableReferrers(enable_referrers_.GetValue());
}
diff --git a/chromium/chrome/browser/net/system_network_context_manager.h b/chromium/chrome/browser/net/system_network_context_manager.h
index 95903f64319..6ffe7c52a21 100644
--- a/chromium/chrome/browser/net/system_network_context_manager.h
+++ b/chromium/chrome/browser/net/system_network_context_manager.h
@@ -165,7 +165,7 @@ class SystemNetworkContextManager {
private:
FRIEND_TEST_ALL_PREFIXES(
- SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
Test);
class URLLoaderFactoryForSystem;
@@ -179,6 +179,10 @@ class SystemNetworkContextManager {
// it initializes some class members.
network::mojom::NetworkContextParamsPtr CreateNetworkContextParams();
+ // Send the current value of the net.explicitly_allowed_network_ports pref to
+ // the network process.
+ void UpdateExplicitlyAllowedNetworkPorts();
+
// The PrefService to retrieve all the pref values.
PrefService* local_state_;
diff --git a/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc b/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
index c2dc67db89b..dba495cdbb0 100644
--- a/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
+++ b/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -27,6 +27,7 @@
#include "content/public/test/browser_test.h"
#include "net/dns/public/dns_over_https_server_config.h"
#include "net/dns/public/secure_dns_mode.h"
+#include "net/net_buildflags.h"
#include "services/cert_verifier/test_cert_verifier_service_factory.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/network_service_buildflags.h"
@@ -392,7 +393,8 @@ IN_PROC_BROWSER_TEST_P(SystemNetworkContextManagerFreezeQUICUaBrowsertest,
if (GetParam()) { // if the UA Freeze feature is turned on
EXPECT_EQ("", quic_ua);
} else {
- EXPECT_THAT(quic_ua, testing::HasSubstr(chrome::GetChannelName()));
+ EXPECT_THAT(quic_ua, testing::HasSubstr(chrome::GetChannelName(
+ chrome::WithExtendedStable(false))));
EXPECT_THAT(quic_ua,
testing::HasSubstr(
version_info::GetProductNameAndVersionForUserAgent()));
@@ -482,11 +484,11 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(base::nullopt, true, false));
#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
-class SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
+class SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest
: public policy::PolicyTest,
public testing::WithParamInterface<bool> {
public:
- SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest() {
+ SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest() {
bool use_builtin_cert_verifier = GetParam();
cert_verifier_impl_ =
use_builtin_cert_verifier
@@ -548,7 +550,7 @@ class SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
};
IN_PROC_BROWSER_TEST_P(
- SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
Test) {
network::mojom::NetworkContextParamsPtr network_context_params_ptr;
@@ -591,6 +593,6 @@ IN_PROC_BROWSER_TEST_P(
INSTANTIATE_TEST_SUITE_P(
All,
- SystemNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
+ SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest,
::testing::Bool());
#endif // BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
diff --git a/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc b/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
index 10ec923fc43..f66bec0d591 100644
--- a/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
+++ b/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
@@ -8,7 +8,6 @@
#include "chrome/browser/net/trial_comparison_cert_verifier_controller.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
-#include "chrome/common/chrome_features.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/metrics/content/subprocess_metrics_provider.h"
@@ -47,7 +46,8 @@ class TrialComparisonCertVerifierFeatureEnabledTest
// None of these tests should generate a report, but set the trial to
// uma_only mode anyway just to be safe.
scoped_feature_->InitAndEnableFeatureWithParameters(
- features::kCertDualVerificationTrialFeature, {{"uma_only", "true"}});
+ net::features::kCertDualVerificationTrialFeature,
+ {{"uma_only", "true"}});
}
~TrialComparisonCertVerifierFeatureEnabledTest() override {
@@ -103,7 +103,8 @@ class TrialComparisonCertVerifierFeatureOverridenByBuiltinVerifierTest
scoped_feature_->InitWithFeaturesAndParameters(
// None of these tests should generate a report, but set the trial to
// uma_only mode anyway just to be safe.
- {{features::kCertDualVerificationTrialFeature, {{"uma_only", "true"}}},
+ {{net::features::kCertDualVerificationTrialFeature,
+ {{"uma_only", "true"}}},
// Enable the builtin verifier.
{net::features::kCertVerifierBuiltinFeature, {}}},
{});
diff --git a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.cc b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
index a6a9196252e..d339a1e877e 100644
--- a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
+++ b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.cc
@@ -19,7 +19,6 @@
#include "chrome/browser/safe_browsing/certificate_reporting_service.h"
#include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
#include "chrome/common/channel_info.h"
-#include "chrome/common/chrome_features.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/security_interstitials/content/certificate_error_report.h"
#include "content/public/browser/browser_task_traits.h"
@@ -71,15 +70,16 @@ bool TrialComparisonCertVerifierController::MaybeAllowedForProfile(
return is_official_build &&
base::FeatureList::IsEnabled(
- features::kCertDualVerificationTrialFeature) &&
+ net::features::kCertDualVerificationTrialFeature) &&
!profile->IsOffTheRecord();
}
void TrialComparisonCertVerifierController::AddClient(
- mojo::PendingRemote<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::PendingRemote<
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client,
mojo::PendingReceiver<
- network::mojom::TrialComparisonCertVerifierReportClient>
+ cert_verifier::mojom::TrialComparisonCertVerifierReportClient>
report_client_receiver) {
receiver_set_.Add(this, std::move(report_client_receiver));
config_client_set_.Add(std::move(config_client));
@@ -110,10 +110,10 @@ void TrialComparisonCertVerifierController::SendTrialReport(
const std::vector<uint8_t>& sct_list,
const net::CertVerifyResult& primary_result,
const net::CertVerifyResult& trial_result,
- network::mojom::CertVerifierDebugInfoPtr debug_info) {
- if (!IsAllowed() ||
- base::GetFieldTrialParamByFeatureAsBool(
- features::kCertDualVerificationTrialFeature, "uma_only", false)) {
+ cert_verifier::mojom::CertVerifierDebugInfoPtr debug_info) {
+ if (!IsAllowed() || base::GetFieldTrialParamByFeatureAsBool(
+ net::features::kCertDualVerificationTrialFeature,
+ "uma_only", false)) {
return;
}
diff --git a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.h b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.h
index e6e1b1b3b25..f22d29f1935 100644
--- a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.h
+++ b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller.h
@@ -21,12 +21,12 @@
#include "mojo/public/cpp/bindings/remote_set.h"
#include "net/base/net_export.h"
#include "net/cert/cert_verifier.h"
-#include "services/network/public/mojom/trial_comparison_cert_verifier.mojom.h"
+#include "services/cert_verifier/public/mojom/trial_comparison_cert_verifier.mojom.h"
class Profile;
class TrialComparisonCertVerifierController
- : public network::mojom::TrialComparisonCertVerifierReportClient {
+ : public cert_verifier::mojom::TrialComparisonCertVerifierReportClient {
public:
// Creates a TrialComparisonCertVerifierController using |profile| for
// preferences and reporting.
@@ -39,12 +39,13 @@ class TrialComparisonCertVerifierController
// Adds a client to the controller, sending trial configuration updates to
// |config_client|, and receiving trial reports from |report_client_receiver|.
- void AddClient(mojo::PendingRemote<
- network::mojom::TrialComparisonCertVerifierConfigClient>
- config_client,
- mojo::PendingReceiver<
- network::mojom::TrialComparisonCertVerifierReportClient>
- report_client_receiver);
+ void AddClient(
+ mojo::PendingRemote<
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
+ config_client,
+ mojo::PendingReceiver<
+ cert_verifier::mojom::TrialComparisonCertVerifierReportClient>
+ report_client_receiver);
// Returns true if the trial is enabled and SBER flag is set for this
// profile.
@@ -62,7 +63,7 @@ class TrialComparisonCertVerifierController
const std::vector<uint8_t>& sct_list,
const net::CertVerifyResult& primary_result,
const net::CertVerifyResult& trial_result,
- network::mojom::CertVerifierDebugInfoPtr debug_info) override;
+ cert_verifier::mojom::CertVerifierDebugInfoPtr debug_info) override;
static void SetFakeOfficialBuildForTesting(bool fake_official_build);
@@ -72,10 +73,11 @@ class TrialComparisonCertVerifierController
Profile* profile_;
PrefChangeRegistrar pref_change_registrar_;
- mojo::ReceiverSet<network::mojom::TrialComparisonCertVerifierReportClient>
+ mojo::ReceiverSet<
+ cert_verifier::mojom::TrialComparisonCertVerifierReportClient>
receiver_set_;
- mojo::RemoteSet<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::RemoteSet<cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client_set_;
DISALLOW_COPY_AND_ASSIGN(TrialComparisonCertVerifierController);
diff --git a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller_unittest.cc b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller_unittest.cc
index 22e07b41a50..4840bdca1c3 100644
--- a/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller_unittest.cc
+++ b/chromium/chrome/browser/net/trial_comparison_cert_verifier_controller_unittest.cc
@@ -16,7 +16,6 @@
#include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
#include "chrome/browser/safe_browsing/certificate_reporting_service_test_utils.h"
#include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
-#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
@@ -29,6 +28,7 @@
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
+#include "net/base/features.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_verify_result.h"
#include "net/cert/x509_certificate.h"
@@ -36,8 +36,8 @@
#include "net/test/cert_test_util.h"
#include "net/test/gtest_util.h"
#include "net/test/test_data_directory.h"
+#include "services/cert_verifier/public/mojom/trial_comparison_cert_verifier.mojom.h"
#include "services/network/public/cpp/features.h"
-#include "services/network/public/mojom/trial_comparison_cert_verifier.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -82,18 +82,18 @@ MATCHER_P(CertChainMatches, expected_cert, "") {
} // namespace
class MockTrialComparisonCertVerifierConfigClient
- : public network::mojom::TrialComparisonCertVerifierConfigClient {
+ : public cert_verifier::mojom::TrialComparisonCertVerifierConfigClient {
public:
MockTrialComparisonCertVerifierConfigClient(
mojo::PendingReceiver<
- network::mojom::TrialComparisonCertVerifierConfigClient>
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client_receiver)
: receiver_(this, std::move(config_client_receiver)) {}
MOCK_METHOD1(OnTrialConfigUpdated, void(bool allowed));
private:
- mojo::Receiver<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::Receiver<cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
receiver_;
};
@@ -148,7 +148,8 @@ class TrialComparisonCertVerifierControllerTest : public testing::Test {
}
void CreateController(Profile* profile) {
- mojo::PendingRemote<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::PendingRemote<
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client;
auto config_client_receiver =
config_client.InitWithNewPipeAndPassReceiver();
@@ -188,7 +189,8 @@ class TrialComparisonCertVerifierControllerTest : public testing::Test {
TrialComparisonCertVerifierController& trial_controller() {
return *trial_controller_;
}
- network::mojom::TrialComparisonCertVerifierReportClient* report_client() {
+ cert_verifier::mojom::TrialComparisonCertVerifierReportClient*
+ report_client() {
return report_client_.get();
}
MockTrialComparisonCertVerifierConfigClient& mock_config_client() {
@@ -218,7 +220,7 @@ class TrialComparisonCertVerifierControllerTest : public testing::Test {
std::unique_ptr<TestingProfileManager> profile_manager_;
TestingProfile* profile_;
- mojo::Remote<network::mojom::TrialComparisonCertVerifierReportClient>
+ mojo::Remote<cert_verifier::mojom::TrialComparisonCertVerifierReportClient>
report_client_;
std::unique_ptr<TrialComparisonCertVerifierController> trial_controller_;
std::unique_ptr<StrictMock<MockTrialComparisonCertVerifierConfigClient>>
@@ -243,7 +245,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest, NothingEnabled) {
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, ok_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
// Expect no report since the trial is not allowed.
@@ -266,7 +268,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, ok_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
@@ -279,7 +281,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
NotOfficialBuildTrialEnabled) {
scoped_feature_ = std::make_unique<base::test::ScopedFeatureList>();
scoped_feature_->InitAndEnableFeature(
- features::kCertDualVerificationTrialFeature);
+ net::features::kCertDualVerificationTrialFeature);
CreateController();
EXPECT_FALSE(trial_controller().IsAllowed());
@@ -303,7 +305,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, ok_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
@@ -317,7 +319,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest, OfficialBuildTrialEnabled) {
TrialComparisonCertVerifierController::SetFakeOfficialBuildForTesting(true);
scoped_feature_ = std::make_unique<base::test::ScopedFeatureList>();
scoped_feature_->InitAndEnableFeature(
- features::kCertDualVerificationTrialFeature);
+ net::features::kCertDualVerificationTrialFeature);
CreateController();
EXPECT_FALSE(trial_controller().IsAllowed());
@@ -338,7 +340,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest, OfficialBuildTrialEnabled) {
report_client()->SendTrialReport(
"127.0.0.1", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>{4, 5, 6}, std::vector<uint8_t>{7, 8, 9}, ok_result_,
- bad_result_, network::mojom::CertVerifierDebugInfo::New());
+ bad_result_, cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
@@ -386,7 +388,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest, OfficialBuildTrialEnabled) {
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
// Expect no report since the trial is not allowed.
@@ -398,13 +400,14 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
TrialComparisonCertVerifierController::SetFakeOfficialBuildForTesting(true);
scoped_feature_ = std::make_unique<base::test::ScopedFeatureList>();
scoped_feature_->InitAndEnableFeature(
- features::kCertDualVerificationTrialFeature);
+ net::features::kCertDualVerificationTrialFeature);
CreateController();
- mojo::Remote<network::mojom::TrialComparisonCertVerifierReportClient>
+ mojo::Remote<cert_verifier::mojom::TrialComparisonCertVerifierReportClient>
report_client_2;
- mojo::PendingRemote<network::mojom::TrialComparisonCertVerifierConfigClient>
+ mojo::PendingRemote<
+ cert_verifier::mojom::TrialComparisonCertVerifierConfigClient>
config_client_2;
auto config_client_2_receiver =
config_client_2.InitWithNewPipeAndPassReceiver();
@@ -435,11 +438,11 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"127.0.0.1", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
report_client_2->SendTrialReport(
"127.0.0.2", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
@@ -490,11 +493,11 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
report_client_2->SendTrialReport(
"hostname2", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
// Expect no report since the trial is not allowed.
@@ -506,7 +509,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
TrialComparisonCertVerifierController::SetFakeOfficialBuildForTesting(true);
scoped_feature_ = std::make_unique<base::test::ScopedFeatureList>();
scoped_feature_->InitAndEnableFeatureWithParameters(
- features::kCertDualVerificationTrialFeature, {{"uma_only", "true"}});
+ net::features::kCertDualVerificationTrialFeature, {{"uma_only", "true"}});
CreateController();
EXPECT_FALSE(trial_controller().IsAllowed());
@@ -528,7 +531,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"127.0.0.1", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, bad_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
@@ -542,7 +545,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
TrialComparisonCertVerifierController::SetFakeOfficialBuildForTesting(true);
scoped_feature_ = std::make_unique<base::test::ScopedFeatureList>();
scoped_feature_->InitAndEnableFeature(
- features::kCertDualVerificationTrialFeature);
+ net::features::kCertDualVerificationTrialFeature);
CreateController(profile()->GetPrimaryOTRProfile());
EXPECT_FALSE(trial_controller().IsAllowed());
@@ -558,7 +561,7 @@ TEST_F(TrialComparisonCertVerifierControllerTest,
report_client()->SendTrialReport(
"hostname", leaf_cert_1_, false, false, false, false,
std::vector<uint8_t>(), std::vector<uint8_t>(), ok_result_, ok_result_,
- network::mojom::CertVerifierDebugInfo::New());
+ cert_verifier::mojom::CertVerifierDebugInfo::New());
// Ensure any in-flight mojo calls get run.
base::RunLoop().RunUntilIdle();
// Expect no report since the trial is not allowed.
diff --git a/chromium/chrome/browser/net/websocket_browsertest.cc b/chromium/chrome/browser/net/websocket_browsertest.cc
index f5b642ac7c5..1e4b993a648 100644
--- a/chromium/chrome/browser/net/websocket_browsertest.cc
+++ b/chromium/chrome/browser/net/websocket_browsertest.cc
@@ -83,10 +83,9 @@ class WebSocketBrowserTest : public InProcessBrowserTest {
// Prepare the title watcher.
void SetUpOnMainThread() override {
- watcher_.reset(new content::TitleWatcher(
- browser()->tab_strip_model()->GetActiveWebContents(),
- base::ASCIIToUTF16("PASS")));
- watcher_->AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
+ watcher_ = std::make_unique<content::TitleWatcher>(
+ browser()->tab_strip_model()->GetActiveWebContents(), u"PASS");
+ watcher_->AlsoWaitForTitle(u"FAIL");
}
void TearDownOnMainThread() override { watcher_.reset(); }
@@ -120,7 +119,7 @@ class WebSocketBrowserTest : public InProcessBrowserTest {
network::mojom::kWebSocketOptionNone,
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS),
std::move(handshake_client),
- process->GetStoragePartition()->CreateAuthAndCertObserverForFrame(
+ process->GetStoragePartition()->CreateURLLoaderNetworkObserverForFrame(
process->GetID(), frame->GetRoutingID()),
/*auth_handler=*/mojo::NullRemote(),
/*header_client=*/mojo::NullRemote());
@@ -198,8 +197,8 @@ class AutoLogin : public content::NotificationObserver {
bool logged_in() const { return logged_in_; }
private:
- const base::string16 username_;
- const base::string16 password_;
+ const std::u16string username_;
+ const std::u16string password_;
bool logged_in_;
content::NotificationRegistrar registrar_;
@@ -250,11 +249,10 @@ IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, SendCloseFrameWhenTabIsClosed) {
browser()->tab_strip_model()->AppendWebContents(std::move(new_tab), true);
ASSERT_EQ(raw_new_tab, browser()->tab_strip_model()->GetWebContentsAt(1));
- content::TitleWatcher connected_title_watcher(
- raw_new_tab, base::ASCIIToUTF16("CONNECTED"));
- connected_title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("CLOSED"));
+ content::TitleWatcher connected_title_watcher(raw_new_tab, u"CONNECTED");
+ connected_title_watcher.AlsoWaitForTitle(u"CLOSED");
NavigateToHTTP("connect_and_be_observed.html");
- const base::string16 result = connected_title_watcher.WaitAndGetTitle();
+ const std::u16string result = connected_title_watcher.WaitAndGetTitle();
EXPECT_TRUE(base::EqualsASCII(result, "CONNECTED"));
content::WebContentsDestroyedWatcher destroyed_watcher(raw_new_tab);
@@ -409,11 +407,10 @@ IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, MAYBE_WebSocketAppliesHSTS) {
// Set HSTS on localhost.
content::TitleWatcher title_watcher(
- browser()->tab_strip_model()->GetActiveWebContents(),
- base::ASCIIToUTF16("SET"));
+ browser()->tab_strip_model()->GetActiveWebContents(), u"SET");
ui_test_utils::NavigateToURL(browser(),
https_server.GetURL("/websocket/set-hsts.html"));
- const base::string16 result = title_watcher.WaitAndGetTitle();
+ const std::u16string result = title_watcher.WaitAndGetTitle();
EXPECT_TRUE(base::EqualsASCII(result, "SET"));
// Verify that it applies to WebSockets.
diff --git a/chromium/chrome/browser/offline_pages/android/BUILD.gn b/chromium/chrome/browser/offline_pages/android/BUILD.gn
index 79d0159e4c3..32ea4480b14 100644
--- a/chromium/chrome/browser/offline_pages/android/BUILD.gn
+++ b/chromium/chrome/browser/offline_pages/android/BUILD.gn
@@ -9,7 +9,6 @@ android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
]
diff --git a/chromium/chrome/browser/optimization_guide/android/BUILD.gn b/chromium/chrome/browser/optimization_guide/android/BUILD.gn
index e88063acf12..e9b9aaf1b29 100644
--- a/chromium/chrome/browser/optimization_guide/android/BUILD.gn
+++ b/chromium/chrome/browser/optimization_guide/android/BUILD.gn
@@ -12,12 +12,10 @@ android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java",
"java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory.java",
- "java/src/org/chromium/chrome/browser/optimization_guide/OptimizationMetadata.java",
]
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//components/optimization_guide/proto:optimization_guide_proto_java",
"//content/public/android:content_java",
diff --git a/chromium/chrome/browser/paint_preview/android/BUILD.gn b/chromium/chrome/browser/paint_preview/android/BUILD.gn
index 5f67f52ecb8..3f58b0f7351 100644
--- a/chromium/chrome/browser/paint_preview/android/BUILD.gn
+++ b/chromium/chrome/browser/paint_preview/android/BUILD.gn
@@ -28,7 +28,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/browser_controls/android:java",
"//chrome/browser/flags:java",
@@ -58,6 +57,7 @@ android_library("javatests") {
sources = [
"javatests/src/org/chromium/chrome/browser/paint_preview/DemoPaintPreviewTest.java",
"javatests/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewTest.java",
+ "javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewAccessibilityTest.java",
"javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewTest.java",
"javatests/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabServiceTest.java",
]
@@ -71,6 +71,7 @@ android_library("javatests") {
"//chrome/browser/flags:java",
"//chrome/browser/tab:java",
"//chrome/browser/tabmodel:java",
+ "//chrome/browser/ui/android/appmenu/test:test_support_java",
"//chrome/browser/ui/messages/android:java",
"//chrome/test/android:chrome_java_test_support",
"//components/paint_preview/browser/android:java",
diff --git a/chromium/chrome/browser/password_check/android/BUILD.gn b/chromium/chrome/browser/password_check/android/BUILD.gn
index 1b86e5e5092..5bc7d2327f3 100644
--- a/chromium/chrome/browser/password_check/android/BUILD.gn
+++ b/chromium/chrome/browser/password_check/android/BUILD.gn
@@ -92,6 +92,7 @@ junit_binary("password_check_junit_tests") {
"//chrome/test/android:chrome_java_test_support",
"//components/browser_ui/settings/android:java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
+ "//third_party/androidx:androidx_test_core_java",
"//third_party/hamcrest:hamcrest_java",
"//third_party/junit",
"//ui/android:ui_full_java",
diff --git a/chromium/chrome/browser/password_check/android/internal/BUILD.gn b/chromium/chrome/browser/password_check/android/internal/BUILD.gn
index ef49c088637..4009ed05a13 100644
--- a/chromium/chrome/browser/password_check/android/internal/BUILD.gn
+++ b/chromium/chrome/browser/password_check/android/internal/BUILD.gn
@@ -69,9 +69,9 @@ android_library("internal_java") {
":java_resources",
":public_factory_java",
"//base:base_java",
- "//base:jni_java",
"//chrome/android:chrome_app_java_resources",
"//chrome/browser/feedback/android:java",
+ "//chrome/browser/flags:java",
"//chrome/browser/password_check/android:password_check_java_enums",
"//chrome/browser/password_check/android:public_ui_java",
"//chrome/browser/password_manager/android:java",
diff --git a/chromium/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd b/chromium/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
index 78129f261ed..a8872461c64 100644
--- a/chromium/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
+++ b/chromium/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
@@ -242,9 +242,6 @@
<message name="IDS_PASSWORD_CHECK_CREDENTIAL_DIALOG_CANCEL" desc="The caption the button closing the prompt to delete a stored password.">
Cancel
</message>
- <message name="IDS_PASSWORD_CHECK_DELETE_CREDENTIAL_DIALOG_BODY" desc="The body of a prompt to confirm that the user intends to delete the stored password.">
- Deleting this password will not delete your account on <ph name="SITE">%1$s<ex>example.com</ex></ph>. Change your password or delete your account on <ph name="SITE">%1$s<ex>example.com</ex></ph> to keep it safe from others.
- </message>
<!-- Password Check credential menu item strings -->
<message name="IDS_PASSWORD_CHECK_CREDENTIAL_MENU_ITEM_EDIT_BUTTON_CAPTION" desc="Caption for the menu button allowing to edit a compromised credential.">
diff --git a/chromium/chrome/browser/password_entry_edit/android/BUILD.gn b/chromium/chrome/browser/password_entry_edit/android/BUILD.gn
index eaf52ff9787..6b23ef036d7 100644
--- a/chromium/chrome/browser/password_entry_edit/android/BUILD.gn
+++ b/chromium/chrome/browser/password_entry_edit/android/BUILD.gn
@@ -15,6 +15,7 @@ source_set("android") {
":jni_headers",
"//base",
"//chrome/app:generated_resources",
+ "//chrome/browser/ui",
"//components/password_manager/core/browser",
"//components/password_manager/core/browser:affiliation",
"//components/url_formatter",
@@ -27,7 +28,12 @@ generate_jni("jni_headers") {
}
android_library("java") {
- sources = [ "//chrome/browser/password_entry_edit/android/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditFragmentView.java" ]
+ sources = [
+ "//chrome/browser/password_entry_edit/android/java/src/org/chromium/chrome/browser/password_entry_edit/BlockedCredentialFragmentView.java",
+ "//chrome/browser/password_entry_edit/android/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditFragmentView.java",
+ "//chrome/browser/password_entry_edit/android/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEntryFragmentViewBase.java",
+ "//chrome/browser/password_entry_edit/android/java/src/org/chromium/chrome/browser/password_entry_edit/FederatedCredentialFragmentView.java",
+ ]
deps = [
":java_resources",
@@ -43,10 +49,15 @@ android_library("java") {
android_resources("java_resources") {
sources = [
+ "java/res/layout/blocked_credential_view.xml",
"java/res/layout/credential_edit_view.xml",
+ "java/res/layout/federated_credential_view.xml",
+ "java/res/layout/site_or_app.xml",
+ "java/res/menu/credential_edit_action_bar_menu.xml",
"java/res/values/dimens.xml",
]
deps = [
+ "//chrome/browser/feedback/android:java_resources",
"//chrome/browser/ui/android/strings:ui_strings_grd",
"//components/browser_ui/styles/android:java_resources",
"//components/browser_ui/widget/android:java_resources",
@@ -55,7 +66,10 @@ android_resources("java_resources") {
android_library_factory("factory_java") {
# These deps will be inherited by the resulting android_library target.
- deps = [ ":java" ]
+ deps = [
+ ":java",
+ "//chrome/browser/feedback/android:java",
+ ]
# This internal file will be replaced by a generated file so the resulting
# android_library target does not actually depend on this internal file.
diff --git a/chromium/chrome/browser/password_entry_edit/android/internal/BUILD.gn b/chromium/chrome/browser/password_entry_edit/android/internal/BUILD.gn
index e4856b41f35..4f869638ad8 100644
--- a/chromium/chrome/browser/password_entry_edit/android/internal/BUILD.gn
+++ b/chromium/chrome/browser/password_entry_edit/android/internal/BUILD.gn
@@ -11,21 +11,25 @@ android_library("java") {
]
sources = [
+ "java/src/org/chromium/chrome/browser/password_entry_edit/BlockedCredentialViewBinder.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditBridge.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditCoordinator.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditMediator.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditProperties.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditUiFactory.java",
"java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditViewBinder.java",
+ "java/src/org/chromium/chrome/browser/password_entry_edit/FederatedCredentialViewBinder.java",
]
deps = [
"//base:base_java",
- "//base:jni_java",
+ "//chrome/browser/feedback/android:java",
"//chrome/browser/password_entry_edit/android:java",
"//chrome/browser/password_manager/android:java",
+ "//chrome/browser/profiles/android:java",
"//components/browser_ui/settings/android:java",
"//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_preference_preference_java",
"//ui/android:ui_no_recycler_view_java",
]
@@ -45,6 +49,7 @@ android_library("junit") {
"//chrome/browser/password_manager/android:java",
"//third_party/android_deps:robolectric_all_java",
"//third_party/androidx:androidx_test_core_java",
+ "//third_party/hamcrest:hamcrest_library_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
"//ui/android:ui_no_recycler_view_java",
diff --git a/chromium/chrome/browser/password_manager/android/BUILD.gn b/chromium/chrome/browser/password_manager/android/BUILD.gn
index fcef47f365b..252a4e2d96d 100644
--- a/chromium/chrome/browser/password_manager/android/BUILD.gn
+++ b/chromium/chrome/browser/password_manager/android/BUILD.gn
@@ -8,16 +8,17 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/settings:java",
"//components/browser_ui/settings/android:java",
"//components/password_manager/core/browser:password_manager_java_enums",
"//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_appcompat_appcompat_java",
"//third_party/androidx:androidx_fragment_fragment_java",
"//ui/android:ui_no_recycler_view_java",
"//url:gurl_java",
]
sources = [
+ "java/src/org/chromium/chrome/browser/password_manager/ConfirmationDialogHelper.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelper.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordScriptsFetcherBridge.java",
"java/src/org/chromium/chrome/browser/password_manager/PasswordStoreBridge.java",
@@ -28,7 +29,7 @@ android_library("java") {
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
- resources_package = "org.chromium.chrome.browser.password_manager.settings"
+ resources_package = "org.chromium.chrome.browser.password_manager"
}
generate_jni("jni_headers") {
@@ -58,6 +59,10 @@ junit_binary("password_manager_junit_tests") {
}
android_resources("java_resources") {
- sources = []
- deps = [ "//chrome/browser/ui/android/strings:ui_strings_grd" ]
+ sources = [ "java/res/layout/confirmation_dialog_view.xml" ]
+ deps = [
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//components/browser_ui/strings/android:browser_ui_strings_grd",
+ "//components/browser_ui/styles/android:java_resources",
+ ]
}
diff --git a/chromium/chrome/browser/payments/BUILD.gn b/chromium/chrome/browser/payments/BUILD.gn
index 9bf49781cc4..5d4544f346e 100644
--- a/chromium/chrome/browser/payments/BUILD.gn
+++ b/chromium/chrome/browser/payments/BUILD.gn
@@ -23,6 +23,7 @@ source_set("browser_tests") {
"payment_handler_enable_delegations_browsertest.cc",
"payment_handler_enforce_full_delegation_browsertest.cc",
"payment_handler_exploit_browsertest.cc",
+ "payment_handler_jit_install_with_registered_sw_browsertest.cc",
"payment_handler_just_in_time_installation_browsertest.cc",
"payment_handler_ui_browsertest.cc",
"payment_handler_uninstall_browsertest.cc",
diff --git a/chromium/chrome/browser/performance_hints/android/BUILD.gn b/chromium/chrome/browser/performance_hints/android/BUILD.gn
index 503660db033..30b3b86cbdf 100644
--- a/chromium/chrome/browser/performance_hints/android/BUILD.gn
+++ b/chromium/chrome/browser/performance_hints/android/BUILD.gn
@@ -13,7 +13,6 @@ android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//url:gurl_java",
diff --git a/chromium/chrome/browser/persisted_state_db/BUILD.gn b/chromium/chrome/browser/persisted_state_db/BUILD.gn
index 3d5e4ea63bd..06c4622be9e 100644
--- a/chromium/chrome/browser/persisted_state_db/BUILD.gn
+++ b/chromium/chrome/browser/persisted_state_db/BUILD.gn
@@ -29,6 +29,7 @@ source_set("persisted_state_db") {
]
if (is_android) {
deps += [
+ "//chrome/browser/commerce/merchant_viewer:merchant_signal_db_content_proto",
"//chrome/browser/commerce/subscriptions:commerce_subscription_db_content_proto",
"//chrome/browser/tab:jni_headers",
"//components/embedder_support/android:browser_context",
diff --git a/chromium/chrome/browser/policy/android/BUILD.gn b/chromium/chrome/browser/policy/android/BUILD.gn
index 66c0776196a..20f45aa30a6 100644
--- a/chromium/chrome/browser/policy/android/BUILD.gn
+++ b/chromium/chrome/browser/policy/android/BUILD.gn
@@ -10,7 +10,6 @@ _jni_sources =
android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//components/policy/android:policy_java",
"//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chromium/chrome/browser/preferences/BUILD.gn b/chromium/chrome/browser/preferences/BUILD.gn
index 9d84132e48b..2f03e76daae 100644
--- a/chromium/chrome/browser/preferences/BUILD.gn
+++ b/chromium/chrome/browser/preferences/BUILD.gn
@@ -10,14 +10,13 @@ android_library("java") {
"android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java",
"android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java",
"android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java",
- "android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java",
"android/java/src/org/chromium/chrome/browser/preferences/KeyPrefix.java",
+ "android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java",
"android/java/src/org/chromium/chrome/browser/preferences/PrefChangeRegistrar.java",
"android/java/src/org/chromium/chrome/browser/preferences/SharedPreferencesManager.java",
]
deps = [
"//base:base_java",
- "//base:jni_java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/chromium/chrome/browser/prefs/README.md b/chromium/chrome/browser/prefs/README.md
new file mode 100644
index 00000000000..3f29bb62112
--- /dev/null
+++ b/chromium/chrome/browser/prefs/README.md
@@ -0,0 +1,55 @@
+# Prefs
+Prefs is meant to store lightweight state that reflects user preferences (e.g.
+chrome://settings, position of windows on last exit, etc.). Browser-wide prefs
+are stored in Local State (`g_browser_process->local_state()`) and per-profile
+prefs are stored in Preferences (`Profile::GetPrefs()`). The `base::PrefService`
+API is used to read/write registered prefs. Prefs are saved as JSON and any
+modification forces serialization of the entire JSON dictionary. The LOSSY_PREF
+flag can be used when registering a pref to indicate that modifications to it
+shouldn't schedule a write (in which case the write will be bundled with the
+next change that does schedule a write or wait until the final write on
+shutdown; the update is lost in case of a crash).
+
+Prefs are not for:
+ * Large collections of data (prefs are loaded and parsed on startup and
+ serialized for writing on the UI thread)
+ * Things that change very frequently (every change triggers a write unless
+ using the LOSSY_PREF flag)
+
+## Adding a new pref
+1. Pick a name that resembles / shares a pref namespace with existing related
+ prefs if possible.
+1. Define a new unique name in a pref_names.cc file. Either in:
+ a. chrome/common/pref_names.cc -- being careful to put it in the right
+ section (LOCAL STATE versus PROFILE PREFS) and alongside similar prefs
+ (existing ifdefs and/or pref namespaces); or, ideally in:
+ a. a pref_names.cc local to your component (typically inside a prefs:: C++
+ namespace nested in your component's namespace)
+1. Add a registration call from chrome/browser/prefs/browser_prefs.cc to your
+ component to register your new pref using `RegisterLocalState()` or
+ `RegisterProfilePrefs()` as appropriate.
+1. Use `base::PrefService::Get*()` APIs on `g_browser_process->local_state()` or
+ `Profile::GetPrefs()`, as appropriate, to read/write your pref.
+
+## Deleting an old pref
+Deleted prefs are left in a delete-self state for 1 year in an attempt to avoid
+leaving unused text in JSON files. To avoid leaving a bunch of TODOs and pinging
+owners to cleanup, you will be asked to follow-up your CL with another CL that
+removes 1+ year old deletions; someone else will cleanup after you in 1 year.
+
+1. Move the pref name declaration to the anonymous namespace of
+ chrome/browser/prefs/browser_prefs.cc
+1. Move registration code into `RegisterProfilePrefsForMigration()` or
+ `RegisterLocalStatePrefsForMigration()` as appropriate.
+1. Add a ClearPref() call in MigrateObsoleteProfilePrefs() or
+ MigrateObsoleteLocalStatePrefs() as appropriate with today's date (MM/YYYY).
+1. Delete the old code.
+1. In a follow-up CL, delete any 1+ year old ClearPref() calls; someone else
+ will clean up after you in 1 year.
+
+## Migrating a pref
+Instead of merely deleting a pref you might want to run migration code from an
+old to a new pref. This uses the same hooks as deletion and will be left in
+place for 1 year as well. The migration code runs before //chrome is made aware
+of prefs read from disk so any code getting the value from an initialized
+PrefService can assume the migration has already occurred.
diff --git a/chromium/chrome/browser/prefs/browser_prefs.cc b/chromium/chrome/browser/prefs/browser_prefs.cc
index 853eff92d21..2d724556541 100644
--- a/chromium/chrome/browser/prefs/browser_prefs.cc
+++ b/chromium/chrome/browser/prefs/browser_prefs.cc
@@ -55,9 +55,7 @@
#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
#include "chrome/browser/prefs/chrome_pref_service_factory.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
-#include "chrome/browser/prefs/origin_trial_prefs.h"
#include "chrome/browser/prefs/session_startup_pref.h"
-#include "chrome/browser/previews/previews_https_notification_infobar_decider.h"
#include "chrome/browser/printing/print_preview_sticky_settings.h"
#include "chrome/browser/profiles/chrome_version_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -102,6 +100,7 @@
#include "components/dom_distiller/core/distilled_page_prefs.h"
#include "components/dom_distiller/core/dom_distiller_features.h"
#include "components/dom_distiller/core/pref_names.h"
+#include "components/embedder_support/origin_trials/origin_trial_prefs.h"
#include "components/federated_learning/floc_id.h"
#include "components/flags_ui/pref_service_flags_storage.h"
#include "components/image_fetcher/core/cache/image_cache.h"
@@ -167,23 +166,23 @@
#include "chrome/browser/extensions/api/commands/command_service.h"
#include "chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.h"
#include "chrome/browser/extensions/api/tabs/tabs_api.h"
+#include "chrome/browser/extensions/default_apps.h"
#include "chrome/browser/extensions/extension_web_ui.h"
-#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
-#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include "chrome/browser/ui/webui/extensions/extensions_ui.h"
#include "extensions/browser/api/audio/audio_api.h"
#include "extensions/browser/api/runtime/runtime_api.h"
#include "extensions/browser/extension_prefs.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/guest_os/guest_os_share_path.h"
#include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h"
#include "chrome/browser/ash/settings/stats_reporting_controller.h"
#include "chrome/browser/chromeos/device_name_store.h"
#include "chrome/browser/chromeos/extensions/extensions_permissions_tracker.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_share_path.h"
#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
+#include "chrome/browser/chromeos/net/system_proxy_manager.h"
#include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_manager_impl.h"
#include "chrome/browser/chromeos/policy/system_features_disable_list_policy_handler.h"
-#include "chrome/browser/chromeos/policy/system_proxy_manager.h"
#include "chrome/browser/component_updater/metadata_table_chromeos.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -213,6 +212,7 @@
#include "chrome/browser/android/preferences/browser_prefs_android.h"
#include "chrome/browser/android/usage_stats/usage_stats_bridge.h"
#include "chrome/browser/first_run/android/first_run_prefs.h"
+#include "chrome/browser/lens/android/lens_prefs.h"
#include "chrome/browser/media/android/cdm/media_drm_origin_id_manager.h"
#include "chrome/browser/ssl/known_interception_disclosure_infobar_delegate.h"
#include "chrome/browser/video_tutorials/prefs.h"
@@ -236,6 +236,7 @@
#include "chrome/browser/search/promos/promo_service.h"
#include "chrome/browser/search/search_suggest/search_suggest_service.h"
#include "chrome/browser/search/task_module/task_module_service.h"
+#include "chrome/browser/serial/serial_policy_allowed_ports.h"
#include "chrome/browser/signin/signin_promo.h"
#include "chrome/browser/ui/startup/startup_browser_creator.h"
#include "chrome/browser/ui/webui/history/foreign_session_handler.h"
@@ -245,6 +246,10 @@
#include "components/ntp_tiles/custom_links_manager_impl.h"
#endif // defined(OS_ANDROID)
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h"
+#endif
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/components/account_manager/account_manager.h"
#include "ash/components/audio/audio_devices_pref_handler_impl.h"
@@ -254,15 +259,15 @@
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
#include "chrome/browser/ash/app_mode/kiosk_cryptohome_remover.h"
#include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
-#include "chrome/browser/chromeos/apps/apk_web_app_service.h"
-#include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
-#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_common.h"
+#include "chrome/browser/ash/apps/apk_web_app_service.h"
+#include "chrome/browser/ash/arc/policy/arc_policy_bridge.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/bluetooth/debug_logs_manager.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_common.h"
+#include "chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/chromeos/child_accounts/family_user_chrome_activity_metrics.h"
#include "chrome/browser/chromeos/child_accounts/family_user_metrics_service.h"
#include "chrome/browser/chromeos/child_accounts/family_user_session_metrics.h"
-#include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/chromeos/child_accounts/screen_time_controller.h"
#include "chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h"
#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
@@ -276,6 +281,9 @@
#include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h"
#endif
#include "chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.h"
+#include "chrome/browser/ash/borealis/borealis_prefs.h"
+#include "chrome/browser/ash/guest_os/guest_os_pref_names.h"
+#include "chrome/browser/ash/lock_screen_apps/state_controller.h"
#include "chrome/browser/ash/login/demo_mode/demo_mode_detector.h"
#include "chrome/browser/ash/login/demo_mode/demo_mode_resources_remover.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
@@ -286,26 +294,23 @@
#include "chrome/browser/ash/login/saml/saml_profile_prefs.h"
#include "chrome/browser/ash/login/screens/enable_adb_sideloading_screen.h"
#include "chrome/browser/ash/login/screens/reset_screen.h"
+#include "chrome/browser/ash/login/security_token_session_controller.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
+#include "chrome/browser/ash/login/signin/signin_error_notifier_ash.h"
+#include "chrome/browser/ash/login/startup_utils.h"
+#include "chrome/browser/ash/login/users/avatar/user_image_manager.h"
+#include "chrome/browser/ash/login/users/avatar/user_image_sync_observer.h"
+#include "chrome/browser/ash/login/users/chrome_user_manager_impl.h"
+#include "chrome/browser/ash/login/users/multi_profile_user_controller.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/ash/settings/device_settings_cache.h"
#include "chrome/browser/ash/system/automatic_reboot_manager.h"
#include "chrome/browser/ash/system/input_device_settings.h"
-#include "chrome/browser/chromeos/borealis/borealis_prefs.h"
#include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h"
#include "chrome/browser/chromeos/file_system_provider/registry.h"
#include "chrome/browser/chromeos/first_run/first_run.h"
#include "chrome/browser/chromeos/full_restore/full_restore_prefs.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_pref_names.h"
-#include "chrome/browser/chromeos/lock_screen_apps/state_controller.h"
-#include "chrome/browser/chromeos/login/security_token_session_controller.h"
-#include "chrome/browser/chromeos/login/session/user_session_manager.h"
-#include "chrome/browser/chromeos/login/signin/signin_error_notifier_ash.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
-#include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h"
-#include "chrome/browser/chromeos/login/users/avatar/user_image_sync_observer.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager_impl.h"
-#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
#include "chrome/browser/chromeos/net/network_throttling_observer.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/chromeos/policy/adb_sideloading_allowance_mode_policy_handler.h"
#include "chrome/browser/chromeos/policy/app_install_event_log_manager_wrapper.h"
#include "chrome/browser/chromeos/policy/arc_app_install_event_logger.h"
@@ -328,7 +333,6 @@
#include "chrome/browser/chromeos/printing/enterprise_printers_provider.h"
#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
#include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h"
-#include "chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h"
#include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
#include "chrome/browser/media/protected_media_identifier_permission_context.h"
#include "chrome/browser/metrics/chromeos_metrics_provider.h"
@@ -345,6 +349,7 @@
#include "chromeos/components/local_search_service/search_metrics_reporter.h"
#include "chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h"
#include "chromeos/network/cellular_esim_profile_handler_impl.h"
+#include "chromeos/network/cellular_metrics_logger.h"
#include "chromeos/network/fast_transition_observer.h"
#include "chromeos/network/network_metadata_store.h"
#include "chromeos/network/proxy/proxy_config_handler.h"
@@ -356,8 +361,6 @@
#include "components/onc/onc_pref_names.h"
#include "components/quirks/quirks_manager.h"
#include "extensions/browser/api/lock_screen_data/lock_screen_item_storage.h"
-#else
-#include "chrome/browser/extensions/default_apps.h"
#endif
#if defined(OS_MAC)
@@ -408,10 +411,6 @@
#include "chrome/browser/ui/browser_view_prefs.h"
#endif
-#if !defined(OS_ANDROID)
-#include "chrome/browser/media/feeds/media_feeds_service.h"
-#endif
-
#if BUILDFLAG(ENABLE_SESSION_SERVICE)
#include "chrome/browser/sessions/session_service_log.h"
#endif
@@ -426,44 +425,6 @@ const char kLocalSearchServiceSyncMetricsCrosSettingsCount[] =
const char kLocalSearchServiceSyncMetricsHelpAppCount[] =
"local_search_service_sync.metrics.help_app_count";
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
-
-// Deprecated 1/2020
-#if defined(OS_MAC)
-const char kKeyCreated[] = "os_crypt.key_created";
-#endif // defined(OS_MAC)
-
-const char kGCMChannelStatus[] = "gcm.channel_status";
-const char kGCMChannelPollIntervalSeconds[] = "gcm.poll_interval";
-const char kGCMChannelLastCheckTime[] = "gcm.check_time";
-
-// Deprecated 2/2020
-const char kInvalidatorClientId[] = "invalidator.client_id";
-const char kInvalidatorInvalidationState[] = "invalidator.invalidation_state";
-const char kInvalidatorSavedInvalidations[] = "invalidator.saved_invalidations";
-
-// Deprecated 3/2020
-const char kDataReductionNetworkProperties[] =
- "data_reduction.network_properties";
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// Deprecated 4/2020
-const char kAmbientModeTopicSource[] = "settings.ambient_mode.topic_source";
-
-// Deprecated 4/2020
-const char kPrintingAllowedPageSizes[] = "printing.allowed_page_sizes";
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
-
-// Deprecated 4/2020
-const char kExcludedSchemes[] = "protocol_handler.excluded_schemes";
-
-// Deprecated 4/2020
-const char kPreviewsLPRHostBlacklist[] = "previews.litepage.host-blacklist";
-const char kPreviewsLPRProbeCache[] = "Availability.Prober.cache.Litepages";
-const char kPreviewsLPROriginProbeCache[] =
- "Availability.Prober.cache.LitepagesOriginCheck";
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
// Deprecated 4/2020
const char kSupervisedUsersNextId[] = "LocallyManagedUsersNextId";
@@ -553,22 +514,46 @@ const char kStabilityBreakpadRegistrationFail[] =
// Deprecated 02/2021
const char kGamesInstallDirPref[] = "games.data_files_paths";
+const char kLiteModeUserNeedsNotification[] =
+ "previews.litepage.user-needs-notification";
#if !defined(OS_ANDROID)
// Deprecated 02/2021
const char kCartModuleRemoved[] = "cart_module_removed";
#endif
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+// Deprecated 03/2021
+const char kPinnedExtensionsMigrationComplete[] =
+ "extensions.pinned_extension_migration";
+#endif
+
+#if BUILDFLAG(ENABLE_PLUGINS)
+// Deprecated 03/2021
+const char kRunAllFlashInAllowMode[] = "plugins.run_all_flash_in_allow_mode";
+#endif
+
+// Deprecated 04/2021.
+const char kSessionStatisticFCPMean[] =
+ "optimization_guide.session_statistic.fcp_mean";
+const char kSessionStatisticFCPStdDev[] =
+ "optimization_guide.session_statistic.fcp_std_dev";
+#if !defined(OS_ANDROID)
+const char kWebAuthnLastTransportUsedPrefName[] =
+ "webauthn.last_transport_used";
+#endif
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+// Deprecated 04/2021
+const char kToolbarIconSurfacingBubbleAcknowledged[] =
+ "toolbar_icon_surfacing_bubble_acknowledged";
+const char kToolbarIconSurfacingBubbleLastShowTime[] =
+ "toolbar_icon_surfacing_bubble_show_time";
+#endif
+
// Register local state used only for migration (clearing or moving to a new
// key).
void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
- registry->RegisterBooleanPref(kGCMChannelStatus, true);
- registry->RegisterIntegerPref(kGCMChannelPollIntervalSeconds, 0);
- registry->RegisterInt64Pref(kGCMChannelLastCheckTime, 0);
- registry->RegisterListPref(kInvalidatorSavedInvalidations);
- registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
- registry->RegisterStringPref(kInvalidatorClientId, std::string());
-
#if BUILDFLAG(IS_CHROMEOS_ASH)
registry->RegisterDictionaryPref(kRegisteredSupervisedUserAllowlists);
registry->RegisterIntegerPref(kSupervisedUsersNextId, 0);
@@ -595,37 +580,21 @@ void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
registry->RegisterIntegerPref(kStabilityBreakpadRegistrationSuccess, 0);
registry->RegisterIntegerPref(kStabilityDebuggerPresent, 0);
registry->RegisterIntegerPref(kStabilityDebuggerNotPresent, 0);
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ registry->RegisterBooleanPref(kPinnedExtensionsMigrationComplete, false);
+#endif
}
// Register prefs used only for migration (clearing or moving to a new key).
void RegisterProfilePrefsForMigration(
user_prefs::PrefRegistrySyncable* registry) {
- registry->RegisterDictionaryPref(kDataReductionNetworkProperties);
-
#if BUILDFLAG(IS_CHROMEOS_ASH)
registry->RegisterDictionaryPref(kSupervisedUserAllowlists);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
- registry->RegisterBooleanPref(kGCMChannelStatus, true);
- registry->RegisterIntegerPref(kGCMChannelPollIntervalSeconds, 0);
- registry->RegisterInt64Pref(kGCMChannelLastCheckTime, 0);
-
- registry->RegisterListPref(kInvalidatorSavedInvalidations);
- registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
- registry->RegisterStringPref(kInvalidatorClientId, std::string());
-
chrome_browser_net::secure_dns::RegisterProbesSettingBackupPref(registry);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
- registry->RegisterIntegerPref(kAmbientModeTopicSource, 0);
- registry->RegisterListPref(kPrintingAllowedPageSizes);
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
-
- registry->RegisterDictionaryPref(kExcludedSchemes);
- registry->RegisterDictionaryPref(kPreviewsLPRHostBlacklist);
- registry->RegisterDictionaryPref(kPreviewsLPRProbeCache);
- registry->RegisterDictionaryPref(kPreviewsLPROriginProbeCache);
-
registry->RegisterBooleanPref(kStricterMixedContentTreatmentEnabled, true);
registry->RegisterDictionaryPref(kHashedAvailablePages);
@@ -670,10 +639,39 @@ void RegisterProfilePrefsForMigration(
registry->RegisterStringPref(kDataReductionProxyConfig, std::string());
registry->RegisterFilePathPref(kGamesInstallDirPref, base::FilePath());
+ registry->RegisterBooleanPref(kLiteModeUserNeedsNotification, true);
#if !defined(OS_ANDROID)
registry->RegisterBooleanPref(kCartModuleRemoved, false);
#endif
+
+#if !defined(OS_ANDROID)
+ registry->RegisterStringPref(
+ enterprise_connectors::kDeviceTrustPrivateKeyPref, std::string());
+ registry->RegisterStringPref(enterprise_connectors::kDeviceTrustPublicKeyPref,
+ std::string());
+#endif
+
+#if BUILDFLAG(ENABLE_PLUGINS)
+ registry->RegisterBooleanPref(kRunAllFlashInAllowMode, false);
+#endif
+
+#if !defined(OS_ANDROID)
+ // Removed in M91.
+ registry->RegisterBooleanPref(prefs::kMediaFeedsBackgroundFetching, false);
+ registry->RegisterBooleanPref(prefs::kMediaFeedsSafeSearchEnabled, false);
+ registry->RegisterBooleanPref(prefs::kMediaFeedsAutoSelectEnabled, false);
+ registry->RegisterStringPref(kWebAuthnLastTransportUsedPrefName,
+ std::string());
+#endif
+
+ registry->RegisterDoublePref(kSessionStatisticFCPStdDev, -1.0f);
+ registry->RegisterDoublePref(kSessionStatisticFCPMean, -1.0f);
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ registry->RegisterBooleanPref(kToolbarIconSurfacingBubbleAcknowledged, false);
+ registry->RegisterInt64Pref(kToolbarIconSurfacingBubbleLastShowTime, 0);
+#endif
}
} // namespace
@@ -690,6 +688,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
ChromeMetricsServiceClient::RegisterPrefs(registry);
ChromeTracingDelegate::RegisterPrefs(registry);
component_updater::RegisterPrefs(registry);
+ embedder_support::OriginTrialPrefs::RegisterPrefs(registry);
ExternalProtocolHandler::RegisterPrefs(registry);
flags_ui::PrefServiceFlagsStorage::RegisterPrefs(registry);
GpuModeManager::RegisterPrefs(registry);
@@ -701,7 +700,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
language::UlpLanguageCodeLocator::RegisterLocalStatePrefs(registry);
memory::EnterpriseMemoryLimitPrefObserver::RegisterPrefs(registry);
network_time::NetworkTimeTracker::RegisterPrefs(registry);
- OriginTrialPrefs::RegisterPrefs(registry);
password_manager::PasswordManager::RegisterLocalPrefs(registry);
policy::BrowserPolicyConnector::RegisterPrefs(registry);
policy::PolicyStatisticsCollector::RegisterPrefs(registry);
@@ -750,6 +748,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
::android::RegisterPrefs(registry);
registry->RegisterIntegerPref(first_run::kTosDialogBehavior, 0);
+ registry->RegisterBooleanPref(lens::kLensCameraAssistedSearchEnabled, true);
#else // defined(OS_ANDROID)
enterprise_reporting::RegisterLocalStatePrefs(registry);
gcm::RegisterPrefs(registry);
@@ -767,9 +766,10 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
ChromeOSMetricsProvider::RegisterPrefs(registry);
chromeos::ArcKioskAppManager::RegisterPrefs(registry);
ash::AudioDevicesPrefHandlerImpl::RegisterPrefs(registry);
- chromeos::cert_provisioning::RegisterLocalStatePrefs(registry);
+ ash::cert_provisioning::RegisterLocalStatePrefs(registry);
chromeos::CellularESimProfileHandlerImpl::RegisterLocalStatePrefs(registry);
- chromeos::ChromeUserManagerImpl::RegisterPrefs(registry);
+ chromeos::CellularMetricsLogger::RegisterLocalStatePrefs(registry);
+ ash::ChromeUserManagerImpl::RegisterPrefs(registry);
chromeos::CupsPrintersManager::RegisterLocalStatePrefs(registry);
chromeos::DemoModeDetector::RegisterPrefs(registry);
chromeos::DemoModeResourcesRemover::RegisterLocalStatePrefs(registry);
@@ -777,7 +777,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
chromeos::DemoSetupController::RegisterLocalStatePrefs(registry);
chromeos::DeviceNameStore::RegisterLocalStatePrefs(registry);
chromeos::DeviceOAuth2TokenStoreChromeOS::RegisterPrefs(registry);
- chromeos::device_settings_cache::RegisterPrefs(registry);
+ ash::device_settings_cache::RegisterPrefs(registry);
chromeos::EasyUnlockService::RegisterPrefs(registry);
chromeos::echo_offer::RegisterPrefs(registry);
chromeos::EnableAdbSideloadingScreen::RegisterPrefs(registry);
@@ -792,7 +792,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
RegisterLocalStatePrefs(registry);
chromeos::login::SecurityTokenSessionController::RegisterLocalStatePrefs(
registry);
- chromeos::MultiProfileUserController::RegisterPrefs(registry);
+ ash::MultiProfileUserController::RegisterPrefs(registry);
chromeos::NetworkMetadataStore::RegisterPrefs(registry);
chromeos::NetworkThrottlingObserver::RegisterPrefs(registry);
chromeos::PowerMetricsReporter::RegisterLocalStatePrefs(registry);
@@ -806,10 +806,10 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
chromeos::ServicesCustomizationDocument::RegisterPrefs(registry);
chromeos::SigninScreenHandler::RegisterPrefs(registry);
chromeos::StartupUtils::RegisterPrefs(registry);
- chromeos::StatsReportingController::RegisterLocalStatePrefs(registry);
+ ash::StatsReportingController::RegisterLocalStatePrefs(registry);
ash::system::AutomaticRebootManager::RegisterPrefs(registry);
chromeos::TimeZoneResolver::RegisterPrefs(registry);
- chromeos::UserImageManager::RegisterPrefs(registry);
+ ash::UserImageManager::RegisterPrefs(registry);
chromeos::UserSessionManager::RegisterPrefs(registry);
ash::WebKioskAppManager::RegisterPrefs(registry);
component_updater::MetadataTable::RegisterPrefs(registry);
@@ -838,12 +838,18 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
RegisterNearbySharingLocalPrefs(registry);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+// TODO(crbug/1169547) Remove `BUILDFLAG(IS_CHROMEOS_LACROS)` once the
+// migration is complete.
+#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) || \
+ BUILDFLAG(IS_CHROMEOS_LACROS)
+ enterprise_connectors::RegisterLocalPrefs(registry);
+#endif // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN)
+
#if defined(OS_MAC)
confirm_quit::RegisterLocalState(registry);
QuitWithAppsController::RegisterPrefs(registry);
system_media_permissions::RegisterSystemMediaPermissionStatesPrefs(registry);
AppShimRegistry::Get()->RegisterLocalPrefs(registry);
- registry->RegisterBooleanPref(kKeyCreated, false);
#endif
#if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -866,7 +872,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
#if defined(OS_WIN) || defined(OS_MAC) || \
(defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
- web_app::UrlHandlerPrefs::RegisterLocalStatePrefs(registry);
+ web_app::url_handler_prefs::RegisterLocalStatePrefs(registry);
#endif
#if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -938,7 +944,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
PrefProxyConfigTrackerImpl::RegisterProfilePrefs(registry);
PrefetchProxyOriginDecider::RegisterPrefs(registry);
PrefsTabHelper::RegisterProfilePrefs(registry, locale);
- PreviewsHTTPSNotificationInfoBarDecider::RegisterProfilePrefs(registry);
privacy_sandbox::RegisterProfilePrefs(registry);
Profile::RegisterProfilePrefs(registry);
ProfileImpl::RegisterProfilePrefs(registry);
@@ -953,6 +958,9 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
registry);
security_interstitials::InsecureFormBlockingPage::RegisterProfilePrefs(
registry);
+#if !defined(OS_ANDROID)
+ SerialPolicyAllowedPorts::RegisterProfilePrefs(registry);
+#endif
SessionStartupPref::RegisterProfilePrefs(registry);
SharingSyncPreference::RegisterProfilePrefs(registry);
site_engagement::SiteEngagementService::RegisterProfilePrefs(registry);
@@ -971,14 +979,16 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
#if BUILDFLAG(ENABLE_EXTENSIONS)
ExtensionWebUI::RegisterProfilePrefs(registry);
RegisterAnimationPolicyPrefs(registry);
- ToolbarActionsBar::RegisterProfilePrefs(registry);
extensions::api::CryptotokenRegisterProfilePrefs(registry);
extensions::ActivityLog::RegisterProfilePrefs(registry);
extensions::AudioAPI::RegisterUserPrefs(registry);
extensions::ExtensionPrefs::RegisterProfilePrefs(registry);
extensions::ExtensionsUI::RegisterProfilePrefs(registry);
- extensions::NtpOverriddenBubbleDelegate::RegisterPrefs(registry);
extensions::RuntimeAPI::RegisterPrefs(registry);
+ // TODO(devlin): This would be more inline with the other calls here if it
+ // were nested in either a class or separate namespace with a simple
+ // Register[Profile]Prefs() name.
+ extensions::RegisterSettingsOverriddenUiPrefs(registry);
update_client::RegisterProfilePrefs(registry);
web_app::WebAppProvider::RegisterProfilePrefs(registry);
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
@@ -1056,6 +1066,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
CartService::RegisterProfilePrefs(registry);
#endif // defined(OS_ANDROID)
+#if defined(OS_CHROMEOS)
+ extensions::platform_keys::RegisterProfilePrefs(registry);
+#endif // defined(OS_CHROMEOS)
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
app_list::AppListSyncableService::RegisterProfilePrefs(registry);
app_list::ArcAppReinstallSearchProvider::RegisterProfilePrefs(registry);
@@ -1063,11 +1077,11 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
ArcAppListPrefs::RegisterProfilePrefs(registry);
certificate_manager::CertificatesHandler::RegisterProfilePrefs(registry);
ash::AccountManager::RegisterPrefs(registry);
- chromeos::ApkWebAppService::RegisterProfilePrefs(registry);
+ ash::ApkWebAppService::RegisterProfilePrefs(registry);
chromeos::app_time::AppActivityRegistry::RegisterProfilePrefs(registry);
chromeos::app_time::AppTimeController::RegisterProfilePrefs(registry);
chromeos::assistant::prefs::RegisterProfilePrefs(registry);
- chromeos::bluetooth::DebugLogsManager::RegisterPrefs(registry);
+ ash::bluetooth::DebugLogsManager::RegisterPrefs(registry);
chromeos::ClientAppMetadataProviderService::RegisterProfilePrefs(registry);
chromeos::CupsPrintersManager::RegisterProfilePrefs(registry);
chromeos::device_sync::RegisterProfilePrefs(registry);
@@ -1083,7 +1097,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
registry);
chromeos::multidevice_setup::MultiDeviceSetupService::RegisterProfilePrefs(
registry);
- chromeos::MultiProfileUserController::RegisterProfilePrefs(registry);
+ ash::MultiProfileUserController::RegisterProfilePrefs(registry);
chromeos::NetworkMetadataStore::RegisterPrefs(registry);
chromeos::ReleaseNotesStorage::RegisterProfilePrefs(registry);
chromeos::quick_unlock::FingerprintStorage::RegisterProfilePrefs(registry);
@@ -1102,10 +1116,9 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
chromeos::ServicesCustomizationDocument::RegisterProfilePrefs(registry);
chromeos::settings::OSSettingsUI::RegisterProfilePrefs(registry);
chromeos::StartupUtils::RegisterOobeProfilePrefs(registry);
- chromeos::UserImageSyncObserver::RegisterProfilePrefs(registry);
+ ash::UserImageSyncObserver::RegisterProfilePrefs(registry);
crostini::prefs::RegisterProfilePrefs(registry);
- chromeos::attestation::TpmChallengeKey::RegisterProfilePrefs(registry);
- extensions::EPKPChallengeKey::RegisterProfilePrefs(registry);
+ ash::attestation::TpmChallengeKey::RegisterProfilePrefs(registry);
#if defined(USE_CUPS)
extensions::PrintingAPIHandler::RegisterProfilePrefs(registry);
#endif
@@ -1118,10 +1131,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
policy::ExtensionInstallEventLogManagerWrapper::RegisterProfilePrefs(
registry);
policy::StatusCollector::RegisterProfilePrefs(registry);
- policy::SystemProxyManager::RegisterProfilePrefs(registry);
+ chromeos::SystemProxyManager::RegisterProfilePrefs(registry);
RegisterChromeLauncherUserPrefs(registry);
::onc::RegisterProfilePrefs(registry);
- chromeos::cert_provisioning::RegisterProfilePrefs(registry);
+ ash::cert_provisioning::RegisterProfilePrefs(registry);
borealis::prefs::RegisterProfilePrefs(registry);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -1153,10 +1166,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
RegisterBrowserViewProfilePrefs(registry);
#endif
-#if !defined(OS_ANDROID)
- media_feeds::MediaFeedsService::RegisterProfilePrefs(registry);
-#endif
-
RegisterProfilePrefsForMigration(registry);
}
@@ -1193,19 +1202,6 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) {
// BEGIN_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS
// Please don't delete the preceding line. It is used by PRESUBMIT.py.
- // Added 1/2020
-#if defined(OS_MAC)
- local_state->ClearPref(kKeyCreated);
-#endif // defined(OS_MAC)
- local_state->ClearPref(kGCMChannelStatus);
- local_state->ClearPref(kGCMChannelPollIntervalSeconds);
- local_state->ClearPref(kGCMChannelLastCheckTime);
-
- // Added 2/2020.
- local_state->ClearPref(kInvalidatorSavedInvalidations);
- local_state->ClearPref(kInvalidatorInvalidationState);
- local_state->ClearPref(kInvalidatorClientId);
-
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Added 4/2020.
local_state->ClearPref(kSupervisedUsersNextId);
@@ -1239,6 +1235,11 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) {
local_state->ClearPref(kStabilityDebuggerPresent);
local_state->ClearPref(kStabilityDebuggerNotPresent);
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ // Added 03/2021
+ local_state->ClearPref(kPinnedExtensionsMigrationComplete);
+#endif
+
// Please don't delete the following line. It is used by PRESUBMIT.py.
// END_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS
}
@@ -1257,37 +1258,12 @@ void MigrateObsoleteProfilePrefs(Profile* profile) {
// disable sync.
syncer::MigrateSyncSuppressedPref(profile_prefs);
- // Added 1/2020.
- profile_prefs->ClearPref(kGCMChannelStatus);
- profile_prefs->ClearPref(kGCMChannelPollIntervalSeconds);
- profile_prefs->ClearPref(kGCMChannelLastCheckTime);
-
- // Added 2/2020.
- profile_prefs->ClearPref(kInvalidatorSavedInvalidations);
- profile_prefs->ClearPref(kInvalidatorInvalidationState);
- profile_prefs->ClearPref(kInvalidatorClientId);
-
// Added 3/2020.
- profile_prefs->ClearPref(kDataReductionNetworkProperties);
+ // TODO(crbug.com/1062698): Remove this once the privacy settings redesign
+ // is fully launched.
chrome_browser_net::secure_dns::MigrateProbesSettingToOrFromBackup(
profile_prefs);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
- // Added 4/2020.
- profile_prefs->ClearPref(kAmbientModeTopicSource);
-
- // Added 4/2020.
- profile_prefs->ClearPref(kPrintingAllowedPageSizes);
-#endif
-
- // Added 4/2020
- profile_prefs->ClearPref(kExcludedSchemes);
-
- // Added 4/2020.
- profile_prefs->ClearPref(kPreviewsLPRHostBlacklist);
- profile_prefs->ClearPref(kPreviewsLPRProbeCache);
- profile_prefs->ClearPref(kPreviewsLPROriginProbeCache);
-
// Added 6/2020
profile_prefs->ClearPref(kStricterMixedContentTreatmentEnabled);
@@ -1359,6 +1335,37 @@ void MigrateObsoleteProfilePrefs(Profile* profile) {
profile_prefs->ClearPref(kCartModuleRemoved);
#endif
+ // Added 03/2021
+ profile_prefs->ClearPref(kLiteModeUserNeedsNotification);
+
+#if !defined(OS_ANDROID)
+ // Added 03/2021
+ profile_prefs->ClearPref(enterprise_connectors::kDeviceTrustPrivateKeyPref);
+ profile_prefs->ClearPref(enterprise_connectors::kDeviceTrustPublicKeyPref);
+#endif
+
+#if BUILDFLAG(ENABLE_PLUGINS)
+ // Added 03/2021
+ profile_prefs->ClearPref(kRunAllFlashInAllowMode);
+#endif
+
+#if !defined(OS_ANDROID)
+ // Added 04/2021
+ profile_prefs->ClearPref(prefs::kMediaFeedsBackgroundFetching);
+ profile_prefs->ClearPref(prefs::kMediaFeedsSafeSearchEnabled);
+ profile_prefs->ClearPref(prefs::kMediaFeedsAutoSelectEnabled);
+ profile_prefs->ClearPref(kWebAuthnLastTransportUsedPrefName);
+#endif
+ // Added 04/2021.
+ profile_prefs->ClearPref(kSessionStatisticFCPMean);
+ profile_prefs->ClearPref(kSessionStatisticFCPStdDev);
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ // Added 04/2021
+ profile_prefs->ClearPref(kToolbarIconSurfacingBubbleAcknowledged);
+ profile_prefs->ClearPref(kToolbarIconSurfacingBubbleLastShowTime);
+#endif
+
// Please don't delete the following line. It is used by PRESUBMIT.py.
// END_MIGRATE_OBSOLETE_PROFILE_PREFS
}
diff --git a/chromium/chrome/browser/prefs/chrome_command_line_pref_store.cc b/chromium/chrome/browser/prefs/chrome_command_line_pref_store.cc
index d2f29c2797f..26f3000d97d 100644
--- a/chromium/chrome/browser/prefs/chrome_command_line_pref_store.cc
+++ b/chromium/chrome/browser/prefs/chrome_command_line_pref_store.cc
@@ -16,6 +16,7 @@
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "base/values.h"
#include "build/build_config.h"
@@ -32,6 +33,7 @@
#include "components/safe_browsing/core/common/safebrowsing_switches.h"
#include "components/sync/base/pref_names.h"
#include "content/public/common/content_switches.h"
+#include "net/base/port_util.h"
#include "services/network/public/cpp/network_switches.h"
#include "ui/base/ui_base_switches.h"
#include "ui/display/display_switches.h"
@@ -105,6 +107,7 @@ ChromeCommandLinePrefStore::ChromeCommandLinePrefStore(
ValidateProxySwitches();
ApplySSLSwitches();
ApplyBackgroundModeSwitches();
+ ApplyExplicitlyAllowedPortSwitch();
}
ChromeCommandLinePrefStore::~ChromeCommandLinePrefStore() {}
@@ -179,3 +182,26 @@ void ChromeCommandLinePrefStore::ApplyBackgroundModeSwitches() {
WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
}
}
+
+void ChromeCommandLinePrefStore::ApplyExplicitlyAllowedPortSwitch() {
+ if (!command_line()->HasSwitch(switches::kExplicitlyAllowedPorts)) {
+ return;
+ }
+
+ base::Value integer_list(base::Value::Type::LIST);
+ std::string switch_value =
+ command_line()->GetSwitchValueASCII(switches::kExplicitlyAllowedPorts);
+ const auto& split = base::SplitStringPiece(
+ switch_value, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+ for (const auto& piece : split) {
+ int port;
+ if (!base::StringToInt(piece, &port))
+ continue;
+ if (!net::IsPortValid(port))
+ continue;
+ integer_list.Append(base::Value(port));
+ }
+ SetValue(prefs::kExplicitlyAllowedNetworkPorts,
+ base::Value::ToUniquePtrValue(std::move(integer_list)),
+ WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+}
diff --git a/chromium/chrome/browser/prefs/chrome_command_line_pref_store.h b/chromium/chrome/browser/prefs/chrome_command_line_pref_store.h
index a37280f137d..632109029a8 100644
--- a/chromium/chrome/browser/prefs/chrome_command_line_pref_store.h
+++ b/chromium/chrome/browser/prefs/chrome_command_line_pref_store.h
@@ -41,6 +41,9 @@ class ChromeCommandLinePrefStore : public CommandLinePrefStore {
// Determines whether the background mode is force-disabled.
void ApplyBackgroundModeSwitches();
+ // Re-enables some ports that may have been disallowed for security reasons.
+ void ApplyExplicitlyAllowedPortSwitch();
+
// Mappings of command line switches to prefs.
static const BooleanSwitchToPreferenceMapEntry boolean_switch_map_[];
static const SwitchToPreferenceMapEntry string_switch_map_[];
diff --git a/chromium/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc b/chromium/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc
index d379c6c53c7..fb53ecd6632 100644
--- a/chromium/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc
+++ b/chromium/chrome/browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc
@@ -33,8 +33,8 @@ TEST_F(CommandLinePrefStoreSSLManagerTest, CommandLinePrefs) {
scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
- command_line.AppendSwitchASCII(switches::kSSLVersionMin, "tls1.1");
- command_line.AppendSwitchASCII(switches::kSSLVersionMax, "tls1.2");
+ command_line.AppendSwitchASCII(switches::kSSLVersionMin, "tls1.2");
+ command_line.AppendSwitchASCII(switches::kSSLVersionMax, "tls1.3");
sync_preferences::PrefServiceMockFactory factory;
factory.set_user_prefs(local_state_store);
@@ -52,9 +52,9 @@ TEST_F(CommandLinePrefStoreSSLManagerTest, CommandLinePrefs) {
config_manager->AddToNetworkContextParams(context_params.get());
// Command-line flags should be respected.
- EXPECT_EQ(network::mojom::SSLVersion::kTLS11,
- context_params->initial_ssl_config->version_min);
EXPECT_EQ(network::mojom::SSLVersion::kTLS12,
+ context_params->initial_ssl_config->version_min);
+ EXPECT_EQ(network::mojom::SSLVersion::kTLS13,
context_params->initial_ssl_config->version_max);
// Explicitly double-check the settings are not in the preference store.
diff --git a/chromium/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc b/chromium/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
index 8753173ce1a..29d925274b3 100644
--- a/chromium/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
+++ b/chromium/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <gtest/gtest.h>
#include <stddef.h>
#include "base/command_line.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/values.h"
@@ -17,6 +17,8 @@
#include "components/proxy_config/proxy_config_dictionary.h"
#include "components/proxy_config/proxy_config_pref_names.h"
#include "content/public/common/content_switches.h"
+#include "services/network/public/cpp/network_switches.h"
+#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ui_base_switches.h"
namespace {
@@ -52,7 +54,6 @@ class TestCommandLinePrefStore : public ChromeCommandLinePrefStore {
ASSERT_TRUE(value->is_list());
ASSERT_EQ(cipher_count, value->GetList().size());
- std::string cipher_string;
for (const base::Value& cipher_string : value->GetList()) {
ASSERT_TRUE(cipher_string.is_string());
EXPECT_EQ(*ciphers++, cipher_string.GetString());
@@ -220,3 +221,28 @@ TEST(ChromeCommandLinePrefStoreTest, DisableSSLCipherSuites) {
store3->VerifySSLCipherSuites(expected_ciphers3,
base::size(expected_ciphers3));
}
+
+TEST(ChromeCommandLinePrefStoreTest, ExplicitlyAllowedPorts) {
+ base::CommandLine cl(base::CommandLine::NO_PROGRAM);
+ cl.AppendSwitchASCII(switches::kExplicitlyAllowedPorts,
+ "79,554, 6000, foo,1000000");
+ auto store = base::MakeRefCounted<TestCommandLinePrefStore>(&cl);
+ constexpr int kExpectedPorts[] = {
+ 79,
+ 554,
+ 6000,
+ };
+
+ const base::Value* value = nullptr;
+ ASSERT_TRUE(store->GetValue(prefs::kExplicitlyAllowedNetworkPorts, &value));
+ ASSERT_TRUE(value);
+ ASSERT_TRUE(value->is_list());
+ ASSERT_EQ(base::size(kExpectedPorts), value->GetList().size());
+
+ int i = 0;
+ for (const base::Value& port : value->GetList()) {
+ ASSERT_TRUE(port.is_int());
+ EXPECT_EQ(kExpectedPorts[i], port.GetInt());
+ ++i;
+ }
+}
diff --git a/chromium/chrome/browser/prefs/chrome_pref_service_unittest.cc b/chromium/chrome/browser/prefs/chrome_pref_service_unittest.cc
index 8f1b117d296..66449c77c1f 100644
--- a/chromium/chrome/browser/prefs/chrome_pref_service_unittest.cc
+++ b/chromium/chrome/browser/prefs/chrome_pref_service_unittest.cc
@@ -30,9 +30,8 @@ TEST(ChromePrefServiceTest, UpdateCommandLinePrefStore) {
const base::Value* value = pref->GetValue();
ASSERT_TRUE(value);
EXPECT_EQ(base::Value::Type::BOOLEAN, value->type());
- bool actual_bool_value = true;
- EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
- EXPECT_FALSE(actual_bool_value);
+ EXPECT_TRUE(value->is_bool());
+ EXPECT_FALSE(value->GetBool());
// Change the command line.
base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
@@ -45,9 +44,8 @@ TEST(ChromePrefServiceTest, UpdateCommandLinePrefStore) {
value = pref->GetValue();
ASSERT_TRUE(value);
EXPECT_EQ(base::Value::Type::BOOLEAN, value->type());
- actual_bool_value = false;
- EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
- EXPECT_TRUE(actual_bool_value);
+ EXPECT_TRUE(value->is_bool());
+ EXPECT_TRUE(value->GetBool());
}
class ChromePrefServiceWebKitPrefs : public ChromeRenderViewHostTestHarness {
diff --git a/chromium/chrome/browser/prefs/incognito_mode_prefs.cc b/chromium/chrome/browser/prefs/incognito_mode_prefs.cc
index 98f6ab2937f..67cb4b7c3c0 100644
--- a/chromium/chrome/browser/prefs/incognito_mode_prefs.cc
+++ b/chromium/chrome/browser/prefs/incognito_mode_prefs.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/logging.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
@@ -23,6 +24,10 @@
#include "chrome/browser/android/partner_browser_customizations.h"
#endif // defined(OS_ANDROID)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/lacros/lacros_chrome_service_impl.h"
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
// static
// Sadly, this is required until c++17.
constexpr IncognitoModePrefs::Availability
@@ -66,10 +71,18 @@ bool IncognitoModePrefs::ShouldLaunchIncognito(
// to launch in incognito mode or if it was forced via prefs. This way,
// the parental controls check (which can be quite slow) can be avoided
// most of the time.
- const bool should_use_incognito =
+ bool should_use_incognito =
command_line.HasSwitch(switches::kIncognito) ||
GetAvailabilityInternal(prefs, DONT_CHECK_PARENTAL_CONTROLS) ==
IncognitoModePrefs::FORCED;
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ auto* init_params = chromeos::LacrosChromeServiceImpl::Get()->init_params();
+ // TODO(https://crbug.com/1194304): Remove in M93.
+ should_use_incognito |= init_params->is_incognito_deprecated;
+ should_use_incognito |=
+ init_params->initial_browser_action ==
+ crosapi::mojom::InitialBrowserAction::kOpenIncognitoWindow;
+#endif
return should_use_incognito &&
GetAvailabilityInternal(prefs, CHECK_PARENTAL_CONTROLS) !=
IncognitoModePrefs::DISABLED;
diff --git a/chromium/chrome/browser/prefs/origin_trial_prefs.cc b/chromium/chrome/browser/prefs/origin_trial_prefs.cc
deleted file mode 100644
index 65e2407d31f..00000000000
--- a/chromium/chrome/browser/prefs/origin_trial_prefs.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/prefs/origin_trial_prefs.h"
-
-#include "chrome/common/pref_names.h"
-#include "components/prefs/pref_registry_simple.h"
-
-// static
-void OriginTrialPrefs::RegisterPrefs(PrefRegistrySimple* registry) {
- registry->RegisterStringPref(prefs::kOriginTrialPublicKey, "");
- registry->RegisterListPref(prefs::kOriginTrialDisabledFeatures);
- registry->RegisterListPref(prefs::kOriginTrialDisabledTokens);
-}
diff --git a/chromium/chrome/browser/prefs/origin_trial_prefs.h b/chromium/chrome/browser/prefs/origin_trial_prefs.h
deleted file mode 100644
index 3e8baafb666..00000000000
--- a/chromium/chrome/browser/prefs/origin_trial_prefs.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_PREFS_ORIGIN_TRIAL_PREFS_H_
-#define CHROME_BROWSER_PREFS_ORIGIN_TRIAL_PREFS_H_
-
-class PrefRegistrySimple;
-
-class OriginTrialPrefs {
- public:
- static void RegisterPrefs(PrefRegistrySimple* registry);
-};
-
-#endif // CHROME_BROWSER_PREFS_ORIGIN_TRIAL_PREFS_H_
diff --git a/chromium/chrome/browser/prefs/pref_functional_browsertest.cc b/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
index 62d4a0bd769..3c45d2e96e0 100644
--- a/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
+++ b/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
@@ -125,13 +125,13 @@ IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestJavascriptEnableDisable) {
prefs::kWebKitJavascriptEnabled));
ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL("/javaScriptTitle.html"));
- EXPECT_EQ(base::ASCIIToUTF16("Title from script javascript enabled"),
+ EXPECT_EQ(u"Title from script javascript enabled",
browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
browser()->profile()->GetPrefs()->SetBoolean(prefs::kWebKitJavascriptEnabled,
false);
ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL("/javaScriptTitle.html"));
- EXPECT_EQ(base::ASCIIToUTF16("This is html title"),
+ EXPECT_EQ(u"This is html title",
browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
}
diff --git a/chromium/chrome/browser/prefs/profile_pref_store_manager.cc b/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
index 7bfb2ac868d..fc179308257 100644
--- a/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
+++ b/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
@@ -153,7 +153,7 @@ ProfilePrefStoreManager::CreateTrackedPrefStoreConfiguration(
? *g_preference_validation_registry_path_for_testing
: install_static::GetRegistryPath()),
#else
- base::string16(),
+ std::u16string(),
#endif
std::move(validation_delegate), std::move(reset_on_load_observer));
}
diff --git a/chromium/chrome/browser/prefs/profile_pref_store_manager_unittest.cc b/chromium/chrome/browser/prefs/profile_pref_store_manager_unittest.cc
index 1c627556441..9f5bd81ad42 100644
--- a/chromium/chrome/browser/prefs/profile_pref_store_manager_unittest.cc
+++ b/chromium/chrome/browser/prefs/profile_pref_store_manager_unittest.cc
@@ -175,8 +175,8 @@ class ProfilePrefStoreManagerTest : public testing::Test,
}
void ReloadConfiguration() {
- manager_.reset(new ProfilePrefStoreManager(profile_dir_.GetPath(), seed_,
- "device_id"));
+ manager_ = std::make_unique<ProfilePrefStoreManager>(profile_dir_.GetPath(),
+ seed_, "device_id");
}
void TearDown() override {
diff --git a/chromium/chrome/browser/prefs/session_startup_pref_unittest.cc b/chromium/chrome/browser/prefs/session_startup_pref_unittest.cc
index 69a77f997a5..8f8794d2aa3 100644
--- a/chromium/chrome/browser/prefs/session_startup_pref_unittest.cc
+++ b/chromium/chrome/browser/prefs/session_startup_pref_unittest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
+
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
@@ -13,7 +15,8 @@
class SessionStartupPrefTest : public testing::Test {
public:
void SetUp() override {
- pref_service_.reset(new sync_preferences::TestingPrefServiceSyncable);
+ pref_service_ =
+ std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
SessionStartupPref::RegisterProfilePrefs(registry());
registry()->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, true);
}
diff --git a/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc b/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
index 12ffec0b4eb..3dc777ef86c 100644
--- a/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
+++ b/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
@@ -155,11 +155,11 @@ std::unique_ptr<base::DictionaryValue> ReadPrefsDictionary(
deserializer.Deserialize(&error_code, &error_str);
if (!prefs || error_code != JSONFileValueDeserializer::JSON_NO_ERROR) {
ADD_FAILURE() << "Error #" << error_code << ": " << error_str;
- return std::unique_ptr<base::DictionaryValue>();
+ return nullptr;
}
if (!prefs->is_dict()) {
ADD_FAILURE();
- return std::unique_ptr<base::DictionaryValue>();
+ return nullptr;
}
return std::unique_ptr<base::DictionaryValue>(
static_cast<base::DictionaryValue*>(prefs.release()));
@@ -1123,7 +1123,7 @@ class PrefHashBrowserTestRegistryValidationFailure
KEY_SET_VALUE | KEY_WOW64_32KEY));
// An incorrect hash should still have the correct size.
ASSERT_EQ(ERROR_SUCCESS,
- key.WriteValue(L"homepage", base::string16(64, 'A').c_str()));
+ key.WriteValue(L"homepage", std::wstring(64, 'A').c_str()));
}
void VerifyReactionToPrefAttack() override {
@@ -1162,16 +1162,16 @@ class PrefHashBrowserTestDefaultSearch : public PrefHashBrowserTestBase {
static_cast<DefaultSearchManager::Source>(-1);
TemplateURLData user_dse;
- user_dse.SetKeyword(base::UTF8ToUTF16("userkeyword"));
- user_dse.SetShortName(base::UTF8ToUTF16("username"));
+ user_dse.SetKeyword(u"userkeyword");
+ user_dse.SetShortName(u"username");
user_dse.SetURL("http://user_default_engine/search?q=good_user_query");
default_search_manager.SetUserSelectedDefaultSearchEngine(user_dse);
const TemplateURLData* current_dse =
default_search_manager.GetDefaultSearchEngine(&dse_source);
EXPECT_EQ(DefaultSearchManager::FROM_USER, dse_source);
- EXPECT_EQ(current_dse->keyword(), base::UTF8ToUTF16("userkeyword"));
- EXPECT_EQ(current_dse->short_name(), base::UTF8ToUTF16("username"));
+ EXPECT_EQ(current_dse->keyword(), u"userkeyword");
+ EXPECT_EQ(current_dse->short_name(), u"username");
EXPECT_EQ(current_dse->url(),
"http://user_default_engine/search?q=good_user_query");
}
@@ -1236,16 +1236,16 @@ class PrefHashBrowserTestDefaultSearch : public PrefHashBrowserTestBase {
#if !BUILDFLAG(IS_CHROMEOS_ASH)
// Attack is successful.
EXPECT_EQ(DefaultSearchManager::FROM_USER, dse_source);
- EXPECT_EQ(current_dse->keyword(), base::UTF8ToUTF16("badkeyword"));
- EXPECT_EQ(current_dse->short_name(), base::UTF8ToUTF16("badname"));
+ EXPECT_EQ(current_dse->keyword(), u"badkeyword");
+ EXPECT_EQ(current_dse->short_name(), u"badname");
EXPECT_EQ(current_dse->url(),
"http://bad_default_engine/search?q=dirty_user_query");
#endif
} else {
// Attack fails.
EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, dse_source);
- EXPECT_NE(current_dse->keyword(), base::UTF8ToUTF16("badkeyword"));
- EXPECT_NE(current_dse->short_name(), base::UTF8ToUTF16("badname"));
+ EXPECT_NE(current_dse->keyword(), u"badkeyword");
+ EXPECT_NE(current_dse->short_name(), u"badname");
EXPECT_NE(current_dse->url(),
"http://bad_default_engine/search?q=dirty_user_query");
}
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_device_lister_unittest.cc b/chromium/chrome/browser/printing/cloud_print/privet_device_lister_unittest.cc
index 45f9a7614b4..7b2be62c825 100644
--- a/chromium/chrome/browser/printing/cloud_print/privet_device_lister_unittest.cc
+++ b/chromium/chrome/browser/printing/cloud_print/privet_device_lister_unittest.cc
@@ -137,7 +137,7 @@ class MockServiceDiscoveryClient : public ServiceDiscoveryClient {
net::AddressFamily address_family,
LocalDomainResolver::IPAddressCallback callback) override {
NOTREACHED();
- return std::unique_ptr<LocalDomainResolver>();
+ return nullptr;
}
private:
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc
index 9f9f45f696c..960486b2ace 100644
--- a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc
+++ b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc
@@ -495,7 +495,7 @@ void PrivetLocalPrintOperationImpl::DoSubmitdoc() {
user_);
}
- base::string16 shortened_jobname;
+ std::u16string shortened_jobname;
gfx::ElideString(base::UTF8ToUTF16(jobname_),
kPrivetLocalPrintMaxJobNameLength,
&shortened_jobname);
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc b/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc
index 21f566fdc29..7746a3c8431 100644
--- a/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc
+++ b/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc
@@ -86,7 +86,7 @@ void PrivetNotificationsListener::DeviceChanged(
}
std::unique_ptr<DeviceContext>& device_context = devices_seen_[name];
- device_context.reset(new DeviceContext);
+ device_context = std::make_unique<DeviceContext>();
device_context->notification_may_be_active = false;
device_context->registered = !description.id.empty();
@@ -244,11 +244,11 @@ void PrivetNotificationService::AddNotification(
message_center::ButtonInfo(l10n_util::GetStringUTF16(
IDS_LOCAL_DISCOVERY_NOTIFICATIONS_DISABLE_BUTTON_LABEL)));
- base::string16 title = l10n_util::GetPluralStringFUTF16(
+ std::u16string title = l10n_util::GetPluralStringFUTF16(
IDS_LOCAL_DISCOVERY_NOTIFICATION_TITLE_PRINTER, devices_active);
- base::string16 body = l10n_util::GetPluralStringFUTF16(
+ std::u16string body = l10n_util::GetPluralStringFUTF16(
IDS_LOCAL_DISCOVERY_NOTIFICATION_CONTENTS_PRINTER, devices_active);
- base::string16 product_name =
+ std::u16string product_name =
l10n_util::GetStringUTF16(IDS_LOCAL_DISCOVERY_SERVICE_NAME_PRINTER);
Profile* profile = Profile::FromBrowserContext(profile_);
@@ -280,8 +280,8 @@ void PrivetNotificationService::Start() {
Profile::FromBrowserContext(profile_));
// Only show notifications for signed-in accounts. https://crbug.com/349098
- if (!identity_manager || !identity_manager->HasPrimaryAccount(
- signin::ConsentLevel::kNotRequired)) {
+ if (!identity_manager ||
+ !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
return;
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -322,8 +322,8 @@ void PrivetNotificationService::OnNotificationsEnabledChanged() {
void PrivetNotificationService::StartLister() {
service_discovery_client_ =
local_discovery::ServiceDiscoverySharedClient::GetInstance();
- device_lister_.reset(
- new PrivetDeviceListerImpl(service_discovery_client_.get(), this));
+ device_lister_ = std::make_unique<PrivetDeviceListerImpl>(
+ service_discovery_client_.get(), this);
device_lister_->Start();
device_lister_->DiscoverNewDevices();
@@ -332,8 +332,9 @@ void PrivetNotificationService::StartLister() {
content::BrowserContext::GetDefaultStoragePartition(profile_)
->GetURLLoaderFactoryForBrowserProcess()));
- privet_notifications_listener_.reset(
- new PrivetNotificationsListener(std::move(http_factory), this));
+ privet_notifications_listener_ =
+ std::make_unique<PrivetNotificationsListener>(std::move(http_factory),
+ this);
}
PrivetNotificationDelegate*
@@ -349,7 +350,7 @@ PrivetNotificationDelegate::~PrivetNotificationDelegate() {
void PrivetNotificationDelegate::Click(
const base::Optional<int>& button_index,
- const base::Optional<base::string16>& reply) {
+ const base::Optional<std::u16string>& reply) {
if (!button_index)
return;
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_notifications.h b/chromium/chrome/browser/printing/cloud_print/privet_notifications.h
index 34edf3c9018..63833705c10 100644
--- a/chromium/chrome/browser/printing/cloud_print/privet_notifications.h
+++ b/chromium/chrome/browser/printing/cloud_print/privet_notifications.h
@@ -158,7 +158,7 @@ class PrivetNotificationDelegate : public message_center::NotificationDelegate {
// NotificationDelegate implementation.
void Click(const base::Optional<int>& button_index,
- const base::Optional<base::string16>& reply) override;
+ const base::Optional<std::u16string>& reply) override;
protected:
// Refcounted.
diff --git a/chromium/chrome/browser/printing/pdf_nup_converter_client.h b/chromium/chrome/browser/printing/pdf_nup_converter_client.h
index 794a215c0e6..be81660a451 100644
--- a/chromium/chrome/browser/printing/pdf_nup_converter_client.h
+++ b/chromium/chrome/browser/printing/pdf_nup_converter_client.h
@@ -6,12 +6,10 @@
#define CHROME_BROWSER_PRINTING_PDF_NUP_CONVERTER_CLIENT_H_
#include <map>
-#include <memory>
#include "chrome/services/printing/public/mojom/pdf_nup_converter.mojom.h"
#include "content/public/browser/web_contents_user_data.h"
#include "mojo/public/cpp/bindings/remote.h"
-#include "services/service_manager/public/cpp/connector.h"
namespace printing {
@@ -57,8 +55,6 @@ class PdfNupConverterClient
mojo::Remote<mojom::PdfNupConverter> CreatePdfNupConverterRemote();
- std::unique_ptr<service_manager::Connector> connector_;
-
// Stores the mapping between document cookies and their corresponding
// mojo::Remote.
std::map<int, mojo::Remote<mojom::PdfNupConverter>> pdf_nup_converter_map_;
diff --git a/chromium/chrome/browser/printing/pdf_to_emf_converter.cc b/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
index ba87198d40b..cb76164c6b0 100644
--- a/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -52,7 +52,7 @@ class PdfToEmfConverterClientImpl : public mojom::PdfToEmfConverterClient {
// mojom::PdfToEmfConverterClient implementation.
void PreCacheFontCharacters(
const std::vector<uint8_t>& logfont_data,
- const base::string16& characters,
+ const std::u16string& characters,
PreCacheFontCharactersCallback callback) override {
// TODO(scottmg): pdf/ppapi still require the renderer to be able to
// precache GDI fonts (http://crbug.com/383227), even when using
diff --git a/chromium/chrome/browser/printing/print_backend_service.cc b/chromium/chrome/browser/printing/print_backend_service.cc
index 031c2dc188c..1ecaa0631c3 100644
--- a/chromium/chrome/browser/printing/print_backend_service.cc
+++ b/chromium/chrome/browser/printing/print_backend_service.cc
@@ -10,6 +10,7 @@
#include "base/no_destructor.h"
#include "base/time/time.h"
#include "build/build_config.h"
+#include "chrome/browser/service_sandbox_type.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/services/printing/public/mojom/print_backend_service.mojom.h"
#include "content/public/browser/service_process_host.h"
diff --git a/chromium/chrome/browser/printing/print_browsertest.cc b/chromium/chrome/browser/printing/print_browsertest.cc
index f7c7a50cf6c..b06a2cb0cf1 100644
--- a/chromium/chrome/browser/printing/print_browsertest.cc
+++ b/chromium/chrome/browser/printing/print_browsertest.cc
@@ -7,6 +7,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/files/file_path.h"
#include "base/optional.h"
#include "base/path_service.h"
diff --git a/chromium/chrome/browser/printing/print_dialog_cloud_win.cc b/chromium/chrome/browser/printing/print_dialog_cloud_win.cc
index 6b935a85e0b..4ff1a8a05bc 100644
--- a/chromium/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chromium/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -64,7 +64,7 @@ class PrintDataSetter : public content::WebContentsObserver {
message_data.SetString("content", base64_data);
std::string json_data;
base::JSONWriter::Write(message_data, &json_data);
- message_data_ = STRING16_LITERAL("cp-dialog-set-print-document::");
+ message_data_ = u"cp-dialog-set-print-document::";
message_data_.append(base::UTF8ToUTF16(json_data));
}
@@ -73,7 +73,7 @@ class PrintDataSetter : public content::WebContentsObserver {
void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override {
GURL url = web_contents()->GetURL();
if (cloud_devices::IsCloudPrintURL(url)) {
- base::string16 origin = base::UTF8ToUTF16(url.GetOrigin().spec());
+ std::u16string origin = base::UTF8ToUTF16(url.GetOrigin().spec());
content::MessagePortProvider::PostMessageToFrame(web_contents(), origin,
origin, message_data_);
}
@@ -81,7 +81,7 @@ class PrintDataSetter : public content::WebContentsObserver {
void WebContentsDestroyed() override { delete this; }
- base::string16 message_data_;
+ std::u16string message_data_;
DISALLOW_COPY_AND_ASSIGN(PrintDataSetter);
};
diff --git a/chromium/chrome/browser/printing/print_job.cc b/chromium/chrome/browser/printing/print_job.cc
index 1f33cee6362..4743a6e49ab 100644
--- a/chromium/chrome/browser/printing/print_job.cc
+++ b/chromium/chrome/browser/printing/print_job.cc
@@ -11,7 +11,6 @@
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/run_loop.h"
-#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
@@ -85,7 +84,7 @@ PrintJob::~PrintJob() {
}
void PrintJob::Initialize(std::unique_ptr<PrinterQuery> query,
- const base::string16& name,
+ const std::u16string& name,
uint32_t page_count) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!worker_);
@@ -600,8 +599,8 @@ void PrintJob::ControlledWorkerShutdown() {
bool PrintJob::PostTask(const base::Location& from_here,
base::OnceClosure task) {
- return base::PostTask(from_here, {content::BrowserThread::UI},
- std::move(task));
+ return content::GetUIThreadTaskRunner({})->PostTask(from_here,
+ std::move(task));
}
void PrintJob::HoldUntilStopIsCalled() {
diff --git a/chromium/chrome/browser/printing/print_job.h b/chromium/chrome/browser/printing/print_job.h
index ae0116f2158..4b3097c2653 100644
--- a/chromium/chrome/browser/printing/print_job.h
+++ b/chromium/chrome/browser/printing/print_job.h
@@ -67,7 +67,7 @@ class PrintJob : public base::RefCountedThreadSafe<PrintJob>,
// the print settings. Sets the expected page count of the print job based on
// the settings.
virtual void Initialize(std::unique_ptr<PrinterQuery> query,
- const base::string16& name,
+ const std::u16string& name,
uint32_t page_count);
#if defined(OS_WIN)
diff --git a/chromium/chrome/browser/printing/print_job_unittest.cc b/chromium/chrome/browser/printing/print_job_unittest.cc
index 7071cb9ec1e..be165b663d9 100644
--- a/chromium/chrome/browser/printing/print_job_unittest.cc
+++ b/chromium/chrome/browser/printing/print_job_unittest.cc
@@ -5,11 +5,11 @@
#include "chrome/browser/printing/print_job.h"
#include <memory>
+#include <string>
#include <utility>
#include <vector>
#include "base/run_loop.h"
-#include "base/strings/string16.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/chrome_notification_types.h"
@@ -99,7 +99,7 @@ TEST(PrintJobTest, SimplePrint) {
content::NotificationService::AllSources());
volatile bool check = false;
scoped_refptr<PrintJob> job(new TestPrintJob(&check));
- job->Initialize(std::make_unique<TestQuery>(), base::string16(), 1);
+ job->Initialize(std::make_unique<TestQuery>(), std::u16string(), 1);
#if BUILDFLAG(IS_CHROMEOS_ASH)
job->SetSource(PrintJob::Source::PRINT_PREVIEW, /*source_id=*/"");
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chromium/chrome/browser/printing/print_job_worker.cc b/chromium/chrome/browser/printing/print_job_worker.cc
index 47a5b3c2a11..91edb6e296f 100644
--- a/chromium/chrome/browser/printing/print_job_worker.cc
+++ b/chromium/chrome/browser/printing/print_job_worker.cc
@@ -341,7 +341,7 @@ void PrintJobWorker::StartPrinting(PrintedDocument* new_document) {
return;
}
- base::string16 document_name = SimplifyDocumentTitle(document_->name());
+ std::u16string document_name = SimplifyDocumentTitle(document_->name());
if (document_name.empty()) {
document_name = SimplifyDocumentTitle(
l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE));
diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller.cc
index fa088bfa001..74536431f66 100644
--- a/chromium/chrome/browser/printing/print_preview_dialog_controller.cc
+++ b/chromium/chrome/browser/printing/print_preview_dialog_controller.cc
@@ -49,7 +49,7 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/arc/print_spooler/print_session_impl.h"
+#include "chrome/browser/ash/arc/print_spooler/print_session_impl.h"
#endif
using content::NavigationController;
@@ -85,8 +85,8 @@ class PrintPreviewDialogDelegate : public ui::WebDialogDelegate,
~PrintPreviewDialogDelegate() override;
ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
- base::string16 GetAccessibleDialogTitle() const override;
+ std::u16string GetDialogTitle() const override;
+ std::u16string GetAccessibleDialogTitle() const override;
GURL GetDialogContentURL() const override;
void GetWebUIMessageHandlers(
std::vector<WebUIMessageHandler*>* handlers) const override;
@@ -116,12 +116,12 @@ ui::ModalType PrintPreviewDialogDelegate::GetDialogModalType() const {
return ui::MODAL_TYPE_WINDOW;
}
-base::string16 PrintPreviewDialogDelegate::GetDialogTitle() const {
+std::u16string PrintPreviewDialogDelegate::GetDialogTitle() const {
// Only used on Windows? UI folks prefer no title.
- return base::string16();
+ return std::u16string();
}
-base::string16 PrintPreviewDialogDelegate::GetAccessibleDialogTitle() const {
+std::u16string PrintPreviewDialogDelegate::GetAccessibleDialogTitle() const {
return l10n_util::GetStringUTF16(IDS_PRINT_PREVIEW_TITLE);
}
diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller.h b/chromium/chrome/browser/printing/print_preview_dialog_controller.h
index 0c523a16fda..69c8e495bc8 100644
--- a/chromium/chrome/browser/printing/print_preview_dialog_controller.h
+++ b/chromium/chrome/browser/printing/print_preview_dialog_controller.h
@@ -78,7 +78,7 @@ class PrintPreviewDialogController
using PrintPreviewDialogMap =
std::map<content::WebContents*, content::WebContents*>;
- virtual ~PrintPreviewDialogController();
+ ~PrintPreviewDialogController() override;
// WebContentsCollection::Observer:
// Handles the closing of the RenderProcessHost. This is observed when the
diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 02c8d81b790..f6c3b223d0b 100644
--- a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -343,9 +343,9 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
namespace {
-base::string16 GetExpectedPrefix() {
+std::u16string GetExpectedPrefix() {
return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRINT_PREFIX,
- base::string16());
+ std::u16string());
}
const std::vector<task_manager::WebContentsTag*>& GetTrackedTags() {
@@ -370,8 +370,8 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
ASSERT_EQ(3U, task_manager.tasks().size());
const task_manager::Task* pre_existing_task = task_manager.tasks().back();
EXPECT_EQ(task_manager::Task::RENDERER, pre_existing_task->GetType());
- const base::string16 pre_existing_title = pre_existing_task->title();
- const base::string16 expected_prefix = GetExpectedPrefix();
+ const std::u16string pre_existing_title = pre_existing_task->title();
+ const std::u16string expected_prefix = GetExpectedPrefix();
EXPECT_TRUE(base::StartsWith(pre_existing_title,
expected_prefix,
base::CompareCase::INSENSITIVE_ASCII));
@@ -392,7 +392,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
ASSERT_EQ(3U, task_manager.tasks().size());
const task_manager::Task* task = task_manager.tasks().back();
EXPECT_EQ(task_manager::Task::RENDERER, task->GetType());
- const base::string16 title = task->title();
+ const std::u16string title = task->title();
EXPECT_TRUE(base::StartsWith(title,
expected_prefix,
base::CompareCase::INSENSITIVE_ASCII));
diff --git a/chromium/chrome/browser/printing/print_view_manager_base.cc b/chromium/chrome/browser/printing/print_view_manager_base.cc
index bdfa513542e..9aa99b764ad 100644
--- a/chromium/chrome/browser/printing/print_view_manager_base.cc
+++ b/chromium/chrome/browser/printing/print_view_manager_base.cc
@@ -74,7 +74,7 @@ namespace {
using PrintSettingsCallback =
base::OnceCallback<void(std::unique_ptr<PrinterQuery>)>;
-void ShowWarningMessageBox(const base::string16& message) {
+void ShowWarningMessageBox(const std::u16string& message) {
// Runs always on the UI thread.
static bool is_dialog_shown = false;
if (is_dialog_shown)
@@ -82,7 +82,7 @@ void ShowWarningMessageBox(const base::string16& message) {
// Block opening dialog from nested task.
base::AutoReset<bool> auto_reset(&is_dialog_shown, true);
- chrome::ShowWarningMessageBox(nullptr, base::string16(), message);
+ chrome::ShowWarningMessageBox(nullptr, std::u16string(), message);
}
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
@@ -497,8 +497,8 @@ void PrintViewManagerBase::NavigationStopped() {
TerminatePrintJob(true);
}
-base::string16 PrintViewManagerBase::RenderSourceName() {
- base::string16 name(web_contents()->GetTitle());
+std::u16string PrintViewManagerBase::RenderSourceName() {
+ std::u16string name(web_contents()->GetTitle());
if (name.empty())
name = l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE);
return name;
diff --git a/chromium/chrome/browser/printing/print_view_manager_base.h b/chromium/chrome/browser/printing/print_view_manager_base.h
index 93103940036..a96e5a33643 100644
--- a/chromium/chrome/browser/printing/print_view_manager_base.h
+++ b/chromium/chrome/browser/printing/print_view_manager_base.h
@@ -6,13 +6,13 @@
#define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_BASE_H_
#include <memory>
+#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "build/build_config.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "components/prefs/pref_member.h"
@@ -69,7 +69,7 @@ class PrintViewManagerBase : public content::NotificationObserver,
void SystemDialogCancelled();
#endif
- base::string16 RenderSourceName();
+ std::u16string RenderSourceName();
content::RenderFrameHost* GetPrintingRFHForTesting() const {
return printing_rfh_;
diff --git a/chromium/chrome/browser/printing/printer_query.cc b/chromium/chrome/browser/printing/printer_query.cc
index 956db0ba388..b34730ff503 100644
--- a/chromium/chrome/browser/printing/printer_query.cc
+++ b/chromium/chrome/browser/printing/printer_query.cc
@@ -10,7 +10,6 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/location.h"
-#include "base/task/post_task.h"
#include "base/threading/thread_restrictions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/values.h"
@@ -170,8 +169,8 @@ void PrinterQuery::StopWorker() {
bool PrinterQuery::PostTask(const base::Location& from_here,
base::OnceClosure task) {
- return base::PostTask(from_here, {content::BrowserThread::IO},
- std::move(task));
+ return content::GetIOThreadTaskRunner({})->PostTask(from_here,
+ std::move(task));
}
bool PrinterQuery::is_valid() const {
diff --git a/chromium/chrome/browser/printing/test_print_job.cc b/chromium/chrome/browser/printing/test_print_job.cc
index a9a5df3ddf2..022bcc33f8b 100644
--- a/chromium/chrome/browser/printing/test_print_job.cc
+++ b/chromium/chrome/browser/printing/test_print_job.cc
@@ -17,7 +17,7 @@
namespace printing {
void TestPrintJob::Initialize(std::unique_ptr<PrinterQuery> query,
- const base::string16& name,
+ const std::u16string& name,
uint32_t page_count) {
// Since we do not actually print in these tests, just let this get destroyed
// when this function exits.
diff --git a/chromium/chrome/browser/printing/test_print_job.h b/chromium/chrome/browser/printing/test_print_job.h
index 45bc203a6d8..c1fa0d24b12 100644
--- a/chromium/chrome/browser/printing/test_print_job.h
+++ b/chromium/chrome/browser/printing/test_print_job.h
@@ -38,7 +38,7 @@ class TestPrintJob : public PrintJob {
// All remaining functions are PrintJob implementation.
void Initialize(std::unique_ptr<PrinterQuery> query,
- const base::string16& name,
+ const std::u16string& name,
uint32_t page_count) override;
// Sets |job_pending_| to true.
diff --git a/chromium/chrome/browser/privacy/BUILD.gn b/chromium/chrome/browser/privacy/BUILD.gn
index 2761f82197f..04f62218255 100644
--- a/chromium/chrome/browser/privacy/BUILD.gn
+++ b/chromium/chrome/browser/privacy/BUILD.gn
@@ -22,7 +22,6 @@ android_library("java") {
":java_resources",
":jni_headers",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/flags:java",
"//chrome/browser/net:secure_dns_management_mode_generated_enum",
diff --git a/chromium/chrome/browser/privacy_budget/BUILD.gn b/chromium/chrome/browser/privacy_budget/BUILD.gn
index 5a3c1237823..74f90314998 100644
--- a/chromium/chrome/browser/privacy_budget/BUILD.gn
+++ b/chromium/chrome/browser/privacy_budget/BUILD.gn
@@ -67,7 +67,10 @@ source_set("unit_tests") {
source_set("browser_tests") {
testonly = true
- sources = [ "privacy_budget_browsertest.cc" ]
+ sources = [
+ "canvas_input_key_browsertest.cc",
+ "privacy_budget_browsertest.cc",
+ ]
defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
diff --git a/chromium/chrome/browser/privacy_sandbox/android/BUILD.gn b/chromium/chrome/browser/privacy_sandbox/android/BUILD.gn
index a3680507c07..7ce578d0aa4 100644
--- a/chromium/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chromium/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -19,7 +19,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/settings:java",
"//chrome/browser/ui/messages/android:java",
diff --git a/chromium/chrome/browser/profiles/BUILD.gn b/chromium/chrome/browser/profiles/BUILD.gn
index b1a545b0d11..4868395a52b 100644
--- a/chromium/chrome/browser/profiles/BUILD.gn
+++ b/chromium/chrome/browser/profiles/BUILD.gn
@@ -5,6 +5,22 @@
import("//build/config/chromeos/ui_mode.gni")
import("//extensions/buildflags/buildflags.gni")
+# This target should be the default place for adding public interface things
+# (ie, non-factory, non-impl). There will likely need to be a :factory or :impl
+# target (maybe both) for those eventually.
+source_set("profiles") {
+ sources = [
+ "incognito_helpers.cc",
+ "incognito_helpers.h",
+ ]
+
+ # Cannot depend on //chrome/browser:browser.
+ deps = [ ":profile" ]
+}
+
+# This target should be very minimal, likely no new sources should be added
+# here. It should not depend on anything besides flags/constants in
+# //chrome/browser/* because almost everything else depends on it.
source_set("profile") {
sources = [
"profile.cc",
diff --git a/chromium/chrome/browser/profiles/android/BUILD.gn b/chromium/chrome/browser/profiles/android/BUILD.gn
index 1c3324b6523..9e16a2f96c6 100644
--- a/chromium/chrome/browser/profiles/android/BUILD.gn
+++ b/chromium/chrome/browser/profiles/android/BUILD.gn
@@ -9,10 +9,10 @@ import("//build/config/android/rules.gni")
android_library("java") {
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/preferences:java",
"//components/embedder_support/android:browser_context_java",
+ "//components/embedder_support/android:simple_factory_key_java",
"//components/profile_metrics:browser_profile_type_enum_java",
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
@@ -27,6 +27,7 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/profiles/ProfileKey.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileManager.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileManagerUtils.java",
+ "java/src/org/chromium/chrome/browser/profiles/ProfileResolver.java",
]
}
@@ -38,5 +39,6 @@ generate_jni("jni_headers") {
"java/src/org/chromium/chrome/browser/profiles/ProfileKey.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileManager.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileManagerUtils.java",
+ "java/src/org/chromium/chrome/browser/profiles/ProfileResolver.java",
]
}
diff --git a/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc b/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc
index 89d28a89518..9346c8131c4 100644
--- a/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc
+++ b/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc
@@ -33,7 +33,7 @@ ChromeBrowserPepperHostFactory::CreateResourceHost(
// Make sure the plugin is giving us a valid instance for this resource.
if (!host_->IsValidInstance(instance))
- return std::unique_ptr<ResourceHost>();
+ return nullptr;
// Permissions for the following interfaces will be checked at the
// time of the corresponding instance's methods calls (because
@@ -41,14 +41,13 @@ ChromeBrowserPepperHostFactory::CreateResourceHost(
// thread). Currently these interfaces are available only for
// whitelisted apps which may not have access to the other private
// interfaces.
- if (message.type() == PpapiHostMsg_IsolatedFileSystem_Create::ID) {
- PepperIsolatedFileSystemMessageFilter* isolated_fs_filter =
- PepperIsolatedFileSystemMessageFilter::Create(instance, host_);
- if (!isolated_fs_filter)
- return std::unique_ptr<ResourceHost>();
- return std::unique_ptr<ResourceHost>(
- new MessageFilterHost(host, instance, resource, isolated_fs_filter));
- }
-
- return std::unique_ptr<ResourceHost>();
+ if (message.type() != PpapiHostMsg_IsolatedFileSystem_Create::ID)
+ return nullptr;
+
+ PepperIsolatedFileSystemMessageFilter* isolated_fs_filter =
+ PepperIsolatedFileSystemMessageFilter::Create(instance, host_);
+ if (!isolated_fs_filter)
+ return nullptr;
+ return std::make_unique<MessageFilterHost>(host, instance, resource,
+ isolated_fs_filter);
}
diff --git a/chromium/chrome/browser/resources/BUILD.gn b/chromium/chrome/browser/resources/BUILD.gn
index 7b1ac5c4f1e..fc31b0249f1 100644
--- a/chromium/chrome/browser/resources/BUILD.gn
+++ b/chromium/chrome/browser/resources/BUILD.gn
@@ -27,12 +27,14 @@ group("resources") {
":webid_resources",
"bookmarks:resources",
"commander:resources",
+ "download_shelf:resources",
"downloads:resources",
"feedback_webui:resources",
"gaia_auth_host:resources",
"history:resources",
"memories:resources",
"new_tab_page:resources",
+ "new_tab_page_third_party:resources",
"read_later:resources",
"settings:resources",
"tab_search:resources",
@@ -47,6 +49,7 @@ group("resources") {
"chromeos:multidevice_setup_resources",
"chromeos/accessibility:build",
"chromeos/emoji_picker:resources",
+ "chromeos/login:resources",
"chromeos/multidevice_internals:resources",
"chromeos/network_ui:resources",
"nearby_internals:resources",
@@ -102,29 +105,30 @@ if (enable_js_type_check) {
"commander:closure_compile",
"discards:closure_compile",
"download_internals:closure_compile",
+ "download_shelf:closure_compile",
"downloads:closure_compile",
+ "feedback_webui/js:closure_compile",
"gaia_auth_host:closure_compile",
"history:closure_compile",
"inline_login:closure_compile",
+ "internals/user_education:closure_compile",
"local_ntp:closure_compile",
- "local_state:closure_compile",
"management:closure_compile",
"media_router:closure_compile",
"memories:closure_compile",
"nearby_internals:closure_compile",
"new_tab_page:closure_compile",
+ "new_tab_page_third_party:closure_compile",
"ntp4:closure_compile",
"omnibox:closure_compile",
"quota_internals:closure_compile",
"read_later:closure_compile",
"settings:closure_compile",
- "settings:closure_compile_module",
"signin:closure_compile",
"sync_file_system_internals:closure_compile",
"tab_search:closure_compile",
"usb_internals:closure_compile",
"web_app_internals:closure_compile",
- "welcome:closure_compile",
]
}
if (is_win || is_android || is_linux || is_chromeos) {
@@ -141,6 +145,9 @@ if (enable_js_type_check) {
"nearby_share/shared:closure_compile_module",
]
}
+ if (!is_android && !is_chromeos_ash) {
+ deps += [ "welcome:closure_compile" ]
+ }
if (enable_extensions) {
deps += [ "extensions:closure_compile" ]
}
@@ -309,6 +316,8 @@ repack("dev_ui_paks") {
sources = [
"$root_gen_dir/chrome/bluetooth_internals_resources.pak",
"$root_gen_dir/chrome/dev_ui_browser_resources.pak",
+ "$root_gen_dir/chrome/download_internals_resources.pak",
+ "$root_gen_dir/chrome/internals_resources.pak",
"$root_gen_dir/chrome/invalidations_resources.pak",
"$root_gen_dir/chrome/net_internals_resources.pak",
"$root_gen_dir/chrome/omnibox_resources.pak",
@@ -316,7 +325,7 @@ repack("dev_ui_paks") {
"$root_gen_dir/chrome/usb_internals_resources.pak",
"$root_gen_dir/chrome/webrtc_logs_resources.pak",
"$root_gen_dir/components/dev_ui_components_resources.pak",
- "$root_gen_dir/components/sync_driver_resources.pak",
+ "$root_gen_dir/components/sync_driver_sync_internals_resources.pak",
"$root_gen_dir/content/browser/resources/media/media_internals_resources.pak",
"$root_gen_dir/content/browser/webrtc/resources/webrtc_internals_resources.pak",
"$root_gen_dir/content/dev_ui_content_resources.pak",
@@ -324,6 +333,8 @@ repack("dev_ui_paks") {
deps = [
"//chrome/browser:dev_ui_browser_resources",
"//chrome/browser/resources/bluetooth_internals:resources",
+ "//chrome/browser/resources/download_internals:resources",
+ "//chrome/browser/resources/internals:resources",
"//chrome/browser/resources/invalidations:resources",
"//chrome/browser/resources/media:webrtc_logs_resources",
"//chrome/browser/resources/net_internals:resources",
@@ -331,7 +342,7 @@ repack("dev_ui_paks") {
"//chrome/browser/resources/quota_internals:resources",
"//chrome/browser/resources/usb_internals:resources",
"//components/resources:dev_ui_components_resources",
- "//components/sync/driver:resources",
+ "//components/sync/driver/resources",
"//content:dev_ui_content_resources",
"//content/browser/resources/media:resources",
"//content/browser/webrtc/resources",
diff --git a/chromium/chrome/browser/resources/OWNERS b/chromium/chrome/browser/resources/OWNERS
index 32f9cea777d..a7ac1cb1caa 100644
--- a/chromium/chrome/browser/resources/OWNERS
+++ b/chromium/chrome/browser/resources/OWNERS
@@ -1,4 +1,3 @@
file://ui/webui/PLATFORM_OWNERS
-per-file component_extension_resources.grd=dgozman@chromium.org
per-file profile_signin_confirmation*=achuith@chromium.org
diff --git a/chromium/chrome/browser/resources/about_sys/about_sys.html b/chromium/chrome/browser/resources/about_sys/about_sys.html
index 66f79605961..12b961acb90 100644
--- a/chromium/chrome/browser/resources/about_sys/about_sys.html
+++ b/chromium/chrome/browser/resources/about_sys/about_sys.html
@@ -5,11 +5,7 @@
<title>$i18n{title}</title>
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="stylesheet" href="about_sys.css">
- <script src="chrome://resources/js/assert.js"></script>
- <script src="chrome://resources/js/util.js"></script>
- <script src="chrome://resources/js/load_time_data.js"></script>
- <script src="about_sys.js"></script>
- <script src="strings.js"></script>
+ <script type="module" src="about_sys.js"></script>
</head>
<body>
<div id="header">
diff --git a/chromium/chrome/browser/resources/about_sys/about_sys.js b/chromium/chrome/browser/resources/about_sys/about_sys.js
index 4edba9ba018..e5ecf9b30d1 100644
--- a/chromium/chrome/browser/resources/about_sys/about_sys.js
+++ b/chromium/chrome/browser/resources/about_sys/about_sys.js
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import './strings.m.js';
+
+import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+
// Contents of lines that act as delimiters for multi-line values.
const DELIM_START = '---------- START ----------';
const DELIM_END = '---------- END ----------';
@@ -169,9 +175,8 @@ function updateLogEntries(systemInfo) {
}
/**
- * Callback called by system_info_ui.cc when it has finished fetching
- * system info. The log entries are passed as a list of dictionaries containing
- * the keys statName and statValue.
+ * Callback called when system info has been fetched. The log entries are passed
+ * as a list of dictionaries containing the keys statName and statValue.
* @param {systemInfo} The fetched log entries.
*/
function returnSystemInfo(systemInfo) {
@@ -243,7 +248,7 @@ function parseSystemLog(text) {
}
document.addEventListener('DOMContentLoaded', function() {
- chrome.send('requestSystemInfo');
+ sendWithPromise('requestSystemInfo').then(returnSystemInfo);
$('collapseAll').onclick = collapseAll;
$('expandAll').onclick = expandAll;
diff --git a/chromium/chrome/browser/resources/bookmarks/BUILD.gn b/chromium/chrome/browser/resources/bookmarks/BUILD.gn
index 6fa25c49546..ecb4ec87136 100644
--- a/chromium/chrome/browser/resources/bookmarks/BUILD.gn
+++ b/chromium/chrome/browser/resources/bookmarks/BUILD.gn
@@ -189,7 +189,7 @@ js_library("app") {
":store",
":store_client",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
"//ui/webui/resources/cr_elements/cr_splitter:cr_splitter",
"//ui/webui/resources/js:load_time_data.m",
]
@@ -368,7 +368,7 @@ js_library("toolbar") {
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
diff --git a/chromium/chrome/browser/resources/bookmarks/app.js b/chromium/chrome/browser/resources/bookmarks/app.js
index 456d71a01b7..dd1e2832724 100644
--- a/chromium/chrome/browser/resources/bookmarks/app.js
+++ b/chromium/chrome/browser/resources/bookmarks/app.js
@@ -14,7 +14,7 @@ import './shared_vars.js';
import './strings.m.js';
import './toolbar.js';
-import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.m.js';
+import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/chrome/browser/resources/bookmarks/command_manager.js b/chromium/chrome/browser/resources/bookmarks/command_manager.js
index ea223392a98..11e79acf9c0 100644
--- a/chromium/chrome/browser/resources/bookmarks/command_manager.js
+++ b/chromium/chrome/browser/resources/bookmarks/command_manager.js
@@ -867,7 +867,9 @@ export const CommandManager = Polymer({
* @private
*/
onOpenCommandMenu_: async function(e) {
- await this.updateCanPaste_(e.detail.source);
+ if (e.detail.targetId) {
+ await this.updateCanPaste_(e.detail.targetId);
+ }
if (e.detail.targetElement) {
this.openCommandMenuAtElement(e.detail.targetElement, e.detail.source);
} else {
diff --git a/chromium/chrome/browser/resources/bookmarks/folder_node.html b/chromium/chrome/browser/resources/bookmarks/folder_node.html
index 67e20ed2dcd..4009e7dec7e 100644
--- a/chromium/chrome/browser/resources/bookmarks/folder_node.html
+++ b/chromium/chrome/browser/resources/bookmarks/folder_node.html
@@ -27,6 +27,7 @@
justify-self: center;
margin: 0;
--cr-icon-button-size: 40px;
+ margin-inline-end: 10px;
}
#arrow:not([is-open]) {
diff --git a/chromium/chrome/browser/resources/bookmarks/item.js b/chromium/chrome/browser/resources/bookmarks/item.js
index d18a2d6be96..e7072b6d710 100644
--- a/chromium/chrome/browser/resources/bookmarks/item.js
+++ b/chromium/chrome/browser/resources/bookmarks/item.js
@@ -118,6 +118,7 @@ Polymer({
x: e.clientX,
y: e.clientY,
source: MenuSource.ITEM,
+ targetId: this.itemId,
});
},
@@ -137,6 +138,7 @@ Polymer({
this.fire('open-command-menu', {
targetElement: e.target,
source: MenuSource.ITEM,
+ targetId: this.itemId,
});
},
diff --git a/chromium/chrome/browser/resources/bookmarks/toolbar.js b/chromium/chrome/browser/resources/bookmarks/toolbar.js
index 1969d05e733..8bcc6560993 100644
--- a/chromium/chrome/browser/resources/bookmarks/toolbar.js
+++ b/chromium/chrome/browser/resources/bookmarks/toolbar.js
@@ -4,7 +4,7 @@
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
-import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.m.js';
+import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js';
import 'chrome://resources/cr_elements/icons.m.js';
import './shared_style.js';
diff --git a/chromium/chrome/browser/resources/chromeos/BUILD.gn b/chromium/chrome/browser/resources/chromeos/BUILD.gn
index a620e728bbc..452dc0bfbc7 100644
--- a/chromium/chrome/browser/resources/chromeos/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/BUILD.gn
@@ -50,8 +50,10 @@ group("closure_compile") {
"multidevice_internals:closure_compile",
"multidevice_setup:closure_compile",
"network_ui:closure_compile",
+ "password_change:closure_compile",
"set_time_dialog:closure_compile",
"smb_shares:closure_compile",
"sys_internals:closure_compile",
+ "vm:closure_compile",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn
index d2272c6bcd5..9a1495dce80 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/accessibility_common/BUILD.gn
@@ -102,6 +102,7 @@ js_library("accessibility_common") {
"$externs_path/accessibility_features.js",
"$externs_path/accessibility_private.js",
"$externs_path/automation.js",
+ "$externs_path/command_line_private.js",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index e571c77a263..3dba621cc43 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -4,6 +4,7 @@
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
+import("//build/config/python.gni")
import(
"//chrome/browser/resources/chromeos/accessibility/common/run_jsbundler.gni")
import("//chrome/common/features.gni")
@@ -54,8 +55,7 @@ chromevox_modules = [
"background/injected_script_loader.js",
"background/keyboard_handler.js",
"background/keymaps/key_map.js",
- "background/live_regions.js",
- "background/locale_output_helper.js",
+ "background/output/locale_output_helper.js",
"background/logging/event_stream_logger.js",
"background/logging/log.js",
"background/logging/log_store.js",
@@ -64,7 +64,8 @@ chromevox_modules = [
"background/logging/tree_dumper.js",
"background/math_handler.js",
"background/pointer_handler.js",
- "background/output.js",
+ "background/output/output.js",
+ "background/output/output_format_tree.js",
"background/panel_command.js",
"background/phonetic_data.js",
"background/prefs.js",
@@ -117,10 +118,11 @@ chromevox_modules = [
# ES6 modules.
chromevox_es6_modules = [
"background/background.js",
+ "background/live_regions.js",
"background/es6_loader.js",
"background/find_handler.js",
"background/media_automation_handler.js",
- "background/next_earcons.js",
+ "background/earcons.js",
"background/range_automation_handler.js",
]
@@ -242,7 +244,8 @@ template("generate_deps_js") {
}
}
-action("chromevox_phonetic_dictionaries_js") {
+# TODO(crbug.com/1112471): Get this to run under Python3.
+python2_action("chromevox_phonetic_dictionaries_js") {
script = "tools/phonetic_dictionaries.py"
src_dir = [ "$root_out_dir/resources/chromeos/accessibility/_locales" ]
output_file = "$chromevox_out_dir/phonetic_dictionaries.js"
@@ -323,7 +326,8 @@ if (is_chromeos_ash) {
data += js2gtest_js_libraries
}
- action("chromevox_test_messages_js") {
+ # TODO(crbug.com/1112471): Get this to run under Python3.
+ python2_action("chromevox_test_messages_js") {
script = "tools/generate_test_messages.py"
sources = [ "$root_out_dir/resources/chromeos/accessibility/_locales/en/messages.json.gz" ]
output_file = "$root_out_dir/test_data/chrome/browser/resources/chromeos/accessibility/chromevox/host/testing/test_messages.js"
@@ -411,14 +415,15 @@ if (is_chromeos_ash) {
"background/background_test.js",
"background/braille_command_data_test.js",
"background/color_test.js",
+ "background/desktop_automation_handler_test.js",
"background/download_handler_test.js",
"background/editing/editing_test.js",
"background/editing/intent_handler_test.js",
"background/keyboard_handler_test.js",
"background/live_regions_test.js",
- "background/locale_output_helper_test.js",
"background/logging/log_store_test.js",
- "background/output_test.js",
+ "background/output/locale_output_helper_test.js",
+ "background/output/output_test.js",
"background/portals_test.js",
"background/settings_test.js",
"background/smart_sticky_mode_test.js",
@@ -479,6 +484,7 @@ js_library("chromevox_library") {
"$externs_path/login_state.js",
"$externs_path/metrics_private.js",
"$externs_path/settings_private.js",
+ "$externs_path/tts.js",
"$externs_path/virtual_keyboard_private.js",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn
index d6f4f62ed97..4695c0fd455 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn
@@ -31,6 +31,7 @@ run_jsbundler("select_to_speak_copied_files") {
"earcons/null_selection.ogg",
"input_handler.js",
"metrics_utils.js",
+ "node_navigation_utils.js",
"node_utils.js",
"options.css",
"options.html",
@@ -42,6 +43,9 @@ run_jsbundler("select_to_speak_copied_files") {
"select_to_speak_main.js",
"select_to_speak_options.js",
"sentence_utils.js",
+ "test_node_generator.js",
+ "tts_manager.js",
+ "ui_manager.js",
"unchecked.png",
"word_utils.js",
]
@@ -88,10 +92,13 @@ js2gtest("select_to_speak_extjs_tests") {
# These are unit tests run under an extension environment to get ES6 module support.
sources += [
+ "node_navigation_utils_unittest.js",
"node_utils_unittest.js",
"paragraph_utils_unittest.js",
"select_to_speak_unittest.js",
"sentence_utils_unittest.js",
+ "tts_manager_unittest.js",
+ "ui_manager_unittest.js",
"word_utils_unittest.js",
]
gen_include_files = [
@@ -103,7 +110,7 @@ js2gtest("select_to_speak_extjs_tests") {
"pipe.jpg",
]
extra_js_files = [
- "//chrome/test/data/webui/settings/fake_settings_private.js",
+ "fake_settings_private.js",
"//chrome/test/data/webui/fake_chrome_event.js",
]
@@ -122,6 +129,7 @@ js_type_check("closure_compile") {
deps = [
":input_handler",
":metrics_utils",
+ ":node_navigation_utils",
":node_utils",
":paragraph_utils",
":prefs_manager",
@@ -129,6 +137,8 @@ js_type_check("closure_compile") {
":select_to_speak_constants",
":select_to_speak_options",
":sentence_utils",
+ ":tts_manager",
+ ":ui_manager",
":word_utils",
"../common:automation_predicate",
"../common:automation_util",
@@ -144,10 +154,13 @@ js_library("select_to_speak") {
deps = [
":input_handler",
":metrics_utils",
+ ":node_navigation_utils",
":node_utils",
":paragraph_utils",
":prefs_manager",
":sentence_utils",
+ ":tts_manager",
+ ":ui_manager",
":word_utils",
"../common:automation_util",
"../common:constants",
@@ -156,10 +169,10 @@ js_library("select_to_speak") {
externs_list = [
"$externs_path/accessibility_private.js",
"$externs_path/automation.js",
- "$externs_path/chrome_extensions.js",
"$externs_path/clipboard.js",
"$externs_path/command_line_private.js",
"$externs_path/pending.js",
+ "$externs_path/tts.js",
]
}
@@ -168,11 +181,19 @@ js_library("select_to_speak_options") {
externs_list = [
"$externs_path/accessibility_private.js",
"$externs_path/automation.js",
- "$externs_path/chrome_extensions.js",
"$externs_path/metrics_private.js",
+ "$externs_path/tts.js",
]
}
+js_library("node_navigation_utils") {
+ deps = [
+ ":node_utils",
+ ":paragraph_utils",
+ ]
+ externs_list = [ "$externs_path/automation.js" ]
+}
+
js_library("node_utils") {
deps = [
":paragraph_utils",
@@ -195,7 +216,6 @@ js_library("paragraph_utils") {
externs_list = [
"$externs_path/accessibility_private.js",
"$externs_path/automation.js",
- "$externs_path/chrome_extensions.js",
]
}
@@ -209,8 +229,23 @@ js_library("prefs_manager") {
js_library("metrics_utils") {
deps = [ ":prefs_manager" ]
- externs_list = [ "$externs_path/metrics_private.js" ]
+ externs_list = [
+ "$externs_path/metrics_private.js",
+ "$externs_path/tts.js",
+ ]
}
js_library("select_to_speak_constants") {
}
+
+js_library("ui_manager") {
+ deps = [
+ ":paragraph_utils",
+ ":prefs_manager",
+ ]
+ externs_list = [ "$externs_path/accessibility_private.js" ]
+}
+
+js_library("tts_manager") {
+ externs_list = [ "$externs_path/tts.js" ]
+}
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
index bffad8bffb9..7a22ababfed 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -1213,6 +1213,24 @@
<message desc="Describes an element where the checked state is mixed or indeterminate." name="IDS_CHROMEVOX_CHECKED_MIXED">
Partially checked
</message>
+ <message desc="Describes an element with the ARIA attribute aria-current=true." name="IDS_CHROMEVOX_ARIA_CURRENT_TRUE">
+ Current
+ </message>
+ <message desc="Describes an element with the ARIA attribute aria-current=page." name="IDS_CHROMEVOX_ARIA_CURRENT_PAGE">
+ Current page
+ </message>
+ <message desc="Describes an element with the ARIA attribute aria-current=step." name="IDS_CHROMEVOX_ARIA_CURRENT_STEP">
+ Current step
+ </message>
+ <message desc="Describes an element with the ARIA attribute aria-current=location." name="IDS_CHROMEVOX_ARIA_CURRENT_LOCATION">
+ Current location
+ </message>
+ <message desc="Describes an element with the ARIA attribute aria-current=date." name="IDS_CHROMEVOX_ARIA_CURRENT_DATE">
+ Current date
+ </message>
+ <message desc="Describes an element with the ARIA attribute aria-current=time." name="IDS_CHROMEVOX_ARIA_CURRENT_TIME">
+ Current time
+ </message>
<message desc="Describes an element with the ARIA attribute aria-disabled=true." name="IDS_CHROMEVOX_ARIA_DISABLED_TRUE">
Disabled
</message>
@@ -2280,7 +2298,7 @@
Press Search+A, J to jump to details
</message>
<message desc="A hint to the user that action is available on this node" name="IDS_CHROMEVOX_HINT_ACTION">
- Actions available. Press Search+Period to view
+ Actions available. Press Search+Ctrl+A to view
</message>
<message desc="The display name of the command that will jump to more details about an item." name="IDS_CHROMEVOX_JUMP_TO_DETAILS">
Jump to Details
@@ -2328,7 +2346,7 @@
Double tap to start editing
</message>
<message desc="Describes Learn Mode when the mode is initially entered with text-to-speech." name="IDS_CHROMEVOX_LEARN_MODE_INTRO" is_accessibility_with_no_ui="true">
- Press a qwerty key, refreshable braille key, or touch gesture to learn its function. Press control with w or escape to exit.
+ Press a qwerty key, refreshable braille key, or touch gesture to learn its function. Press control with w, space with Z, swipe left with two fingers, or escape to exit.
</message>
<message desc="Output when leaving Learn Mode." name="IDS_CHROMEVOX_LEARN_MODE_OUTTRO">
Stopping Learn Mode
@@ -3075,6 +3093,9 @@
<message desc="The title displayed for the resources lesson set." name="IDS_CHROMEVOX_TUTORIAL_RESOURCES_TITLE">
Resources
</message>
+ <message desc="The title displayed for the touch orientation lesson set." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TITLE">
+ Touch orientation
+ </message>
<message desc="The label for the button that restarts the quick orientation in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_RESTART_QUICK_ORIENTATION_BUTTON">
Restart quick orientation
</message>
@@ -3102,12 +3123,21 @@
<message desc="Spoken to give supplemental information when focusing the main menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_MAIN_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to browse topics
</message>
+ <message desc="Spoken to give supplemental information when focusing the main menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_MAIN_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
+ Swipe left or right with one finger to browse topics
+ </message>
<message desc="Spoken to give supplemental information when focusing the lesson menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to browse lessons for this topic
</message>
+ <message desc="Spoken to give supplemental information when focusing the lesson menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_LESSON_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
+ Swipe left or right with one finger to browse lessons for this topic
+ </message>
<message desc="Spoken to give supplemental information when focusing lesson titles in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_TITLE_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to navigate this lesson
</message>
+ <message desc="Spoken to give supplemental information when focusing the main menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_LESSON_TITLE_DESCRIPTION" is_accessibility_with_no_ui="true">
+ Swipe left or right with one finger to navigate this lesson
+ </message>
<message desc="Text content for the 'Welcome to ChromeVox!' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_INTRO_TEXT">
Welcome to the ChromeVox tutorial. To exit this tutorial at any time, press the Escape key on the top left corner of the keyboard. To turn off ChromeVox, hold Control and Alt, and press Z. When you're ready, use the spacebar to move to the next lesson.
</message>
@@ -3213,4 +3243,76 @@
<message desc="A spoken announcement given in the tutorial if the user becomes inactive." name="IDS_CHROMEVOX_TUTORIAL_HINT_EXIT" is_accessibility_with_no_ui="true">
Hint: Press Escape if you would like to exit this tutorial.
</message>
+ <message desc="Title for the intro lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_INTRO_TITLE">
+ ChromeVox touch tutorial
+ </message>
+ <message desc="Text content for the intro lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_INTRO_TEXT">
+ Welcome to the ChromeVox tutorial. To exit this tutorial at any time, swipe from right to left with two fingers. To turn ChromeVox on or off at any time, press and hold both Volume buttons for five seconds. When you’re ready, double-tap the screen with one finger to move to the next lesson.
+ </message>
+ <message desc="Title for the activate item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_ACTIVATE_TITLE">
+ Activate an item
+ </message>
+ <message desc="Text content for the activate item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_ACTIVATE_TEXT">
+ Let's start with a few gestures you'll use regularly. If you reach an item you want to activate, double-tap the screen with one finger. To continue, double-tap now.
+ </message>
+ <message desc="Title for the next/previous item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_NEXT_PREVIOUS_ITEM_TITLE">
+ Move to the next or previous item
+ </message>
+ <message desc="Text content for the next/previous item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_NEXT_ITEM_TEXT">
+ Next, you’ll learn how to move around the screen. You can swipe one finger from left to right to move to the next item. Try it now to move to the next step.
+ </message>
+ <message desc="Text content for the next/previous item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_PREVIOUS_ITEM_TEXT">
+ You can also swipe one finger from right to left to move to the previous item. Try it now.
+ </message>
+ <message desc="Text content for the next/previous item lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_NEXT_PREVIOUS_CONTINUE_TEXT">
+ Once you’ve had some practice, find the Next lesson button. Then double-tap to continue.
+ </message>
+ <message desc="Title for the touch explore lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TOUCH_EXPLORE_TITLE">
+ Explore by touch
+ </message>
+ <message desc="Text content for the touch explore lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TOUCH_EXPLORE_TEXT">
+ You can also move around by dragging one finger around the screen. This is called exploring by touch. Try dragging your finger around to read the rest of this lesson.
+ </message>
+ <message desc="Text content for the touch explore lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TOUCH_EXPLORE_MORE_TEXT">
+ Exploring by touch can help you quickly get a sense of what's on the screen.
+ </message>
+ <message desc="Text content for the touch explore lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TOUCH_EXPLORE_EFFICIENCY_TEXT">
+ It can also be more efficient than swiping left and right with one finger.
+ </message>
+ <message desc="Text content for the touch explore lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_TOUCH_EXPLORE_CONTINUE_TEXT">
+ To continue, explore by touch to find the Next lesson button. Then double-tap to continue.
+ </message>
+ <message desc="Title for the stop speech lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_STOP_SPEECH_TITLE">
+ Stop speech
+ </message>
+ <message desc="Text content for the stop speech lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_STOP_SPECH_TEXT">
+ Tapping the screen with two fingers can be used to stop any current speech. This is useful if you don’t want ChromeVox to read something. To continue, tap the screen with two fingers.
+ </message>
+ <message desc="Title for the menus lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_MENUS_TITLE">
+ Access menus
+ </message>
+ <message desc="Text content for the menus lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_MENUS_TEXT">
+ Tapping the screen with four fingers will open and close the ChromeVox menus. These menus contain helpful information about commands and shortcuts. Once the menus are open, you can swipe with one finger to navigate through items, and double-tap to activate items. To continue, tap the screen with four fingers.
+ </message>
+ <message desc="Title for the next/previous section lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_NEXT_PREVIOUS_SECTION_TITLE">
+ Move to the next or previous section
+ </message>
+ <message desc="Text content for the next/previous section lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_NEXT_SECTION_TEXT">
+ You can also move between sections of the screen. For example, you can move between the launcher, the shelf, and your Chrome tabs. To move to the next section, swipe from left to right with four fingers. Try it now to continue.
+ </message>
+ <message desc="Text content for the next/previous section lesson in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_PREVIOUS_SECTION_TEXT">
+ Similarly, swiping from right to left with four fingers can be used to move to the previous section. Try it now!
+ </message>
+ <message desc="Title for the congratulations page in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_COMPLETE_TITLE">
+ Touch tutorial complete
+ </message>
+ <message desc="Text content for the congratulations page in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_COMPLETE_TEXT">
+ Well done! You’ve learned the basics of ChromeVox touch. You can go through the tutorial again or exit this tutorial using the buttons below.
+ </message>
+ <message desc="Text content for the congratulations page in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_COMPLETE_HELP_CENTER_TEXT">
+ For a full list of gestures, visit the help center.
+ </message>
+ <message desc="Text content for the congratulations page in the touch orientation." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_ORIENTATION_COMPLETE_MORE_TUTORIALS_TEXT">
+ You can always view tutorials by opening the menus with a four-finger tap. Then activate the tutorial under the “ChromeVox” section.
+ </message>
</grit-part>
diff --git a/chromium/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn b/chromium/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
index 50a30d6886e..2df59e05a94 100644
--- a/chromium/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
@@ -33,7 +33,7 @@ js_library("edu_coexistence_app") {
":edu_coexistence_offline",
":edu_coexistence_ui",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
diff --git a/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn b/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
index c3799270451..1cd4e063bc6 100644
--- a/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
@@ -36,7 +36,7 @@ js_library("app") {
":edu_login_signin",
":edu_login_util",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:assert.m",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn b/chromium/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
index 10ba19a0d9f..5cc28368f4e 100644
--- a/chromium/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
@@ -29,6 +29,7 @@ fuse_grdp_file = "$target_gen_dir/fuse.grdp"
generate_grd("build_grd") {
deps = [
":build_fuse_grdp",
+ ":build_mojo_grdp",
":build_preprocessed_grdp",
":emoji_data",
]
@@ -40,14 +41,28 @@ generate_grd("build_grd") {
"index.html",
"store.js",
"types.js",
+ "emoji_picker_api_proxy.js",
]
grdp_files = [
preprocessed_grdp_file,
fuse_grdp_file,
+ "$target_gen_dir/mojo_resources.grdp",
]
input_files_base_dir = rebase_path(".", "//")
}
+generate_grd("build_mojo_grdp") {
+ grd_prefix = "emoji_picker"
+ out_grd = "$target_gen_dir/mojo_resources.grdp"
+ deps = [ "//chrome/browser/ui/webui/chromeos/emoji:mojo_bindings_webui_js" ]
+ input_files = [ "emoji_picker.mojom-webui.js" ]
+ input_files_base_dir =
+ rebase_path(
+ "${root_gen_dir}/mojom-webui/chrome/browser/ui/webui/chromeos/emoji",
+ "$root_build_dir")
+ resource_path_rewrites = [ "emoji-picker.mojom-webui.js|chrome/browser/ui/webui/chromeos/emoji/emoji-picker.mojom-webui.js" ]
+}
+
generate_grd("build_preprocessed_grdp") {
deps = [ ":web_components" ]
grd_prefix = "emoji_picker"
@@ -111,6 +126,7 @@ js_library("emoji_picker") {
":constants",
":emoji_group",
":emoji_group_button",
+ ":emoji_picker_api_proxy",
":emoji_search",
":events",
":store",
@@ -121,6 +137,13 @@ js_library("emoji_picker") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
+js_library("emoji_picker_api_proxy") {
+ deps = [
+ "//chrome/browser/ui/webui/chromeos/emoji:mojo_bindings_webui_js",
+ "//ui/webui/resources/js:cr.m",
+ ]
+}
+
js_library("emoji_group_button") {
deps = [
":events",
@@ -159,7 +182,7 @@ js_library("emoji_search") {
deps = [
":types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
}
@@ -185,12 +208,19 @@ js_library("store") {
js_type_check("closure_compile") {
is_polymer3 = true
+ closure_flags = default_closure_args + mojom_js_args + [
+ "js_module_root=" + rebase_path(".", root_build_dir),
+ "js_module_root=" + rebase_path(
+ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/chromeos/emoji",
+ root_build_dir),
+ ]
deps = [
":constants",
":emoji_button",
":emoji_group",
":emoji_group_button",
":emoji_picker",
+ ":emoji_picker_api_proxy",
":emoji_search",
":emoji_variants",
":events",
diff --git a/chromium/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chromium/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
index 6737980bfab..89cbb2da24f 100644
--- a/chromium/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -10,6 +10,7 @@ import("//ui/webui/resources/tools/generate_grd.gni")
import("../../tools/optimize_webui.gni")
preprocess_folder = "preprocessed"
+preprocess_manifest = "preprocessed_manifest.json"
preprocess_gen_manifest = "preprocessed_gen_manifest.json"
if (optimize_webui) {
@@ -17,19 +18,22 @@ if (optimize_webui) {
optimize_webui("build") {
host = "internet-detail-dialog"
- js_out_files = [ "internet_detail_dialog.rollup.js" ]
- js_module_in_files = [ "internet_detail_dialog.js" ]
+ js_out_files = [ "internet_detail_dialog_container.rollup.js" ]
+ js_module_in_files = [ "internet_detail_dialog_container.js" ]
input = rebase_path("$target_gen_dir/$preprocess_folder", root_build_dir)
out_manifest = "$target_gen_dir/$build_manifest"
excludes = [
"chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js",
+ "chrome://resources/cr_components/chromeos/network/mojo_interface_provider.m.js",
"chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js",
"chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
"chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js",
+ "chrome://resources/js/cr.m.js",
]
deps = [
+ ":preprocess",
":preprocess_generated",
"../../../../../ui/webui/resources:preprocess",
]
@@ -41,17 +45,32 @@ generate_grd("build_grd") {
input_files_base_dir = rebase_path(".", "//")
if (optimize_webui) {
deps = [ ":build" ]
- resource_path_rewrites =
- [ "internet_detail_dialog.rollup.js|internet_detail_dialog.js" ]
+ resource_path_rewrites = [ "internet_detail_dialog_container.rollup.js|internet_detail_dialog_container.js" ]
manifest_files = [ "$target_gen_dir/$build_manifest" ]
} else {
- deps = [ ":preprocess_generated" ]
- manifest_files = [ "$target_gen_dir/$preprocess_gen_manifest" ]
+ deps = [
+ ":preprocess",
+ ":preprocess_generated",
+ ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_manifest",
+ "$target_gen_dir/$preprocess_gen_manifest",
+ ]
}
grd_prefix = "internet_detail_dialog"
out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
}
+preprocess_if_expr("preprocess") {
+ in_folder = "./"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_manifest"
+ in_files = [
+ "internet_detail_dialog_browser_proxy.js",
+ "internet_detail_dialog_container.js",
+ ]
+}
+
preprocess_if_expr("preprocess_generated") {
deps = [ ":web_components" ]
in_folder = target_gen_dir
@@ -62,7 +81,10 @@ preprocess_if_expr("preprocess_generated") {
js_type_check("closure_compile") {
is_polymer3 = true
- deps = [ ":internet_detail_dialog" ]
+ deps = [
+ ":internet_detail_dialog",
+ ":internet_detail_dialog_browser_proxy",
+ ]
}
js_library("internet_detail_dialog") {
@@ -76,6 +98,10 @@ js_library("internet_detail_dialog") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
+js_library("internet_detail_dialog_browser_proxy") {
+ deps = [ "//ui/webui/resources/js:cr.m" ]
+}
+
html_to_js("web_components") {
js_files = [ "internet_detail_dialog.js" ]
}
diff --git a/chromium/chrome/browser/resources/chromeos/login/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
index 34c80d54fcb..e17e776adc5 100644
--- a/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -4,53 +4,58 @@
import("//chrome/test/base/js2gtest.gni")
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+
+assert(is_chromeos, "OOBE UI is only available on ChromeOS builds")
+
+grit("resources") {
+ source = "oobe_resources.grd"
+ outputs = [
+ "grit/oobe_resources.h",
+ "oobe_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
group("closure_compile") {
deps = [
":closure_compile_local",
+ ":closure_compile_local_with_externs",
"components:closure_compile",
+ "screens/login:closure_compile",
+ "screens/oobe:closure_compile",
"test_api:closure_compile",
]
}
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ deps = [
+ "components:closure_compile_module",
+ ]
+}
+
js_type_check("closure_compile_local") {
uses_legacy_modules = true
deps = [
- ":active_directory_password_change",
":app_downloading",
":arc_terms_of_service",
- ":demo_preferences",
- ":demo_setup",
":device_disabled",
- ":encryption_migration",
":family_link_notice",
":fingerprint_setup",
":gaia_buttons",
- ":gaia_card",
":gaia_header",
":gaia_input_form",
- ":gaia_password_changed",
":gesture_navigation",
":marketing_opt_in",
":multidevice_setup_first_run",
- ":navigation_bar",
- ":network_select_login",
":notification_card",
":offline_ad_login",
- ":offline_login",
":oobe_a11y_option",
":oobe_enable_kiosk",
- ":oobe_eula",
- ":oobe_hid_detection",
- ":oobe_i18n_dropdown",
- ":oobe_network",
":oobe_reset",
":oobe_screen_assistant_optin_flow",
- ":oobe_screen_auto_enrollment_check",
":oobe_screen_autolaunch",
- ":oobe_screen_enable_debugging",
- ":oobe_select",
- ":oobe_supervision_transition",
":oobe_update",
":oobe_welcome",
":parental_handoff",
@@ -61,15 +66,23 @@ js_type_check("closure_compile_local") {
":screen_tpm_error",
":screen_wrong_hwid",
":sync_consent",
- ":update_required_card",
":user_creation",
]
}
+# Authenticator dependency transitively adds lots of types that
+# are not properly handled in other screens yet. This separate target
+# allows to avoid errors. OOBE should migrate to full type usage in the future.
+# TODO(crbug.com/1187024): Make all oobe elements compile with externs.
+js_type_check("closure_compile_local_with_externs") {
+ uses_legacy_modules = true
+ deps = [ ":gaia_dialog" ]
+}
+
###############################
# Closure compiler libraries below
-js_library("oobe_select") {
+js_library("login_ui_tools") {
}
js_library("oobe_welcome") {
@@ -77,17 +90,17 @@ js_library("oobe_welcome") {
"components:fake_oobe",
"components:login_screen_behavior",
"components:oobe_modal_dialog",
+ "components:oobe_select",
"components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
- "//ui/webui/resources/js/cr/ui:dialogs",
]
externs_list = [ "$externs_path/tts.js" ]
}
js_library("offline_ad_login") {
deps = [
- ":oobe_select",
"components:login_screen_behavior",
+ "components:oobe_select",
"components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
@@ -106,13 +119,6 @@ js_library("multidevice_setup_first_run") {
]
}
-js_library("active_directory_password_change") {
- deps = [
- "components/oobe_dialog:oobe_dialog",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("app_downloading") {
deps = [
"components:login_screen_behavior",
@@ -125,7 +131,9 @@ js_library("app_downloading") {
js_library("arc_terms_of_service") {
deps = [
+ ":web_view_helper",
"components:oobe_modal_dialog",
+ "components:oobe_select",
"components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
@@ -133,25 +141,6 @@ js_library("arc_terms_of_service") {
]
}
-js_library("demo_preferences") {
- deps = [
- "components:login_screen_behavior",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
-js_library("demo_setup") {
- deps = [
- "components:login_screen_behavior",
- "components:multi_step_behavior",
- "components/oobe_dialog:oobe_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("device_disabled") {
deps = [
"components:login_screen_behavior",
@@ -161,16 +150,6 @@ js_library("device_disabled") {
]
}
-js_library("encryption_migration") {
- deps = [
- "components:login_screen_behavior",
- "components:multi_step_behavior",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("family_link_notice") {
deps = [
"components:login_screen_behavior",
@@ -193,7 +172,15 @@ js_library("fingerprint_setup") {
js_library("gaia_buttons") {
}
-js_library("gaia_card") {
+js_library("gaia_dialog") {
+ deps = [
+ "components:fake_authenticator",
+ "components/oobe_content_dialog:oobe_content_dialog",
+ "components/oobe_dialog:oobe_dialog",
+ "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "//ui/webui/resources/js:cr",
+ ]
}
js_library("gaia_header") {
@@ -202,17 +189,6 @@ js_library("gaia_header") {
js_library("gaia_input_form") {
}
-js_library("gaia_password_changed") {
- deps = [
- "components:login_screen_behavior",
- "components:multi_step_behavior",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- "components/oobe_loading_dialog:oobe_loading_dialog",
- "//ui/login:login_ui_tools",
- ]
-}
-
js_library("gesture_navigation") {
deps = [
"components:login_screen_behavior",
@@ -229,28 +205,9 @@ js_library("marketing_opt_in") {
]
}
-js_library("navigation_bar") {
-}
-
-js_library("network_select_login") {
- deps = [
- "//ui/webui/resources/cr_components/chromeos/network:network_select",
- "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
- ]
-}
-
js_library("notification_card") {
}
-js_library("offline_login") {
- deps = [
- "components:login_screen_behavior",
- "components/oobe_content_dialog:oobe_content_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("oobe_a11y_option") {
}
@@ -273,40 +230,6 @@ js_library("oobe_enable_kiosk") {
]
}
-js_library("oobe_eula") {
- deps = [
- ":web_view_helper",
- "components:login_screen_behavior",
- "components:oobe_modal_dialog",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
-js_library("oobe_hid_detection") {
- deps = [
- "components:login_screen_behavior",
- "components:oobe_modal_dialog",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
-js_library("oobe_i18n_dropdown") {
- deps = [ "components:oobe_types" ]
-}
-
-js_library("oobe_network") {
- deps = [
- ":network_select_login",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("oobe_reset") {
deps = [
"components:oobe_modal_dialog",
@@ -325,15 +248,6 @@ js_library("oobe_screen_assistant_optin_flow") {
]
}
-js_library("oobe_screen_auto_enrollment_check") {
- deps = [
- "components:login_screen_behavior",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- "components/oobe_loading_dialog:oobe_loading_dialog",
- ]
-}
-
js_library("oobe_screen_autolaunch") {
deps = [
"components:login_screen_behavior",
@@ -343,31 +257,13 @@ js_library("oobe_screen_autolaunch") {
]
}
-js_library("oobe_screen_enable_debugging") {
- deps = [
- "components:login_screen_behavior",
- "components:multi_step_behavior",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- "components/oobe_loading_dialog:oobe_loading_dialog",
- ]
-}
-
-js_library("oobe_supervision_transition") {
- deps = [
- "components:login_screen_behavior",
- "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("oobe_update") {
deps = [
"components:login_screen_behavior",
- "components/oobe_dialog:oobe_dialog",
+ "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "components/oobe_loading_dialog:oobe_loading_dialog",
]
}
@@ -397,9 +293,10 @@ js_library("recommend_apps") {
"components:login_screen_behavior",
"components:multi_step_behavior",
"components:oobe_types",
- "components/oobe_dialog:oobe_dialog",
+ "components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "components/oobe_loading_dialog:oobe_loading_dialog",
]
}
@@ -416,21 +313,22 @@ js_library("user_creation") {
js_library("saml_confirm_password") {
deps = [
+ ":login_ui_tools",
"components:oobe_modal_dialog",
"components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
"components/oobe_loading_dialog:oobe_loading_dialog",
- "//ui/login:login_ui_tools",
]
}
js_library("screen_error_message") {
deps = [
+ "components:display_manager_types",
"components:login_screen_behavior",
+ "components:network_select_login",
"components/oobe_adaptive_dialog:oobe_adaptive_dialog",
"components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"components/oobe_i18n_behavior:oobe_i18n_behavior",
- "//ui/login:display_manager_types",
]
}
@@ -461,16 +359,5 @@ js_library("sync_consent") {
]
}
-js_library("update_required_card") {
- deps = [
- "components:login_screen_behavior",
- "components:multi_step_behavior",
- "components:oobe_modal_dialog",
- "components/oobe_dialog:oobe_dialog",
- "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
- "components/oobe_i18n_behavior:oobe_i18n_behavior",
- ]
-}
-
js_library("web_view_helper") {
}
diff --git a/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
index 21a8fbb2b0b..6dfe374db7c 100644
--- a/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -4,11 +4,14 @@
import("//chrome/test/base/js2gtest.gni")
import("//third_party/closure_compiler/compile_js.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/polymer.gni")
group("closure_compile") {
deps = [
":closure_compile_local",
"hd_iron_icon:closure_compile",
+ "oobe_adaptive_dialog:closure_compile",
"oobe_carousel:closure_compile",
"oobe_content_dialog:closure_compile",
"oobe_dialog_host_behavior:closure_compile",
@@ -28,46 +31,119 @@ js_type_check("closure_compile_local") {
":html-echo",
":login_screen_behavior",
":multi_step_behavior",
+ ":network_select_login",
":oobe_buttons",
+ ":oobe_i18n_dropdown",
":oobe_modal_dialog",
+ ":oobe_select",
":oobe_types",
]
}
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ deps = [
+ ":display_manager_types.m",
+ ":login_screen_behavior.m",
+ ":multi_step_behavior.m",
+ ]
+}
+
###############################
# Closure compiler libraries below
js_library("oobe_types") {
}
+js_library("display_manager_types") {
+}
+
# This is special file to be used as a substutute of Oobe object for closure
# compilation until we make real one closure compile.
# TODO (https://crbug.com/950198)
js_library("fake_oobe") {
deps = [
+ ":display_manager_types",
":oobe_types",
- "//ui/login:display_manager_types",
"//ui/webui/resources/js:util",
]
}
+# This is special file to be used as a substitute of Authenticaor object for
+# closure compilation until OOBE migrates to modules.
+js_library("fake_authenticator") {
+ deps = [ "//ui/webui/resources/js:cr" ]
+ externs_list = [
+ "$externs_path/chrome_extensions.js",
+ "$externs_path/webview_tag.js",
+ ]
+}
+
js_library("login_screen_behavior") {
deps = [
+ ":display_manager_types",
":fake_oobe",
- "//ui/login:display_manager_types",
]
}
js_library("multi_step_behavior") {
}
+js_library("network_select_login") {
+ deps = [
+ "//ui/webui/resources/cr_components/chromeos/network:network_select",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
+ ]
+}
+
js_library("oobe_buttons") {
deps = [ "oobe_i18n_behavior:oobe_i18n_behavior" ]
}
+js_library("oobe_i18n_dropdown") {
+ deps = [
+ ":oobe_select",
+ ":oobe_types",
+ ]
+}
+
js_library("oobe_modal_dialog") {
deps = [ "oobe_i18n_behavior:oobe_i18n_behavior" ]
}
+js_library("oobe_select") {
+}
+
js_library("html-echo") {
}
+
+#### Polymer3 / JS Modules
+
+js_library("display_manager_types.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/display_manager_types.m.js" ]
+ deps = []
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("login_screen_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/login_screen_behavior.m.js" ]
+ deps = [
+ ":display_manager_types.m"
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("multi_step_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/multi_step_behavior.m.js" ]
+ deps = []
+ extra_deps = [ ":modulize" ]
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "display_manager_types.js",
+ "login_screen_behavior.js",
+ "multi_step_behavior.js",
+ ]
+ namespace_rewrites = []
+} \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn
index bcb52ad4050..e9a0737f444 100644
--- a/chromium/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn
@@ -5,6 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
js_type_check("closure_compile") {
+ uses_legacy_modules = true
deps = [
":oobe_adaptive_dialog",
":oobe_adaptive_dialog_old",
@@ -19,6 +20,7 @@ js_library("oobe_adaptive_dialog") {
js_library("oobe_adaptive_dialog_old") {
deps = [
"../oobe_dialog:oobe_dialog",
+ "../oobe_focus_behavior:oobe_focus_behavior",
"../oobe_i18n_behavior:oobe_i18n_behavior",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
]
diff --git a/chromium/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn
index 1150036f3d8..187be27245b 100644
--- a/chromium/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn
@@ -13,5 +13,6 @@ js_library("oobe_loading_dialog") {
"../oobe_content_dialog:oobe_content_dialog",
"../oobe_dialog_host_behavior:oobe_dialog_host_behavior",
"../oobe_i18n_behavior:oobe_i18n_behavior",
+ "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/login/oobe_animation_resources.grdp b/chromium/chrome/browser/resources/chromeos/login/oobe_animation_resources.grdp
new file mode 100644
index 00000000000..90a97243ea4
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/oobe_animation_resources.grdp
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <!-- OOBE Animations -->
+ <if expr="_google_chrome">
+ <!-- ARC Apps dowloading animation. -->
+ <include type="BINDATA" name="IDR_OOBE_ARC_APPS_DOWNLOADING_VIDEO" resource_path="res/arc_app_dowsnloading.mp4" file="../../../internal/resources/arc_support/videos/app_downloading.mp4" />
+ </if>
+
+ <!-- Gesture Navigation animations. -->
+ <include type="BINDATA" compress="gzip" name="IDR_GESTURE_NAVIGATION_GO_HOME_ANIMATION" resource_path="gesture_go_home.json" file="images/gesture_go_home.json" />
+ <include type="BINDATA" compress="gzip" name="IDR_GESTURE_NAVIGATION_GO_BACK_ANIMATION" resource_path="gesture_go_back.json" file="images/gesture_go_back.json" />
+ <include type="BINDATA" compress="gzip" name="IDR_GESTURE_NAVIGATION_HOTSEAT_OVERVIEW_ANIMATION" resource_path="gesture_hotseat_overview.json" file="images/gesture_hotseat_overview.json" />
+
+ <!-- Marketing Opt In animations. -->
+ <include type="BINDATA" compress="gzip" name="IDR_MARKETING_OPT_IN_ALL_SET_ANIMATION" resource_path="all_set.json" file="images/all_set.json" />
+ <include type="BINDATA" compress="gzip" name="IDR_MARKETING_OPT_IN_ALL_SET_ANIMATION_NEW_NOLOOP" resource_path="all_set_new_noloop.json" file="images/all_set_new_noloop.json" />
+
+ <!-- Multi-device Setup animation. -->
+ <include type="BINDATA" compress="gzip" name="IDR_MULTIDEVICE_SETUP_ANIMATION" resource_path="multidevice_setup.json" file="images/multidevice_setup.json" />
+
+ <!-- Apps downloading animation. -->
+ <include type="BINDATA" compress="gzip" name="IDR_APPS_DOWNLOADING_ANIMATION" resource_path="downloading_apps.json" file="images/downloading_apps.json" />
+
+ <!-- Loading step animation. -->
+ <include type="BINDATA" compress="gzip" name="IDR_LOGIN_SPINNER_ANIMATION" resource_path="spinner.json" file="images/spinner.json" />
+</grit-part>
diff --git a/chromium/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp b/chromium/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp
new file mode 100644
index 00000000000..a5997b14199
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <!-- OOBE Components -->
+ <include name="IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_HTML" file="components/oobe_i18n_behavior/oobe_i18n_behavior.html" resource_path="components/oobe_i18n_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_JS" file="components/oobe_i18n_behavior/oobe_i18n_behavior.js" resource_path="components/oobe_i18n_behavior.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_I18N_SETUP_HTML" file="components/oobe_i18n_behavior/i18n_setup.html" resource_path="components/i18n_setup.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_DIALOG_HOST_BEHAVIOR_HTML" file="components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.html" resource_path="components/oobe_dialog_host_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_DIALOG_HOST_BEHAVIOR_JS" file="components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js" resource_path="components/oobe_dialog_host_behavior.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_HTML" file="components/oobe_focus_behavior/oobe_focus_behavior.html" resource_path="components/oobe_focus_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_JS" file="components/oobe_focus_behavior/oobe_focus_behavior.js" resource_path="components/oobe_focus_behavior.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_HTML" file="components/oobe_scrollable_behavior/oobe_scrollable_behavior.html" resource_path="components/oobe_scrollable_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_JS" file="components/oobe_scrollable_behavior/oobe_scrollable_behavior.js" resource_path="components/oobe_scrollable_behavior.js" type="chrome_html" />
+
+ <include name="IDR_OOBE_COMPONENTS_LOGIN_SCREEN_BEHAVIOR_HTML" file="components/login_screen_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_LOGIN_SCREEN_BEHAVIOR_JS" file="components/login_screen_behavior.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_MULTI_STEP_BEHAVIOR_HTML" file="components/multi_step_behavior.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_MULTI_STEP_BEHAVIOR_JS" file="components/multi_step_behavior.js" type="chrome_html" />
+
+ <include name="IDR_OOBE_COMPONENTS_HD_IRON_ICON_HTML" file="components/hd_iron_icon/hd_iron_icon.html" resource_path="components/hd_iron_icon.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_HD_IRON_ICON_JS" file="components/hd_iron_icon/hd_iron_icon.js" resource_path="components/hd_iron_icon.js" type="chrome_html" />
+
+ <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_HTML" file="components/oobe_dialog/oobe_dialog.html" resource_path="components/oobe_dialog.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_JS" file="components/oobe_dialog/oobe_dialog.js" resource_path="components/oobe_dialog.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_HTML" file="components/oobe_loading_dialog/oobe_loading_dialog.html" resource_path="components/oobe_loading_dialog.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_JS" file="components/oobe_loading_dialog/oobe_loading_dialog.js" resource_path="components/oobe_loading_dialog.js" type="chrome_html" />
+
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_HTML" file="components/oobe_carousel/oobe_carousel.html" resource_path="components/oobe_carousel.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_JS" file="components/oobe_carousel/oobe_carousel.js" resource_path="components/oobe_carousel.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_SLIDE_HTML" file="components/oobe_slide/oobe_slide.html" resource_path="components/oobe_slide.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_SLIDE_JS" file="components/oobe_slide/oobe_slide.js" resource_path="components/oobe_slide.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_PROGRESS_LIST_ITEM_HTML" file="components/progress_list_item/progress_list_item.html" resource_path="components/progress_list_item.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_PROGRESS_LIST_ITEM_JS" file="components/progress_list_item/progress_list_item.js" resource_path="components/progress_list_item.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_THROBBER_NOTICE_HTML" file="components/throbber_notice/throbber_notice.html" resource_path="components/throbber_notice.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_THROBBER_NOTICE_JS" file="components/throbber_notice/throbber_notice.js" resource_path="components/throbber_notice.html" type="chrome_html" />
+</grit-part>
diff --git a/chromium/chrome/browser/resources/chromeos/login/oobe_image_resources.grdp b/chromium/chrome/browser/resources/chromeos/login/oobe_image_resources.grdp
new file mode 100644
index 00000000000..83181e176a7
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/oobe_image_resources.grdp
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <!-- OOBE Images -->
+ <include type="BINDATA" name="IDR_SUPERVISION_ICON_PNG" resource_path="supervision_icon.png" file="..\supervision\supervision_icon.png" />
+</grit-part>
diff --git a/chromium/chrome/browser/resources/chromeos/login/oobe_resources.grd b/chromium/chrome/browser/resources/chromeos/login/oobe_resources.grd
new file mode 100644
index 00000000000..0983131118b
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/oobe_resources.grd
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+ <outputs>
+ <output filename="grit/oobe_resources.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="oobe_resources.pak" type="data_package" />
+ </outputs>
+ <release seq="1">
+ <structures>
+ <!-- Resources in this section still depend on flattenhtml -->
+ <structure name="IDR_MD_LOGIN_HTML" file="md_login.html" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
+ <structure name="IDR_MD_LOGIN_JS" file="md_login.js" flattenhtml="true" type="chrome_html" />
+ <structure name="IDR_OOBE_HTML" file="oobe.html" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
+ <structure name="IDR_OOBE_JS" file="oobe.js" flattenhtml="true" type="chrome_html" />
+
+ <structure name="IDR_CUSTOM_ELEMENTS_OOBE_HTML" file="structure\components_common.html" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
+ <structure name="IDR_CUSTOM_ELEMENTS_OOBE_JS" file="structure\components_common.js" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true" />
+ <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_HTML" file="structure\components_common.html" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
+ <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_JS" file="structure\components_common.js" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true" />
+
+ <structure name="IDR_OOBE_DEBUGGER_JS" file="debug\debug.js" flattenhtml="true" type="chrome_html" />
+ <structure name="IDR_OOBE_DEBUGGER_STUB_JS" file="debug\no_debug.js" flattenhtml="true" type="chrome_html" />
+
+ <structure name="IDR_OOBE_COMPONENTS_COMMON_STYLES_HTML" file="components/common_styles/common_styles.html" type="chrome_html" flattenhtml="true"/>
+ </structures>
+ <includes>
+ <!-- Resources that are served under fixed paths -->
+
+ <part file="oobe_image_resources.grdp" />
+ <part file="oobe_animation_resources.grdp" />
+ <part file="oobe_components_resources.grdp" />
+
+ <!-- Resources that are dynamically chosen to be served in runtime -->
+
+ <!-- New layout (oobe_adaptive_dialog and oobe_content_dialog) corresponds OOBE redesign which has happened in November 2020 -->
+ <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_HTML" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_JS" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_HTML" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_JS" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_HTML" file="components/oobe_content_dialog/oobe_content_dialog.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_JS" file="components/oobe_content_dialog/oobe_content_dialog.js" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_HTML" file="components/oobe_content_dialog/oobe_content_dialog_old.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_JS" file="components/oobe_content_dialog/oobe_content_dialog_old.js" type="chrome_html" />
+
+ <!-- OOBE CSS Vars -->
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_OLD_CSS_HTML" file="components/oobe_vars/oobe_custom_vars_old_css.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_CSS_HTML" file="components/oobe_vars/oobe_custom_vars_css.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_REMORA_CSS_HTML" file="components/oobe_vars/oobe_custom_vars_remora_css.html" type="chrome_html" />
+ <include name="IDR_OOBE_COMPONENTS_OOBE_SHARED_VARS_CSS_HTML" file="components/oobe_vars/oobe_shared_vars_css.html" type="chrome_html" />
+
+ <!-- OOBE Test API -->
+ <include name="IDR_OOBE_TEST_API_JS" file="test_api\test_api.js" type="chrome_html" />
+ <include name="IDR_OOBE_TEST_API_STUB_JS" file="test_api\no_test_api.js" type="chrome_html" />
+ </includes>
+ </release>
+</grit>
diff --git a/chromium/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
new file mode 100644
index 00000000000..5d6129934a2
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
@@ -0,0 +1,94 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/test/base/js2gtest.gni")
+import("//third_party/closure_compiler/compile_js.gni")
+
+group("closure_compile") {
+ deps = [ ":closure_compile_local" ]
+}
+
+js_type_check("closure_compile_local") {
+ uses_legacy_modules = true
+ deps = [
+ ":active_directory_password_change",
+ ":encryption_migration",
+ ":gaia_password_changed",
+ ":offline_login",
+ ":public_session_terms_of_service",
+ ":supervision_transition",
+ ":update_required_card",
+ ]
+}
+
+###############################
+# Closure compiler libraries below
+
+js_library("active_directory_password_change") {
+ deps = [
+ "../../components/oobe_dialog:oobe_dialog",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("encryption_migration") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("gaia_password_changed") {
+ deps = [
+ "../..:login_ui_tools",
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "../../components/oobe_loading_dialog:oobe_loading_dialog",
+ ]
+}
+
+js_library("offline_login") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components/oobe_content_dialog:oobe_content_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
+ ]
+}
+
+js_library("public_session_terms_of_service") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "../../components/oobe_loading_dialog:oobe_loading_dialog",
+ ]
+}
+
+js_library("supervision_transition") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("update_required_card") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components:oobe_modal_dialog",
+ "../../components/oobe_dialog:oobe_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
new file mode 100644
index 00000000000..6b8a0f840ec
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -0,0 +1,104 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/test/base/js2gtest.gni")
+import("//third_party/closure_compiler/compile_js.gni")
+
+group("closure_compile") {
+ deps = [ ":closure_compile_local" ]
+}
+
+js_type_check("closure_compile_local") {
+ uses_legacy_modules = true
+ deps = [
+ ":auto_enrollment_check",
+ ":demo_preferences",
+ ":demo_setup",
+ ":enable_debugging",
+ ":hid_detection",
+ ":oobe_eula",
+ ":oobe_network",
+ ":packaged_license",
+ ]
+}
+
+###############################
+# Closure compiler libraries below
+
+js_library("auto_enrollment_check") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "../../components/oobe_loading_dialog:oobe_loading_dialog",
+ ]
+}
+
+js_library("demo_preferences") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("demo_setup") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components/oobe_dialog:oobe_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("enable_debugging") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:multi_step_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ "../../components/oobe_loading_dialog:oobe_loading_dialog",
+ ]
+}
+
+js_library("hid_detection") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components:oobe_modal_dialog",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("oobe_eula") {
+ deps = [
+ "../..:web_view_helper",
+ "../../components:login_screen_behavior",
+ "../../components:oobe_modal_dialog",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("oobe_network") {
+ deps = [
+ "../../components:network_select_login",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
+
+js_library("packaged_license") {
+ deps = [
+ "../../components:login_screen_behavior",
+ "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog",
+ "../../components/oobe_dialog_host_behavior:oobe_dialog_host_behavior",
+ "../../components/oobe_i18n_behavior:oobe_i18n_behavior",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/chromeos/password_change/BUILD.gn b/chromium/chrome/browser/resources/chromeos/password_change/BUILD.gn
new file mode 100644
index 00000000000..05641dad36d
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/password_change/BUILD.gn
@@ -0,0 +1,41 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/common/features.gni")
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_js.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+preprocess_folder = "preprocessed"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+
+preprocess_if_expr("preprocess_generated") {
+ deps = [ ":web_components" ]
+ in_folder = target_gen_dir
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [ "lock_screen_network.js" ]
+}
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ deps = [ ":lock_screen_network" ]
+}
+
+js_library("lock_screen_network") {
+ deps = [
+ "//ui/webui/resources/cr_components/chromeos/network:network_select.m",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
+}
+
+html_to_js("web_components") {
+ js_files = [ "lock_screen_network.js" ]
+}
diff --git a/chromium/chrome/browser/resources/chromeos/vm/BUILD.gn b/chromium/chrome/browser/resources/chromeos/vm/BUILD.gn
new file mode 100644
index 00000000000..451208b4de7
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/vm/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ closure_flags = default_closure_args + mojom_js_args + [
+ "js_module_root=" + rebase_path(".", root_build_dir),
+ "js_module_root=" + rebase_path(
+ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/chromeos/vm/",
+ root_build_dir),
+ "js_module_root=" + rebase_path(
+ "$root_gen_dir/mojom-webui/chrome/browser/ash/guest_os/",
+ root_build_dir),
+ ]
+ deps = [ ":app" ]
+}
+
+js_library("app") {
+ deps = [
+ "//chrome/browser/ui/webui/chromeos/vm:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
+}
+
+polymer_modulizer("app") {
+ js_file = "app.js"
+ html_file = "app.html"
+ html_type = "v3-ready"
+}
+
+group("polymer3_elements") {
+ public_deps = [ ":app_module" ]
+}
diff --git a/chromium/chrome/browser/resources/component_extension_resources.grd b/chromium/chrome/browser/resources/component_extension_resources.grd
index 349356fa190..33fcd16983e 100644
--- a/chromium/chrome/browser/resources/component_extension_resources.grd
+++ b/chromium/chrome/browser/resources/component_extension_resources.grd
@@ -24,8 +24,6 @@
<include name="IDR_BRAILLE_IME_MAIN_JS" file="chromeos/accessibility/braille_ime/main.js" type="BINDATA" />
</if>
- <!-- Bookmarks -->
- <include name="IDR_COMPONENT_BOOKMARKS_BOOKMARKS_HTML" file="bookmarks/bookmarks.html" type="BINDATA" />
<!-- Hangout Services extension, included in Google Chrome builds only. -->
<if expr="_google_chrome or enable_hangout_services_extension">
<include name="IDR_HANGOUT_SERVICES_BACKGROUND_HTML" file="hangout_services/background.html" type="BINDATA" />
@@ -97,6 +95,7 @@
<include name="IDR_ARC_SUPPORT_ICON_HEADER" file="chromeos/arc_support/images/header.png" type="BINDATA" />
<include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_JS" file="chromeos/arc_support/recommend_app_list_view.js" type="BINDATA" />
<include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML" file="chromeos/arc_support/recommend_app_list_view.html" type="chrome_html" flattenhtml="true" />
+ <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_NEW_HTML" file="chromeos/arc_support/recommend_app_list_view_new.html" type="chrome_html" flattenhtml="true" />
</if>
<include name="IDR_CRYPTOTOKEN_UTIL_JS" file="cryptotoken/util.js" type="BINDATA" />
<include name="IDR_CRYPTOTOKEN_B64_JS" file="cryptotoken/b64.js" type="BINDATA" />
diff --git a/chromium/chrome/browser/resources/device_log_ui/device_log_ui.js b/chromium/chrome/browser/resources/device_log_ui/device_log_ui.js
index c4a211ecff1..6132c4f2c52 100644
--- a/chromium/chrome/browser/resources/device_log_ui/device_log_ui.js
+++ b/chromium/chrome/browser/resources/device_log_ui/device_log_ui.js
@@ -146,8 +146,8 @@ const DeviceLogUI = (function() {
* Gets log information from WebUI.
*/
document.addEventListener('DOMContentLoaded', function() {
- // Show all levels except 'Debug' by default.
- $('log-level-select').value = 'Event';
+ // Debug is the default level to show.
+ $('log-level-select').value = 'Debug';
$('log-level-select').onchange = requestLog;
// Show all types by default.
diff --git a/chromium/chrome/browser/resources/discards/discards_main.js b/chromium/chrome/browser/resources/discards/discards_main.js
index c0b6712289c..5238ea7f785 100644
--- a/chromium/chrome/browser/resources/discards/discards_main.js
+++ b/chromium/chrome/browser/resources/discards/discards_main.js
@@ -3,7 +3,7 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
-import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.m.js';
+import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.js';
import 'chrome://resources/polymer/v3_0/iron-location/iron-location.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import './database_tab.js';
diff --git a/chromium/chrome/browser/resources/download_internals/BUILD.gn b/chromium/chrome/browser/resources/download_internals/BUILD.gn
index a48e5274dc4..0b90251b58c 100644
--- a/chromium/chrome/browser/resources/download_internals/BUILD.gn
+++ b/chromium/chrome/browser/resources/download_internals/BUILD.gn
@@ -2,7 +2,40 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+generate_grd("build_grd") {
+ grd_prefix = "download_internals"
+ out_grd = "$target_gen_dir/resources.grd"
+ input_files = [
+ "download_internals_browser_proxy.js",
+ "download_internals.css",
+ "download_internals.html",
+ "download_internals.js",
+ "download_internals_visuals.js",
+ ]
+ input_files_base_dir = rebase_path(".", "//")
+}
+
+grit("resources") {
+ defines = chrome_grit_defines
+
+ # These arguments are needed since the grd is generated at build time.
+ enable_input_discovery_for_gn_analyze = false
+ source = "$target_gen_dir/resources.grd"
+ deps = [ ":build_grd" ]
+
+ outputs = [
+ "grit/download_internals_resources.h",
+ "grit/download_internals_resources_map.cc",
+ "grit/download_internals_resources_map.h",
+ "download_internals_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
js_type_check("closure_compile") {
deps = [
diff --git a/chromium/chrome/browser/resources/download_shelf/BUILD.gn b/chromium/chrome/browser/resources/download_shelf/BUILD.gn
new file mode 100644
index 00000000000..7527da9736d
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/BUILD.gn
@@ -0,0 +1,133 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/common/features.gni")
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_js.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
+
+preprocess_folder = "preprocessed"
+preprocess_manifest = "preprocessed_manifest.json"
+preprocess_web_components_manifest = "preprocessed_gen_manifest.json"
+preprocess_mojo_manifest = "preprocessed_mojo_manifest.json"
+
+generate_grd("build_grd") {
+ grd_prefix = "download_shelf"
+ out_grd = "$target_gen_dir/resources.grd"
+ input_files = [ "download_shelf.html" ]
+ input_files_base_dir = rebase_path(".", "//")
+ deps = [
+ ":preprocess",
+ ":preprocess_mojo",
+ ":preprocess_web_components",
+ ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_manifest",
+ "$target_gen_dir/$preprocess_mojo_manifest",
+ "$target_gen_dir/$preprocess_web_components_manifest",
+ ]
+}
+
+preprocess_if_expr("preprocess") {
+ in_folder = "./"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_manifest"
+ in_files = [ "download_shelf_api_proxy.js" ]
+}
+
+preprocess_if_expr("preprocess_mojo") {
+ deps = [ "//chrome/browser/ui/webui/download_shelf:mojo_bindings_webui_js" ]
+ in_folder =
+ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/download_shelf/"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_mojo_manifest"
+ in_files = [ "download_shelf.mojom-webui.js" ]
+}
+
+preprocess_if_expr("preprocess_web_components") {
+ deps = [ ":web_components" ]
+ in_folder = target_gen_dir
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_web_components_manifest"
+ in_files = [
+ "app.js",
+ "download_item.js",
+ "download_list.js",
+ ]
+}
+
+grit("resources") {
+ defines = chrome_grit_defines
+
+ # These arguments are needed since the grd is generated at build time.
+ enable_input_discovery_for_gn_analyze = false
+ source = "$target_gen_dir/resources.grd"
+ deps = [ ":build_grd" ]
+
+ outputs = [
+ "grit/download_shelf_resources.h",
+ "grit/download_shelf_resources_map.cc",
+ "grit/download_shelf_resources_map.h",
+ "download_shelf_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
+
+js_type_check("closure_compile") {
+ closure_flags = default_closure_args + mojom_js_args + [
+ "js_module_root=" + rebase_path(".", root_build_dir),
+ "js_module_root=" + rebase_path(
+ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/download_shelf",
+ root_build_dir),
+ ]
+ deps = [
+ ":app",
+ ":download_item",
+ ":download_list",
+ ":download_shelf_api_proxy",
+ ]
+}
+
+js_library("download_shelf_api_proxy") {
+ deps = [
+ "//chrome/browser/ui/webui/download_shelf:mojo_bindings_webui_js",
+ "//ui/webui/resources/js:cr.m",
+ ]
+ externs_list = [ "$externs_path/chrome_extensions.js" ]
+}
+
+js_library("download_item") {
+ deps = [
+ ":download_shelf_api_proxy",
+ "//ui/webui/resources/js:custom_element",
+ ]
+ externs_list = [ "$externs_path/chrome_extensions.js" ]
+}
+
+js_library("download_list") {
+ deps = [
+ ":download_item",
+ ":download_shelf_api_proxy",
+ "//ui/webui/resources/js:custom_element",
+ ]
+}
+
+js_library("app") {
+ deps = [
+ ":download_item",
+ ":download_list",
+ "//ui/webui/resources/js:custom_element",
+ ]
+}
+
+html_to_js("web_components") {
+ js_files = [
+ "app.js",
+ "download_item.js",
+ "download_list.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/download_shelf/OWNERS b/chromium/chrome/browser/resources/download_shelf/OWNERS
new file mode 100644
index 00000000000..69b164dd0fe
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/ui/webui/download_shelf/OWNERS
diff --git a/chromium/chrome/browser/resources/download_shelf/app.html b/chromium/chrome/browser/resources/download_shelf/app.html
new file mode 100644
index 00000000000..28469357f25
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/app.html
@@ -0,0 +1 @@
+<download-list></download-list>
diff --git a/chromium/chrome/browser/resources/download_shelf/app.js b/chromium/chrome/browser/resources/download_shelf/app.js
new file mode 100644
index 00000000000..0d23920700f
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/app.js
@@ -0,0 +1,15 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './download_list.js';
+
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
+
+export class DownloadShelfAppElement extends CustomElement {
+ static get template() {
+ return `{__html_template__}`;
+ }
+}
+
+customElements.define('download-shelf-app', DownloadShelfAppElement);
diff --git a/chromium/chrome/browser/resources/download_shelf/download_item.html b/chromium/chrome/browser/resources/download_shelf/download_item.html
new file mode 100644
index 00000000000..85a0a71482a
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_item.html
@@ -0,0 +1,107 @@
+<style>
+:host {
+ --item-width: 245px;
+ --pi: 3.14159265358979;
+ --google-green-700: 76, 175, 80;
+ --google-blue-600: 30, 136, 229;
+ --google-blue-700: 25, 118, 210;
+ --google-grey-500: 158, 158, 158;
+}
+
+.download-item {
+ align-items: center;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: row;
+ height: 100%;
+ overflow: hidden;
+ padding: 6px 8px;
+ position: relative;
+ user-select: none;
+ width: var(--item-width);
+}
+
+.progress {
+ --width: 24px;
+ --radius: calc(var(--width) / 2);
+ --stroke-width: 2px;
+
+ --download-progress: 0;
+ --indicator-color: var(--google-blue-600);
+
+ align-items: center;
+ display: flex;
+ flex: 0 0 var(--width);
+ height: var(--width);
+ justify-content: center;
+ margin: 0 0 0 8px;
+ position: relative;
+ width: var(--width);
+}
+
+[data-state=complete] .progress {
+ --indicator-color: var(--google-green-700);
+}
+
+[data-paused] .progress,
+[data-state=interrupted] .progress {
+ --indicator-color: var(--google-grey-500);
+}
+
+.progress-indicator {
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+
+.progress-circle,
+.progress-spinner {
+ cx: var(--radius);
+ cy: var(--radius);
+}
+
+.progress-circle {
+ fill: rgba(var(--indicator-color), 0.15);
+ r: var(--radius);
+}
+
+.progress-spinner {
+ --stroke-radius: calc(var(--radius) - var(--stroke-width) / 2.0);
+ --stroke-circumference: calc(var(--pi) * 2 * var(--stroke-radius));
+ --stroke-dash-size: calc(var(--stroke-circumference)
+ * var(--download-progress));
+
+ fill: none;
+ r: var(--stroke-radius);
+ stroke: rgb(var(--indicator-color));
+ stroke-dasharray: var(--stroke-dash-size), calc(var(--stroke-circumference)
+ - var(--stroke-dash-size));
+ stroke-dashoffset: calc(var(--stroke-circumference) * 0.25);
+ stroke-linecap: round;
+ stroke-width: var(--stroke-width);
+}
+
+#filename {
+ flex: 1 0 0;
+ margin-bottom: 1px;
+ overflow: hidden;
+ padding-inline-start: 14px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+#fileIcon {
+ height: 15px;
+ position: absolute;
+}
+</style>
+<div class="download-item">
+ <div class="progress">
+ <svg class="progress-indicator">
+ <circle class="progress-circle"></circle>
+ <circle class="progress-spinner"></circle>
+ </svg>
+ <img id="fileIcon">
+ </div>
+ <div id="filename"></div>
+</div>
diff --git a/chromium/chrome/browser/resources/download_shelf/download_item.js b/chromium/chrome/browser/resources/download_shelf/download_item.js
new file mode 100644
index 00000000000..dd8cef90bed
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_item.js
@@ -0,0 +1,89 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview UI element of a download item.
+ */
+
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
+import {DownloadShelfApiProxy, DownloadShelfApiProxyImpl} from './download_shelf_api_proxy.js';
+
+/** @enum {string} */
+export const ITEM_STATE = {
+ IN_PROGRESS: 'in_progress',
+ INTERRUPTED: 'interrupted',
+ COMPLETE: 'complete',
+};
+
+export class DownloadItemElement extends CustomElement {
+ static get template() {
+ return `{__html_template__}`;
+ }
+
+ constructor() {
+ super();
+
+ /** @private {chrome.downloads.DownloadItem} */
+ this.item_;
+
+ /** @private {!DownloadShelfApiProxy} */
+ this.apiProxy_ = DownloadShelfApiProxyImpl.getInstance();
+ }
+
+ /** @param {chrome.downloads.DownloadItem} value */
+ set item(value) {
+ if (this.item_ === value) {
+ return;
+ }
+ this.item_ = value;
+ this.update_();
+ }
+
+ /** @return {chrome.downloads.DownloadItem} */
+ get item() {
+ return this.item_;
+ }
+
+ /** @private */
+ update_() {
+ const item = this.item_;
+ if (!item) {
+ return;
+ }
+ const downloadElement = this.$('.download-item');
+ this.$('#filename').innerText =
+ item.filename.substring(item.filename.lastIndexOf('/') + 1);
+ downloadElement.dataset.state = item.state;
+ switch (item.state) {
+ case ITEM_STATE.IN_PROGRESS:
+ this.progress =
+ item.totalBytes > 0 ? item.bytesReceived / item.totalBytes : 0;
+ break;
+ case ITEM_STATE.COMPLETE:
+ this.progress = 1;
+ break;
+ case ITEM_STATE.INTERRUPTED:
+ this.progress = 0;
+ break;
+ }
+
+ if (item.paused) {
+ downloadElement.dataset.paused = true;
+ } else {
+ delete downloadElement.dataset.paused;
+ }
+
+ this.apiProxy_.getFileIcon(item.id).then(icon => {
+ this.$('#fileIcon').src = icon;
+ });
+ }
+
+ /** @param {number} value */
+ set progress(value) {
+ this.$('.progress')
+ .style.setProperty('--download-progress', value.toString());
+ }
+}
+
+customElements.define('download-item', DownloadItemElement);
diff --git a/chromium/chrome/browser/resources/download_shelf/download_list.html b/chromium/chrome/browser/resources/download_shelf/download_list.html
new file mode 100644
index 00000000000..e97d6a04987
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_list.html
@@ -0,0 +1,8 @@
+<style>
+#downloadList {
+ display: flex;
+ flex-direction: row;
+ overflow: hidden;
+}
+</style>
+<div id="downloadList"></div>
diff --git a/chromium/chrome/browser/resources/download_shelf/download_list.js b/chromium/chrome/browser/resources/download_shelf/download_list.js
new file mode 100644
index 00000000000..51408bb32c0
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_list.js
@@ -0,0 +1,164 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview UI element of a download list.
+ */
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
+
+import {ITEM_STATE} from './download_item.js';
+import {DownloadShelfApiProxy, DownloadShelfApiProxyImpl} from './download_shelf_api_proxy.js';
+
+/** @type {number} */
+const PROGRESS_UPDATE_INTERVAL = 500;
+export class DownloadListElement extends CustomElement {
+ static get template() {
+ return `{__html_template__}`;
+ }
+
+ constructor() {
+ super();
+
+ /** @private {!Array} */
+ this.elements_ = [];
+
+ /** @private {!Array} */
+ this.items_ = [];
+
+ /** @private {!DownloadShelfApiProxy} */
+ this.apiProxy_ = DownloadShelfApiProxyImpl.getInstance();
+
+ /** @private {!Element} */
+ this.listElement_ = assert(this.$('#downloadList'));
+
+ /** @private {!Array<number>} */
+ this.listenerIds_ = [];
+
+ /** @private {ResizeObserver} */
+ this.resizeObserver_ = new ResizeObserver(() => this.updateElements_());
+ this.resizeObserver_.observe(this.listElement_);
+
+ this.apiProxy_.getDownloads().then(downloadItems => {
+ this.items_ = downloadItems;
+ this.updateElements_();
+ });
+
+ const callbackRouter = this.apiProxy_.getCallbackRouter();
+ // TODO(romanarora): Once we implement a close panel button, we should
+ // ensure it removes all listeners from this.listenerIds_ when triggered.
+
+ // Triggers for downloads other than the first one, as the page handler will
+ // not be ready by the first download.
+ this.listenerIds_.push(callbackRouter.onNewDownload.addListener(
+ (download_model) => {
+ // TODO(romanarora): Implement this method as replacement to
+ // onCreated.
+ }));
+
+ this.apiProxy_.onCreated(item => {
+ this.items_.unshift(item);
+ this.updateElements_();
+ });
+
+ this.apiProxy_.onChanged(changes => {
+ const id = changes.id;
+ const index = this.items_.findIndex(item => item.id === id);
+ if (index >= 0) {
+ const item = Object.assign({}, this.items_[index]);
+ for (const key in changes) {
+ if (key !== 'id') {
+ item[key] = changes[key].current;
+ }
+ }
+ this.items_[index] = item;
+ this.updateElements_();
+ }
+ });
+
+ this.apiProxy_.onErased(id => {
+ const index = this.items_.findIndex(item => item.id === id);
+ if (index >= 0) {
+ this.items_.splice(index, 1);
+ this.updateElements_();
+ }
+ });
+
+ setInterval(() => this.onProgress_(), PROGRESS_UPDATE_INTERVAL);
+ }
+
+ /** @private */
+ onProgress_() {
+ for (const item of this.items_) {
+ if (item.state !== ITEM_STATE.IN_PROGRESS || item.paused) {
+ continue;
+ }
+ const downloadId = item.id;
+ this.apiProxy_.getDownloadById(downloadId).then(items => {
+ if (items.length > 0) {
+ const index = this.items_.findIndex(item => item.id === downloadId);
+ if (index >= 0) {
+ this.items_[index] = items[0];
+ this.updateElements_();
+ }
+ }
+ });
+ }
+ }
+
+ /** @private */
+ updateElements_() {
+ const containerWidth = this.listElement_.offsetWidth;
+ let currentWidth = 0;
+ const itemCount = this.items_.length;
+ const elementCount = this.elements_.length;
+ for (let i = 0; i < itemCount; ++i) {
+ if (currentWidth >= containerWidth) {
+ if (i < elementCount) /** Remove elements out of viewport. */ {
+ for (let j = i; j < elementCount; ++j) {
+ const downloadElement = this.elements_[j];
+ downloadElement.removeEventListener('click', this.onItemClick_);
+ this.listElement_.removeChild(downloadElement);
+ }
+ this.elements_.splice(i, elementCount - i);
+ }
+ break;
+ }
+ let downloadElement;
+ if (i < elementCount) /** Update existing elements inside viewport. */ {
+ downloadElement = this.elements_[i];
+ downloadElement.item = this.items_[i];
+ } else /** Insert new elements inside viewport */ {
+ downloadElement = document.createElement('download-item');
+ downloadElement.item = this.items_[i];
+ downloadElement.addEventListener('click', this.onItemClick_);
+ this.listElement_.appendChild(downloadElement);
+ this.elements_.push(downloadElement);
+ }
+ currentWidth += downloadElement.offsetWidth;
+ }
+
+ /** Remove extra elements */
+ if (itemCount < elementCount) {
+ for (let i = itemCount; i < elementCount; ++i) {
+ const downloadElement = this.elements_[i];
+ downloadElement.removeEventListener('click', this.onItemClick_);
+ this.listElement_.removeChild(downloadElement);
+ }
+ this.elements_.splice(itemCount, elementCount - itemCount);
+ }
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onItemClick_(e) {
+ this.apiProxy_.showContextMenu(
+ e.currentTarget.item.id, e.clientX, e.clientY);
+ }
+}
+
+customElements.define('download-list', DownloadListElement);
diff --git a/chromium/chrome/browser/resources/download_shelf/download_shelf.html b/chromium/chrome/browser/resources/download_shelf/download_shelf.html
new file mode 100644
index 00000000000..20f2cd3ab8d
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_shelf.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ <style>
+ body {
+ overflow: hidden;
+ }
+ </style>
+</head>
+<body>
+ <download-shelf-app></download-shelf-app>
+ <script type="module" src="app.js"></script>
+</body>
+</html>
diff --git a/chromium/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js b/chromium/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js
new file mode 100644
index 00000000000..282230a74bc
--- /dev/null
+++ b/chromium/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js
@@ -0,0 +1,125 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+
+import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './download_shelf.mojom-webui.js';
+
+/** @interface */
+export class DownloadShelfApiProxy {
+ /** @return {!PageCallbackRouter} */
+ getCallbackRouter() {}
+
+ /**
+ * @return {!Promise<!Array<!chrome.downloads.DownloadItem>>}
+ */
+ getDownloads() {}
+
+ /**
+ * @param {number} downloadId
+ * @return {!Promise}
+ */
+ getDownloadById(downloadId) {}
+
+ /**
+ * @param {number} downloadId
+ * @return {!Promise}
+ */
+ getFileIcon(downloadId) {}
+
+ /**
+ * @param {function(!Object)} callback
+ */
+ onCreated(callback) {}
+
+ /**
+ * @param {function(!Object)} callback
+ */
+ onChanged(callback) {}
+
+ /**
+ * @param {function(number)} callback
+ */
+ onErased(callback) {}
+
+ /**
+ * @param {number} downloadId
+ * @param {number} clientX
+ * @param {number} clientY
+ */
+ showContextMenu(downloadId, clientX, clientY) {}
+}
+
+/** @implements {DownloadShelfApiProxy} */
+export class DownloadShelfApiProxyImpl {
+ constructor() {
+ /** @type {!PageCallbackRouter} */
+ this.callbackRouter = new PageCallbackRouter();
+
+ /** @type {!PageHandlerRemote} */
+ this.handler = new PageHandlerRemote();
+
+ const factory = PageHandlerFactory.getRemote();
+ factory.createPageHandler(
+ this.callbackRouter.$.bindNewPipeAndPassRemote(),
+ this.handler.$.bindNewPipeAndPassReceiver());
+ }
+
+ /** @override */
+ getCallbackRouter() {
+ return this.callbackRouter;
+ }
+
+ /** @override */
+ getDownloads() {
+ return new Promise(resolve => {
+ chrome.downloads.search(
+ {
+ orderBy: ['-startTime'],
+ limit: 100,
+ },
+ resolve);
+ });
+ }
+
+ /** @override */
+ getDownloadById(downloadId) {
+ return new Promise(resolve => {
+ chrome.downloads.search(
+ {
+ id: downloadId,
+ },
+ resolve);
+ });
+ }
+
+ /** @override */
+ getFileIcon(downloadId) {
+ return new Promise(resolve => {
+ chrome.downloads.getFileIcon(downloadId, resolve);
+ });
+ }
+
+ /** @override */
+ onCreated(callback) {
+ chrome.downloads.onCreated.addListener(callback);
+ }
+
+ /** @override */
+ onChanged(callback) {
+ chrome.downloads.onChanged.addListener(callback);
+ }
+
+ /** @override */
+ onErased(callback) {
+ chrome.downloads.onErased.addListener(callback);
+ }
+
+ /** @override */
+ showContextMenu(downloadId, clientX, clientY) {
+ this.handler.showContextMenu(downloadId, clientX, clientY);
+ }
+}
+
+addSingletonGetter(DownloadShelfApiProxyImpl);
diff --git a/chromium/chrome/browser/resources/downloads/BUILD.gn b/chromium/chrome/browser/resources/downloads/BUILD.gn
index 37cf13c17b4..5db69bed6f2 100644
--- a/chromium/chrome/browser/resources/downloads/BUILD.gn
+++ b/chromium/chrome/browser/resources/downloads/BUILD.gn
@@ -183,7 +183,7 @@ js_library("manager") {
":search_service",
":toolbar",
"//third_party/polymer/v3_0/components-chromium/iron-list",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
"//ui/webui/resources/cr_elements/cr_toast:cr_toast_manager.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
diff --git a/chromium/chrome/browser/resources/downloads/manager.js b/chromium/chrome/browser/resources/downloads/manager.js
index e5fcca8e135..51d1c878482 100644
--- a/chromium/chrome/browser/resources/downloads/manager.js
+++ b/chromium/chrome/browser/resources/downloads/manager.js
@@ -7,14 +7,14 @@ import './item.js';
import './toolbar.js';
import 'chrome://resources/cr_components/managed_footnote/managed_footnote.m.js';
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_page_host_style_css.m.js';
+import 'chrome://resources/cr_elements/cr_page_host_style_css.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
import {getToastManager} from 'chrome://resources/cr_elements/cr_toast/cr_toast_manager.m.js';
-import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.m.js';
+import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
diff --git a/chromium/chrome/browser/resources/engagement/BUILD.gn b/chromium/chrome/browser/resources/engagement/BUILD.gn
index af0563219b8..4809a4c22d2 100644
--- a/chromium/chrome/browser/resources/engagement/BUILD.gn
+++ b/chromium/chrome/browser/resources/engagement/BUILD.gn
@@ -17,7 +17,7 @@ js_type_check("closure_compile") {
js_library("site_engagement") {
deps = [
"//components/site_engagement/core/mojom:mojo_bindings_webui_js",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:util",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:util.m",
]
}
diff --git a/chromium/chrome/browser/resources/engagement/site_engagement.html b/chromium/chrome/browser/resources/engagement/site_engagement.html
index ea8512b59be..e1e0617771d 100644
--- a/chromium/chrome/browser/resources/engagement/site_engagement.html
+++ b/chromium/chrome/browser/resources/engagement/site_engagement.html
@@ -3,9 +3,6 @@
<title>Site Engagement</title>
<meta charset="utf-8">
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
- <script src="chrome://resources/js/assert.js"></script>
- <script src="chrome://resources/js/util.js"></script>
- </script>
<script src="site_engagement.js" type="module"></script>
<style>
body {
diff --git a/chromium/chrome/browser/resources/engagement/site_engagement.js b/chromium/chrome/browser/resources/engagement/site_engagement.js
index 73c8bc3a476..67bd7308682 100644
--- a/chromium/chrome/browser/resources/engagement/site_engagement.js
+++ b/chromium/chrome/browser/resources/engagement/site_engagement.js
@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {$, createElementWithClassName} from 'chrome://resources/js/util.m.js';
import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
import {SiteEngagementDetails, SiteEngagementDetailsProvider, SiteEngagementDetailsProviderRemote} from './site_engagement_details.mojom-webui.js';
-(function() {
let resolvePageIsPopulated = null;
const pageIsPopulatedPromise = new Promise((resolve, reject) => {
resolvePageIsPopulated = resolve;
@@ -217,4 +218,3 @@ function initialize() {
}
document.addEventListener('DOMContentLoaded', initialize);
-})();
diff --git a/chromium/chrome/browser/resources/extensions/BUILD.gn b/chromium/chrome/browser/resources/extensions/BUILD.gn
index d75482bdfbf..84fb4412391 100644
--- a/chromium/chrome/browser/resources/extensions/BUILD.gn
+++ b/chromium/chrome/browser/resources/extensions/BUILD.gn
@@ -391,8 +391,8 @@ js_library("manager") {
":sidebar",
":toolbar",
"activity_log:activity_log",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn b/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
index 8ceba341a71..4db3ab07442 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
+++ b/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
@@ -46,7 +46,7 @@ js_library("activity_log_history") {
deps = [
":activity_log_history_item",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
externs_list = [ "$externs_path/activity_log_private.js" ]
}
@@ -60,7 +60,7 @@ js_library("activity_log_stream") {
deps = [
":activity_log_stream_item",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
externs_list = [ "$externs_path/activity_log_private.js" ]
}
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log.js b/chromium/chrome/browser/resources/extensions/activity_log/activity_log.js
index 694b67f7864..762a188aca9 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log.js
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log.js
@@ -4,7 +4,7 @@
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
-import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.m.js';
+import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.js b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.js
index dbd4412f6b2..85bae01184f 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.js
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.js
@@ -5,7 +5,7 @@
import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js';
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
-import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.m.js';
+import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.js';
import '../shared_style.js';
import {assert} from 'chrome://resources/js/assert.m.js';
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.html b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.html
index 2315557edd3..7a75019170d 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.html
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.html
@@ -80,7 +80,7 @@
<span id="activity-key" title="[[data.key]]">[[data.key]]</span>
<span id="activity-count">[[data.count]]</span>
</div>
- <cr-expand-button expanded="{{data.expanded}}"
+ <cr-expand-button no-hover expanded="{{data.expanded}}"
hidden$="[[!isExpandable_]]">
</cr-expand-button>
<div class="separator" hidden$="[[!isExpandable_]]"></div>
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.js b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.js
index 14a324e01e3..87d24ec4840 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.js
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.js
@@ -3,7 +3,7 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.m.js';
+import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.js';
import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
import '../shared_style.js';
diff --git a/chromium/chrome/browser/resources/extensions/detail_view.html b/chromium/chrome/browser/resources/extensions/detail_view.html
index b5851fffd44..48f6584f272 100644
--- a/chromium/chrome/browser/resources/extensions/detail_view.html
+++ b/chromium/chrome/browser/resources/extensions/detail_view.html
@@ -89,6 +89,14 @@
width: 18px;
}
+ #allowlist-warning {
+ flex: 1;
+ }
+
+ #allowlist-warning .warning-icon {
+ --iron-icon-fill-color: var(--warning-color);
+ }
+
ul {
margin: 0;
padding-inline-start: 20px;
@@ -173,7 +181,7 @@
</cr-toggle>
</div>
</div>
- <div id="warnings" hidden$="[[!hasWarnings_(data.*)]]">
+ <div id="warnings" hidden$="[[!hasSevereWarnings_(data.*)]]">
<div id="runtime-warnings" hidden$="[[!data.runtimeWarnings.length]]"
class="cr-row continuation warning control-line">
<iron-icon class="warning-icon" icon="cr:error"></iron-icon>
@@ -220,6 +228,18 @@
<span>$i18n{updateRequiredByPolicy}</span>
</div>
</div>
+ <div id="allowlist-warning" class="cr-row continuation"
+ hidden$="[[!showAllowlistWarning_(data.*)]]">
+ <iron-icon class="warning-icon"
+ icon="extensions-icons:safebrowsing_warning">
+ </iron-icon>
+ <span class="cr-secondary-text">
+ $i18n{itemAllowlistWarning}
+ <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank">
+ $i18n{learnMore}
+ </a>
+ </span>
+ </div>
<div class="section">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemDescriptionLabel}
diff --git a/chromium/chrome/browser/resources/extensions/detail_view.js b/chromium/chrome/browser/resources/extensions/detail_view.js
index 36602faefa9..44d28e0bf7e 100644
--- a/chromium/chrome/browser/resources/extensions/detail_view.js
+++ b/chromium/chrome/browser/resources/extensions/detail_view.js
@@ -5,7 +5,7 @@
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
-import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.m.js';
+import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
import 'chrome://resources/cr_elements/icons.m.js';
import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.m.js';
@@ -156,7 +156,7 @@ Polymer({
* @return {boolean}
* @private
*/
- hasWarnings_() {
+ hasSevereWarnings_() {
return this.data.disableReasons.corruptInstall ||
this.data.disableReasons.suspiciousInstall ||
this.data.disableReasons.updateRequired || !!this.data.blacklistText ||
@@ -378,4 +378,16 @@ Polymer({
return enableControl === EnableControl.ENABLE_TOGGLE ||
enableControl === EnableControl.REPAIR;
},
+
+ /**
+ * @return {boolean} Whether the allowlist warning should be shown.
+ * @private
+ */
+ showAllowlistWarning_() {
+ // Only show the allowlist warning if there is no blocklist warning. It
+ // would be redundant since all blocklisted items are necessarily not
+ // included in the Safe Browsing allowlist.
+ return this.data.showSafeBrowsingAllowlistWarning &&
+ !this.data.blacklistText;
+ },
});
diff --git a/chromium/chrome/browser/resources/extensions/icons.html b/chromium/chrome/browser/resources/extensions/icons.html
index 925e4108ec3..8e705da19ed 100644
--- a/chromium/chrome/browser/resources/extensions/icons.html
+++ b/chromium/chrome/browser/resources/extensions/icons.html
@@ -8,6 +8,13 @@
<path d="M20,5H4A2,2,0,0,0,2,7V17a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V7A2,2,0,0,0,20,5ZM9,17a5,5,0,1,1,5-5A5,5,0,0,1,9,17Zm11,1a1,1,0,1,1,1-1A1,1,0,0,1,20,18ZM20,8a1,1,0,1,1,1-1A1,1,0,0,1,20,8Z"></path>
</g>
+ <!-- Material Design icons. -->
+ <!-- Material icon name: 'gpp_maybe' -->
+ <g id="safebrowsing_warning">
+ <path d="M0 0h24v24H0z" fill="none"></path>
+ <path d="M12 4.24l6 3v4.1c0 3.9-2.55 7.5-6 8.59-3.45-1.09-6-4.7-6-8.59v-4.1l6-3M12 2L4 6v5.33c0 4.93 3.41 9.55 8 10.67 4.59-1.12 8-5.73 8-10.67V6l-8-4zm-1 13h2v2h-2v-2zm2-7h-2v5h2V8z"></path>
+ </g>
+
<!-- Copied from iron-icons. -->
<g id="input"><path d="M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3z"></path></g>
<g id="business"><path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"></path></g>
diff --git a/chromium/chrome/browser/resources/extensions/item.html b/chromium/chrome/browser/resources/extensions/item.html
index ee4785fc461..87367f62997 100644
--- a/chromium/chrome/browser/resources/extensions/item.html
+++ b/chromium/chrome/browser/resources/extensions/item.html
@@ -86,13 +86,26 @@
margin-bottom: 8px;
}
- #error-icon {
- --iron-icon-fill-color: var(--error-color);
+ #allowlist-warning {
+ flex: 1;
+ margin-bottom: 8px;
+ }
+
+ .message-icon {
height: 18px;
margin-inline-end: 4px;
+ vertical-align: top;
width: 18px;
}
+ #warnings .message-icon {
+ --iron-icon-fill-color: var(--error-color);
+ }
+
+ #allowlist-warning .message-icon {
+ --iron-icon-fill-color: var(--warning-color);
+ }
+
#extension-id {
flex-shrink: 0;
}
@@ -213,13 +226,13 @@
</div>
</div>
<div id="description" class="cr-secondary-text multiline-clippable-text"
- hidden$="[[hasWarnings_(data.disableReasons.*, data.*)]]">
+ hidden$="[[!showDescription_(data.disableReasons.*, data.*)]]">
[[data.description]]
</div>
<template is="dom-if"
- if="[[hasWarnings_(data.disableReasons.*, data.*)]]">
+ if="[[hasSevereWarnings_(data.disableReasons.*, data.*)]]">
<div id="warnings">
- <iron-icon id="error-icon" icon="cr:error"></iron-icon>
+ <iron-icon class="message-icon" icon="cr:error"></iron-icon>
<span id="runtime-warnings" aria-describedby="a11yAssociation"
hidden$="[[!data.runtimeWarnings.length]]">
<template is="dom-repeat" items="[[data.runtimeWarnings]]">
@@ -242,6 +255,20 @@
--></span>
</div>
</template>
+ <template is="dom-if"
+ if="[[showAllowlistWarning_(data.disableReasons.*, data.*)]]">
+ <div id="allowlist-warning">
+ <iron-icon class="message-icon"
+ icon="extensions-icons:safebrowsing_warning">
+ </iron-icon>
+ <span class="cr-secondary-text" aria-describedby="a11yAssociation">
+ $i18n{itemAllowlistWarning}
+ <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank">
+ $i18n{learnMore}
+ </a>
+ </span>
+ </div>
+ </template>
<template is="dom-if" if="[[inDevMode]]">
<div id="extension-id" class="bounded-text cr-secondary-text">
[[data.id]]
diff --git a/chromium/chrome/browser/resources/extensions/item.js b/chromium/chrome/browser/resources/extensions/item.js
index 1bf7fd1f15d..e65bb5f9d0f 100644
--- a/chromium/chrome/browser/resources/extensions/item.js
+++ b/chromium/chrome/browser/resources/extensions/item.js
@@ -432,17 +432,31 @@ Polymer({
* @return {boolean}
* @private
*/
- hasWarnings_() {
+ hasSevereWarnings_() {
return this.data.disableReasons.corruptInstall ||
this.data.disableReasons.suspiciousInstall ||
this.data.runtimeWarnings.length > 0 || !!this.data.blacklistText;
},
/**
- * @return {string}
+ * @return {boolean}
+ * @private
+ */
+ showDescription_() {
+ return !this.hasSevereWarnings_() &&
+ !this.data.showSafeBrowsingAllowlistWarning;
+ },
+
+ /**
+ * @return {boolean}
* @private
*/
- computeWarningsClasses_() {
- return this.data.blacklistText ? 'severe' : 'mild';
+ showAllowlistWarning_() {
+ // Only show the allowlist warning if there are no other warnings. The item
+ // card has a fixed height and the content might get cropped if too many
+ // warnings are displayed. This should be a rare edge case and the allowlist
+ // warning will still be shown in the item detail view.
+ return this.data.showSafeBrowsingAllowlistWarning &&
+ !this.hasSevereWarnings_();
},
});
diff --git a/chromium/chrome/browser/resources/extensions/manager.js b/chromium/chrome/browser/resources/extensions/manager.js
index 3bef81eb86f..fa2a492ab9c 100644
--- a/chromium/chrome/browser/resources/extensions/manager.js
+++ b/chromium/chrome/browser/resources/extensions/manager.js
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.m.js';
+import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js';
import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js';
import 'chrome://resources/cr_elements/cr_toast/cr_toast_manager.m.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
-import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.m.js';
+import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import './detail_view.js';
diff --git a/chromium/chrome/browser/resources/extensions/service.js b/chromium/chrome/browser/resources/extensions/service.js
index df646188a53..d6ba86cfd68 100644
--- a/chromium/chrome/browser/resources/extensions/service.js
+++ b/chromium/chrome/browser/resources/extensions/service.js
@@ -185,8 +185,10 @@ export class Service {
if (loadError) {
return reject(loadError);
}
-
- resolve();
+ // The load was successful if there's no lastError indicated (and
+ // no loadError, which is checked above).
+ const loadSuccessful = typeof chrome.runtime.lastError === 'undefined';
+ resolve(loadSuccessful);
});
});
}
diff --git a/chromium/chrome/browser/resources/extensions/shared_vars.html b/chromium/chrome/browser/resources/extensions/shared_vars.html
index 8c210336b03..d10f82cdf94 100644
--- a/chromium/chrome/browser/resources/extensions/shared_vars.html
+++ b/chromium/chrome/browser/resources/extensions/shared_vars.html
@@ -4,6 +4,8 @@
/* Note: error-color is used for many warnings. There's also an orange-y
* warning color in 1 place. */
--error-color: var(--google-red-700);
+ /* Copied from 'ui/gfx/color_palette.h' kGoogleYellow700 (#f29900) */
+ --warning-color: rgb(242, 153, 0);
--extensions-card-height: 160px;
--separator-gap: 9px;
}
@@ -11,6 +13,7 @@
@media (prefers-color-scheme: dark) {
html {
--error-color: var(--google-red-refresh-300);
+ --warning-color: var(--google-yellow-refresh-300);
}
}
</style>
diff --git a/chromium/chrome/browser/resources/extensions/toolbar.js b/chromium/chrome/browser/resources/extensions/toolbar.js
index 25a38b7082b..e94afd0280a 100644
--- a/chromium/chrome/browser/resources/extensions/toolbar.js
+++ b/chromium/chrome/browser/resources/extensions/toolbar.js
@@ -154,9 +154,17 @@ Polymer({
/** @private */
onLoadUnpackedTap_() {
- this.delegate.loadUnpacked().catch(loadError => {
- this.fire('load-error', loadError);
- });
+ this.delegate.loadUnpacked()
+ .then((success) => {
+ if (success) {
+ const toastManager = getToastManager();
+ toastManager.duration = 3000;
+ toastManager.show(this.i18n('toolbarLoadUnpackedDone'));
+ }
+ })
+ .catch(loadError => {
+ this.fire('load-error', loadError);
+ });
chrome.metricsPrivate.recordUserAction('Options_LoadUnpackedExtension');
},
diff --git a/chromium/chrome/browser/resources/feed_internals/feed_internals.html b/chromium/chrome/browser/resources/feed_internals/feed_internals.html
index a8d6e6ec56b..ee4a0750cf7 100644
--- a/chromium/chrome/browser/resources/feed_internals/feed_internals.html
+++ b/chromium/chrome/browser/resources/feed_internals/feed_internals.html
@@ -180,5 +180,13 @@ found in the LICENSE file.
<input id="feed-stream-data-file" type="file">
<button id="feed-stream-data-override">Override</button>
+ <h2>WebFeed UI</h2>
+ <p>WebFeed enabled: </p>
+ <p id="webfeed-ui-enabled-status"></p>
+ <label>
+ <input type="checkbox" id="enable-webfeed-ui" name="enable-webfeed-ui">
+ Enable WebFeed UI
+ </label>
+ <button id="enable-webfeed-ui-apply">Apply</button>
</body>
</html>
diff --git a/chromium/chrome/browser/resources/feed_internals/feed_internals.js b/chromium/chrome/browser/resources/feed_internals/feed_internals.js
index 1d4a2c94058..3e5368a0845 100644
--- a/chromium/chrome/browser/resources/feed_internals/feed_internals.js
+++ b/chromium/chrome/browser/resources/feed_internals/feed_internals.js
@@ -26,6 +26,7 @@ function updatePageWithProperties() {
$('load-stream-status').textContent = properties.loadStreamStatus;
$('feed-fetch-url').textContent = properties.feedFetchUrl.url;
$('feed-actions-url').textContent = properties.feedActionsUrl.url;
+ $('webfeed-ui-enabled-status').textContent = properties.isWebFeedUiEnabled;
});
}
@@ -151,8 +152,8 @@ function setupEventListeners() {
pageHandler.overrideFeedHost({url: $('feed-host-override').value});
});
- $('actions-endpoint-override-apply').addEventListener('click', function() {
- pageHandler.overrideFeedHost({url: $('actions-endpoint-override').value});
+ $('discover-api-override-apply').addEventListener('click', function() {
+ pageHandler.overrideFeedHost({url: $('discover-api-override').value});
});
$('feed-stream-data-override').addEventListener('click', function() {
@@ -166,6 +167,10 @@ function setupEventListeners() {
};
}
});
+
+ $('enable-webfeed-ui-apply').addEventListener('click', function() {
+ pageHandler.setWebFeedUIEnabled($('enable-webfeed-ui').checked);
+ });
}
function updatePage() {
diff --git a/chromium/chrome/browser/resources/feedback/js/event_handler.js b/chromium/chrome/browser/resources/feedback/js/event_handler.js
index eb477a67089..33377928768 100644
--- a/chromium/chrome/browser/resources/feedback/js/event_handler.js
+++ b/chromium/chrome/browser/resources/feedback/js/event_handler.js
@@ -79,6 +79,8 @@ const feedbackCallerExtensions = [
'C2ABD68C33A5B485971C9638B80D6A2E9CBA78C4', // http://crbug.com/908458
'B41E7F08E1179CC03CBD1F49E57CF353A40ADE07', // http://crbug.com/908458
'A948368FC53BE437A55FEB414106E207925482F5', // ChromeOS Files App.
+ '754A9CB3C8623093180E10CF4C3AB64837179E68', // https://crbug.com/1201800
+ 'CF6B19571334F49878327D557597D23B1458AA39', // https://crbug.com/1201800
];
/**
diff --git a/chromium/chrome/browser/resources/feedback_webui/feedback_resources.grd b/chromium/chrome/browser/resources/feedback_webui/feedback_resources.grd
index 36ab9477225..208263d85a4 100644
--- a/chromium/chrome/browser/resources/feedback_webui/feedback_resources.grd
+++ b/chromium/chrome/browser/resources/feedback_webui/feedback_resources.grd
@@ -16,7 +16,6 @@
<include name="IDR_FEEDBACK_FEEDBACK_UTIL_JS" file="js/feedback_util.js" type="BINDATA" />
<include name="IDR_FEEDBACK_FEEDBACK_JS" file="js/feedback.js" preprocess="true" type="BINDATA" />
<include name="IDR_FEEDBACK_TAKE_SCREENSHOT_JS" file="js/take_screenshot.js" type="BINDATA" />
- <include name="IDR_FEEDBACK_TOPBAR_HANDLER_JS" file="js/topbar_handlers.js" type="BINDATA" />
<include name="IDR_FEEDBACK_FEEDBACK_CSS" file="css/feedback.css" type="BINDATA" />
<include name="IDR_FEEDBACK_BUTTON_BUTTER_BAR_CLOSE_PNG"
file="images/button_butter_bar_close.png" type="BINDATA" />
@@ -30,14 +29,14 @@
file="images/2x/button_butter_bar_close_hover.png" type="BINDATA" />
<include name="IDR_FEEDBACK_BUTTON_BUTTER_BAR_CLOSE_PRESSED_2X_PNG"
file="images/2x/button_butter_bar_close_pressed.png" type="BINDATA" />
+ <include name="IDR_FEEDBACK_SYSINFO_HTML" file="html/sys_info.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+ <include name="IDR_FEEDBACK_SYSINFO_JS" file="js/sys_info.js" type="BINDATA" />
+ <include name="IDR_FEEDBACK_SYSINFO_CSS" file="css/sys_info.css" type="BINDATA" />
<if expr="chromeos">
<include name="IDR_FEEDBACK_BLUETOOTHLOGSINFO_HTML" file="html/bluetooth_logs_info.html" type="BINDATA" />
<include name="IDR_FEEDBACK_ASSISTANTLOGSINFO_HTML" file="html/assistant_logs_info.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
- <include name="IDR_FEEDBACK_SYSINFO_HTML" file="html/sys_info.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
<include name="IDR_FEEDBACK_ASSISTANT_LOGS_INFO_JS" file="js/assistant_logs_info.js" type="BINDATA" />
- <include name="IDR_FEEDBACK_SYSINFO_JS" file="js/sys_info.js" type="BINDATA" />
<include name="IDR_FEEDBACK_ASSISTANT_LOGS_INFO_CSS" file="css/assistant_logs_info.css" type="BINDATA" />
- <include name="IDR_FEEDBACK_SYSINFO_CSS" file="css/sys_info.css" type="BINDATA" />
</if>
</includes>
</release>
diff --git a/chromium/chrome/browser/resources/feedback_webui/html/assistant_logs_info.html b/chromium/chrome/browser/resources/feedback_webui/html/assistant_logs_info.html
index 2393db62c7e..04829823bd0 100644
--- a/chromium/chrome/browser/resources/feedback_webui/html/assistant_logs_info.html
+++ b/chromium/chrome/browser/resources/feedback_webui/html/assistant_logs_info.html
@@ -4,10 +4,7 @@
<meta charset="utf-8">
<link rel="stylesheet" href="chrome://resources/css/apps/topbutton_bar.css"></link>
<link rel="stylesheet" href="../css/assistant_logs_info.css"></link>
-
-<script src="chrome://resources/js/assert.js"></script>
-<script src="chrome://resources/js/util.js"></script>
-<script src="../js/assistant_logs_info.js"></script>
+<script type="module" src="../js/assistant_logs_info.js"></script>
</head>
<body>
<div id="assistant-title-bar" class="title-bar">
diff --git a/chromium/chrome/browser/resources/feedback_webui/html/default.html b/chromium/chrome/browser/resources/feedback_webui/html/default.html
index 1dcda05c3de..3114c032899 100644
--- a/chromium/chrome/browser/resources/feedback_webui/html/default.html
+++ b/chromium/chrome/browser/resources/feedback_webui/html/default.html
@@ -5,31 +5,12 @@
<meta charset="utf-8">
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="stylesheet" href="chrome://resources/css/apps/common.css"></link>
- <link rel="stylesheet" href="chrome://resources/css/apps/topbutton_bar.css">
</link>
<link rel="stylesheet" href="../css/feedback.css">
- <script src="chrome://resources/js/load_time_data.js"></script>
- <script src="chrome://resources/js/assert.js"></script>
- <script src="chrome://resources/js/util.js"></script>
- <script src="../strings.js"></script>
- <script src="../js/feedback_util.js"></script>
- <script src="../js/take_screenshot.js"></script>
- <script src="../js/topbar_handlers.js"></script>
- <script src="../js/feedback.js"></script>
+ <script type="module" src="../js/feedback.js"></script>
</head>
<body>
- <div id="title-bar" class="title-bar">
- <span id="page-title">$i18n{pageTitle}</span>
- <span class="topbutton-bar">
- <button class="minimize-button" id="minimize-button" tabindex="-1"
- aria-label="$i18n{minimizeBtnLabel}">
- </button>
- <button class="close-button" id="close-button" tabindex="-1"
- aria-label="$i18n{closeBtnLabel}">
- </button>
- </span>
- </div>
<div id="content-pane" class="content">
<p id="free-form-text">$i18n{freeFormText}</p>
<textarea id="description-text" aria-labelledby="free-form-text"
diff --git a/chromium/chrome/browser/resources/feedback_webui/html/sys_info.html b/chromium/chrome/browser/resources/feedback_webui/html/sys_info.html
index 32a2eb4c942..43bbcf499a4 100644
--- a/chromium/chrome/browser/resources/feedback_webui/html/sys_info.html
+++ b/chromium/chrome/browser/resources/feedback_webui/html/sys_info.html
@@ -7,9 +7,8 @@
<link rel="stylesheet" href="chrome://resources/css/spinner.css">
<link rel="stylesheet" href="../../about_sys/about_sys.css">
<link rel="stylesheet" href="../css/sys_info.css">
- <script src="chrome://resources/js/assert.js"></script>
- <script src="chrome://resources/js/util.js"></script>
- <script src="../js/sys_info.js"></script>
+
+ <script type="module" src="../js/sys_info.js"></script>
</head>
<body>
<div id="header">
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/BUILD.gn b/chromium/chrome/browser/resources/feedback_webui/js/BUILD.gn
new file mode 100644
index 00000000000..87599ba5bc3
--- /dev/null
+++ b/chromium/chrome/browser/resources/feedback_webui/js/BUILD.gn
@@ -0,0 +1,45 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+ deps = [
+ ":assistant_logs_info",
+ ":feedback",
+ ":feedback_util",
+ ":take_screenshot",
+
+ # TODO(crbug.com/1167223): Fix and enable remaining js_library() targets.
+ #":sys_info",
+ ]
+}
+
+js_library("assistant_logs_info") {
+ deps = [ "//ui/webui/resources/js:util.m" ]
+}
+
+js_library("feedback") {
+ deps = [
+ ":feedback_util",
+ ":take_screenshot",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js:util.m",
+ ]
+ externs_list = [ "$externs_path/feedback_private.js" ]
+}
+
+js_library("feedback_util") {
+}
+
+js_library("sys_info") {
+ deps = [
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js:util.m",
+ ]
+}
+
+js_library("take_screenshot") {
+}
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/assistant_logs_info.js b/chromium/chrome/browser/resources/feedback_webui/js/assistant_logs_info.js
index fd4d189ded6..d20aaf56198 100644
--- a/chromium/chrome/browser/resources/feedback_webui/js/assistant_logs_info.js
+++ b/chromium/chrome/browser/resources/feedback_webui/js/assistant_logs_info.js
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {$} from 'chrome://resources/js/util.m.js';
+
/**
* Setup handlers for the minimize and close topbar buttons.
*/
@@ -11,11 +13,11 @@ function assistantInit() {
e.preventDefault();
});
closeButton.addEventListener('click', function() {
- chrome.app.window.current().close();
+ window.close();
});
window.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
- chrome.app.window.current().close();
+ window.close();
}
}, false);
}
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/feedback.js b/chromium/chrome/browser/resources/feedback_webui/js/feedback.js
index 637167947b9..20ad0a966f2 100644
--- a/chromium/chrome/browser/resources/feedback_webui/js/feedback.js
+++ b/chromium/chrome/browser/resources/feedback_webui/js/feedback.js
@@ -2,21 +2,127 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// TODO(crbug.com/1167223
-// dummy data, use temporarily until a message handler is implemented
-// real data shall be retrieved from backend or be passed via query string
-const feedbackInfo = {
- categoryTag: '',
- description: '',
- descriptionPlaceholder: 'Please enter a description of your issue',
- flow: 'regular',
- pageUrl:
- 'https://superuser.com/questions/777213/copy-json-from-console-log-in-developer-tool-to-clipboard',
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+
+import {FEEDBACK_LANDING_PAGE, FEEDBACK_LANDING_PAGE_TECHSTOP, FEEDBACK_LEGAL_HELP_URL, FEEDBACK_PRIVACY_POLICY_URL, FEEDBACK_TERM_OF_SERVICE_URL, openUrlInAppWindow} from './feedback_util.js';
+import {takeScreenshot} from './take_screenshot.js';
+
+
+/** @type {string} */
+const dialogArgs = chrome.getVariableValue('dialogArguments');
+
+/**
+ * The object will be manipulated by feedbackHelper
+ *
+ * @type {chrome.feedbackPrivate.FeedbackInfo}
+ */
+let feedbackInfo = {
+ assistantDebugInfoAllowed: false,
+ attachedFile: undefined,
+ attachedFileBlobUuid: undefined,
+ categoryTag: undefined,
+ description: '...',
+ descriptionPlaceholder: undefined,
+ email: undefined,
+ flow: chrome.feedbackPrivate.FeedbackFlow.REGULAR,
+ fromAssistant: false,
+ includeBluetoothLogs: false,
+ pageUrl: undefined,
+ sendHistograms: undefined,
systemInformation: [],
useSystemWindowFrame: false,
- screenshot: {}
};
+
+class FeedbackHelper {
+ constructor() {
+ /**
+ * @type {boolean}
+ */
+ this.systemInformationLoaded = false;
+ }
+
+ getSystemInformation() {
+ return new Promise(
+ resolve => chrome.feedbackPrivate.getSystemInformation(resolve));
+ }
+
+ getFullSystemInformation() {
+ return new Promise(resolve => {
+ if (this.systemInformationLoaded) {
+ resolve(feedbackInfo.systemInformation);
+ } else {
+ this.getSystemInformation().then(function(sysInfo) {
+ if (feedbackInfo.systemInformation) {
+ feedbackInfo.systemInformation =
+ feedbackInfo.systemInformation.concat(sysInfo);
+ } else {
+ feedbackInfo.systemInformation = sysInfo;
+ }
+ this.systemInformationLoaded = true;
+ resolve(feedbackInfo.systemInformation);
+ });
+ }
+ });
+ }
+
+ getUserEmail() {
+ return new Promise(resolve => chrome.feedbackPrivate.getUserEmail(resolve));
+ }
+
+ /**
+ * @param {boolean} useSystemInfo
+ */
+ sendFeedbackReport(useSystemInfo) {
+ const ID = Math.round(Date.now() / 1000);
+ const FLOW = feedbackInfo.flow;
+ if (!useSystemInfo) {
+ this.systemInformationLoaded = false;
+ feedbackInfo.systemInformation = [];
+ }
+
+ chrome.feedbackPrivate.sendFeedback(
+ feedbackInfo, function(result, landingPageType) {
+ if (result == chrome.feedbackPrivate.Status.SUCCESS) {
+ if (FLOW != chrome.feedbackPrivate.FeedbackFlow.LOGIN &&
+ landingPageType !=
+ chrome.feedbackPrivate.LandingPageType.NO_LANDING_PAGE) {
+ const landingPage = landingPageType ==
+ chrome.feedbackPrivate.LandingPageType.NORMAL ?
+ FEEDBACK_LANDING_PAGE :
+ FEEDBACK_LANDING_PAGE_TECHSTOP;
+ window.open(landingPage, '_blank');
+ }
+ } else {
+ console.warn(
+ 'Feedback: Report for request with ID ' + ID +
+ ' will be sent later.');
+ }
+ if (FLOW == chrome.feedbackPrivate.FeedbackFlow.LOGIN) {
+ chrome.feedbackPrivate.loginFeedbackComplete();
+ }
+ });
+ }
+
+ // Send a message to show the WebDialog
+ showDialog() {
+ chrome.send('showDialog');
+ }
+
+ // Send a message to close the WebDialog
+ closeDialog() {
+ chrome.send('dialogClose');
+ }
+}
+
+/**
+ * @type {FeedbackHelper}
+ * @const
+ */
+const feedbackHelper = new FeedbackHelper();
+
/** @type {number}
* @const
*/
@@ -50,6 +156,9 @@ const MAX_SCREENSHOT_WIDTH = 100;
*/
const SYSINFO_WINDOW_ID = 'sysinfo_window';
+/**
+ * @type {Blob}
+ */
let attachedFileBlob = null;
const lastReader = null;
@@ -138,7 +247,7 @@ function onOpenFileDialog() {
function clearAttachedFile() {
$('custom-file-container').hidden = true;
attachedFileBlob = null;
- feedbackInfo.attachedFile = null;
+ feedbackInfo.attachedFile = undefined;
$('attach-file').hidden = false;
}
@@ -233,11 +342,10 @@ function sendReport() {
// Prevent double clicking from sending additional reports.
$('send-report-button').disabled = true;
- console.log('Feedback: Sending report');
if (!feedbackInfo.attachedFile && attachedFileBlob) {
feedbackInfo.attachedFile = {
name: $('attach-file').value,
- data: attachedFileBlob
+ data: attachedFileBlob,
};
}
@@ -270,7 +378,7 @@ function sendReport() {
}
if ($('performance-info-checkbox') == null ||
!($('performance-info-checkbox').checked)) {
- feedbackInfo.traceId = null;
+ feedbackInfo.traceId = undefined;
}
// </if>
@@ -284,19 +392,17 @@ function sendReport() {
feedbackInfo.screenshot = null;
}
- let productId = parseInt('' + feedbackInfo.productId);
+ let productId = parseInt('' + feedbackInfo.productId, 10);
if (isNaN(productId)) {
// For apps that still use a string value as the |productId|, we must clear
// that value since the API uses an integer value, and a conflict in data
// types will cause the report to fail to be sent.
- productId = null;
+ productId = undefined;
}
feedbackInfo.productId = productId;
- // Request sending the report, show the landing page (if allowed), and close
- // this window right away. The FeedbackRequest object that represents this
- // report will take care of sending the report in the background.
- sendFeedbackReport(useSystemInfo);
+ // Request sending the report, show the landing page (if allowed)
+ feedbackHelper.sendFeedbackReport(useSystemInfo);
scheduleWindowClose();
return true;
}
@@ -332,31 +438,9 @@ function performanceFeedbackChanged() {
// </if>
function resizeAppWindow() {
- // We pick the width from the titlebar, which has no margins.
- let width = $('title-bar').scrollWidth;
- if (width < FEEDBACK_MIN_WIDTH) {
- width = FEEDBACK_MIN_WIDTH;
- }
-
- // The Chrome App window's maxHeight is set to the available screen height. If
- // |height| would result in a window that exceeds maxHeight a scrollbar will
- // appear in the content-pane.
- // |height| is calculated as the sum of the scrollHeights of the body's
- // children. This is necessary as the content-pane is set to fill the
- // remaining height of the body after its siblings have been laid out. Summing
- // the children's scrollHeight gives us the desired height of the content area
- // which the Chrome App window uses to size the window accordingly.
- let height = Array.from(document.body.children)
- .reduce((acc, el) => acc + el.scrollHeight, 0);
-
- let minHeight = FEEDBACK_MIN_HEIGHT;
- if (feedbackInfo.flow == chrome.feedbackPrivate.FeedbackFlow.LOGIN) {
- minHeight = FEEDBACK_MIN_HEIGHT_LOGIN;
- }
- height = Math.max(height, minHeight);
-
- window.innerWidth = width;
- window.innerHeight = height;
+ // TODO(crbug.com/1167223): The UI is now controlled by a WebDialog delegate
+ // which is set to not resizable for now. If needed, a message handler can
+ // be added to respond to resize request.
}
/**
@@ -364,7 +448,7 @@ function resizeAppWindow() {
*/
function scheduleWindowClose() {
setTimeout(function() {
- window.close();
+ feedbackHelper.closeDialog();
}, 100);
}
@@ -412,7 +496,7 @@ function initialize() {
resizeAppWindow();
});
- window.focus();
+ feedbackHelper.showDialog();
// Allow feedback to be sent even if the screenshot failed.
if (!screenshotCanvas) {
@@ -434,7 +518,7 @@ function initialize() {
});
});
- chrome.feedbackPrivate.getUserEmail(function(email) {
+ feedbackHelper.getUserEmail().then(function(email) {
// Never add an empty option.
if (!email) {
return;
@@ -459,13 +543,11 @@ function initialize() {
$('attach-file').hidden = true;
}
- // No URL, file attachment, or window minimizing for login screen
- // feedback.
+ // No URL, file attachment for login screen feedback.
if (feedbackInfo.flow == chrome.feedbackPrivate.FeedbackFlow.LOGIN) {
$('page-url').hidden = true;
$('attach-file-container').hidden = true;
$('attach-file-note').hidden = true;
- $('minimize-button').hidden = true;
}
// <if expr="chromeos">
@@ -490,19 +572,7 @@ function initialize() {
window.open('/html/sys_info.html', SYSINFO_WINDOW_ID, params);
if (sysWin) {
- sysWin.window.getFullSystemInfo = function(callback) {
- chrome.feedbackPrivate.getSystemInformation(function(sysInfo) {
- if (feedbackInfo.systemInformation) {
- callback(sysInfo.concat(feedbackInfo.systemInformation));
- } else {
- callback(sysInfo);
- }
- });
- };
-
- sysWin.window.getLoadTimeData = function() {
- return loadTimeData;
- };
+ sysWin.window.getFullSystemInfo = feedbackHelper.getSystemInformation;
}
};
@@ -584,15 +654,14 @@ function initialize() {
};
window.addEventListener('DOMContentLoaded', function() {
- // TODO(crbug.com/1167223
- // feedbackInfo will be retrieved from backend or
- // be passed as query string. This will be addressed via
- // following CL.
- // chrome.feedbackPrivate.getFeedbackInfo(function(feedbackInfo) {
- // applyData(feedbackInfo);
- // });
+ if (dialogArgs) {
+ feedbackInfo = /** @type {chrome.feedbackPrivate.FeedbackInfo} */ (
+ JSON.parse(dialogArgs));
+ }
applyData(feedbackInfo);
+ window.feedbackInfo = feedbackInfo;
+ window.feedbackHelper = feedbackHelper;
// Setup our event handlers.
$('attach-file').addEventListener('change', onFileSelected);
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/feedback_util.js b/chromium/chrome/browser/resources/feedback_webui/js/feedback_util.js
index 7e89b1d44d3..82246ce5698 100644
--- a/chromium/chrome/browser/resources/feedback_webui/js/feedback_util.js
+++ b/chromium/chrome/browser/resources/feedback_webui/js/feedback_util.js
@@ -5,36 +5,37 @@
/** @type {string}
* @const
*/
-const FEEDBACK_LANDING_PAGE =
+export const FEEDBACK_LANDING_PAGE =
'https://support.google.com/chrome/go/feedback_confirmation';
/** @type {string}
* @const
*/
-const FEEDBACK_LANDING_PAGE_TECHSTOP =
+export const FEEDBACK_LANDING_PAGE_TECHSTOP =
'https://support.google.com/pixelbook/answer/7659411';
/** @type {string}
* @const
*/
-const FEEDBACK_LEGAL_HELP_URL =
+export const FEEDBACK_LEGAL_HELP_URL =
'https://support.google.com/legal/answer/3110420';
/** @type {string}
* @const
*/
-const FEEDBACK_PRIVACY_POLICY_URL = 'https://policies.google.com/privacy';
+export const FEEDBACK_PRIVACY_POLICY_URL =
+ 'https://policies.google.com/privacy';
/** @type {string}
* @const
*/
-const FEEDBACK_TERM_OF_SERVICE_URL = 'https://policies.google.com/terms';
+export const FEEDBACK_TERM_OF_SERVICE_URL = 'https://policies.google.com/terms';
/**
* Opens the supplied url in an app window. It uses the url as the window ID.
* @param {string} url The destination URL for the link.
*/
-function openUrlInAppWindow(url) {
+export function openUrlInAppWindow(url) {
const params = `status=no,location=no,toolbar=no,menubar=no,
width=640,height=400,left=200,top=200`;
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/sys_info.js b/chromium/chrome/browser/resources/feedback_webui/js/sys_info.js
index 7398cb01ed2..bf8f844c632 100644
--- a/chromium/chrome/browser/resources/feedback_webui/js/sys_info.js
+++ b/chromium/chrome/browser/resources/feedback_webui/js/sys_info.js
@@ -2,11 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-/**
- * The global load time data that contains the localized strings that we will
- * get from the main page when this page first loads.
- */
-let loadTimeData = null;
+import '../strings.m.js';
+
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
/**
* A queue of a sequence of closures that will incrementally build the sys info
@@ -61,7 +60,7 @@ function collapse(button, valueDiv) {
button.textContent = loadTimeData.getString('sysinfoPageExpandBtn');
valueDiv.parentNode.className = 'number-collapsed';
// Don't have screen readers announce the empty cell.
- valueCell = valueDiv.parentNode;
+ const valueCell = valueDiv.parentNode;
valueCell.setAttribute('aria-hidden', 'true');
}
@@ -88,7 +87,7 @@ function collapseAll() {
}
const button = getButtonForValueDiv(valueDivs[i]);
if (button) {
- collapse(button, valueDivs[i]);
+ collapse(button, /** @type {!HTMLElement} */ (valueDivs[i]));
}
}
}
@@ -104,7 +103,7 @@ function expandAll() {
}
const button = getButtonForValueDiv(valueDivs[i]);
if (button) {
- expand(button, valueDivs[i], i + 1);
+ expand(button, /** @type {!HTMLElement} */ (valueDivs[i]), i + 1);
}
}
}
@@ -233,6 +232,6 @@ function createTable(systemInfo) {
* Initializes the page when the window is loaded.
*/
window.onload = function() {
- loadTimeData = getLoadTimeData();
- getFullSystemInfo(createTable);
+ // The getFullSystemInfo promise is set from the parent page
+ getFullSystemInfo().then(createTable);
};
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/take_screenshot.js b/chromium/chrome/browser/resources/feedback_webui/js/take_screenshot.js
index ee900e7e16e..b106252ee2a 100644
--- a/chromium/chrome/browser/resources/feedback_webui/js/take_screenshot.js
+++ b/chromium/chrome/browser/resources/feedback_webui/js/take_screenshot.js
@@ -4,16 +4,17 @@
/**
* Function to take the screenshot of the current screen.
- * @param {function(HTMLCanvasElement)} callback Callback for returning the
+ * @param {function(?HTMLCanvasElement)} callback Callback for returning the
* canvas with the screenshot. Called with null if the screenshot failed.
*/
-function takeScreenshot(callback) {
+export function takeScreenshot(callback) {
let screenshotStream = null;
const video = document.createElement('video');
video.addEventListener('canplay', function(e) {
if (screenshotStream) {
- const canvas = document.createElement('canvas');
+ const canvas =
+ /** @type {!HTMLCanvasElement} */ (document.createElement('canvas'));
canvas.setAttribute('width', video.videoWidth);
canvas.setAttribute('height', video.videoHeight);
canvas.getContext('2d').drawImage(
diff --git a/chromium/chrome/browser/resources/feedback_webui/js/topbar_handlers.js b/chromium/chrome/browser/resources/feedback_webui/js/topbar_handlers.js
deleted file mode 100644
index 36833645d5f..00000000000
--- a/chromium/chrome/browser/resources/feedback_webui/js/topbar_handlers.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * Setup handlers for the minimize and close topbar buttons.
- */
-function initializeHandlers() {
- // If this dialog is using system window controls, these elements aren't
- // needed at all.
- if (window.feedbackInfo.useSystemWindowFrame) {
- $('minimize-button').hidden = true;
- $('close-button').hidden = true;
- return;
- }
- $('minimize-button').addEventListener('click', function(e) {
- e.preventDefault();
- chrome.app.window.current().minimize();
- });
-
- $('minimize-button').addEventListener('mousedown', function(e) {
- e.preventDefault();
- });
-
- $('close-button').addEventListener('click', function() {
- scheduleWindowClose();
- });
-
- $('close-button').addEventListener('mousedown', function(e) {
- e.preventDefault();
- });
-}
-
-window.addEventListener('DOMContentLoaded', initializeHandlers);
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js b/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
index b9ddcce25b2..a81e93a2e1a 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
+++ b/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -207,6 +207,11 @@ cr.define('cr.login', function() {
'isDeviceOwner', // True if the user is device owner.
];
+ // Timeout in ms to wait for the user info message. The message is used to
+ // extract user services and to define whether or not the account is a child
+ // one.
+ const USER_INFO_WAIT_TIMEOUT_MS = 5 * 1000;
+
/**
* Extract domain name from an URL.
* @param {string} url An URL string.
@@ -393,6 +398,7 @@ cr.define('cr.login', function() {
this.needPassword = true;
this.enableSyncTrustedVaultKeys_ = false;
this.services_ = null;
+ this.userInfoTimer_ = null;
/**
* Caches the result of |getIsSamlUserPasswordlessCallback| invocation for
* the current user. Null if no result is obtained yet.
@@ -442,6 +448,7 @@ cr.define('cr.login', function() {
this.samlHandler_.reset();
this.videoEnabled = false;
this.services_ = null;
+ this.userInfoTimer_ = null;
this.isSamlUserPasswordless_ = null;
this.syncTrustedVaultKeys_ = null;
}
@@ -1003,15 +1010,25 @@ cr.define('cr.login', function() {
this.webview_.src = this.initialFrameUrl_;
return;
}
- // TODO(https://crbug.com/837107): remove this once API is fully
- // stabilized.
- // @example.com is used in tests.
- if (!this.services_ && !this.email_.endsWith('@gmail.com') &&
- !this.email_.endsWith('@example.com')) {
- console.warn('Forcing empty services.');
- this.services_ = [];
+
+ // Could be set either by `userInfo` message or by the
+ // `onUserInfoTimeout_`.
+ const userInfoAvailable = !!this.services_;
+
+ if (userInfoAvailable && this.userInfoTimer_) {
+ window.clearTimeout(this.userInfoTimer_);
+ this.userInfoTimer_ = null;
+ }
+
+ if (this.userInfoTimer_) {
+ // Early out if `userInfoTimer_` is running.
+ return;
}
- if (!this.services_) {
+
+ if (!userInfoAvailable) {
+ // Start `userInfoTimer_` if user info is not available.
+ this.userInfoTimer_ = window.setTimeout(
+ this.onUserInfoTimeout_.bind(this), USER_INFO_WAIT_TIMEOUT_MS);
return;
}
@@ -1362,6 +1379,18 @@ cr.define('cr.login', function() {
const webviewWindow = this.webview_.contentWindow;
return !!webviewWindow && webviewWindow === e.source;
}
+
+ /**
+ * Callback for the user info message waiting timeout.
+ * @private
+ */
+ onUserInfoTimeout_() {
+ console.warn('User info timeout: Forcing empty services.');
+ assert(!this.services_);
+ this.services_ = [];
+ this.userInfoTimer_ = null;
+ this.maybeCompleteAuth_();
+ }
}
// #cr_define_end
diff --git a/chromium/chrome/browser/resources/hats/hats.html b/chromium/chrome/browser/resources/hats/hats.html
deleted file mode 100644
index 18ec74d79e5..00000000000
--- a/chromium/chrome/browser/resources/hats/hats.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <style>
- /* 402 is the project code name used in the content loaded by this page.
- * We need to override their focus behavior to improve keyboard focus
- * accessibility.
- */
- .t402-prompt-websat .t402-prompt-root .t402-button:focus {
- outline-style: auto;
- }
- .t402-css-theme-hats-material1 .t402-titlebar-title-alt:focus {
- outline-style: auto;
- }
- :focus {
- /* Needs to override dynamically loaded, more specific styles. */
- outline-color: rgb(77, 144, 254) !important;
- }
- </style>
- <script>
- /**
- * Close the window when the survey is submitted or when the survey
- * has already been submitted in the past. It is called through HaTS
- * javascript library's accessGrantedCallback function.
- * @param {boolean} isFirstRun Will be true when the user just earned
- * access to the content and false if the user had already had access
- * previously.
- */
- function didFinishSurvey(isFirstRun) {
- if (!isFirstRun) {
- return;
- }
-
- // HaTS 1 library will post the answer through a form to an iframe.
- // Once the iframe is loaded, it will be disposed. We can not listen to
- // the iframe's load event since the previous listener will dispose the
- // iframe so our listener will not be notified. Instead, we listen to
- // the iframe's disposal to make sure the iframe is already loaded,
- // which means the answer has been posted to the server.
- // TODO(weili): Once this issue is fixed in HaTS library
- // (https://b.corp.google.com/issues/143494318), remove the following
- // work around.
- const element = document.querySelector(`iframe[id^='closure_frame']`);
- if (element === null) {
- // No iframe found.
- window.close();
- }
-
- const observer = new MutationObserver(function(mutations) {
- mutations.forEach(function(mutation) {
- for (let i = 0; i < mutation.removedNodes.length; i++) {
- if (element === mutation.removedNodes[i]) {
- window.close();
- }
- }
- })
- });
-
- // Watch for the iframe disposal event.
- observer.observe(element.parentNode, {childList: true});
- }
-
- /**
- * Called after the survey HTML is injected into the page.
- * It is called through HaTS javascript library's afterShowCallback
- * function.
- */
- function onSurveyShown() {
- // Don't show logo on the survey.
- const elements = document.getElementsByClassName('t402-prompt-logo');
- for (const element of elements)
- element.style.display = 'none';
- }
- </script>
- <script src="$i18n{scriptSrc}"></script>
- </head>
- <body>
- </body>
-</html>
diff --git a/chromium/chrome/browser/resources/history/BUILD.gn b/chromium/chrome/browser/resources/history/BUILD.gn
index 0562661982e..619f36920e1 100644
--- a/chromium/chrome/browser/resources/history/BUILD.gn
+++ b/chromium/chrome/browser/resources/history/BUILD.gn
@@ -207,8 +207,8 @@ js_library("app") {
":synced_device_card",
":synced_device_manager",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
diff --git a/chromium/chrome/browser/resources/history/app.js b/chromium/chrome/browser/resources/history/app.js
index e92cda78819..73fe4a0fe5e 100644
--- a/chromium/chrome/browser/resources/history/app.js
+++ b/chromium/chrome/browser/resources/history/app.js
@@ -11,9 +11,9 @@ import './history_toolbar.js';
import './query_manager.js';
import './router.js';
import './shared_style.js';
-import './strings.js';
+import './strings.m.js';
-import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.m.js';
+import {FindShortcutBehavior} from 'chrome://resources/cr_elements/find_shortcut_behavior.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
diff --git a/chromium/chrome/browser/resources/history/history_item.js b/chromium/chrome/browser/resources/history/history_item.js
index 9a651df9a0b..a1e03d7e721 100644
--- a/chromium/chrome/browser/resources/history/history_item.js
+++ b/chromium/chrome/browser/resources/history/history_item.js
@@ -4,7 +4,7 @@
import './searched_label.js';
import './shared_style.js';
-import './strings.js';
+import './strings.m.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/js/icon.m.js';
diff --git a/chromium/chrome/browser/resources/history/history_toolbar.js b/chromium/chrome/browser/resources/history/history_toolbar.js
index b32eebcf69c..0e5a49f707b 100644
--- a/chromium/chrome/browser/resources/history/history_toolbar.js
+++ b/chromium/chrome/browser/resources/history/history_toolbar.js
@@ -5,7 +5,7 @@
import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
import './shared_style.js';
-import './strings.js';
+import './strings.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/chrome/browser/resources/history/lazy_load.js b/chromium/chrome/browser/resources/history/lazy_load.js
index 437a775c575..7fbe4877c4f 100644
--- a/chromium/chrome/browser/resources/history/lazy_load.js
+++ b/chromium/chrome/browser/resources/history/lazy_load.js
@@ -7,6 +7,6 @@ import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js';
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.m.js';
+import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js';
diff --git a/chromium/chrome/browser/resources/history/side_bar.js b/chromium/chrome/browser/resources/history/side_bar.js
index 225d4d4460a..1f1ef5f804a 100644
--- a/chromium/chrome/browser/resources/history/side_bar.js
+++ b/chromium/chrome/browser/resources/history/side_bar.js
@@ -11,9 +11,8 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
-import 'chrome://resources/polymer/v3_0/paper-styles/typography.js';
import './shared_style.js';
-import './strings.js';
+import './strings.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {IronA11yKeysBehavior} from 'chrome://resources/polymer/v3_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
diff --git a/chromium/chrome/browser/resources/history/synced_device_card.js b/chromium/chrome/browser/resources/history/synced_device_card.js
index a90addac436..e0b1f0e66f6 100644
--- a/chromium/chrome/browser/resources/history/synced_device_card.js
+++ b/chromium/chrome/browser/resources/history/synced_device_card.js
@@ -9,7 +9,7 @@ import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import './searched_label.js';
import './shared_style.js';
-import './strings.js';
+import './strings.m.js';
import {FocusRow} from 'chrome://resources/js/cr/ui/focus_row.m.js';
import {getFaviconForPageURL} from 'chrome://resources/js/icon.m.js';
diff --git a/chromium/chrome/browser/resources/history/synced_device_manager.js b/chromium/chrome/browser/resources/history/synced_device_manager.js
index 4f22ca59693..1180309ab18 100644
--- a/chromium/chrome/browser/resources/history/synced_device_manager.js
+++ b/chromium/chrome/browser/resources/history/synced_device_manager.js
@@ -10,7 +10,7 @@ import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import './shared_style.js';
import './synced_device_card.js';
-import './strings.js';
+import './strings.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {FocusGrid} from 'chrome://resources/js/cr/ui/focus_grid.m.js';
diff --git a/chromium/chrome/browser/resources/inline_login/BUILD.gn b/chromium/chrome/browser/resources/inline_login/BUILD.gn
index e9ca290eda2..1c4b241b070 100644
--- a/chromium/chrome/browser/resources/inline_login/BUILD.gn
+++ b/chromium/chrome/browser/resources/inline_login/BUILD.gn
@@ -26,7 +26,7 @@ js_library("inline_login_app") {
"//chrome/browser/resources/gaia_auth_host:authenticator.m",
"//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
diff --git a/chromium/chrome/browser/resources/inline_login/inline_login_app.html b/chromium/chrome/browser/resources/inline_login/inline_login_app.html
index 56938279f5d..fe4a0269e9c 100644
--- a/chromium/chrome/browser/resources/inline_login/inline_login_app.html
+++ b/chromium/chrome/browser/resources/inline_login/inline_login_app.html
@@ -98,7 +98,8 @@
<div class="action-buttons"
hidden$="[[!shouldShowGaiaButtons_(enableGaiaActionButtons_,
currentView_)]]">
- <gaia-action-buttons authenticator="[[authExtHost_]]">
+ <gaia-action-buttons authenticator="[[authExtHost_]]"
+ on-set-focus-to-webview="setFocusToWebview_">
</gaia-action-buttons>
</div>
diff --git a/chromium/chrome/browser/resources/inline_login/inline_login_app.js b/chromium/chrome/browser/resources/inline_login/inline_login_app.js
index a955e4e55d0..e738023eb2a 100644
--- a/chromium/chrome/browser/resources/inline_login/inline_login_app.js
+++ b/chromium/chrome/browser/resources/inline_login/inline_login_app.js
@@ -6,7 +6,7 @@ import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/icons.m.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
-import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.m.js';
+import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
import {isChromeOS} from '//resources/js/cr.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
@@ -255,7 +255,7 @@ Polymer({
/**
* Sends a message 'lstFetchResults'. This is a specific message sent when
- * the inline signin is loaded with reason REASON_FETCH_LST_ONLY. Handlers of
+ * the inline signin is loaded with reason kFetchLstOnly. Handlers of
* this message would expect a single argument a base::Dictionary value that
* contains the values fetched from the gaia sign in endpoint.
* @param {string} arg The string representation of the json data returned by
@@ -360,6 +360,12 @@ Polymer({
/** @type {WelcomePageAppElement} */ (this.$$('welcome-page-app'))
.isSkipCheckboxChecked();
this.browserProxy_.skipWelcomePage(skipChecked);
+ this.setFocusToWebview_();
+ },
+
+ /** @private */
+ setFocusToWebview_() {
+ this.$.signinFrame.focus();
},
// </if>
diff --git a/chromium/chrome/browser/resources/inline_login/welcome_page_app.js b/chromium/chrome/browser/resources/inline_login/welcome_page_app.js
index e24811d5229..f22f98d3c2f 100644
--- a/chromium/chrome/browser/resources/inline_login/welcome_page_app.js
+++ b/chromium/chrome/browser/resources/inline_login/welcome_page_app.js
@@ -22,8 +22,10 @@ Polymer({
.addEventListener(
'click',
() => this.dispatchEvent(new CustomEvent('opened-new-window')));
- this.$$('#incognitoLink')
- .addEventListener('click', () => this.openIncognitoLink_());
+ const incognitoLink = this.$$('#incognitoLink');
+ if (incognitoLink) {
+ incognitoLink.addEventListener('click', () => this.openIncognitoLink_());
+ }
},
/** @return {boolean} */
diff --git a/chromium/chrome/browser/resources/inspect/OWNERS b/chromium/chrome/browser/resources/inspect/OWNERS
index 51748836e09..2f2c92cb036 100644
--- a/chromium/chrome/browser/resources/inspect/OWNERS
+++ b/chromium/chrome/browser/resources/inspect/OWNERS
@@ -1,5 +1,4 @@
dgozman@chromium.org
pfeldman@chromium.org
yangguo@chromium.org
-petermarshall@chromium.org
sigurds@chromium.org
diff --git a/chromium/chrome/browser/resources/inspect/inspect.css b/chromium/chrome/browser/resources/inspect/inspect.css
index e67cc960ba5..0de2d74dd92 100644
--- a/chromium/chrome/browser/resources/inspect/inspect.css
+++ b/chromium/chrome/browser/resources/inspect/inspect.css
@@ -316,6 +316,10 @@ img {
width: 35ex;
}
+.settings-bar button {
+ margin: 7px 0;
+}
+
.node-frontend-action {
margin: 6px 4px;
}
diff --git a/chromium/chrome/browser/resources/inspect/inspect.html b/chromium/chrome/browser/resources/inspect/inspect.html
index ea5cccb11c9..91fa7545b2f 100644
--- a/chromium/chrome/browser/resources/inspect/inspect.html
+++ b/chromium/chrome/browser/resources/inspect/inspect.html
@@ -10,9 +10,7 @@ found in the LICENSE file.
<title>Inspect with Chrome Developer Tools</title>
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="stylesheet" href="inspect.css">
-<script src="chrome://resources/js/assert.js"></script>
-<script src="chrome://resources/js/util.js"></script>
-<script src="inspect.js"></script>
+<script type="module" src="inspect.js"></script>
</head>
<body>
@@ -47,12 +45,12 @@ found in the LICENSE file.
Open dedicated DevTools for Node
</div>
</div>
- <div id="devices-help" hidden="true">No devices detected. Please read the
+ <div id="devices-help" hidden>No devices detected. Please read the
<a href="https://developers.google.com/chrome-developer-tools/docs/remote-debugging">
remote debugging documentation</a> to verify your device is enabled for
USB debugging.
</div>
- <div id="devices-incognito" hidden="true">
+ <div id="devices-incognito" hidden>
Remote debugging is not available in Incognito mode.
</div>
<div id="devices-list"></div>
@@ -77,6 +75,18 @@ found in the LICENSE file.
<div class="content-header">Service workers</div>
<div id="service-workers-list" class="list"></div>
</div>
+ <div id="native-ui" hidden>
+ <div class="content-header">Native UI</div>
+ <div class="settings-bar">
+ <button id="launch-ui-devtools" hidden>
+ Inspect Native UI</button>
+ </div>
+ <div id="ui-devtools-disabled-text" hidden>
+ The following front-end is running:</div>
+ <div id="ui-devtools-enabled-text" hidden>
+ Click to start a single-use session for native UI inspection.</div>
+ <div id="native-ui-list" class="list"></div>
+ </div>
<div id="other">
<div class="content-header">Other</div>
<div id="others-list" class="list"></div>
diff --git a/chromium/chrome/browser/resources/inspect/inspect.js b/chromium/chrome/browser/resources/inspect/inspect.js
index 540280b37ce..4f8fabc1492 100644
--- a/chromium/chrome/browser/resources/inspect/inspect.js
+++ b/chromium/chrome/browser/resources/inspect/inspect.js
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {$} from 'chrome://resources/js/util.m.js';
+
const MIN_VERSION_TAB_CLOSE = 25;
const MIN_VERSION_TARGET_ID = 26;
const MIN_VERSION_NEW_TAB = 29;
@@ -67,22 +69,6 @@ function removeChildren(element_id) {
element.textContent = '';
}
-function removeAdditionalChildren(element_id) {
- const element = $(element_id);
- const elements = element.querySelectorAll('.row.additional');
- for (let i = 0; i != elements.length; i++) {
- element.removeChild(elements[i]);
- }
-}
-
-function removeChildrenExceptAdditional(element_id) {
- const element = $(element_id);
- const elements = element.querySelectorAll('.row:not(.additional)');
- for (let i = 0; i != elements.length; i++) {
- element.removeChild(elements[i]);
- }
-}
-
function onload() {
const tabContents = document.querySelectorAll('#content > div');
for (let i = 0; i != tabContents.length; i++) {
@@ -91,12 +77,14 @@ function onload() {
const tabHeader = document.createElement('div');
tabHeader.className = 'tab-header';
+ tabHeader.id = 'tab-'.concat(tabContent.id);
const button = document.createElement('button');
button.textContent = tabName;
tabHeader.appendChild(button);
tabHeader.addEventListener('click', selectTab.bind(null, tabContent.id));
$('navigation').appendChild(tabHeader);
}
+ $('tab-native-ui').hidden = true;
onHashChange();
initSettings();
sendCommand('init-ui');
@@ -146,20 +134,29 @@ function populateTargets(source, data) {
}
}
-function populateAdditionalTargets(data) {
- removeAdditionalChildren('others-list');
+function populateNativeUITargets(data) {
+ removeChildren('native-ui-list');
for (let i = 0; i < data.length; i++) {
- addAdditionalTargetsToOthersList(data[i]);
+ addToNativeUIList(data[i]);
}
}
+function showNativeUILaunchButton(enabled) {
+ $('native-ui').hidden = false;
+ $('tab-native-ui').hidden = false;
+ $('launch-ui-devtools').hidden = false;
+ $('launch-ui-devtools').disabled = !enabled;
+ $('ui-devtools-disabled-text').hidden = enabled;
+ $('ui-devtools-enabled-text').hidden = !enabled;
+}
+
function populateLocalTargets(data) {
removeChildren('pages-list');
removeChildren('extensions-list');
removeChildren('apps-list');
removeChildren('workers-list');
removeChildren('service-workers-list');
- removeChildrenExceptAdditional('others-list');
+ removeChildren('others-list');
data.sort((a, b) => a.name.localeCompare(b.name));
@@ -518,8 +515,8 @@ function addToOthersList(data) {
addTargetToList(data, $('others-list'), ['url']);
}
-function addAdditionalTargetsToOthersList(data) {
- addTargetToList(data, $('others-list'), ['name', 'url']);
+function addToNativeUIList(data) {
+ addTargetToList(data, $('native-ui-list'), ['name', 'url']);
}
function formatValue(data, property) {
@@ -673,12 +670,8 @@ function addTargetToList(data, list, properties) {
actionBox.className = 'actions';
subrowBox.appendChild(actionBox);
- if (data.isAdditional) {
- addActionLink(
- row, 'inspect', sendCommand.bind(null, 'inspect-additional', data.url),
- false);
- row.classList.add('additional');
- } else if (!data.hasCustomInspectAction && data.type !== 'iframe') {
+ if (!data.isNative && !data.hasCustomInspectAction &&
+ data.type !== 'iframe') {
addActionLink(
row, 'inspect', sendTargetCommand.bind(null, 'inspect', data),
data.hasNoUniqueId || data.adbAttachedForeign);
@@ -722,6 +715,8 @@ function initSettings() {
checkboxSendsCommand(
'discover-tcp-devices-enable', 'set-discover-tcp-targets-enabled');
+ $('launch-ui-devtools')
+ .addEventListener('click', sendCommand.bind(null, 'launch-ui-devtools'));
$('port-forwarding-config-open')
.addEventListener('click', openPortForwardingConfig);
$('tcp-discovery-config-open').addEventListener('click', openTargetsConfig);
@@ -1136,5 +1131,19 @@ function populatePortStatus(devicesStatusMap) {
document.querySelectorAll('.device'), clearPorts);
}
+// Expose functions on |window| since they are called from C++ by name.
+Object.assign(window, {
+ updateDiscoverUsbDevicesEnabled,
+ updatePortForwardingEnabled,
+ updatePortForwardingConfig,
+ updateTCPDiscoveryEnabled,
+ updateTCPDiscoveryConfig,
+ populateNativeUITargets,
+ populateTargets,
+ populatePortStatus,
+ showIncognitoWarning,
+ showNativeUILaunchButton,
+});
+
document.addEventListener('DOMContentLoaded', onload);
window.addEventListener('hashchange', onHashChange);
diff --git a/chromium/chrome/browser/resources/internals/BUILD.gn b/chromium/chrome/browser/resources/internals/BUILD.gn
new file mode 100644
index 00000000000..08739fdcde9
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/common/features.gni")
+import("//tools/grit/grit_rule.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+generate_grd("build_grd") {
+ grd_prefix = "internals"
+ out_grd = "$target_gen_dir/resources.grd"
+
+ if (!is_android) {
+ deps = [ "hello_ts:build_grdp" ]
+ grdp_files = [ "$target_gen_dir/hello_ts/resources.grdp" ]
+ } else {
+ deps = [ "notifications:build_grdp" ]
+ grdp_files = [ "$target_gen_dir/notifications/resources.grdp" ]
+ }
+}
+
+grit("resources") {
+ defines = chrome_grit_defines
+
+ # These arguments are needed since the grd is generated at build time.
+ enable_input_discovery_for_gn_analyze = false
+ source = "$target_gen_dir/resources.grd"
+ deps = [ ":build_grd" ]
+
+ outputs = [
+ "grit/internals_resources.h",
+ "grit/internals_resources_map.cc",
+ "grit/internals_resources_map.h",
+ "internals_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
diff --git a/chromium/chrome/browser/resources/internals/hello_ts/BUILD.gn b/chromium/chrome/browser/resources/internals/hello_ts/BUILD.gn
new file mode 100644
index 00000000000..463d50ef518
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/hello_ts/BUILD.gn
@@ -0,0 +1,31 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+preprocess_folder = "preprocessed"
+
+preprocess_if_expr("preprocess_ts") {
+ in_folder = "./"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ in_files = [ "hello_ts.ts" ]
+}
+
+ts_library("build") {
+ root_dir = "$target_gen_dir/$preprocess_folder"
+ sources = [ "hello_ts.ts" ]
+ deps = [ "//ui/webui/resources:library" ]
+ extra_deps = [ ":preprocess_ts" ]
+}
+
+generate_grd("build_grdp") {
+ grd_prefix = "hello_ts"
+ out_grd = "$target_gen_dir/resources.grdp"
+ deps = [ ":build" ]
+ manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ input_files = [ "hello_ts.html" ]
+ input_files_base_dir = rebase_path(".", "//")
+}
diff --git a/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.html b/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.html
new file mode 100644
index 00000000000..02a0169b3ea
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.html
@@ -0,0 +1,6 @@
+<html>
+<title>Hello TypeScript</title>
+<meta charset="utf-8">
+<script type="module" src="hello_ts.js"></script>
+<body></body>
+</html>
diff --git a/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.ts b/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.ts
new file mode 100644
index 00000000000..ff0c0488b85
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/hello_ts/hello_ts.ts
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {helloWorld} from 'chrome://resources/js/hello_world.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+
+export function helloWorldFromTS(): string {
+ // <if expr="chromeos">
+ return helloWorld() + ' from CrOS TypeScript!';
+ // </if>
+
+ return helloWorld() + ' from TypeScript!';
+}
+
+function main(): void {
+ // Try assert, getDeepActiveElement.
+ assert(getDeepActiveElement() === document.body);
+
+ // Try helloWorldFromTS.
+ document.body.innerText = helloWorldFromTS();
+
+ // Try PromiseResolver with a string.
+ const stringResolver = new PromiseResolver<string>();
+ stringResolver.promise.then((result: string) => {
+ assert(result.includes('done'));
+ });
+ stringResolver.resolve('done');
+
+ // Try PromiseResolver with a number.
+ const numberResolver = new PromiseResolver<number>();
+ numberResolver.promise.then((result: number) => {
+ assert(Math.min(result, 0) === 0);
+ });
+ numberResolver.resolve(5);
+}
+
+window.addEventListener('DOMContentLoaded', main);
diff --git a/chromium/chrome/browser/resources/internals/notifications/BUILD.gn b/chromium/chrome/browser/resources/internals/notifications/BUILD.gn
index 6d22998570c..884ac20f9ab 100644
--- a/chromium/chrome/browser/resources/internals/notifications/BUILD.gn
+++ b/chromium/chrome/browser/resources/internals/notifications/BUILD.gn
@@ -3,6 +3,20 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+assert(is_android)
+
+generate_grd("build_grdp") {
+ grd_prefix = "notifications_internals"
+ out_grd = "$target_gen_dir/resources.grdp"
+ input_files = [
+ "notifications_internals_browser_proxy.js",
+ "notifications_internals.html",
+ "notifications_internals.js",
+ ]
+ input_files_base_dir = rebase_path(".", "//")
+}
js_type_check("closure_compile") {
deps = [
diff --git a/chromium/chrome/browser/resources/internals/query_tiles/BUILD.gn b/chromium/chrome/browser/resources/internals/query_tiles/BUILD.gn
index 7c82b1effbb..0fa66e1c677 100644
--- a/chromium/chrome/browser/resources/internals/query_tiles/BUILD.gn
+++ b/chromium/chrome/browser/resources/internals/query_tiles/BUILD.gn
@@ -4,6 +4,8 @@
import("//third_party/closure_compiler/compile_js.gni")
+assert(is_android)
+
js_type_check("closure_compile") {
deps = [
":query_tiles_internals",
diff --git a/chromium/chrome/browser/resources/internals/user_education/BUILD.gn b/chromium/chrome/browser/resources/internals/user_education/BUILD.gn
new file mode 100644
index 00000000000..08a7a5d0b4b
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/user_education/BUILD.gn
@@ -0,0 +1,23 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
+
+html_to_js("components") {
+ js_files = [ "user_education_internals.js" ]
+}
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ closure_flags = default_closure_args + mojom_js_args
+ deps = [ ":user_education_internals" ]
+}
+
+js_library("user_education_internals") {
+ deps = [
+ "//chrome/browser/ui/webui/internals/user_education:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/internals/user_education/OWNERS b/chromium/chrome/browser/resources/internals/user_education/OWNERS
new file mode 100644
index 00000000000..acabca422d4
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/user_education/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/ui/user_education/OWNERS
diff --git a/chromium/chrome/browser/resources/internals/user_education/index.html b/chromium/chrome/browser/resources/internals/user_education/index.html
new file mode 100644
index 00000000000..c0bbc6d101c
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/user_education/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ <title>User Education Internals</title>
+ </head>
+ <body>
+ <script type="module" src="user_education_internals.js"></script>
+ <user-education-internals></user-education-internals>
+ </body>
+</html> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/internals/user_education/user_education_internals.html b/chromium/chrome/browser/resources/internals/user_education/user_education_internals.html
new file mode 100644
index 00000000000..7132284ab8d
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/user_education/user_education_internals.html
@@ -0,0 +1,11 @@
+<h1>Tutorials</h1>
+<div>
+ <p>Start a tutorial</p>
+ <ul>
+ <template is="dom-repeat" items="[[tutorials_]]">
+ <li>
+ <button id="[[item]]" on-click="startTutorial_">[[item]]</button>
+ </li>
+ </template>
+ </ul>
+</div> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/internals/user_education/user_education_internals.js b/chromium/chrome/browser/resources/internals/user_education/user_education_internals.js
new file mode 100644
index 00000000000..a2ffaed3a19
--- /dev/null
+++ b/chromium/chrome/browser/resources/internals/user_education/user_education_internals.js
@@ -0,0 +1,53 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {UserEducationInternalsPageHandler, UserEducationInternalsPageHandlerRemote} from '/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom-webui.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/** @polymer */
+class UserEducationInternalsElement extends PolymerElement {
+ static get is() {
+ return 'user-education-internals';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ /**
+ * List of tutorials that can be started. Each tutorial has a string
+ * identifier.
+ * @private {!Array<string>}
+ */
+ tutorials_: Array,
+ };
+ }
+
+ constructor() {
+ super();
+ /** @private {UserEducationInternalsPageHandlerRemote} */
+ this.handler_ = UserEducationInternalsPageHandler.getRemote();
+ }
+
+ /** @override */
+ ready() {
+ super.ready();
+ // TODO(crbug.com/1194751): fetch tutorial IDs from handler and display
+ // them.
+ this.tutorials_ = ['test1', 'test2'];
+ }
+
+ /**
+ * @param {!Object} e
+ * @private
+ */
+ startTutorial_(e) {
+ // TODO(crbug.com/1194751): start tutorial through handler
+ }
+}
+
+customElements.define(
+ UserEducationInternalsElement.is, UserEducationInternalsElement);
diff --git a/chromium/chrome/browser/resources/kaleidoscope/BUILD.gn b/chromium/chrome/browser/resources/kaleidoscope/BUILD.gn
deleted file mode 100644
index c23a99d4385..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/closure_args.gni")
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
-
-html_to_js("web_components") {
- js_files = [
- "side_nav_container.js",
- "toolbar.js",
- ]
-}
-
-js_type_check("closure_compile") {
- is_polymer3 = true
- deps = [
- ":side_nav_container",
- ":toolbar",
- ]
-}
-
-js_library("side_nav_container") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
- ]
-}
-
-js_library("toolbar") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar.m",
- ]
-}
diff --git a/chromium/chrome/browser/resources/kaleidoscope/DIR_METADATA b/chromium/chrome/browser/resources/kaleidoscope/DIR_METADATA
deleted file mode 100644
index da324fd8d9a..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/DIR_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail: {
- component: "Internals>Media>UI>Kaleidoscope"
-}
diff --git a/chromium/chrome/browser/resources/kaleidoscope/OWNERS b/chromium/chrome/browser/resources/kaleidoscope/OWNERS
deleted file mode 100644
index 111c7887258..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/browser/media/kaleidoscope/OWNERS
diff --git a/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.html b/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.html
deleted file mode 100644
index b75199f178a..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<style>
- cr-drawer {
- --cr-drawer-background-color: var(--side-nav-background-color);
- }
-</style>
-<cr-drawer id="drawer"><slot></slot></cr-drawer>
diff --git a/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.js b/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.js
deleted file mode 100644
index 21a1b3b167e..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/side_nav_container.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import '//resources/cr_elements/cr_drawer/cr_drawer.m.js';
-
-import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-class KaleidoscopeSideNavContainerElement extends PolymerElement {
- static get is() {
- return 'kaleidoscope-side-nav-container';
- }
-
- static get template() {
- return html`{__html_template__}`;
- }
-
- // Toggles the CrDrawerElement.
- toggle() {
- /** @type {!CrDrawerElement} */ (this.$.drawer).toggle();
- }
-}
-
-customElements.define(
- KaleidoscopeSideNavContainerElement.is,
- KaleidoscopeSideNavContainerElement);
diff --git a/chromium/chrome/browser/resources/kaleidoscope/toolbar.html b/chromium/chrome/browser/resources/kaleidoscope/toolbar.html
deleted file mode 100644
index df5880a45fa..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/toolbar.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<style>
- cr-toolbar {
- --cr-toolbar-background-color: var(--toolbar-background-color);
- --cr-toolbar-height: var(--toolbar-height);
- position: fixed;
- top: 0;
- width: 100%;
- z-index: 99;
- }
-</style>
-<cr-toolbar id="toolbar"
- show-menu
- on-search-changed="onSearchChanged_"
- menu-label="[[menuLabel]]"
- page-name="[[pageName]]"
- search-prompt="[[searchPrompt]]">
- <slot></slot>
-</cr-toolbar>
diff --git a/chromium/chrome/browser/resources/kaleidoscope/toolbar.js b/chromium/chrome/browser/resources/kaleidoscope/toolbar.js
deleted file mode 100644
index 3a56a64bcd4..00000000000
--- a/chromium/chrome/browser/resources/kaleidoscope/toolbar.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import '//resources/cr_elements/cr_toolbar/cr_toolbar.m.js';
-
-import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-class KaleidoscopeToolbarElement extends PolymerElement {
- static get is() {
- return 'kaleidoscope-toolbar';
- }
-
- static get template() {
- return html`{__html_template__}`;
- }
-
- static get properties() {
- return {
- // Sets the tooltip text displayed on the menu button.
- menuLabel: {type: String, value: ''},
-
- // Sets the text displayed beside the menu button.
- pageName: {type: String, value: ''},
-
- // Sets the text displayed in the search box.
- searchPrompt: {type: String, value: ''},
- };
- }
-
- connectedCallback() {
- super.connectedCallback();
- this.hideSearch();
-
- const toolbar = /** @type {CrToolbarElement} */ (this.$.toolbar);
- const input = toolbar.getSearchField().getSearchInput();
- input.addEventListener('keyup', (e) => {
- if (e.keyCode == 13) {
- const event =
- new CustomEvent('ks-search-updated', {detail: input.value});
- this.dispatchEvent(event);
- }
- });
- }
-
- hideSearch() {
- const toolbar = /** @type {CrToolbarElement} */ (this.$.toolbar);
- toolbar.getSearchField().style.display = 'none';
- }
-
- showSearch() {
- const toolbar = /** @type {CrToolbarElement} */ (this.$.toolbar);
- toolbar.getSearchField().style.display = '';
- toolbar.getSearchField().getSearchInput().focus();
- }
-
- /**
- * @param {!CustomEvent<string>} e
- * @private
- */
- onSearchChanged_(e) {
- if (e.detail.length == 0) {
- const event = new CustomEvent('ks-search-cleared');
- this.dispatchEvent(event);
- }
- }
-}
-
-customElements.define(
- KaleidoscopeToolbarElement.is, KaleidoscopeToolbarElement);
diff --git a/chromium/chrome/browser/resources/local_ntp/BUILD.gn b/chromium/chrome/browser/resources/local_ntp/BUILD.gn
index 77846905f27..f6aa5006d36 100644
--- a/chromium/chrome/browser/resources/local_ntp/BUILD.gn
+++ b/chromium/chrome/browser/resources/local_ntp/BUILD.gn
@@ -5,22 +5,11 @@
import("//third_party/closure_compiler/compile_js.gni")
js_type_check("closure_compile") {
- deps = [ ":local_ntp" ]
+ deps = [ ":most_visited_title" ]
}
-js_library("local_ntp") {
- sources = [
- "animations.js",
- "custom_links_edit.js",
- "customize.js",
- "doodles.js",
- "local_ntp.js",
- "most_visited_single.js",
- "most_visited_title.js",
- "most_visited_util.js",
- "utils.js",
- "voice.js",
- ]
+js_library("most_visited_title") {
+ sources = [ "most_visited_title.js" ]
deps = [ "//ui/webui/resources/js:assert" ]
externs_list = [ "externs.js" ]
}
diff --git a/chromium/chrome/browser/resources/local_ntp/animations.css b/chromium/chrome/browser/resources/local_ntp/animations.css
deleted file mode 100644
index a6572eefd20..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/animations.css
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-.ripple-container {
- height: 100%;
- left: 0;
- pointer-events: none;
- position: absolute;
- top: 0;
- width: 100%;
- z-index: 100;
-}
-
-.ripple-effect-mask {
- height: 0;
- left: 0;
- overflow: hidden;
- position: absolute;
- top: 0;
- width: 0;
-}
-
-.ripple-effect {
- background-color: rgba(var(--GB600-rgb), .1);
- border-radius: 50%;
- height: 1px;
- pointer-events: none;
- transition: width, height, margin, background-color 400ms 250ms;
- transition-duration: 400ms;
- transition-timing-function: cubic-bezier(.4, 0, .2, 1);
- width: 1px;
-}
-
-@media (prefers-color-scheme: dark) {
- .ripple-effect {
- background-color: rgba(var(--GB300-rgb), .32);
- }
-}
-
-button.primary .ripple-effect {
- background-color: rgba(255, 255, 255, .32);
-}
-
-@media (prefers-color-scheme: dark) {
- button.primary .ripple-effect {
- background-color: rgba(0, 0, 0, .08);
- }
-}
-
-button.paper {
- border: none;
- border-radius: 4px;
- font-size: 12px;
- font-weight: 500;
- line-height: 1.6;
- min-height: 32px;
- padding: 0 16px;
- position: relative;
- transition-duration: 200ms;
- transition-property: background-color, color, box-shadow, border;
- transition-timing-function: cubic-bezier(.4, 0, .2, 1);
-}
-
-button.paper:not(:disabled) {
- cursor: pointer;
-}
-
-button.paper:disabled {
- transition: none;
-}
-
-button.paper.primary {
- background-color: rgb(var(--GB600-rgb));
- color: white;
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.primary {
- background-color: rgb(var(--GB300-rgb));
- color: rgb(var(--GG900-rgb));
- }
-}
-
-button.paper.primary:disabled {
- background-color: rgb(var(--GG100-rgb));
- color: rgb(var(--GG600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.primary:disabled {
- background-color: rgb(var(--GG800-rgb));
- color: rgb(var(--GG600-rgb));
- }
-}
-
-button.paper.primary:hover:not(:disabled) {
- background-color: rgb(41, 123, 231);
- box-shadow: 0 1px 2px 0 rgba(var(--GB500-rgb), .3),
- 0 1px 3px 1px rgba(var(--GB500-rgb), .15);
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.primary:hover:not(:disabled) {
- background-color: rgb(133, 173, 238);
- }
-}
-
-button.paper.primary:active:not(:disabled) {
- box-shadow: 0 1px 2px 0 rgba(var(--GB500-rgb), .3),
- 0 3px 6px 2px rgba(var(--GB500-rgb), .15);
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.primary:active:not(:disabled) {
- background-color: rgb(115, 160, 223);
- box-shadow: 0 1px 2px 0 rgba(var(--GB500-rgb), .3),
- 0 3px 6px 2px rgba(var(--GB500-rgb), .15);
- }
-}
-
-button.paper.secondary {
- background-color: white;
- border: 1px solid rgb(var(--GG300-rgb));
- color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.secondary {
- background-color: transparent;
- border-color: rgb(var(--GG700-rgb));
- color: rgb(var(--GB300-rgb));
- }
-}
-
-button.paper.secondary:disabled {
- border-color: rgb(var(--GG100-rgb));
- color: rgb(var(--GG600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.secondary:disabled {
- border-color: rgb(var(--GG800-rgb));
- color: rgb(var(--GG600-rgb));
- }
-}
-
-button.paper.secondary:hover:not(:disabled) {
- background-color: rgba(var(--GB500-rgb), .04);
- border-color: rgb(var(--GB100-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.secondary:hover:not(:disabled) {
- background-color: rgba(var(--GB300-rgb), .04);
- border-color: rgba(var(--GB300-rgb), .5);
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .3),
- 0 1px 3px 1px rgba(0, 0, 0, .15);
- }
-}
-
-button.paper.secondary:active:not(:disabled) {
- background-color: white;
- border-color: white;
- box-shadow: 0 1px 2px 0 rgba(var(--GG800-rgb), .3),
- 0 3px 6px 2px rgba(var(--GG800-rgb), .15);
-}
-
-@media (prefers-color-scheme: dark) {
- button.paper.secondary:active:not(:disabled) {
- background-color: rgba(var(--GB300-rgb), .08);
- border-color: rgba(var(--GB300-rgb), .5);
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .3),
- 0 3px 6px 2px rgba(0, 0, 0, .15);
- }
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/animations.js b/chromium/chrome/browser/resources/local_ntp/animations.js
deleted file mode 100644
index 8083a5e2282..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/animations.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * @license
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * Contains common animations used in the main NTP page and its iframes.
- */
-const animations = {};
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-animations.CLASSES = {
- RIPPLE: 'ripple',
- RIPPLE_CONTAINER: 'ripple-container',
- RIPPLE_EFFECT_MASK: 'ripple-effect-mask',
- RIPPLE_EFFECT: 'ripple-effect',
-};
-
-/**
- * The duration of the ripple animation.
- * @type {number}
- * @const
- */
-animations.RIPPLE_DURATION_MS = 800;
-
-/**
- * The max size of the ripple animation.
- * @type {number}
- * @const
- */
-animations.RIPPLE_MAX_RADIUS_PX = 300;
-
-/**
- * Enables ripple animations for elements with CLASSES.RIPPLE. The target
- * element must have position relative or absolute.
- */
-animations.addRippleAnimations = function() {
- const ripple = (event) => {
- const target = event.target;
- const rect = target.getBoundingClientRect();
- const x = Math.round(event.clientX - rect.left);
- const y = Math.round(event.clientY - rect.top);
-
- // Calculate radius
- const corners = [
- {x: 0, y: 0},
- {x: rect.width, y: 0},
- {x: 0, y: rect.height},
- {x: rect.width, y: rect.height},
- ];
- const distance = (x1, y1, x2, y2) => {
- const xDelta = x1 - x2;
- const yDelta = y1 - y2;
- return Math.sqrt(xDelta * xDelta + yDelta * yDelta);
- };
- const cornerDistances = corners.map(function(corner) {
- return Math.round(distance(x, y, corner.x, corner.y));
- });
- const radius = Math.min(
- animations.RIPPLE_MAX_RADIUS_PX, Math.max.apply(Math, cornerDistances));
-
- const ripple = document.createElement('div');
- const rippleMask = document.createElement('div');
- const rippleContainer = document.createElement('div');
- ripple.classList.add(animations.CLASSES.RIPPLE_EFFECT);
- rippleMask.classList.add(animations.CLASSES.RIPPLE_EFFECT_MASK);
- rippleContainer.classList.add(animations.CLASSES.RIPPLE_CONTAINER);
- rippleMask.appendChild(ripple);
- rippleContainer.appendChild(rippleMask);
- target.appendChild(rippleContainer);
- // Ripple start location
- ripple.style.marginLeft = x + 'px';
- ripple.style.marginTop = y + 'px';
-
- rippleMask.style.width = target.offsetWidth + 'px';
- rippleMask.style.height = target.offsetHeight + 'px';
- rippleMask.style.borderRadius =
- window.getComputedStyle(target).borderRadius;
-
- // Start transition/ripple
- ripple.style.width = radius * 2 + 'px';
- ripple.style.height = radius * 2 + 'px';
- ripple.style.marginLeft = x - radius + 'px';
- ripple.style.marginTop = y - radius + 'px';
- ripple.style.backgroundColor = 'rgba(0, 0, 0, 0)';
-
- window.setTimeout(function() {
- ripple.remove();
- rippleMask.remove();
- rippleContainer.remove();
- }, animations.RIPPLE_DURATION_MS);
- };
-
- const rippleElements =
- document.querySelectorAll('.' + animations.CLASSES.RIPPLE);
- for (let i = 0; i < rippleElements.length; i++) {
- rippleElements[i].addEventListener('mousedown', ripple);
- }
-};
diff --git a/chromium/chrome/browser/resources/local_ntp/chevron.svg b/chromium/chrome/browser/resources/local_ntp/chevron.svg
deleted file mode 100644
index 5a60ec24783..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/chevron.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.884 16.123a1.229 1.229 0 0 1-1.768 0l-6.25-6.428a1.3 1.3 0 0 1-.366-.91c0-.709.56-1.285 1.25-1.285.345 0 .657.144.884.377L12 13.397l5.366-5.52a1.23 1.23 0 0 1 .884-.377c.69 0 1.25.576 1.25 1.286a1.3 1.3 0 0 1-.366.909l-6.25 6.428z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.css b/chromium/chrome/browser/resources/local_ntp/custom_links_edit.css
deleted file mode 100644
index a8864a26d16..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.css
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-body {
- overflow: hidden;
-}
-
-.mouse-navigation {
- outline: none;
-}
-
-#edit-link-dialog {
- background-color: #fff;
- border: none;
- border-radius: 8px;
- bottom: 0;
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
- margin: auto;
- min-width: 320px;
- padding: 16px;
- top: 0;
- z-index: 10000;
-}
-
-@media (prefers-color-scheme: dark) {
- #edit-link-dialog {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- box-shadow: var(--dark-mode-shadow);
- }
-}
-
-#edit-link-dialog::backdrop {
- background: transparent;
-}
-
-#edit-link-dialog > div {
- width: 100%;
-}
-
-#dialog-title {
- color: rgb(var(--GG900-rgb));
- font-size: 15px;
- line-height: 24px;
- margin-bottom: 16px;
-}
-
-@media (prefers-color-scheme: dark) {
- #dialog-title {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-.field-container {
- margin-bottom: 16px;
-}
-
-.field-title {
- color: rgb(var(--GG700-rgb));
- font-size: 10px;
- font-weight: 500;
- margin-bottom: 4px;
-}
-
-@media (prefers-color-scheme: dark) {
- .field-title {
- color: rgb(var(--GG400-rgb));
- }
-}
-
-.input-container {
- position: relative;
-}
-
-input {
- background-color: rgb(var(--GG100-rgb));
- border: none;
- border-radius: 4px;
- caret-color: rgb(var(--GB600-rgb));
- color: rgb(var(--GG900-rgb));
- font-size: 13px;
- line-height: 1.6;
- min-height: 32px;
- outline: none;
- padding-inline-end: 8px;
- padding-inline-start: 8px;
- width: calc(100% - 16px);
-}
-
-html[dir=rtl] input {
- text-align: right; /* csschecker-disable-line left-right */
-}
-
-@media (prefers-color-scheme: dark) {
- input {
- background-color: rgba(0, 0, 0, .3);
- caret-color: rgb(var(--GB300-rgb));
- color: rgb(var(--GG200-rgb));
- }
-}
-
-input::placeholder {
- color: rgba(var(--GG900-rgb), .38);
-}
-
-@media (prefers-color-scheme: dark) {
- input::placeholder {
- color: rgb(var(--GG500-rgb));
- }
-}
-
-.underline {
- border-bottom: 2px solid rgb(var(--GB600-rgb));
- bottom: 0;
- box-sizing: border-box;
- left: 0;
- margin: auto;
- opacity: 0;
- position: absolute;
- right: 0;
- transition: opacity 120ms ease-out, width 0ms linear 180ms;
- width: 0;
-}
-
-@media (prefers-color-scheme: dark) {
- .underline {
- border-color: rgb(var(--GB300-rgb));
- }
-}
-
-input:focus + .underline {
- opacity: 1;
- transition: width 180ms ease-out, opacity 120ms ease-in;
- width: 100%;
-}
-
-.field-title.focused {
- color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .field-title.focused {
- color: rgb(var(--GB300-rgb));
- }
-}
-
-.error-msg {
- color: rgb(var(--GR600-rgb));
- display: none;
- font-size: 10px;
- font-weight: 400;
- margin-top: 6px;
-}
-
-@media (prefers-color-scheme: dark) {
- .error-msg {
- color: rgb(var(--GR300-rgb));
- }
-}
-
-.invalid label {
- color: rgb(var(--GR600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .invalid label {
- color: rgb(var(--GR300-rgb));
- }
-}
-
-.invalid .error-msg {
- display: block;
-}
-
-.invalid .underline {
- border-color: rgb(var(--GR600-rgb));
- opacity: 1;
- transition: width 180ms ease-out, opacity 120ms ease-in;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- .invalid .underline {
- border-color: rgb(var(--GR300-rgb));
- }
-}
-
-.buttons-container {
- display: flex;
- justify-content: space-between;
- margin-top: 24px;
-}
-
-.buttons-container span + span {
- margin-inline-start: 16px;
-}
-
-#cancel {
- margin-inline-end: 8px;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.html b/chromium/chrome/browser/resources/local_ntp/custom_links_edit.html
deleted file mode 100644
index a9022a1aa84..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype html>
-<html>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
-<head>
- <base target="_top">
- <meta charset="utf-8">
- <link rel="stylesheet" type="text/css" href="animations.css">
- <link rel="stylesheet" type="text/css" href="local-ntp-common.css">
- <link rel="stylesheet" type="text/css" href="edit.css">
- <script src="utils.js"></script>
- <script src="animations.js"></script>
- <script src="edit.js"></script>
-</head>
-<body>
- <dialog id="edit-link-dialog">
- <div id="dialog-title"></div>
- <form id="edit-form" action="">
- <div id="title" class="field-container">
- <label id="title-field-name" class="field-title"></label>
- <div class="input-container">
- <input id="title-field" class="field-input" type="text"
- autocomplete="off" tabindex="0"></input>
- <div class="underline"></div>
- </div>
- </div>
- <div id="url" class="field-container">
- <label id="url-field-name" class="field-title"></label>
- <div class="input-container">
- <input id="url-field" class="field-input" type="text" autocomplete="off"
- spellcheck="false" dir="ltr" tabindex="0" required></input>
- <div class="underline"></div>
- </div>
- <div id="invalid-url" class="error-msg"></div>
- </div>
- <div class="buttons-container">
- <span>
- <button id="delete" class="paper secondary ripple" type="button" tabindex="0"></button>
- </span>
- <span>
- <button id="cancel" class="paper secondary ripple" type="button" tabindex="0"></button>
- <button type="submit" id="done" class="paper primary ripple" tabindex="0"></button>
- </span>
- </div>
- </form>
- </dialog>
-</body>
-</html>
diff --git a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.js b/chromium/chrome/browser/resources/local_ntp/custom_links_edit.js
deleted file mode 100644
index aca62bf00c7..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/custom_links_edit.js
+++ /dev/null
@@ -1,320 +0,0 @@
-/**
- * @license
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * Enum for ids.
- * @enum {string}
- * @const
- */
-const IDS = {
- CANCEL: 'cancel', // Cancel button.
- DELETE: 'delete', // Delete button.
- DIALOG_TITLE: 'dialog-title', // Dialog title.
- DONE: 'done', // Done button.
- EDIT_DIALOG: 'edit-link-dialog', // Dialog element.
- FORM: 'edit-form', // The edit link form.
- INVALID_URL: 'invalid-url', // Invalid URL error message.
- TITLE_FIELD: 'title-field', // Title input field.
- TITLE_FIELD_NAME: 'title-field-name', // Title input field name.
- URL_FIELD: 'url-field', // URL input field.
- URL_FIELD_CONTAINER: 'url', // URL input field container.
- URL_FIELD_NAME: 'url-field-name', // URL input field name.
-};
-
-/**
- * Enum for key codes.
- * @enum {number}
- * @const
- */
-const KEYCODES = {
- ENTER: 13,
- ESC: 27,
- SPACE: 32,
- TAB: 9,
-};
-
-/**
- * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP,
- * or 'chrome-search://local-ntp' for the local NTP.
- * @const {string}
- */
-const DOMAIN_ORIGIN = '{{ORIGIN}}';
-
-/**
- * List of parameters passed by query args.
- * @type {Object}
- */
-let queryArgs = {};
-
-/**
- * The prepopulated data for the form. Includes title, url, and rid.
- * @type {Object}
- */
-const prepopulatedLink = {
- rid: -1,
- title: '',
- url: '',
-};
-
-/**
- * The title of the dialog when adding a link.
- * @type {string}
- */
-let addLinkTitle = '';
-
-/**
- * The title of the dialog when editing a link.
- * @type {string}
- */
-let editLinkTitle = '';
-
-/**
- * The accessibility title of remove link button.
- * @type {string}
- */
-let deleteLinkTitle = '';
-
-/**
- * Handler for the 'linkData' message from the host page. Pre-populates the url
- * and title fields with link's data obtained using the rid. Called if we are
- * editing an existing link.
- * @param {number} rid Restricted id of the link to be edited.
- */
-function prepopulateFields(rid) {
- if (!isFinite(rid)) {
- return;
- }
-
- // Grab the link data from the embeddedSearch API.
- const data = chrome.embeddedSearch.newTabPage.getMostVisitedItemData(rid);
- if (!data) {
- return;
- }
- prepopulatedLink.rid = rid;
- $(IDS.TITLE_FIELD).value = prepopulatedLink.title = data.title;
- $(IDS.TITLE_FIELD).dir = data.direction || 'ltr';
- $(IDS.URL_FIELD).value = prepopulatedLink.url = data.url;
-
- // Set accessibility names.
- $(IDS.DELETE).setAttribute('aria-label', deleteLinkTitle + ' ' + data.title);
- $(IDS.DONE).setAttribute('aria-label', editLinkTitle + ' ' + data.title);
- $(IDS.DONE).title = editLinkTitle;
-}
-
-/**
- * Shows the invalid URL error message until the URL field is modified.
- */
-function showInvalidUrlUntilTextInput() {
- $(IDS.URL_FIELD_CONTAINER).classList.add('invalid');
- const reenable = (event) => {
- $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid');
- $(IDS.URL_FIELD).removeEventListener('input', reenable);
- };
- $(IDS.URL_FIELD).addEventListener('input', reenable);
-}
-
-/**
- * Send a message to close the edit dialog. Called when the edit flow has been
- * completed. If the fields were unchanged, does not update the link data.
- */
-function finishEditLink() {
- let newUrl = '';
- let newTitle = '';
-
- const urlValue = $(IDS.URL_FIELD).value;
- if (urlValue != prepopulatedLink.url) {
- newUrl = chrome.embeddedSearch.newTabPage.fixupAndValidateUrl(urlValue);
- // Show error message for invalid urls.
- if (!newUrl || (newUrl && !utils.isSchemeAllowed(newUrl))) {
- showInvalidUrlUntilTextInput();
- $(IDS.DONE).disabled = true; // Disable submit until text input.
- return;
- }
- }
-
- const titleValue = $(IDS.TITLE_FIELD).value;
- if (!titleValue) { // Set the URL input as the title if no title is provided.
- newTitle = urlValue;
- } else if (titleValue != prepopulatedLink.title) {
- newTitle = titleValue;
- }
-
- // Update the link only if a field was changed.
- if (newUrl || newTitle) {
- chrome.embeddedSearch.newTabPage.updateCustomLink(
- prepopulatedLink.rid, newUrl, newTitle);
- }
- closeDialog();
-}
-
-/**
- * Call the EmbeddedSearchAPI to delete the link. Closes the dialog.
- * @param {!Event} event The click event.
- */
-function deleteLink(event) {
- chrome.embeddedSearch.newTabPage.deleteMostVisitedItem(prepopulatedLink.rid);
- closeDialog();
-}
-
-/**
- * Send a message to close the edit dialog, clears the url and title fields, and
- * resets the button statuses. Called when the edit flow has been completed.
- */
-function closeDialog() {
- window.parent.postMessage({cmd: 'closeDialog'}, DOMAIN_ORIGIN);
- // Small delay to allow the dialog to close before cleaning up.
- window.setTimeout(() => {
- $(IDS.FORM).reset();
- $(IDS.TITLE_FIELD).dir = '';
- $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid');
- $(IDS.DELETE).disabled = false;
- $(IDS.DONE).disabled = false;
- prepopulatedLink.rid = -1;
- prepopulatedLink.title = '';
- prepopulatedLink.url = '';
- }, 10);
-}
-
-/**
- * Send a message to refocus the edited tile's three dot menu or the add
- * shortcut tile after the cancel button is clicked.
- * @param {Event} event The keydown event
- */
-function focusBackOnCancel(event) {
- if (event.keyCode === KEYCODES.ENTER || event.keyCode === KEYCODES.SPACE) {
- const message = {cmd: 'focusMenu', rid: prepopulatedLink.rid};
- window.parent.postMessage(message, DOMAIN_ORIGIN);
- event.preventDefault();
- closeDialog();
- }
-}
-
-/**
- * Event handler for messages from the host page.
- * @param {Event} event Event received.
- */
-function handlePostMessage(event) {
- const cmd = event.data.cmd;
- const args = event.data;
- if (cmd === 'linkData') {
- if (args.rid) { // We are editing a link, prepopulate the link data.
- document.title = editLinkTitle;
- $(IDS.DIALOG_TITLE).textContent = editLinkTitle;
- prepopulateFields(args.rid);
- } else { // We are adding a link, disable the delete button.
- document.title = addLinkTitle;
- $(IDS.DIALOG_TITLE).textContent = addLinkTitle;
- $(IDS.DELETE).disabled = true;
- $(IDS.DONE).disabled = true;
- // Set accessibility names.
- $(IDS.DONE).setAttribute('aria-label', addLinkTitle);
- $(IDS.DONE).title = addLinkTitle;
- }
- // Timeout is required to allow the iframe to become visible before focusing
- // the first input field.
- window.setTimeout(() => {
- $(IDS.TITLE_FIELD).select();
- }, 10);
- }
-}
-
-/**
- * Does some initialization and shows the dialog window.
- */
-function init() {
- // Parse query arguments.
- const query = window.location.search.substring(1).split('&');
- queryArgs = {};
- for (let i = 0; i < query.length; ++i) {
- const val = query[i].split('=');
- if (val[0] == '') {
- continue;
- }
- queryArgs[decodeURIComponent(val[0])] = decodeURIComponent(val[1]);
- }
-
- document.title = queryArgs['editTitle'];
-
- // Enable RTL.
- if (queryArgs['rtl'] == '1') {
- document.documentElement.setAttribute('dir', 'rtl');
- }
-
- // Populate text content.
- addLinkTitle = queryArgs['addTitle'];
- editLinkTitle = queryArgs['editTitle'];
- deleteLinkTitle = queryArgs['linkRemove'];
- $(IDS.DIALOG_TITLE).textContent = addLinkTitle;
- $(IDS.TITLE_FIELD_NAME).textContent = queryArgs['nameField'];
- $(IDS.TITLE_FIELD_NAME).setAttribute('aria-label', queryArgs['nameField']);
- $(IDS.URL_FIELD_NAME).textContent = queryArgs['urlField'];
- $(IDS.URL_FIELD_NAME).setAttribute('aria-label', queryArgs['urlField']);
- $(IDS.DELETE).textContent = $(IDS.DELETE).title = queryArgs['linkRemove'];
- $(IDS.CANCEL).textContent = $(IDS.CANCEL).title = queryArgs['linkCancel'];
- $(IDS.CANCEL).setAttribute('aria-label', queryArgs['linkCancel']);
- $(IDS.DONE).textContent = $(IDS.DONE).title = queryArgs['linkDone'];
- $(IDS.INVALID_URL).textContent = queryArgs['invalidUrl'];
-
- // Set up event listeners.
- document.body.onkeydown = (event) => {
- if (event.keyCode === KEYCODES.ESC) {
- // Close the iframe instead of just this dialog.
- event.preventDefault();
- closeDialog();
- }
- };
- $(IDS.DELETE).addEventListener('click', deleteLink);
- $(IDS.CANCEL).addEventListener('click', closeDialog);
- $(IDS.CANCEL).addEventListener('keydown', focusBackOnCancel);
- $(IDS.FORM).addEventListener('submit', (event) => {
- // Prevent the form from submitting and modifying the URL.
- event.preventDefault();
- finishEditLink();
- });
- const finishEditOrClose = (event) => {
- if (event.keyCode === KEYCODES.ENTER) {
- event.preventDefault();
- if (!$(IDS.DONE).disabled) {
- finishEditLink();
- }
- }
- };
- $(IDS.TITLE_FIELD).onkeydown = finishEditOrClose;
- $(IDS.URL_FIELD).onkeydown = finishEditOrClose;
- utils.disableOutlineOnMouseClick($(IDS.DELETE));
- utils.disableOutlineOnMouseClick($(IDS.CANCEL));
- utils.disableOutlineOnMouseClick($(IDS.DONE));
-
- animations.addRippleAnimations();
-
- // Change input field name to blue on input field focus.
- const changeColor = (fieldTitle) => {
- $(fieldTitle).classList.toggle('focused');
- };
- $(IDS.TITLE_FIELD)
- .addEventListener('focusin', () => changeColor(IDS.TITLE_FIELD_NAME));
- $(IDS.TITLE_FIELD)
- .addEventListener('blur', () => changeColor(IDS.TITLE_FIELD_NAME));
- $(IDS.URL_FIELD)
- .addEventListener('focusin', () => changeColor(IDS.URL_FIELD_NAME));
- $(IDS.URL_FIELD)
- .addEventListener('blur', () => changeColor(IDS.URL_FIELD_NAME));
- // Disables the "Done" button when the URL field is empty.
- $(IDS.URL_FIELD)
- .addEventListener(
- 'input',
- () => $(IDS.DONE).disabled = ($(IDS.URL_FIELD).value.trim() === ''));
-
- utils.setPlatformClass(document.body);
-
- $(IDS.EDIT_DIALOG).showModal();
-
- window.addEventListener('message', handlePostMessage);
-}
-
-window.addEventListener('DOMContentLoaded', init);
diff --git a/chromium/chrome/browser/resources/local_ntp/customize.css b/chromium/chrome/browser/resources/local_ntp/customize.css
deleted file mode 100644
index 8c444dbb67b..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/customize.css
+++ /dev/null
@@ -1,722 +0,0 @@
-/* Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-#custom-bg,
-#custom-bg-preview {
- background-position: center center;
- background-repeat: no-repeat;
- background-size: cover;
- height: 100%;
- left: 0;
- margin: 0;
- opacity: 0;
- padding: 0;
- position: fixed;
- top: 0;
- transition: opacity 700ms;
- width: 100%;
-}
-
-#edit-bg {
- align-items: center;
- border-radius: 500px;
- bottom: 16px;
- cursor: pointer;
- display: flex;
- height: 32px;
- justify-content: center;
- min-width: 32px;
- position: fixed;
- right: 16px;
- width: fit-content;
-}
-
-#edit-bg.ep-enhanced {
- background-color: rgb(255, 255, 255);
- box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 1px 2px rgba(0, 0, 0, .23);
-}
-
-#edit-bg:hover,
-#edit-bg:active {
- background-color: rgba(255, 255, 255, .1);
-}
-
-#edit-bg:hover.ep-enhanced {
- background-color: rgb(var( --GB050-rgb));
-}
-
-
-@media (prefers-color-scheme: dark) {
- #edit-bg.ep-enhanced {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- }
-}
-
-@media (prefers-color-scheme: dark) {
- #edit-bg:hover.ep-enhanced {
- background-color: rgb(50, 51, 54);
- }
-}
-
-html[dir=rtl] #edit-bg {
- left: 16px;
- right: auto;
-}
-
-.non-google-page #edit-bg {
- display: none;
-}
-
-#edit-bg-icon {
- -webkit-mask-image: url(icons/icon_pencil.svg);
- -webkit-mask-position-x: center;
- -webkit-mask-position-y: center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 16px;
- background-color: rgb(255, 255, 255);
- cursor: pointer;
- height: 16px;
- margin-inline-start: 0;
- width: 16px;
-}
-
-.ep-enhanced #edit-bg-icon {
- background-color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .ep-enhanced #edit-bg-icon {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-#edit-bg-text {
- color: rgb(var(--GB600-rgb));
- display: none;
- font-size: 14px;
- line-height: 1;
- padding-inline-end: 12px;
- padding-inline-start: 8px;
- user-select: none;
-}
-
-@media (prefers-color-scheme: dark) {
- .ep-enhanced #edit-bg-text {
- color: rgb(var(--GB300-rgb));
- }
-}
-
-@media (min-width: 550px) {
- .ep-enhanced #edit-bg-icon {
- margin-inline-start: 12px;
- }
-
- .ep-enhanced #edit-bg-text {
- display: inline;
- }
-}
-
-@media (max-height: 100px) {
- #edit-bg {
- display: none;
- }
-}
-
-#edit-bg-dialog::backdrop {
- background: transparent;
-}
-
-#edit-bg-dialog {
- background: #fff;
- border: none;
- border-radius: 8px;
- border-width: thin;
- bottom: 44px;
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
- left: auto;
- padding: 0;
- position: fixed;
- right: 16px;
-}
-
-@media (prefers-color-scheme: dark) {
- #edit-bg-dialog {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- box-shadow: var(--dark-mode-shadow);
- }
-}
-
-#edit-bg-menu {
- padding: 0 0 16px 0;
- width: 325px;
-}
-
-html[dir=rtl] #edit-bg-dialog {
- left: 16px;
- right: auto;
-}
-
-#edit-bg-title {
- color: rgb(var(--GG900-rgb));
- font-size: 15px;
- height: 30px;
- padding: 16px 0 0 16px;
-}
-
-html[dir=rtl] #edit-bg-title {
- padding: 16px 16px 0 0;
-}
-
-@media (prefers-color-scheme: dark) {
- #edit-bg-title {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-.using-mouse-nav .bg-option:focus {
- outline: none;
-}
-
-.bg-option {
- color: rgb(var(--GG800-rgb));
- font-size: 13px;
- height: 40px;
- line-height: 40px;
-}
-
-@media (prefers-color-scheme: dark) {
- .bg-option {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-.bg-option:hover {
- background-color: rgb(var(--GG100-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .bg-option:hover {
- background-color: rgb(var(--GG800-rgb));
- }
-}
-
-.bg-option-img {
- background-size: 24px 24px;
- display: inline-block;
- height: 24px;
- line-height: normal;
- margin: 0 0 0 16px;
- text-align: center;
- vertical-align: middle;
- width: 24px;
-}
-
-html[dir=rtl] .bg-option-img {
- margin: 0 16px 0 0;
-}
-
-.bg-option.bg-option-disabled {
- opacity: .28;
-}
-
-@media (prefers-color-scheme: dark) {
- .bg-option.bg-option-disabled {
- opacity: .38;
- }
-}
-
-.bg-option.bg-option-disabled:focus {
- outline: none;
-}
-
-.bg-option.bg-option-disabled:hover {
- background-color: transparent;
-}
-
-#edit-bg-default-wallpapers .bg-option-img {
- background: url(icons/wallpapers.svg) no-repeat center;
-}
-
-#edit-bg-upload-image .bg-option-img {
- background: rgb(var(--GG100-rgb)) url(icons/upload.svg) no-repeat center;
- border-radius: 50%;
-}
-
-#edit-bg-divider {
- border-bottom: 1px solid rgb(var(--GG200-rgb));
- margin: 8px 0;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #edit-bg-divider {
- border-color: rgba(255, 255, 255, .1);
- }
-}
-
-#custom-links-restore-default .bg-option-img {
- background: rgb(var(--GG100-rgb)) url(icons/link_gray.svg) no-repeat center;
- border-radius: 50%;
-}
-
-#edit-bg-restore-default .bg-option-img {
- background: rgb(var(--GG100-rgb)) url(icons/chrome.svg) no-repeat center;
- border-radius: 50%;
-}
-
-.bg-option-text {
- display: inline-block;
- line-height: normal;
- max-width: 250px;
- overflow: hidden;
- padding-inline-start: 16px;
- text-align: start;
- text-overflow: ellipsis;
- vertical-align: middle;
- white-space: nowrap;
-}
-
-/* The width here should match that used in customBackgrounds.getNextTile. */
-#bg-sel-menu {
- background-color: #fff;
- border: none;
- border-radius: 8px;
- bottom: 0;
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
- height: 400px;
- max-height: 100vh; /* Constrain the dialog within viewport boundaries. */
- padding: 0;
- position: fixed;
- top: 0;
- /* Suitable for 3 columns of tiles on all platforms, accounting for larger
- * scrollbar width on Windows.*/
- width: 517px;
- z-index: 10000;
-}
-
-/* Prevent footer from overlapping with header at small window heights. */
-@media only screen and (max-height: 116px) {
- #bg-sel-menu {
- max-height: 116px;
- }
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-menu {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- box-shadow: var(--dark-mode-shadow);
- }
-}
-
-/* The width is decided by the longest text length plus 16px margin on the
-right, so that every text can stay on its row even on the smallest window */
-@media (max-width: 356px) {
- #edit-bg-menu {
- width: 232px;
- }
-}
-
-#bg-sel-tiles {
- height: 284px;
- /* Compress the tile section in order to constrain the dialog within viewport
- * boundaries. 116px = 284px - (header + footer height) */
- max-height: calc(100vh - 116px);
- overflow-y: scroll;
- padding-inline-start: 8px;
-}
-
-#bg-sel-tiles::-webkit-scrollbar-track {
- display: none;
-}
-
-.using-mouse-nav :focus {
- outline: none;
-}
-
-#bg-sel-title-bar {
- border-bottom: 1px solid rgb(var(--GG200-rgb));
- font-size: 15px;
- height: 51px;
- line-height: 52px;
- text-align: center;
- user-select: none;
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-title-bar {
- border-color: rgba(255, 255, 255, .1);
- }
-}
-
-#bg-sel-back {
- background: url(../../../../ui/webui/resources/images/icon_arrow_back.svg) no-repeat center;
- background-size: 20px 20px;
- display: none;
- height: 20px;
- outline: none;
- position: relative;
- width: 20px;
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-back {
- background: transparent;
- }
-}
-
-/* We use ::after without content to provide the masked arrow element. */
-@media (prefers-color-scheme: dark) {
- #bg-sel-back::after {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_arrow_back.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 20px;
- background-color: rgb(var(--GG200-rgb));
- content: '';
- display: block;
- height: 20px;
- left: 0;
- position: absolute;
- top: 0;
- width: 20px;
- }
-}
-
-#bg-sel-back-circle {
- border-radius: 50%;
- display: none;
- height: 36px;
- margin: 8px 8px 0 16px;
- outline: none;
- width: 36px;
-}
-
-#bg-sel-back-circle:active,
-#bg-sel-back-circle:focus {
- background: rgb(var(--GG300-rgb));
- background-position: center;
- background-size: 36px 36px;
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-back-circle:active,
- #bg-sel-back-circle:focus {
- background: rgb(var(--GG800-rgb));
- }
-}
-
-.is-col-sel #bg-sel-back {
- display: none;
- text-align: start;
-}
-
-.is-col-sel #bg-sel-back-circle {
- display: none;
- text-align: start;
-}
-
-.is-img-sel #bg-sel-back-circle {
- display: inline-block;
- float: left;
- margin: 8px 0 0 8px;
-}
-
-html[dir=rtl] .is-img-sel #bg-sel-back-circle {
- display: inline-block;
- float: right;
- margin: 8px 8px 0 0;
-}
-
-.is-img-sel #bg-sel-back {
- display: inline-block;
- float: left;
- margin: 8px 0 0 8px;
-}
-
-html[dir=rtl] .is-img-sel #bg-sel-back {
- float: right;
- margin: 8px 8px 0 0;
- transform: scaleX(-1);
-}
-
-#bg-sel-title {
- color: rgb(var(--GG900-rgb));
- display: inline-block;
- height: 20px;
- line-height: 20px;
- margin: 8px 0 0 0;
- text-align: center;
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-title {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-.is-col-sel #bg-sel-title {
- padding-inline-start: 0;
- text-align: center;
-}
-
-.is-img-sel #bg-sel-title {
- float: left;
- margin: 16px 0 0 8px;
-}
-
-html[dir=rtl] .is-img-sel #bg-sel-title {
- float: right;
- margin: 16px 8px 0 0;
- text-align: start;
-}
-
-#bg-sel-footer {
- border-top: 1px solid rgb(var(--GG200-rgb));
- bottom: 0;
- color: rgb(var(--GG800-rgb));
- height: 64px;
- padding-inline-start: 0;
- position: absolute;
- text-align: end;
- user-select: none;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #bg-sel-footer {
- border-color: rgba(255, 255, 255, .1);
- }
-}
-
-.bg-sel-footer-button {
- margin-top: 16px;
-}
-
-.bg-sel-footer-button:disabled {
- transition: none;
-}
-
-#bg-sel-footer-done {
- margin-inline-end: 16px;
-}
-
-#bg-sel-footer-cancel {
- margin-inline-end: 8px;
-}
-
-.bg-sel-tile {
- background-size: cover;
- height: 100%;
- opacity: 0;
- transition: opacity 700ms;
- width: 100%;
-}
-
-html[dir=rtl] .bg-sel-tile-bg {
- margin: 6px 8px 0 0;
-}
-
-.bg-sel-tile-bg {
- background-color: rgb(var(--GG100-rgb));
- background-size: cover;
- display: inline-block;
- height: 117px;
- margin: 6px 0 0 8px;
- position: relative;
- /* 8px for the margin on the left */
- width: calc(33% - 8px);
-}
-
-@media (prefers-color-scheme: dark) {
- .bg-sel-tile-bg {
- background-color: rgb(var(--GG900-rgb));
- }
-}
-
-/* The width here should match that used in customBackgrounds.getTilesWide. */
-@media (max-width: 517px) {
- #bg-sel-menu {
- width: 352px;
- }
-
- .bg-sel-tile-bg {
- /* 8px for the margin on the left */
- width: calc(49.5% - 8px);
- }
-}
-
-@media (max-width: 356px) {
- #bg-sel-menu {
- width: 188px;
- }
-
- .bg-sel-tile-bg {
- /* 8px for the margin on the left */
- width: calc(99% - 8px);
- }
-}
-
-.bg-selected {
- border-radius: 4px;
-}
-
-.selected-border {
- border: 2px solid rgba(var(--GB600-rgb), .4);
- border-radius: 4px;
- box-sizing: border-box;
- height: 100%;
- position: relative;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- .selected-border {
- border-color: rgb(var(--GB300-rgb));
- }
-}
-
-.selected-circle {
- background: #FFF no-repeat center;
- border-radius: 50%;
- height: 22px;
- left: 66px;
- position: absolute;
- top: 46px;
- width: 22px;
-}
-
-html[dir=rtl] .selected-circle {
- left: auto;
- right: 66px;
-}
-
-@media (prefers-color-scheme: dark) {
- .selected-circle {
- background-color: rgb(var(--GG900-rgb));
- }
-}
-
-.selected-check {
- background: url(../../../../ui/webui/resources/images/check_circle.svg) no-repeat center;
- background-size: 28px 28px;
- height: 28px;
- left: 63px;
- position: absolute;
- top: 43px;
- width: 28px;
-}
-
-html[dir=rtl] .selected-check {
- left: auto;
- right: 63px;
-}
-
-@media (prefers-color-scheme: dark) {
- .selected-check {
- background: transparent;
- }
-}
-
-/* We use ::after without content to provide the masked check element. */
-@media (prefers-color-scheme: dark) {
- .selected-check::after {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/check_circle.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 28px;
- background-color: rgb(var(--GB300-rgb));
- content: '';
- display: block;
- height: 28px;
- left: 0;
- position: absolute;
- top: 0;
- width: 28px;
- }
-}
-
-.bg-sel-tile-title {
- background-color: rgba(var(--GG900-rgb), .71);
- bottom: 0;
- box-sizing: border-box;
- color: #FFF;
- display: inline-block;
- font-size: 13px;
- line-height: 1.6;
- min-height: 32px;
- overflow: hidden;
- padding: 8px 16px;
- position: absolute;
- text-overflow: ellipsis;
- user-select: none;
- vertical-align: middle;
- white-space: nowrap;
- width: 100%;
-}
-
-.bg-selected .bg-sel-tile-title {
- width: 118px;
-}
-
-#custom-bg-attr {
- border-radius: 8px;
- bottom: 16px;
- color: white;
- font-weight: 500;
- left: 16px;
- padding: 8px;
- position: fixed;
- text-shadow: 0 0 16px rgba(0, 0, 0, .3);
- z-index: -1;
-}
-
-html[dir=rtl] #custom-bg-attr {
- left: auto;
- position: fixed;
- right: 16px;
-}
-
-#attr1,
-#attr2 {
- clear: both;
- color: inherit;
- float: left;
- font-size: 13px;
- height: 20px;
- line-height: 20px;
- max-width: 50vw;
- overflow: hidden;
- text-overflow: ellipsis;
- vertical-align: middle;
- white-space: nowrap;
-}
-
-[dir=rtl] #attr1,
-[dir=rtl] #attr2 {
- float: right;
-}
-
-#custom-bg-attr #attr1 ~ #attr2 {
- font-size: 11px;
-}
-
-#custom-bg-attr.attr-link:hover {
- background: rgba(var(--GG900-rgb), .1);
-}
-
-#link-icon {
- background: url(icons/link.svg);
- background-size: 10px 10px;
- display: inline-block;
- height: 10px;
- margin-inline-end: 8px;
- vertical-align: middle;
- width: 10px;
-}
-
-#link-icon.single-attr {
- background-size: 16px 16px;
- height: 18px;
- width: 16px;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/customize.js b/chromium/chrome/browser/resources/local_ntp/customize.js
deleted file mode 100644
index 9d3bff01765..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/customize.js
+++ /dev/null
@@ -1,2484 +0,0 @@
-/**
- * @license
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-'use strict';
-
-// TODO(crbug.com/937570): After the RP launches this should be renamed to
-// customizationMenu along with the file, and large parts can be
-// refactored/removed.
-const customize = {};
-
-/**
- * The browser embeddedSearch.newTabPage object.
- * @type {Object}
- */
-let ntpApiHandle;
-
-/**
- * The different types of events that are logged from the NTP. This enum is
- * used to transfer information from the NTP JavaScript to the renderer and is
- * not used as a UMA enum histogram's logged value.
- * Note: Keep in sync with common/ntp_logging_events.h
- * @enum {number}
- * @const
- */
-customize.LOG_TYPE = {
- // The 'Chrome backgrounds' menu item was clicked.
- NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED: 40,
- // The 'Upload an image' menu item was clicked.
- NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED: 41,
- // The 'Restore default background' menu item was clicked.
- // NOTE: NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED (42) is logged on the
- // backend.
- // The attribution link on a customized background image was clicked.
- NTP_CUSTOMIZE_ATTRIBUTION_CLICKED: 43,
- // The 'Restore default shortcuts' menu item was clicked.
- NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED: 46,
- // A collection was selected in the 'Chrome backgrounds' dialog.
- NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION: 47,
- // An image was selected in the 'Chrome backgrounds' dialog.
- NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE: 48,
- // 'Cancel' was clicked in the 'Chrome backgrounds' dialog.
- NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL: 49,
- // NOTE: NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE (50) is logged on the backend.
- // The richer picker was opened.
- NTP_CUSTOMIZATION_MENU_OPENED: 64,
- // 'Cancel' was clicked in the richer picker.
- NTP_CUSTOMIZATION_MENU_CANCEL: 65,
- // 'Done' was clicked in the richer picker.
- NTP_CUSTOMIZATION_MENU_DONE: 66,
- // 'Upload from device' selected in the richer picker.
- NTP_BACKGROUND_UPLOAD_FROM_DEVICE: 67,
- // A collection tile was selected in the richer picker.
- NTP_BACKGROUND_OPEN_COLLECTION: 68,
- // A image tile was selected in the richer picker.
- NTP_BACKGROUND_SELECT_IMAGE: 69,
- // The back arrow was clicked in the richer picker.
- NTP_BACKGROUND_BACK_CLICK: 72,
- // The 'No background' tile was selected in the richer picker.
- NTP_BACKGROUND_DEFAULT_SELECTED: 73,
- // The custom links option in the shortcuts submenu was clicked.
- NTP_CUSTOMIZE_SHORTCUT_CUSTOM_LINKS_CLICKED: 78,
- // The Most Visited option in the shortcuts submenu was clicked.
- NTP_CUSTOMIZE_SHORTCUT_MOST_VISITED_CLICKED: 79,
- // The visibility toggle in the shortcuts submenu was clicked.
- NTP_CUSTOMIZE_SHORTCUT_VISIBILITY_TOGGLE_CLICKED: 80,
- // The 'refresh daily' toggle was licked in the richer picker.
- NTP_BACKGROUND_REFRESH_TOGGLE_CLICKED: 81,
-};
-
-/**
- * Enum for key codes.
- * @enum {number}
- * @const
- */
-customize.KEYCODES = {
- BACKSPACE: 8,
- DOWN: 40,
- ENTER: 13,
- ESC: 27,
- LEFT: 37,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38,
-};
-
-/**
- * Array for keycodes corresponding to arrow keys.
- * @type Array
- * @const
- */
-customize.arrowKeys = [/*Left*/ 37, /*Up*/ 38, /*Right*/ 39, /*Down*/ 40];
-
-/**
- * Enum for HTML element ids.
- * @enum {string}
- * @const
- */
-customize.IDS = {
- ATTR1: 'attr1',
- ATTR2: 'attr2',
- ATTRIBUTIONS: 'custom-bg-attr',
- BACK_CIRCLE: 'bg-sel-back-circle',
- BACKGROUNDS_BUTTON: 'backgrounds-button',
- BACKGROUNDS_DEFAULT: 'backgrounds-default',
- BACKGROUNDS_DEFAULT_ICON: 'backgrounds-default-icon',
- BACKGROUNDS_DISABLED_MENU: 'backgrounds-disabled-menu',
- BACKGROUNDS_IMAGE_MENU: 'backgrounds-image-menu',
- BACKGROUNDS_MENU: 'backgrounds-menu',
- BACKGROUNDS_UPLOAD: 'backgrounds-upload',
- BACKGROUNDS_UPLOAD_ICON: 'backgrounds-upload-icon',
- CANCEL: 'bg-sel-footer-cancel',
- COLOR_PICKER: 'color-picker',
- COLOR_PICKER_TILE: 'color-picker-tile',
- COLOR_PICKER_CONTAINER: 'color-picker-container',
- COLOR_PICKER_ICON: 'color-picker-icon',
- COLORS_BUTTON: 'colors-button',
- COLORS_DEFAULT_ICON: 'colors-default-icon',
- COLORS_THEME: 'colors-theme',
- COLORS_THEME_NAME: 'colors-theme-name',
- COLORS_THEME_UNINSTALL: 'colors-theme-uninstall',
- COLORS_THEME_WEBSTORE_LINK: 'colors-theme-link',
- COLORS_MENU: 'colors-menu',
- CUSTOMIZATION_MENU: 'customization-menu',
- CUSTOM_BG: 'custom-bg',
- CUSTOM_BG_PREVIEW: 'custom-bg-preview',
- CUSTOM_LINKS_RESTORE_DEFAULT: 'custom-links-restore-default',
- CUSTOM_LINKS_RESTORE_DEFAULT_TEXT: 'custom-links-restore-default-text',
- DEFAULT_WALLPAPERS: 'edit-bg-default-wallpapers',
- DEFAULT_WALLPAPERS_TEXT: 'edit-bg-default-wallpapers-text',
- DONE: 'bg-sel-footer-done',
- EDIT_BG: 'edit-bg',
- EDIT_BG_DIALOG: 'edit-bg-dialog',
- EDIT_BG_DIVIDER: 'edit-bg-divider',
- EDIT_BG_MENU: 'edit-bg-menu',
- MENU_BACK_CIRCLE: 'menu-back-circle',
- MENU_CANCEL: 'menu-cancel',
- MENU_DONE: 'menu-done',
- MENU_TITLE: 'menu-title',
- LINK_ICON: 'link-icon',
- MENU: 'bg-sel-menu',
- OPTIONS_TITLE: 'edit-bg-title',
- REFRESH_DAILY_WRAPPER: 'refresh-daily-wrapper',
- REFRESH_TOGGLE: 'refresh-daily-toggle',
- RESTORE_DEFAULT: 'edit-bg-restore-default',
- RESTORE_DEFAULT_TEXT: 'edit-bg-restore-default-text',
- SHORTCUTS_BUTTON: 'shortcuts-button',
- SHORTCUTS_HIDE: 'sh-hide',
- SHORTCUTS_HIDE_TOGGLE: 'sh-hide-toggle',
- SHORTCUTS_MENU: 'shortcuts-menu',
- SHORTCUTS_OPTION_CUSTOM_LINKS: 'sh-option-cl',
- SHORTCUTS_OPTION_MOST_VISITED: 'sh-option-mv',
- UPLOAD_IMAGE: 'edit-bg-upload-image',
- UPLOAD_IMAGE_TEXT: 'edit-bg-upload-image-text',
- TILES: 'bg-sel-tiles',
- TITLE: 'bg-sel-title',
-};
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-customize.CLASSES = {
- ATTR_SMALL: 'attr-small',
- ATTR_LINK: 'attr-link',
- COLLECTION_DIALOG: 'is-col-sel',
- COLLECTION_SELECTED: 'bg-selected', // Highlight selected tile
- COLLECTION_TILE: 'bg-sel-tile', // Preview tile for background customization
- COLLECTION_TILE_BG: 'bg-sel-tile-bg',
- COLLECTION_TITLE: 'bg-sel-tile-title', // Title of a background image
- HIDDEN_SELECTED: 'hidden-selected',
- IMAGE_DIALOG: 'is-img-sel',
- ON_IMAGE_MENU: 'on-img-menu',
- OPTION: 'bg-option',
- OPTION_DISABLED: 'bg-option-disabled', // The menu option is disabled.
- MENU_SHOWN: 'menu-shown',
- MOUSE_NAV: 'using-mouse-nav',
- SELECTED: 'selected',
- SELECTED_BORDER: 'selected-border',
- SELECTED_CHECK: 'selected-check',
- SELECTED_CIRCLE: 'selected-circle',
- SINGLE_ATTR: 'single-attr',
- VISIBLE: 'visible'
-};
-
-/**
- * Enum for background option menu entries, in the order they appear in the UI.
- * @enum {number}
- * @const
- */
-customize.MENU_ENTRIES = {
- CHROME_BACKGROUNDS: 0,
- UPLOAD_IMAGE: 1,
- CUSTOM_LINKS_RESTORE_DEFAULT: 2,
- RESTORE_DEFAULT: 3,
-};
-
-/**
- * The semi-transparent, gradient overlay for the custom background. Intended
- * to improve readability of NTP elements/text.
- * @type {string}
- * @const
- */
-customize.CUSTOM_BACKGROUND_OVERLAY =
- 'linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.3))';
-
-/**
- * Number of rows in the custom background dialog to preload.
- * @type {number}
- * @const
- */
-customize.ROWS_TO_PRELOAD = 3;
-
-// These should match the corresponding values in local_ntp.js, that control the
-// mv-notice element.
-customize.delayedHideNotification = -1;
-customize.NOTIFICATION_TIMEOUT = 10000;
-
-/**
- * Were the background tiles already created.
- * @type {boolean}
- */
-customize.builtTiles = false;
-
-/**
- * The default title for the richer picker.
- * @type {string}
- */
-customize.richerPicker_defaultTitle = '';
-
-/**
- * Called when the error notification should be shown.
- * @type {?Function}
- */
-customize.showErrorNotification = null;
-
-/**
- * Called when the custom link notification should be hidden.
- * @type {?Function}
- */
-customize.hideCustomLinkNotification = null;
-
-/**
- * Id of the currently open collection.
- * @type {string}
- */
-customize.currentCollectionId = '';
-
-/**
- * The currently active Background submenu. This can be the collections page or
- * a collection's image menu. Defaults to the collections page.
- * @type {Object}
- */
-customize.richerPicker_openBackgroundSubmenu = {
- menuId: customize.IDS.BACKGROUNDS_MENU,
- title: '',
-};
-
-/**
- * The currently selected submenu (i.e. Background, Shortcuts, etc.) in the
- * richer picker.
- * @type {Object}
- */
-customize.richerPicker_selectedSubmenu = {
- menuButton: null, // The submenu's button element in the sidebar.
- menu: null, // The submenu's menu element.
- // The submenu's title. Will usually be |customize.richerPicker_defaultTitle|
- // unless this is a background collection's image menu.
- title: '',
-};
-
-/**
- * The currently selected options in the customization menu.
- * @type {Object}
- */
-customize.selectedOptions = {
- background: null, // Contains the background image tile.
- // The data associated with a currently selected background.
- backgroundData: null,
- // Contains the selected shortcut type's DOM element, i.e. either custom links
- // or most visited.
- shortcutType: null,
- shortcutsAreHidden: false,
- color: null, // Contains the selected color tile's DOM element.
-};
-
-/**
- * The preselected options in the richer picker.
- * @type {Object}
- */
-customize.preselectedOptions = {
- // Contains the selected type's DOM element, i.e. either custom links or most
- // visited.
- shortcutType: null,
- shortcutsAreHidden: false,
- colorsMenuTile: null, // Selected tile for Colors menu.
- backgroundsMenuTile: null, // Selected tile for Backgrounds menu.
-};
-
-/**
- * Whether tiles for Colors menu already loaded.
- * @type {boolean}
- */
-customize.colorsMenuLoaded = false;
-
-
-/**
- * Default color for custom color picker in hex format.
- * @type {string}
- */
-customize.defaultCustomColor = '#000000';
-
-/**
- * Custom color picked in hex format.
- * @type {string}
- */
-customize.customColorPicked = customize.defaultCustomColor;
-
-/**
- * Sets the visibility of the settings menu and individual options depending on
- * their respective features.
- */
-customize.setMenuVisibility = function() {
- // Reset all hidden values.
- $(customize.IDS.EDIT_BG).hidden = false;
- $(customize.IDS.DEFAULT_WALLPAPERS).hidden = false;
- $(customize.IDS.UPLOAD_IMAGE).hidden = false;
- $(customize.IDS.RESTORE_DEFAULT).hidden = false;
- $(customize.IDS.EDIT_BG_DIVIDER).hidden = false;
-};
-
-/**
- * Called when user changes the theme.
- */
-customize.onThemeChange = function() {
- // Hide the settings menu or individual options if the related features are
- // disabled.
- customize.setMenuVisibility();
-
- // If theme changed after Colors menu was loaded, then reload theme info.
- if (customize.colorsMenuLoaded) {
- customize.colorsMenuOnThemeChange();
- }
-};
-
-/**
- * Display custom background image attributions on the page.
- * @param {string} attributionLine1 First line of attribution.
- * @param {string} attributionLine2 Second line of attribution.
- * @param {string} attributionActionUrl Url to learn more about the image.
- */
-customize.setAttribution = function(
- attributionLine1, attributionLine2, attributionActionUrl) {
- const attributionBox = $(customize.IDS.ATTRIBUTIONS);
- const hasActionUrl = attributionActionUrl !== '';
-
- const attr1 = document.createElement(hasActionUrl ? 'a' : 'span');
- attr1.id = customize.IDS.ATTR1;
- const attr2 = document.createElement(hasActionUrl ? 'a' : 'span');
- attr2.id = customize.IDS.ATTR2;
-
- if (attributionLine1 !== '') {
- // Shouldn't be changed from textContent for security assurances.
- attr1.textContent = attributionLine1;
- if (hasActionUrl) {
- attr1.href = attributionActionUrl;
- }
- $(customize.IDS.ATTRIBUTIONS).appendChild(attr1);
- }
-
- if (attributionLine2 !== '') {
- // Shouldn't be changed from textContent for security assurances.
- attr2.textContent = attributionLine2;
- if (hasActionUrl) {
- attr2.href = attributionActionUrl;
- }
- attributionBox.appendChild(attr2);
- }
-
- if (hasActionUrl) {
- const attr = (attributionLine2 !== '' ? attr2 : attr1);
- attr.classList.add(customize.CLASSES.ATTR_LINK);
-
- const linkIcon = document.createElement('div');
- linkIcon.id = customize.IDS.LINK_ICON;
- // Enlarge link-icon when there is only one line of attribution
- if (attributionLine2 === '') {
- linkIcon.classList.add(customize.CLASSES.SINGLE_ATTR);
- }
- attr.insertBefore(linkIcon, attr.firstChild);
-
- attributionBox.onclick = e => {
- if (attr1.contains(e.target) || attr2.contains(e.target)) {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_ATTRIBUTION_CLICKED);
- }
- };
- }
- attributionBox.classList.toggle(customize.CLASSES.ATTR_LINK, hasActionUrl);
-};
-
-customize.clearAttribution = function() {
- $(customize.IDS.ATTRIBUTIONS).innerHTML = '';
-};
-
-customize.unselectTile = function() {
- if (configData.richerPicker) {
- return;
- }
- $(customize.IDS.DONE).disabled = true;
- customize.selectedOptions.background = null;
- $(customize.IDS.DONE).tabIndex = -1;
-};
-
-/**
- * Remove all collection tiles from the container when the dialog
- * is closed.
- */
-customize.resetSelectionDialog = function() {
- $(customize.IDS.TILES).scrollTop = 0;
- const tileContainer = $(customize.IDS.TILES);
- while (tileContainer.firstChild) {
- tileContainer.removeChild(tileContainer.firstChild);
- }
- customize.unselectTile();
-};
-
-/**
- * Apply selected styling to |menuButton| and make corresponding |menu| visible.
- * If |title| is not specified, the default title will be used.
- * @param {?Element} menuButton The sidebar button element to apply styling to.
- * @param {?Element} menu The submenu element to apply styling to.
- * @param {string=} title The submenu's title.
- */
-customize.richerPicker_showSubmenu = function(menuButton, menu, title = '') {
- if (!menuButton || !menu) {
- return;
- }
-
- customize.richerPicker_hideOpenSubmenu();
-
- if (!title) { // Use the default title if not specified.
- title = customize.richerPicker_defaultTitle;
- }
-
- // Save this as the currently open submenu.
- customize.richerPicker_selectedSubmenu.menuButton = menuButton;
- customize.richerPicker_selectedSubmenu.menu = menu;
- customize.richerPicker_selectedSubmenu.title = title;
-
- menuButton.classList.toggle(customize.CLASSES.SELECTED, true);
- menu.classList.toggle(customize.CLASSES.MENU_SHOWN, true);
- $(customize.IDS.MENU_TITLE).textContent = title;
- menuButton.setAttribute('aria-selected', true);
-
- // Indicate if this is a Background collection's image menu, which will enable
- // the back button.
- $(customize.IDS.CUSTOMIZATION_MENU)
- .classList.toggle(
- customize.CLASSES.ON_IMAGE_MENU,
- menu.id === customize.IDS.BACKGROUNDS_IMAGE_MENU);
-};
-
-/**
- * Hides the currently open submenu if any.
- */
-customize.richerPicker_hideOpenSubmenu = function() {
- if (!customize.richerPicker_selectedSubmenu.menuButton) {
- return; // No submenu is open.
- }
-
- customize.richerPicker_selectedSubmenu.menuButton.classList.toggle(
- customize.CLASSES.SELECTED, false);
- customize.richerPicker_selectedSubmenu.menu.classList.toggle(
- customize.CLASSES.MENU_SHOWN, false);
- $(customize.IDS.MENU_TITLE).textContent = customize.richerPicker_defaultTitle;
- customize.richerPicker_selectedSubmenu.menuButton.setAttribute(
- 'aria-selected', false);
-
- customize.richerPicker_selectedSubmenu.menuButton = null;
- customize.richerPicker_selectedSubmenu.menu = null;
- customize.richerPicker_selectedSubmenu.title =
- customize.richerPicker_defaultTitle;
-};
-
-/**
- * Remove image tiles and maybe swap back to main background menu.
- */
-customize.richerPicker_resetImageMenu = function() {
- const backgroundMenu = $(customize.IDS.BACKGROUNDS_MENU);
- const imageMenu = $(customize.IDS.BACKGROUNDS_IMAGE_MENU);
- const menu = $(customize.IDS.CUSTOMIZATION_MENU);
- const menuTitle = $(customize.IDS.MENU_TITLE);
-
- imageMenu.innerHTML = '';
- menu.classList.toggle(customize.CLASSES.ON_IMAGE_MENU, false);
- customize.richerPicker_showSubmenu(
- $(customize.IDS.BACKGROUNDS_BUTTON), backgroundMenu);
- customize.richerPicker_openBackgroundSubmenu.menuId =
- customize.IDS.BACKGROUNDS_MENU;
- customize.richerPicker_openBackgroundSubmenu.title = '';
- backgroundMenu.scrollTop = 0;
-};
-
-/**
- * Close the collection selection dialog and cleanup the state
- * @param {?Element} menu The dialog to be closed
- */
-customize.closeCollectionDialog = function(menu) {
- if (!menu) {
- return;
- }
- menu.close();
- customize.resetSelectionDialog();
-};
-
-/**
- * Close and reset the dialog if this is not the richer picker, and set the
- * background.
- * @param {string} url The url of the selected background.
- */
-customize.setBackground = function(
- url, attributionLine1, attributionLine2, attributionActionUrl,
- collection_id) {
- if (!configData.richerPicker) {
- customize.closeCollectionDialog($(customize.IDS.MENU));
- }
- window.chrome.embeddedSearch.newTabPage.setBackgroundInfo(
- url, attributionLine1, attributionLine2, attributionActionUrl,
- collection_id);
-};
-
-/**
- * Apply selected shortcut options.
- */
-customize.richerPicker_setShortcutOptions = function() {
- const shortcutTypeChanged = customize.preselectedOptions.shortcutType !==
- customize.selectedOptions.shortcutType;
- if (customize.preselectedOptions.shortcutsAreHidden !==
- customize.selectedOptions.shortcutsAreHidden) {
- // Only trigger a notification if |toggleMostVisitedOrCustomLinks| will not
- // be called immediately after. Successive |onmostvisitedchange| events can
- // interfere with each other.
- chrome.embeddedSearch.newTabPage.toggleShortcutsVisibility(
- !shortcutTypeChanged);
- }
- if (shortcutTypeChanged) {
- chrome.embeddedSearch.newTabPage.toggleMostVisitedOrCustomLinks();
- }
-};
-
-/**
- * Creates a tile for the customization menu with a title.
- * @param {string} id The id for the new element.
- * @param {string} imageUrl The background image url for the new element.
- * @param {string} name The name for the title of the new element.
- * @param {Object} dataset The dataset for the new element.
- * @param {?Function} onClickInteraction Function for onclick interaction.
- * @param {?Function} onKeyInteraction Function for onkeydown interaction.
- */
-customize.createTileWithTitle = function(
- id, imageUrl, name, dataset, onClickInteraction, onKeyInteraction) {
- const tile = customize.createTileThumbnail(
- id, imageUrl, dataset, onClickInteraction, onKeyInteraction);
- tile.setAttribute('aria-label', name);
- tile.title = name;
- customize.fadeInImageTile(tile, imageUrl, null);
-
- const title = document.createElement('div');
- title.classList.add(customize.CLASSES.COLLECTION_TITLE);
- title.textContent = name;
- tile.appendChild(title);
-
- const tileBackground = document.createElement('div');
- tileBackground.classList.add(customize.CLASSES.COLLECTION_TILE_BG);
- tileBackground.appendChild(tile);
- return tileBackground;
-};
-
-/**
- * Creates a tile for the customization menu without a title.
- * @param {string} id The id for the new element.
- * @param {string} imageUrl The background image url for the new element.
- * @param {Object} dataset The dataset for the new element.
- * @param {?Function} onClickInteraction Function for onclick interaction.
- * @param {?Function} onKeyInteraction Function for onkeydown interaction.
- */
-customize.createTileWithoutTitle = function(
- id, imageUrl, dataset, onClickInteraction, onKeyInteraction) {
- const tile = customize.createTileThumbnail(
- id, imageUrl, dataset, onClickInteraction, onKeyInteraction);
- customize.fadeInImageTile(tile, imageUrl, null);
-
- const tileBackground = document.createElement('div');
- tileBackground.classList.add(customize.CLASSES.COLLECTION_TILE_BG);
- tileBackground.appendChild(tile);
- return tileBackground;
-};
-
-/**
- * Create a tile thumbnail with image for customization menu.
- * @param {string} id The id for the new element.
- * @param {string} imageUrl The background image url for the new element.
- * @param {Object} dataset The dataset for the new element.
- * @param {?Function} onClickInteraction Function for onclick interaction.
- * @param {?Function} onKeyInteraction Function for onkeydown interaction.
- */
-customize.createTileThumbnail = function(
- id, imageUrl, dataset, onClickInteraction, onKeyInteraction) {
- const tile = document.createElement('div');
- tile.id = id;
- tile.classList.add(customize.CLASSES.COLLECTION_TILE);
- tile.style.backgroundImage = 'url(' + imageUrl + ')';
- for (const key in dataset) {
- tile.dataset[key] = dataset[key];
- }
- tile.tabIndex = -1;
-
- // Accessibility support for screen readers.
- tile.setAttribute('role', 'button');
- tile.setAttribute('aria-pressed', false);
-
- tile.onclick = onClickInteraction;
- tile.onkeydown = onKeyInteraction;
- return tile;
-};
-
-/**
- * Get the number of tiles in a row according to current window width.
- * @return {number} the number of tiles per row
- */
-customize.getTilesWide = function() {
- // Browser window can only fit two columns. Should match "#bg-sel-menu" width.
- if ($(customize.IDS.MENU).offsetWidth < 517) {
- return 2;
- } else if ($(customize.IDS.MENU).offsetWidth < 356) {
- // Browser window can only fit one column. Should match @media (max-width:
- // 356) "#bg-sel-menu" width.
- return 1;
- }
-
- return 3;
-};
-
-/**
- * @param {number} deltaX Change in the x direction.
- * @param {number} deltaY Change in the y direction.
- * @param {Element} current The current tile.
- */
-customize.richerPicker_getNextTile = function(deltaX, deltaY, current) {
- const menu = $(customize.IDS.CUSTOMIZATION_MENU);
- const container = customize.richerPicker_selectedSubmenu.menu;
-
- const tiles = Array.from(
- container.getElementsByClassName(customize.CLASSES.COLLECTION_TILE_BG));
- let nextIndex = tiles.indexOf(current.parentElement);
- if (deltaX != 0) {
- nextIndex += deltaX;
- } else if (deltaY != 0) {
- const startingTop = current.parentElement.getBoundingClientRect().top;
- const startingLeft = current.parentElement.getBoundingClientRect().left;
-
- // Search until a tile in a different row and the same column is found.
- while (tiles[nextIndex] &&
- (tiles[nextIndex].getBoundingClientRect().top == startingTop ||
- tiles[nextIndex].getBoundingClientRect().left != startingLeft)) {
- nextIndex += deltaY;
- }
- }
- if (tiles[nextIndex]) {
- return tiles[nextIndex].children[0];
- }
- return null;
-};
-
-/**
- * Get the next tile when the arrow keys are used to navigate the grid.
- * Returns null if the tile doesn't exist.
- * @param {number} deltaX Change in the x direction.
- * @param {number} deltaY Change in the y direction.
- * @param {Element} currentElem The current tile.
- */
-customize.getNextTile = function(deltaX, deltaY, currentElem) {
- if (configData.richerPicker) {
- return customize.richerPicker_getNextTile(deltaX, deltaY, currentElem);
- }
- const current = currentElem.dataset.tileIndex;
- let idPrefix = 'coll_tile_';
- if ($(customize.IDS.MENU)
- .classList.contains(customize.CLASSES.IMAGE_DIALOG)) {
- idPrefix = 'img_tile_';
- }
-
- if (deltaX != 0) {
- const target = parseInt(current, /*radix=*/ 10) + deltaX;
- return $(idPrefix + target);
- } else if (deltaY != 0) {
- let target = parseInt(current, /*radix=*/ 10);
- let nextTile = $(idPrefix + target);
- const startingTop = nextTile.getBoundingClientRect().top;
- const startingLeft = nextTile.getBoundingClientRect().left;
-
- // Search until a tile in a different row and the same column is found.
- while (nextTile &&
- (nextTile.getBoundingClientRect().top == startingTop ||
- nextTile.getBoundingClientRect().left != startingLeft)) {
- target += deltaY;
- nextTile = $(idPrefix + target);
- }
- return nextTile;
- }
-};
-
-/**
- * Event handler when a key is pressed on a tile in customization menu.
- * @param {Event} event The event attributes for the interaction.
- */
-customize.tileOnKeyDownInteraction = function(event) {
- const tile = event.currentTarget;
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- event.preventDefault();
- event.stopPropagation();
- if (tile.onClickOverride) {
- tile.onClickOverride(event);
- return;
- }
- tile.onclick(event);
- } else if (customize.arrowKeys.includes(event.keyCode)) {
- // Handle arrow key navigation.
- event.preventDefault();
-
- let target = null;
- if (event.keyCode === customize.KEYCODES.LEFT) {
- target = customize.getNextTile(
- window.chrome.embeddedSearch.searchBox.rtl ? 1 : -1, 0,
- /** @type HTMLElement */ (tile));
- } else if (event.keyCode === customize.KEYCODES.UP) {
- target = customize.getNextTile(0, -1, /** @type HTMLElement */ (tile));
- } else if (event.keyCode === customize.KEYCODES.RIGHT) {
- target = customize.getNextTile(
- window.chrome.embeddedSearch.searchBox.rtl ? -1 : 1, 0,
- /** @type HTMLElement */ (tile));
- } else if (event.keyCode === customize.KEYCODES.DOWN) {
- target = customize.getNextTile(0, 1, /** @type HTMLElement */ (tile));
- }
- if (target) {
- target.focus();
- } else {
- tile.focus();
- }
- }
-};
-
-/**
- * Show dialog for selecting a Chrome background.
- */
-customize.showCollectionSelectionDialog = function() {
- const tileContainer = configData.richerPicker ?
- $(customize.IDS.BACKGROUNDS_MENU) :
- $(customize.IDS.TILES);
- if (configData.richerPicker && customize.builtTiles) {
- tileContainer.focus();
- return;
- }
- customize.builtTiles = true;
- const menu = configData.richerPicker ? $(customize.IDS.CUSTOMIZATION_MENU) :
- $(customize.IDS.MENU);
- if (!menu.open) {
- menu.showModal();
- }
-
- // Create dialog header.
- $(customize.IDS.TITLE).textContent =
- configData.translatedStrings.selectChromeWallpaper;
- if (!configData.richerPicker) {
- menu.classList.add(customize.CLASSES.COLLECTION_DIALOG);
- menu.classList.remove(customize.CLASSES.IMAGE_DIALOG);
- }
-
- const tileOnClickInteraction = function(event) {
- let tile = event.target;
- if (tile.classList.contains(customize.CLASSES.COLLECTION_TITLE)) {
- tile = tile.parentNode;
- }
-
- // Load images for selected collection.
- const imgElement = $('ntp-images-loader');
- if (imgElement) {
- imgElement.parentNode.removeChild(imgElement);
- }
- const imgScript = document.createElement('script');
- imgScript.id = 'ntp-images-loader';
- imgScript.src = 'chrome-search://local-ntp/ntp-background-images.js?' +
- 'collection_id=' + tile.dataset.id;
-
- if (configData.richerPicker) {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_BACKGROUND_OPEN_COLLECTION);
- } else {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION);
- }
-
- document.body.appendChild(imgScript);
-
- imgScript.onload = function() {
- // Verify that the individual image data was successfully loaded.
- const imageDataLoaded =
- (collImg.length > 0 && collImg[0].collectionId == tile.dataset.id);
-
- // Dependent upon the success of the load, populate the image selection
- // dialog or close the current dialog.
- if (imageDataLoaded) {
- $(customize.IDS.BACKGROUNDS_MENU)
- .classList.toggle(customize.CLASSES.MENU_SHOWN, false);
- $(customize.IDS.BACKGROUNDS_IMAGE_MENU)
- .classList.toggle(customize.CLASSES.MENU_SHOWN, true);
-
- // In the RP the upload or default tile may be selected.
- if (!configData.richerPicker) {
- customize.resetSelectionDialog();
- }
- customize.showImageSelectionDialog(
- tile.dataset.name, tile.dataset.tileIndex);
- } else {
- customize.handleError(collImgErrors);
- }
- };
- };
-
- // Create dialog tiles.
- for (let i = 0; i < coll.length; ++i) {
- const id = coll[i].collectionId;
- const name = coll[i].collectionName;
- const imageUrl = coll[i].previewImageUrl;
- const dataset = {'id': id, 'name': name, 'tileIndex': i};
-
- const tile = customize.createTileWithTitle(
- 'coll_tile_' + i, imageUrl, name, dataset, tileOnClickInteraction,
- customize.tileOnKeyDownInteraction);
- tileContainer.appendChild(tile);
- }
-
- // Attach event listeners for upload and default tiles
- $(customize.IDS.BACKGROUNDS_UPLOAD_ICON).onkeydown =
- customize.tileOnKeyDownInteraction;
- $(customize.IDS.BACKGROUNDS_DEFAULT_ICON).onkeydown =
- customize.tileOnKeyDownInteraction;
- $(customize.IDS.BACKGROUNDS_UPLOAD_ICON).onClickOverride =
- $(customize.IDS.BACKGROUNDS_UPLOAD).onkeydown;
- $(customize.IDS.BACKGROUNDS_DEFAULT_ICON).onClickOverride =
- $(customize.IDS.BACKGROUNDS_DEFAULT).onkeydown;
-
- tileContainer.focus();
-};
-
-/**
- * Return true if any shortcut option is selected.
- * Note: Shortcut options are preselected according to current user settings.
- */
-customize.richerPicker_isShortcutOptionSelected = function() {
- // Check if the currently selected options are not the preselection.
- const notPreselectedType = customize.preselectedOptions.shortcutType !==
- customize.selectedOptions.shortcutType;
- const notPreselectedHidden =
- customize.preselectedOptions.shortcutsAreHidden !==
- customize.selectedOptions.shortcutsAreHidden;
- return notPreselectedType || notPreselectedHidden;
-};
-
-/**
- * Apply styling to a selected option in the richer picker (i.e. the selected
- * background image, shortcut type, and color).
- * @param {?Element} option The option to apply styling to.
- */
-customize.richerPicker_applySelectedState = function(option) {
- if (!option) {
- return;
- }
-
- option.parentElement.classList.toggle(customize.CLASSES.SELECTED, true);
- // Create and append a blue checkmark to the selected option.
- const selectedCircle = document.createElement('div');
- const selectedCheck = document.createElement('div');
- selectedCircle.classList.add(customize.CLASSES.SELECTED_CIRCLE);
- selectedCheck.classList.add(customize.CLASSES.SELECTED_CHECK);
- option.appendChild(selectedCircle);
- option.appendChild(selectedCheck);
- option.setAttribute('aria-pressed', true);
-};
-
-/**
- * Remove styling from a selected option in the richer picker (i.e. the selected
- * background image, shortcut type, and color).
- * @param {?Element} option The option to remove styling from.
- */
-customize.richerPicker_removeSelectedState = function(option) {
- if (!option) {
- return;
- }
-
- option.parentElement.classList.toggle(customize.CLASSES.SELECTED, false);
- // Remove all blue checkmarks from the selected option (this includes the
- // checkmark and the encompassing circle).
- const select = option.querySelectorAll(
- '.' + customize.CLASSES.SELECTED_CHECK + ', .' +
- customize.CLASSES.SELECTED_CIRCLE);
- select.forEach((element) => {
- element.remove();
- });
- option.setAttribute('aria-pressed', false);
-};
-
-/**
- * Preview an image as a custom backgrounds.
- * @param {!Element} tile The tile that was selected.
- */
-customize.richerPicker_previewImage = function(tile) {
- if (!configData.richerPicker) {
- return;
- }
- // Set preview images at 720p by replacing the params in the url.
- const background = $(customize.IDS.CUSTOM_BG);
- const preview = $(customize.IDS.CUSTOM_BG_PREVIEW);
- if (tile.id === customize.IDS.BACKGROUNDS_DEFAULT_ICON) {
- preview.dataset.hasImage = false;
- preview.style.backgroundImage = '';
- preview.style.backgroundColor = 'transparent';
- } else if (tile.id === customize.IDS.BACKGROUNDS_UPLOAD_ICON) {
- // No previews for uploaded images.
- return;
- } else {
- preview.dataset.hasImage = true;
-
- const re = /w\d+\-h\d+/;
- preview.style.backgroundImage =
- tile.style.backgroundImage.replace(re, 'w1280-h720');
- preview.dataset.attributionLine1 = tile.dataset.attributionLine1;
- preview.dataset.attributionLine2 = tile.dataset.attributionLine2;
- preview.dataset.attributionActionUrl = tile.dataset.attributionActionUrl;
- }
- background.style.opacity = 0;
- preview.style.opacity = 1;
- preview.dataset.hasPreview = true;
-
- ntpApiHandle.onthemechange();
-};
-
-/**
- * Remove a preview image of a custom backgrounds.
- */
-customize.richerPicker_unpreviewImage = function() {
- if (!configData.richerPicker) {
- return;
- }
- const preview = $(customize.IDS.CUSTOM_BG_PREVIEW);
- if (!preview.dataset || !preview.dataset.hasPreview) {
- return;
- }
-
- preview.style.opacity = 0;
- preview.style.backgroundImage = '';
- preview.style.backgroundColor = 'transparent';
- preview.dataset.hasPreview = false;
- $(customize.IDS.CUSTOM_BG).style.opacity = 1;
-
- ntpApiHandle.onthemechange();
-};
-
-/**
- * Handles background selection. Apply styling to the selected background tile
- * in the richer picker, preview the background, and enable the done button.
- * @param {?Element} tile The selected background tile.
- */
-customize.richerPicker_selectBackgroundTile = function(tile) {
- if (!tile) {
- return;
- }
-
- if (tile.parentElement.classList.contains(customize.CLASSES.SELECTED)) {
- // If the clicked tile is already selected do nothing.
- return;
- } else if (customize.selectedOptions.background) {
- // Deselect any currently selected tile.
- customize.richerPicker_removeSelectedState(
- customize.selectedOptions.background);
- }
-
- $(customize.IDS.REFRESH_TOGGLE).checked = false;
-
- // Remove any existing preview.
- customize.richerPicker_unpreviewImage();
-
- customize.selectedOptions.background = tile;
- customize.selectedOptions.backgroundData = {
- id: tile.id,
- url: tile.dataset.url || '',
- attr1: tile.dataset.attributionLine1 || '',
- attr2: tile.dataset.attributionLine2 || '',
- attrUrl: tile.dataset.attributionActionUrl || '',
- collectionId: '',
- };
- customize.richerPicker_applySelectedState(tile);
-
- // Don't apply a preview for a preselected image, as it's already the
- // page background.
- if (customize.preselectedOptions.backgroundsMenuTile !== tile) {
- customize.richerPicker_previewImage(tile);
- }
-};
-
-/**
- * Handles shortcut type selection. Apply styling to a selected shortcut option
- * and enable the done button.
- * @param {?Element} shortcutType The shortcut type option's element.
- */
-customize.richerPicker_selectShortcutType = function(shortcutType) {
- if (!shortcutType ||
- customize.selectedOptions.shortcutType === shortcutType) {
- return; // The option has already been selected.
- }
-
- // Clear the previous selection, if any.
- if (customize.selectedOptions.shortcutType) {
- customize.richerPicker_removeSelectedState(
- customize.selectedOptions.shortcutType);
- }
- customize.selectedOptions.shortcutType = shortcutType;
- customize.richerPicker_applySelectedState(shortcutType);
-};
-
-/**
- * Handles hide shortcuts toggle. Apply/remove styling for the toggle and
- * enable/disable the done button.
- * Note: If the toggle is enabled, the options for shortcut type will appear
- * "disabled".
- * @param {boolean} areHidden True if the shortcuts are hidden, i.e. the toggle
- * is on.
- */
-customize.richerPicker_toggleShortcutHide = function(areHidden) {
- // (De)select the shortcut hide option.
- $(customize.IDS.SHORTCUTS_HIDE)
- .classList.toggle(customize.CLASSES.SELECTED, areHidden);
- $(customize.IDS.SHORTCUTS_HIDE_TOGGLE).checked = areHidden;
- $(customize.IDS.SHORTCUTS_MENU)
- .classList.toggle(customize.CLASSES.HIDDEN_SELECTED, areHidden);
-
- customize.selectedOptions.shortcutsAreHidden = areHidden;
-};
-
-/**
- * Handles the "refresh daily" toggle.
- * @param {boolean} toggledOn True if the toggle has been enabled.
- */
-customize.richerPicker_toggleRefreshDaily = function(toggledOn) {
- $(customize.IDS.REFRESH_TOGGLE).checked = toggledOn;
- if (!toggledOn) {
- customize.richerPicker_selectBackgroundTile(
- $(customize.IDS.BACKGROUNDS_DEFAULT_ICON));
- return;
- }
-
- if (customize.selectedOptions.background) {
- customize.richerPicker_removeSelectedState(
- customize.selectedOptions.background);
- }
-
- customize.selectedOptions.background = null;
- customize.selectedOptions.backgroundData = {
- id: '',
- url: '',
- attr1: '',
- attr2: '',
- attrUrl: '',
- collectionId: customize.currentCollectionId,
- };
-};
-
-/**
- * Apply border and checkmark when a tile is selected
- * @param {!Element} tile The tile to apply styling to.
- */
-customize.applySelectedState = function(tile) {
- tile.classList.add(customize.CLASSES.COLLECTION_SELECTED);
- const selectedBorder = document.createElement('div');
- const selectedCircle = document.createElement('div');
- const selectedCheck = document.createElement('div');
- selectedBorder.classList.add(customize.CLASSES.SELECTED_BORDER);
- selectedCircle.classList.add(customize.CLASSES.SELECTED_CIRCLE);
- selectedCheck.classList.add(customize.CLASSES.SELECTED_CHECK);
- selectedBorder.appendChild(selectedCircle);
- selectedBorder.appendChild(selectedCheck);
- tile.appendChild(selectedBorder);
- tile.dataset.oldLabel = tile.getAttribute('aria-label');
- tile.setAttribute(
- 'aria-label',
- tile.dataset.oldLabel + ' ' + configData.translatedStrings.selectedLabel);
-};
-
-/**
- * Remove border and checkmark when a tile is un-selected
- * @param {!Element} tile The tile to remove styling from.
- */
-customize.removeSelectedState = function(tile) {
- tile.classList.remove(customize.CLASSES.COLLECTION_SELECTED);
- tile.removeChild(tile.firstChild);
- tile.setAttribute('aria-label', tile.dataset.oldLabel);
-};
-
-/**
- * Show dialog for selecting an image. Image data should previously have been
- * loaded into collImg via
- * chrome-search://local-ntp/ntp-background-images.js?collection_id=<collection_id>
- * @param {string} dialogTitle The title to be displayed at the top of the
- * dialog.
- * @param {number} collIndex The index of the collection this image menu belongs
- * to.
- */
-customize.showImageSelectionDialog = function(dialogTitle, collIndex) {
- const firstNTile = customize.ROWS_TO_PRELOAD * customize.getTilesWide();
- const tileContainer = configData.richerPicker ?
- $(customize.IDS.BACKGROUNDS_IMAGE_MENU) :
- $(customize.IDS.TILES);
- const menu = configData.richerPicker ? $(customize.IDS.CUSTOMIZATION_MENU) :
- $(customize.IDS.MENU);
-
- if (configData.richerPicker) {
- menu.classList.toggle(customize.CLASSES.ON_IMAGE_MENU, true);
- customize.richerPicker_showSubmenu(
- $(customize.IDS.BACKGROUNDS_BUTTON), tileContainer, dialogTitle);
- // Save the current image menu. Used to restore to when the Background
- // submenu is reopened.
- customize.richerPicker_openBackgroundSubmenu.menuId =
- customize.IDS.BACKGROUNDS_IMAGE_MENU;
- customize.richerPicker_openBackgroundSubmenu.title = dialogTitle;
- } else {
- $(customize.IDS.TITLE).textContent = dialogTitle;
- menu.classList.remove(customize.CLASSES.COLLECTION_DIALOG);
- menu.classList.add(customize.CLASSES.IMAGE_DIALOG);
- }
-
- const tileInteraction = function(tile) {
- if (customize.selectedOptions.background && !configData.richerPicker) {
- customize.removeSelectedState(customize.selectedOptions.background);
- if (customize.selectedOptions.background.id === tile.id) {
- customize.unselectTile();
- return;
- }
- }
-
- if (configData.richerPicker) {
- if (!customize.selectedOptions.backgroundData ||
- customize.selectedOptions.backgroundData.id !== tile.id) {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_BACKGROUND_SELECT_IMAGE);
- }
- customize.richerPicker_selectBackgroundTile(tile);
- } else {
- customize.applySelectedState(tile);
- customize.selectedOptions.background = tile;
- }
-
- $(customize.IDS.DONE).tabIndex = 0;
-
- // Turn toggle off when an image is selected.
- $(customize.IDS.DONE).disabled = false;
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE);
- };
-
- const tileOnClickInteraction = function(event) {
- const clickCount = event.detail;
- // Control + option + space will fire the onclick event with 0 clickCount.
- if (clickCount <= 1) {
- tileInteraction(event.currentTarget);
- } else if (
- clickCount === 2 &&
- customize.selectedOptions.background === event.currentTarget) {
- customize.setBackground(
- event.currentTarget.dataset.url,
- event.currentTarget.dataset.attributionLine1,
- event.currentTarget.dataset.attributionLine2,
- event.currentTarget.dataset.attributionActionUrl,
- /*collection_id=*/ '');
- }
- };
-
- const preLoadTiles = [];
- const postLoadTiles = [];
-
- for (let i = 0; i < collImg.length; ++i) {
- const dataset = {};
-
- dataset.attributionLine1 =
- (collImg[i].attributions[0] !== undefined ? collImg[i].attributions[0] :
- '');
- dataset.attributionLine2 =
- (collImg[i].attributions[1] !== undefined ? collImg[i].attributions[1] :
- '');
- dataset.attributionActionUrl = collImg[i].attributionActionUrl;
- dataset.url = collImg[i].imageUrl;
- dataset.tileIndex = i;
-
- let tileId = 'img_tile_' + i;
- if (configData.richerPicker) {
- tileId = 'coll_' + collIndex + '_' + tileId;
- }
- const tile = customize.createTileThumbnail(
- tileId, collImg[i].thumbnailImageUrl, dataset, tileOnClickInteraction,
- customize.tileOnKeyDownInteraction);
-
- tile.setAttribute('aria-label', collImg[i].attributions[0]);
- tile.title = collImg[i].attributions[0];
-
- // Load the first |ROWS_TO_PRELOAD| rows of tiles.
- if (i < firstNTile) {
- preLoadTiles.push(tile);
- } else {
- postLoadTiles.push(tile);
- }
-
- const tileBackground = document.createElement('div');
- tileBackground.classList.add(customize.CLASSES.COLLECTION_TILE_BG);
- tileBackground.appendChild(tile);
- tileContainer.appendChild(tileBackground);
- }
- let tileGetsLoaded = 0;
- for (const tile of preLoadTiles) {
- customize.loadTile(tile, collImg, () => {
- // After the preloaded tiles finish loading, the rest of the tiles start
- // loading.
- if (++tileGetsLoaded === preLoadTiles.length) {
- postLoadTiles.forEach(
- (tile) => customize.loadTile(tile, collImg, null));
- }
- });
- }
-
- customize.currentCollectionId = collImg[0].collectionId;
- $(customize.IDS.REFRESH_TOGGLE).checked = false;
- // If an image tile was previously selected re-select it now.
- if (customize.selectedOptions.backgroundData) {
- const selected = $(customize.selectedOptions.backgroundData.id);
- if (selected) {
- customize.richerPicker_selectBackgroundTile(selected);
- } else if (
- customize.selectedOptions.backgroundData.collectionId ===
- customize.currentCollectionId) {
- $(customize.IDS.REFRESH_TOGGLE).checked = true;
- }
- } else {
- customize.richerPicker_preselectBackgroundOption();
- }
- $(customize.IDS.REFRESH_DAILY_WRAPPER).hidden = false;
-
- if (configData.richerPicker) {
- $(customize.IDS.BACKGROUNDS_IMAGE_MENU).focus();
- } else {
- $(customize.IDS.TILES).focus();
- }
-};
-
-/**
- * Add background image src to the tile and add animation for the tile once it
- * successfully loaded.
- * @param {!Object} tile the tile that needs to be loaded.
- * @param {!Object} imageData the source imageData.
- * @param {?Function} countLoad If not null, called after the tile finishes
- * loading.
- */
-customize.loadTile = function(tile, imageData, countLoad) {
- tile.style.backgroundImage =
- 'url(' + imageData[tile.dataset.tileIndex].thumbnailImageUrl + ')';
- customize.fadeInImageTile(
- tile, imageData[tile.dataset.tileIndex].thumbnailImageUrl, countLoad);
-};
-
-/**
- * Fade in effect for both collection and image tile. Once the image
- * successfully loads, we can assume the background image with the same source
- * has also loaded. Then, we set opacity for the tile to start the animation.
- * @param {!Object} tile The tile to add the fade in animation to.
- * @param {string} imageUrl the image url for the tile
- * @param {?Function} countLoad If not null, called after the tile finishes
- * loading.
- */
-customize.fadeInImageTile = function(tile, imageUrl, countLoad) {
- const image = new Image();
- image.onload = () => {
- tile.style.opacity = '1';
- if (countLoad) {
- countLoad();
- }
- };
- image.src = imageUrl;
-};
-
-/**
- * Load the NTPBackgroundCollections script. It'll create a global
- * variable name "coll" which is a dict of background collections data.
- */
-customize.loadChromeBackgrounds = function() {
- const collElement = $('ntp-collection-loader');
- if (collElement) {
- collElement.parentNode.removeChild(collElement);
- }
- const collScript = document.createElement('script');
- collScript.id = 'ntp-collection-loader';
- collScript.src = 'chrome-search://local-ntp/ntp-background-collections.js?' +
- 'collection_type=background';
- collScript.onload = function() {
- if (configData.richerPicker) {
- customize.showCollectionSelectionDialog();
- }
- };
- document.body.appendChild(collScript);
-};
-
-/**
- * Close dialog when an image is selected via the file picker.
- */
-customize.closeCustomizationDialog = function() {
- if (configData.richerPicker) {
- $(customize.IDS.CUSTOMIZATION_MENU).close();
- } else {
- $(customize.IDS.EDIT_BG_DIALOG).close();
- }
-};
-
-/**
- * Get the next visible option. There are times when various combinations of
- * options are hidden.
- * @param {number} current_index Index of the option the key press occurred on.
- * @param {number} deltaY Direction to search in, -1 for up, 1 for down.
- */
-customize.getNextOption = function(current_index, deltaY) {
- // Create array corresponding to the menu. Important that this is in the same
- // order as the MENU_ENTRIES enum, so we can index into it.
- const entries = [];
- entries.push($(customize.IDS.DEFAULT_WALLPAPERS));
- entries.push($(customize.IDS.UPLOAD_IMAGE));
- entries.push($(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT));
- entries.push($(customize.IDS.RESTORE_DEFAULT));
-
- let idx = current_index;
- do {
- idx = idx + deltaY;
- if (idx === -1) {
- idx = 3;
- }
- if (idx === 4) {
- idx = 0;
- }
- } while (
- idx !== current_index &&
- (entries[idx].hidden ||
- entries[idx].classList.contains(customize.CLASSES.OPTION_DISABLED)));
- return entries[idx];
-};
-
-/**
- * Hide custom background options based on the network state
- * @param {boolean} online The current state of the network
- */
-customize.networkStateChanged = function(online) {
- $(customize.IDS.DEFAULT_WALLPAPERS).hidden = !online;
-};
-
-/**
- * Open the customization menu and set it to the default submenu (Background).
- */
-customize.richerPicker_openCustomizationMenu = function() {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_CUSTOMIZATION_MENU_OPENED);
-
- const ntpTheme = assert(ntpApiHandle.ntpTheme);
- if (!ntpTheme.customBackgroundDisabledByPolicy) {
- customize.richerPicker_showSubmenu(
- $(customize.IDS.BACKGROUNDS_BUTTON), $(customize.IDS.BACKGROUNDS_MENU));
- customize.loadChromeBackgrounds();
- } else {
- customize.richerPicker_showSubmenu(
- $(customize.IDS.BACKGROUNDS_BUTTON),
- $(customize.IDS.BACKGROUNDS_DISABLED_MENU));
- // Save the current Background submenu. Used to restore when the Background
- // submenu is reopened.
- customize.richerPicker_openBackgroundSubmenu.menuId =
- customize.IDS.BACKGROUNDS_DISABLED_MENU;
- }
-
- customize.richerPicker_preselectShortcutOptions();
- customize.richerPicker_preselectBackgroundOption();
- customize.loadColorsMenu();
- if (!$(customize.IDS.CUSTOMIZATION_MENU).open) {
- $(customize.IDS.CUSTOMIZATION_MENU).showModal();
- }
-};
-
-/**
- * Reset the selected options in the customization menu.
- */
-customize.richerPicker_resetSelectedOptions = function() {
- // Reset background selection.
- customize.richerPicker_removeSelectedState(
- customize.selectedOptions.background);
- customize.selectedOptions.background = null;
- customize.selectedOptions.backgroundData = null;
-
- customize.resetColorsSelectedOptions();
-
- customize.richerPicker_preselectShortcutOptions();
-};
-
-/**
- * Preselect the shortcut type and visibility to reflect the current state on
- * the page.
- */
-customize.richerPicker_preselectShortcutOptions = function() {
- const shortcutType = chrome.embeddedSearch.newTabPage.isUsingMostVisited ?
- $(customize.IDS.SHORTCUTS_OPTION_MOST_VISITED) :
- $(customize.IDS.SHORTCUTS_OPTION_CUSTOM_LINKS);
- const shortcutsAreHidden =
- !chrome.embeddedSearch.newTabPage.areShortcutsVisible;
- customize.preselectedOptions.shortcutType = shortcutType;
- customize.preselectedOptions.shortcutsAreHidden = shortcutsAreHidden;
- customize.richerPicker_selectShortcutType(shortcutType);
- customize.richerPicker_toggleShortcutHide(shortcutsAreHidden);
-};
-
-/**
- * Preselect the background tile that corresponds to the current page
- * background.
- */
-customize.richerPicker_preselectBackgroundOption = function() {
- if (!configData.richerPicker) {
- return;
- }
-
- customize.preselectedOptions.backgroundsMenuTile = null;
-
- const ntpTheme = assert(ntpApiHandle.ntpTheme);
- if (!ntpTheme.customBackgroundConfigured) {
- // Default.
- customize.preselectedOptions.backgroundsMenuTile =
- $(customize.IDS.BACKGROUNDS_DEFAULT_ICON);
- } else if (ntpTheme.imageUrl.includes(
- 'chrome-search://local-ntp/background.jpg')) {
- // Local image.
- customize.preselectedOptions.backgroundsMenuTile =
- $(customize.IDS.BACKGROUNDS_UPLOAD_ICON);
- } else if (
- ntpTheme.collectionId !== '' &&
- customize.currentCollectionId == ntpTheme.collectionId) {
- // Daily refresh.
- $(customize.IDS.REFRESH_TOGGLE).checked = true;
- } else if (!customize.selectedOptions.backgroundData) {
- // Image tile. Only if another background hasn't already been selected.
- customize.preselectedOptions.backgroundsMenuTile =
- document.querySelector('[data-url="' + ntpTheme.imageUrl + '"]');
- }
-
- customize.richerPicker_selectBackgroundTile(
- customize.preselectedOptions.backgroundsMenuTile);
- customize.selectedOptions.backgroundData = null;
-};
-
-/**
- * Resets the customization menu.
- */
-customize.richerPicker_resetCustomizationMenu = function() {
- customize.richerPicker_resetSelectedOptions();
- customize.richerPicker_resetImageMenu();
- customize.richerPicker_hideOpenSubmenu();
- customize.resetColorPicker();
-};
-
-/**
- * Close and reset the customization menu.
- */
-customize.richerPicker_closeCustomizationMenu = function() {
- $(customize.IDS.BACKGROUNDS_MENU).scrollTop = 0;
- $(customize.IDS.CUSTOMIZATION_MENU).close();
- customize.richerPicker_resetCustomizationMenu();
-
- customize.richerPicker_unpreviewImage();
-};
-
-/**
- * Cancel customization, revert any changes, and close the richer picker.
- */
-customize.richerPicker_cancelCustomization = function() {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_CUSTOMIZATION_MENU_CANCEL);
-
- if (customize.isColorOptionSelected()) {
- customize.cancelColor();
- }
-
- customize.richerPicker_closeCustomizationMenu();
-};
-
-/**
- * Apply the currently selected customization options and close the richer
- * picker.
- */
-customize.richerPicker_applyCustomization = function() {
- if (customize.isBackgroundOptionSelected()) {
- customize.setBackground(
- customize.selectedOptions.backgroundData.url,
- customize.selectedOptions.backgroundData.attr1,
- customize.selectedOptions.backgroundData.attr2,
- customize.selectedOptions.backgroundData.attrUrl,
- customize.selectedOptions.backgroundData.collectionId);
- }
- if (customize.richerPicker_isShortcutOptionSelected()) {
- customize.richerPicker_setShortcutOptions();
- }
- if (customize.isColorOptionSelected()) {
- customize.confirmColor();
- }
- customize.richerPicker_closeCustomizationMenu();
-};
-
-/**
- * Initialize the settings menu, custom backgrounds dialogs, and custom
- * links menu items. Set the text and event handlers for the various
- * elements.
- * @param {!Function} showErrorNotification Called when the error notification
- * should be displayed.
- * @param {!Function} hideCustomLinkNotification Called when the custom link
- * notification should be hidden.
- */
-customize.init = function(showErrorNotification, hideCustomLinkNotification) {
- ntpApiHandle = window.chrome.embeddedSearch.newTabPage;
- const editDialog = $(customize.IDS.EDIT_BG_DIALOG);
-
- $(customize.IDS.OPTIONS_TITLE).textContent =
- configData.translatedStrings.customizeThisPage;
-
- if (configData.richerPicker) {
- // Store the main menu title so it can be restored if needed.
- customize.richerPicker_defaultTitle =
- $(customize.IDS.MENU_TITLE).textContent;
- }
-
- $(customize.IDS.EDIT_BG)
- .setAttribute(
- 'aria-label', configData.translatedStrings.customizeThisPage);
-
- $(customize.IDS.EDIT_BG)
- .setAttribute('title', configData.translatedStrings.customizeThisPage);
-
- // Selecting a local image for the background should close the picker.
- if (configData.richerPicker) {
- ntpApiHandle.onlocalbackgroundselected = () => {
- customize.selectedOptions.backgroundData = null;
- customize.richerPicker_applyCustomization();
- };
- }
-
- // Edit gear icon interaction events.
- const editBackgroundInteraction = function() {
- if (configData.richerPicker) {
- customize.richerPicker_openCustomizationMenu();
- } else {
- editDialog.showModal();
- }
- };
- $(customize.IDS.EDIT_BG).onclick = function(event) {
- $(customize.IDS.CUSTOMIZATION_MENU)
- .classList.add(customize.CLASSES.MOUSE_NAV);
- editDialog.classList.add(customize.CLASSES.MOUSE_NAV);
- editBackgroundInteraction();
- };
-
- $(customize.IDS.MENU_CANCEL).onclick = function(event) {
- customize.richerPicker_cancelCustomization();
- };
-
-
- // Find the first menu option that is not hidden or disabled.
- const findFirstMenuOption = () => {
- const editMenu = $(customize.IDS.EDIT_BG_MENU);
- for (let i = 1; i < editMenu.children.length; i++) {
- const option = editMenu.children[i];
- if (option.classList.contains(customize.CLASSES.OPTION) &&
- !option.hidden &&
- !option.classList.contains(customize.CLASSES.OPTION_DISABLED)) {
- option.focus();
- return;
- }
- }
- };
-
- $(customize.IDS.EDIT_BG).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- // no default behavior for ENTER
- event.preventDefault();
- editDialog.classList.remove(customize.CLASSES.MOUSE_NAV);
- editBackgroundInteraction();
- findFirstMenuOption();
- }
- };
-
- // Interactions to close the customization option dialog.
- const editDialogInteraction = function() {
- editDialog.close();
- };
- editDialog.onclick = function(event) {
- editDialog.classList.add(customize.CLASSES.MOUSE_NAV);
- if (event.target === editDialog) {
- editDialogInteraction();
- }
- };
- editDialog.onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ESC) {
- editDialogInteraction();
- } else if (
- editDialog.classList.contains(customize.CLASSES.MOUSE_NAV) &&
- (event.keyCode === customize.KEYCODES.TAB ||
- event.keyCode === customize.KEYCODES.UP ||
- event.keyCode === customize.KEYCODES.DOWN)) {
- // When using tab in mouse navigation mode, select the first option
- // available.
- event.preventDefault();
- findFirstMenuOption();
- editDialog.classList.remove(customize.CLASSES.MOUSE_NAV);
- } else if (event.keyCode === customize.KEYCODES.TAB) {
- // If keyboard navigation is attempted, remove mouse-only mode.
- editDialog.classList.remove(customize.CLASSES.MOUSE_NAV);
- } else if (customize.arrowKeys.includes(event.keyCode)) {
- event.preventDefault();
- editDialog.classList.remove(customize.CLASSES.MOUSE_NAV);
- }
- };
-
- customize.initCustomLinksItems(hideCustomLinkNotification);
- customize.initCustomBackgrounds(showErrorNotification);
-};
-
-/**
- * Initialize custom link items in the settings menu dialog. Set the text
- * and event handlers for the various elements.
- * @param {!Function} hideCustomLinkNotification Called when the custom link
- * notification should be hidden.
- */
-customize.initCustomLinksItems = function(hideCustomLinkNotification) {
- customize.hideCustomLinkNotification = hideCustomLinkNotification;
-
- const editDialog = $(customize.IDS.EDIT_BG_DIALOG);
- const menu = $(customize.IDS.MENU);
-
- $(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT_TEXT).textContent =
- configData.translatedStrings.restoreDefaultLinks;
-
- // Interactions with the "Restore default shortcuts" option.
- const customLinksRestoreDefaultInteraction = function() {
- editDialog.close();
- customize.hideCustomLinkNotification();
- window.chrome.embeddedSearch.newTabPage.resetCustomLinks();
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED);
- };
- $(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT).onclick = () => {
- if (!$(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT)
- .classList.contains(customize.CLASSES.OPTION_DISABLED)) {
- customLinksRestoreDefaultInteraction();
- }
- };
- $(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER) {
- customLinksRestoreDefaultInteraction();
- } else if (event.keyCode === customize.KEYCODES.UP) {
- // Handle arrow key navigation.
- event.preventDefault();
- customize
- .getNextOption(
- customize.MENU_ENTRIES.CUSTOM_LINKS_RESTORE_DEFAULT, -1)
- .focus();
- } else if (event.keyCode === customize.KEYCODES.DOWN) {
- event.preventDefault();
- customize
- .getNextOption(customize.MENU_ENTRIES.CUSTOM_LINKS_RESTORE_DEFAULT, 1)
- .focus();
- }
- };
-};
-
-/**
- * Initialize the settings menu and custom backgrounds dialogs. Set the
- * text and event handlers for the various elements.
- * @param {!Function} showErrorNotification Called when the error notification
- * should be displayed.
- */
-customize.initCustomBackgrounds = function(showErrorNotification) {
- customize.showErrorNotification = showErrorNotification;
-
- const editDialog = $(customize.IDS.EDIT_BG_DIALOG);
- const menu = $(customize.IDS.MENU);
-
- $(customize.IDS.DEFAULT_WALLPAPERS_TEXT).textContent =
- configData.translatedStrings.defaultWallpapers;
- $(customize.IDS.UPLOAD_IMAGE_TEXT).textContent =
- configData.translatedStrings.uploadImage;
- $(customize.IDS.RESTORE_DEFAULT_TEXT).textContent =
- configData.translatedStrings.restoreDefaultBackground;
- $(customize.IDS.DONE).textContent =
- configData.translatedStrings.selectionDone;
- $(customize.IDS.CANCEL).textContent =
- configData.translatedStrings.selectionCancel;
-
- window.addEventListener('online', function(event) {
- customize.networkStateChanged(true);
- });
-
- window.addEventListener('offline', function(event) {
- customize.networkStateChanged(false);
- });
-
- if (!window.navigator.onLine) {
- customize.networkStateChanged(false);
- }
-
- $(customize.IDS.BACK_CIRCLE)
- .setAttribute('aria-label', configData.translatedStrings.backLabel);
- $(customize.IDS.CANCEL)
- .setAttribute('aria-label', configData.translatedStrings.selectionCancel);
- $(customize.IDS.DONE)
- .setAttribute('aria-label', configData.translatedStrings.selectionDone);
-
- $(customize.IDS.DONE).disabled = true;
-
- // Interactions with the "Upload an image" option.
- const uploadImageInteraction = function() {
- window.chrome.embeddedSearch.newTabPage.selectLocalBackgroundImage();
- if (configData.richerPicker) {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_BACKGROUND_UPLOAD_FROM_DEVICE);
- } else {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED);
- }
- };
-
- $(customize.IDS.UPLOAD_IMAGE).onclick = (event) => {
- if (!$(customize.IDS.UPLOAD_IMAGE)
- .classList.contains(customize.CLASSES.OPTION_DISABLED)) {
- uploadImageInteraction();
- }
- };
- $(customize.IDS.UPLOAD_IMAGE).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER) {
- uploadImageInteraction();
- }
-
- // Handle arrow key navigation.
- if (event.keyCode === customize.KEYCODES.UP) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.UPLOAD_IMAGE, -1).focus();
- }
- if (event.keyCode === customize.KEYCODES.DOWN) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.UPLOAD_IMAGE, 1).focus();
- }
- };
-
- // Interactions with the "Restore default background" option.
- const restoreDefaultInteraction = function() {
- editDialog.close();
- customize.clearAttribution();
- window.chrome.embeddedSearch.newTabPage.resetBackgroundInfo();
- };
- $(customize.IDS.RESTORE_DEFAULT).onclick = (event) => {
- if (!$(customize.IDS.RESTORE_DEFAULT)
- .classList.contains(customize.CLASSES.OPTION_DISABLED)) {
- restoreDefaultInteraction();
- }
- };
- $(customize.IDS.RESTORE_DEFAULT).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER) {
- restoreDefaultInteraction();
- }
-
- // Handle arrow key navigation.
- if (event.keyCode === customize.KEYCODES.UP) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.RESTORE_DEFAULT, -1)
- .focus();
- }
- if (event.keyCode === customize.KEYCODES.DOWN) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.RESTORE_DEFAULT, 1)
- .focus();
- }
- };
-
- // Interactions with the "Chrome backgrounds" option.
- const defaultWallpapersInteraction = function(event) {
- customize.loadChromeBackgrounds();
- $('ntp-collection-loader').onload = function() {
- editDialog.close();
- if (typeof coll != 'undefined' && coll.length > 0) {
- customize.showCollectionSelectionDialog();
- } else {
- customize.handleError(collErrors);
- }
- };
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED);
- };
- $(customize.IDS.DEFAULT_WALLPAPERS).onclick = function(event) {
- $(customize.IDS.MENU).classList.add(customize.CLASSES.MOUSE_NAV);
- defaultWallpapersInteraction(event);
- };
- $(customize.IDS.DEFAULT_WALLPAPERS).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER) {
- $(customize.IDS.MENU).classList.remove(customize.CLASSES.MOUSE_NAV);
- defaultWallpapersInteraction(event);
- }
-
- // Handle arrow key navigation.
- if (event.keyCode === customize.KEYCODES.UP) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.CHROME_BACKGROUNDS, -1)
- .focus();
- }
- if (event.keyCode === customize.KEYCODES.DOWN) {
- event.preventDefault();
- customize.getNextOption(customize.MENU_ENTRIES.CHROME_BACKGROUNDS, 1)
- .focus();
- }
- };
-
- // Escape and Backspace handling for the background picker dialog.
- menu.onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.SPACE) {
- $(customize.IDS.TILES).scrollTop += $(customize.IDS.TILES).offsetHeight;
- event.stopPropagation();
- event.preventDefault();
- }
- if (event.keyCode === customize.KEYCODES.ESC ||
- event.keyCode === customize.KEYCODES.BACKSPACE) {
- event.preventDefault();
- event.stopPropagation();
- if (menu.classList.contains(customize.CLASSES.COLLECTION_DIALOG)) {
- menu.close();
- customize.resetSelectionDialog();
- } else {
- customize.resetSelectionDialog();
- customize.showCollectionSelectionDialog();
- }
- }
-
- // If keyboard navigation is attempted, remove mouse-only mode.
- if (event.keyCode === customize.KEYCODES.TAB ||
- event.keyCode === customize.KEYCODES.LEFT ||
- event.keyCode === customize.KEYCODES.UP ||
- event.keyCode === customize.KEYCODES.RIGHT ||
- event.keyCode === customize.KEYCODES.DOWN) {
- menu.classList.remove(customize.CLASSES.MOUSE_NAV);
- }
- };
-
- // Interactions with the back arrow on the image selection dialog.
- const backInteraction = function(event) {
- if (configData.richerPicker) {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_BACKGROUND_BACK_CLICK);
- customize.richerPicker_resetImageMenu();
- }
- customize.resetSelectionDialog();
- customize.showCollectionSelectionDialog();
- };
- $(customize.IDS.BACK_CIRCLE).onclick = backInteraction;
- $(customize.IDS.MENU_BACK_CIRCLE).onclick = backInteraction;
- $(customize.IDS.BACK_CIRCLE).onkeyup = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- backInteraction(event);
- }
- };
- $(customize.IDS.MENU_BACK_CIRCLE).onkeyup = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- backInteraction(event);
- }
- };
- // Pressing Spacebar on the back arrow shouldn't scroll the dialog.
- $(customize.IDS.BACK_CIRCLE).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.SPACE) {
- event.stopPropagation();
- }
- };
-
- // Interactions with the cancel button on the background picker dialog.
- $(customize.IDS.CANCEL).onclick = function(event) {
- customize.closeCollectionDialog(menu);
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL);
- };
- $(customize.IDS.CANCEL).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- customize.closeCollectionDialog(menu);
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL);
- }
- };
-
- // Interactions with the done button on the background picker dialog.
- const doneInteraction = function(event) {
- const done = configData.richerPicker ? $(customize.IDS.MENU_DONE) :
- $(customize.IDS.DONE);
- if (configData.richerPicker) {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_CUSTOMIZATION_MENU_DONE);
- customize.richerPicker_applyCustomization();
- } else if (customize.selectedOptions.background) {
- // Also closes the customization menu.
- customize.setBackground(
- customize.selectedOptions.background.dataset.url,
- customize.selectedOptions.background.dataset.attributionLine1,
- customize.selectedOptions.background.dataset.attributionLine2,
- customize.selectedOptions.background.dataset.attributionActionUrl,
- '');
- }
- };
- $(customize.IDS.DONE).onclick = doneInteraction;
- $(customize.IDS.MENU_DONE).onclick = doneInteraction;
- $(customize.IDS.DONE).onkeyup = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER) {
- doneInteraction(event);
- }
- };
-
- // On any arrow key event in the tiles area, focus the first tile.
- $(customize.IDS.TILES).onkeydown = function(event) {
- if (document.activeElement === $(customize.IDS.TILES) &&
- customize.arrowKeys.includes(event.keyCode)) {
- event.preventDefault();
- if ($(customize.IDS.MENU)
- .classList.contains(customize.CLASSES.COLLECTION_DIALOG)) {
- $('coll_tile_0').focus();
- } else {
- document.querySelector('[id$="img_tile_0"]').focus();
- }
- }
- };
-
- $(customize.IDS.BACKGROUNDS_MENU).onkeydown = function(event) {
- if (document.activeElement === $(customize.IDS.BACKGROUNDS_MENU) &&
- customize.arrowKeys.includes(event.keyCode)) {
- event.preventDefault();
- $(customize.IDS.BACKGROUNDS_UPLOAD_ICON).focus();
- }
- };
-
- $(customize.IDS.BACKGROUNDS_IMAGE_MENU).onkeydown = function(event) {
- if (document.activeElement === $(customize.IDS.BACKGROUNDS_IMAGE_MENU) &&
- customize.arrowKeys.includes(event.keyCode)) {
- event.preventDefault();
- document.querySelector('[id$="img_tile_0"]').focus();
- }
- };
-
- $(customize.IDS.BACKGROUNDS_UPLOAD).onclick = uploadImageInteraction;
- $(customize.IDS.BACKGROUNDS_UPLOAD).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- uploadImageInteraction();
- }
- };
-
- $(customize.IDS.BACKGROUNDS_DEFAULT).onclick = function(event) {
- const tile = $(customize.IDS.BACKGROUNDS_DEFAULT_ICON);
- tile.dataset.url = '';
- tile.dataset.attributionLine1 = '';
- tile.dataset.attributionLine2 = '';
- tile.dataset.attributionActionUrl = '';
- if (!$(customize.IDS.BACKGROUNDS_DEFAULT)
- .classList.contains(customize.CLASSES.SELECTED)) {
- ntpApiHandle.logEvent(customize.LOG_TYPE.NTP_BACKGROUND_DEFAULT_SELECTED);
- customize.richerPicker_selectBackgroundTile(tile);
- }
- };
- $(customize.IDS.BACKGROUNDS_DEFAULT).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- $(customize.IDS.BACKGROUNDS_DEFAULT).onclick(event);
- }
- };
-
- const richerPicker = $(customize.IDS.CUSTOMIZATION_MENU);
- richerPicker.onmousedown = function(event) {
- richerPicker.classList.add(customize.CLASSES.MOUSE_NAV);
- };
- richerPicker.onkeydown = function(event) {
- if (Object.values(customize.KEYCODES).includes(event.keyCode)) {
- richerPicker.classList.remove(customize.CLASSES.MOUSE_NAV);
- }
-
- if (event.keyCode === customize.KEYCODES.BACKSPACE &&
- customize.richerPicker_selectedSubmenu.menu.id ===
- customize.IDS.BACKGROUNDS_IMAGE_MENU) {
- backInteraction(event);
- } else if (
- event.keyCode === customize.KEYCODES.ESC ||
- event.keyCode === customize.KEYCODES.BACKSPACE) {
- customize.richerPicker_cancelCustomization();
- }
- };
-
- const richerPickerOpenBackgrounds = function() {
- // Open the previously open Background submenu, if applicable.
- customize.richerPicker_showSubmenu(
- $(customize.IDS.BACKGROUNDS_BUTTON),
- $(customize.richerPicker_openBackgroundSubmenu.menuId),
- customize.richerPicker_openBackgroundSubmenu.title);
- };
-
- $(customize.IDS.BACKGROUNDS_BUTTON).onclick = richerPickerOpenBackgrounds;
- $(customize.IDS.BACKGROUNDS_BUTTON).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- richerPickerOpenBackgrounds();
- }
- };
-
- const clOption = $(customize.IDS.SHORTCUTS_OPTION_CUSTOM_LINKS);
- const mvOption = $(customize.IDS.SHORTCUTS_OPTION_MOST_VISITED);
- const hideToggle = $(customize.IDS.SHORTCUTS_HIDE_TOGGLE);
-
- const rtl = window.chrome.embeddedSearch.searchBox.rtl;
- const forwardArrowKey =
- rtl ? customize.KEYCODES.LEFT : customize.KEYCODES.RIGHT;
- const backArrowKey = rtl ? customize.KEYCODES.RIGHT : customize.KEYCODES.LEFT;
-
- $(customize.IDS.SHORTCUTS_MENU).onkeydown = function(event) {
- if (customize.arrowKeys.includes(event.keyCode)) {
- clOption.focus();
- }
- };
-
- clOption.onclick = function() {
- if (customize.selectedOptions.shortcutType !== clOption) {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_CUSTOM_LINKS_CLICKED);
- }
- customize.richerPicker_selectShortcutType(clOption);
- // Selecting a shortcut type will turn off hidden shortcuts.
- customize.richerPicker_toggleShortcutHide(false);
- };
- clOption.onkeydown = function(event) {
- if (customize.arrowKeys.includes(event.keyCode)) {
- // Handle arrow key navigation.
- event.preventDefault();
- event.stopPropagation();
- richerPicker.classList.remove(customize.CLASSES.MOUSE_NAV);
- if (event.keyCode === forwardArrowKey) {
- mvOption.focus();
- } else if (event.keyCode === customize.KEYCODES.DOWN) {
- hideToggle.focus();
- }
- }
- };
- clOption.onkeyup = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- clOption.click();
- }
- };
-
- mvOption.onclick = function() {
- if (customize.selectedOptions.shortcutType !== mvOption) {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_MOST_VISITED_CLICKED);
- }
- customize.richerPicker_selectShortcutType(mvOption);
- // Selecting a shortcut type will turn off hidden shortcuts.
- customize.richerPicker_toggleShortcutHide(false);
- };
- mvOption.onkeydown = function(event) {
- if (customize.arrowKeys.includes(event.keyCode)) {
- // Handle arrow key navigation.
- event.preventDefault();
- event.stopPropagation();
- richerPicker.classList.remove(customize.CLASSES.MOUSE_NAV);
- if (event.keyCode === backArrowKey) {
- clOption.focus();
- } else if (
- event.keyCode === forwardArrowKey ||
- event.keyCode === customize.KEYCODES.DOWN) {
- hideToggle.focus();
- }
- }
- };
- mvOption.onkeyup = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- mvOption.click();
- }
- };
-
- hideToggle.onchange = function(event) {
- customize.richerPicker_toggleShortcutHide(hideToggle.checked);
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_VISIBILITY_TOGGLE_CLICKED);
- };
- hideToggle.onkeydown = function(event) {
- if (customize.arrowKeys.includes(event.keyCode)) {
- // Handle arrow key navigation.
- event.preventDefault();
- event.stopPropagation();
- richerPicker.classList.remove(customize.CLASSES.MOUSE_NAV);
- if (event.keyCode === backArrowKey ||
- event.keyCode === customize.KEYCODES.UP) {
- mvOption.focus();
- }
- }
- };
- hideToggle.onkeyup = function(event) {
- // Handle enter since, unlike space, it does not trigger a click event.
- if (event.keyCode === customize.KEYCODES.ENTER) {
- hideToggle.click();
- }
- };
- hideToggle.onclick = function(event) {
- // Enter and space fire the 'onclick' event (which will remove special
- // keyboard navigation styling) unless propagation is stopped.
- event.stopPropagation();
- };
-
- const refreshToggle = $(customize.IDS.REFRESH_TOGGLE);
- refreshToggle.onchange = function(event) {
- ntpApiHandle.logEvent(
- customize.LOG_TYPE.NTP_BACKGROUND_REFRESH_TOGGLE_CLICKED);
- customize.richerPicker_toggleRefreshDaily(refreshToggle.checked);
- };
- refreshToggle.onkeyup = function(event) {
- // Handle enter since, unlike space, it does not trigger a click event.
- if (event.keyCode === customize.KEYCODES.ENTER) {
- refreshToggle.click();
- }
- };
- refreshToggle.onclick = function(event) {
- // Enter and space fire the 'onclick' event (which will remove special
- // keyboard navigation styling) unless propagation is stopped.
- event.stopPropagation();
- };
-
-
- const richerPickerOpenShortcuts = function() {
- customize.richerPicker_showSubmenu(
- $(customize.IDS.SHORTCUTS_BUTTON), $(customize.IDS.SHORTCUTS_MENU));
- };
-
- $(customize.IDS.SHORTCUTS_BUTTON).onclick = richerPickerOpenShortcuts;
- $(customize.IDS.SHORTCUTS_BUTTON).onkeydown = function(event) {
- if (event.keyCode === customize.KEYCODES.ENTER ||
- event.keyCode === customize.KEYCODES.SPACE) {
- richerPickerOpenShortcuts();
- }
- };
-
- $(customize.IDS.COLORS_BUTTON).onclick = function() {
- customize.richerPicker_showSubmenu(
- $(customize.IDS.COLORS_BUTTON), $(customize.IDS.COLORS_MENU));
- ntpApiHandle.getColorsInfo();
- };
-};
-
-customize.handleError = function(errors) {
- const unavailableString = configData.translatedStrings.backgroundsUnavailable;
-
- if (errors != 'undefined') {
- // Network errors.
- if (errors.net_error) {
- if (errors.net_error_no != 0) {
- const onClick = () => {
- window.open(
- 'https://chrome://network-error/' + errors.net_error_no,
- '_blank');
- };
- customize.showErrorNotification(
- configData.translatedStrings.connectionError,
- configData.translatedStrings.moreInfo, onClick);
- } else {
- customize.showErrorNotification(
- configData.translatedStrings.connectionErrorNoPeriod);
- }
- } else if (errors.service_error) { // Service errors.
- customize.showErrorNotification(unavailableString);
- }
- return;
- }
-
- // Generic error when we can't tell what went wrong.
- customize.showErrorNotification(unavailableString);
-};
-
-/**
- * Handles color selection. Apply styling to the selected color in the richer
- * picker and enable the done button.
- * @param {?Element} tile The selected color tile.
- */
-customize.updateColorsMenuTileSelection = function(tile) {
- if (!tile) {
- return;
- }
- // Clear the previous selection, if any.
- if (customize.selectedOptions.color) {
- customize.richerPicker_removeSelectedState(customize.selectedOptions.color);
- }
- customize.selectedOptions.color = tile;
- customize.richerPicker_applySelectedState(tile);
-};
-
-/**
- * Called when a color tile is clicked. Applies the color, and the selected
- * style on the tile.
- * @param {Event} event The event attributes for the interaction.
- */
-customize.colorTileInteraction = function(event) {
- customize.updateColorsMenuTileSelection(
- /** @type HTMLElement */ (event.currentTarget));
- const id = parseInt(event.currentTarget.dataset.id, 10);
- if (id) {
- ntpApiHandle.applyAutogeneratedTheme(
- id, event.currentTarget.dataset.color.split(','));
- }
-};
-
-/**
- * Called when the default theme tile is clicked. Applies the default theme, and
- * the selected style on the tile.
- * @param {Event} event The event attributes for the interaction.
- */
-customize.defaultThemeTileInteraction = function(event) {
- customize.updateColorsMenuTileSelection(
- /** @type HTMLElement */ (event.currentTarget));
- ntpApiHandle.applyDefaultTheme();
-};
-
-/**
- * Called when a new color is picked with color picker. Applies the color, and
- * the selected style on the tile.
- * @param {Event} event The event attributes for the interaction.
- */
-customize.colorPickerTileInteraction = function(event) {
- const hex = event.currentTarget.value;
- const r = parseInt(hex.substring(1, 3), 16);
- const g = parseInt(hex.substring(3, 5), 16);
- const b = parseInt(hex.substring(5, 7), 16);
- // If the picker is preselected and the user picks a new color, we need to
- // treat the picker as a new selection and not a preselection.
- if (customize.preselectedOptions.colorsMenuTile ===
- $(customize.IDS.COLOR_PICKER_TILE)) {
- customize.preselectedOptions.colorsMenuTile = null;
- }
- customize.updateColorsMenuTileSelection($(customize.IDS.COLOR_PICKER_TILE));
- ntpApiHandle.applyAutogeneratedTheme(0, [r, g, b, 255]);
-};
-
-/**
- * Loads Colors menu elements and initializes the selected state.
- */
-customize.loadColorsMenu = function() {
- if (!customize.colorsMenuLoaded) {
- customize.loadColorMenuTiles();
- customize.colorsMenuLoaded = true;
- }
-
- customize.resetColorsSelectedOptions();
- customize.colorsMenuOnThemeChange();
-};
-
-/**
- * Loads Colors menu tiles, e.g. color picker, default tile and color tiles.
- */
-customize.loadColorMenuTiles = function() {
- const colorsColl = ntpApiHandle.getColorsInfo();
- for (let i = 0; i < colorsColl.length; ++i) {
- const id = 'color_' + i;
- const imageUrl = colorsColl[i].icon;
- const dataset = {'color': colorsColl[i].color, 'id': colorsColl[i].id};
-
- const tile = customize.createTileWithoutTitle(
- id, imageUrl, dataset, customize.colorTileInteraction,
- customize.tileOnKeyDownInteraction);
- tile.firstElementChild.setAttribute('aria-label', colorsColl[i].label);
- tile.firstElementChild.setAttribute('title', colorsColl[i].label);
-
- $(customize.IDS.COLORS_MENU).appendChild(tile);
- }
-
- // Configure the default tile.
- $(customize.IDS.COLORS_DEFAULT_ICON).onclick =
- customize.defaultThemeTileInteraction;
- $(customize.IDS.COLORS_DEFAULT_ICON).onkeydown =
- customize.tileOnKeyDownInteraction;
-
- // On arrow keys focus the first element.
- $(customize.IDS.COLORS_MENU).onkeydown = function(event) {
- if (document.activeElement === $(customize.IDS.COLORS_MENU) &&
- customize.arrowKeys.includes(event.keyCode)) {
- $(customize.IDS.COLOR_PICKER_TILE).focus();
- event.preventDefault();
- }
- };
-
- // Configure custom color picker.
- $(customize.IDS.COLOR_PICKER_TILE).onclick = function(event) {
- $(customize.IDS.COLOR_PICKER).value = customize.customColorPicked;
- $(customize.IDS.COLOR_PICKER).click();
- };
- $(customize.IDS.COLOR_PICKER_TILE).onkeydown =
- customize.tileOnKeyDownInteraction;
- $(customize.IDS.COLOR_PICKER).onchange = customize.colorPickerTileInteraction;
-};
-
-/**
- * Update webstore theme info and preselect Colors menu tile according to
- * the theme update.
- */
-customize.colorsMenuOnThemeChange = function() {
- // Update webstore theme information.
- const ntpTheme = assert(ntpApiHandle.ntpTheme);
- if (ntpTheme.themeId && ntpTheme.themeName) {
- $(customize.IDS.COLORS_THEME).classList.add(customize.CLASSES.VISIBLE);
- $(customize.IDS.COLORS_THEME_NAME).innerHTML = ntpTheme.themeName;
- $(customize.IDS.COLORS_THEME_WEBSTORE_LINK).href =
- 'https://chrome.google.com/webstore/detail/' + ntpTheme.themeId;
- $(customize.IDS.COLORS_THEME_UNINSTALL).onclick =
- ntpApiHandle.useDefaultTheme;
-
- // Clear the previous selection, if any.
- if (customize.selectedOptions.color) {
- customize.richerPicker_removeSelectedState(
- customize.selectedOptions.color);
- customize.selectedOptions.color = null;
- }
- if (!customize.preselectedOptions.colorsMenuTile) {
- customize.preselectedOptions.colorsMenuTile =
- $(customize.IDS.COLORS_THEME);
- }
- } else {
- $(customize.IDS.COLORS_THEME).classList.remove(customize.CLASSES.VISIBLE);
-
- // Select the tile corresponding to the current theme/color.
- customize.colorsMenuPreselectTile();
- }
-};
-
-/**
- * Preselect Colors menu tile according to the theme info.
- */
-customize.colorsMenuPreselectTile = function() {
- const ntpTheme = assert(ntpApiHandle.ntpTheme);
- let tile;
- if (ntpTheme.usingDefaultTheme) {
- tile = $(customize.IDS.COLORS_DEFAULT_ICON);
- } else if (ntpTheme.colorId && ntpTheme.colorId > 0) {
- // Color from predefined set is selected.
- const tiles = Array.from(
- $(customize.IDS.COLORS_MENU)
- .getElementsByClassName(customize.CLASSES.COLLECTION_TILE));
- for (let i = 0; i < tiles.length; i++) {
- if (tiles[i].dataset && tiles[i].dataset.id == ntpTheme.colorId) {
- tile = tiles[i];
- break;
- }
- }
- } else if (
- ntpTheme.colorDark && ntpTheme.colorLight && ntpTheme.colorPicked) {
- // Custom color is selected.
- tile = $(customize.IDS.COLOR_PICKER_TILE);
-
- // Update color picker tile colors.
- customize.customColorPicked = colorArrayToHex(ntpTheme.colorPicked);
- $(customize.IDS.COLORS_MENU)
- .style.setProperty(
- '--custom-color-border', colorArrayToHex(ntpTheme.colorDark));
- $(customize.IDS.COLORS_MENU)
- .style.setProperty(
- '--custom-color-dark', colorArrayToHex(ntpTheme.colorDark));
- $(customize.IDS.COLORS_MENU)
- .style.setProperty(
- '--custom-color-light', colorArrayToHex(ntpTheme.colorLight));
- $(customize.IDS.COLOR_PICKER_ICON)
- .classList.toggle('white', ntpTheme.isNtpBackgroundDark);
- }
-
- if (tile && tile !== customize.selectedOptions.color) {
- if (!customize.preselectedOptions.colorsMenuTile) {
- customize.preselectedOptions.colorsMenuTile = tile;
- }
-
- customize.updateColorsMenuTileSelection(
- /** @type HTMLElement */ (tile));
- }
-};
-
-/**
- * Indicates whether a color other then preselected one was selected on Colors
- * menu.
- */
-customize.isColorOptionSelected = function() {
- return customize.preselectedOptions.colorsMenuTile !==
- customize.selectedOptions.color;
-};
-
-/**
- * Indicates whether a background tile other then the preselected one was
- * selected on the backgrounds menu.
- */
-customize.isBackgroundOptionSelected = function() {
- return customize.selectedOptions.backgroundData &&
- (!customize.preselectedOptions.backgroundsMenuTile ||
- customize.selectedOptions.backgroundData.id !=
- customize.preselectedOptions.backgroundsMenuTile.id);
-};
-
-/**
- * Permanently applies the color changes. Called when the done button is
- * pressed.
- */
-customize.confirmColor = function() {
- ntpApiHandle.confirmThemeChanges();
-};
-
-/**
- * Reverts the applied (but not confirmed) color changes. Called when the cancel
- * button is pressed.
- */
-customize.cancelColor = function() {
- ntpApiHandle.revertThemeChanges();
-};
-
-/**
- * Reset color picker to its default state.
- */
-customize.resetColorPicker = function() {
- customize.customColorPicked = customize.defaultCustomColor;
- $(customize.IDS.COLOR_PICKER).value = null;
- $(customize.IDS.COLORS_MENU).style.setProperty('--custom-color-border', '');
- $(customize.IDS.COLORS_MENU).style.setProperty('--custom-color-dark', '');
- $(customize.IDS.COLORS_MENU).style.setProperty('--custom-color-light', '');
- $(customize.IDS.COLOR_PICKER_ICON).classList.toggle('white', false);
-};
-
-/**
- * Reset color selection.
- */
-customize.resetColorsSelectedOptions = function() {
- customize.richerPicker_removeSelectedState(customize.selectedOptions.color);
- customize.selectedOptions.color = null;
- customize.preselectedOptions.colorsMenuTile = null;
-};
-
-/**
- * Converts an RGBA component into hex format.
- * @param {number} c RGBA component.
- * @return {string} RGBA component in hex format.
- */
-function rgbComponentToHex(c) {
- const hex = c.toString(16);
- return hex.length == 1 ? '0' + hex : hex;
-}
-
-/**
- * Converts an Array of color components into hex format "#000000".
- * @param {Array<number>} color Array of RGBA color components.
- * @return {string} color in hex format.
- */
-function colorArrayToHex(color) {
- if (!color || color.length != 4) {
- return '';
- }
-
- return '#' + rgbComponentToHex(color[0]) + rgbComponentToHex(color[1]) +
- rgbComponentToHex(color[2]);
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/doodles.css b/chromium/chrome/browser/resources/local_ntp/doodles.css
deleted file mode 100644
index 25191935104..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/doodles.css
+++ /dev/null
@@ -1,295 +0,0 @@
-/* Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-#logo {
- margin-top: var(--logo-margin-top);
- min-height: calc(var(--logo-height) + var(--logo-margin-bottom));
- position: relative;
-}
-
-.non-google-page #logo {
- display: none;
-}
-
-#logo-doodle {
- text-align: center;
-}
-
-#logo-default,
-#logo-doodle {
- opacity: 0;
- visibility: hidden;
-}
-
-#logo-default.show-logo,
-#logo-doodle.show-logo {
- opacity: 1;
- visibility: visible;
-}
-
-#logo-doodle-container,
-#logo-doodle-iframe,
-#logo-doodle-wrapper {
- display: none;
-}
-
-#logo-doodle-button {
- cursor: pointer;
-}
-
-#logo-doodle-iframe.show-logo {
- display: block;
-}
-
-#logo-doodle-container.show-logo {
- display: inline-block;
-}
-
-.show-logo #logo-doodle-wrapper {
- display: inline-block;
-}
-
-@media (prefers-color-scheme: dark) {
- .show-logo #logo-doodle-wrapper {
- border-radius: 20px;
- display: inline-block;
- padding: 16px 24px 16px 24px;
- }
-}
-
-#logo-doodle-image {
- outline: none;
-}
-
-#logo-default.fade,
-#logo-doodle.fade {
- transition: opacity 130ms, visibility 130ms;
-}
-
-#logo-default,
-#logo-non-white {
- background-image: url(../new_tab_page/icons/google_logo.svg);
- background-repeat: no-repeat;
- bottom: var(--logo-margin-bottom);
- height: 92px;
- left: calc(50% - 272px/2);
- position: absolute;
- width: 272px;
-}
-
-body.alternate-logo #logo-default,
-body.alternate-logo #logo-non-white {
- -webkit-mask-image: url(../new_tab_page/icons/google_logo.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background: var(--logo-color);
-}
-
-#logo-default,
-.dont-show-doodle #logo-non-white {
- display: block;
-}
-#logo-non-white,
-.dont-show-doodle #logo-default {
- display: none;
-}
-
-#logo-doodle-container {
- /* An image logo is allowed to spill into the margin below, so it's not a
- * real bottom margin. If the image extends further than that margin, it
- * is cropped. */
- margin: 0 auto;
- max-height: calc(var(--logo-height) + var(--logo-margin-bottom));
- overflow: hidden;
- position: relative;
- text-align: text-center;
-}
-
-.dont-show-doodle #logo-doodle-container,
-.dont-show-doodle #logo-doodle-iframe {
- display: none;
-}
-
-#logo-doodle-iframe {
- border: 0;
- height: var(--logo-iframe-height);
- margin: 0 auto calc(var(--logo-height) + var(--logo-margin-bottom)
- - var(--logo-iframe-initial-height)) auto;
- transition: width var(--logo-iframe-resize-duration),
- height var(--logo-iframe-resize-duration);
- width: var(--logo-iframe-width);
-}
-
-#ddlsb {
- border-radius: 6px;
- cursor: pointer;
- display: inline-block;
- height: 26px;
- opacity: .8;
- position: absolute;
- width: 26px;
-}
-
-#ddlsb:hover {
- opacity: 1;
-}
-
-#ddlsb-img {
- height: 22px;
- left: 2px;
- position: absolute;
- top: 2px;
- width: 22px;
-}
-
-#ddlsd {
- background: #fff;
- border: none;
- border-radius: 8px;
- box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .2);
- left: 0;
- margin: auto;
- min-height: 100px;
- padding: 22px;
- position: absolute;
- right: 0;
- text-align: start;
- top: 30%;
- width: 300px;
- z-index: 9001;
-}
-
-#ddlsd::backdrop {
- background-color: rgba(255, 255, 255, .9);
-}
-
-@media (prefers-color-scheme: dark) {
- #ddlsd {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- box-shadow: var(--dark-mode-shadow);
- }
-
- #ddlsd::backdrop {
- background-color: rgba(0, 0, 0, 0.4);
- }
-}
-
-#ddlsd button {
- border: none;
- cursor: pointer;
-}
-
-#ddlsd button:hover {
- opacity: .8;
-}
-
-#ddlsd-title {
- color: #212121;
- font-size: 22px;
- padding-bottom: 16px;
- padding-inline-end: 40px;
-}
-
-@media (prefers-color-scheme: dark) {
- #ddlsd-title {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#ddlsd-close {
- height: 24px;
- position: absolute;
- right: 22px;
- top: 22px;
- width: 24px;
-}
-
-[dir=rtl] #ddlsd-close {
- left: 22px;
- right: auto;
-}
-
-#ddlsd-close::before {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_clear.svg);
- -webkit-mask-position: center center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 32px;
- background-color: #4d4d4d;
- content: '';
- display: block;
- height: 100%;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #ddlsd-close::before {
- background-color: rgb(var(--GG500-rgb));
- }
-}
-
-#ddlsd-fbb {
- background: url(icons/facebook.svg) no-repeat center;
-}
-
-#ddlsd-twb {
- background: url(icons/twitter.svg) no-repeat center;
-}
-
-#ddlsd-emb {
- background: url(icons/mail.svg) no-repeat center;
-}
-
-#ddlsd-text {
- border: 2px solid #aaa;
- border-color: rgba(0, 0, 0, .15);
- border-radius: 4px;
- color: #555;
- display: inline-block;
- font-size: 14px;
- padding: 12px;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #ddlsd-text {
- background-color: rgba(0, 0, 0, 0.3);
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#ddlsd-copy {
- background: url(icons/copy.svg) no-repeat center;
- background-size: contain;
- display: inline-block;
- height: 36px;
- margin: 5px;
- width: 36px;
-}
-
-.ddlsd-sbtn {
- background-size: contain;
- border-radius: 4px;
- display: inline-block;
- height: 48px;
- margin: 0 4px;
- width: 48px;
-}
-
-#ddlsd-hr {
- background: #ccc;
- border: 0;
- height: 2px;
- margin: 15px 0;
-}
-
-#ddlsd-link {
- display: flex;
- margin: 6px;
-}
-
-#ddlsd-text-ctr {
- display: block;
- overflow: hidden;
- padding-inline-end: 36px;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/doodles.js b/chromium/chrome/browser/resources/local_ntp/doodles.js
deleted file mode 100644
index 0cef8f5cd28..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/doodles.js
+++ /dev/null
@@ -1,721 +0,0 @@
-/**
- * @license
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-const doodles = {};
-
-doodles.numDdllogResponsesReceived = 0;
-doodles.lastDdllogResponse = '';
-
-doodles.onDdllogResponse = null;
-
-doodles.ei = null;
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-doodles.CLASSES = {
- FADE: 'fade', // Enables opacity transition on logo and doodle.
- SHOW_LOGO: 'show-logo', // Marks logo/doodle that should be shown.
-};
-
-/**
- * Enum for HTML element ids.
- * @enum {string}
- * @const
- */
-doodles.IDS = {
- DOODLE_SHARE_BUTTON: 'ddlsb',
- DOODLE_SHARE_BUTTON_IMG: 'ddlsb-img',
- DOODLE_SHARE_DIALOG: 'ddlsd',
- DOODLE_SHARE_DIALOG_CLOSE_BUTTON: 'ddlsd-close',
- DOODLE_SHARE_DIALOG_COPY_LINK_BUTTON: 'ddlsd-copy',
- DOODLE_SHARE_DIALOG_FACEBOOK_BUTTON: 'ddlsd-fbb',
- DOODLE_SHARE_DIALOG_LINK: 'ddlsd-text',
- DOODLE_SHARE_DIALOG_MAIL_BUTTON: 'ddlsd-emb',
- DOODLE_SHARE_DIALOG_TITLE: 'ddlsd-title',
- DOODLE_SHARE_DIALOG_TWITTER_BUTTON: 'ddlsd-twb',
- LOGO_DEFAULT: 'logo-default',
- LOGO_DOODLE: 'logo-doodle',
- LOGO_DOODLE_IMAGE: 'logo-doodle-image',
- LOGO_DOODLE_IFRAME: 'logo-doodle-iframe',
- LOGO_DOODLE_CONTAINER: 'logo-doodle-container',
- LOGO_DOODLE_BUTTON: 'logo-doodle-button',
- LOGO_DOODLE_WRAPPER: 'logo-doodle-wrapper',
-};
-
-/**
- * Counterpart of search_provider_logos::LogoType.
- * @enum {string}
- * @const
- */
-doodles.LOGO_TYPE = {
- SIMPLE: 'SIMPLE',
- ANIMATED: 'ANIMATED',
- INTERACTIVE: 'INTERACTIVE',
-};
-
-/**
- * Subset of gws.plugins.doodle.SharingLightbox.LogType in
- * googledata/html/templates/gws/head/xjs/plugins/doodle/sharing_lightbox.js.
- * @enum {number}
- * @const
- */
-doodles.SHARE_TYPE = {
- FACEBOOK: 2,
- TWITTER: 3,
- EMAIL: 5,
- LINK_COPY: 6,
-};
-
-/**
- * The ID of the doodle app for Facebook. Used to share doodles to Facebook.
- * @type {number}
- */
-doodles.FACEBOOK_APP_ID = 738026486351791;
-
-/**
- * The different types of events that are logged from the NTP. This enum is
- * used to transfer information from the NTP JavaScript to the renderer and is
- * not used as a UMA enum histogram's logged value.
- * Note: Keep in sync with common/ntp_logging_events.h
- * @enum {number}
- * @const
- */
-doodles.LOG_TYPE = {
- // A static Doodle was shown, coming from cache.
- NTP_STATIC_LOGO_SHOWN_FROM_CACHE: 30,
- // A static Doodle was shown, coming from the network.
- NTP_STATIC_LOGO_SHOWN_FRESH: 31,
- // A call-to-action Doodle image was shown, coming from cache.
- NTP_CTA_LOGO_SHOWN_FROM_CACHE: 32,
- // A call-to-action Doodle image was shown, coming from the network.
- NTP_CTA_LOGO_SHOWN_FRESH: 33,
-
- // A static Doodle was clicked.
- NTP_STATIC_LOGO_CLICKED: 34,
- // A call-to-action Doodle was clicked.
- NTP_CTA_LOGO_CLICKED: 35,
- // An animated Doodle was clicked.
- NTP_ANIMATED_LOGO_CLICKED: 36,
-};
-
-/**
- * Handle the resizeDoodle command sent from the fpdoodle page
- * when an interactive doodle is clicked.
- * @param {Object} args, arguments sent to the page via postMessage.
- */
-doodles.resizeDoodleHandler = function(args) {
- const width = args.width || null;
- const height = args.height || null;
- const duration = args.duration || '0s';
- const iframe = $(doodles.IDS.LOGO_DOODLE_IFRAME);
-
- const transitionCallback = function() {
- iframe.removeEventListener('webkitTransitionEnd', transitionCallback);
- iframe.contentWindow.postMessage(
- {cmd: 'resizeComplete'}, 'https://www.google.com');
- };
- iframe.addEventListener('webkitTransitionEnd', transitionCallback, false);
-
- document.body.style.setProperty('--logo-iframe-resize-duration', duration);
- document.body.style.setProperty('--logo-iframe-height', height);
- document.body.style.setProperty('--logo-iframe-width', width);
-};
-
-/**
- * Fetch doodle data and display it if one is present.
- */
-doodles.init = function() {
- // Load the Doodle. After the first request completes (getting cached
- // data), issue a second request for fresh Doodle data.
- doodles.loadDoodle(/*v=*/ null, function(ddl) {
- if (ddl === null) {
- // Got no ddl object at all, the feature is probably disabled. Just show
- // the logo.
- doodles.showLogoOrDoodle(/*fromCache=*/ true);
- return;
- }
-
- const darkMode = window.matchMedia('(prefers-color-scheme: dark)');
- darkMode.addListener(doodles.fadeToLogoOrDoodle);
-
- // Got a (possibly empty) ddl object. Show logo or doodle.
- doodles.targetDoodle.image = ddl.image || null;
- doodles.targetDoodle.dark_image = ddl.dark_image || null;
- doodles.targetDoodle.metadata = ddl.metadata || null;
- doodles.showLogoOrDoodle(/*fromCache=*/ true);
- // Never hide an interactive doodle if it was already shown.
- if (ddl.metadata && (ddl.metadata.type === doodles.LOGO_TYPE.INTERACTIVE)) {
- return;
- }
- // If we got a valid ddl object (from cache), load a fresh one.
- if (ddl.v !== null) {
- doodles.loadDoodle(ddl.v, function(ddl2) {
- if (ddl2.usable) {
- doodles.targetDoodle.image = ddl2.image || null;
- doodles.targetDoodle.dark_image = ddl2.dark_image || null;
- doodles.targetDoodle.metadata = ddl2.metadata || null;
- doodles.fadeToLogoOrDoodle();
- }
- });
- }
- });
-};
-
-/**
- * Get the doodle image for the current color scheme, either light or dark.
- */
-doodles.getImageForColorScheme = function() {
- // Only use a dark image if the browser is in dark mode and a dark image
- // actually exists.
- if (window.matchMedia('(prefers-color-scheme: dark)').matches &&
- doodles.targetDoodle.dark_image) {
- return doodles.targetDoodle.dark_image;
- }
- return doodles.targetDoodle.image;
-};
-
-/**
- * Loads the Doodle. On success, the loaded script declares a global variable
- * ddl, which onload() receives as its single argument. On failure, onload() is
- * called with null as the argument. If v is null, then the call requests a
- * cached logo. If non-null, it must be the ddl.v of a previous request for a
- * cached logo, and the corresponding fresh logo is returned.
- * @param {?number} v
- * @param {function(?{v, usable, image, metadata})} onload
- */
-doodles.loadDoodle = function(v, onload) {
- const ddlScript = document.createElement('script');
- ddlScript.src = 'chrome-search://local-ntp/doodle.js';
- if (v !== null) {
- ddlScript.src += '?v=' + v;
- }
- ddlScript.onload = function() {
- onload(ddl);
- };
- ddlScript.onerror = function() {
- onload(null);
- };
- document.body.appendChild(ddlScript);
-};
-
-/**
- * Handles the response of a doodle impression ping, i.e. stores the
- * appropriate interactionLogUrl or onClickUrlExtraParams. Also stores
- * the event id to be used for logging sharing events.
- *
- * @param {!Object} ddllog Response object from the ddllog ping.
- * @param {!boolean} isAnimated
- */
-doodles.handleDdllogResponse = function(ddllog, isAnimated) {
- if (ddllog) {
- if (ddllog.encoded_ei) {
- doodles.ei = ddllog.encoded_ei;
- }
- if (ddllog.interaction_log_url) {
- const interactionLogUrl =
- new URL(ddllog.interaction_log_url, configData.googleBaseUrl);
- if (isAnimated) {
- doodles.targetDoodle.animatedInteractionLogUrl = interactionLogUrl;
- } else {
- doodles.targetDoodle.staticInteractionLogUrl = interactionLogUrl;
- }
- doodles.lastDdllogResponse =
- 'interaction_log_url ' + ddllog.interaction_log_url;
-
- } else if (ddllog.target_url_params) {
- doodles.targetDoodle.onClickUrlExtraParams =
- new URLSearchParams(ddllog.target_url_params);
- doodles.lastDdllogResponse =
- 'target_url_params ' + ddllog.target_url_params;
- } else {
- console.log('Invalid ddllog response:');
- console.log(ddllog);
- }
- } else {
- console.log('Missing ddllog response.');
- }
-};
-
-/**
- * Logs a doodle impression at the given logUrl, and handles the response via
- * doodles.handleDdllogResponse.
- *
- * @param {!string} logUrl
- * @param {!boolean} isAnimated
- */
-doodles.logDoodleImpression = function(logUrl, isAnimated) {
- doodles.lastDdllogResponse = '';
- fetch(logUrl, {credentials: 'omit'})
- .then(function(response) {
- return response.text();
- })
- .then(function(text) {
- // Remove the optional XSS preamble.
- const preamble = ')]}\'';
- if (text.startsWith(preamble)) {
- text = text.substr(preamble.length);
- }
- let json;
- try {
- json = JSON.parse(text);
- } catch (error) {
- console.log('Failed to parse doodle impression response as JSON:');
- console.log(error);
- return;
- }
- doodles.handleDdllogResponse(json['ddllog'], isAnimated);
- })
- .catch(function(error) {
- console.log('Error logging doodle impression to "' + logUrl + '":');
- console.log(error);
- })
- .finally(function() {
- ++doodles.numDdllogResponsesReceived;
- if (doodles.onDdllogResponse !== null) {
- doodles.onDdllogResponse();
- }
- });
-};
-
-/**
- * Logs a doodle sharing event.
- * Uses the ct param provided in metadata.onClickUrl to track the doodle.
- *
- * @param {number} platform Social media platform the doodle will be shared to.
- */
-doodles.logDoodleShare = function(platform) {
- if (doodles.targetDoodle.metadata.onClickUrl) {
- const onClickUrl = new URL(doodles.targetDoodle.metadata.onClickUrl);
- const ct = onClickUrl.searchParams.get('ct');
- if (ct && ct != '') {
- const url = new URL('/gen_204', configData.googleBaseUrl);
- url.searchParams.append('atyp', 'i');
- url.searchParams.append('ct', 'doodle');
- url.searchParams.append('cad', 'sh,' + platform + ',ct:' + ct);
- url.searchParams.append('ntp', '1');
- if (doodles.ei && doodles.ei != '') {
- url.searchParams.append('ei', doodles.ei);
- }
- navigator.sendBeacon(url.toString());
- }
- }
-};
-
-/**
- * Returns true if the target doodle is currently visible. If |image| is null,
- * returns true when the default logo is visible; if non-null, checks that it
- * matches the doodle that is currently visible. Here, "visible" means
- * fully-visible or fading in.
- *
- * @returns {boolean}
- */
-doodles.isDoodleCurrentlyVisible = function() {
- const haveDoodle = ($(doodles.IDS.LOGO_DOODLE)
- .classList.contains(doodles.CLASSES.SHOW_LOGO));
- const wantDoodle = (doodles.targetDoodle.metadata !== null) &&
- (doodles.getImageForColorScheme() !== null ||
- doodles.targetDoodle.metadata.type === doodles.LOGO_TYPE.INTERACTIVE);
- if (!haveDoodle || !wantDoodle) {
- return haveDoodle === wantDoodle;
- }
-
- // Have a visible doodle and a target doodle. Test that they match.
- if (doodles.targetDoodle.metadata.type === doodles.LOGO_TYPE.INTERACTIVE) {
- const logoDoodleIframe = $(doodles.IDS.LOGO_DOODLE_IFRAME);
- return logoDoodleIframe.classList.contains(doodles.CLASSES.SHOW_LOGO) &&
- (logoDoodleIframe.src === doodles.targetDoodle.metadata.fullPageUrl);
- } else {
- const logoDoodleImage = $(doodles.IDS.LOGO_DOODLE_IMAGE);
- const logoDoodleContainer = $(doodles.IDS.LOGO_DOODLE_CONTAINER);
- return logoDoodleContainer.classList.contains(doodles.CLASSES.SHOW_LOGO) &&
- ((logoDoodleImage.src === doodles.getImageForColorScheme()) ||
- (logoDoodleImage.src === doodles.targetDoodle.metadata.animatedUrl));
- }
-};
-
-/**
- * The image and metadata that should be shown, according to the latest fetch.
- * After a logo fades out, doodles.onDoodleFadeOutComplete fades in a logo
- * according to doodles.targetDoodle.
- */
-doodles.targetDoodle = {
- image: null,
- metadata: null,
- // The log URLs and params may be filled with the response from the
- // corresponding impression log URL.
- staticInteractionLogUrl: null,
- animatedInteractionLogUrl: null,
- onClickUrlExtraParams: null,
-};
-
-doodles.getDoodleTargetUrl = function() {
- const url = new URL(doodles.targetDoodle.metadata.onClickUrl);
- if (doodles.targetDoodle.onClickUrlExtraParams) {
- for (const param of doodles.targetDoodle.onClickUrlExtraParams) {
- url.searchParams.append(param[0], param[1]);
- }
- }
- return url;
-};
-
-doodles.showLogoOrDoodle = function(fromCache) {
- const cachedInteractiveOffline = fromCache &&
- doodles.targetDoodle.metadata !== null &&
- doodles.targetDoodle.metadata.type == doodles.LOGO_TYPE.INTERACTIVE &&
- !window.navigator.onLine;
- if (doodles.targetDoodle.metadata !== null && !cachedInteractiveOffline) {
- doodles.applyDoodleMetadata();
- if (doodles.targetDoodle.metadata.type === doodles.LOGO_TYPE.INTERACTIVE) {
- $(doodles.IDS.LOGO_DOODLE_CONTAINER)
- .classList.remove(doodles.CLASSES.SHOW_LOGO);
- $(doodles.IDS.LOGO_DOODLE_IFRAME)
- .classList.add(doodles.CLASSES.SHOW_LOGO);
- } else {
- const isDarkModeEnabled =
- window.matchMedia('(prefers-color-scheme: dark)').matches;
- if (isDarkModeEnabled) {
- $(doodles.IDS.LOGO_DOODLE_WRAPPER).style.backgroundColor =
- doodles.targetDoodle.metadata.darkBackgroundColor;
- }
- $(doodles.IDS.LOGO_DOODLE_IMAGE).src = doodles.getImageForColorScheme();
- $(doodles.IDS.LOGO_DOODLE_CONTAINER)
- .classList.add(doodles.CLASSES.SHOW_LOGO);
- $(doodles.IDS.LOGO_DOODLE_IFRAME)
- .classList.remove(doodles.CLASSES.SHOW_LOGO);
-
- // Log the impression in Chrome metrics.
- const isCta = doodles.targetDoodle.metadata.animatedUrl;
- const eventType = isCta ?
- (fromCache ? doodles.LOG_TYPE.NTP_CTA_LOGO_SHOWN_FROM_CACHE :
- doodles.LOG_TYPE.NTP_CTA_LOGO_SHOWN_FRESH) :
- (fromCache ? doodles.LOG_TYPE.NTP_STATIC_LOGO_SHOWN_FROM_CACHE :
- doodles.LOG_TYPE.NTP_STATIC_LOGO_SHOWN_FRESH);
- ntpApiHandle.logEvent(eventType);
-
- // Ping the proper impression logging URL if it exists.
- const logUrl = isCta ? doodles.targetDoodle.metadata.ctaLogUrl :
- doodles.targetDoodle.metadata.logUrl;
- if (logUrl) {
- doodles.logDoodleImpression(logUrl, /*isAnimated=*/ false);
- }
- }
- $(doodles.IDS.LOGO_DOODLE).classList.add(doodles.CLASSES.SHOW_LOGO);
- } else {
- // No doodle. Just show the default logo.
- $(doodles.IDS.LOGO_DEFAULT).classList.add(doodles.CLASSES.SHOW_LOGO);
- }
-};
-
-/**
- * Starts fading out the given element, which should be either the default logo
- * or the doodle.
- * @param {?Element} element
- */
-doodles.startFadeOut = function(element) {
- if (!element || !element.classList.contains(doodles.CLASSES.SHOW_LOGO)) {
- return;
- }
-
- // Compute style now, to ensure that the transition from 1 -> 0 is properly
- // recognized. Otherwise, if a 0 -> 1 -> 0 transition is too fast, the
- // element might stay invisible instead of appearing then fading out.
- const style = window.getComputedStyle(element).opacity;
-
- element.classList.add(doodles.CLASSES.FADE);
- element.classList.remove(doodles.CLASSES.SHOW_LOGO);
- element.addEventListener('transitionend', doodles.onDoodleFadeOutComplete);
-};
-
-/**
- * Integrates a fresh doodle into the page as appropriate. If the correct logo
- * or doodle is already shown, just updates the metadata. Otherwise, initiates
- * a fade from the currently-shown logo/doodle to the new one.
- */
-doodles.fadeToLogoOrDoodle = function() {
- // If the image is already visible, there's no need to start a fade-out.
- // However, metadata may have changed, so update the doodle's alt text and
- // href, if applicable.
- if (doodles.isDoodleCurrentlyVisible()) {
- if (doodles.targetDoodle.metadata !== null) {
- doodles.applyDoodleMetadata();
- }
- return;
- }
-
- // It's not the same doodle. Clear any loging URLs/params we might have.
- doodles.targetDoodle.staticInteractionLogUrl = null;
- doodles.targetDoodle.animatedInteractionLogUrl = null;
- doodles.targetDoodle.onClickUrlExtraParams = null;
-
- // Start fading out the current logo or doodle.
- // doodles.onDoodleFadeOutComplete will apply the change when the fade-out
- // finishes.
- doodles.startFadeOut($(doodles.IDS.LOGO_DEFAULT));
- doodles.startFadeOut($(doodles.IDS.LOGO_DOODLE));
-};
-
-doodles.onDoodleFadeOutComplete = function(e) {
- // Fade-out finished. Start fading in the appropriate logo.
- $(doodles.IDS.LOGO_DOODLE).classList.add(doodles.CLASSES.FADE);
- $(doodles.IDS.LOGO_DEFAULT).classList.add(doodles.CLASSES.FADE);
- doodles.showLogoOrDoodle(/*fromCache=*/ false);
-
- e.target.removeEventListener(
- 'transitionend', doodles.onDoodleFadeOutComplete);
-};
-
-doodles.applyDoodleMetadata = function() {
- const logoDoodleImage = $(doodles.IDS.LOGO_DOODLE_IMAGE);
- const logoDoodleButton = $(doodles.IDS.LOGO_DOODLE_BUTTON);
- const logoDoodleIframe = $(doodles.IDS.LOGO_DOODLE_IFRAME);
-
- const logoDoodleShareButton = null;
- const logoDoodleShareDialog = null;
-
- switch (doodles.targetDoodle.metadata.type) {
- case doodles.LOGO_TYPE.SIMPLE:
- logoDoodleImage.title = doodles.targetDoodle.metadata.altText;
-
- // On click, navigate to the target URL.
- logoDoodleButton.onclick = function() {
- // Log the click in Chrome metrics.
- ntpApiHandle.logEvent(doodles.LOG_TYPE.NTP_STATIC_LOGO_CLICKED);
-
- // Ping the static interaction_log_url if there is one.
- if (doodles.targetDoodle.staticInteractionLogUrl) {
- navigator.sendBeacon(
- doodles.targetDoodle.staticInteractionLogUrl.href);
- doodles.targetDoodle.staticInteractionLogUrl = null;
- }
-
- window.location = doodles.getDoodleTargetUrl();
- };
-
- doodles.insertShareButton();
- doodles.updateShareDialog();
- break;
-
- case doodles.LOGO_TYPE.ANIMATED:
- logoDoodleImage.title = doodles.targetDoodle.metadata.altText;
- // The CTA image is currently shown; on click, show the animated one.
- logoDoodleButton.onclick = function(e) {
- e.preventDefault();
-
- // Log the click in Chrome metrics.
- ntpApiHandle.logEvent(doodles.LOG_TYPE.NTP_CTA_LOGO_CLICKED);
-
- // Ping the static interaction_log_url if there is one.
- if (doodles.targetDoodle.staticInteractionLogUrl) {
- navigator.sendBeacon(
- doodles.targetDoodle.staticInteractionLogUrl.href);
- doodles.targetDoodle.staticInteractionLogUrl = null;
- }
-
- // Once the animated image loads, ping the impression log URL.
- if (doodles.targetDoodle.metadata.logUrl) {
- logoDoodleImage.onload = function() {
- doodles.logDoodleImpression(
- doodles.targetDoodle.metadata.logUrl, /*isAnimated=*/ true);
- };
- }
- logoDoodleImage.src = doodles.targetDoodle.metadata.animatedUrl;
-
- // When the animated image is clicked, navigate to the target URL.
- logoDoodleButton.onclick = function() {
- // Log the click in Chrome metrics.
- ntpApiHandle.logEvent(doodles.LOG_TYPE.NTP_ANIMATED_LOGO_CLICKED);
-
- // Ping the animated interaction_log_url if there is one.
- if (doodles.targetDoodle.animatedInteractionLogUrl) {
- navigator.sendBeacon(
- doodles.targetDoodle.animatedInteractionLogUrl.href);
- doodles.targetDoodle.animatedInteractionLogUrl = null;
- }
-
- window.location = doodles.getDoodleTargetUrl();
- };
-
- doodles.insertShareButton();
- doodles.updateShareDialog();
- };
- break;
-
- case doodles.LOGO_TYPE.INTERACTIVE:
- logoDoodleIframe.title = doodles.targetDoodle.metadata.altText;
- logoDoodleIframe.src = doodles.targetDoodle.metadata.fullPageUrl;
- logoDoodleIframe.allow = 'autoplay';
- document.body.style.setProperty(
- '--logo-iframe-width',
- doodles.targetDoodle.metadata.iframeWidthPx + 'px');
- document.body.style.setProperty(
- '--logo-iframe-height',
- doodles.targetDoodle.metadata.iframeHeightPx + 'px');
- document.body.style.setProperty(
- '--logo-iframe-initial-height',
- doodles.targetDoodle.metadata.iframeHeightPx + 'px');
- break;
- }
-};
-
-/**
- * Creates a share button for static/animated doodles which opens the share
- * dialog upon click.
- */
-doodles.insertShareButton = function() {
- // Terminates early if share button data for the current color scheme is
- // missing or incomplete.
- const isDarkModeEnabled =
- window.matchMedia('(prefers-color-scheme: dark)').matches;
- const lightShareButtonMissing = !isDarkModeEnabled &&
- (!doodles.targetDoodle.metadata ||
- !doodles.targetDoodle.metadata.shareButtonX ||
- !doodles.targetDoodle.metadata.shareButtonY ||
- !doodles.targetDoodle.metadata.shareButtonBg ||
- !doodles.targetDoodle.metadata.shareButtonIcon);
- const darkShareButtonMissing = isDarkModeEnabled &&
- (!doodles.targetDoodle.metadata ||
- !doodles.targetDoodle.metadata.darkShareButtonX ||
- !doodles.targetDoodle.metadata.darkShareButtonY ||
- !doodles.targetDoodle.metadata.darkShareButtonBg ||
- !doodles.targetDoodle.metadata.darkShareButtonIcon);
- if (lightShareButtonMissing || darkShareButtonMissing) {
- return;
- }
- const shareDialog = $(doodles.IDS.DOODLE_SHARE_DIALOG);
-
- const shareButtonWrapper = document.createElement('button');
- shareButtonWrapper.id = doodles.IDS.DOODLE_SHARE_BUTTON;
- const shareButtonImg = document.createElement('img');
- shareButtonImg.id = doodles.IDS.DOODLE_SHARE_BUTTON_IMG;
- shareButtonWrapper.appendChild(shareButtonImg);
- shareButtonWrapper.title = configData.translatedStrings.shareDoodle;
-
- const shareButtonX = isDarkModeEnabled ?
- doodles.targetDoodle.metadata.darkShareButtonX :
- doodles.targetDoodle.metadata.shareButtonX;
- shareButtonWrapper.style.left = shareButtonX + 'px';
- const shareButtonY = isDarkModeEnabled ?
- doodles.targetDoodle.metadata.darkShareButtonY :
- doodles.targetDoodle.metadata.shareButtonY;
- shareButtonWrapper.style.top = shareButtonY + 'px';
-
- // Alpha-less background color represented as an RGB HEX string.
- // Share button opacity represented as a double between 0 to 1.
- // Final background color is an RGBA HEX string created by combining
- // both.
- let backgroundColor = isDarkModeEnabled ?
- doodles.targetDoodle.metadata.darkShareButtonBg :
- doodles.targetDoodle.metadata.shareButtonBg;
- const shareButtonOpacity = isDarkModeEnabled ?
- doodles.targetDoodle.metadata.darkShareButtonOpacity :
- doodles.targetDoodle.metadata.shareButtonOpacity;
- if (!!shareButtonOpacity || shareButtonOpacity == 0) {
- const backgroundOpacityHex =
- parseInt(shareButtonOpacity * 255, 10).toString(16);
- backgroundColor += backgroundOpacityHex;
- }
-
- shareButtonWrapper.style.backgroundColor = backgroundColor;
- const shareButtonIcon = isDarkModeEnabled ?
- doodles.targetDoodle.metadata.darkShareButtonIcon :
- doodles.targetDoodle.metadata.shareButtonIcon;
- shareButtonImg.src = 'data:image/png;base64,' + shareButtonIcon;
- shareButtonWrapper.onclick = function() {
- shareDialog.showModal();
- };
-
- const oldButton = $(doodles.IDS.DOODLE_SHARE_BUTTON);
- if (oldButton) {
- oldButton.remove();
- }
-
- const logoContainer = $(doodles.IDS.LOGO_DOODLE_CONTAINER);
- if (logoContainer) {
- logoContainer.appendChild(shareButtonWrapper);
- }
-};
-
-/**
- * Initiates the buttons on the doodle share dialog. Also updates the doodle
- * title and short link.
- */
-doodles.updateShareDialog = function() {
- const shareDialog = $(doodles.IDS.DOODLE_SHARE_DIALOG);
- const shareDialogTitle = $(doodles.IDS.DOODLE_SHARE_DIALOG_TITLE);
- const closeButton = $(doodles.IDS.DOODLE_SHARE_DIALOG_CLOSE_BUTTON);
- const facebookButton = $(doodles.IDS.DOODLE_SHARE_DIALOG_FACEBOOK_BUTTON);
- const twitterButton = $(doodles.IDS.DOODLE_SHARE_DIALOG_TWITTER_BUTTON);
- const mailButton = $(doodles.IDS.DOODLE_SHARE_DIALOG_MAIL_BUTTON);
- const copyButton = $(doodles.IDS.DOODLE_SHARE_DIALOG_COPY_LINK_BUTTON);
- const linkText = $(doodles.IDS.DOODLE_SHARE_DIALOG_LINK);
-
- if (!doodles.targetDoodle.metadata ||
- !doodles.targetDoodle.metadata.shortLink ||
- !doodles.targetDoodle.metadata.altText) {
- return;
- }
-
- const closeDialog = function() {
- shareDialog.close();
- };
-
- closeButton.onclick = closeDialog;
- closeButton.title = configData.translatedStrings.shareClose;
- shareDialog.onclick = function(e) {
- if (e.target == shareDialog) {
- closeDialog();
- }
- };
-
- const title = doodles.targetDoodle.metadata.altText;
-
- shareDialogTitle.innerHTML = title;
- const shortLink = doodles.targetDoodle.metadata.shortLink;
-
- facebookButton.onclick = function() {
- const url = 'https://www.facebook.com/dialog/share' +
- '?app_id=' + doodles.FACEBOOK_APP_ID +
- '&href=' + encodeURIComponent(shortLink) +
- '&hashtag=' + encodeURIComponent('#GoogleDoodle');
- window.open(url);
- doodles.logDoodleShare(doodles.SHARE_TYPE.FACEBOOK);
- };
- facebookButton.title = configData.translatedStrings.shareFacebook;
-
- twitterButton.onclick = function() {
- const url = 'https://twitter.com/intent/tweet' +
- '?text=' + encodeURIComponent(title + '\n' + shortLink);
- window.open(url);
- doodles.logDoodleShare(doodles.SHARE_TYPE.TWITTER);
- };
- twitterButton.title = configData.translatedStrings.shareTwitter;
-
- mailButton.onclick = function() {
- const url = 'mailto:?subject=' + encodeURIComponent(title) +
- '&body=' + encodeURIComponent(shortLink);
- document.location.href = url;
- doodles.logDoodleShare(doodles.SHARE_TYPE.EMAIL);
- };
- mailButton.title = configData.translatedStrings.shareMail;
-
- linkText.value = shortLink;
- linkText.onclick = function() {
- linkText.select();
- };
- linkText.setAttribute('readonly', true);
- linkText.title = configData.translatedStrings.shareLink;
- copyButton.onclick = function() {
- linkText.select();
- document.execCommand('copy');
- doodles.logDoodleShare(doodles.SHARE_TYPE.LINK_COPY);
- };
- copyButton.title = configData.translatedStrings.copyLink;
-};
diff --git a/chromium/chrome/browser/resources/local_ntp/externs.js b/chromium/chrome/browser/resources/local_ntp/externs.js
index c9a2e099c8d..1ca0dc928e9 100644
--- a/chromium/chrome/browser/resources/local_ntp/externs.js
+++ b/chromium/chrome/browser/resources/local_ntp/externs.js
@@ -8,146 +8,10 @@
/**
* @fileoverview Externs for objects sent from C++ to
- * chrome-search://local-ntp/local-ntp.html.
+ * chrome-search://most-visited/title.html.
* @externs
*/
-/**
- * The type of the most visited data object. The definition is based on
- * chrome/common/search/instant_types.h:
- * InstantMostVisitedItem
- * @typedef {{dataGenerationTime: Date,
- * isAddButton: boolean,
- * rid: number,
- * tileSource: number,
- * tileTitleSource: number,
- * title: ?,
- * url: string}}
- */
-let MostVisitedData;
-
-/**
- * The type of the config data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * LocalNtpSource::SearchConfigurationProvider::UpdateConfigData()
- * @typedef {{chromeColors: boolean,
- * googleBaseUrl: string,
- * isAccessibleBrowser: boolean,
- * isGooglePage: boolean,
- * realboxEnabled: boolean,
- * realboxMatchOmniboxTheme: boolean,
- * richerPicker: boolean,
- * translatedStrings: Object<string>}}
- */
-let configData;
-
-/**
- * The type of the image collections object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * ConvertCollectionInfoToDict()
- * @typedef {{collectionId: string,
- * collectionName: string,
- * previewImageUrl: string}}
- */
-let coll;
-
-/**
- * The type of the individual image data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * ConvertCollectionImageToDict()
- * @typedef {{thumbnailImageUrl: string,
- * imageUrl: string,
- * collectionId: string,
- * attributions: Array<string>,
- * attributionActionUrl: string}}
- */
-let collImg;
-
-/**
- * The type of the errors when fetching individual images object. The
- * definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * GetErrorDict()
- * @typedef {{net_error: boolean,
- * service_error: boolean,
- * net_error_no: number}}
- */
-let collImgErrors;
-
-/**
- * The type of the errors when fetching collection object. The definition is
- * based on
- * chrome/browser/search/local_ntp_source.cc:
- * GetErrorDict()
- * @typedef {{net_error: boolean,
- * service_error: boolean,
- * net_error_no: number}}
- */
-let collErrors;
-
-/**
- * The type of the Doodle data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * LocalNtpSource::DesktopLogoObserver::OnLogoAvailable()
- * @typedef {{usable: boolean,
- * image: string,
- * metadata: string}}
- */
-let ddl;
-
-/**
- * The type of the OneGoogleBar data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * ConvertOGBDataToDict()
- * @typedef {{barHtml: string,
- * inHeadScript: string,
- * inHeadStyle: string,
- * afterBarScript: string,
- * endOfBodyHtml: string,
- * endOfBodyScript: string}}
- */
-let og;
-
-/**
- * The type of the middle-slot promo data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * ConvertPromoDataToDict()
- * @typedef {{promoHtml: (string|undefined),
- * promoLogUrl: (string|undefined),
- * promoId: (string|undefined),
- * canOpenExtensionsPage: boolean}}
- */
-let promo;
-
-/**
- * The type of the search suggestions data object. The definition is based on
- * chrome/browser/search/local_ntp_source.cc:
- * ConvertSearchSuggestDataToDict()
- * @typedef {{suggestionsHtml: string,
- * suggestionsEndOfBodyScript: string}}
- */
-let searchSuggestions;
-
-/**
- * Types created by the OneGoogleBar scripts when injected into the page.
- * Defined in google3/javascript/externs/api/one_google/gbar.js
- */
-window.gbar;
-window.gbar.a;
-window.gbar.a.pc;
-
-/**
- * Used for running NTP javascript unit tests. Defined in
- * src/chrome/test/data/local_ntp/local_ntp_browsertest.html
- */
-window.localNTPUnitTest;
-
-/**
- * Used for running Most Visited iframe javascript unit tests. Defined in
- * src/chrome/test/data/local_ntp/most_visited_browsertest.html
- */
-window.mostVisitedUnitTest;
-
/**************************** Embedded Search API ****************************/
/**
@@ -161,174 +25,11 @@ window.chrome.embeddedSearch;
window.chrome.embeddedSearch.newTabPage;
/**
- * @param {Array} color
- */
-window.chrome.embeddedSearch.newTabPage.applyAutogeneratedTheme;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.applyDefaultTheme;
-
-/**
- * @return {boolean} areShortcutsVisible
- */
-window.chrome.embeddedSearch.newTabPage.areShortcutsVisible;
-
-/**
- * @param {number} task_version
- * @param {number} task_id
- */
-window.chrome.embeddedSearch.newTabPage.blacklistSearchSuggestion;
-
-/**
- * @param {number} task_version
- * @param {number} task_id
- * @param {string} hash
- */
-window.chrome.embeddedSearch.newTabPage.blacklistSearchSuggestionWithHash;
-
-/**
- * @param {number} task_version
- * @param {number} task_id
- */
-window.chrome.embeddedSearch.newTabPage.blocklistSearchSuggestion;
-
-/**
- * @param {number} task_version
- * @param {number} task_id
- * @param {string} hash
- */
-window.chrome.embeddedSearch.newTabPage.blocklistSearchSuggestionWithHash;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.confirmThemeChanges;
-
-/**
- * @param {number} rid
- */
-window.chrome.embeddedSearch.newTabPage.deleteMostVisitedItem;
-
-/**
- * @param {string} url
- */
-window.chrome.embeddedSearch.newTabPage.fixupAndValidateUrl;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.getColorsInfo;
-
-/**
* @param {number} rid
*/
window.chrome.embeddedSearch.newTabPage.getMostVisitedItemData;
/**
- * @return {boolean} isCustomLinks
- */
-window.chrome.embeddedSearch.newTabPage.isCustomLinks;
-
-/**
- * @return {boolean} isInputInProgress
- */
-window.chrome.embeddedSearch.newTabPage.isInputInProgress;
-
-/**
- * @return {boolean} isUsingMostVisited
- */
-window.chrome.embeddedSearch.newTabPage.isUsingMostVisited;
-
-/**
- * @param {number} event
- */
-window.chrome.embeddedSearch.newTabPage.logEvent;
-
-/**
- * @param {number} position
- * @param {number} tile_title_source
- * @param {number} tile_source
- * @param {number} tile_type
- * @param {number} data_generation_time
- */
-window.chrome.embeddedSearch.newTabPage.logMostVisitedImpression;
-
-/**
- * @param {number} position
- * @param {number} tile_title_source
- * @param {number} tile_source
- * @param {number} tile_type
- * @param {number} data_generation_time
- */
-window.chrome.embeddedSearch.newTabPage.logMostVisitedNavigation;
-
-
-/**
- * @param {number} event_type
- * @param {number} data
- */
-window.chrome.embeddedSearch.newTabPage.logSuggestionEventWithValue;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.mostVisited;
-
-/**
- * @return {boolean} mostVisitedAvailable
- */
-window.chrome.embeddedSearch.newTabPage.mostVisitedAvailable;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.optOutOfSearchSuggestions;
-
-/**
- * @param {number} rid
- * @param {number} new_pos
- */
-window.chrome.embeddedSearch.newTabPage.reorderCustomLink;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.resetCustomLinks;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.revertThemeChanges;
-
-/**
- * @param {number} task_version
- * @param {number} task_id
- * @param {string} hash
- */
-window.chrome.embeddedSearch.newTabPage.searchSuggestionSelected;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.selectLocalBackgroundImage;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.resetBackgroundInfo;
-
-/**
- * @param {string} background_url
- * @param {string} attribution_line_1
- * @param {string} attribution_line_2
- * @param {string} attribution_action_url
- * @param {string} collection_id
- */
-window.chrome.embeddedSearch.newTabPage.setBackgroundInfo;
-
-/**
* @typedef {{
* alternateLogo: boolean,
* attribution1: (string|undefined),
@@ -380,212 +81,7 @@ let NtpTheme;
/** @type {?NtpTheme} */
window.chrome.embeddedSearch.newTabPage.ntpTheme;
-/** @type {?NtpTheme} */
-window.chrome.embeddedSearch.newTabPage.themeBackgroundInfo;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.toggleMostVisitedOrCustomLinks;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.toggleShortcutsVisibility;
-
/**
* No params.
*/
window.chrome.embeddedSearch.newTabPage.useDefaultTheme;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.undoAllMostVisitedDeletions;
-
-/**
- * No params.
- */
-window.chrome.embeddedSearch.newTabPage.undoCustomLinkAction;
-
-/**
- * @param {number} rid_value
- */
-window.chrome.embeddedSearch.newTabPage.undoMostVisitedDeletion;
-
-/**
- * @param {number} rid
- * @param {string} url
- */
-window.chrome.embeddedSearch.newTabPage.updateCustomLink;
-
-/** @param {string} promoId */
-window.chrome.embeddedSearch.newTabPage.blocklistPromo;
-
-/**
- * @param {number} button
- * @param {boolean} altKey
- * @param {boolean} ctrlKey
- * @param {boolean} metaKey
- * @param {boolean} shiftKey
- */
-window.chrome.embeddedSearch.newTabPage.openExtensionsPage;
-
-/**
- * Embedded Search API methods defined in
- * chrome/renderer/searchbox/searchbox_extension.cc:
- * SearchBoxBindings::GetObjectTemplateBuilder()
- */
-window.chrome.embeddedSearch.searchBox;
-/** @param {number} line */
-window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch;
-/** @param {number} suggestionGroupId */
-window.chrome.embeddedSearch.searchBox.toggleSuggestionGroupIdVisibility;
-window.chrome.embeddedSearch.searchBox.isKeyCaptureEnabled;
-/** @param {number} latencyMs */
-window.chrome.embeddedSearch.searchBox.logCharTypedToRepaintLatency;
-window.chrome.embeddedSearch.searchBox.paste;
-window.chrome.embeddedSearch.searchBox.rtl;
-window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes;
-window.chrome.embeddedSearch.searchBox.stopCapturingKeyStrokes;
-/**
- * @param {string} input
- * @param {boolean} preventInlineAutocomplete
- */
-window.chrome.embeddedSearch.searchBox.queryAutocomplete;
-/** @param {boolean} clearResult */
-window.chrome.embeddedSearch.searchBox.stopAutocomplete;
-
-/** @typedef {{offset: number, style: number}} */
-let ACMatchClassification;
-
-/**
- * @typedef {{
- * allowedToBeDefaultMatch: boolean,
- * contents: string,
- * contentsClass: !Array<!ACMatchClassification>,
- * description: string,
- * descriptionClass: !Array<!ACMatchClassification>,
- * destinationUrl: string,
- * fillIntoEdit: string,
- * suggestionGroupId: number,
- * iconUrl: string,
- * imageDominantColor: string,
- * imageUrl: string,
- * inlineAutocompletion: string,
- * isSearchType: boolean,
- * supportsDeletion: boolean,
- * swapContentsAndDescription: boolean,
- * type: string,
- * }}
- */
-let AutocompleteMatch;
-
-/**
- * @typedef {{
- * header: string,
- * hidden: boolean,
- * }}
- */
-let SuggestionGroup;
-
-/**
- * @typedef {{
- * input: string,
- * suggestionGroupsMap: !Object<!SuggestionGroup>,
- * matches: !Array<!AutocompleteMatch>,
- * }}
- */
-let AutocompleteResult;
-
-/** @type {function(!AutocompleteResult):void} */
-window.chrome.embeddedSearch.searchBox.autocompleteresultchanged;
-
-/** @type {function(number, string, string):void} */
-window.chrome.embeddedSearch.searchBox.autocompletematchimageavailable;
-
-/**
- * @param {number} line
- * @param {string} url
- * @param {boolean} areMatchesShowing
- * @param {number} timeElapsedSinceLastFocus
- * @param {number} button
- * @param {boolean} altKey
- * @param {boolean} ctrlKey
- * @param {boolean} metaKey
- * @param {boolean} shiftKey
- */
-window.chrome.embeddedSearch.searchBox.openAutocompleteMatch;
-
-/**************************** Translated Strings *****************************/
-
-/**
- * Translated strings defined in
- * chrome/browser/search/local_ntp_source.cc:
- * GetTranslatedStrings()
- */
-configData.translatedStrings.addLinkTitle;
-configData.translatedStrings.addLinkTooltip;
-configData.translatedStrings.attributionIntro;
-configData.translatedStrings.audioError;
-configData.translatedStrings.backLabel;
-configData.translatedStrings.backgroundsUnavailable;
-configData.translatedStrings.clickToViewDoodle;
-configData.translatedStrings.connectionError;
-configData.translatedStrings.connectionErrorNoPeriod;
-configData.translatedStrings.copyLink;
-configData.translatedStrings.customizeThisPage;
-configData.translatedStrings.defaultWallpapers;
-configData.translatedStrings.details;
-configData.translatedStrings.dismissPromo;
-configData.translatedStrings.editLinkTitle;
-configData.translatedStrings.editLinkTooltip;
-configData.translatedStrings.fakeboxMicrophoneTooltip;
-configData.translatedStrings.invalidUrl;
-configData.translatedStrings.languageError;
-configData.translatedStrings.learnMore;
-configData.translatedStrings.linkAddedMsg;
-configData.translatedStrings.linkCancel;
-configData.translatedStrings.linkCantCreate;
-configData.translatedStrings.linkCantEdit;
-configData.translatedStrings.linkCantRemove;
-configData.translatedStrings.linkDone;
-configData.translatedStrings.linkEditedMsg;
-configData.translatedStrings.linkRemove;
-configData.translatedStrings.linkRemovedMsg;
-configData.translatedStrings.listening;
-configData.translatedStrings.moreInfo;
-configData.translatedStrings.mostVisitedTitle;
-configData.translatedStrings.nameField;
-configData.translatedStrings.networkError;
-configData.translatedStrings.noTranslation;
-configData.translatedStrings.noVoice;
-configData.translatedStrings.otherError;
-configData.translatedStrings.permissionError;
-configData.translatedStrings.ready;
-configData.translatedStrings.realboxSeparator;
-configData.translatedStrings.removeSuggestion;
-configData.translatedStrings.removeThumbnailTooltip;
-configData.translatedStrings.restoreDefaultBackground;
-configData.translatedStrings.restoreDefaultLinks;
-configData.translatedStrings.restoreThumbnailsShort;
-configData.translatedStrings.searchboxPlaceholder;
-configData.translatedStrings.selectChromeWallpaper;
-configData.translatedStrings.selectedLabel;
-configData.translatedStrings.selectionCancel;
-configData.translatedStrings.selectionDone;
-configData.translatedStrings.shareClose;
-configData.translatedStrings.shareDoodle;
-configData.translatedStrings.shareFacebook;
-configData.translatedStrings.shareLink;
-configData.translatedStrings.shareMail;
-configData.translatedStrings.shareTwitter;
-configData.translatedStrings.thumbnailRemovedNotification;
-configData.translatedStrings.title;
-configData.translatedStrings.tryAgain;
-configData.translatedStrings.undoThumbnailRemove;
-configData.translatedStrings.uploadImage;
-configData.translatedStrings.urlField;
-configData.translatedStrings.voiceCloseTooltip;
-configData.translatedStrings.voiceSearchClosed;
-configData.translatedStrings.waiting;
diff --git a/chromium/chrome/browser/resources/local_ntp/icons.grdp b/chromium/chrome/browser/resources/local_ntp/icons.grdp
index 9ccd9b83c40..cc1babdab42 100644
--- a/chromium/chrome/browser/resources/local_ntp/icons.grdp
+++ b/chromium/chrome/browser/resources/local_ntp/icons.grdp
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<grit-part>
- <include name="IDR_LOCAL_NTP_ICONS_BOOKMARK"
- file="resources/local_ntp/icons/bookmark.svg" type="BINDATA" />
<include name="IDR_LOCAL_NTP_ICONS_CALCULATOR"
file="resources/local_ntp/icons/calculator.svg" type="BINDATA" />
<include name="IDR_LOCAL_NTP_ICONS_CLOCK"
diff --git a/chromium/chrome/browser/resources/local_ntp/icons/bookmark.svg b/chromium/chrome/browser/resources/local_ntp/icons/bookmark.svg
deleted file mode 100644
index 87ecd1b0776..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/icons/bookmark.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="a" d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.586-.813L16 2.667l-3.747 8.84-9.586.813 7.28 6.307L7.76 28z"/></defs><use xlink:href="#a"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/local_ntp/icons/dont_show.png b/chromium/chrome/browser/resources/local_ntp/icons/dont_show.png
deleted file mode 100644
index bcf13913d64..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/icons/dont_show.png
+++ /dev/null
Binary files differ
diff --git a/chromium/chrome/browser/resources/local_ntp/icons/dont_show_2x.png b/chromium/chrome/browser/resources/local_ntp/icons/dont_show_2x.png
deleted file mode 100644
index 815d7e7a84a..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/icons/dont_show_2x.png
+++ /dev/null
Binary files differ
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.css b/chromium/chrome/browser/resources/local_ntp/local_ntp.css
deleted file mode 100644
index d972497fb8d..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.css
+++ /dev/null
@@ -1,2175 +0,0 @@
-/* Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-html {
- /* Material Design constants */
- --md-tile-margin: 16px;
- --md-tile-size: 112px;
-
- /* This will be overridden based on the viewport width, see below. */
- --column-count: 3;
-
- --content-width: calc(var(--column-count) * var(--md-tile-size)
- /* We add an extra pixel because rounding errors on different zooms can
- * make the width shorter than it should be. */
- + 1px);
-
- --logo-color: #eee; /* Background color for alternative logo. */
- --logo-height: 200px; /* Normal height of a doodle. */
- --logo-margin-top: 56px; /* Expected OGB height, so logo doesn't overlap. */
- --logo-margin-bottom: 38px; /* Between logo and fakebox. */
-
- /* Initial height determines the margin between the logo and the fakebox. If
- * the iframe height exceeds the normal --logo-height, the difference is
- * subtracted from the margin. The actual --logo-iframe-{width,height} can be
- * changed later, but the initial height, and therefore the margin, remains
- * the same.
- */
- --logo-iframe-initial-height: var(--logo-height);
- --logo-iframe-height: var(--logo-height);
- --logo-iframe-resize-duration: 150ms;
- --logo-iframe-width: 500px;
-
- --mv-notice-time: 10s;
-
- /* These can be overridden by themes. */
- --text-color: #000;
- --text-color-light: #fff;
-
- height: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) {
- /* These can be overridden by themes. */
- --text-color: rgb(var(--GG200-rgb));
- --text-color-light: rgb(var(--GG200-rgb));
- }
-}
-
-/* width >= (4 cols * 112px (tile width) + 112px (1 tile margin)) */
-@media (min-width: 560px) {
- html {
- --column-count: 4;
- }
-}
-
-/* width >= (5 cols * 112px (tile width) + 112px (1 tile margin)) */
-@media (min-width: 672px) {
- html {
- --column-count: 5;
- }
-}
-
-body {
- background-attachment: fixed !important;
- cursor: default;
- display: none;
- font-size: small;
- margin: 0;
- min-height: 100%;
-}
-
-html.inited body {
- display: block;
-}
-
-/* Button defaults vary by platform. Reset CSS so that the NTP can use buttons
- * as a kind of clickable div. */
-button {
- background: transparent;
- border: 0;
- margin: 0;
- padding: 0;
-}
-
-#ntp-contents {
- display: flex;
- flex-direction: column;
- height: 100%;
- position: relative;
- z-index: 1;
-}
-
-#logo,
-#fakebox-container,
-#realbox-container {
- --searchbox-height: 44px;
- flex-shrink: 0;
-}
-
-.non-google-page #ntp-contents {
- /* The inherited height from #ntp-contents applies from the "top" location,
- * but uses the size of the overall NTP content area, resulting in an
- * unnecessary scrollbar. This height corresponds to MV tile height for a
- * single row, but also works for a row of icons, and works well on small
- * screens (like Pixelbook), as well as high-res screens. */
- height: 155px;
- left: calc(50% - var(--content-width)/2);
- position: absolute;
- top: calc(50% - 155px);
-}
-
-body.hide-fakebox #fakebox {
- opacity: 0;
- visibility: hidden;
-}
-
-#fakebox-container,
-#realbox-container {
- margin: 0 auto 0 auto;
- /* Increase min-width again to account for the search icon: 390px new
- * min-width + additional 20px */
- min-width: 410px;
- width: var(--content-width);
-}
-
-#realbox-input-wrapper {
- position: relative;
- z-index: 0;
-}
-
-#fakebox,
-#realbox {
- border-radius: 22px;
- box-sizing: border-box;
- font-size: 16px;
- height: var(--searchbox-height);
- opacity: 1;
- position: relative;
- transition: none;
-}
-
-#fakebox,
-#realbox-input-wrapper:not(.show-matches) #realbox,
-#realbox-input-wrapper.show-matches #realbox-matches {
- box-shadow: 0 1px 6px 0 rgba(32, 33, 36, .28);
-}
-
-#fakebox,
-#realbox-input-wrapper {
- margin: 0 auto;
- max-width: 584px;
-}
-
-#fakebox {
- background: white;
- cursor: text;
-}
-
-#realbox {
- background-color: var(--search-box-bg, white);
- border: none;
- color: var(--search-box-text);
- display: block;
- outline: none;
- padding-inline-end: 48px;
- width: 100%;
- z-index: 2;
-}
-
-#realbox::-webkit-search-decoration,
-#realbox::-webkit-search-cancel-button,
-#realbox::-webkit-search-results-button,
-#realbox::-webkit-search-results-decoration {
- display: none;
-}
-
-#realbox::placeholder {
- color: var(--search-box-placeholder, rgb(117, 117, 117));
-}
-
-#realbox:focus::placeholder {
- color: transparent;
-}
-
-#realbox:focus,
-.show-matches #realbox {
- background-color: var(--search-box-results-bg, white);
-}
-
-@media (prefers-color-scheme: dark) {
- #fakebox,
- #realbox-input-wrapper:not(.show-matches) #realbox,
- #realbox-input-wrapper.show-matches #realbox-matches {
- box-shadow: 0 1px 6px 0 rgba(32, 33, 36, .78);
- }
-}
-
-.non-google-page :-webkit-any(#fakebox-container, #realbox-container) {
- display: none;
-}
-
-/* The realbox has a "loupe" or "search" icon by default. When a match with a
- * different icon ("clock" for historical searches or "page" for URLs) or a
- * favicon is selected, the realbox also gets that icon/favicon. For both the
- * realbox as well as the dropdown, icons are rendered via webkit-mask-image and
- * background-color and favicons are rendered via background-
- image set on the
- * element's style property in JS. */
-#realbox-icon,
-.match-icon {
- -webkit-mask-position: center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 16px;
- background-color: var(--search-box-icon, rgb(117, 117, 117));
- background-position: center center;
- background-repeat: no-repeat;
- background-size: 16px;
- bottom: 0;
- left: 16px;
- margin: auto;
- position: absolute;
- top: 0;
- width: 24px;
-}
-
-[dir=rtl] #realbox-icon,
-[dir=rtl] .match-icon {
- left: auto;
- right: 16px;
-}
-
-#realbox-icon[data-icon='google_g.png'] {
- background-size: 12px;
-}
-
-#realbox-icon[data-icon='search.svg'] {
- -webkit-mask-size: 20px; /* Loupe in realbox is bigger than in matches. */
-}
-
-#realbox-matches {
- background-color: var(--search-box-results-bg, white);
- border-radius: 16px;
- color: var(--search-box-results-text);
- display: none;
- left: 0;
- overflow: hidden;
- padding-bottom: 8px;
- padding-top: var(--searchbox-height);
- position: absolute;
- right: 0;
- top: 0;
- z-index: 1;
-}
-
-#realbox-input-wrapper.show-matches #realbox-matches {
- display: flex;
- flex-direction: column;
-}
-
-#realbox-matches :-webkit-any(a, span) {
- color: inherit;
- font-family: inherit;
-}
-
-#realbox-matches a {
- display: block;
- font-size: 16px;
- line-height: 1;
- outline: none;
- overflow: hidden;
- padding-bottom: 8px;
- padding-inline-end: 16px;
- padding-inline-start: 52px;
- padding-top: 8px;
- position: relative;
- text-decoration: none;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-#realbox-matches .header {
- color: rgb(var(--GG700-rgb));
- font-size: 13px;
- font-weight: 500;
- line-height: 16px;
- margin-top: 8px;
- padding-inline-start: 12px;
- text-transform: uppercase;
-}
-
-#realbox-matches .header .remove-icon {
- -webkit-mask-image: url(chevron.svg);
- -webkit-transform: rotate(180deg);
- background-color: var(--search-box-icon, rgb(var(--GG900-rgb)));
-}
-
-#realbox-matches .collapsed .header .remove-icon {
- -webkit-transform: none;
-}
-
-#realbox-matches .collapsed a:not(.header) {
- display: none;
-}
-
-[dir=rtl] #realbox-matches a {
- background-position-x: calc(100% - 16px);
-}
-
-#realbox-matches a.has-image {
- display: flex;
- flex-direction: column;
- padding-bottom: 6px;
- padding-top: 6px;
-}
-
-#realbox-matches a.has-image > span {
- position: relative;
-}
-
-#realbox-matches a.has-image > span:first-of-type {
- top: -1px; /* aligns the top of the text with the top of the image */
-}
-
-#realbox-matches a.has-image > span:last-of-type {
- bottom: -1px; /* aligns the bottom of the text with the bottom of the image */
-}
-
-#realbox-matches a.has-image .description {
- font-size: 14px;
- margin-top: 2px;
-}
-
-#realbox-matches a.has-image .remove-match {
- top: 10px;
-}
-
-#realbox-matches.removable a {
- padding-inline-end: 48px;
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected) .match-icon {
- background-color: var(--search-box-icon-selected, rgb(117, 117, 117));
-}
-
-.image-container {
- align-items: center;
- border-radius: 8px;
- bottom: 0;
- display: flex;
- height: 32px;
- justify-content: center;
- left: 12px;
- margin: auto;
- position: absolute;
- top: 0;
- width: 32px;
-}
-
-html[dir=rtl] .image-container {
- left: auto;
- right: 12px;
-}
-
-.match-image {
- border-radius: 8px;
- max-height: 32px;
- max-width: 32px;
-}
-
-#realbox-matches a:hover {
- background-color: var(--search-box-results-bg-hovered, rgb(232, 232, 233));
-}
-
-#realbox-matches a:not(.header):-webkit-any(:focus-within, .selected),
-#realbox-matches a.header:focus-within:not(:focus) {
- background-color: var(--search-box-results-bg-selected, rgb(219, 219, 220));
- color: var(--search-box-results-text-selected, rgb(var(--GG900-rgb)));
-}
-
-#realbox-matches .match {
- font-weight: bold;
-}
-
-#realbox-matches .dim {
- color: var(--search-box-results-dim, rgb(var(--GG600-rgb)));
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected) .dim {
- color: var(--search-box-results-dim-selected, rgb(var(--GG600-rgb)));
-}
-
-#realbox-matches .url {
- color: var(--search-box-results-url, rgb(var(--GB600-rgb)));
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected) .url {
- color: var(--search-box-results-url-selected, rgb(var(--GB600-rgb)));
-}
-
-#realbox-matches .remove-match {
- border-radius: 50%;
- height: 24px;
- outline: none;
- position: absolute;
- right: 16px;
- top: 4px;
- width: 24px;
-}
-
-[dir=rtl] #realbox-matches .remove-match {
- left: 16px;
- right: auto;
-}
-
-#realbox-matches .remove-match:hover {
- background-color: var(--remove-match-hovered, rgba(var(--GG900-rgb), .16));
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected) .remove-match:hover {
- background-color:
- var(--remove-match-selected-hovered, rgba(var(--GG900-rgb), .16));
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected)
- .remove-match:focus-within {
- background-color: var(--remove-match-focused, rgba(var(--GG900-rgb), .32));
-}
-
-#realbox-matches .remove-icon {
- height: 100%;
- width: 100%;
-}
-
-#realbox-matches .remove-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_clear.svg);
- -webkit-mask-position: center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 16px;
-}
-
-#realbox-matches a:-webkit-any(:hover) .remove-icon {
- background-color: var(--search-box-icon, rgb(var(--GG900-rgb)));
-}
-
-#realbox-matches a:-webkit-any(:focus-within, .selected) .remove-icon {
- background-color: var(--search-box-icon-selected, rgb(var(--GG900-rgb)));
-}
-
-#fakebox > input {
- bottom: 0;
- box-sizing: border-box;
- left: 0;
- margin: 0;
- opacity: 0;
- padding-inline-start: 20px;
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-html[dir=rtl] #fakebox > input {
- right: 0;
-}
-
-#fakebox .search-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_search.svg);
- -webkit-mask-position: center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 20px;
- background-color: rgb(117, 117, 117);
- bottom: 0;
- left: 16px;
- margin: auto;
- position: absolute;
- top: 0;
- width: 24px;
-}
-
-html[dir=rtl] #fakebox .search-icon {
- left: auto;
- right: 16px;
-}
-
-#fakebox-text {
- bottom: 0;
- color: rgb(117, 117, 117);
- font-size: 16px;
- height: 44px;
- left: 0;
- line-height: 44px;
- margin: auto 0;
- overflow: hidden;
- position: absolute;
- right: 44px;
- text-align: initial;
- text-overflow: ellipsis;
- top: 0;
- user-select: none;
- vertical-align: middle;
- visibility: inherit;
- white-space: nowrap;
-}
-
-html[dir=rtl] #fakebox-text {
- left: 44px;
- right: 0;
-}
-
-#fakebox-text,
-#realbox {
- padding-inline-start: 52px;
-}
-
-#fakebox-cursor {
- background: #333;
- /* Total 16px height: (46px fakebox height - 2px border) - 14px top - 14px
- * bottom */
- bottom: 14px;
- left: 48px;
- position: absolute;
- top: 14px;
- visibility: hidden;
- width: 1px;
-}
-
-html[dir=rtl] #fakebox-cursor {
- left: auto;
- right: 48px;
-}
-
-.microphone-icon {
- background: url(icons/googlemic_clr_24px.svg) no-repeat center;
- background-size: 21px 21px;
- bottom: 0;
- cursor: pointer;
- margin-inline-end: 16px;
- padding: 22px 12px 0;
- position: absolute;
- right: 0;
- top: 0;
- width: 21px;
-}
-
-html[dir=rtl] .microphone-icon {
- left: 0;
- right: auto;
-}
-
-#realbox-input-wrapper > :-webkit-any(#realbox-icon, .microphone-icon) {
- z-index: 3;
-}
-
-@keyframes blink {
- 0% {
- opacity: 1;
- }
- 61.55% {
- opacity: 0;
- }
-}
-
-body.fakebox-drag-focused #fakebox-text,
-body.fakebox-focused #fakebox-text {
- visibility: hidden;
-}
-
-body.fakebox-drag-focused #fakebox-cursor {
- visibility: inherit;
-}
-
-body.fakebox-focused #fakebox-cursor {
- animation: blink 1.3s step-end infinite;
- visibility: inherit;
-}
-
-#most-visited {
- /* Total of 40px margin between fakebox and MV tiles: 8px fakebox
- * margin-bottom + 22px here margin-top + 10px MV margin-top */
- margin-top: 22px;
- text-align: -webkit-center;
- user-select: none;
-}
-
-/* Non-Google pages have no Fakebox, so don't need top margin. */
-.non-google-page #most-visited {
- margin-top: 0;
-}
-
-#mv-tiles {
- /* Two rows of tiles of 112px each, 16px of spacing after each row, and 10px
- * of padding on top. If you change this, also change the corresponding values
- * in most_visited_single.css. */
- height: calc(2*(var(--md-tile-size) + var(--md-tile-margin)) + 10px);
- margin: 0;
- position: relative;
- text-align: -webkit-auto;
- /* Add 2*6px to account for drop shadow on the tiles. If you change this, also
- * change the corresponding padding in most_visited_single.css. */
- width: calc(var(--content-width) + 12px);
-}
-
-#mv-notice-container {
- bottom: -50px;
- left: 0;
- margin-bottom: 16px;
- position: fixed;
- transition: bottom 400ms;
- width: 100%;
-}
-
-/* Required to allow click events through the wrapping div of the toast
- * notification container. */
-#mv-notice-container,
-#error-notice-container {
- pointer-events: none;
-}
-#mv-notice-container > div,
-#error-notice-container > div {
- pointer-events: all;
-}
-
-#mv-notice-container.float-up {
- bottom: 0;
-}
-
-#mv-notice-container.notice-hide {
- display: none;
-}
-
-/* The notification shown when a tile is blacklisted. */
-#mv-notice {
- background-color: white;
- border: 1px solid rgb(var(--GG300-rgb));
- /* Necessary for a "pill" shape. Using 50% creates an oval. */
- border-radius: 16px;
- box-sizing: border-box;
- font-size: 12px;
- height: fit-content;
- margin: 0 auto;
- /* Set min-height in order to prevent the border from disappearing at certain
- zooms. */
- min-height: 35px;
- opacity: 1;
- width: fit-content;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #mv-notice {
- background-color: rgb(var(--GG900-rgb));
- border-color: rgba(0, 0, 0, .1);
- }
-}
-
-#mv-notice span {
- color: rgb(var(--GG700-rgb));
- cursor: default;
- display: inline-block;
- height: auto;
- /* Use odd height in order to prevent rounding errors at certain zooms. */
- line-height: 33px;
- vertical-align: unset;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #mv-notice span {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-/* Links in the notification. */
-#mv-notice-links span {
- /* Necessary for a "pill" shape. Using 50% creates an oval. */
- border-radius: 16px;
- color: rgb(var(--GB600-rgb));
- cursor: pointer;
- margin-inline-start: 0;
- outline: none;
- padding: 0 16px;
- position: relative;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #mv-notice-links span {
- color: rgb(var(--GB400-dark-rgb));
- }
-}
-
-#mv-notice-links span:focus {
- text-decoration: underline;
-}
-
-#mv-notice-links span:hover,
-#mv-notice-links span:active {
- background-color: rgba(var(--GB600-rgb), .1);
- text-decoration: none;
- transition: background-color 200ms;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #mv-notice-links
- :-webkit-any(span:hover, span:active) {
- background-color: rgba(var(--GB400-dark-rgb), .1);
- }
-}
-
-#mv-msg {
- color: var(--text-color);
- padding: 0 16px;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #mv-msg {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#mv-notice.mv-notice-delayed-hide:not(:focus-within) {
- opacity: 0;
- transition-delay: var(--mv-notice-time);
- transition-property: opacity;
-}
-
-#mv-notice.notice-hide {
- display: none;
-}
-
-#attribution {
- bottom: 0;
- color: var(--text-color-light);
- cursor: default;
- display: inline-block;
- font-size: 13px;
- left: auto;
- position: fixed;
- right: 8px;
- text-align: start;
- user-select: none;
- z-index: -1;
-}
-
-html[dir=rtl] #attribution,
-#attribution.left-align-attribution {
- left: 8px;
- right: auto;
- text-align: end;
-}
-
-#mv-single {
- border: none;
- display: block;
- height: 100%;
- width: 100%;
-}
-
-.customize-dialog::backdrop {
- background-color: rgba(255, 255, 255, .75);
-}
-
-@media (prefers-color-scheme: dark) {
- .customize-dialog::backdrop {
- background-color: rgba(0, 0, 0, .4);
- }
-}
-
-#custom-links-edit-dialog {
- background: transparent;
- border: none;
- height: 100%;
- padding: 0;
- position: fixed;
- top: 0;
- width: 100%;
-}
-
-#custom-links-edit {
- border: none;
- height: 100%;
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-#one-google {
- display: none;
- position: absolute;
- top: 0;
- transition: opacity 130ms;
- /* One Google Bar can automatically align to left and right
- based on the profile language preference */
- width: 100%;
-}
-
-#error-notice-container {
- bottom: -50px;
- margin-bottom: 16px;
- position: fixed;
- transition: bottom 400ms;
- user-select: none;
- width: 100%;
-}
-
-#error-notice-container.float-up {
- bottom: 0;
-}
-
-#error-notice {
- background-color: white;
- border: 1px solid rgb(var(--GG300-rgb));
- /* Necessary for a "pill" shape. Using 50% creates an oval. */
- border-radius: 16px;
- color: rgb(var(--GR600-rgb));
- display: flex;
- font-size: 12px;
- font-weight: normal;
- height: fit-content;
- margin: 0 auto;
- opacity: 1;
- padding: 0;
- position: relative;
- width: fit-content;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #error-notice {
- background-color: rgb(var(--GG900-rgb));
- border-color: rgba(0, 0, 0, .1);
- color: rgb(var(--GR500-dark-rgb));
- }
-}
-
-#error-notice.notice-hide {
- display: none;
-}
-
-#error-notice span {
- align-self: center;
- display: inline-block;
- line-height: 32px;
-}
-
-#error-notice-icon {
- background: url(../../../../ui/webui/resources/images/error.svg) no-repeat center;
- background-size: 18px 18px;
- height: 32px;
- padding: 0 8px;
- width: 18px;
-}
-
-#error-notice-msg {
- cursor: default;
- padding-inline-end: 16px;
-}
-
-#error-notice.has-link #error-notice-msg {
- padding-inline-end: 0;
-}
-
-html[dir=rtl] #error-notice.has-link #error-notice-msg {
- padding: 0;
-}
-
-#error-notice-link {
- /* Necessary for a "pill" shape. Using 50% creates an oval. */
- border-radius: 16px;
- color: rgb(var(--GB600-rgb));
- cursor: pointer;
- display: none;
- outline: none;
- padding: 0 16px;
- position: relative;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #error-notice-link {
- color: rgb(var(--GB400-dark-rgb));
- }
-}
-
-#error-notice:not(.has-link) #error-notice-link {
- display: none;
-}
-
-#error-notice-link:hover,
-#error-notice-link:focus {
- text-decoration: underline;
-}
-
-#error-notice-link:hover,
-#error-notice-link:active {
- background-color: rgba(var(--GB600-rgb), .1);
- text-decoration: none;
- transition: background-color 200ms;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #error-notice-link:hover,
- body:not(.light-chip) #error-notice-link:active {
- background-color: rgba(var(--GB400-dark-rgb), .1);
- }
-}
-
-#promo {
- bottom: 16px;
- left: 0;
- pointer-events: none;
- position: fixed;
- right: 0;
- text-align: center;
- transition: bottom 400ms;
- visibility: hidden;
-}
-
-#promo.float-down {
- bottom: -50px;
-}
-
-#promo > div {
- --dismiss-background-rgb: var(--GG900-rgb);
- background-color: #FFF;
- border: 1px solid rgb(var(--GG300-rgb));
- border-radius: 16px;
- box-sizing: border-box;
- color: rgb(var(--GG700-rgb));
- display: inline-block;
- font-size: 12px;
- height: 32px;
- line-height: 30px; /* Height - 1px border-top - 1px border-bottom. */
- margin-bottom: 0;
- /* TODO(crbug.com/969062): this magic constant would be better implemented as
- * real multi-line promo text support or a better QA process to check that
- * promo messages aren't ellided. It's ultimately quite hard to make any pixel
- * value here useful as font face, sizes, and zoom can all vary. Pushing for
- * a more dynamic UI or better qualification process has been met with
- * significant resistance, so we keep arbitrarily changing this value. */
- max-width: 537px;
- overflow: hidden;
- padding: 0 16px;
- pointer-events: all;
- position: relative;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-#promo.dismissable > div {
- padding-inline-end: 36px; /* +24px for dismiss-icon - 4px less end padding */
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #promo > div {
- --dismiss-background-rgb: var(--GG100-rgb);
- background-color: rgb(var(--GG900-rgb));
- border-color: rgba(0, 0, 0, .1);
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#promo > div .dismiss-promo {
- border-radius: 50%;
- height: 24px;
- position: absolute;
- right: 4px;
- top: 3px; /* 4px from top - 1px of border. */
- width: 24px;
-}
-
-[dir=rtl] #promo > div .dismiss-promo {
- left: 4px;
- right: auto;
-}
-
-#promo > div .dismiss-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_clear.svg);
- -webkit-mask-position: center center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 16px;
- background-color: rgb(var(--dismiss-background-rgb));
- display: block;
- height: 100%;
- outline: none;
- width: 100%;
-}
-
-#promo > div .dismiss-promo:hover {
- background-color: rgba(var(--dismiss-background-rgb), .08);
-}
-
-#promo > div .dismiss-promo:focus-within {
- background-color: rgba(var(--dismiss-background-rgb), .16);
-}
-
-#promo > div > a {
- color: rgb(51, 103, 214) !important;
- text-decoration: none;
-}
-
-#promo > div > a:visited {
- color: rgb(51, 103, 214) !important;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #promo > div > :-webkit-any(a, a:visited) {
- color: rgb(var(--GB400-dark-rgb)) !important;
- }
-}
-
-#promo > div > img {
- border-radius: 50%;
- height: 24px;
- margin-bottom: 2px;
- margin-inline-end: 8px;
- margin-inline-start: -12px;
- object-fit: cover;
- vertical-align: middle;
- width: 24px;
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.light-chip) #promo > div > img {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-#one-google.show-element {
- display: block;
-}
-
-#promo.notice-hide {
- display: none;
-}
-
-#user-content {
- /* Reduce margin by new height of fakebox (46px) - old height (44px) = 2px */
- margin-top: -2px;
- z-index: -1;
-}
-
-#customization-menu {
- border: none;
- border-radius: 8px;
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
- color: rgb(var(--GG700-rgb));
- font-size: 0; /* Remove extra spacing between inline-block elements. */
- height: 528px;
- min-width: 800px;
- padding: 0;
- user-select: none;
-}
-
-@media (prefers-color-scheme: dark) {
- #customization-menu {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- box-shadow: var(--dark-mode-shadow);
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#customization-menu > div {
- font-size: 13px;
-}
-
-#menu-nav-panel {
- display: inline-block;
- height: 384px;
- left: 0;
- margin-top: 80px;
- vertical-align: top;
- width: 192px;
-}
-
-.menu-option {
- border-radius: 0 16px 16px 0;
- color: rgb(var(--GG700-rgb));
- cursor: pointer;
- font-size: 14px;
- height: 32px;
- left: 0;
- margin-bottom: 16px;
- outline: none;
- text-align: start;
- width: 192px;
-}
-
-@media (prefers-color-scheme: dark) {
- .menu-option {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-html[dir=rtl] .menu-option {
- border-radius: 16px 0 0 16px;
-}
-
-.menu-option:hover,
-.menu-option:focus {
- background-color: rgba(var(--GG900-rgb), .1);
-}
-
-@media (prefers-color-scheme: dark) {
- .menu-option:hover,
- .menu-option:focus {
- background-color: rgba(var(--GG500-rgb), .12);
- }
-}
-
-.menu-option:active,
-.menu-option.selected {
- background-color: rgb(232, 240, 254);
- color: rgb(var(--GB700-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .menu-option:active,
- .menu-option.selected {
- background-color: rgba(var(--GB200-rgb), .1);
- color: rgb(var(--GB300-rgb));
- }
-}
-
-.menu-option-icon-wrapper {
- display: inline-block;
- height: 32px;
- margin-inline-start: 24px;
- width: 20px;
-}
-
-.menu-option-icon {
- -webkit-mask-position-x: center;
- -webkit-mask-position-y: center;
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 20px;
- background-color: black;
- background-size: 20px 20px;
- height: 20px;
- margin-top: 6px;
- width: 20px;
-}
-
-@media (prefers-color-scheme: dark) {
- .menu-option-icon {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-.menu-option:active .menu-option-icon-wrapper .menu-option-icon,
-.menu-option.selected .menu-option-icon-wrapper .menu-option-icon {
- background-color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .menu-option:active .menu-option-icon-wrapper .menu-option-icon,
- .menu-option.selected .menu-option-icon-wrapper .menu-option-icon {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-#shortcuts-icon {
- -webkit-mask-image: url(icons/link.svg);
-}
-
-#backgrounds-icon {
- -webkit-mask-image: url(icons/backgrounds.svg);
-}
-
-#colors-icon {
- -webkit-mask-image: url(icons/colors.svg);
-}
-
-.menu-option-label {
- display: inline-block;
- height: 32px;
- line-height: 32px;
- margin-inline-start: 16px;
- max-width: 125px;
- overflow: hidden;
- text-overflow: ellipsis;
- user-select: none;
- white-space: nowrap;
-}
-
-#menu-header {
- display: flex;
- height: 80px;
- line-height: 80px;
- padding-inline-end: 24px;
-}
-
-#menu-title {
- font-size: 16px;
- user-select: none;
- width: fit-content;
-}
-
-#menu-footer {
- border-top: 1px solid rgb(var(--GG200-rgb));
- bottom: 0;
- box-sizing: border-box;
- color: rgb(var(--GG800-rgb));
- display: flex;
- height: 64px;
- justify-content: flex-end;
- left: 0;
- padding-inline-start: 0;
- position: absolute;
- text-align: end;
- user-select: none;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #menu-footer {
- border-color: rgba(255, 255, 255, .1);
- }
-}
-
-#menu-footer > button {
- height: 32px;
- line-height: 32px;
-}
-
-#menu-done {
- margin-inline-end: 16px;
-}
-
-#menu-cancel {
- margin-inline-end: 8px;
-}
-
-#menu-contents {
- display: inline-block;
- height: 464px;
- margin-inline-start: 40px;
- position: relative;
- width: 568px;
-}
-
-.menu-panel {
- height: 384px;
- left: 0;
- /* Pad the content by 5px top/left. This will prevent the focus outline on
- * tiles from being cut off by overflow-y. */
- margin-inline-start: -5px;
- margin-top: -5px;
- overflow-y: auto;
- padding-inline-start: 5px;
- padding-top: 5px;
- position: absolute;
- top: 80px;
- visibility: hidden;
- width: 100%;
-}
-
-.menu-panel.menu-shown {
- visibility: visible;
-}
-
-#backgrounds-menu .bg-sel-tile-bg,
-#backgrounds-image-menu .bg-sel-tile-bg {
- border-radius: 4px;
- height: 176px;
- margin-bottom: 45px;
- margin-inline-end: 8px;
- margin-inline-start: 0;
- margin-top: 0;
- width: 176px;
-}
-
-/* Remove left/right spacing from the last tile in each row. */
-#backgrounds-menu .bg-sel-tile-bg:nth-of-type(3n),
-#backgrounds-image-menu .bg-sel-tile-bg:nth-of-type(3n) {
- margin-inline-end: 0;
-}
-
-#backgrounds-image-menu .bg-sel-tile-bg {
- margin-bottom: 8px;
-}
-
-#backgrounds-menu .bg-sel-tile-bg.selected .bg-sel-tile,
-#backgrounds-image-menu .bg-sel-tile-bg.selected .bg-sel-tile {
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
- height: 144px;
- margin: 16px 16px 0 16px;
- width: 144px;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-menu .bg-sel-tile-bg.selected .bg-sel-tile,
- #backgrounds-image-menu .bg-sel-tile-bg.selected .bg-sel-tile {
- box-shadow: var(--dark-mode-shadow);
- }
-}
-
-#customization-menu.using-mouse-nav,
-.using-mouse-nav .bg-sel-tile:focus {
- outline: none;
-}
-
-#backgrounds-menu .bg-sel-tile,
-#backgrounds-image-menu .bg-sel-tile {
- background-position: center;
- border-radius: 4px;
- cursor: pointer;
-}
-
-#customization-menu .bg-sel-tile-title {
- background-color: unset;
- color: rgb(var(--GG700-rgb));
- font-size: 13px;
- margin-bottom: -34px;
- min-height: 30px;
- padding: 0;
-}
-
-@media (prefers-color-scheme: dark) {
- #customization-menu .bg-sel-tile-title {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-#backgrounds-disabled-wrapper {
- left: 50%;
- margin: 0;
- position: absolute;
- top: 50%;
- transform: translate(-50%, -50%);
- width: 50%;
-}
-
-#backgrounds-disabled-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/business.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG700-rgb));
- height: 48px;
- margin: auto;
- width: 48px;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-disabled-icon {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-#backgrounds-disabled-title {
- margin-top: 10px;
- text-align: center;
-}
-
-#backgrounds-default.bg-sel-tile-bg {
- background-color: white;
- height: 176px;
- width: 176px;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-default.bg-sel-tile-bg {
- background-color: transparent;
- }
-}
-
-#backgrounds-menu .bg-sel-tile-bg.selected,
-#backgrounds-image-menu .bg-sel-tile-bg.selected {
- background-color: rgba(var(--GB900-rgb), .08);
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-default.selected,
- #backgrounds-menu .bg-sel-tile-bg.selected,
- #backgrounds-image-menu .bg-sel-tile-bg.selected {
- background-color: rgba(var(--GB200-rgb), .1);
- }
-}
-
-#backgrounds-menu,
-#colors-menu {
- /* Remove extra spacing between inline-block elements. */
- font-size: 0;
-}
-
-#backgrounds-upload.bg-sel-tile-bg {
- background-color: transparent;
- vertical-align: top;
-}
-
-#menu-back {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_arrow_back.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 20px;
- background-color: rgb(var(--GG900-rgb));
- cursor: pointer;
- height: 20px;
- margin-inline-start: 8px;
- margin-top: 8px;
- outline: none;
- width: 20px;
-}
-
-@media (prefers-color-scheme: dark) {
- #menu-back {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-#menu-back-circle {
- border-radius: 50%;
- display: none;
- height: 36px;
- margin-inline-end: 4px;
- margin-inline-start: -12px;
- margin-top: 22px;
- outline: none;
- width: 36px;
-}
-
-.on-img-menu #menu-back-circle {
- display: inline-block;
-}
-
-#menu-back-circle:active,
-#menu-back-circle:focus {
- background: rgb(var(--GG300-rgb));
- background-position: center;
- background-size: 36px 36px;
-}
-
-@media (prefers-color-scheme: dark) {
- #menu-back-circle:active,
- #menu-back-circle:focus {
- background: rgb(var(--GG800-rgb));
- }
-
- #menu-back {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-html[dir=rtl] #menu-back {
- transform: scaleX(-1);
-}
-
-#backgrounds-upload-icon {
- background: white;
- border: 1px solid rgb(var(--GG300-rgb));
- box-sizing: border-box;
- display: inline-block;
- left: 0;
- opacity: 1;
- top: 0;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-upload-icon {
- background-color: rgb(var(--dark-mode-bg-rgb));
- border-color: rgb(var(--GG700-rgb));
- }
-}
-
-#backgrounds-upload-arrow {
- -webkit-mask-image: url(icons/upload.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background: 32px 32px rgb(var(--GG700-rgb));
- height: 32px;
- margin: 61px auto 8px;
- width: 32px;
-}
-
-.selected #backgrounds-upload-arrow {
- margin-top: 45px;
-}
-
-#backgrounds-upload-text {
- color: rgb(var(--GG700-rgb));
- font-size: 13px;
- text-align: center;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-upload-text {
- color: inherit;
- }
-}
-
-#customization-menu .bg-sel-tile .selected-circle {
- height: 20px;
- left: initial;
- right: 10px;
- top: 10px;
- width: 20px;
-}
-
-html[dir=rtl] #customization-menu .bg-sel-tile .selected-circle {
- left: 10px;
- right: initial;
-}
-
-#customization-menu .bg-sel-tile .selected-check {
- height: 24px;
- left: initial;
- right: 9px;
- top: 7px;
- width: 24px;
-}
-
-html[dir=rtl] #customization-menu .bg-sel-tile .selected-check {
- left: 9px;
- right: initial;
-}
-
-#backgrounds-default-icon {
- background-color: white;
- background-repeat: no-repeat;
- border: 1px solid rgb(var(--GG300-rgb));
- box-sizing: border-box;
- margin: auto;
- opacity: 1;
-}
-
-@media (prefers-color-scheme: dark) {
- #backgrounds-default-icon {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- border-color: rgb(var(--GG700-rgb));
- }
-
- .selected #backgrounds-default-icon {
- border-color: transparent;
- }
-}
-
-.mini-page {
- margin: auto;
- padding-top: 26px;
- width: fit-content;
-}
-
-.mini-header {
- -webkit-mask-image: url(icons/header.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG300-rgb));
- height: 40px;
- width: 130px;
-}
-
-.mini-header-colorful {
- background-image: url(icons/colored_header.svg);
- background-position: center;
- background-repeat: no-repeat;
- background-size: 100%;
- height: 40px;
- width: 130px;
-}
-
-@media (prefers-color-scheme: dark) {
- .mini-header-colorful {
- -webkit-mask-image: url(icons/colored_header.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background: white;
- }
-}
-
-.mini-shortcuts {
- -webkit-mask-image: url(icons/shortcut-circles.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG300-rgb));
- height: 42px;
- margin-inline-start: 7px;
- margin-top: 12px;
- width: 116px;
-}
-
-#backgrounds-default:not(.selected) .mini-page {
- padding-top: 32px;
-}
-
-#backgrounds-default:not(.selected) .mini-header,
-#backgrounds-default:not(.selected) .mini-header-colorful {
- height: 48px;
- width: 156px;
-}
-
-#backgrounds-default:not(.selected) .mini-shortcuts {
- height: 50px;
- margin-inline-start: 8px;
- margin-top: 14px;
- width: 140px;
-}
-
-#shortcuts-menu {
- line-height: 20px;
-}
-
-#sh-options {
- display: flex;
-}
-
-.sh-option {
- margin-inline-end: 9px;
- width: 268px;
-}
-
-#shortcuts-menu.hidden-selected .sh-option {
- color: rgb(var(--GG500-rgb));
-}
-
-.sh-option-image {
- border: 1px solid rgb(var(--GG300-rgb));
- border-radius: 4px;
- box-sizing: border-box;
- cursor: pointer;
- height: 176px;
- position: relative;
- width: 268px;
-}
-
-@media (prefers-color-scheme: dark) {
- .sh-option-image {
- border-color: rgb(var(--GG700-rgb));
- }
-}
-
-#shortcuts-menu:not(.hidden-selected) .selected .sh-option-image {
- background-color: rgb(var(--GB050-rgb));
- border-color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- #shortcuts-menu:not(.hidden-selected) .selected .sh-option-image {
- background-color: rgba(var(--GB200-rgb), .1);
- border-color: rgb(var(--GB300-rgb));
- }
-}
-
-.sh-option-mini {
- background-color: white;
- border: 1px solid rgb(var(--GG300-rgb));
- border-radius: 4px;
- box-sizing: border-box;
- height: 144px;
- position: absolute;
- right: 40px;
- top: 16px;
- width: 144px;
-}
-
-@media (prefers-color-scheme: dark) {
- .sh-option-mini {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- border-color: rgb(var(--GG700-rgb));
- }
-}
-
-html[dir=rtl] .sh-option-mini {
- left: 40px;
- right: unset;
-}
-
-#shortcuts-menu:not(.hidden-selected) .selected .sh-option-mini {
- box-shadow: 0 1px 3px 0 rgba(var(--GG800-rgb), .3),
- 0 4px 8px 3px rgba(var(--GG800-rgb), .15);
-}
-
-@media (prefers-color-scheme: dark) {
- #shortcuts-menu:not(.hidden-selected) .selected .sh-option-mini {
- border-color: transparent;
- box-shadow: var(--dark-mode-shadow);
- }
-}
-
-.sh-option-mini .mini-shortcuts {
- background-color: rgb(var(--GG500-rgb));
-}
-
-#shortcuts-menu:not(.hidden-selected) .selected .mini-shortcuts {
- background-color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- #shortcuts-menu:not(.hidden-selected) .selected .mini-shortcuts {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-.sh-option-icon {
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background: 96px 96px rgb(var(--GG200-rgb));
- height: 96px;
- left: 16px;
- position: absolute;
- top: 48px;
- width: 96px;
-}
-
-#sh-option-cl .sh-option-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/account_circle.svg);
-}
-
-#sh-option-mv .sh-option-icon {
- -webkit-mask-image: url(../../../../components/neterror/resources/images/generic-globe.svg);
-}
-
-html[dir=rtl] .sh-option-icon {
- right: 16px;
-}
-
-@media (prefers-color-scheme: dark) {
- .sh-option-icon {
- background-color: rgb(var(--GG700-rgb));
- }
-}
-
-#shortcuts-menu:not(.hidden-selected) .selected .sh-option-icon {
- background-color: rgba(var(--GB600-rgb), .24);
-}
-
-@media (prefers-color-scheme: dark) {
- #shortcuts-menu:not(.hidden-selected) .selected .sh-option-icon {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-.sh-option-image .selected-circle {
- box-shadow: 0 3px 6px 1px rgba(0, 0, 0, .16),
- 0 1px 2px 1px rgba(0, 0, 0, .23);
- height: 22px;
- left: 209px;
- top: 9px;
- width: 22px;
-}
-
-html[dir=rtl] .sh-option-image .selected-circle {
- left: 0;
- right: 209px;
-}
-
-.sh-option-image .selected-check {
- left: initial;
- right: 32px;
- top: 6px;
-}
-
-html[dir=rtl] .sh-option-image .selected-check {
- left: 32px;
- right: initial;
-}
-
-#shortcuts-menu.hidden-selected .sh-option-image
- :-webkit-any(.selected-circle, .selected-check) {
- display: none;
-}
-
-.sh-option-title {
- font-weight: bold;
- margin: 8px 0;
-}
-
-#sh-hide {
- border: 1px solid rgb(var(--GG300-rgb));
- border-radius: 4px;
- box-sizing: border-box;
- display: flex;
- height: 64px;
- margin-top: 24px;
- max-width: 544px;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #sh-hide {
- border-color: rgb(var(--GG700-rgb));
- }
-}
-
-#sh-hide.selected {
- background-color: rgb(var(--GB050-rgb));
- border-color: rgb(var(--GB600-rgb));
- color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- #sh-hide.selected {
- background-color: rgba(var(--GB200-rgb), .1);
- border-color: rgb(var(--GB300-rgb));
- color: rgb(var(--GB300-rgb));
- }
-}
-
-#sh-hide > div {
- margin-bottom: auto;
- margin-top: auto;
-}
-
-#sh-hide-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/icon_visibility_off.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background: 24px 24px rgb(var(--GG700-rgb));
- height: 24px;
- margin-inline-end: 20px;
- margin-inline-start: 24px;
- width: 24px;
-}
-
-.selected #sh-hide-icon {
- background-color: rgb(var(--GB600-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- .selected #sh-hide-icon {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-#sh-hide-title {
- font-weight: bold;
-}
-
-#sh-hide-toggle-wrapper {
- height: 16px;
- margin-inline-end: 20px;
- margin-inline-start: auto;
- position: relative;
- width: 34px;
-}
-
-/* The toggle's container. */
-.switch {
- background-color: white;
- border-radius: 8px;
- display: inline-block;
- height: 12px;
- left: 3px;
- position: absolute;
- top: 2px;
- transition: background-color linear 80ms;
- width: 28px;
- z-index: 0;
-}
-
-@media (prefers-color-scheme: dark) {
- .switch {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- }
-}
-
-/* Hide the toggle's default checkbox. */
-.switch input {
- opacity: 0;
-}
-
-/* The slider for the toggle. */
-.toggle {
- background-color: #ccc;
- border-radius: 34px;
- bottom: 0;
- cursor: pointer;
- display: block;
- left: 0;
- position: absolute;
- right: 0;
- top: 0;
- transition: transform linear 80ms, background-color linear 80ms;
-}
-
-/* The knob for the toggle. */
-.toggle .knob {
- background-color: white;
- border-radius: 50%;
- bottom: -2px;
- box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .4);
- content: '';
- display: block;
- height: 16px;
- left: -3px;
- position: absolute;
- transition: transform linear 80ms, background-color linear 80ms;
- width: 16px;
-}
-
-/* Gray/blue highlight around the knob. */
-.toggle .highlight {
- background-color: rgb(128, 134, 139);
- border-radius: 50%;
- height: 40px;
- left: -15px;
- opacity: 0;
- position: absolute;
- top: -14px;
- transition: transform linear 80ms, opacity linear 80ms;
- width: 40px;
-}
-
-@media (prefers-color-scheme: dark) {
- .toggle .highlight {
- background-color: rgb(var(--GG300-rgb));
- }
-}
-
-input:checked + .toggle {
- background-color: rgba(var(--GB600-rgb), .5);
-}
-
-@media (prefers-color-scheme: dark) {
- input:checked + .toggle {
- background-color: rgba(var(--GB300-rgb), .5);
- }
-}
-
-input:focus + .toggle {
- box-shadow: 0 0 1px rgb(33, 150, 243);
-}
-
-input:active + .toggle .highlight,
-#customization-menu:not(.using-mouse-nav) input:focus + .toggle .highlight {
- opacity: .15;
-}
-
-@media (prefers-color-scheme: dark) {
- input:active + .toggle .highlight,
- #customization-menu:not(.using-mouse-nav) input:focus + .toggle .highlight {
- opacity: .4;
- }
-}
-
-input:checked + .toggle .knob,
-input:checked + .toggle .highlight {
- background-color: rgb(var(--GB600-rgb));
- transform: translateX(18px);
-}
-
-@media (prefers-color-scheme: dark) {
- input:checked + .toggle .knob,
- input:checked + .toggle .highlight {
- background-color: rgb(var(--GB300-rgb));
- }
-}
-
-#colors-menu {
- --check-mark-size: 20px;
- --custom-color-border: rgb(var(--GG300-rgb));
- --custom-color-dark: rgb(var(--GG100-rgb));
- --custom-color-light: white;
- --tile-size: 64px;
- --tile-margin: 25px;
-}
-
-#colors-menu .bg-sel-tile-bg {
- background-color: unset;
- border-radius: 50%;
- box-sizing: border-box;
- cursor: pointer;
- height: var(--tile-size);
- margin-bottom: var(--tile-margin);
- margin-inline-end: var(--tile-margin);
- margin-inline-start: 0;
- margin-top: 0;
- width: var(--tile-size);
-}
-
-#colors-menu .bg-sel-tile-bg.selected {
- box-shadow: 0 0 0 4px rgba(var(--GB600-rgb), .4);
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-menu .bg-sel-tile-bg.selected {
- box-shadow: 0 0 0 4px rgba(var(--GB600-rgb), .4);
- }
-}
-
-/*
- To avoid circle showing behind the checkmark, draw it 2px smaller and 1px
- below so that it is always 1px smaller then the checkmark from all sides.
- */
-#colors-menu .bg-sel-tile .selected-circle {
- height: calc(var(--check-mark-size) - 2px);
- right: 0;
- top: 1px;
- width: calc(var(--check-mark-size) - 2px);
-}
-
-html[dir=rtl] #colors-menu .bg-sel-tile .selected-circle {
- left: 0;
-}
-
-#colors-menu .bg-sel-tile .selected-check {
- background: url(icons/check_circle.svg) no-repeat center;
- background-size: var(--check-mark-size) var(--check-mark-size);
- height: var(--check-mark-size);
- right: 0;
- top: 0;
- width: var(--check-mark-size);
-}
-
-html[dir=rtl] #colors-menu .bg-sel-tile .selected-check {
- left: 0;
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-menu .bg-sel-tile .selected-check::after {
- -webkit-mask-image: url(icons/check_circle.svg);
- -webkit-mask-size: var(--check-mark-size);
- height: var(--check-mark-size);
- width: var(--check-mark-size);
- }
-}
-
-#colors-default-icon {
- background-image: url(icons/default_theme.svg);
- background-repeat: no-repeat;
- background-size: contain;
- opacity: 1;
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-default-icon {
- background-image: url(icons/default_theme_dark.svg);
- }
-}
-
-#colors-theme {
- border: 1px solid rgb(var(--GG200-rgb));
- border-radius: 4px;
- display: none;
- font-size: 13px;
- height: 64px;
- margin-bottom: 24px;
- max-width: 544px;
- width: 100%;
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-theme {
- border-color: rgb(var(--GG700-rgb));
- }
-}
-
-#colors-theme.visible {
- display: flex;
-}
-
-#colors-theme > * {
- margin-bottom: auto;
- margin-top: auto;
-}
-
-#colors-theme-icon {
- -webkit-mask-image: url(icons/brush.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG700-rgb));
- height: 24px;
- margin-inline-end: 20px;
- margin-inline-start: 24px;
- width: 24px;
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-theme-icon {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-#colors-theme-name {
- font-weight: bold;
-}
-
-#colors-theme-link {
- margin-inline-end: 24px;
- margin-inline-start: auto;
- text-decoration: none;
-}
-
-#colors-theme-link-icon {
- -webkit-mask-image: url(../../../../ui/webui/resources/images/open_in_new.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG700-rgb));
- height: 20px;
- width: 20px;
-}
-
-@media (prefers-color-scheme: dark) {
- #colors-theme-link-icon {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-#colors-theme-uninstall {
- height: fit-content;
- margin-inline-end: 16px;
-}
-
-#color-picker-container {
- vertical-align: top;
-}
-
-#color-picker-tile {
- background-color: var(--custom-color-dark);
- border: 1px solid var(--custom-color-border);
- border-radius: 50%;
- box-sizing: border-box;
- opacity: 1;
-}
-
-#color-picker-icon {
- -webkit-mask-image: url(icons/colorize.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: rgb(var(--GG700-rgb));
- display: inline-block;
- height: 20px;
- /* Position the icon in the middle with offset of half its size. */
- left: calc(50% - 10px);
- position: absolute;
- /* Position the icon in the middle with offset of half its size. */
- top: calc(50% - 10px);
- width: 20px;
-}
-
-#color-picker-icon.white {
- background-color: white;
-}
-
-#left-semicircle {
- background-color: var(--custom-color-light);
- border-bottom-left-radius: var(--tile-size);
- border-top-left-radius: var(--tile-size);
- display: inline-block;
- height: 100%;
- width: 50%;
-}
-
-html[dir=rtl] #left-semicircle {
- border-bottom-left-radius: 0;
- border-bottom-right-radius: var(--tile-size);
- border-top-left-radius: 0;
- border-top-right-radius: var(--tile-size);
-}
-
-#colors-theme-info {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-#refresh-daily-wrapper {
- display: none;
- margin-inline-start: auto;
-}
-
-.on-img-menu #refresh-daily-wrapper {
- display: flex;
-}
-
-#refresh-toggle-wrapper {
- height: 16px;
- margin-inline-end: 12px;
- margin-top: 31px;
- position: relative;
- width: 34px;
-}
-
-#refresh-text {
- font-size: 16px;
- user-select: none;
- width: fit-content;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.html b/chromium/chrome/browser/resources/local_ntp/local_ntp.html
deleted file mode 100644
index 1608f757440..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.html
+++ /dev/null
@@ -1,403 +0,0 @@
-<!doctype html>
-<html lang="$i18n{language}" dir="$i18n{textdirection}">
-<!-- Copyright 2015 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
-<head>
- <link rel="stylesheet" href="chrome-search://local-ntp/animations.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/local-ntp-common.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/customize.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/doodles.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/local-ntp.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/theme.css"></link>
- <link rel="stylesheet" href="chrome-search://local-ntp/voice.css"></link>
- $i18nRaw{bgPreloader}
- <meta http-equiv="Content-Security-Policy"
- content="$i18nRaw{contentSecurityPolicy}">
- <script src="chrome-search://local-ntp/assert.js"
- integrity="$i18n{assertIntegrity}"></script>
- <script src="chrome-search://local-ntp/animations.js"
- integrity="$i18n{animationsIntegrity}"></script>
- <script src="chrome-search://local-ntp/config.js"
- integrity="$i18n{configDataIntegrity}"></script>
- <script src="chrome-search://local-ntp/customize.js"
- integrity="$i18n{localNtpCustomizeIntegrity}"></script>
- <script src="chrome-search://local-ntp/doodles.js"
- integrity="$i18n{doodlesIntegrity}"></script>
- <script src="chrome-search://local-ntp/local-ntp.js"
- integrity="$i18n{localNtpIntegrity}"></script>
- <script src="chrome-search://local-ntp/utils.js"
- integrity="$i18n{utilsIntegrity}"></script>
- <meta charset="utf-8">
- <meta name="google" value="notranslate">
- <meta name="referrer" content="strict-origin">
-</head>
-<body>
- <div id="custom-bg"></div>
- <div id="custom-bg-preview"></div>
- <!-- Container for the OneGoogleBar HTML. -->
- <div id="one-google"></div>
-
- <div id="ntp-contents">
- <div id="logo">
- <!-- The logo that is displayed in the absence of a doodle. -->
- <div id="logo-default" title="Google"></div>
- <!-- Logo displayed when theme prevents doodles. Doesn't fade. -->
- <div id="logo-non-white" title="Google"></div>
- <!-- A doodle, if any: its link and image. -->
- <div id="logo-doodle">
- <div id="logo-doodle-container">
- <div id="logo-doodle-wrapper">
- <button id="logo-doodle-button">
- <img id="logo-doodle-image" tabindex="-1"></img>
- </button>
- </div>
- </div>
- <iframe id="logo-doodle-iframe" scrolling="no"></iframe>
- </div>
- </div>
-
- <div id="fakebox-container" $i18n{hiddenIfRealboxEnabled}>
- <div id="fakebox">
- <div class="search-icon"></div>
- <div id="fakebox-text"></div>
- <input id="fakebox-input" autocomplete="off" tabindex="-1" type="url"
- aria-hidden="true">
- <div id="fakebox-cursor"></div>
- <button id="fakebox-microphone" class="microphone-icon" hidden></button>
- </div>
- </div>
-
- <div id="realbox-container" $i18n{hiddenIfRealboxDisabled}>
- <div id="realbox-input-wrapper">
- <div id="realbox-icon" data-default-icon="$i18n{realboxDefaultIcon}">
- </div>
- <input id="realbox" type="search" autocomplete="off" spellcheck="false"
- aria-live="polite" autofocus>
- <button id="realbox-microphone" class="microphone-icon" hidden></button>
- <div id="realbox-matches"></div>
- </div>
- </div>
-
- <div id="user-content">
- <!-- Search suggestions will be inserted here. -->
- <div id="most-visited">
- <!-- The container for the tiles. The MV iframe goes in here. -->
- <div id="mv-tiles"></div>
- </div>
- </div>
-
- <!-- Notification shown when the tiles are modified. -->
- <div id="mv-notice-container">
- <div id="mv-notice" class="notice-hide" role="alert">
- <span id="mv-msg"></span>
- <!-- Links in the notification. -->
- <span id="mv-notice-links">
- <span id="mv-undo" class="ripple" tabindex="0" role="button"></span>
- <span id="mv-restore" class="ripple" tabindex="0" role="button"></span>
- </span>
- </div>
- </div>
-
- <div id="attribution"><div id="attribution-text"></div></div>
-
- <div id="error-notice-container">
- <div id="error-notice" class="notice-hide" role="alert">
- <span id="error-notice-icon"></span>
- <span id="error-notice-msg"></span>
- <span id="error-notice-link" class="ripple" tabindex="0" role="button"></span>
- </div>
- </div>
-
- <div id="edit-bg" tabindex="0" role="button" hidden>
- <div id="edit-bg-icon"></div>
- <span id="edit-bg-text">$i18n{customizeButton}</span>
- </div>
-
- <div id="custom-bg-attr"></div>
- </div>
-
- <dialog div id="edit-bg-dialog">
- <div id="edit-bg-menu">
- <div id="edit-bg-title"></div>
- <div id="edit-bg-default-wallpapers" class="bg-option" tabindex="0">
- <div class="bg-option-img"></div>
- <div id="edit-bg-default-wallpapers-text" class="bg-option-text">
- </div>
- </div>
- <div id="edit-bg-upload-image" class="bg-option" tabindex="0">
- <div class="bg-option-img"></div>
- <div id="edit-bg-upload-image-text" class="bg-option-text"></div>
- </div>
- <div id="edit-bg-divider"></div>
- <div id="custom-links-restore-default" class="bg-option bg-option-disabled" tabindex="0">
- <div class="bg-option-img"></div>
- <div id="custom-links-restore-default-text" class="bg-option-text"></div>
- </div>
- <div id="edit-bg-restore-default" class="bg-option bg-option-disabled" tabindex="0">
- <div class="bg-option-img"></div>
- <div id="edit-bg-restore-default-text" class="bg-option-text"></div>
- </div>
- </div>
- </dialog>
-
- <dialog id="ddlsd">
- <div id="ddlsd-title"></div>
- <button id="ddlsd-close"></button>
- <div id="ddlsd-content">
- <button id="ddlsd-fbb" class="ddlsd-sbtn"></button>
- <button id="ddlsd-twb" class="ddlsd-sbtn"></button>
- <button id="ddlsd-emb" class="ddlsd-sbtn"></button>
- <hr id="ddlsd-hr">
- <div id="ddlsd-link">
- <span id="ddlsd-text-ctr">
- <input type="text" id="ddlsd-text" dir="ltr">
- </span>
- <button id="ddlsd-copy"></button>
- </div>
- </div>
- </dialog>
-
- <dialog id="bg-sel-menu" class="customize-dialog">
- <div id="bg-sel-title-bar">
- <div id="bg-sel-back-circle" tabindex="0" role="button">
- <div id="bg-sel-back"></div>
- </div>
- <div id="bg-sel-title"></div>
- </div>
- <div id="bg-sel-tiles" tabindex="0"></div>
- <div id="bg-sel-footer">
- <button id="bg-sel-footer-cancel" class="bg-sel-footer-button paper secondary ripple"
- tabindex="0"></button>
- <button id="bg-sel-footer-done" class="bg-sel-footer-button paper primary ripple"
- tabindex="-1"></button>
- </div>
- </dialog>
-
- <dialog id="customization-menu" class="customize-dialog">
- <div id="menu-nav-panel" role="tablist" aria-label="$i18n{customizeMenu}">
- <button id="backgrounds-button" class="menu-option" tabindex="0"
- role="tab" aria-controls="backgrounds-menu backgrounds-image-menu"
- aria-selected="true" aria-labelledby="backgrounds-menu-option"
- title="$i18n{backgroundsOption}">
- <div class="menu-option-icon-wrapper">
- <div id="backgrounds-icon" class="menu-option-icon"></div>
- </div>
- <div id="backgrounds-menu-option" class="menu-option-label">
- $i18n{backgroundsOption}
- </div>
- </button>
- <button id="shortcuts-button" class="menu-option" tabindex="0" role="tab"
- aria-controls="shortcuts-menu" aria-selected="false"
- aria-labelledby="shortcuts-menu-option"
- title="$i18n{shortcutsOption}">
- <div class="menu-option-icon-wrapper">
- <div id="shortcuts-icon" class="menu-option-icon"></div>
- </div>
- <div id="shortcuts-menu-option" class="menu-option-label">
- $i18n{shortcutsOption}
- </div>
- </button>
- <button id="colors-button" class="menu-option" tabindex="0" role="tab"
- aria-controls="colors-menu" aria-selected="false"
- aria-labelledby="colors-menu-option" title="$i18n{colorsOption}">
- <div class="menu-option-icon-wrapper">
- <div id="colors-icon" class="menu-option-icon"></div>
- </div>
- <div id="colors-menu-option" class="menu-option-label">
- $i18n{colorsOption}
- </div>
- </button>
- </div>
- <div id="menu-contents">
- <div id="menu-header">
- <div id="menu-back-circle" tabindex="0" role="button"
- aria-label="$i18n{backLabel}" title="$i18n{backLabel}">
- <div id="menu-back"></div>
- </div>
- <div id="menu-title">$i18n{customizeMenu}</div>
- <div id="refresh-daily-wrapper">
- <div id="refresh-toggle-wrapper" title="$i18n{refreshDaily}">
- <label class="switch">
- <input id="refresh-daily-toggle" type="checkbox"
- aria-labelledby="refresh-text"></input>
- <span class="toggle">
- <div class="knob"></div>
- <div class="highlight"></div>
- </span>
- </label>
- </div>
- <div id="refresh-text">$i18n{refreshDaily}</div>
- </div>
- </div>
- <div id="backgrounds-menu" class="menu-panel" tabindex="0"
- role="tabpanel" aria-label="$i18n{backgroundsOption}">
- <div id="backgrounds-upload" class="bg-sel-tile-bg">
- <div id="backgrounds-upload-icon" class="bg-sel-tile" tabindex="-1"
- role="button" aria-label="$i18n{uploadImage}"
- aria-pressed="false" title="$i18n{uploadImage}">
- <div id="backgrounds-upload-arrow"></div>
- <div id="backgrounds-upload-text">$i18n{uploadImage}</div>
- </div>
- </div>
- <div id="backgrounds-default" class="bg-sel-tile-bg">
- <div id="backgrounds-default-icon" class="bg-sel-tile" tabindex="-1"
- role="button" aria-label="$i18n{noBackground}"
- title="$i18n{noBackground}" aria-pressed="false">
- <div class="mini-page">
- <div class="mini-header-colorful"></div>
- <div class="mini-shortcuts"></div>
- </div>
- </div>
- <div class="bg-sel-tile-title">$i18n{noBackground}</div>
- </div>
- </div>
- <div id="backgrounds-image-menu" class="menu-panel" tabindex="0"
- role="tabpanel" aria-label="$i18n{backgroundsOption}"></div>
- <div id="backgrounds-disabled-menu" class="menu-panel" tabindex="0"
- role="tabpanel" aria-label="$i18n{backgroundsOption}">
- <div id="backgrounds-disabled-wrapper">
- <div id="backgrounds-disabled-icon"></div>
- <div id="backgrounds-disabled-title">
- $i18n{customBackgroundDisabled}
- </div>
- </div>
- </div>
- <div id="shortcuts-menu" class="menu-panel" tabindex="0" role="tabpanel"
- aria-label="$i18n{shortcutsOption}">
- <div id="sh-options">
- <div class="sh-option">
- <div id="sh-option-cl" class="sh-option-image" tabindex="-1"
- role="button" aria-pressed="false"
- aria-labelledby="sh-option-cl-title" title="$i18n{myShortcuts}">
- <div class="sh-option-icon"></div>
- <div class="sh-option-mini">
- <div class="mini-page">
- <div class="mini-header"></div>
- <div class="mini-shortcuts"></div>
- </div>
- </div>
- </div>
- <div id="sh-option-cl-title" class="sh-option-title">
- $i18n{myShortcuts}
- </div>
- $i18n{shortcutsCurated}
- </div>
- <div class="sh-option">
- <div id="sh-option-mv" class="sh-option-image" tabindex="-1"
- role="button" aria-pressed="false"
- aria-labelledby="sh-option-mv-title" title="$i18n{mostVisited}">
- <div class="sh-option-icon"></div>
- <div class="sh-option-mini">
- <div class="mini-page">
- <div class="mini-header"></div>
- <div class="mini-shortcuts"></div>
- </div>
- </div>
- </div>
- <div id="sh-option-mv-title" class="sh-option-title">
- $i18n{mostVisited}
- </div>
- $i18n{shortcutsSuggested}
- </div>
- </div>
- <div id="sh-hide">
- <div id="sh-hide-icon"></div>
- <div>
- <div id="sh-hide-title">$i18n{hideShortcuts}</div>
- $i18n{hideShortcutsDesc}
- </div>
- <div id="sh-hide-toggle-wrapper" title="$i18n{hideShortcuts}">
- <label class="switch">
- <input id="sh-hide-toggle" type="checkbox" tabindex="-1"
- aria-labelledby="sh-hide-title"></input>
- <span class="toggle">
- <div class="knob"></div>
- <div class="highlight"></div>
- </span>
- </label>
- </div>
- </div>
- </div>
- <div id="colors-menu" class="menu-panel" tabindex="0" role="tabpanel"
- aria-label="$i18n{colorsOption}">
- <div id="colors-theme" tabindex="0">
- <div id="colors-theme-icon"></div>
- <div id="colors-theme-info">
- <div id="colors-theme-name"></div>
- $i18n{installedThemeDesc}
- </div>
- <a id="colors-theme-link" target="_blank">
- <div id="colors-theme-link-icon" > </div>
- </a>
- <button id="colors-theme-uninstall" class="paper secondary">
- $i18n{uninstallButton}
- </button>
- </div>
- <div id="color-picker-container" class="bg-sel-tile-bg">
- <div id="color-picker-tile" class="bg-sel-tile" tabindex="-1"
- aria-label="$i18n{colorPickerLabel}"
- title="$i18n{colorPickerLabel}"
- role="button" aria-pressed="false">
- <div id="left-semicircle"></div>
- <div id="color-picker-icon"></div>
- <input id="color-picker" type="color" style="display:none">
- </input>
- </div>
- </div>
- <div id="colors-default" class="bg-sel-tile-bg">
- <div id="colors-default-icon" class="bg-sel-tile" tabindex="-1"
- aria-label="$i18n{defaultThemeLabel}"
- title="$i18n{defaultThemeLabel}" tabindex="-1"
- role="button" aria-pressed="false">
- </div>
- </div>
- </div>
- </div>
- <div id="menu-footer">
- <button id="menu-cancel"
- class="bg-sel-footer-button paper secondary ripple"
- title="$i18n{cancelButton}">$i18n{cancelButton}</button>
- <button id="menu-done" class="bg-sel-footer-button paper primary ripple"
- title="$i18n{doneButton}">$i18n{doneButton}</button>
- </div>
- </dialog>
-
- <dialog id="voice-overlay-dialog" class="overlay-dialog">
- <div id="voice-overlay" class="overlay-hidden">
- <button id="voice-close-button" class="close-button">&times;</button>
- <div id="voice-outer" class="outer">
- <div class="inner-container">
- <div id="voice-button-container" class="button-container">
- <!-- The audio level animation. -->
- <span id="voice-level" class="level"></span>
- <!-- The microphone button. -->
- <span id="voice-button" class="button">
- <!-- The microphone icon (in CSS). -->
- <div class="microphone">
- <span class="receiver"></span>
- <div class="wrapper">
- <span class="stem"></span>
- <span class="shell"></span>
- </div>
- </div>
- </span>
- </div>
- <div id="text-container" aria-live="polite">
- <!-- Low confidence text underneath high confidence text. -->
- <span id="voice-text-i" class="voice-text"></span>
- <!-- High confidence text on top of low confidence text. -->
- <span id="voice-text-f" class="voice-text"></span>
- </div>
- </div>
- </div>
- </div>
- </dialog>
- <div id="screen-reader-announcer" role="status" aria-live="polite"></div>
-
- <div id="one-google-end-of-body"></div>
-
- <script defer src="chrome-search://local-ntp/voice.js"
- integrity="$i18n{localNtpVoiceIntegrity}"></script>
-</body>
-</html>
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.js b/chromium/chrome/browser/resources/local_ntp/local_ntp.js
deleted file mode 100644
index 518f03dfc10..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.js
+++ /dev/null
@@ -1,2413 +0,0 @@
-/**
- * @license
- * Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * @fileoverview The local InstantExtended NTP.
- */
-
-// Global local statics (visible for testing).
-
-/**
- * Whether the Most Visited and edit custom link iframes should be created while
- * running tests. Currently the SimpleJavascriptTests are flaky due to some
- * raciness in the creation/destruction of the iframe. crbug.com/786313.
- * @type {boolean}
- */
-let iframesAndVoiceSearchDisabledForTesting = false;
-
-/**
- * Whether the most visited tiles have finished loading, i.e. we've received the
- * 'loaded' postMessage from the iframe. Used by tests to detect that loading
- * has completed.
- * @type {boolean}
- */
-let tilesAreLoaded = false;
-
-/**
- * Controls rendering the new tab page for InstantExtended.
- * @return {Object} A limited interface for testing the local NTP.
- */
-function LocalNTP() {
-'use strict';
-
-// Type definitions.
-
-/** @enum {number} */
-const ACMatchClassificationStyle = {
- NONE: 0,
- URL: 1 << 0,
- MATCH: 1 << 1,
- DIM: 1 << 2,
-};
-
-/** @typedef {{inline: string, text: string}} */
-let RealboxOutput;
-
-/**
- * @typedef {{
- * moveCursorToEnd: (boolean|undefined),
- * inline: (string|undefined),
- * text: (string|undefined),
- * }}
- */
-let RealboxOutputUpdate;
-
-// Constants.
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-const CLASSES = {
- ALTERNATE_LOGO: 'alternate-logo', // Shows white logo if required by theme
- COLLAPSED: 'collapsed',
- // Applies styles to dialogs used in customization.
- CUSTOMIZE_DIALOG: 'customize-dialog',
- DELAYED_HIDE_NOTIFICATION: 'mv-notice-delayed-hide',
- DESCRIPTION: 'description',
- DIM: 'dim',
- DISMISSABLE: 'dismissable',
- DISMISS_ICON: 'dismiss-icon',
- DISMISS_PROMO: 'dismiss-promo',
- // Extended and elevated style for customization entry point.
- ENTRY_POINT_ENHANCED: 'ep-enhanced',
- FAKEBOX_FOCUS: 'fakebox-focused', // Applies focus styles to the fakebox
- // Applies float animations to the Most Visited notification
- FLOAT_DOWN: 'float-down',
- FLOAT_UP: 'float-up',
- // Applies drag focus style to the fakebox
- FAKEBOX_DRAG_FOCUS: 'fakebox-drag-focused',
- HAS_IMAGE: 'has-image', // A realbox match with an image.
- // Applies a different style to the error notification if a link is present.
- HAS_LINK: 'has-link',
- HEADER: 'header',
- HIDE_FAKEBOX: 'hide-fakebox',
- HIDE_NOTIFICATION: 'notice-hide',
- // Contains the image next to a realbox match. Displays a placeholder color
- // while the realbox match image is loading.
- IMAGE_CONTAINER: 'image-container',
- INITED: 'inited', // Reveals the <body> once init() is done.
- LEFT_ALIGN_ATTRIBUTION: 'left-align-attribution',
- // The icon next to a realbox match.
- MATCH_ICON: 'match-icon',
- // The image next to a realbox match.
- MATCH_IMAGE: 'match-image',
- // Vertically centers the most visited section for a non-Google provided page.
- NON_GOOGLE_PAGE: 'non-google-page',
- REMOVABLE: 'removable',
- REMOVE_ICON: 'remove-icon',
- REMOVE_MATCH: 'remove-match',
- SELECTED: 'selected', // A selected (via up/down arrow key) realbox match.
- SHOW_ELEMENT: 'show-element',
- // When the realbox has matches to show.
- SHOW_MATCHES: 'show-matches',
- // Applied when the doodle shouldn't be shown, e.g. when a theme is applied.
- DONT_SHOW_DOODLE: 'dont-show-doodle',
-};
-
-const DOCUMENT_MATCH_TYPE = 'document';
-
-/**
- * The period of time (ms) before transitions can be applied to a toast
- * notification after modifying the "display" property.
- * @type {number}
- */
-const DISPLAY_TIMEOUT = 20;
-
-/**
- * Enum for HTML element ids.
- * @enum {string}
- * @const
- */
-const IDS = {
- ATTRIBUTION: 'attribution',
- ATTRIBUTION_TEXT: 'attribution-text',
- CUSTOM_BG: 'custom-bg',
- CUSTOM_LINKS_EDIT_IFRAME: 'custom-links-edit',
- CUSTOM_LINKS_EDIT_IFRAME_DIALOG: 'custom-links-edit-dialog',
- ERROR_NOTIFICATION: 'error-notice',
- ERROR_NOTIFICATION_CONTAINER: 'error-notice-container',
- ERROR_NOTIFICATION_LINK: 'error-notice-link',
- ERROR_NOTIFICATION_MSG: 'error-notice-msg',
- FAKEBOX: 'fakebox',
- FAKEBOX_INPUT: 'fakebox-input',
- FAKEBOX_TEXT: 'fakebox-text',
- FAKEBOX_MICROPHONE: 'fakebox-microphone',
- MOST_VISITED: 'most-visited',
- NOTIFICATION: 'mv-notice',
- NOTIFICATION_CONTAINER: 'mv-notice-container',
- NOTIFICATION_MESSAGE: 'mv-msg',
- NTP_CONTENTS: 'ntp-contents',
- OGB: 'one-google',
- PROMO: 'promo',
- REALBOX: 'realbox',
- REALBOX_ICON: 'realbox-icon',
- REALBOX_INPUT_WRAPPER: 'realbox-input-wrapper',
- REALBOX_MATCHES: 'realbox-matches',
- REALBOX_MICROPHONE: 'realbox-microphone',
- RESTORE_ALL_LINK: 'mv-restore',
- SUGGESTIONS: 'suggestions',
- TILES: 'mv-tiles',
- TILES_IFRAME: 'mv-single',
- UNDO_LINK: 'mv-undo',
- USER_CONTENT: 'user-content',
-};
-
-/**
- * The different types of events that are logged from the NTP. This enum is
- * used to transfer information from the NTP JavaScript to the renderer and is
- * not used as a UMA enum histogram's logged value.
- * Note: Keep in sync with common/ntp_logging_events.h
- * @enum {number}
- * @const
- */
-const LOG_TYPE = {
- // The One Google Bar was shown.
- NTP_ONE_GOOGLE_BAR_SHOWN: 37,
-
- // 'Cancel' was clicked in the 'Edit shortcut' dialog.
- NTP_CUSTOMIZE_SHORTCUT_CANCEL: 54,
- // 'Done' was clicked in the 'Edit shortcut' dialog.
- NTP_CUSTOMIZE_SHORTCUT_DONE: 55,
-
- // A middle slot promo was shown.
- NTP_MIDDLE_SLOT_PROMO_SHOWN: 60,
- // A promo link was clicked.
- NTP_MIDDLE_SLOT_PROMO_LINK_CLICKED: 61,
-};
-
-/**
- * The maximum number of tiles to show in the Most Visited section if custom
- * links is enabled.
- * @type {number}
- * @const
- */
-const MAX_NUM_TILES_CUSTOM_LINKS = 10;
-
-/**
- * The maximum number of tiles to show in the Most Visited section.
- * @type {number}
- * @const
- */
-const MAX_NUM_TILES_MOST_VISITED = 8;
-
-/**
- * Indicates a missing suggestion group Id. Based on
- * SearchSuggestionParser::kNoSuggestionGroupId.
- * @type {number}
- */
-const NO_SUGGESTION_GROUP_ID = -1;
-
-/**
- * The period of time (ms) before the Most Visited notification is hidden.
- * @type {number}
- */
-const NOTIFICATION_TIMEOUT = 10000;
-
-/**
- * Specifications for an NTP design (not comprehensive).
- *
- * backgroundColor: The 4-component color of default background,
- * darkBackgroundColor: The 4-component color of default dark background,
- * iconBackgroundColor: The 4-component color of default dark icon background,
- * iconDarkBackgroundColor: The 4-component color of default icon background,
- * numTitleLines: Number of lines to display in titles.
- * titleColor: The 4-component color of title text.
- * titleColorAgainstDark: The 4-component color of title text against a dark
- * theme.
- *
- * @type {{
- * backgroundColor: !Array<number>,
- * darkBackgroundColor: !Array<number>,
- * iconBackgroundColor: !Array<number>,
- * iconDarkBackgroundColor: !Array<number>,
- * numTitleLines: number,
- * titleColor: !Array<number>,
- * titleColorAgainstDark: !Array<number>,
- * }}
- */
-const NTP_DESIGN = {
- backgroundColor: [255, 255, 255, 255],
- darkBackgroundColor: [53, 54, 58, 255],
- iconBackgroundColor: [241, 243, 244, 255], /** GG100 */
- iconDarkBackgroundColor: [32, 33, 36, 255], /** GG900 */
- numTitleLines: 1,
- titleColor: [60, 64, 67, 255], /** GG800 */
- titleColorAgainstDark: [248, 249, 250, 255], /** GG050 */
-};
-
-const REALBOX_KEYDOWN_HANDLED_KEYS = [
- 'ArrowDown',
- 'ArrowUp',
- 'Delete',
- 'Enter',
- 'Escape',
- 'PageDown',
- 'PageUp',
-];
-
-// Local statics.
-
-/** @type {?AutocompleteResult} */
-let autocompleteResult = null;
-
-/**
- * The time of the first character insert operation that has not yet been
- * painted in floating point milliseconds. Used to measure the realbox
- * responsiveness with a histogram.
- * @type {number}
- */
-let charTypedTime = 0;
-
-/**
- * The currently visible notification element. Null if no notification is
- * present.
- * @type {?Object}
- */
-let currNotification = null;
-
-/**
- * The timeout function for automatically hiding the pop-up notification. Only
- * set if a notification is visible.
- * @type {?Object}
- */
-let delayedHideNotification = null;
-
-/**
- * Whether 'Enter' was pressed but did not navigate to a match due to matches
- * being stale.
- * @type {boolean}
- */
-let enterWasPressed = false;
-
-/**
- * A cache from image URL to image content in the form of data URL in order to
- * reuse match image data that have been loaded before and to avoid flickering.
- * @type {!Object<string>}
- */
-const faviconOrImageUrlToDataUrlCache = {};
-
-/**
- * True if dark mode is enabled.
- * @type {boolean}
- */
-let isDarkModeEnabled = false;
-
-/**
- * Used to prevent the default match from requiring inline autocompletion when
- * the user is deleting text in the input.
- */
-let isDeletingInput = false;
-
-/**
- * The last blacklisted tile rid if any, which by definition should not be
- * filler.
- * @type {?number}
- */
-let lastBlacklistedTile = null;
-
-/**
- * The 'Enter' event that was ignored due to matches being stale. Will be used
- * to navigate to the default match once up-to-date matches arrive.
- * @type {?Event}
- */
-let lastEnterEvent = null;
-
-/**
- * The last queried input.
- * @type {string|undefined}
- */
-let lastQueriedInput;
-
-/**
- * Last text/inline autocompletion shown in the realbox (either by user input or
- * outputting autocomplete matches).
- * @type {!RealboxOutput}
- */
-let lastOutput = {text: '', inline: ''};
-
-/** @type {?number} */
-let lastRealboxFocusTime = null;
-
-/**
- * Current realbox match elements.
- * @type {!Array<!Element>}
- */
-let matchEls = [];
-
-/**
- * The browser embeddedSearch.newTabPage object.
- * @type {Object}
- */
-let ntpApiHandle;
-
-/**
- * True if user just pasted into the realbox.
- * @type {boolean}
- */
-let pastedInRealbox = false;
-
-/**
- * A map from a suggestion Group ID to the group element for that group ID.
- * @type {!Object<!Element>}
- */
-let suggestionGroupElsMap = {};
-
-// Helper methods.
-
-/** @return {boolean} */
-function areRealboxMatchesVisible() {
- return $(IDS.REALBOX_INPUT_WRAPPER).classList.contains(CLASSES.SHOW_MATCHES);
-}
-
-/** @param {!AutocompleteResult} result */
-function autocompleteResultChanged(result) {
- if (lastQueriedInput === undefined ||
- result.input !== lastQueriedInput.trimLeft()) {
- return; // Stale result; ignore.
- }
-
- renderAutocompleteMatches(result.matches, result.suggestionGroupsMap);
-
- autocompleteResult = result;
-
- $(IDS.REALBOX).focus();
-
- updateRealboxOutput({
- inline: '',
- text: lastQueriedInput || '',
- });
-
- assert(autocompleteResult.matches.length === matchEls.length);
- const first = result.matches[0];
- if (first && first.allowedToBeDefaultMatch) {
- selectMatchEl(matchEls[0]);
- updateRealboxOutput({inline: first.inlineAutocompletion});
-
- if (enterWasPressed) {
- assert(lastEnterEvent);
- navigateToMatch(first, lastEnterEvent);
- }
- } else {
- setRealboxIcon(undefined);
- }
-}
-
-/**
- * @param {number} matchIndex
- * @param {string} url AutocompleteMatch's imageUrl or destinationUrl.
- * @param {string} dataUrl
- */
-function autocompleteMatchImageAvailable(matchIndex, url, dataUrl) {
- if (!autocompleteResult || !autocompleteResult.matches[matchIndex]) {
- return;
- }
-
- const match = autocompleteResult.matches[matchIndex];
- if (match.imageUrl !== url && match.destinationUrl !== url) {
- return;
- }
-
- // Return if the image has been rendered. Re-rendering it will cause flicker.
- if (faviconOrImageUrlToDataUrlCache[url]) {
- return;
- }
- faviconOrImageUrlToDataUrlCache[url] = dataUrl;
-
- assert(autocompleteResult.matches.length === matchEls.length);
-
- // Update the match image/favicon.
- if (match.imageUrl === url) {
- const imageContainerEl = assert(matchEls[matchIndex].getElementsByClassName(
- CLASSES.IMAGE_CONTAINER)[0]);
- const imageEl = document.createElement('img');
- imageEl.classList.add(CLASSES.MATCH_IMAGE);
- imageEl.src = dataUrl;
- imageContainerEl.appendChild(imageEl);
- imageContainerEl.style.backgroundColor = 'transparent';
- } else {
- const iconEl = assert(
- matchEls[matchIndex].getElementsByClassName(CLASSES.MATCH_ICON)[0]);
- setBackgroundImageByUrl(iconEl, dataUrl);
- }
-
- // If the match is selected, also update the realbox favicon.
- const selectedMatchIndex = matchEls.findIndex(matchEl => {
- return matchEl.classList.contains(CLASSES.SELECTED);
- });
- if (selectedMatchIndex === matchIndex) {
- setRealboxIcon(match);
- }
-}
-
-/**
- * @param {number} style
- * @return {!Array<string>}
- */
-function classificationStyleToClasses(style) {
- const classes = [];
- if (style & ACMatchClassificationStyle.DIM) {
- classes.push('dim');
- }
- if (style & ACMatchClassificationStyle.MATCH) {
- classes.push('match');
- }
- if (style & ACMatchClassificationStyle.URL) {
- classes.push('url');
- }
- return classes;
-}
-
-function clearAutocompleteMatches() {
- autocompleteResult = null;
- window.chrome.embeddedSearch.searchBox.stopAutocomplete(
- /*clearResult=*/ true);
- // Autocomplete sends updates once it is stopped. Invalidate those results
- // by setting the last queried input to its uninitialized value.
- lastQueriedInput = undefined;
- setRealboxIcon(undefined);
-}
-
-/**
- * Converts an Array of color components into RGBA format "rgba(R,G,B,A)".
- * @param {Array<number>} color Array of rgba color components.
- * @return {string} CSS color in RGBA format.
- */
-function convertToRGBAColor(color) {
- return 'rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' +
- color[3] / 255 + ')';
-}
-
-/**
- * Converts an Array of color components into 8-digit Hex format "#RRGGBBAA".
- * @param {Array<number>} color Array of rgba color components.
- * @return {string} CSS color in 8-digit Hex format.
- */
-function convertToHexColor(color) {
- return '#' + assert(color).map(c => c.toString(16).padStart(2, '0')).join('');
-}
-
-/**
- * Returns a timeout that can be executed early. Calls back true if this was
- * an early execution, false otherwise.
- * @param {!Function} timeout The timeout function. Requires a boolean param.
- * @param {number} delay The timeout delay.
- * @return {Object}
- */
-function createExecutableTimeout(timeout, delay) {
- const timeoutId = window.setTimeout(() => {
- timeout(/*executedEarly=*/ false);
- }, delay);
- return {
- clear: () => {
- window.clearTimeout(timeoutId);
- },
- trigger: () => {
- window.clearTimeout(timeoutId);
- return timeout(/*executedEarly=*/ true);
- }
- };
-}
-
-/** Create the Most Visited and edit custom links iframes. */
-function createIframes() {
- // Collect arguments for the most visited iframe.
- const args = [];
-
- const searchboxApiHandle = window.chrome.embeddedSearch.searchBox;
-
- if (searchboxApiHandle.rtl) {
- args.push('rtl=1');
- }
- if (NTP_DESIGN.numTitleLines > 1) {
- args.push('ntl=' + NTP_DESIGN.numTitleLines);
- }
-
- args.push(
- 'title=' +
- encodeURIComponent(configData.translatedStrings.mostVisitedTitle));
- args.push(
- 'removeTooltip=' +
- encodeURIComponent(configData.translatedStrings.removeThumbnailTooltip));
-
- if (configData.isGooglePage) {
- args.push('enableCustomLinks=1');
- args.push(
- 'addLink=' +
- encodeURIComponent(configData.translatedStrings.addLinkTitle));
- args.push(
- 'addLinkTooltip=' +
- encodeURIComponent(configData.translatedStrings.addLinkTooltip));
- args.push(
- 'editLinkTooltip=' +
- encodeURIComponent(configData.translatedStrings.editLinkTooltip));
- }
-
- // Create the most visited iframe.
- const iframe = document.createElement('iframe');
- iframe.id = IDS.TILES_IFRAME;
- iframe.name = IDS.TILES_IFRAME;
- iframe.title = configData.translatedStrings.mostVisitedTitle;
- iframe.src = 'chrome-search://most-visited/single.html?' + args.join('&');
- $(IDS.TILES).appendChild(iframe);
-
- iframe.onload = function() {
- sendNtpThemeToMostVisitedIframe();
- reloadTiles();
- };
-
- if (configData.isGooglePage) {
- // Collect arguments for the edit custom link iframe.
- const clArgs = [];
-
- if (searchboxApiHandle.rtl) {
- clArgs.push('rtl=1');
- }
-
- clArgs.push(
- 'addTitle=' +
- encodeURIComponent(configData.translatedStrings.addLinkTitle));
- clArgs.push(
- 'editTitle=' +
- encodeURIComponent(configData.translatedStrings.editLinkTitle));
- clArgs.push(
- 'nameField=' +
- encodeURIComponent(configData.translatedStrings.nameField));
- clArgs.push(
- 'urlField=' +
- encodeURIComponent(configData.translatedStrings.urlField));
- clArgs.push(
- 'linkRemove=' +
- encodeURIComponent(configData.translatedStrings.linkRemove));
- clArgs.push(
- 'linkCancel=' +
- encodeURIComponent(configData.translatedStrings.linkCancel));
- clArgs.push(
- 'linkDone=' +
- encodeURIComponent(configData.translatedStrings.linkDone));
- clArgs.push(
- 'invalidUrl=' +
- encodeURIComponent(configData.translatedStrings.invalidUrl));
-
- // Create the edit custom link iframe.
- const clIframe = document.createElement('iframe');
- clIframe.id = IDS.CUSTOM_LINKS_EDIT_IFRAME;
- clIframe.name = IDS.CUSTOM_LINKS_EDIT_IFRAME;
- clIframe.title = configData.translatedStrings.editLinkTitle;
- clIframe.src = 'chrome-search://most-visited/edit.html?' + clArgs.join('&');
- const clIframeDialog = document.createElement('dialog');
- clIframeDialog.id = IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG;
- clIframeDialog.classList.add(CLASSES.CUSTOMIZE_DIALOG);
- clIframeDialog.appendChild(clIframe);
- document.body.appendChild(clIframeDialog);
- }
-
- window.addEventListener('message', handlePostMessage);
-}
-
-/**
- * Return true if custom links are enabled.
- * @return {boolean}
- */
-function customLinksEnabled() {
- return configData.isGooglePage &&
- !chrome.embeddedSearch.newTabPage.isUsingMostVisited;
-}
-
-/**
- * Called by tests to disable the creation of Most Visited and edit custom link
- * iframes.
- */
-function disableIframesAndVoiceSearchForTesting() {
- iframesAndVoiceSearchDisabledForTesting = true;
-}
-
-/**
- * TODO(dbeam): reconcile this with //ui/webui/resources/js/util.js.
- * @param {?Node} node The node to check.
- * @param {function(?Node):boolean} predicate The function that tests the
- * nodes.
- * @return {?Node} The found ancestor or null if not found.
- */
-function findAncestor(node, predicate) {
- while (node !== null) {
- if (predicate(node)) {
- break;
- }
- node = node.parentNode;
- }
- return node;
-}
-
-/**
- * Animates the pop-up notification to float down, and clears the timeout to
- * hide the notification.
- * @param {?Element} notification The notification element.
- * @param {?Element} notificationContainer The notification container element.
- * @param {boolean} showPromo Do show the promo if present.
- */
-function floatDownNotification(notification, notificationContainer, showPromo) {
- if (!notification || !notificationContainer) {
- return;
- }
-
- if (!notificationContainer.classList.contains(CLASSES.FLOAT_UP)) {
- return;
- }
-
- // Clear the timeout to hide the notification.
- if (delayedHideNotification) {
- delayedHideNotification.clear();
- delayedHideNotification = null;
- currNotification = null;
- }
-
- if (showPromo) {
- // Show middle-slot promo if one is present.
- const promo = $(IDS.PROMO);
- if (promo) {
- promo.classList.remove(CLASSES.HIDE_NOTIFICATION);
- // Timeout is required for the "float" transition to work. Modifying the
- // "display" property prevents transitions from activating for a brief
- // period of time.
- window.setTimeout(() => {
- promo.classList.remove(CLASSES.FLOAT_DOWN);
- }, DISPLAY_TIMEOUT);
- }
- }
-
- // Reset notification visibility once the animation is complete.
- notificationContainer.addEventListener('transitionend', (event) => {
- // Blur the hidden items.
- $(IDS.UNDO_LINK).blur();
- $(IDS.RESTORE_ALL_LINK).blur();
- if (notification.classList.contains(CLASSES.HAS_LINK)) {
- notification.classList.remove(CLASSES.HAS_LINK);
- $(IDS.ERROR_NOTIFICATION_LINK).blur();
- }
- // Hide the notification
- if (!notification.classList.contains(CLASSES.FLOAT_UP)) {
- notification.classList.add(CLASSES.HIDE_NOTIFICATION);
- }
- }, {once: true});
- notificationContainer.classList.remove(CLASSES.FLOAT_UP);
-}
-
-/**
- * Animates the specified notification to float up. Automatically hides any
- * pre-existing notification and sets a delayed timer to hide the new
- * notification.
- * @param {?Element} notification The notification element.
- * @param {?Element} notificationContainer The notification container element.
- */
-function floatUpNotification(notification, notificationContainer) {
- if (!notification || !notificationContainer) {
- return;
- }
-
- // Hide any pre-existing notification.
- if (delayedHideNotification) {
- // Hide the current notification if it's a different type (i.e. error vs
- // success). Otherwise, simply clear the notification timeout and reset it
- // later.
- if (currNotification === notificationContainer) {
- delayedHideNotification.clear();
- } else {
- delayedHideNotification.trigger();
- }
- delayedHideNotification = null;
- }
-
- // Hide middle-slot promo if one is present.
- const promo = $(IDS.PROMO);
- if (promo) {
- promo.classList.add(CLASSES.FLOAT_DOWN);
- // Prevent keyboard focus once the promo is hidden.
- promo.addEventListener('transitionend', (event) => {
- if (event.propertyName === 'bottom' &&
- promo.classList.contains(CLASSES.FLOAT_DOWN)) {
- promo.classList.add(CLASSES.HIDE_NOTIFICATION);
- }
- }, {once: true});
- }
-
- notification.classList.remove(CLASSES.HIDE_NOTIFICATION);
- // Timeout is required for the "float" transition to work. Modifying the
- // "display" property prevents transitions from activating for a brief period
- // of time.
- window.setTimeout(() => {
- notificationContainer.classList.add(CLASSES.FLOAT_UP);
- }, DISPLAY_TIMEOUT);
-
- // Automatically hide the notification after a period of time.
- delayedHideNotification = createExecutableTimeout((executedEarly) => {
- // Early execution occurs if another notification should be shown. In this
- // case, we do not want to re-show the promo yet.
- floatDownNotification(notification, notificationContainer, !executedEarly);
- }, NOTIFICATION_TIMEOUT);
- currNotification = notificationContainer;
-}
-
-/**
- * Returns theme background info.
- * @return {?NtpTheme}
- */
-function getNtpTheme() {
- const info = window.chrome.embeddedSearch.newTabPage.ntpTheme;
- const preview = $(customize.IDS.CUSTOM_BG_PREVIEW);
- if (preview.dataset.hasPreview === 'true') {
- info.isNtpBackgroundDark = preview.dataset.hasImage === 'true';
- info.customBackgroundConfigured = preview.dataset.hasImage === 'true';
- info.alternateLogo = preview.dataset.hasImage === 'true';
- // backgroundImage is in the form: url("actual url"). Remove everything
- // except the actual url.
- info.imageUrl = preview.style.backgroundImage.slice(5, -2);
-
- if (preview.dataset.hasImage === 'true') {
- info.attribution1 = preview.dataset.attributionLine1;
- info.attribution2 = preview.dataset.attributionLine2;
- info.attributionActionUrl = preview.dataset.attributionActionUrl;
- }
- }
- return info;
-}
-
-/**
- * Determine whether dark chips should be used if dark mode is enabled. This is
- * is the case when dark mode is enabled and a background image (from a custom
- * background or user theme) is not set.
- *
- * @param {!Object} info Theme background information.
- * @return {boolean} Whether the chips should be dark.
- */
-function getUseDarkChips(info) {
- return window.matchMedia('(prefers-color-scheme: dark)').matches &&
- !info.imageUrl;
-}
-
-/**
- * Event handler for messages from the most visited and edit custom link iframe.
- * @param {Event} event Event received.
- */
-function handlePostMessage(event) {
- const cmd = event.data.cmd;
- const args = event.data;
- if (cmd === 'loaded') {
- tilesAreLoaded = true;
- if (configData.isGooglePage) {
- // Show search suggestions, promo, and the OGB if they were previously
- // hidden.
- if ($(IDS.SUGGESTIONS)) {
- $(IDS.SUGGESTIONS).style.visibility = 'visible';
- }
- if ($(IDS.PROMO)) {
- showPromoIfNotOverlappingAndTrackResizes();
- }
- if (customLinksEnabled()) {
- $(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT)
- .classList.toggle(
- customize.CLASSES.OPTION_DISABLED, !args.showRestoreDefault);
- $(customize.IDS.CUSTOM_LINKS_RESTORE_DEFAULT).tabIndex =
- (args.showRestoreDefault ? 0 : -1);
- }
- $(IDS.OGB).classList.add(CLASSES.SHOW_ELEMENT);
- }
- } else if (cmd === 'tileBlacklisted') {
- if (customLinksEnabled()) {
- showNotification(configData.translatedStrings.linkRemovedMsg);
- } else {
- showNotification(
- configData.translatedStrings.thumbnailRemovedNotification);
- }
- lastBlacklistedTile = args.rid;
-
- ntpApiHandle.deleteMostVisitedItem(args.rid);
- } else if (cmd === 'resizeDoodle') {
- doodles.resizeDoodleHandler(args);
- } else if (cmd === 'startEditLink') {
- $(IDS.CUSTOM_LINKS_EDIT_IFRAME)
- .contentWindow.postMessage({cmd: 'linkData', rid: args.rid}, '*');
- // Small delay to allow the dialog to finish setting up before displaying.
- window.setTimeout(function() {
- $(IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG).showModal();
- }, 10);
- } else if (cmd === 'closeDialog') {
- $(IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG).close();
- } else if (cmd === 'focusMenu') {
- // Focus the edited tile's menu or the add shortcut tile after closing the
- // custom link edit dialog without saving.
- const iframe = $(IDS.TILES_IFRAME);
- if (iframe) {
- iframe.contentWindow.postMessage({cmd: 'focusMenu', rid: args.rid}, '*');
- }
- }
-}
-
-/** Hides the Most Visited pop-up notification. */
-function hideNotification() {
- floatDownNotification(
- $(IDS.NOTIFICATION), $(IDS.NOTIFICATION_CONTAINER), /*showPromo=*/ true);
-}
-
-/**
- * Prepares the New Tab Page by adding listeners, the most visited pages
- * section, and Google-specific elements for a Google-provided page.
- */
-function init() {
- // If an accessibility tool is in use, increase the time for which the
- // "tile was blacklisted" notification is shown.
- if (configData.isAccessibleBrowser) {
- document.body.style.setProperty('--mv-notice-time', '30s');
- }
-
- // Hide notifications after fade out, so we can't focus on links via keyboard.
- $(IDS.NOTIFICATION).addEventListener('transitionend', (event) => {
- if (event.propertyName === 'opacity') {
- hideNotification();
- }
- });
-
- $(IDS.NOTIFICATION_MESSAGE).textContent =
- configData.translatedStrings.thumbnailRemovedNotification;
-
- const undoLink = $(IDS.UNDO_LINK);
- undoLink.addEventListener('click', onUndo);
- registerKeyHandler(undoLink, ['Enter', ' '], onUndo);
- undoLink.textContent = configData.translatedStrings.undoThumbnailRemove;
-
- const restoreAllLink = $(IDS.RESTORE_ALL_LINK);
- restoreAllLink.addEventListener('click', onRestoreAll);
- registerKeyHandler(restoreAllLink, ['Enter', ' '], onRestoreAll);
-
- $(IDS.ATTRIBUTION_TEXT).textContent =
- configData.translatedStrings.attributionIntro;
-
- const embeddedSearchApiHandle = window.chrome.embeddedSearch;
-
- ntpApiHandle = embeddedSearchApiHandle.newTabPage;
- ntpApiHandle.onthemechange = onThemeChange;
- ntpApiHandle.onmostvisitedchange = onMostVisitedChange;
-
- renderTheme();
-
- window.matchMedia('(prefers-color-scheme: dark)').onchange = onThemeChange;
-
- const searchboxApiHandle = embeddedSearchApiHandle.searchBox;
-
- if (configData.isGooglePage) {
- requestAndInsertGoogleResources();
- animations.addRippleAnimations();
-
- ntpApiHandle.onaddcustomlinkdone = onAddCustomLinkDone;
- ntpApiHandle.onupdatecustomlinkdone = onUpdateCustomLinkDone;
- ntpApiHandle.ondeletecustomlinkdone = onDeleteCustomLinkDone;
-
- customize.init(showErrorNotification, hideNotification);
-
- if (configData.realboxEnabled) {
- setRealboxIcon(undefined);
-
- const realboxEl = $(IDS.REALBOX);
- realboxEl.placeholder = configData.translatedStrings.searchboxPlaceholder;
- // Using .onmousedown instead of addEventListener('mousedown') to support
- // tests.
- realboxEl.onmousedown = onRealboxMouseDown;
- realboxEl.addEventListener('copy', onRealboxCutCopy);
- realboxEl.addEventListener('cut', onRealboxCutCopy);
- realboxEl.addEventListener('focus', onRealboxFocus);
- realboxEl.addEventListener('input', onRealboxInput);
- realboxEl.addEventListener('keyup', onRealboxKeyup);
- realboxEl.addEventListener('paste', onRealboxPaste);
-
- const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
- realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
- realboxWrapper.addEventListener('keydown', onRealboxWrapperKeydown);
-
- searchboxApiHandle.autocompleteresultchanged = autocompleteResultChanged;
- searchboxApiHandle.autocompletematchimageavailable =
- autocompleteMatchImageAvailable;
-
- if (!iframesAndVoiceSearchDisabledForTesting) {
- speech.init(
- configData.googleBaseUrl, configData.translatedStrings,
- $(IDS.REALBOX_MICROPHONE), searchboxApiHandle);
- }
-
- utils.disableOutlineOnMouseClick($(IDS.REALBOX_MICROPHONE));
- } else {
- // Set up the fakebox (which only exists on the Google NTP).
- ntpApiHandle.oninputstart = onInputStart;
- ntpApiHandle.oninputcancel = onInputCancel;
-
- if (ntpApiHandle.isInputInProgress) {
- onInputStart();
- }
-
- $(IDS.FAKEBOX_TEXT).textContent =
- configData.translatedStrings.searchboxPlaceholder;
-
- if (!iframesAndVoiceSearchDisabledForTesting) {
- speech.init(
- configData.googleBaseUrl, configData.translatedStrings,
- $(IDS.FAKEBOX_MICROPHONE), searchboxApiHandle);
- }
-
- // Listener for updating the key capture state.
- document.body.onmousedown = function(event) {
- if (isFakeboxClick(event)) {
- searchboxApiHandle.startCapturingKeyStrokes();
- } else if (isFakeboxFocused()) {
- searchboxApiHandle.stopCapturingKeyStrokes();
- }
- };
- searchboxApiHandle.onkeycapturechange = function() {
- setFakeboxFocus(searchboxApiHandle.isKeyCaptureEnabled);
- };
- const inputbox = $(IDS.FAKEBOX_INPUT);
- inputbox.onpaste = function(event) {
- event.preventDefault();
- // Send pasted text to Omnibox.
- const text = event.clipboardData.getData('text/plain');
- if (text) {
- searchboxApiHandle.paste(text);
- }
- };
- inputbox.ondrop = function(event) {
- event.preventDefault();
- const text = event.dataTransfer.getData('text/plain');
- if (text) {
- searchboxApiHandle.paste(text);
- }
- setFakeboxDragFocus(false);
- };
- inputbox.ondragenter = function() {
- setFakeboxDragFocus(true);
- };
- inputbox.ondragleave = function() {
- setFakeboxDragFocus(false);
- };
- utils.disableOutlineOnMouseClick($(IDS.FAKEBOX_MICROPHONE));
-
- // Update the fakebox style to match the current key capturing state.
- setFakeboxFocus(searchboxApiHandle.isKeyCaptureEnabled);
- // Also tell the browser that we're capturing, otherwise it's possible
- // that both fakebox and Omnibox have visible focus at the same time, see
- // crbug.com/792850.
- if (searchboxApiHandle.isKeyCaptureEnabled) {
- searchboxApiHandle.startCapturingKeyStrokes();
- }
- }
-
- doodles.init();
- } else {
- document.body.classList.add(CLASSES.NON_GOOGLE_PAGE);
- }
-
- if (searchboxApiHandle.rtl) {
- $(IDS.NOTIFICATION).dir = 'rtl';
- }
-
- if (!iframesAndVoiceSearchDisabledForTesting) {
- createIframes();
- }
-
- utils.setPlatformClass(document.body);
- utils.disableOutlineOnMouseClick($(customize.IDS.EDIT_BG));
- document.documentElement.classList.add(CLASSES.INITED);
-}
-
-/**
- * Injects the One Google Bar into the page. Called asynchronously, so that it
- * doesn't block the main page load.
- */
-function injectOneGoogleBar(ogb) {
- if (ogb.barHtml === '') {
- return;
- }
-
- const inHeadStyle = document.createElement('style');
- inHeadStyle.type = 'text/css';
- inHeadStyle.appendChild(document.createTextNode(ogb.inHeadStyle));
- document.head.appendChild(inHeadStyle);
-
- const inHeadScript = document.createElement('script');
- inHeadScript.type = 'text/javascript';
- inHeadScript.appendChild(document.createTextNode(ogb.inHeadScript));
- document.head.appendChild(inHeadScript);
-
- renderOneGoogleBarTheme();
-
- const ogElem = $('one-google');
- ogElem.innerHTML = ogb.barHtml;
-
- const afterBarScript = document.createElement('script');
- afterBarScript.type = 'text/javascript';
- afterBarScript.appendChild(document.createTextNode(ogb.afterBarScript));
- ogElem.parentNode.insertBefore(afterBarScript, ogElem.nextSibling);
-
- $('one-google-end-of-body').innerHTML = ogb.endOfBodyHtml;
-
- const endOfBodyScript = document.createElement('script');
- endOfBodyScript.type = 'text/javascript';
- endOfBodyScript.appendChild(document.createTextNode(ogb.endOfBodyScript));
- document.body.appendChild(endOfBodyScript);
-
- ntpApiHandle.logEvent(LOG_TYPE.NTP_ONE_GOOGLE_BAR_SHOWN);
-}
-
-/**
- * Injects a middle-slot promo into the page. Called asynchronously, so that it
- * doesn't block the main page load.
- */
-function injectPromo(promo) {
- if (!promo.promoHtml) {
- if ($(IDS.PROMO)) {
- $(IDS.PROMO).remove();
- }
- return;
- }
-
- const promoContainer = document.createElement('div');
- promoContainer.id = IDS.PROMO;
- promoContainer.innerHTML += promo.promoHtml;
- $(IDS.NTP_CONTENTS).appendChild(promoContainer);
-
- if (promo.promoLogUrl) {
- navigator.sendBeacon(promo.promoLogUrl);
- }
-
- ntpApiHandle.logEvent(LOG_TYPE.NTP_MIDDLE_SLOT_PROMO_SHOWN);
-
- const link = promoContainer.querySelector('a');
- if (link) {
- link.onclick = e => {
- const url = new URL(link.href);
- if (promo.canOpenExtensionsPage && url.origin == 'chrome://extensions') {
- ntpApiHandle.openExtensionsPage(
- e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey);
- e.preventDefault();
- }
- ntpApiHandle.logEvent(LOG_TYPE.NTP_MIDDLE_SLOT_PROMO_LINK_CLICKED);
- };
- }
-
- if (promo.promoId) {
- const icon = document.createElement('button');
- icon.classList.add(CLASSES.DISMISS_ICON);
-
- icon.title = configData.translatedStrings.dismissPromo;
- icon.onclick = e => {
- ntpApiHandle.blocklistPromo(promo.promoId);
- promoContainer.remove();
- window.removeEventListener('resize', showPromoIfNotOverlapping);
- };
-
- const dismiss = document.createElement('div');
- dismiss.classList.add(CLASSES.DISMISS_PROMO);
- dismiss.appendChild(icon);
-
- promoContainer.querySelector('div').appendChild(dismiss);
- promoContainer.classList.add(CLASSES.DISMISSABLE);
- }
-
- // The the MV tiles are already loaded show the promo immediately.
- if (tilesAreLoaded) {
- showPromoIfNotOverlappingAndTrackResizes();
- }
-}
-
-/**
- * Injects search suggestions into the page. Called *synchronously* with cached
- * data as not to cause shifting of the most visited tiles.
- */
-function injectSearchSuggestions(suggestions) {
- if (suggestions.suggestionsHtml === '') {
- return;
- }
-
- const suggestionsContainer = document.createElement('div');
- suggestionsContainer.id = IDS.SUGGESTIONS;
- suggestionsContainer.style.visibility = 'hidden';
- suggestionsContainer.innerHTML += suggestions.suggestionsHtml;
- $(IDS.USER_CONTENT).insertAdjacentElement('afterbegin', suggestionsContainer);
-
- const endOfBodyScript = document.createElement('script');
- endOfBodyScript.type = 'text/javascript';
- endOfBodyScript.appendChild(
- document.createTextNode(suggestions.suggestionsEndOfBodyScript));
- document.body.appendChild(endOfBodyScript);
-}
-
-/**
- * @param {!Event} event The click event.
- * @return {boolean} True if the click occurred in an enabled fakebox.
- */
-function isFakeboxClick(event) {
- return $(IDS.FAKEBOX).contains(/** @type HTMLElement */ (event.target)) &&
- !$(IDS.FAKEBOX_MICROPHONE)
- .contains(/** @type HTMLElement */ (event.target));
-}
-
-/** @return {boolean} True if the fakebox has focus. */
-function isFakeboxFocused() {
- return document.body.classList.contains(CLASSES.FAKEBOX_FOCUS) ||
- document.body.classList.contains(CLASSES.FAKEBOX_DRAG_FOCUS);
-}
-
-/** @return {boolean} */
-function isPromoOverlapping() {
- const MARGIN = 10;
-
- /**
- * @param {string} id
- * @return {DOMRect}
- */
- const rect = id => $(id).getBoundingClientRect();
-
- const promoRect = $(IDS.PROMO).querySelector('div').getBoundingClientRect();
-
- if (promoRect.top - MARGIN <= rect(IDS.USER_CONTENT).bottom) {
- return true;
- }
-
- if (window.chrome.embeddedSearch.searchBox.rtl) {
- const attributionRect = rect(IDS.ATTRIBUTION);
- if (attributionRect.width > 0 &&
- promoRect.left - MARGIN <= attributionRect.right) {
- return true;
- }
-
- const editBgRect = rect(customize.IDS.EDIT_BG);
- assert(editBgRect.width > 0);
- if (promoRect.left - 2 * MARGIN <= editBgRect.right) {
- return true;
- }
-
- const customAttributionsRect = rect(customize.IDS.ATTRIBUTIONS);
- if (customAttributionsRect.width > 0 &&
- promoRect.right + MARGIN >= customAttributionsRect.left) {
- return true;
- }
- } else {
- const customAttributionsRect = rect(customize.IDS.ATTRIBUTIONS);
- if (customAttributionsRect.width > 0 &&
- promoRect.left - MARGIN <= customAttributionsRect.right) {
- return true;
- }
-
- const editBgRect = rect(customize.IDS.EDIT_BG);
- assert(editBgRect.width > 0);
- if (promoRect.right + 2 * MARGIN >= editBgRect.left) {
- return true;
- }
-
- const attributionEl = $(IDS.ATTRIBUTION);
- const attributionRect = attributionEl.getBoundingClientRect();
- if (attributionRect.width > 0) {
- const attributionOnLeft =
- attributionEl.classList.contains(CLASSES.LEFT_ALIGN_ATTRIBUTION);
- if (attributionOnLeft) {
- if (promoRect.left - MARGIN <= attributionRect.right) {
- return true;
- }
- } else if (promoRect.right + MARGIN >= attributionRect.left) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-/** Binds event listeners. */
-function listen() {
- document.addEventListener('DOMContentLoaded', init);
-}
-
-/**
- * @param {!AutocompleteMatch} match
- * @param {!Event} e
- */
-function navigateToMatch(match, e) {
- const line = autocompleteResult.matches.indexOf(match);
- assert(line >= 0);
- assert(lastRealboxFocusTime);
- window.chrome.embeddedSearch.searchBox.openAutocompleteMatch(
- line, match.destinationUrl, areRealboxMatchesVisible(),
- Date.now() - lastRealboxFocusTime, e.button || 0, e.altKey, e.ctrlKey,
- e.metaKey, e.shiftKey);
- e.preventDefault();
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.onaddcustomlinkdone. Called when the
- * custom link was successfully added. Shows the "Shortcut added" notification.
- * @param {boolean} success True if the link was successfully added.
- */
-function onAddCustomLinkDone(success) {
- if (success) {
- showNotification(configData.translatedStrings.linkAddedMsg);
- } else {
- showErrorNotification(
- configData.translatedStrings.linkCantCreate, null, null);
- }
- ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_DONE);
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.ondeletecustomlinkdone. Called when
- * the custom link was successfully deleted. Shows the "Shortcut deleted"
- * notification.
- * @param {boolean} success True if the link was successfully deleted.
- */
-function onDeleteCustomLinkDone(success) {
- if (success) {
- showNotification(configData.translatedStrings.linkRemovedMsg);
- } else {
- showErrorNotification(
- configData.translatedStrings.linkCantRemove, null, null);
- }
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.oninputcancel. Restores the NTP
- * (re-enables the fakebox and unhides the logo.)
- */
-function onInputCancel() {
- setFakeboxVisibility(true);
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.oninputstart. Handles new input by
- * disposing the NTP, according to where the input was entered.
- */
-function onInputStart() {
- if (isFakeboxFocused()) {
- setFakeboxFocus(false);
- setFakeboxDragFocus(false);
- setFakeboxVisibility(false);
- }
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.onmostvisitedchange. Called when the
- * NTP tiles are updated.
- */
-function onMostVisitedChange() {
- reloadTiles();
-}
-
-/** @param {Event} e */
-function onRealboxMouseDown(e) {
- if (!e.isTrusted || e.button !== 0) {
- // Only handle main (generally left) button presses generated by a user
- // action.
- return;
- }
- if (!$(IDS.REALBOX).value) {
- queryAutocomplete('');
- }
-}
-
-/** @param {!Event} e */
-function onRealboxCutCopy(e) {
- const realboxEl = $(IDS.REALBOX);
- if (!realboxEl.value || realboxEl.selectionStart !== 0 ||
- realboxEl.selectionEnd !== realboxEl.value.length ||
- !autocompleteResult || autocompleteResult.matches.length === 0) {
- // Only handle cut/copy when realbox has content and it's all selected.
- return;
- }
-
- const selected = matchEls.findIndex(matchEl => {
- return matchEl.classList.contains(CLASSES.SELECTED);
- });
-
- const selectedMatch = autocompleteResult.matches[selected];
- if (selectedMatch && !selectedMatch.isSearchType) {
- e.clipboardData.setData('text/plain', selectedMatch.destinationUrl);
- e.preventDefault();
- if (e.type === 'cut') {
- realboxEl.value = '';
- }
- }
-}
-
-function onRealboxFocus() {
- lastRealboxFocusTime = Date.now();
-}
-
-function onRealboxInput() {
- const realboxValue = $(IDS.REALBOX).value;
-
- updateRealboxOutput({inline: '', text: realboxValue});
-
- const charTyped = !isDeletingInput && !!realboxValue.trim();
- // If a character has been typed, update |charTypedTime|. Otherwise reset it.
- // If |charTypedTime| is not 0, there's a pending typed character for which
- // the results have not been painted yet. In that case, keep the earlier time.
- charTypedTime = charTyped ? charTypedTime || window.performance.now() : 0;
-
- if (realboxValue.trim()) {
- queryAutocomplete(realboxValue);
- } else {
- setRealboxMatchesVisible(false);
- clearAutocompleteMatches();
- }
-
- pastedInRealbox = false;
-}
-
-/** @param {!Event} e */
-function onRealboxKeyup(e) {
- if (e.key === 'Tab' && !$(IDS.REALBOX).value) {
- queryAutocomplete('');
- }
-}
-
-function onRealboxPaste() {
- pastedInRealbox = true;
-}
-
-/** @param {!Event} e */
-function onRealboxMatchesFocusIn(e) {
- const target = /** @type {Element} */ (e.target);
- const matchEl = findAncestor(target, el => el.nodeName === 'A');
- if (!matchEl) {
- return;
- }
- const selectedIndex = selectMatchEl(matchEl);
- const selectedMatch = autocompleteResult.matches[selectedIndex];
- if (!selectedMatch) {
- return;
- }
-
- // It doesn't really make sense to use fillFromMatch() here as the focus
- // change drops the selection (and is probably just noisy to
- // screenreaders).
- updateRealboxOutput(
- {moveCursorToEnd: true, inline: '', text: selectedMatch.fillIntoEdit});
-}
-
-/** @param {Event} e */
-function onRealboxWrapperFocusOut(e) {
- // Hide the matches and stop autocomplete only when the focus goes outside of
- // the realbox wrapper.
- const relatedTarget = /** @type {Element} */ (e.relatedTarget);
- const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
- if (!realboxWrapper.contains(relatedTarget)) {
- // Clear the input if it was empty when displaying the matches.
- if (lastQueriedInput === '') {
- updateRealboxOutput({inline: '', text: ''});
- setRealboxIcon(undefined);
- }
- setRealboxMatchesVisible(false);
-
- // Stop autocomplete but leave (potentially stale) results and continue
- // listening for key presses. These stale results should never be shown, but
- // correspond to the potentially stale suggestion left in the realbox when
- // blurred. That stale result may be navigated to by focusing and pressing
- // Enter.
- window.chrome.embeddedSearch.searchBox.stopAutocomplete(
- /*clearResult=*/ false);
- }
-}
-
-/** @param {Event} e */
-function onRealboxWrapperKeydown(e) {
- const key = e.key;
-
- const realboxEl = $(IDS.REALBOX);
- if (e.target === realboxEl && lastOutput.inline) {
- const realboxValue = realboxEl.value;
- const realboxSelected = realboxValue.substring(
- realboxEl.selectionStart, realboxEl.selectionEnd);
- // If the current state matches the default text + inline autocompletion
- // and the user types the next key in the inline autocompletion, just move
- // the selection and requery autocomplete. This is required to avoid flicker
- // while setting .value and .selection{Start,End} to keep typing smooth.
- if (realboxSelected === lastOutput.inline &&
- realboxValue === lastOutput.text + lastOutput.inline &&
- lastOutput.inline[0].toLocaleLowerCase() === key.toLocaleLowerCase()) {
- updateRealboxOutput({
- inline: lastOutput.inline.substr(1),
- text: assert(lastOutput.text + key),
- });
-
- // If |charTypedTime| is not 0, there's a pending typed character for
- // which the results have not been painted yet. In that case, keep the
- // earlier time.
- charTypedTime = charTypedTime || window.performance.now();
-
- queryAutocomplete(lastOutput.text);
- e.preventDefault();
- return;
- }
- }
-
- if (!REALBOX_KEYDOWN_HANDLED_KEYS.includes(key)) {
- return;
- }
-
- if (!areRealboxMatchesVisible()) {
- if (key === 'ArrowUp' || key === 'ArrowDown') {
- const realboxValue = $(IDS.REALBOX).value;
- if (realboxValue.trim() || !realboxValue) {
- queryAutocomplete(realboxValue);
- }
- e.preventDefault();
- return;
- }
- }
-
- if (!autocompleteResult || autocompleteResult.matches.length === 0) {
- return;
- }
-
- assert(autocompleteResult.matches.length === matchEls.length);
- const selected = matchEls.findIndex(matchEl => {
- return matchEl.classList.contains(CLASSES.SELECTED);
- });
-
- if (key === 'Enter') {
- if (matchEls.concat(realboxEl).includes(e.target)) {
- if (lastQueriedInput === autocompleteResult.input) {
- if (autocompleteResult.matches[selected]) {
- navigateToMatch(autocompleteResult.matches[selected], e);
- }
- } else {
- // User typed and pressed 'Enter' too quickly. Ignore this for now
- // because the matches are stale. Navigate to the default match (if one
- // exists) once the up-to-date results arrive.
- enterWasPressed = true;
- lastEnterEvent = e;
- e.preventDefault();
- }
- }
- return;
- }
-
- if (key === 'Delete') {
- if (e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
- const selectedMatch = autocompleteResult.matches[selected];
- if (selectedMatch && selectedMatch.supportsDeletion) {
- window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(
- selected);
- e.preventDefault();
- }
- }
- return;
- }
-
- if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
- return;
- }
-
- if (key === 'Escape' && selected === 0) {
- updateRealboxOutput({inline: '', text: ''});
- setRealboxMatchesVisible(false);
- clearAutocompleteMatches();
- e.preventDefault();
- return;
- }
-
- const visibleMatchEls = matchEls.filter((matchEl) => {
- return window.getComputedStyle(matchEl).display !== 'none';
- });
- /** @type {number} */ let newSelected;
- if (key === 'ArrowDown') {
- newSelected = selected + 1 < visibleMatchEls.length ? selected + 1 : 0;
- } else if (key === 'ArrowUp') {
- newSelected = selected - 1 >= 0 ? selected - 1 : visibleMatchEls.length - 1;
- } else if (key === 'Escape' || key === 'PageUp') {
- newSelected = 0;
- } else if (key === 'PageDown') {
- newSelected = visibleMatchEls.length - 1;
- }
- assert(selectMatchEl(assert(visibleMatchEls[newSelected])) >= 0);
- e.preventDefault();
-
- const realboxMatchesEl = $(IDS.REALBOX_MATCHES);
- if (realboxMatchesEl.contains(document.activeElement)) {
- // Selection should match focus if focus is currently in the matches.
- matchEls[newSelected].focus();
- }
-
- const newMatch = autocompleteResult.matches[newSelected];
- const newFill = newMatch.fillIntoEdit;
- let newInline = '';
- if (newMatch.allowedToBeDefaultMatch) {
- newInline = newMatch.inlineAutocompletion;
- }
- const newFillEnd = newFill.length - newInline.length;
- updateRealboxOutput({
- moveCursorToEnd: true,
- inline: newInline,
- text: assert(newFill.substr(0, newFillEnd)),
- });
-}
-
-/**
- * Handles a click on the restore all notification link by hiding the
- * notification and informing Chrome.
- */
-function onRestoreAll() {
- hideNotification();
- // Focus on the omnibox after the notification is hidden.
- window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes();
- if (customLinksEnabled()) {
- ntpApiHandle.resetCustomLinks();
- } else {
- ntpApiHandle.undoAllMostVisitedDeletions();
- }
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.onthemechange.
- */
-function onThemeChange() {
- renderTheme();
- renderOneGoogleBarTheme();
- sendNtpThemeToMostVisitedIframe();
- if ($(IDS.PROMO)) {
- showPromoIfNotOverlapping();
- }
-}
-
-/**
- * Handles a click on the notification undo link by hiding the notification and
- * informing Chrome.
- */
-function onUndo() {
- hideNotification();
- // Focus on the omnibox after the notification is hidden.
- window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes();
- if (customLinksEnabled()) {
- ntpApiHandle.undoCustomLinkAction();
- } else if (lastBlacklistedTile != null) {
- ntpApiHandle.undoMostVisitedDeletion(lastBlacklistedTile);
- }
-}
-
-/**
- * Callback for embeddedSearch.newTabPage.onupdatecustomlinkdone. Called when
- * the custom link was successfully updated. Shows the "Shortcut edited"
- * notification.
- * @param {boolean} success True if the link was successfully updated.
- */
-function onUpdateCustomLinkDone(success) {
- if (success) {
- showNotification(configData.translatedStrings.linkEditedMsg);
- } else {
- showErrorNotification(
- configData.translatedStrings.linkCantEdit, null, null);
- }
-}
-
-/**
- * Called by tests to override the executable timeout with a test timeout.
- * @param {!Function} timeout The timeout function. Requires a boolean param.
- */
-function overrideExecutableTimeoutForTesting(timeout) {
- createExecutableTimeout = timeout;
-}
-
-/**
- * @param {string} input
- */
-function queryAutocomplete(input) {
- lastQueriedInput = input;
- const preventInlineAutocomplete = isDeletingInput || pastedInRealbox ||
- $(IDS.REALBOX).selectionStart !== input.length; // Caret not at the end.
- window.chrome.embeddedSearch.searchBox.queryAutocomplete(
- input, preventInlineAutocomplete);
-}
-
-/**
- * @param {!Element} element
- * @param {!Array<string>} keys
- * @param {!function(Event)} handler
- */
-function registerKeyHandler(element, keys, handler) {
- element.addEventListener('keydown', e => {
- if (keys.includes(e.key)) {
- handler(e);
- }
- });
-}
-
-/**
- * Fetches new data (RIDs) from the embeddedSearch.newTabPage API and passes
- * them to the iframe.
- */
-function reloadTiles() {
- // Don't attempt to load tiles if the MV data isn't available yet - this can
- // happen occasionally, see https://crbug.com/794942. In that case, we should
- // get an onMostVisitedChange call once they are available.
- // Note that MV data being available is different from having > 0 tiles. There
- // can legitimately be 0 tiles, e.g. if the user blacklisted them all.
- if (!ntpApiHandle.mostVisitedAvailable) {
- return;
- }
-
- const pages = ntpApiHandle.mostVisited;
- const cmds = [];
- const maxNumTiles = customLinksEnabled() ? MAX_NUM_TILES_CUSTOM_LINKS :
- MAX_NUM_TILES_MOST_VISITED;
- for (let i = 0; i < Math.min(maxNumTiles, pages.length); ++i) {
- cmds.push({cmd: 'tile', rid: pages[i].rid});
- }
- cmds.push({cmd: 'show'});
-
- $(IDS.MOST_VISITED).hidden =
- !chrome.embeddedSearch.newTabPage.areShortcutsVisible;
-
- const iframe = $(IDS.TILES_IFRAME);
- if (iframe) {
- iframe.contentWindow.postMessage(cmds, '*');
- }
-}
-
-/**
- * @param {!Array<!AutocompleteMatch>} matches
- * @param {!Object<!SuggestionGroup>} suggestionGroupsMap
- */
-function renderAutocompleteMatches(matches, suggestionGroupsMap) {
- const realboxMatchesEl = document.createElement('div');
- realboxMatchesEl.setAttribute('role', 'listbox');
-
- const newMatchEls = [];
- suggestionGroupElsMap = {};
-
- /**
- * Creates and returns an action button that once clicked invokes |callback|.
- * @param {!function()} callback
- */
- function createActionButton(callback) {
- const icon = document.createElement('div');
- icon.classList.add(CLASSES.REMOVE_ICON);
- const action = document.createElement('button');
- action.classList.add(CLASSES.REMOVE_MATCH);
- action.appendChild(icon);
- action.onmousedown = e => {
- e.preventDefault(); // Stops default browser action (focus)
- };
- action.onauxclick = e => {
- if (e.button == 1) {
- // Middle click on delete should just noop for now (matches omnibox).
- e.preventDefault();
- }
- };
- action.onclick = e => {
- callback();
- e.preventDefault(); // Stops default browser action (navigation)
- };
-
- return action;
- }
-
- /**
- * Creates and returns an element to contain the header as well as the matches
- * belonging to |suggestionGroupId|.
- * @param {number} suggestionGroupId
- */
- function createSuggestionGroupEl(suggestionGroupId) {
- if (suggestionGroupElsMap[suggestionGroupId]) {
- return suggestionGroupElsMap[suggestionGroupId];
- }
-
- const suggestionGroup = assert(suggestionGroupsMap[suggestionGroupId]);
-
- /**
- * Updates the tooltip and a11y label of the suggestion group toggle button.
- * @param {!Element} toggleButtonEl
- * @param {boolean} groupIsHidden
- */
- function updateToggleButtonA11y(toggleButtonEl, groupIsHidden) {
- toggleButtonEl.title = groupIsHidden ?
- configData.translatedStrings.showSuggestions :
- configData.translatedStrings.hideSuggestions;
- toggleButtonEl.ariaLabel = utils.substituteString(
- groupIsHidden ? configData.translatedStrings.showSection :
- configData.translatedStrings.hideSection,
- suggestionGroup.header);
- }
-
- const groupEl = document.createElement('div');
- groupEl.classList.toggle(CLASSES.COLLAPSED, suggestionGroup.hidden);
- const headerEl = document.createElement('a');
- headerEl.classList.add(CLASSES.HEADER);
- // The header cannot be tabbed into but it will get focus when clicked;
- // preventing the popup from losing focus and closing as a result.
- headerEl.tabIndex = -1;
- headerEl.append(document.createTextNode(suggestionGroup.header));
-
- const toggle = createActionButton(() => {
- groupEl.classList.toggle(CLASSES.COLLAPSED);
- updateToggleButtonA11y(
- toggle, groupEl.classList.contains(CLASSES.COLLAPSED));
- window.chrome.embeddedSearch.searchBox.toggleSuggestionGroupIdVisibility(
- suggestionGroupId);
- });
- updateToggleButtonA11y(toggle, suggestionGroup.hidden);
- headerEl.appendChild(toggle);
- realboxMatchesEl.classList.add(CLASSES.REMOVABLE);
-
- groupEl.appendChild(headerEl);
- realboxMatchesEl.appendChild(groupEl);
- suggestionGroupElsMap[suggestionGroupId] = groupEl;
- return groupEl;
- }
-
- for (let i = 0; i < matches.length; ++i) {
- const match = matches[i];
- const matchEl = document.createElement('a');
- matchEl.href = match.destinationUrl;
- matchEl.setAttribute('role', 'option');
-
- matchEl.onclick = matchEl.onauxclick = e => {
- if (!e.isTrusted || e.defaultPrevented || e.button > 1) {
- // Don't re-handle events dispatched from navigateToMatch(). Ignore
- // already handled events (i.e. remove button, defaultPrevented). Ignore
- // right clicks (but do handle middle click, button == 1).
- return;
- }
- const target = /** @type {Element} */ (e.target);
- const link = findAncestor(target, el => el.nodeName === 'A');
- if (link === matchEl) {
- navigateToMatch(match, e);
- }
- };
-
- const hasImage = !!match.imageUrl;
- if (hasImage) {
- matchEl.classList.add(CLASSES.HAS_IMAGE);
- }
-
- if (hasImage) {
- const imageContainer = document.createElement('div');
- imageContainer.classList.add(CLASSES.IMAGE_CONTAINER);
-
- if (faviconOrImageUrlToDataUrlCache[match.imageUrl]) {
- const imageEl = document.createElement('img');
- imageEl.classList.add(CLASSES.MATCH_IMAGE);
- imageEl.src = faviconOrImageUrlToDataUrlCache[match.imageUrl];
- imageContainer.appendChild(imageEl);
- } else if (match.imageDominantColor) {
- // .25 Opacity matching c/b/u/views/omnibox/omnibox_match_cell_view.cc
- imageContainer.style.backgroundColor = match.imageDominantColor + '40';
- }
- matchEl.appendChild(imageContainer);
- } else {
- const iconEl = document.createElement('div');
- iconEl.classList.add(CLASSES.MATCH_ICON);
- if (faviconOrImageUrlToDataUrlCache[match.destinationUrl]) {
- setBackgroundImageByUrl(
- iconEl, faviconOrImageUrlToDataUrlCache[match.destinationUrl]);
- } else if (match.type == DOCUMENT_MATCH_TYPE) {
- // Document matches use colored SVG icons.
- setBackgroundImageByUrl(iconEl, match.iconUrl);
- } else {
- setWebkitMaskImageByUrl(iconEl, match.iconUrl);
- }
- matchEl.appendChild(iconEl);
- }
-
- const contentsEl =
- renderMatchClassifications(match.contents, match.contentsClass);
- let descriptionEl;
- let separatorEl;
- let separatorText = '';
-
- if (match.description) {
- descriptionEl =
- renderMatchClassifications(match.description, match.descriptionClass);
- descriptionEl.classList.add(CLASSES.DESCRIPTION);
- if (hasImage) {
- descriptionEl.classList.add(CLASSES.DIM);
- } else {
- separatorText = configData.translatedStrings.realboxSeparator;
- separatorEl = document.createTextNode(separatorText);
- }
- }
-
- const ariaLabel = match.swapContentsAndDescription ?
- match.description + separatorText + match.contents :
- match.contents + separatorText + match.description;
- matchEl.setAttribute('aria-label', ariaLabel);
-
- const layout = match.swapContentsAndDescription ?
- [descriptionEl, separatorEl, contentsEl] :
- [contentsEl, separatorEl, descriptionEl];
-
- for (const colEl of layout) {
- if (colEl) {
- matchEl.appendChild(colEl);
- }
- }
-
- if (match.supportsDeletion) {
- const remove = createActionButton(() => {
- window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(i);
- });
- remove.title = configData.translatedStrings.removeSuggestion;
- matchEl.appendChild(remove);
- realboxMatchesEl.classList.add(CLASSES.REMOVABLE);
- }
-
- if (match.suggestionGroupId &&
- match.suggestionGroupId !== NO_SUGGESTION_GROUP_ID) {
- const groupEl = createSuggestionGroupEl(match.suggestionGroupId);
- groupEl.append(matchEl);
- } else {
- realboxMatchesEl.append(matchEl);
- }
- newMatchEls.push(matchEl);
- }
-
- if (charTypedTime) {
- window.chrome.embeddedSearch.searchBox.logCharTypedToRepaintLatency(
- Math.floor(window.performance.now() - charTypedTime));
- charTypedTime = 0;
- }
-
- // When the matches are replaced, the focus gets dropped temporariliy as the
- // focused element is being deleted from the DOM. Stop listening to 'focusout'
- // event and restore it immediately after since we don't want to stop
- // autocomplete in those cases.
- const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
- realboxWrapper.removeEventListener('focusout', onRealboxWrapperFocusOut);
-
- $(IDS.REALBOX_MATCHES).remove();
- realboxMatchesEl.id = IDS.REALBOX_MATCHES;
- realboxMatchesEl.addEventListener('focusin', onRealboxMatchesFocusIn);
-
- realboxWrapper.appendChild(realboxMatchesEl);
- matchEls = newMatchEls;
-
- realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
-
- const hasMatches = matches.length > 0;
- setRealboxMatchesVisible(hasMatches);
-}
-
-/**
- * @param {string} text
- * @param {!Array<!ACMatchClassification>} classifications
- * @return {!Element}
- */
-function renderMatchClassifications(text, classifications) {
- return classifications
- .map((classification, i) => {
- const classes = classificationStyleToClasses(classification.style);
- const next = classifications[i + 1] || {offset: text.length};
- const classifiedText =
- text.substring(classification.offset, next.offset);
- return classes.length ? spanWithClasses(classifiedText, classes) :
- document.createTextNode(classifiedText);
- })
- .reduce((container, currentEl) => {
- container.appendChild(currentEl);
- return container;
- }, document.createElement('span'));
-}
-
-/**
- * Updates the OneGoogleBar (if it is loaded) based on the current theme.
- * TODO(crbug.com/918582): Add support for OGB dark mode.
- */
-function renderOneGoogleBarTheme() {
- if (!window.gbar) {
- return;
- }
- try {
- const oneGoogleBarApi = window.gbar.a;
- const oneGoogleBarPromise = oneGoogleBarApi.bf();
- oneGoogleBarPromise.then(function(oneGoogleBar) {
- const setForegroundStyle = oneGoogleBar.pc.bind(oneGoogleBar);
- const ntpTheme = getNtpTheme();
- setForegroundStyle(ntpTheme && ntpTheme.isNtpBackgroundDark ? 1 : 0);
- });
- } catch (err) {
- console.log('Failed setting OneGoogleBar theme:\n' + err);
- }
-}
-
-/** Updates the NTP based on the current theme. */
-function renderTheme() {
- const theme = getNtpTheme();
- if (!theme) {
- return;
- }
-
- // Update dark mode styling.
- isDarkModeEnabled = window.matchMedia('(prefers-color-scheme: dark)').matches;
- document.body.classList.toggle('light-chip', !getUseDarkChips(theme));
-
- // Dark mode uses a white Google logo.
- const useWhiteLogo =
- theme.alternateLogo || (theme.usingDefaultTheme && isDarkModeEnabled);
- document.body.classList.toggle(CLASSES.ALTERNATE_LOGO, useWhiteLogo);
-
- if (theme.logoColor) {
- document.body.style.setProperty(
- '--logo-color', convertToRGBAColor(theme.logoColor));
- }
-
- // The doodle shouldn't be shown for non-default backgrounds. This includes
- // non-white backgrounds, excluding dark mode gray if dark mode is enabled.
- document.body.classList.toggle(
- CLASSES.DONT_SHOW_DOODLE, !theme.usingDefaultTheme || !!theme.imageUrl);
-
- // If a custom background has been selected the image will be applied to the
- // custom-background element instead of the body.
- if (!theme.customBackgroundConfigured) {
- document.body.style.background = [
- convertToRGBAColor(theme.backgroundColorRgba), theme.imageUrl,
- theme.imageTiling, theme.imageHorizontalAlignment,
- theme.imageVerticalAlignment
- ].join(' ').trim();
-
- $(IDS.CUSTOM_BG).style.opacity = '0';
- $(IDS.CUSTOM_BG).style.backgroundImage = '';
- customize.clearAttribution();
- } else {
- // Do anything only if the custom background changed.
- const imageUrl = assert(theme.imageUrl);
- if (!$(IDS.CUSTOM_BG).style.backgroundImage.includes(imageUrl)) {
- const imageWithOverlay = [
- customize.CUSTOM_BACKGROUND_OVERLAY, 'url(' + imageUrl + ')'
- ].join(',').trim();
- // If the theme update is because of uploading a local image then we
- // should close the customization menu. Closing the menu before the image
- // is selected doesn't look good.
- const localImageFileName = 'background.jpg';
- if (!configData.richerPicker &&
- imageWithOverlay.includes(localImageFileName)) {
- customize.closeCustomizationDialog();
- }
- // |image| and |imageWithOverlay| use the same url as their source.
- // Waiting to display the custom background until |image| is fully
- // loaded ensures that |imageWithOverlay| is also loaded.
- $(IDS.CUSTOM_BG).style.backgroundImage = imageWithOverlay;
- const image = new Image();
- image.onload = function() {
- $(IDS.CUSTOM_BG).style.opacity = '1';
- };
- image.src = imageUrl;
-
- customize.clearAttribution();
- customize.setAttribution(
- '' + theme.attribution1, '' + theme.attribution2,
- '' + theme.attributionActionUrl);
- }
- }
-
- updateThemeAttribution(theme.attributionUrl, theme.imageHorizontalAlignment);
- setCustomThemeStyle(theme);
-
- $(customize.IDS.RESTORE_DEFAULT)
- .classList.toggle(
- customize.CLASSES.OPTION_DISABLED, !theme.customBackgroundConfigured);
- $(customize.IDS.RESTORE_DEFAULT).tabIndex =
- (theme.customBackgroundConfigured ? 0 : -1);
-
- $(customize.IDS.EDIT_BG)
- .classList.toggle(
- CLASSES.ENTRY_POINT_ENHANCED, !theme.customBackgroundConfigured);
-
- if (configData.isGooglePage) {
- customize.onThemeChange();
- }
-
- if (configData.realboxMatchOmniboxTheme) {
- // TODO(dbeam): actually get these from theme service.
- const removeMatchHovered = assert(theme.searchBox.icon).slice();
- removeMatchHovered[3] = .16 * 255;
-
- const removeMatchSelectedHovered =
- assert(theme.searchBox.iconSelected).slice();
- removeMatchSelectedHovered[3] = .16 * 255;
-
- const removeMatchFocused = theme.searchBox.iconSelected.slice();
- removeMatchFocused[3] = .32 * 255;
-
- /**
- * @param {string} varName
- * @param {!Array<number>|undefined} colors
- */
- const setCssVar = (varName, colors) => {
- const rgba = convertToRGBAColor(assert(colors));
- document.body.style.setProperty(`--${varName}`, rgba);
- };
-
- setCssVar('search-box-bg', theme.searchBox.bg);
- setCssVar('search-box-icon', theme.searchBox.icon);
- setCssVar('search-box-icon-selected', theme.searchBox.iconSelected);
- setCssVar('search-box-placeholder', theme.searchBox.placeholder);
- setCssVar('search-box-results-bg', theme.searchBox.resultsBg);
- setCssVar(
- 'search-box-results-bg-hovered', theme.searchBox.resultsBgHovered);
- setCssVar(
- 'search-box-results-bg-selected', theme.searchBox.resultsBgSelected);
- setCssVar('search-box-results-dim', theme.searchBox.resultsDim);
- setCssVar(
- 'search-box-results-dim-selected', theme.searchBox.resultsDimSelected);
- setCssVar('search-box-results-text', theme.searchBox.resultsText);
- setCssVar(
- 'search-box-results-text-selected',
- theme.searchBox.resultsTextSelected);
- setCssVar('search-box-results-url', theme.searchBox.resultsUrl);
- setCssVar(
- 'search-box-results-url-selected', theme.searchBox.resultsUrlSelected);
- setCssVar('search-box-text', theme.searchBox.text);
- setCssVar('remove-match-hovered', removeMatchHovered);
- setCssVar('remove-match-selected-hovered', removeMatchSelectedHovered);
- setCssVar('remove-match-focused', removeMatchFocused);
- }
-}
-
-/**
- * Request data for search suggestions, promo, and the OGB. Insert it into
- * the page once it's available. For search suggestions this should be almost
- * immediately as cached data is always used. Promos and the OGB may need
- * to wait for the asynchronous network request to complete.
- */
-function requestAndInsertGoogleResources() {
- if (!$('search-suggestions-loader')) {
- const ssScript = document.createElement('script');
- ssScript.id = 'search-suggestions-loader';
- ssScript.src = 'chrome-search://local-ntp/search-suggestions.js';
- ssScript.async = false;
- document.body.appendChild(ssScript);
- ssScript.onload = function() {
- injectSearchSuggestions(searchSuggestions);
- };
- }
- if (!$('one-google-loader')) {
- // Load the OneGoogleBar script. It'll create a global variable |og| which
- // is a JSON object corresponding to the native OneGoogleBarData type.
- const ogScript = document.createElement('script');
- ogScript.id = 'one-google-loader';
- ogScript.src = 'chrome-search://local-ntp/one-google.js';
- document.body.appendChild(ogScript);
- ogScript.onload = function() {
- injectOneGoogleBar(og);
- };
- }
- if (!$('promo-loader')) {
- const promoScript = document.createElement('script');
- promoScript.id = 'promo-loader';
- promoScript.src = 'chrome-search://local-ntp/promo.js';
- document.body.appendChild(promoScript);
- promoScript.onload = function() {
- injectPromo(promo);
- };
- }
-}
-
-/**
- * @param {!EventTarget} matchElToSelect
- * @return {number} The selected index (if found); else -1.
- */
-function selectMatchEl(matchElToSelect) {
- let selectedIndex = -1;
- Array.from(matchEls).forEach((matchEl, i) => {
- const found = matchEl === matchElToSelect;
- matchEl.classList.toggle(CLASSES.SELECTED, found);
- matchEl.setAttribute('aria-selected', found);
- if (found) {
- selectedIndex = i;
- }
- });
-
- const matches = autocompleteResult ? autocompleteResult.matches : [];
- setRealboxIcon(matches[selectedIndex]);
-
- return selectedIndex;
-}
-
-/** Sends the current theme info to the most visited iframe. */
-function sendNtpThemeToMostVisitedIframe() {
- const info = getNtpTheme();
- if (!info) {
- return;
- }
-
- const message = {cmd: 'updateTheme'};
- message.isThemeDark = info.isNtpBackgroundDark;
- message.customBackground = info.customBackgroundConfigured;
- message.useTitleContainer = info.useTitleContainer;
- message.iconBackgroundColor = convertToRGBAColor(info.iconBackgroundColor);
- message.useWhiteAddIcon = info.useWhiteAddIcon;
-
- let titleColor = NTP_DESIGN.titleColor;
- if (!info.usingDefaultTheme && info.textColorRgba) {
- titleColor = info.textColorRgba;
- } else if (info.isNtpBackgroundDark) {
- titleColor = NTP_DESIGN.titleColorAgainstDark;
- }
- message.tileTitleColor = convertToRGBAColor(titleColor);
-
- const iframe = $(IDS.TILES_IFRAME);
- if (iframe) {
- iframe.contentWindow.postMessage(message, '*');
- }
-}
-
-/**
- * Sets the visibility of the theme attribution.
- * @param {boolean} show True to show the attribution.
- */
-function setAttributionVisibility(show) {
- $(IDS.ATTRIBUTION).style.display = show ? '' : 'none';
-}
-
-/**
- * Updates the NTP style according to theme.
- * @param {Object} ntpTheme The information about the theme.
- */
-function setCustomThemeStyle(ntpTheme) {
- let textColor = '';
- let textColorLight = '';
- let mvxFilter = '';
- if (!ntpTheme.usingDefaultTheme) {
- textColor = convertToRGBAColor(ntpTheme.textColorRgba);
- textColorLight = convertToRGBAColor(ntpTheme.textColorLightRgba);
- mvxFilter = 'drop-shadow(0 0 0 ' + textColor + ')';
- }
-
- document.body.style.setProperty('--text-color', textColor);
- document.body.style.setProperty('--text-color-light', textColorLight);
-}
-
-/**
- * @param {boolean} focus True to show a dragging focus on the fakebox.
- */
-function setFakeboxDragFocus(focus) {
- document.body.classList.toggle(CLASSES.FAKEBOX_DRAG_FOCUS, focus);
-}
-
-/**
- * @param {boolean} focus True to focus the fakebox.
- */
-function setFakeboxFocus(focus) {
- document.body.classList.toggle(CLASSES.FAKEBOX_FOCUS, focus);
-}
-
-/**
- * @param {boolean} show True to show the fakebox and logo.
- */
-function setFakeboxVisibility(show) {
- document.body.classList.toggle(CLASSES.HIDE_FAKEBOX, !show);
-}
-
-/**
- * @param {!Element} element
- * @param {string} url
- */
-function setBackgroundImageByUrl(element, url) {
- element.style.webkitMaskImage = '';
- element.style.backgroundImage = `url(${url})`;
- element.style.backgroundColor = 'transparent';
-}
-
-/**
- * @param {!Element} element
- * @param {string} url
- */
-function setWebkitMaskImageByUrl(element, url) {
- element.style.webkitMaskImage = `url(${url})`;
- element.style.backgroundImage = '';
- element.style.backgroundColor = '';
-}
-
-/** @param {!AutocompleteMatch|undefined} match */
-function setRealboxIcon(match) {
- const realboxIcon = $(IDS.REALBOX_ICON);
- if (match && !match.isSearchType) {
- // if the selected match is a navigation match and has a favicon loaded,
- // display the favicon. Otherwise display the match icon.
- if (faviconOrImageUrlToDataUrlCache[match.destinationUrl]) {
- realboxIcon.dataset.icon = '';
- setBackgroundImageByUrl(
- realboxIcon, faviconOrImageUrlToDataUrlCache[match.destinationUrl]);
- } else if (match.type == DOCUMENT_MATCH_TYPE) {
- realboxIcon.dataset.icon = match.iconUrl;
- // Document matches use colored SVG icons.
- setBackgroundImageByUrl(realboxIcon, realboxIcon.dataset.icon);
- } else {
- realboxIcon.dataset.icon = match.iconUrl;
- setWebkitMaskImageByUrl(realboxIcon, realboxIcon.dataset.icon);
- }
- } else if (configData.useGoogleGIcon) {
- // if google_g icon should be used (as the default icon and search matches),
- // display the default icon which is set to the google_g icon.
- /** @suppress {missingProperties} */
- realboxIcon.dataset.icon = realboxIcon.dataset.defaultIcon;
- setBackgroundImageByUrl(realboxIcon, realboxIcon.dataset.icon);
- } else {
- // if no match is selected, display the default icon. Otherwise display the
- // match icon.
- /** @suppress {missingProperties} */
- realboxIcon.dataset.icon =
- match ? match.iconUrl : realboxIcon.dataset.defaultIcon;
- setWebkitMaskImageByUrl(realboxIcon, realboxIcon.dataset.icon);
- }
-}
-
-/** @param {boolean} visible */
-function setRealboxMatchesVisible(visible) {
- $(IDS.REALBOX_INPUT_WRAPPER).classList.toggle(CLASSES.SHOW_MATCHES, visible);
-}
-
-/**
- * Shows the error pop-up notification and triggers a delay to hide it. The
- * message will be set to |msg|. If |linkName| and |linkOnClick| are present,
- * shows an error link with text set to |linkName| and onclick handled by
- * |linkOnClick|.
- * @param {string} msg The notification message.
- * @param {?string} linkName The error link text.
- * @param {?Function} linkOnClick The error link onclick handler.
- */
-function showErrorNotification(msg, linkName, linkOnClick) {
- const notification = $(IDS.ERROR_NOTIFICATION);
- $(IDS.ERROR_NOTIFICATION_MSG).textContent = msg;
- if (linkName && linkOnClick) {
- const notificationLink = $(IDS.ERROR_NOTIFICATION_LINK);
- notificationLink.textContent = linkName;
- notificationLink.onclick = linkOnClick;
- notification.classList.add(CLASSES.HAS_LINK);
- } else {
- notification.classList.remove(CLASSES.HAS_LINK);
- }
- floatUpNotification(notification, $(IDS.ERROR_NOTIFICATION_CONTAINER));
-}
-
-/**
- * Shows the Most Visited pop-up notification and triggers a delay to hide it.
- * The message will be set to |msg|.
- * @param {string} msg The notification message.
- */
-function showNotification(msg) {
- $(IDS.NOTIFICATION_MESSAGE).textContent = msg;
- $(IDS.RESTORE_ALL_LINK).textContent = customLinksEnabled() ?
- configData.translatedStrings.restoreDefaultLinks :
- configData.translatedStrings.restoreThumbnailsShort;
- floatUpNotification($(IDS.NOTIFICATION), $(IDS.NOTIFICATION_CONTAINER));
- $(IDS.UNDO_LINK).focus();
-}
-
-function showPromoIfNotOverlapping() {
- $(IDS.PROMO).style.visibility = isPromoOverlapping() ? 'hidden' : 'visible';
-}
-
-function showPromoIfNotOverlappingAndTrackResizes() {
- showPromoIfNotOverlapping();
- // The removal before addition is to ensure only 1 event listener is ever
- // active at the same time.
- window.removeEventListener('resize', showPromoIfNotOverlapping);
- window.addEventListener('resize', showPromoIfNotOverlapping);
-}
-
-/**
- * @param {string} text
- * @param {!Array<string>} classes
- * @return {!Element}
- */
-function spanWithClasses(text, classes) {
- const span = document.createElement('span');
- span.classList.add(...classes);
- span.textContent = text;
- return span;
-}
-
-/** @param {!RealboxOutputUpdate} update */
-function updateRealboxOutput(update) {
- assert(Object.keys(update).length > 0);
-
- const realboxEl = $(IDS.REALBOX);
- const newOutput =
- /** @type {!RealboxOutput} */ (Object.assign({}, lastOutput, update));
- const newAll = newOutput.text + newOutput.inline;
-
- const inlineDiffers = newOutput.inline !== lastOutput.inline;
- const preserveSelection = !inlineDiffers && !update.moveCursorToEnd;
- let needsSelectionUpdate = !preserveSelection;
-
- const oldSelectionStart = realboxEl.selectionStart;
-
- if (newAll !== realboxEl.value) {
- realboxEl.value = newAll;
- needsSelectionUpdate = true; // Setting .value blows away selection.
- }
-
- if (newAll.trim() && needsSelectionUpdate) {
- realboxEl.selectionStart =
- preserveSelection ? oldSelectionStart : newOutput.text.length;
- // If the selection shouldn't be preserved, set the selection end to the
- // same as the selection start (i.e. drop selection but move cursor).
- realboxEl.selectionEnd =
- preserveSelection ? oldSelectionStart : newAll.length;
- }
-
- isDeletingInput = userDeletedOutput(lastOutput, newOutput);
- lastOutput = newOutput;
-}
-
-/**
- * Renders the attribution if the URL is present, otherwise hides it.
- * @param {string|undefined} url The URL of the attribution image, if any.
- * @param {string|undefined} themeBackgroundAlignment The alignment of the theme
- * background image. This is used to compute the attribution's alignment.
- */
-function updateThemeAttribution(url, themeBackgroundAlignment) {
- if (!url) {
- setAttributionVisibility(false);
- return;
- }
-
- const attribution = $(IDS.ATTRIBUTION);
- let attributionImage = attribution.querySelector('img');
- if (!attributionImage) {
- attributionImage = new Image();
- attribution.appendChild(attributionImage);
- }
- attributionImage.style.content = url;
-
- // To avoid conflicts, place the attribution on the left for themes that
- // right align their background images.
- attribution.classList.toggle(
- CLASSES.LEFT_ALIGN_ATTRIBUTION, themeBackgroundAlignment == 'right');
- setAttributionVisibility(true);
-}
-
-/**
- * @param {!RealboxOutput} before
- * @param {!RealboxOutput} after
- * @return {boolean}
- */
-function userDeletedOutput(before, after) {
- const beforeAll = before.text + before.inline;
- const afterAll = after.text + after.inline;
- return beforeAll.length > afterAll.length && beforeAll.startsWith(afterAll);
-}
-
-return {
- init: init, // Exposed for testing.
- listen: listen,
- disableIframesAndVoiceSearchForTesting:
- disableIframesAndVoiceSearchForTesting,
- overrideExecutableTimeoutForTesting: overrideExecutableTimeoutForTesting
-};
-}
-
-if (!window.localNTPUnitTest) {
- LocalNTP().listen();
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp_common.css b/chromium/chrome/browser/resources/local_ntp/local_ntp_common.css
deleted file mode 100644
index 0f89aa12292..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp_common.css
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Copyright 2019 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-html {
- /* Material Design colors. Keep in sync with ui/gfx/color_palette.h. */
-
- --dark-mode-bg-rgb: 53, 54, 58;
- --dark-mode-dialog-rgb: 41, 42, 45;
-
- /* Google Grey */
- --GG050-rgb: 248, 249, 250;
- --GG100-rgb: 241, 243, 244;
- --GG200-rgb: 232, 234, 237;
- --GG300-rgb: 218, 220, 224;
- --GG400-rgb: 189, 193, 198;
- --GG500-rgb: 154, 160, 166;
- --GG600-rgb: 128, 134, 139;
- --GG700-rgb: 95, 99, 104;
- --GG800-rgb: 60, 64, 67;
- --GG900-rgb: 32, 33, 36;
-
- /* Google Blue */
- --GB050-rgb: 232, 240, 254;
- --GB100-rgb: 210, 227, 252;
- --GB200-rgb: 174, 203, 250;
- --GB300-rgb: 138, 180, 248;
- --GB400-rgb: 102, 157, 246;
- --GB500-rgb: 66, 133, 244;
- --GB600-rgb: 26, 115, 232;
- --GB700-rgb: 25, 103, 210;
- --GB800-rgb: 24, 90, 188;
- --GB900-rgb: 23, 78, 166;
- --GB400-dark-rgb: 107, 165, 237;
- --GB600-dark-rgb: 37, 129, 223;
-
- /* Google Red */
- --GR050-rgb: 252, 142, 230;
- --GR100-rgb: 250, 210, 207;
- --GR200-rgb: 246, 174, 169;
- --GR300-rgb: 242, 139, 130;
- --GR400-rgb: 238, 103, 92;
- --GR500-rgb: 234, 67, 53;
- --GR600-rgb: 217, 48, 37;
- --GR700-rgb: 197, 34, 31;
- --GR800-rgb: 179, 20, 18;
- --GR900-rgb: 165, 14, 14;
- --GR500-dark-rgb: 230, 106, 94;
- --GR600-dark-rgb: 211, 59, 48;
- --GR800-dark-rgb: 180, 27, 26;
-
- --dark-mode-shadow: 0 1px 3px 0 rgba(0, 0, 0, .3),
- 0 4px 8px 3px rgba(0, 0, 0, .15);
-}
-
-body * {
- /* Default font families for Linux and ChromeOS. */
- font-family: 'Roboto', arial, sans-serif;
-}
-
-.win * {
- /* Default font families for Windows */
- font-family: 'Segoe UI', 'Roboto', arial, sans-serif;
-}
-
-.mac * {
- /* Default font families for MacOS */
- font-family: system-ui, BlinkMacSystemFont, 'Roboto', arial, sans-serif;
-}
-
-/* Removes blue focus ring on mouse navigation */
-.mouse-navigation {
- outline: none;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp_resources.grd b/chromium/chrome/browser/resources/local_ntp/local_ntp_resources.grd
index d751f1aa9cd..3a5b8c7edab 100644
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp_resources.grd
+++ b/chromium/chrome/browser/resources/local_ntp/local_ntp_resources.grd
@@ -8,35 +8,9 @@
</outputs>
<release seq="1">
<includes>
- <include name="IDR_CUSTOM_LINKS_ADD_SVG" file="icons\add_link.svg" type="BINDATA" />
- <include name="IDR_CUSTOM_LINKS_ADD_WHITE_SVG" file="icons\add_link_white.svg" type="BINDATA" />
- <include name="IDR_CUSTOM_LINKS_EDIT_HTML" file="custom_links_edit.html" type="BINDATA" />
- <include name="IDR_CUSTOM_LINKS_EDIT_CSS" file="custom_links_edit.css" type="BINDATA" />
- <include name="IDR_CUSTOM_LINKS_EDIT_JS" file="custom_links_edit.js" type="BINDATA" />
- <include name="IDR_CUSTOM_LINKS_EDIT_MENU_SVG" file="icons\edit_menu.svg" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_COMMON_CSS" file="local_ntp_common.css" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_ANIMATIONS_CSS" file="animations.css" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_ANIMATIONS_JS" file="animations.js" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_CSS" file="local_ntp.css" flattenhtml="true" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_CUSTOMIZE_CSS" file="customize.css" flattenhtml="true" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_CUSTOMIZE_JS" file="customize.js" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_DOODLES_CSS" file="doodles.css" flattenhtml="true" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_DOODLES_JS" file="doodles.js" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_HTML" file="local_ntp.html" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_JS" file="local_ntp.js" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_UTILS_JS" file="utils.js" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_VOICE_CSS" file="voice.css" type="BINDATA" />
- <include name="IDR_LOCAL_NTP_VOICE_JS" file="voice.js" type="BINDATA" />
- <include name="IDR_MOST_VISITED_DONT_SHOW_PNG" file="icons\dont_show.png" type="BINDATA" />
- <include name="IDR_MOST_VISITED_DONT_SHOW_2X_PNG" file="icons\dont_show_2x.png" type="BINDATA" />
- <include name="IDR_MOST_VISITED_IFRAME_CSS" file="most_visited_iframe.css" type="BINDATA" />
- <include name="IDR_MOST_VISITED_SINGLE_CSS" file="most_visited_single.css" type="BINDATA" />
- <include name="IDR_MOST_VISITED_SINGLE_HTML" file="most_visited_single.html" type="BINDATA" />
- <include name="IDR_MOST_VISITED_SINGLE_JS" file="most_visited_single.js" type="BINDATA" />
<include name="IDR_MOST_VISITED_TITLE_CSS" file="most_visited_title.css" type="BINDATA" />
<include name="IDR_MOST_VISITED_TITLE_HTML" file="most_visited_title.html" type="BINDATA" />
<include name="IDR_MOST_VISITED_TITLE_JS" file="most_visited_title.js" type="BINDATA" />
- <include name="IDR_MOST_VISITED_UTIL_JS" file="most_visited_util.js" type="BINDATA" />
</includes>
</release>
</grit>
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_iframe.css b/chromium/chrome/browser/resources/local_ntp/most_visited_iframe.css
deleted file mode 100644
index 471542c5d9a..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_iframe.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2013 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-body {
- background: none transparent;
- margin: 0;
- overflow: hidden;
- user-select: none;
-}
-
-a {
- display: block;
- text-decoration: none;
-}
-
-a:active,
-a:hover,
-a:visited {
- color: inherit;
- text-decoration: inherit;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_single.css b/chromium/chrome/browser/resources/local_ntp/most_visited_single.css
deleted file mode 100644
index 7c3d32a4688..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_single.css
+++ /dev/null
@@ -1,330 +0,0 @@
-/* Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-html {
- /* Material Design constants */
- --md-edit-menu-size: 20px;
- --md-fallback-letter-size: 16px;
- --md-favicon-size: 32px;
- --md-icon-margin-bottom: 16px;
- --md-icon-size: 48px;
- --md-max-tiles-row: 5;
- --md-menu-margin-side: 2px;
- --md-menu-margin-top: 4px;
- --md-menu-size: 12px;
- --md-tile-margin: 16px;
- --md-tile-padding-top: 16px;
- --md-tile-size: 112px;
- --md-title-font-size: 12px;
- --md-title-height: 24px;
- --md-title-max-height: 28px;
-
- /* May be overridden by themes (on the body element). */
- --icon-background-color: rgb(var(--GG100-rgb));
- --tile-title-color: rgb(var(--GG800-rgb));
-}
-
-body {
- background: none transparent;
- color: var(--tile-title-color);
- margin: 0;
- overflow: hidden;
- padding: 0;
- user-select: none;
-}
-
-a {
- display: block;
-}
-
-a,
-a:active,
-a:hover,
-a:visited {
- text-decoration: none;
-}
-
-#most-visited {
- margin-top: 10px;
- text-align: -webkit-center;
- user-select: none;
- width: 100%;
-}
-
-#mv-tiles,
-.mv-tiles-old {
- font-size: 0;
- opacity: 0;
- position: relative;
- transition: opacity 300ms;
- user-select: none;
-}
-
-.mv-tiles-old {
- left: 0;
- margin: auto;
- position: absolute;
- right: 0;
-}
-
-.mouse-navigation {
- outline: none;
-}
-
-.grid-tile-container {
- position: absolute;
- transition: transform 300ms ease-in-out;
-}
-
-.grid-tile {
- transition: transform 300ms ease-in-out;
-}
-
-/* Prevent transitions on the held tile in order for it to smoothly follow the
- * mouse. */
-.reorder .grid-tile {
- transition-duration: 0s;
-}
-
-.reorder {
- z-index: 10; /* Ensure the held tile is visible. */
-}
-
-.md-tile {
- border-radius: 4px;
- box-sizing: border-box;
- color: rgb(var(--tile-title-color));
- cursor: pointer;
- height: var(--md-tile-size);
- margin-bottom: var(--md-tile-margin);
- opacity: 1;
- padding-top: var(--md-tile-padding-top);
- position: relative;
- transition-property:
- background, background-color, border-color, box-shadow, opacity, filter;
- width: var(--md-tile-size);
-}
-
-.md-empty-tile {
- display: none;
-}
-
-body:not(.reordering) .md-tile:hover,
-.reorder .md-tile {
- background-color: rgba(var(--GG900-rgb), .06);
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.reordering) .md-tile:hover,
- .reorder .md-tile {
- background-color: rgba(255, 255, 255, .1);
- }
-}
-
-body.dark-theme:not(.reordering) .md-tile:hover,
-body.dark-theme .reorder .md-tile {
- background-color: rgba(255, 255, 255, .1);
-}
-
-body:not(.reordering) .md-tile:hover .md-menu {
- opacity: 1;
- transition-delay: 500ms;
-}
-
-body.dark-theme:not(.reordering) .md-tile:active + .md-menu::after {
- background-color: rgb(var(--GG400-rgb));
- transition-delay: 0ms;
-}
-
-.blacklisted {
- margin: 0;
- padding: 0;
- transform: scale(0, 0);
- transition-duration: 200ms;
- transition-property: transform, box-shadow, margin, opacity, padding, width;
- width: 0;
-}
-
-.md-tile-inner {
- align-items: center;
- display: flex;
- flex-flow: column nowrap;
- height: 100%;
- position: relative;
- width: 100%;
- z-index: -1;
-}
-
-.md-icon {
- align-items: center;
- background-color: var(--icon-background-color);
- border-radius: 50%;
- display: flex;
- height: var(--md-icon-size);
- justify-content: center;
- margin-bottom: var(--md-icon-margin-bottom);
- width: var(--md-icon-size);
-}
-
-.md-add-icon {
- background-image: url(chrome-search://most-visited/add_link.svg);
- background-position: center;
- background-repeat: no-repeat;
-}
-
-.use-white-add-icon .md-add-icon {
- background-image: url(chrome-search://most-visited/add_link_white.svg);
-}
-
-.md-fallback-letter {
- background-color: rgb(var(--GG600-rgb));
- border-radius: 50%;
- color: white;
- font-size: var(--md-fallback-letter-size);
- height: var(--md-favicon-size);
- line-height: var(--md-favicon-size);
- text-align: center;
- width: var(--md-favicon-size);
-}
-
-.win .md-fallback-letter {
- font-weight: 600;
-}
-
-.md-title {
- font-size: var(--md-title-font-size);
- font-weight: 500;
- max-height: var(--md-title-max-height);
- overflow: hidden;
- text-align: center;
- text-overflow: ellipsis;
- white-space: nowrap;
- width: 88px;
-}
-
-.md-title span {
- line-height: var(--md-title-height);
-}
-
-/* Font weight on Mac and ChromeOS looks heavier on default background and
- * needs to be reduced. */
-body.mac-chromeos .md-title {
- font-weight: 400;
-}
-
-/* Apply when a custom background is set. */
-body.custom-background .md-title {
- filter: drop-shadow(0 0 6px rgba(0, 0, 0, .35));
-}
-
-/* Apply only when a theme with image is installed. */
-body.use-title-container .md-title {
- background-color: white;
- /* Necessary for a "pill" shape. Using 50% creates an oval. */
- border-radius: 500px;
- color: rgb(var(--GG800-rgb));
- filter: unset;
- padding: 0 8px;
-}
-
-.md-menu {
- background-color: transparent;
- border: none;
- cursor: pointer;
- height: var(--md-menu-size);
- margin: var(--md-menu-margin-top) var(--md-menu-margin-side);
- opacity: 0;
- position: absolute;
- right: 0;
- top: 0;
- width: var(--md-menu-size);
-}
-
-html[dir=rtl] .md-menu {
- left: 0;
- right: auto;
-}
-
-body:not(.reordering) .md-menu:active,
-body:not(.reordering) .md-menu:focus:not(.mouse-navigation) {
- opacity: 1;
-}
-
-/* We use ::after without content to provide the masked X element. */
-.md-menu::after {
- --mask-gap: 1px;
- --mask-width: calc(var(--md-menu-size) - 2 * var(--mask-gap));
- /* TODO(crbug.com/1012065): Use SVG for the "X" icon. */
- -webkit-mask-image: -webkit-image-set(
- url(chrome-search://most-visited/dont_show.png) 1x,
- url(chrome-search://most-visited/dont_show_2x.png) 2x);
- -webkit-mask-position: var(--mask-gap);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: var(--mask-width);
- background-color: rgb(var(--GG600-rgb));
- content: '';
- display: block;
- height: var(--md-menu-size);
- left: 0;
- position: absolute;
- top: 0;
- width: var(--md-menu-size);
-}
-
-@media (prefers-color-scheme: dark) {
- .md-menu::after {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-.md-edit-menu {
- height: var(--md-edit-menu-size);
- width: var(--md-edit-menu-size);
-}
-
-.md-edit-menu::after {
- --mask-width: var(--md-edit-menu-size);
- -webkit-mask-image: url(chrome-search://most-visited/edit_menu.svg);
- height: var(--md-edit-menu-size);
- width: var(--md-edit-menu-size);
-}
-
-body:not(.reordering) .md-menu:hover::after,
-body:not(.reordering) .md-menu:focus::after {
- background-color: rgb(var(--GG700-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- body:not(.reordering) .md-menu:hover::after,
- body:not(.reordering) .md-menu:focus::after {
- background-color: rgb(var(--GG400-rgb));
- }
-}
-
-body.dark-theme .md-tile .md-menu::after,
-body.dark-theme:not(.reordering) .md-menu:focus:not(.mouse-navigation)::after {
- background-color: white;
-}
-
-@media (prefers-color-scheme: dark) {
- body.dark-theme .md-tile .md-menu::after,
- body.dark-theme:not(.reordering)
- .md-menu:focus:not(.mouse-navigation)::after {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-body.dark-theme:not(.reordering) .md-menu:active::after,
-body.dark-theme:not(.reordering) .md-menu:hover::after,
-body.dark-theme:not(.reordering) .md-menu.mouse-navigation:focus::after {
- background-color: rgb(var(--GG300-rgb));
-}
-
-@media (prefers-color-scheme: dark) {
- body.dark-theme:not(.reordering) .md-menu:active::after,
- body.dark-theme:not(.reordering) .md-menu:hover::after,
- body.dark-theme:not(.reordering) .md-menu.mouse-navigation:focus::after {
- background-color: rgb(var(--GG400-rgb));
- }
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_single.html b/chromium/chrome/browser/resources/local_ntp/most_visited_single.html
deleted file mode 100644
index 0fa5b62d10b..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_single.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<html>
-<!-- Copyright 2015 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
-<head>
- <base target="_top">
- <meta charset="utf-8">
- <link rel="stylesheet" type="text/css" href="local-ntp-common.css">
- <link rel="stylesheet" type="text/css" href="single.css">
- <script src="assert.js"></script>
- <script src="utils.js"></script>
- <script src="single.js"></script>
-</head>
-<body>
- <!-- Keep in sync with most_visited_single_browsertest.html -->
- <div id="most-visited"></div>
-</body>
-</html>
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_single.js b/chromium/chrome/browser/resources/local_ntp/most_visited_single.js
deleted file mode 100644
index 0301be89b7a..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_single.js
+++ /dev/null
@@ -1,1236 +0,0 @@
-/**
- * @license
- * Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-// Single iframe for NTP tiles.
-
-/**
- * Controls rendering the Most Visited iframe.
- * @return {Object} A limited interface for testing the iframe.
- */
-function MostVisited() {
-'use strict';
-
-/**
- * Enum for key codes.
- * @enum {number}
- * @const
- */
-const KEYCODES = {
- BACKSPACE: 8,
- DELETE: 46,
- DOWN: 40,
- ENTER: 13,
- ESC: 27,
- LEFT: 37,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38,
-};
-
-/**
- * Enum for ids.
- * @enum {string}
- * @const
- */
-const IDS = {
- MOST_VISITED: 'most-visited', // Container for all tilesets.
- MV_TILES: 'mv-tiles', // Most Visited tiles container.
-};
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-const CLASSES = {
- FAILED_FAVICON: 'failed-favicon', // Applied when the favicon fails to load.
- GRID_TILE: 'grid-tile',
- GRID_TILE_CONTAINER: 'grid-tile-container',
- REORDER: 'reorder', // Applied to the tile being moved while reordering.
- // Applied while we are reordering. Disables hover styling.
- REORDERING: 'reordering',
- MAC_CHROMEOS: 'mac-chromeos', // Reduces font weight for MacOS and ChromeOS.
- // Material Design classes.
- MD_FALLBACK_LETTER: 'md-fallback-letter',
- MD_ICON: 'md-icon',
- MD_ADD_ICON: 'md-add-icon',
- MD_MENU: 'md-menu',
- MD_EDIT_MENU: 'md-edit-menu',
- MD_TILE: 'md-tile',
- MD_TILE_INNER: 'md-tile-inner',
- MD_TITLE: 'md-title',
-};
-
-/**
- * The different types of events that are logged from the NTP. This enum is
- * used to transfer information from the NTP JavaScript to the renderer and is
- * not used as a UMA enum histogram's logged value.
- * Note: Keep in sync with common/ntp_logging_events.h
- * @enum {number}
- * @const
- */
-const LOG_TYPE = {
- // All NTP tiles have finished loading (successfully or failing).
- NTP_ALL_TILES_LOADED: 11,
- // The 'Add shortcut' link was clicked.
- NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED: 44,
- // The 'Edit shortcut' link was clicked.
- NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED: 45,
-};
-
-/**
- * The different (visual) types that an NTP tile can have.
- * Note: Keep in sync with components/ntp_tiles/tile_visual_type.h
- * @enum {number}
- * @const
- */
-const TileVisualType = {
- NONE: 0,
- ICON_REAL: 1,
- ICON_COLOR: 2,
- ICON_DEFAULT: 3,
-};
-
-/**
- * Timeout delay for the window.onresize event throttle. Set to 15 frame per
- * second.
- * @const {number}
- */
-const RESIZE_TIMEOUT_DELAY = 66;
-
-/**
- * Maximum number of tiles if custom links is enabled.
- * @const {number}
- */
-const MD_MAX_NUM_CUSTOM_LINK_TILES = 10;
-
-/**
- * Maximum number of tiles if Most Visited is enabled.
- * @const {number}
- */
-const MD_MAX_NUM_MOST_VISITED_TILES = 8;
-
-/**
- * Maximum number of tiles per row for Material Design.
- * @const {number}
- */
-const MD_MAX_TILES_PER_ROW = 5;
-
-/**
- * Height of a tile for Material Design. Keep in sync with
- * most_visited_single.css.
- * @const {number}
- */
-const MD_TILE_HEIGHT = 128;
-
-/**
- * Width of a tile for Material Design. Keep in sync with
- * most_visited_single.css.
- * @const {number}
- */
-const MD_TILE_WIDTH = 112;
-
-/**
- * Number of tiles that will always be visible for Material Design. Calculated
- * by dividing minimum |--content-width| (see local_ntp.css) by |MD_TILE_WIDTH|
- * and multiplying by 2 rows.
- * @const {number}
- */
-const MD_NUM_TILES_ALWAYS_VISIBLE = 6;
-
-/**
- * The origin of this request, i.e. 'chrome-search://local-ntp' for the local
- * NTP.
- * @const {string}
- */
-const DOMAIN_ORIGIN = '{{ORIGIN}}';
-
-/**
- * Counter for DOM elements that we are waiting to finish loading. Starts out
- * at 1 because initially we're waiting for the "show" message from the parent.
- * @type {number}
- */
-let loadedCounter = 1;
-
-/**
- * DOM element containing the tiles we are going to present next.
- * Works as a double-buffer that is shown when we receive a "show" postMessage.
- * @type {Element}
- */
-let tiles = null;
-
-/**
- * List of parameters passed by query args.
- * @type {Object}
- */
-let queryArgs = {};
-
-/**
- * True if the custom links feature is enabled, i.e. when this is a Google NTP.
- * Set when the iframe is initialized.
- * @type {boolean}
- */
-let customLinksFeatureEnabled = false;
-
-/**
- * The current grid of tiles.
- * @type {?Grid}
- */
-let currGrid = null;
-
-/**
- * Additional API for Array. Moves the item at index |from| to index |to|.
- * @param {number} from Index of the item to move.
- * @param {number} to Index to move the item to.
- */
-Array.prototype.move = function(from, to) {
- this.splice(to, 0, this.splice(from, 1)[0]);
-};
-
-/**
- * Class that handles layouts and animations for the tile grid. This includes
- * animations for adding, deleting, and reordering.
- */
-class Grid {
- constructor() {
- /** @private {number} */
- this.tileHeight_ = 0;
- /** @private {number} */
- this.tileWidth_ = 0;
- /** @private {number} */
- this.tilesAlwaysVisible_ = 0;
- /**
- * The maximum number of tiles per row allowed by the grid parameters.
- * @private {number}
- */
- this.maxTilesPerRow_ = 0;
- /** @private {number} */
- this.maxTiles_ = 0;
-
- /** @private {number} */
- this.gridWidth_ = 0;
- /**
- * The maximum number of tiles per row allowed by the window width.
- * @private {number}
- */
- this.maxTilesPerRowWindow_ = 0;
-
- /** @private {?Element} */
- this.container_ = null;
- /** @private {?HTMLCollection} */
- this.tiles_ = null;
-
- /**
- * Array that stores the {x,y} positions of the tile layout.
- * @private {?Array<!Object>}
- */
- this.position_ = null;
-
- /**
- * Stores the current order of the tiles. Index corresponds to grid
- * position, while value is the index of the tile in |this.tiles_|.
- * @private {?Array<number>}
- */
- this.order_ = null;
-
- /** @private {number} The index of the tile we're reordering. */
- this.itemToReorder_ = -1;
- /** @private {number} The index to move the tile we're reordering to. */
- this.newIndexOfItemToReorder_ = -1;
-
- /** @private {boolean} True if the user is currently touching a tile. */
- this.touchStarted_ = false;
- }
-
- /**
- * Sets up the grid for the new tileset in |container|. The old tileset is
- * discarded.
- * @param {!Element} container The grid container element.
- * @param {Object=} params Customizable parameters for the grid. Used in
- * testing.
- */
- init(container, params = {}) {
- this.container_ = container;
-
- this.tileHeight_ = params.tileHeight || MD_TILE_HEIGHT;
- this.tileWidth_ = params.tileWidth || MD_TILE_WIDTH;
- this.tilesAlwaysVisible_ =
- params.tilesAlwaysVisible || MD_NUM_TILES_ALWAYS_VISIBLE;
- this.maxTilesPerRow_ = params.maxTilesPerRow || MD_MAX_TILES_PER_ROW;
- this.maxTiles_ = params.maxTiles || getMaxNumTiles();
-
- this.maxTilesPerRowWindow_ = this.getMaxTilesPerRow_();
-
- this.tiles_ =
- this.container_.getElementsByClassName(CLASSES.GRID_TILE_CONTAINER);
- // Ignore any tiles past the maximum allowed.
- this.position_ = new Array(this.maxTiles_);
- this.order_ = new Array(this.maxTiles_);
- for (let i = 0; i < this.maxTiles_; i++) {
- this.position_[i] = {x: 0, y: 0};
- this.order_[i] = i;
- }
-
- if (isCustomLinksEnabled() || params.enableReorder) {
- // Set up reordering for all tiles except the add shortcut button.
- for (let i = 0; i < this.tiles_.length; i++) {
- if (this.tiles_[i].getAttribute('add') !== 'true') {
- this.setupReorder_(this.tiles_[i], i);
- }
- }
- }
-
- this.updateLayout();
- }
-
- /**
- * Returns a grid tile wrapper that contains |tile|.
- * @param {!Element} tile The tile element.
- * @param {number} rid The tile's restricted id.
- * @param {boolean} isAddButton True if this is the add shortcut button.
- * @return {!Element} A grid tile wrapper.
- */
- createGridTile(tile, rid, isAddButton) {
- const gridTileContainer = document.createElement('div');
- gridTileContainer.className = CLASSES.GRID_TILE_CONTAINER;
- gridTileContainer.setAttribute('rid', rid);
- gridTileContainer.setAttribute('add', isAddButton);
- const gridTile = document.createElement('div');
- gridTile.className = CLASSES.GRID_TILE;
- gridTile.appendChild(tile);
- gridTileContainer.appendChild(gridTile);
- return gridTileContainer;
- }
-
- /**
- * Updates the layout of the tiles. This is called for new tilesets and when
- * the window is resized or zoomed. Translates each tile's
- * |CLASSES.GRID_TILE_CONTAINER| to the correct position.
- */
- updateLayout() {
- const tilesPerRow = this.getTilesPerRow_();
-
- this.gridWidth_ = tilesPerRow * this.tileWidth_;
- this.container_.style.width = this.gridWidth_ + 'px';
-
- const maxVisibleTiles = tilesPerRow * 2;
- let x = 0;
- let y = 0;
- for (let i = 0; i < this.tiles_.length; i++) {
- const tile = this.tiles_[i];
- // Reset the offset for row 2.
- if (i === tilesPerRow) {
- x = this.getRow2Offset_(tilesPerRow);
- y = this.tileHeight_;
- }
- // Update the tile's position.
- this.translate_(tile, x, y);
- this.position_[i].x = x;
- this.position_[i].y = y;
- x += this.tileWidth_; // Increment for the next tile.
-
- // Update visibility for tiles that may be hidden by the iframe border in
- // order to prevent keyboard navigation from reaching them. Ignores tiles
- // that will always be visible, since changing 'display' prevents
- // transitions from working.
- if (i >= this.tilesAlwaysVisible_) {
- const isVisible = i < maxVisibleTiles;
- tile.style.display = isVisible ? 'block' : 'none';
- }
- }
- }
-
- /**
- * Called when the window is resized/zoomed. Recalculates maximums for the new
- * window size and calls |updateLayout| if necessary.
- */
- onResize() {
- // Update the layout if the max number of tiles per row changes due to the
- // new window size.
- const maxPerRowWindow = this.getMaxTilesPerRow_();
- if (maxPerRowWindow !== this.maxTilesPerRowWindow_) {
- this.maxTilesPerRowWindow_ = maxPerRowWindow;
- this.updateLayout();
- }
- }
-
- /**
- * Returns the number of tiles per row. This may be balanced in order to make
- * even rows.
- * @return {number} The number of tiles per row.
- * @private
- */
- getTilesPerRow_() {
- const maxTilesPerRow =
- Math.min(this.maxTilesPerRow_, this.maxTilesPerRowWindow_);
- if (this.tiles_.length >= maxTilesPerRow * 2) {
- // We have enough for two full rows, so just return the max.
- return maxTilesPerRow;
- } else if (this.tiles_.length > maxTilesPerRow) {
- // We have have a little more than one full row, so we need to rebalance.
- return Math.ceil(this.tiles_.length / 2);
- } else {
- // We have (less than) a full row, so just return the tiles we have.
- return this.tiles_.length;
- }
- }
-
- /**
- * Returns the maximum number of tiles per row allowed by the window size.
- * @return {number} The maximum number of tiles per row.
- * @private
- */
- getMaxTilesPerRow_() {
- return Math.floor(window.innerWidth / this.tileWidth_);
- }
-
- /**
- * Returns row 2's x offset from row 1 in px. This will either be 0 or half a
- * tile length.
- * @param {number} tilesPerRow The number of tiles per row.
- * @return {number} The offset for row 2.
- * @private
- */
- getRow2Offset_(tilesPerRow) {
- // An odd number of tiles requires a half tile offset in the second row,
- // unless both rows are full (i.e. for smaller window widths).
- if (this.tiles_.length % 2 === 1 && this.tiles_.length / tilesPerRow < 2) {
- return Math.round(this.tileWidth_ / 2);
- }
- return 0;
- }
-
- /**
- * Returns true if the browser is in RTL.
- * @return {boolean}
- * @private
- */
- isRtl_() {
- return document.documentElement.dir === 'rtl';
- }
-
- /**
- * Translates the |element| by (x, y).
- * @param {?Element} element The element to apply the transform to.
- * @param {number} x The x value.
- * @param {number} y The y value.
- * @private
- */
- translate_(element, x, y) {
- if (!element) {
- throw new Error('Invalid element: cannot apply transform');
- }
- const rtlX = x * (this.isRtl_() ? -1 : 1);
- element.style.transform = 'translate(' + rtlX + 'px, ' + y + 'px)';
- }
-
- /**
- * Sets up event listeners necessary for tile reordering.
- * @param {!Element} tile Tile on which to set the event listeners.
- * @param {number} index The tile's index.
- * @private
- */
- setupReorder_(tile, index) {
- tile.setAttribute('index', index);
-
- // Set up mouse support.
- // Listen for the drag event on the tile instead of the tile container. The
- // tile container remains static during the reorder flow.
- tile.firstChild.draggable = true;
- // Prevent default drag events on the shortcut link.
- const tileItem = tile.firstChild.firstChild;
- tileItem.draggable = false;
- tile.firstChild.addEventListener('dragstart', (event) => {
- // Support link dragging (i.e. dragging the URL to the omnibox).
- event.dataTransfer.setData('text/uri-list', tileItem.href);
- // Remove the ghost image that appears when dragging.
- const emptyImg = new Image();
- event.dataTransfer.setDragImage(emptyImg, 0, 0);
-
- this.startReorder_(tile, event, /*mouseMode=*/ true);
- });
- // Show a 'move' cursor while dragging the tile within the grid bounds. This
- // is mostly intended for Windows, which will otherwise show a 'prohibited'
- // cursor.
- tile.addEventListener('dragover', (event) => {
- event.preventDefault();
- event.dataTransfer.dropEffect = 'move';
- });
-
- // Set up touch support.
- tile.firstChild.addEventListener('touchstart', (startEvent) => {
- // Ignore subsequent touchstart events, which can be triggered if a
- // different finger is placed on this tile.
- if (this.touchStarted_) {
- return;
- }
- this.touchStarted_ = true;
-
- // Start the reorder flow once the user moves their finger.
- const startReorder = (moveEvent) => {
- // Use the cursor position from 'touchstart' as the starting location.
- this.startReorder_(tile, startEvent, /*mouseMode=*/ false);
- };
- // Insert the held tile at the index we are hovering over.
- const moveOver = (moveEvent) => {
- // Touch events do not have a 'mouseover' equivalent, so we need to
- // manually check if we are hovering over a tile. If so, insert the held
- // tile there.
- // Note: The first item in |changedTouches| is the current position.
- const x = moveEvent.changedTouches[0].pageX;
- const y = moveEvent.changedTouches[0].pageY;
- this.reorderToIndexAtPoint_(x, y);
- };
- // Allow 'touchstart' events again when reordering stops/was never
- // started.
- const touchEnd = (endEvent) => {
- tile.firstChild.removeEventListener('touchmove', startReorder);
- tile.firstChild.removeEventListener('touchmove', moveOver);
- tile.firstChild.removeEventListener('touchend', touchEnd);
- tile.firstChild.removeEventListener('touchcancel', touchEnd);
- this.touchStarted_ = false;
- };
-
- tile.firstChild.addEventListener('touchmove', startReorder, {once: true});
- tile.firstChild.addEventListener('touchmove', moveOver);
- tile.firstChild.addEventListener('touchend', touchEnd, {once: true});
- tile.firstChild.addEventListener('touchcancel', touchEnd, {once: true});
- });
- }
-
- /**
- * Starts the reorder flow. Updates the visual style of the held tile to
- * indicate that it is being moved and sets up the relevant event listeners.
- * @param {!Element} tile Tile that is being moved.
- * @param {!Event} event The 'dragstart'/'touchmove' event. Used to obtain the
- * current cursor position
- * @param {boolean} mouseMode True if the user is using a mouse.
- * @private
- */
- startReorder_(tile, event, mouseMode) {
- const index = Number(tile.getAttribute('index'));
-
- this.itemToReorder_ = index;
- this.newIndexOfItemToReorder_ = index;
-
- // Apply reorder styling.
- tile.classList.add(CLASSES.REORDER);
- // Disable other hover/active styling for all tiles.
- document.body.classList.add(CLASSES.REORDERING);
-
- // Set up event listeners for the reorder flow. Listen for drag events if
- // |mouseMode|, touch events otherwise.
- if (mouseMode) {
- const trackCursor =
- this.trackCursor_(tile, event.pageX, event.pageY, true);
- // The 'dragover' event must be tracked at the document level, since the
- // currently dragged tile will interfere with 'dragover' events on the
- // other tiles.
- const dragOver = (dragOverEvent) => {
- trackCursor(dragOverEvent);
- // Since the 'dragover' event is not tied to a specific tile, we need to
- // manually check if we are hovering over a tile. If so, insert the held
- // tile there.
- this.reorderToIndexAtPoint_(dragOverEvent.pageX, dragOverEvent.pageY);
- };
- document.addEventListener('dragover', dragOver);
- document.addEventListener('dragend', () => {
- document.removeEventListener('dragover', dragOver);
- this.stopReorder_(tile);
- }, {once: true});
- } else {
- // Track the cursor on subsequent 'touchmove' events (the first
- // 'touchmove' event that starts the reorder flow is ignored).
- const trackCursor = this.trackCursor_(
- tile, event.changedTouches[0].pageX, event.changedTouches[0].pageY,
- false);
- const touchEnd = (touchEndEvent) => {
- tile.firstChild.removeEventListener('touchmove', trackCursor);
- tile.firstChild.removeEventListener('touchend', touchEnd);
- tile.firstChild.removeEventListener('touchcancel', touchEnd);
- this.stopReorder_(tile); // Stop the reorder flow.
- };
- tile.firstChild.addEventListener('touchmove', trackCursor);
- tile.firstChild.addEventListener('touchend', touchEnd, {once: true});
- tile.firstChild.addEventListener('touchcancel', touchEnd, {once: true});
- }
- }
-
- /**
- * Stops the reorder flow. Resets the held tile's visual style and tells the
- * EmbeddedSearchAPI that a tile has been moved.
- * @param {!Element} tile Tile that has been moved.
- * @private
- */
- stopReorder_(tile) {
- const index = Number(tile.getAttribute('index'));
-
- // Remove reorder styling.
- tile.classList.remove(CLASSES.REORDER);
- document.body.classList.remove(CLASSES.REORDERING);
-
- // Move the tile to its new position and notify EmbeddedSearchAPI that the
- // tile has been moved.
- this.applyReorder_(tile, this.newIndexOfItemToReorder_);
- chrome.embeddedSearch.newTabPage.reorderCustomLink(
- Number(this.tiles_[index].getAttribute('rid')),
- this.newIndexOfItemToReorder_);
-
- this.itemToReorder_ = -1;
- this.newIndexOfItemToReorder_ = -1;
- }
-
- /**
- * Attempts to insert the currently held tile at the index located at (x, y).
- * Does nothing if there is no tile at (x, y) or the reorder flow is not
- * ongoing.
- * @param {number} x The x coordinate.
- * @param {number} y The y coordinate.
- * @private
- */
- reorderToIndexAtPoint_(x, y) {
- const elements = document.elementsFromPoint(x, y);
- for (let i = 0; i < elements.length; i++) {
- if (elements[i].classList.contains(CLASSES.GRID_TILE_CONTAINER) &&
- elements[i].getAttribute('index') !== null) {
- this.reorderToIndex_(Number(elements[i].getAttribute('index')));
- return;
- }
- }
- }
-
- /**
- * Executed only when the reorder flow is ongoing. Inserts the currently held
- * tile at |index| and shifts tiles accordingly.
- * @param {number} index The index to insert the held tile at.
- * @private
- */
- reorderToIndex_(index) {
- if (this.newIndexOfItemToReorder_ === index ||
- !document.body.classList.contains(CLASSES.REORDERING)) {
- return;
- }
-
- // Moves the held tile from its current position to |index|.
- this.order_.move(this.newIndexOfItemToReorder_, index);
- this.newIndexOfItemToReorder_ = index;
- // Shift tiles according to the new order.
- for (let i = 0; i < this.tiles_.length; i++) {
- const tileIndex = this.order_[i];
- // Don't move the tile we're holding nor the add shortcut button.
- if (tileIndex === this.itemToReorder_ ||
- this.tiles_[i].getAttribute('add') === 'true') {
- continue;
- }
- this.applyReorder_(this.tiles_[tileIndex], i);
- }
- }
-
- /**
- * Translates the |tile|'s |CLASSES.GRID_TILE| from |index| to |newIndex|.
- * This is done to prevent interference with event listeners on the |tile|'s
- * |CLASSES.GRID_TILE_CONTAINER|, particularly 'mouseover'.
- * @param {!Element} tile Tile that is being shifted.
- * @param {number} newIndex New index for the tile.
- * @private
- */
- applyReorder_(tile, newIndex) {
- if (tile.getAttribute('index') === null) {
- throw new Error('Tile does not have an index.');
- }
- const index = Number(tile.getAttribute('index'));
- const x = this.position_[newIndex].x - this.position_[index].x;
- const y = this.position_[newIndex].y - this.position_[index].y;
- this.translate_(tile.children[0], x, y);
- }
-
- /**
- * Moves |tile| so that it tracks the cursor's position. This is done by
- * translating the |tile|'s |CLASSES.GRID_TILE|, which prevents interference
- * with event listeners on the |tile|'s |CLASSES.GRID_TILE_CONTAINER|.
- * @param {!Element} tile Tile that is being moved.
- * @param {number} origCursorX Original x cursor position.
- * @param {number} origCursorY Original y cursor position.
- * @param {boolean} mouseMode True if the user is using a mouse.
- * @private
- */
- trackCursor_(tile, origCursorX, origCursorY, mouseMode) {
- const index = Number(tile.getAttribute('index'));
- // RTL positions align with the right side of the grid. Therefore, the x
- // value must be recalculated to align with the left.
- const origPosX = this.isRtl_() ?
- (this.gridWidth_ - (this.position_[index].x + this.tileWidth_)) :
- this.position_[index].x;
- const origPosY = this.position_[index].y;
-
- // Get the max translation allowed by the grid boundaries. This will be the
- // x of the last tile in a row and the y of the tiles in the second row.
- const maxTranslateX = this.gridWidth_ - this.tileWidth_;
- const maxTranslateY = this.tileHeight_;
-
- const maxX = maxTranslateX - origPosX;
- const maxY = maxTranslateY - origPosY;
- const minX = 0 - origPosX;
- const minY = 0 - origPosY;
-
- return (event) => {
- const currX = mouseMode ? event.pageX : event.changedTouches[0].pageX;
- const currY = mouseMode ? event.pageY : event.changedTouches[0].pageY;
- // Do not exceed the iframe borders.
- const x = Math.max(Math.min(currX - origCursorX, maxX), minX);
- const y = Math.max(Math.min(currY - origCursorY, maxY), minY);
- tile.firstChild.style.transform = 'translate(' + x + 'px, ' + y + 'px)';
- };
- }
-}
-
-/**
- * Log an event on the NTP.
- * @param {number} eventType Event from LOG_TYPE.
- */
-function logEvent(eventType) {
- chrome.embeddedSearch.newTabPage.logEvent(eventType);
-}
-
-/**
- * Log impression of an NTP tile.
- * @param {number} tileIndex Position of the tile, >= 0 and < getMaxNumTiles().
- * @param {number} tileTitleSource The source of the tile's title as received
- * from getMostVisitedItemData.
- * @param {number} tileSource The tile's source as received from
- * getMostVisitedItemData.
- * @param {number} tileType The tile's visual type from TileVisualType.
- * @param {Date} dataGenerationTime Timestamp representing when the tile was
- * produced by a ranking algorithm.
- */
-function logMostVisitedImpression(
- tileIndex, tileTitleSource, tileSource, tileType, dataGenerationTime) {
- chrome.embeddedSearch.newTabPage.logMostVisitedImpression(
- tileIndex, tileTitleSource, tileSource, tileType, dataGenerationTime);
-}
-
-/**
- * Log click on an NTP tile.
- * @param {number} tileIndex Position of the tile, >= 0 and < getMaxNumTiles().
- * @param {number} tileTitleSource The source of the tile's title as received
- * from getMostVisitedItemData.
- * @param {number} tileSource The tile's source as received from
- * getMostVisitedItemData.
- * @param {number} tileType The tile's visual type from TileVisualType.
- * @param {Date} dataGenerationTime Timestamp representing when the tile was
- * produced by a ranking algorithm.
- */
-function logMostVisitedNavigation(
- tileIndex, tileTitleSource, tileSource, tileType, dataGenerationTime) {
- chrome.embeddedSearch.newTabPage.logMostVisitedNavigation(
- tileIndex, tileTitleSource, tileSource, tileType, dataGenerationTime);
-}
-
-/**
- * Returns true if custom links are enabled.
- * @return {boolean}
- */
-function isCustomLinksEnabled() {
- return customLinksFeatureEnabled &&
- !chrome.embeddedSearch.newTabPage.isUsingMostVisited;
-}
-
-/**
- * Returns the maximum number of tiles to show at any time. This can be changed
- * depending on what feature is enabled.
- * @return {number}
- */
-function getMaxNumTiles() {
- return isCustomLinksEnabled() ? MD_MAX_NUM_CUSTOM_LINK_TILES :
- MD_MAX_NUM_MOST_VISITED_TILES;
-}
-
-/**
- * Down counts the DOM elements that we are waiting for the page to load.
- * When we get to 0, we send a message to the parent window.
- * This is usually used as an EventListener of onload/onerror.
- */
-function countLoad() {
- loadedCounter -= 1;
- if (loadedCounter <= 0) {
- swapInNewTiles();
- logEvent(LOG_TYPE.NTP_ALL_TILES_LOADED);
- let tilesAreCustomLinks = isCustomLinksEnabled() &&
- chrome.embeddedSearch.newTabPage.isCustomLinks;
- // Tell the parent page whether to show the restore default shortcuts option
- // in the menu.
- window.parent.postMessage(
- {cmd: 'loaded', showRestoreDefault: tilesAreCustomLinks},
- DOMAIN_ORIGIN);
- tilesAreCustomLinks = false;
- // Reset to 1, so that any further 'show' message will cause us to swap in
- // fresh tiles.
- loadedCounter = 1;
- }
-}
-
-/**
- * Handles postMessages coming from the host page to the iframe.
- * Mostly, it dispatches every command to handleCommand.
- */
-function handlePostMessage(event) {
- if (event.data instanceof Array) {
- for (let i = 0; i < event.data.length; ++i) {
- handleCommand(event.data[i]);
- }
- } else {
- handleCommand(event.data);
- }
-}
-
-/**
- * Handles a single command coming from the host page to the iframe.
- * We try to keep the logic here to a minimum and just dispatch to the relevant
- * functions.
- */
-function handleCommand(data) {
- const cmd = data.cmd;
-
- if (cmd == 'tile') {
- addTile(data);
- } else if (cmd == 'show') {
- // TODO(crbug.com/946225): If this happens before we have finished loading
- // the previous tiles, we probably get into a bad state. If/when the iframe
- // is removed this might no longer be a concern.
- showTiles();
- } else if (cmd == 'updateTheme') {
- updateTheme(data);
- } else if (cmd === 'focusMenu') {
- focusTileMenu(data);
- } else {
- console.error('Unknown command: ' + JSON.stringify(data));
- }
-}
-
-/**
- * Handler for the 'show' message from the host page.
- */
-function showTiles() {
- utils.setPlatformClass(document.body);
- countLoad();
-}
-
-/**
- * Handler for the 'updateTheme' message from the host page.
- * @param {!Object} info Data received in the message.
- */
-function updateTheme(info) {
- document.body.style.setProperty('--tile-title-color', info.tileTitleColor);
- document.body.style.setProperty(
- '--icon-background-color', info.iconBackgroundColor);
- document.body.classList.toggle('dark-theme', info.isThemeDark);
- document.body.classList.toggle('use-title-container', info.useTitleContainer);
- document.body.classList.toggle('custom-background', info.customBackground);
- document.body.classList.toggle('use-white-add-icon', info.useWhiteAddIcon);
-
- // Reduce font weight on the default(white) background for Mac and CrOS.
- document.body.classList.toggle(
- CLASSES.MAC_CHROMEOS,
- !info.isThemeDark && !info.useTitleContainer &&
- (navigator.userAgent.indexOf('Mac') > -1 ||
- navigator.userAgent.indexOf('CrOS') > -1));
-}
-
-/**
- * Handler for 'focusMenu' message from the host page. Focuses the edited tile's
- * menu or the add shortcut tile after closing the custom link edit dialog
- * without saving.
- * @param {!Object} info Data received in the message.
- */
-function focusTileMenu(info) {
- const tile = document.querySelector(`a.md-tile[data-rid="${info.rid}"]`);
- if (info.rid === -1 /* Add shortcut tile */) {
- tile.focus();
- } else {
- tile.parentNode.childNodes[1].focus();
- }
-}
-
-/**
- * Removes all old instances of |IDS.MV_TILES| that are pending for deletion.
- */
-function removeAllOldTiles() {
- const parent = document.querySelector('#' + IDS.MOST_VISITED);
- const oldList = parent.querySelectorAll('.mv-tiles-old');
- for (let i = 0; i < oldList.length; ++i) {
- parent.removeChild(oldList[i]);
- }
-}
-
-/**
- * Called when all tiles have finished loading (successfully or not), and we are
- * ready to show the new tiles and drop the old ones.
- */
-function swapInNewTiles() {
- // Store the tiles on the current closure.
- const cur = tiles;
-
- // Add an "add new custom link" button if we haven't reached the maximum
- // number of tiles.
- if (isCustomLinksEnabled() && cur.childNodes.length < getMaxNumTiles()) {
- const data = {
- 'rid': -1,
- 'title': queryArgs['addLink'],
- 'url': '',
- 'isAddButton': true,
- 'dataGenerationTime': new Date(),
- 'tileSource': -1,
- 'tileTitleSource': -1
- };
- tiles.appendChild(renderTile(data));
- }
-
- const parent = document.querySelector('#' + IDS.MOST_VISITED);
-
- const old = parent.querySelector('#' + IDS.MV_TILES);
- if (old) {
- // Mark old tile DIV for removal after the transition animation is done.
- old.removeAttribute('id');
- old.classList.add('mv-tiles-old');
- old.style.opacity = 0.0;
- cur.addEventListener('transitionend', function(ev) {
- if (ev.target === cur) {
- removeAllOldTiles();
- }
- });
- }
-
- // Add new tileset.
- cur.id = IDS.MV_TILES;
- parent.appendChild(cur);
-
- // Initialize the new tileset before modifying opacity. This will prevent the
- // transform transition from applying after the tiles fade in.
- currGrid.init(cur);
-
- const flushOpacity = () => window.getComputedStyle(cur).opacity;
-
- // getComputedStyle causes the initial style (opacity 0) to be applied, so
- // that when we then set it to 1, that triggers the CSS transition.
- flushOpacity();
- cur.style.opacity = 1.0;
-
- // Make sure the tiles variable contain the next tileset we'll use if the host
- // page sends us an updated set of tiles.
- tiles = document.createElement('div');
-}
-
-/**
- * Explicitly hide tiles that are not visible in order to prevent keyboard
- * navigation.
- */
-function updateTileVisibility() {
- const allTiles =
- document.querySelectorAll('#' + IDS.MV_TILES + ' .' + CLASSES.MD_TILE);
- if (allTiles.length === 0) {
- return;
- }
-
- // Get the current number of tiles per row. Hide any tile after the first two
- // rows.
- const tilesPerRow = Math.trunc(document.body.offsetWidth / MD_TILE_WIDTH);
- for (let i = MD_NUM_TILES_ALWAYS_VISIBLE; i < allTiles.length; i++) {
- allTiles[i].style.display = (i < tilesPerRow * 2) ? 'block' : 'none';
- }
-}
-
-/**
- * Handler for the 'show' message from the host page, called when it wants to
- * add a suggestion tile.
- * @param {!MostVisitedData} args Data for the tile to be rendered.
- */
-function addTile(args) {
- if (!isFinite(args.rid)) {
- return;
- }
-
- // Grab the tile's data from the embeddedSearch API.
- const data =
- chrome.embeddedSearch.newTabPage.getMostVisitedItemData(args.rid);
- if (!data) {
- return;
- }
-
- if (!data.faviconUrl) {
- data.faviconUrl = 'chrome-search://favicon/size/16@' +
- window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.rid;
- }
- tiles.appendChild(renderTile(data));
-}
-
-/**
- * Called when the user decided to add a tile to the blacklist.
- * It sets off the animation for the blacklist and sends the blacklisted id
- * to the host page.
- * @param {Element} tile DOM node of the tile we want to remove.
- */
-function blacklistTile(tile) {
- const rid = Number(tile.getAttribute('data-rid'));
-
- if (isCustomLinksEnabled()) {
- chrome.embeddedSearch.newTabPage.deleteMostVisitedItem(rid);
- } else {
- tile.classList.add('blacklisted');
- tile.addEventListener('transitionend', function(ev) {
- if (ev.propertyName != 'width') {
- return;
- }
- window.parent.postMessage(
- {cmd: 'tileBlacklisted', rid: Number(rid)}, DOMAIN_ORIGIN);
- });
- }
-}
-
-/**
- * Starts edit custom link flow. Tells host page to show the edit custom link
- * dialog and pre-populate it with data obtained using the link's id.
- * @param {?number} rid Restricted id of the tile we want to edit.
- */
-function editCustomLink(rid) {
- window.parent.postMessage({cmd: 'startEditLink', rid: rid}, DOMAIN_ORIGIN);
-}
-
-/**
- * Renders a MostVisited tile (i.e. shortcut) to the DOM.
- * @param {!MostVisitedData} data Object containing rid, url, title, favicon,
- * and optionally isAddButton. isAddButton is true if you want to construct
- * an add custom link button, and can only be set if custom links is
- * enabled.
- * @return {Element}
- */
-function renderTile(data) {
- const mdTile = document.createElement('a');
- mdTile.className = CLASSES.MD_TILE;
-
- // The tile will be appended to |tiles|.
- const position = tiles.children.length;
- // This is set in the load/error event for the favicon image.
- let tileType = TileVisualType.NONE;
-
- mdTile.setAttribute('data-rid', data.rid);
- mdTile.setAttribute('data-pos', position);
- if (utils.isSchemeAllowed(data.url)) {
- mdTile.href = data.url;
- }
- mdTile.setAttribute('aria-label', data.title);
- mdTile.title = data.title;
-
- mdTile.addEventListener('click', function(ev) {
- if (data.isAddButton) {
- editCustomLink(null);
- logEvent(LOG_TYPE.NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED);
- } else {
- logMostVisitedNavigation(
- position, data.tileTitleSource, data.tileSource, tileType,
- data.dataGenerationTime);
- }
- });
- mdTile.addEventListener('keydown', function(event) {
- if ((event.keyCode === KEYCODES.DELETE ||
- event.keyCode === KEYCODES.BACKSPACE) &&
- !data.isAddButton) {
- event.preventDefault();
- event.stopPropagation();
- blacklistTile(mdTile);
- } else if (
- event.keyCode === KEYCODES.ENTER || event.keyCode === KEYCODES.SPACE) {
- event.preventDefault();
- this.click();
- } else if (event.keyCode === KEYCODES.LEFT) {
- const tiles = document.querySelectorAll(
- '#' + IDS.MV_TILES + ' .' + CLASSES.MD_TILE);
- tiles[Math.max(Number(this.getAttribute('data-pos')) - 1, 0)].focus();
- } else if (event.keyCode === KEYCODES.RIGHT) {
- const tiles = document.querySelectorAll(
- '#' + IDS.MV_TILES + ' .' + CLASSES.MD_TILE);
- tiles[Math.min(
- Number(this.getAttribute('data-pos')) + 1, tiles.length - 1)]
- .focus();
- }
- });
- utils.disableOutlineOnMouseClick(mdTile);
-
- const mdTileInner = document.createElement('div');
- mdTileInner.className = CLASSES.MD_TILE_INNER;
-
- if (data.isAddButton) {
- mdTile.tabIndex = 0;
-
- const mdIconAdd = document.createElement('div');
- mdIconAdd.classList.add(CLASSES.MD_ICON);
- mdIconAdd.classList.add(CLASSES.MD_ADD_ICON);
-
- mdTileInner.appendChild(mdIconAdd);
- } else {
- const mdIcon = document.createElement('img');
- mdIcon.classList.add(CLASSES.MD_ICON);
- // Set title and alt to empty so screen readers won't say the image name.
- mdIcon.title = '';
- mdIcon.alt = '';
- const url = new URL('chrome-search://ntpicon/');
- url.searchParams.set('size', '24@' + window.devicePixelRatio + 'x');
- url.searchParams.set('url', data.url);
- mdIcon.src = url.toString();
- loadedCounter += 1;
- mdIcon.addEventListener('load', function(ev) {
- // Store the type for a potential later navigation.
- tileType = TileVisualType.ICON_REAL;
- logMostVisitedImpression(
- position, data.tileTitleSource, data.tileSource, tileType,
- data.dataGenerationTime);
- // Note: It's important to call countLoad last, because that might emit
- // the NTP_ALL_TILES_LOADED event, which must happen after the impression
- // log.
- countLoad();
- });
- mdIcon.addEventListener('error', function(ev) {
- const fallbackBackground = document.createElement('div');
- fallbackBackground.className = CLASSES.MD_ICON;
- const fallbackLetter = document.createElement('div');
- fallbackLetter.className = CLASSES.MD_FALLBACK_LETTER;
- fallbackLetter.textContent = data.title.charAt(0).toUpperCase();
- fallbackBackground.classList.add(CLASSES.FAILED_FAVICON);
-
- fallbackBackground.appendChild(fallbackLetter);
- mdTileInner.replaceChild(fallbackBackground, mdIcon);
-
- // Store the type for a potential later navigation.
- tileType = TileVisualType.ICON_DEFAULT;
- logMostVisitedImpression(
- position, data.tileTitleSource, data.tileSource, tileType,
- data.dataGenerationTime);
- // Note: It's important to call countLoad last, because that might emit
- // the NTP_ALL_TILES_LOADED event, which must happen after the impression
- // log.
- countLoad();
- });
-
- mdTileInner.appendChild(mdIcon);
- }
-
- const mdTitle = document.createElement('div');
- mdTitle.className = CLASSES.MD_TITLE;
- mdTitle.style.direction = data.direction || 'ltr';
- const mdTitleTextwrap = document.createElement('span');
- mdTitleTextwrap.innerText = data.title;
- mdTitle.appendChild(mdTitleTextwrap);
- mdTileInner.appendChild(mdTitle);
- mdTile.appendChild(mdTileInner);
-
- if (!data.isAddButton) {
- const mdMenu = document.createElement('button');
- mdMenu.className = CLASSES.MD_MENU;
- if (isCustomLinksEnabled()) {
- mdMenu.classList.add(CLASSES.MD_EDIT_MENU);
- mdMenu.title = queryArgs['editLinkTooltip'] || '';
- mdMenu.setAttribute(
- 'aria-label',
- (queryArgs['editLinkTooltip'] || '') + ' ' + data.title);
- mdMenu.addEventListener('click', function(ev) {
- editCustomLink(data.rid);
- ev.preventDefault();
- ev.stopPropagation();
- logEvent(LOG_TYPE.NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED);
- });
- } else {
- mdMenu.title = queryArgs['removeTooltip'] || '';
- mdMenu.setAttribute(
- 'aria-label', (queryArgs['removeTooltip'] || '') + ' ' + data.title);
- mdMenu.addEventListener('click', function(ev) {
- removeAllOldTiles();
- blacklistTile(mdTile);
- ev.preventDefault();
- ev.stopPropagation();
- });
- }
- // Don't allow the event to bubble out to the containing tile, as that would
- // trigger navigation to the tile URL.
- mdMenu.addEventListener('keydown', function(ev) {
- ev.stopPropagation();
- });
- utils.disableOutlineOnMouseClick(mdMenu);
-
- mdTile.appendChild(mdMenu);
- }
-
- return currGrid.createGridTile(mdTile, data.rid, !!data.isAddButton);
-}
-
-/**
- * Does some initialization and parses the query arguments passed to the iframe.
- */
-function init() {
- // Create a new DOM element to hold the tiles. The tiles will be added
- // one-by-one via addTile, and the whole thing will be inserted into the page
- // in swapInNewTiles, after the parent has sent us the 'show' message, and all
- // favicons have loaded.
- tiles = document.createElement('div');
-
- // Parse query arguments.
- const query = window.location.search.substring(1).split('&');
- queryArgs = {};
- for (let i = 0; i < query.length; ++i) {
- const val = query[i].split('=');
- if (val[0] == '') {
- continue;
- }
- queryArgs[decodeURIComponent(val[0])] = decodeURIComponent(val[1]);
- }
-
- document.title = queryArgs['title'];
-
- // Enable RTL.
- if (queryArgs['rtl'] == '1') {
- document.documentElement.dir = 'rtl';
- }
-
- // Enable custom links.
- if (queryArgs['enableCustomLinks'] == '1') {
- customLinksFeatureEnabled = true;
- }
-
- currGrid = new Grid();
- // Set up layout updates on window resize. Throttled according to
- // |RESIZE_TIMEOUT_DELAY|.
- let resizeTimeout;
- window.onresize = () => {
- if (resizeTimeout) {
- window.clearTimeout(resizeTimeout);
- }
- resizeTimeout = window.setTimeout(() => {
- resizeTimeout = null;
- currGrid.onResize();
- }, RESIZE_TIMEOUT_DELAY);
- };
-
- window.addEventListener('message', handlePostMessage);
-}
-
-/**
- * Binds event listeners.
- */
-function listen() {
- document.addEventListener('DOMContentLoaded', init);
-}
-
-return {
- Grid: Grid, // Exposed for testing.
- init: init, // Exposed for testing.
- listen: listen,
-};
-}
-
-if (!window.mostVisitedUnitTest) {
- MostVisited().listen();
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_title.css b/chromium/chrome/browser/resources/local_ntp/most_visited_title.css
index 41e1b06e23e..ebdc0ec73f2 100644
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_title.css
+++ b/chromium/chrome/browser/resources/local_ntp/most_visited_title.css
@@ -1,20 +1,27 @@
/* Copyright 2013 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file. */
+
html {
height: 100%;
}
body {
+ background: none transparent;
height: 100%;
+ margin: 0;
+ overflow: hidden;
+ user-select: none;
width: 100%;
}
a {
+ display: block;
height: 100%;
line-height: 117%;
overflow: hidden;
text-align: center; /* Can be overridden in JS. */
+ text-decoration: none;
text-overflow: ellipsis; /* Can be overridden in JS. */
white-space: nowrap; /* Can be overridden in JS. */
}
@@ -25,6 +32,13 @@ a.multiline {
word-wrap: break-word;
}
+a:active,
+a:hover,
+a:visited {
+ color: inherit;
+ text-decoration: inherit;
+}
+
a:focus {
outline: none; /* Remove outline from tabIndex = -1. */
}
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_title.html b/chromium/chrome/browser/resources/local_ntp/most_visited_title.html
index 11286d9cd6d..16a9f796d7a 100644
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_title.html
+++ b/chromium/chrome/browser/resources/local_ntp/most_visited_title.html
@@ -2,10 +2,8 @@
<html>
<head>
<meta charset="utf-8">
- <link rel="stylesheet" href="common.css">
<link rel="stylesheet" href="title.css">
<script src="assert.js"></script>
- <script src="util.js"></script>
<script src="title.js"></script>
</head>
<body>
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_title.js b/chromium/chrome/browser/resources/local_ntp/most_visited_title.js
index 0eab823453a..b81529bc096 100644
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_title.js
+++ b/chromium/chrome/browser/resources/local_ntp/most_visited_title.js
@@ -10,6 +10,267 @@
* @fileoverview Rendering for iframed most visited titles.
*/
+/**
+ * The origin of this request.
+ * @const {string}
+ */
+const MV_DOMAIN_ORIGIN = '{{ORIGIN}}';
+
+/**
+ * Converts an RGB color number to a hex color string if valid.
+ * @param {number} color A 6-digit hex RGB color code as a number.
+ * @return {?string} A CSS representation of the color or null if invalid.
+ */
+function convertToHexColor(color) {
+ // Color must be a number, finite, with no fractional part, in the correct
+ // range for an RGB hex color.
+ if (isFinite(color) && Math.floor(color) == color && color >= 0 &&
+ color <= 0xffffff) {
+ const hexColor = color.toString(16);
+ // Pads with initial zeros and # (e.g. for 'ff' yields '#0000ff').
+ return '#000000'.substr(0, 7 - hexColor.length) + hexColor;
+ }
+ return null;
+}
+
+/**
+ * Validates a RGBA color component. It must be a number between 0 and 255.
+ * @param {number} component An RGBA component.
+ * @return {boolean} True if the component is valid.
+ */
+function isValidRBGAComponent(component) {
+ return isFinite(component) && component >= 0 && component <= 255;
+}
+
+/**
+ * Converts an Array of color components into RGBA format "rgba(R,G,B,A)".
+ * @param {Array<number>} rgbaColor Array of rgba color components.
+ * @return {?string} CSS color in RGBA format or null if invalid.
+ */
+function convertArrayToRGBAColor(rgbaColor) {
+ // Array must contain 4 valid components.
+ if (rgbaColor instanceof Array && rgbaColor.length === 4 &&
+ isValidRBGAComponent(rgbaColor[0]) &&
+ isValidRBGAComponent(rgbaColor[1]) &&
+ isValidRBGAComponent(rgbaColor[2]) &&
+ isValidRBGAComponent(rgbaColor[3])) {
+ return 'rgba(' + rgbaColor[0] + ',' + rgbaColor[1] + ',' + rgbaColor[2] +
+ ',' + rgbaColor[3] / 255 + ')';
+ }
+ return null;
+}
+
+/**
+ * Parses query parameters from Location.
+ * @param {!Location} location The URL to generate the CSS url for.
+ * @return {Object} Dictionary containing name value pairs for URL.
+ *
+ * TODO(dbeam): we should update callers of this method to use
+ * URLSearchParams#get() instead (which I have a higher confidence handles
+ * escaping and edge cases correctly). Note: that calling URLSearchParams#get()
+ * also has the behavior of only returning the first &param= in the URL (i.e.
+ * ?param=1&param=2 + .get('param') would return '1').
+ */
+function parseQueryParams(location) {
+ const params = Object.create(null);
+ const query = location.search.substring(1);
+ const vars = query.split('&');
+ for (let i = 0; i < vars.length; i++) {
+ const pair = vars[i].split('=');
+ const k = decodeURIComponent(pair[0]);
+ if (k in params) {
+ // Duplicate parameters are not allowed to prevent attackers who can
+ // append things to |location| from getting their parameter values to
+ // override legitimate ones.
+ return Object.create(null);
+ } else {
+ params[k] = decodeURIComponent(pair[1]);
+ }
+ }
+ return params;
+}
+
+/**
+ * Creates a new most visited link element.
+ * @param {Object} params URL parameters containing styles for the link.
+ * @param {string} href The destination for the link.
+ * @param {string} title The title for the link.
+ * @param {string|undefined} text The text for the link or none.
+ * @param {string|undefined} direction The text direction.
+ * @return {!Element} A new link element.
+ */
+function createMostVisitedLink(params, href, title, text, direction) {
+ const styles = getMostVisitedStyles(params, !!text);
+ const link = document.createElement('a');
+ link.style.color = styles.color;
+ link.style.fontSize = styles.fontSize + 'px';
+ if (styles.fontFamily) {
+ link.style.fontFamily = styles.fontFamily;
+ }
+ if (styles.textAlign) {
+ link.style.textAlign = styles.textAlign;
+ }
+ if (styles.textFadePos) {
+ const dir = /^rtl$/i.test(direction) ? 'to left' : 'to right';
+ // The fading length in pixels is passed by the caller.
+ const mask = 'linear-gradient(' + dir + ', rgba(0,0,0,1), rgba(0,0,0,1) ' +
+ styles.textFadePos + 'px, rgba(0,0,0,0))';
+ link.style.textOverflow = 'clip';
+ link.style.webkitMask = mask;
+ }
+ if (styles.numTitleLines && styles.numTitleLines > 1) {
+ link.classList.add('multiline');
+ }
+
+ link.href = href;
+ link.title = title;
+ link.target = '_top';
+ // Include links in the tab order. The tabIndex is necessary for
+ // accessibility.
+ link.tabIndex = '0';
+ if (text) {
+ // Wrap text with span so ellipsis will appear at the end of multiline.
+ const spanWrap = document.createElement('span');
+ spanWrap.textContent = text;
+ link.appendChild(spanWrap);
+ }
+ link.addEventListener('focus', function() {
+ window.parent.postMessage('linkFocused', MV_DOMAIN_ORIGIN);
+ });
+ link.addEventListener('blur', function() {
+ window.parent.postMessage('linkBlurred', MV_DOMAIN_ORIGIN);
+ });
+
+ link.addEventListener('keydown', function(event) {
+ if (event.keyCode == 46 /* DELETE */ ||
+ event.keyCode == 8 /* BACKSPACE */) {
+ event.preventDefault();
+ window.parent.postMessage(
+ 'tileBlacklisted,' + params['pos'], MV_DOMAIN_ORIGIN);
+ } else if (
+ event.keyCode == 13 /* ENTER */ || event.keyCode == 32 /* SPACE */) {
+ // Event target is the <a> tag. Send a click event on it, which will
+ // trigger the 'click' event registered above.
+ event.preventDefault();
+ event.target.click();
+ }
+ });
+
+ return link;
+}
+
+/**
+ * Returns the color to display string with, depending on whether title is
+ * displayed, the current theme, and URL parameters.
+ * @param {Object<string>} params URL parameters specifying style.
+ * @param {boolean} isTitle if the style is for the Most Visited Title.
+ * @return {string} The color to use, in "rgba(#,#,#,#)" format.
+ */
+function getTextColor(params, isTitle) {
+ // 'RRGGBBAA' color format overrides everything.
+ if ('c' in params && params.c.match(/^[0-9A-Fa-f]{8}$/)) {
+ // Extract the 4 pairs of hex digits, map to number, then form rgba().
+ const t = params.c.match(/(..)(..)(..)(..)/).slice(1).map(function(s) {
+ return parseInt(s, 16);
+ });
+ return 'rgba(' + t[0] + ',' + t[1] + ',' + t[2] + ',' + t[3] / 255 + ')';
+ }
+
+ // For backward compatibility with server-side NTP, look at themes directly
+ // and use param.c for non-title or as fallback.
+ const apiHandle = chrome.embeddedSearch.newTabPage;
+ const ntpTheme = assert(apiHandle.ntpTheme);
+ let c = '#777';
+ if (isTitle && ntpTheme && !ntpTheme.usingDefaultTheme) {
+ // Read from theme directly
+ c = convertArrayToRGBAColor(ntpTheme.textColorRgba) || c;
+ } else if ('c' in params) {
+ c = convertToHexColor(parseInt(params.c, 16)) || c;
+ }
+ return c;
+}
+
+/**
+ * Decodes most visited styles from URL parameters.
+ * - c: A hexadecimal number interpreted as a hex color code.
+ * - f: font-family.
+ * - fs: font-size as a number in pixels.
+ * - ta: text-align property, as a string.
+ * - tf: text fade starting position, in pixels.
+ * - ntl: number of lines in the title.
+ * @param {Object<string>} params URL parameters specifying style.
+ * @param {boolean} isTitle if the style is for the Most Visited Title.
+ * @return {Object} Styles suitable for CSS interpolation.
+ */
+function getMostVisitedStyles(params, isTitle) {
+ const styles = {
+ color: getTextColor(params, isTitle), // Handles 'c' in params.
+ fontFamily: '',
+ fontSize: 11
+ };
+ if ('f' in params && /^[-0-9a-zA-Z ,]+$/.test(params.f)) {
+ styles.fontFamily = params.f;
+ }
+ if ('fs' in params && isFinite(parseInt(params.fs, 10))) {
+ styles.fontSize = parseInt(params.fs, 10);
+ }
+ if ('ta' in params && /^[-0-9a-zA-Z ,]+$/.test(params.ta)) {
+ styles.textAlign = params.ta;
+ }
+ if ('tf' in params) {
+ const tf = parseInt(params.tf, 10);
+ if (isFinite(tf)) {
+ styles.textFadePos = tf;
+ }
+ }
+ if ('ntl' in params) {
+ const ntl = parseInt(params.ntl, 10);
+ if (isFinite(ntl)) {
+ styles.numTitleLines = ntl;
+ }
+ }
+ return styles;
+}
+
+/**
+ * Returns whether the given URL has a known, safe scheme.
+ * @param {string} url URL to check.
+ */
+const isSchemeAllowed = function(url) {
+ return url.startsWith('http://') || url.startsWith('https://') ||
+ url.startsWith('ftp://') || url.startsWith('chrome-extension://');
+};
+
+/**
+ * @param {!Location} location A location containing URL parameters.
+ * @param {function(Object, Object)} fill A function called with styles and
+ * data to fill.
+ */
+function fillMostVisited(location, fill) {
+ const params = parseQueryParams(location);
+ params.rid = parseInt(params.rid, 10);
+ if (!isFinite(params.rid)) {
+ return;
+ }
+ const data =
+ chrome.embeddedSearch.newTabPage.getMostVisitedItemData(params.rid);
+ if (!data) {
+ return;
+ }
+ if (data.url && !isSchemeAllowed(data.url)) {
+ return;
+ }
+
+ if (isFinite(params.dummy) && parseInt(params.dummy, 10)) {
+ data.dummy = true;
+ }
+
+ if (data.direction) {
+ document.body.dir = data.direction;
+ }
+ fill(params, data);
+}
+
window.addEventListener('DOMContentLoaded', function() {
'use strict';
diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_util.js b/chromium/chrome/browser/resources/local_ntp/most_visited_util.js
deleted file mode 100644
index c375e6fd29b..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/most_visited_util.js
+++ /dev/null
@@ -1,272 +0,0 @@
-/**
- * @license
- * Copyright 2013 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * @fileoverview Utilities for rendering most visited thumbnails and titles.
- */
-
-/**
- * The origin of this request.
- * @const {string}
- */
-const MV_DOMAIN_ORIGIN = '{{ORIGIN}}';
-
-/**
- * Converts an RGB color number to a hex color string if valid.
- * @param {number} color A 6-digit hex RGB color code as a number.
- * @return {?string} A CSS representation of the color or null if invalid.
- */
-function convertToHexColor(color) {
- // Color must be a number, finite, with no fractional part, in the correct
- // range for an RGB hex color.
- if (isFinite(color) && Math.floor(color) == color && color >= 0 &&
- color <= 0xffffff) {
- const hexColor = color.toString(16);
- // Pads with initial zeros and # (e.g. for 'ff' yields '#0000ff').
- return '#000000'.substr(0, 7 - hexColor.length) + hexColor;
- }
- return null;
-}
-
-/**
- * Validates a RGBA color component. It must be a number between 0 and 255.
- * @param {number} component An RGBA component.
- * @return {boolean} True if the component is valid.
- */
-function isValidRBGAComponent(component) {
- return isFinite(component) && component >= 0 && component <= 255;
-}
-
-/**
- * Converts an Array of color components into RGBA format "rgba(R,G,B,A)".
- * @param {Array<number>} rgbaColor Array of rgba color components.
- * @return {?string} CSS color in RGBA format or null if invalid.
- */
-function convertArrayToRGBAColor(rgbaColor) {
- // Array must contain 4 valid components.
- if (rgbaColor instanceof Array && rgbaColor.length === 4 &&
- isValidRBGAComponent(rgbaColor[0]) &&
- isValidRBGAComponent(rgbaColor[1]) &&
- isValidRBGAComponent(rgbaColor[2]) &&
- isValidRBGAComponent(rgbaColor[3])) {
- return 'rgba(' + rgbaColor[0] + ',' + rgbaColor[1] + ',' + rgbaColor[2] +
- ',' + rgbaColor[3] / 255 + ')';
- }
- return null;
-}
-
-/**
- * Parses query parameters from Location.
- * @param {!Location} location The URL to generate the CSS url for.
- * @return {Object} Dictionary containing name value pairs for URL.
- *
- * TODO(dbeam): we should update callers of this method to use
- * URLSearchParams#get() instead (which I have a higher confidence handles
- * escaping and edge cases correctly). Note: that calling URLSearchParams#get()
- * also has the behavior of only returning the first &param= in the URL (i.e.
- * ?param=1&param=2 + .get('param') would return '1').
- */
-function parseQueryParams(location) {
- const params = Object.create(null);
- const query = location.search.substring(1);
- const vars = query.split('&');
- for (let i = 0; i < vars.length; i++) {
- const pair = vars[i].split('=');
- const k = decodeURIComponent(pair[0]);
- if (k in params) {
- // Duplicate parameters are not allowed to prevent attackers who can
- // append things to |location| from getting their parameter values to
- // override legitimate ones.
- return Object.create(null);
- } else {
- params[k] = decodeURIComponent(pair[1]);
- }
- }
- return params;
-}
-
-/**
- * Creates a new most visited link element.
- * @param {Object} params URL parameters containing styles for the link.
- * @param {string} href The destination for the link.
- * @param {string} title The title for the link.
- * @param {string|undefined} text The text for the link or none.
- * @param {string|undefined} direction The text direction.
- * @return {!Element} A new link element.
- */
-function createMostVisitedLink(params, href, title, text, direction) {
- const styles = getMostVisitedStyles(params, !!text);
- const link = document.createElement('a');
- link.style.color = styles.color;
- link.style.fontSize = styles.fontSize + 'px';
- if (styles.fontFamily) {
- link.style.fontFamily = styles.fontFamily;
- }
- if (styles.textAlign) {
- link.style.textAlign = styles.textAlign;
- }
- if (styles.textFadePos) {
- const dir = /^rtl$/i.test(direction) ? 'to left' : 'to right';
- // The fading length in pixels is passed by the caller.
- const mask = 'linear-gradient(' + dir + ', rgba(0,0,0,1), rgba(0,0,0,1) ' +
- styles.textFadePos + 'px, rgba(0,0,0,0))';
- link.style.textOverflow = 'clip';
- link.style.webkitMask = mask;
- }
- if (styles.numTitleLines && styles.numTitleLines > 1) {
- link.classList.add('multiline');
- }
-
- link.href = href;
- link.title = title;
- link.target = '_top';
- // Include links in the tab order. The tabIndex is necessary for
- // accessibility.
- link.tabIndex = '0';
- if (text) {
- // Wrap text with span so ellipsis will appear at the end of multiline.
- const spanWrap = document.createElement('span');
- spanWrap.textContent = text;
- link.appendChild(spanWrap);
- }
- link.addEventListener('focus', function() {
- window.parent.postMessage('linkFocused', MV_DOMAIN_ORIGIN);
- });
- link.addEventListener('blur', function() {
- window.parent.postMessage('linkBlurred', MV_DOMAIN_ORIGIN);
- });
-
- link.addEventListener('keydown', function(event) {
- if (event.keyCode == 46 /* DELETE */ ||
- event.keyCode == 8 /* BACKSPACE */) {
- event.preventDefault();
- window.parent.postMessage(
- 'tileBlacklisted,' + params['pos'], MV_DOMAIN_ORIGIN);
- } else if (
- event.keyCode == 13 /* ENTER */ || event.keyCode == 32 /* SPACE */) {
- // Event target is the <a> tag. Send a click event on it, which will
- // trigger the 'click' event registered above.
- event.preventDefault();
- event.target.click();
- }
- });
-
- return link;
-}
-
-/**
- * Returns the color to display string with, depending on whether title is
- * displayed, the current theme, and URL parameters.
- * @param {Object<string>} params URL parameters specifying style.
- * @param {boolean} isTitle if the style is for the Most Visited Title.
- * @return {string} The color to use, in "rgba(#,#,#,#)" format.
- */
-function getTextColor(params, isTitle) {
- // 'RRGGBBAA' color format overrides everything.
- if ('c' in params && params.c.match(/^[0-9A-Fa-f]{8}$/)) {
- // Extract the 4 pairs of hex digits, map to number, then form rgba().
- const t = params.c.match(/(..)(..)(..)(..)/).slice(1).map(function(s) {
- return parseInt(s, 16);
- });
- return 'rgba(' + t[0] + ',' + t[1] + ',' + t[2] + ',' + t[3] / 255 + ')';
- }
-
- // For backward compatibility with server-side NTP, look at themes directly
- // and use param.c for non-title or as fallback.
- const apiHandle = chrome.embeddedSearch.newTabPage;
- const ntpTheme = assert(apiHandle.ntpTheme);
- let c = '#777';
- if (isTitle && ntpTheme && !ntpTheme.usingDefaultTheme) {
- // Read from theme directly
- c = convertArrayToRGBAColor(ntpTheme.textColorRgba) || c;
- } else if ('c' in params) {
- c = convertToHexColor(parseInt(params.c, 16)) || c;
- }
- return c;
-}
-
-/**
- * Decodes most visited styles from URL parameters.
- * - c: A hexadecimal number interpreted as a hex color code.
- * - f: font-family.
- * - fs: font-size as a number in pixels.
- * - ta: text-align property, as a string.
- * - tf: text fade starting position, in pixels.
- * - ntl: number of lines in the title.
- * @param {Object<string>} params URL parameters specifying style.
- * @param {boolean} isTitle if the style is for the Most Visited Title.
- * @return {Object} Styles suitable for CSS interpolation.
- */
-function getMostVisitedStyles(params, isTitle) {
- const styles = {
- color: getTextColor(params, isTitle), // Handles 'c' in params.
- fontFamily: '',
- fontSize: 11
- };
- if ('f' in params && /^[-0-9a-zA-Z ,]+$/.test(params.f)) {
- styles.fontFamily = params.f;
- }
- if ('fs' in params && isFinite(parseInt(params.fs, 10))) {
- styles.fontSize = parseInt(params.fs, 10);
- }
- if ('ta' in params && /^[-0-9a-zA-Z ,]+$/.test(params.ta)) {
- styles.textAlign = params.ta;
- }
- if ('tf' in params) {
- const tf = parseInt(params.tf, 10);
- if (isFinite(tf)) {
- styles.textFadePos = tf;
- }
- }
- if ('ntl' in params) {
- const ntl = parseInt(params.ntl, 10);
- if (isFinite(ntl)) {
- styles.numTitleLines = ntl;
- }
- }
- return styles;
-}
-
-/**
- * Returns whether the given URL has a known, safe scheme.
- * @param {string} url URL to check.
- */
-const isSchemeAllowed = function(url) {
- return url.startsWith('http://') || url.startsWith('https://') ||
- url.startsWith('ftp://') || url.startsWith('chrome-extension://');
-};
-
-/**
- * @param {!Location} location A location containing URL parameters.
- * @param {function(Object, Object)} fill A function called with styles and
- * data to fill.
- */
-function fillMostVisited(location, fill) {
- const params = parseQueryParams(location);
- params.rid = parseInt(params.rid, 10);
- if (!isFinite(params.rid)) {
- return;
- }
- const data =
- chrome.embeddedSearch.newTabPage.getMostVisitedItemData(params.rid);
- if (!data) {
- return;
- }
- if (data.url && !isSchemeAllowed(data.url)) {
- return;
- }
-
- if (isFinite(params.dummy) && parseInt(params.dummy, 10)) {
- data.dummy = true;
- }
-
- if (data.direction) {
- document.body.dir = data.direction;
- }
- fill(params, data);
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/utils.js b/chromium/chrome/browser/resources/local_ntp/utils.js
deleted file mode 100644
index b71a2428f89..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/utils.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @license
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * Enum for classnames.
- * @enum {string}
- * @const
- */
-const CLASSES = {
- MAC: 'mac', // Applies MacOS specific properties.
- WIN: 'win', // Applies Windows specific properties.
- MOUSE_NAVIGATION: 'mouse-navigation', // Removes blue focus ring.
-};
-
-/**
- * Alias for document.getElementById.
- * @param {string} id The ID of the element to find.
- * @return {Element} The found element or null if not found.
- */
-function $(id) {
- // eslint-disable-next-line no-restricted-properties
- return document.getElementById(id);
-}
-
-/**
- * Contains common functions used in the main NTP page and its iframes.
- */
-const utils = {};
-
-/**
- * Disables the focus outline for |element| on mousedown.
- * @param {Element} element The element to remove the focus outline from.
- */
-utils.disableOutlineOnMouseClick = function(element) {
- element.addEventListener('mousedown', () => {
- element.classList.add(CLASSES.MOUSE_NAVIGATION);
- element.addEventListener('blur', () => {
- element.classList.remove(CLASSES.MOUSE_NAVIGATION);
- }, {once: true});
- });
-};
-
-/**
- * Returns whether the given URL has a known, safe scheme.
- * @param {string} url URL to check.
- */
-utils.isSchemeAllowed = function(url) {
- return url.startsWith('http://') || url.startsWith('https://') ||
- url.startsWith('ftp://') || url.startsWith('chrome-extension://');
-};
-
-/**
- * Sets CSS class for |element| corresponding to the current platform.
- * @param {Element} element The element to set the current platform.
- */
-utils.setPlatformClass = function(element) {
- element.classList.toggle(
- CLASSES.WIN, navigator.userAgent.indexOf('Windows') > -1);
- element.classList.toggle(
- CLASSES.MAC, navigator.userAgent.indexOf('Mac') > -1);
-};
-
-/**
- * Returns a formatted localized string where $1 to $9 are replaced by the
- * second to the tenth argument. Any standalone $ signs must be escaped as
- * $$.
- * Copied from //ui/webui/resources/js/load_time_data.js temporarily as the
- * local NTP will be replaced by the WebUI NTP.
- * @param {string} label The label to substitute through.
- * This is not an resource ID.
- * @param {...(string|number)} var_args The extra values to include in the
- * formatted output.
- * @return {string} The formatted string.
- */
-utils.substituteString = function(label, var_args) {
- const varArgs = arguments;
- return label.replace(/\$(.|$|\n)/g, function(m) {
- assert(m.match(/\$[$1-9]/), 'Unescaped $ found in localized string.');
- return m === '$$' ? '$' : varArgs[m[1]];
- });
-};
diff --git a/chromium/chrome/browser/resources/local_ntp/voice.css b/chromium/chrome/browser/resources/local_ntp/voice.css
deleted file mode 100644
index 01a8b4be263..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/voice.css
+++ /dev/null
@@ -1,596 +0,0 @@
-/* Copyright 2017 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* This template provides the styles used by the Speech feature. There is one UI
- * used for on the local NTP: the Full Page UI ("overlay") that takes over the
- * whole page.
- *
- * This mode also has a hidden and a visible state to allow for show and hide
- * animations. As such, there are 2 different UIs, specified by different
- * modifier classes (the class is applied to the Element with id=voice-overlay):
- * - Hidden in the Full Page view (parent class: overlay-hidden).
- * - Visible in the Full Page view (parent class: overlay).
- *
- * In addition, speech recognition can be in one of 5 different states that can
- * manifest in each of the UIs (the corresponding class names are applied to the
- * element with id=outer):
- * - Listening for audio (parent class: voice-ml).
- * - Receiving speech (parent class: voice-rs).
- * - Error received (parent class: voice-er).
- * - Inactive (no parent class).
- *
- * For details, see go/gws-speech-design and go/local-ntp-voice-search. */
-
-/* Color constants. */
-:root {
- --dark_red: rgb(205, 0, 0);
- --grey: #777;
- --light_grey: #eee;
- --light_red: rgb(255, 68, 68);
-
- --active_icon_color: white;
- --button_shadow: rgba(0, 0, 0, .1);
- --inactive_icon_color: #999;
- --level_animation_color: #dbdbdb;
- --listening_icon_color: var(--light_red);
- --text_link_color: rgb(17, 85, 204);
-}
-
-/* The dialog container for the background element. */
-.overlay-dialog {
- background: transparent;
- border: none;
- height: 100%;
- left: 0;
- margin: auto;
- padding: 0;
- position: absolute;
- right: 0;
- top: 0;
- width: 100%;
-}
-
-.overlay-dialog::backdrop {
- background-color: white;
-}
-
-@media (prefers-color-scheme: dark) {
- .overlay-dialog::backdrop {
- /* Equivalent to --dark-mode-dialog-rgb. CSS variables cannot be used in
- * pseudo elements. */
- background-color: rgb(41, 42, 45);
- }
-}
-
-/* The background element. */
-.overlay,
-.overlay-hidden {
- background: white;
- opacity: 0;
- text-align: start;
- transition: visibility 0s linear 218ms, background-color 218ms;
- visibility: hidden;
- z-index: 10000;
-}
-
-@media (prefers-color-scheme: dark) {
- .overlay,
- .overlay-hidden {
- background-color: rgb(var(--dark-mode-dialog-rgb));
- }
-}
-
-/* Full Page visible style for the background element. */
-.overlay {
- opacity: 1;
- transition-delay: 0s;
- visibility: visible;
-}
-
-/* The close 'x' button. */
-.close-button {
- color: black;
- cursor: pointer;
- font-size: 26px;
- height: 11px;
- line-height: 15px;
- margin: 15px;
- opacity: .54;
- padding: 0;
- position: fixed;
- right: 0;
- top: 0;
- width: 15px;
- z-index: 1;
-}
-
-html[dir=rtl] .close-button {
- left: 0;
- right: auto;
-}
-
-@media (prefers-color-scheme: dark) {
- .close-button {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-.close-button:hover {
- opacity: .66;
-}
-
-.close-button:active {
- opacity: .78;
-}
-
-/* The vertical positioning container. */
-.outer {
- display: block;
- height: 42px;
- pointer-events: none;
- position: absolute;
-}
-
-/* Full Page visible and hidden state of the positioning container. */
-.overlay .outer,
-.overlay-hidden .outer {
- margin: auto;
- margin-top: 312px;
- max-width: 572px;
- min-width: 534px;
- padding: 0 223px;
- position: relative;
- top: 0;
-}
-
-/* Style for the inner container used for horizontal positioning. */
-.inner-container {
- height: 100%;
- opacity: .1;
- pointer-events: none;
- transition: opacity 318ms ease-in;
- width: 100%;
-}
-
-.voice-ml .inner-container,
-.voice-rs .inner-container,
-.voice-er .inner-container {
- opacity: 1;
- transition: opacity 0s;
-}
-
-/* MICROPHONE BUTTON */
-/* Button with microphone icon in center from which pulses and vibrations
- * emanate. */
-.button {
- background-color: white;
- border: 1px solid var(--light_grey);
- border-radius: 100%;
- bottom: 0;
- box-shadow: 0 2px 5px var(--button_shadow);
- cursor: pointer;
- display: inline-block;
- left: 0;
- opacity: 0;
- pointer-events: none;
- position: absolute;
- right: 0;
- top: 0;
- transition: background-color 218ms, border 218ms, box-shadow 218ms;
-}
-
-@media (prefers-color-scheme: dark) {
- .button {
- background-color: rgb(var(--GG900-rgb));
- border-color: rgba(0, 0, 0, .1);
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .3),
- 0 4px 8px 3px rgba(0, 0, 0, .15);
- }
-}
-
-/* Button state when speech recognition is inactive. */
-.overlay-hidden .button {
- opacity: 0;
- pointer-events: none;
- position: absolute;
- transition-delay: 0s;
-}
-
-/* Button state when speech recognition is active. */
-.overlay .button {
- opacity: 1;
- pointer-events: auto;
- position: absolute;
- transition-delay: 0s;
-}
-
-/* Button state when speech input is being received by the microphone. */
-.voice-rs .button {
- background-color: var(--light_red);
- border: 0;
- box-shadow: none;
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-rs .button {
- background-color: rgb(var(--GR300-rgb));
- }
-}
-
-/* Vibrating input volume level. */
-.level {
- background-color: var(--level_animation_color);
- border-radius: 100%;
- display: inline-block;
- height: 301px;
- left: -69px;
- opacity: 1;
- pointer-events: none;
- position: absolute;
- top: -69px;
- transform: scale(.01);
- transition: opacity 218ms;
- width: 301px;
-}
-
-@media (prefers-color-scheme: dark) {
- .level {
- background-color: rgb(var(--GG700-rgb));
- }
-}
-
-/* Container for scaling and positioning of the button. */
-.button-container {
- float: right;
- pointer-events: none;
- position: relative;
- transition: transform 218ms, opacity 218ms ease-in;
-}
-
-html[dir=rtl] .button-container {
- float: left;
-}
-
-/* Common styles applied to the button-container. */
-.overlay .button-container,
-.overlay-hidden .button-container {
- height: 165px;
- right: -70px;
- top: -70px;
- width: 165px;
-}
-
-html[dir=rtl] .overlay .button-container,
-html[dir=rtl] .overlay-hidden .button-container {
- left: -70px;
- right: auto;
-}
-
-/* Container style when speech recognition is inactive. */
-.overlay-hidden .button-container {
- transform: scale(.1);
-}
-
-/* Style applied to the button when clicked in the 'receiving audio' state. */
-.voice-rs .button:active {
- background-color: var(--dark_red);
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-rs .button:active {
- background-color: rgb(223, 128, 119);
- }
-}
-
-/* Style applied to the button when clicked. */
-.button:active {
- background-color: var(--light_grey);
-}
-
-@media (prefers-color-scheme: dark) {
- .button:active {
- background-color: rgb(53, 54, 57);
- }
-}
-
-/* TEXT */
-/* Classes:
- * - voice-text - Text area style class
- * - voice-text-2l - 2 line style class
- * - voice-text-3l - 3 line style class
- * - voice-text-4l - 4 line style class
- * - voice-text-5l - 5 line style class */
-
-/* Styles applied to the positioning text-container element. */
-#text-container {
- pointer-events: none;
-}
-
-/* Full Page UI style for the text-container. */
-.overlay #text-container,
-.overlay-hidden #text-container {
- position: absolute;
-}
-
-/* This class is used to specify the speech recognition text formatting. */
-.voice-text {
- font-weight: normal;
- line-height: 1.2;
- opacity: 0;
- pointer-events: none;
- position: absolute;
- text-align: start;
- transition: opacity 100ms ease-in, margin-inline-start 500ms ease-in,
- top 0s linear 218ms;
-}
-
-/* Recognition results text hidden in the Full Page UI. */
-.overlay-hidden .voice-text {
- margin-inline-start: 44px;
-}
-
-html[dir=rtl] .overlay-hidden .voice-text {
- margin-inline-end: 44px;
- margin-inline-start: 0;
-}
-
-/* Styles applied to the text output elements. Common style for the text area
- * class for the full Page UI. To vertically center the text as longer queries
- * are wrapped, the 'top' position is specified in em here and below. */
-.overlay .voice-text,
-.overlay-hidden .voice-text {
- font-size: 32px;
- left: -44px;
- top: -.2em;
- width: 460px;
-}
-
-html[dir=rtl] .overlay .voice-text,
-html[dir=rtl] .overlay-hidden .voice-text {
- left: auto;
- right: -44px;
-}
-
-/* Common style for when the text areas are made visible. */
-.overlay .voice-text {
- margin-inline-start: 0;
- opacity: 1;
- transition: opacity 500ms ease-out, margin-inline-start 500ms ease-out;
-}
-
-html[dir=rtl] .overlay .voice-text {
- margin-inline-end: 0;
- margin-inline-start: auto;
-}
-
-/* Interim (low confidence) text. */
-#voice-text-i {
- color: var(--grey);
-}
-
-@media (prefers-color-scheme: dark) {
- #voice-text-i {
- color: rgb(var(--GG500-rgb));
- }
-}
-
-/* Final (high confidence) text. */
-#voice-text-f {
- color: black;
-}
-
-@media (prefers-color-scheme: dark) {
- #voice-text-f {
- color: rgb(var(--GG200-rgb));
- }
-}
-
-/* Text area links. */
-.voice-text-link {
- color: var(--text_link_color);
- cursor: pointer;
- font-size: 18px;
- font-weight: 500;
- pointer-events: auto;
- text-decoration: underline;
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-text-link {
- color: rgb(var(--GB300-rgb));
- }
-}
-
-/* Range of motion for the typing animation. */
-@keyframes type {
- from {
- width: 0;
- }
- to {
- width: 460px;
- }
-}
-
-/* Style to simulate typing the "Listening..." text. */
-.listening-animation {
- animation: type 900ms steps(30, end);
- overflow: hidden;
- white-space: nowrap;
-}
-
-/* Styles applied to simulate vertical scrolling. Common webkit transition
- * style for vertical text scrolling. */
-.voice-text-2l.voice-text,
-.voice-text-3l.voice-text,
-.voice-text-4l.voice-text {
- transition: top 218ms ease-out;
-}
-
-/* When the text height is two lines. */
-.voice-text-2l.voice-text {
- top: -.6em;
-}
-
-/* When the text height is three lines. */
-.voice-text-3l.voice-text {
- top: -1.3em;
-}
-
-/* When the text height is four lines. */
-.voice-text-4l.voice-text {
- top: -1.7em;
-}
-
-/* When the text height is more than five lines, shift the text up. */
-.voice-text-5l.voice-text {
- top: -2.5em;
-}
-
-/* MICROPHONE ICON */
-/* The microphone icon is made up of 4 parts:
- * - the audio receiver,
- * - the shell that surrounds the lower half of the audio receiver,
- * - the stem that holds up the shell and the audio receiver,
- * - and a wrapper that positions the shell and stem.
- *
- * /===\
- * | | <==== Audio receiver.
- * | |
- * \ \===/ / <== Shell.
- * \_______/
- * |
- * | <====== Stem. */
-
-/* Container element for microphone icon. */
-.microphone {
- direction: ltr;
- height: 87px;
- left: 43px;
- pointer-events: none;
- position: absolute;
- top: 47px;
- width: 42px;
-}
-
-/* Part 1 of CSS-only microphone icon: the audio receiver.
- * Positioned in the center. */
-.receiver {
- background-color: var(--inactive_icon_color);
- border-radius: 30px;
- height: 46px;
- left: 25px;
- pointer-events: none;
- position: absolute;
- width: 24px;
-}
-
-@media (prefers-color-scheme: dark) {
- .receiver {
- background-color: rgb(var(--GG500-rgb));
- }
-}
-
-/* Part 2 of CSS-only microphone icon: the shell and stem wrapper element.
- * Positioned below the audio receiver element. */
-.wrapper {
- bottom: 0;
- height: 53px;
- left: 11px;
- overflow: hidden;
- pointer-events: none;
- position: absolute;
- width: 52px;
-}
-
-/* Part 3 of CSS-only microphone icon: the stem that supports the shell.
- * Positioned below the audio receiver element and the shell element. */
-.stem {
- background-color: var(--inactive_icon_color);
- bottom: 14px;
- height: 14px;
- left: 22px;
- pointer-events: none;
- position: absolute;
- width: 9px;
- z-index: 1; /* z-index is only used to specify position relative to stem. */
-}
-
-@media (prefers-color-scheme: dark) {
- .stem {
- background-color: rgb(var(--GG500-rgb));
- }
-}
-
-/* Part 4 of CSS-only microphone icon: shell that holds the receiver.
- * Positioned below the audio receiver element and above the stem element. */
-.shell {
- border: 7px solid var(--inactive_icon_color);
- border-radius: 28px;
- bottom: 27px;
- height: 57px;
- pointer-events: none;
- position: absolute;
- width: 38px;
- z-index: 0; /* z-index is only used to specify position relative to stem. */
-}
-
-@media (prefers-color-scheme: dark) {
- .shell {
- border-color: rgb(var(--GG500-rgb));
- }
-}
-
-/* The .voice-ml style is applied when the UI is in
- * the 'listening for audio' state. */
-.voice-ml .receiver,
-.voice-ml .stem {
- background-color: var(--listening_icon_color);
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-ml .receiver,
- .voice-ml .stem {
- background-color: rgb(var(--GR300-rgb));
- }
-}
-
-.voice-ml .shell {
- border-color: var(--listening_icon_color);
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-ml .shell {
- border-color: rgb(var(--GR300-rgb));
- }
-}
-
-/* The .voice-rs style is applied when the UI is in
- * the 'receiving speech' state. */
-.voice-rs .receiver,
-.voice-rs .stem {
- background-color: var(--active_icon_color);
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-rs .receiver,
- .voice-rs .stem {
- background-color: rgb(var(--GG200-rgb));
- }
-}
-
-.voice-rs .shell {
- border-color: var(--active_icon_color);
-}
-
-@media (prefers-color-scheme: dark) {
- .voice-rs .shell {
- border-color: rgb(var(--GG200-rgb));
- }
-}
-
-#screen-reader-announcer {
- clip: rect(0, 0, 0, 0);
- display: inline-block;
- position: fixed;
-}
diff --git a/chromium/chrome/browser/resources/local_ntp/voice.js b/chromium/chrome/browser/resources/local_ntp/voice.js
deleted file mode 100644
index 9fe3ffd52d6..00000000000
--- a/chromium/chrome/browser/resources/local_ntp/voice.js
+++ /dev/null
@@ -1,1640 +0,0 @@
-/**
- * @license
- * Copyright 2017 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-'use strict';
-
-/**
- * Get the preferred language for UI localization. Represents Chrome's UI
- * language, which might not coincide with the user's "preferred" language
- * in the Settings. For more details, see:
- * - https://developer.mozilla.org/en/docs/Web/API/NavigatorLanguage/language
- * - https://developer.mozilla.org/en/docs/Web/API/NavigatorLanguage/languages
- *
- * The returned value is a language version string as defined in
- * <a href="http://www.ietf.org/rfc/bcp/bcp47.txt">BCP 47</a>.
- * Examples: "en", "en-US", "cs-CZ", etc.
- */
-function getChromeUILanguage() {
- // In Chrome, |window.navigator.language| is not guaranteed to be equal to
- // |window.navigator.languages[0]|.
- return window.navigator.language;
-}
-
-/**
- * The different types of user action and error events that are logged
- * from Voice Search. This enum is used to transfer information to
- * the renderer and is not used as a UMA enum histogram's logged value.
- * Note: Keep in sync with common/ntp_logging_events.h
- * @enum {!number}
- * @const
- */
-const LOG_TYPE = {
- // Activated by clicking on the fakebox icon.
- ACTION_ACTIVATE_SEARCH_BOX: 13,
- // Activated by keyboard shortcut.
- ACTION_ACTIVATE_KEYBOARD: 14,
- // Close the voice overlay by a user's explicit action.
- ACTION_CLOSE_OVERLAY: 15,
- // Submitted voice query.
- ACTION_QUERY_SUBMITTED: 16,
- // Clicked on support link in error message.
- ACTION_SUPPORT_LINK_CLICKED: 17,
- // Retried by clicking Try Again link.
- ACTION_TRY_AGAIN_LINK: 18,
- // Retried by clicking microphone button.
- ACTION_TRY_AGAIN_MIC_BUTTON: 10,
- // Errors received from the Speech Recognition API.
- ERROR_NO_SPEECH: 20,
- ERROR_ABORTED: 21,
- ERROR_AUDIO_CAPTURE: 22,
- ERROR_NETWORK: 23,
- ERROR_NOT_ALLOWED: 24,
- ERROR_SERVICE_NOT_ALLOWED: 25,
- ERROR_BAD_GRAMMAR: 26,
- ERROR_LANGUAGE_NOT_SUPPORTED: 27,
- ERROR_NO_MATCH: 28,
- ERROR_OTHER: 29
-};
-
-/**
- * Enum for keyboard event codes.
- * @enum {!string}
- * @const
- */
-const KEYCODE = {
- ENTER: 'Enter',
- ESC: 'Escape',
- NUMPAD_ENTER: 'NumpadEnter',
- PERIOD: 'Period',
- SPACE: 'Space',
- TAB: 'Tab'
-};
-
-/**
- * The set of possible recognition errors.
- * @enum {!number}
- * @const
- */
-const RecognitionError = {
- NO_SPEECH: 0,
- ABORTED: 1,
- AUDIO_CAPTURE: 2,
- NETWORK: 3,
- NOT_ALLOWED: 4,
- SERVICE_NOT_ALLOWED: 5,
- BAD_GRAMMAR: 6,
- LANGUAGE_NOT_SUPPORTED: 7,
- NO_MATCH: 8,
- OTHER: 9
-};
-
-/**
- * Provides methods for communicating with the <a
- * href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API">
- * Web Speech API</a>, error handling and executing search queries.
- */
-const speech = {};
-
-speech.SCREEN_READER_ANNOUNCER_ = 'screen-reader-announcer';
-
-/**
- * Localized translations for messages used in the Speech UI.
- * @type {{
- * audioError: string,
- * details: string,
- * languageError: string,
- * learnMore: string,
- * listening: string,
- * networkError: string,
- * noTranslation: string,
- * noVoice: string,
- * otherError: string,
- * permissionError: string,
- * ready: string,
- * tryAgain: string,
- * waiting: string
- * }}
- */
-speech.messages = {
- audioError: '',
- details: '',
- languageError: '',
- learnMore: '',
- listening: '',
- networkError: '',
- noTranslation: '',
- noVoice: '',
- otherError: '',
- permissionError: '',
- ready: '',
- tryAgain: '',
- waiting: ''
-};
-
-/**
- * The set of controller states.
- * @enum {number}
- * @private
- */
-speech.State_ = {
- // Initial state of the controller. It is never re-entered.
- // The only state from which the |speech.init()| method can be called.
- // The UI overlay is hidden, recognition is inactive.
- UNINITIALIZED: -1,
- // Represents a ready to be activated state. If voice search is unsuccessful
- // for any reason, the controller will return to this state
- // using |speech.reset_()|. The UI overlay is hidden, recognition is inactive.
- READY: 0,
- // Indicates that speech recognition has started, but no audio has yet
- // been captured. The UI overlay is visible, recognition is active.
- STARTED: 1,
- // Indicates that audio is being captured by the Web Speech API, but no
- // speech has yet been recognized. The UI overlay is visible and indicating
- // that audio is being captured, recognition is active.
- AUDIO_RECEIVED: 2,
- // Represents a state where speech has been recognized by the Web Speech API,
- // but no resulting transcripts have yet been received back. The UI overlay is
- // visible and indicating that audio is being captured, recognition is active.
- SPEECH_RECEIVED: 3,
- // Controller state where speech has been successfully recognized and text
- // transcripts have been reported back. The UI overlay is visible
- // and displaying intermediate results, recognition is active.
- // This state remains until recognition ends successfully or due to an error.
- RESULT_RECEIVED: 4,
- // Indicates that speech recognition has failed due to an error
- // (or a no match error) being received from the Web Speech API.
- // A timeout may have occurred as well. The UI overlay is visible
- // and displaying an error message, recognition is inactive.
- ERROR_RECEIVED: 5,
- // Represents a state where speech recognition has been stopped
- // (either on success or failure) and the UI has not yet reset/redirected.
- // The UI overlay is displaying results or an error message with a timeout,
- // after which the site will either get redirected to search results
- // (successful) or back to the NTP by hiding the overlay (unsuccessful).
- STOPPED: 6
-};
-
-/**
- * Threshold for considering an interim speech transcript result as "confident
- * enough". The more confident the API is about a transcript, the higher the
- * confidence (number between 0 and 1).
- * @private {number}
- * @const
- */
-speech.RECOGNITION_CONFIDENCE_THRESHOLD_ = 0.5;
-
-/**
- * Time in milliseconds to wait before closing the UI after an error has
- * occured. This is a short timeout used when no click-target is present.
- * @private {number}
- * @const
- */
-speech.ERROR_TIMEOUT_SHORT_MS_ = 3000;
-
-/**
- * Time in milliseconds to wait before closing the UI after an error has
- * occured. This is a longer timeout used when there is a click-target is
- * present.
- * @private {number}
- * @const
- */
-speech.ERROR_TIMEOUT_LONG_MS_ = 8000;
-
-/**
- * Time in milliseconds to wait before closing the UI if no interaction has
- * occured.
- * @private {number}
- * @const
- */
-speech.IDLE_TIMEOUT_MS_ = 8000;
-
-/**
- * Maximum number of characters recognized before force-submitting a query.
- * Includes characters of non-confident recognition transcripts.
- * @private {number}
- * @const
- */
-speech.QUERY_LENGTH_LIMIT_ = 120;
-
-/**
- * Specifies the current state of the controller.
- * Note: Different than the UI state.
- * @private {speech.State_}
- */
-speech.currentState_ = speech.State_.UNINITIALIZED;
-
-/**
- * The ID for the error timer.
- * @private {number}
- */
-speech.errorTimer_;
-
-/**
- * The duration of the timeout for the UI elements during an error state.
- * Depending on the error state, we have different durations for the timeout.
- * @private {number}
- */
-speech.errorTimeoutMs_ = 0;
-
-/**
- * The last high confidence voice transcript received from the Web Speech API.
- * This is the actual query that could potentially be submitted to Search.
- * @private {string}
- */
-speech.finalResult_;
-
-/**
- * Base URL for sending queries to Search. Includes trailing forward slash.
- * @private {string}
- */
-speech.googleBaseUrl_;
-
-/**
- * The ID for the idle timer.
- * @private {number}
- */
-speech.idleTimer_;
-
-/**
- * The last low confidence voice transcript received from the Web Speech API.
- * @private {string}
- */
-speech.interimResult_;
-
-/**
- * The Web Speech API object driving the speech recognition transaction.
- * @private {!webkitSpeechRecognition}
- */
-speech.recognition_;
-
-/**
- * Indicates if the user is using keyboard navigation (i.e. tab).
- * @private {boolean}
- */
-speech.usingKeyboardNavigation_ = false;
-
-/**
- * Log an event from Voice Search.
- * @param {number} eventType Event from |LOG_TYPE|.
- */
-speech.logEvent = function(eventType) {
- window.chrome.embeddedSearch.newTabPage.logEvent(eventType);
-};
-
-/**
- * Initialize the speech module as part of the local NTP. Adds event handlers
- * and shows the fakebox microphone icon.
- * @param {string} googleBaseUrl Base URL for sending queries to Search.
- * @param {!Object} translatedStrings Dictionary of localized string messages.
- * @param {?Element} fakeboxMicrophoneElem Fakebox microphone icon element.
- * @param {!Object} searchboxApiHandle SearchBox API handle.
- */
-speech.init = function(
- googleBaseUrl, translatedStrings, fakeboxMicrophoneElem,
- searchboxApiHandle) {
- if (!fakeboxMicrophoneElem) {
- throw new Error('Speech button element not found.');
- }
-
- if (speech.currentState_ != speech.State_.UNINITIALIZED) {
- throw new Error(
- 'Trying to re-initialize speech when not in UNINITIALIZED state.');
- }
-
- // Initialize event handlers.
- fakeboxMicrophoneElem.hidden = false;
- fakeboxMicrophoneElem.title = translatedStrings.fakeboxMicrophoneTooltip;
- fakeboxMicrophoneElem.onclick = function(event) {
- // If propagated, closes the overlay (click on the background).
- event.stopPropagation();
- speech.logEvent(LOG_TYPE.ACTION_ACTIVATE_SEARCH_BOX);
- speech.start();
- };
- fakeboxMicrophoneElem.onkeydown = function(event) {
- if (!event.repeat && speech.isSpaceOrEnter_(event.code) &&
- speech.currentState_ == speech.State_.READY) {
- event.stopPropagation();
- speech.start();
- }
- };
- window.addEventListener('keydown', speech.onKeyDown);
- if (searchboxApiHandle.onfocuschange) {
- throw new Error('OnFocusChange handler already set on searchbox.');
- }
- searchboxApiHandle.onfocuschange = speech.onOmniboxFocused;
- const dialog = $(view.DIALOG_ID_);
- if (dialog) {
- dialog.addEventListener('close', () => {
- speech.screenReaderAnnounce_(translatedStrings.voiceSearchClosed);
- fakeboxMicrophoneElem.focus();
- });
- }
-
- // Initialize speech internal state.
- speech.googleBaseUrl_ = googleBaseUrl;
- speech.messages = {
- audioError: translatedStrings.audioError,
- details: translatedStrings.details,
- languageError: translatedStrings.languageError,
- learnMore: translatedStrings.learnMore,
- listening: translatedStrings.listening,
- networkError: translatedStrings.networkError,
- noTranslation: translatedStrings.noTranslation,
- noVoice: translatedStrings.noVoice,
- otherError: translatedStrings.otherError,
- permissionError: translatedStrings.permissionError,
- ready: translatedStrings.ready,
- tryAgain: translatedStrings.tryAgain,
- waiting: translatedStrings.waiting,
- };
- view.init(speech.onClick_);
- view.setTitles(translatedStrings);
- speech.initWebkitSpeech_();
- speech.reset_();
-};
-
-/**
- * Initializes and configures the speech recognition API.
- * @private
- */
-speech.initWebkitSpeech_ = function() {
- speech.recognition_ = new webkitSpeechRecognition();
- speech.recognition_.continuous = false;
- speech.recognition_.interimResults = true;
- speech.recognition_.lang = getChromeUILanguage();
- speech.recognition_.onaudiostart = speech.handleRecognitionAudioStart_;
- speech.recognition_.onend = speech.handleRecognitionEnd_;
- speech.recognition_.onerror = speech.handleRecognitionError_;
- speech.recognition_.onnomatch = speech.handleRecognitionOnNoMatch_;
- speech.recognition_.onresult = speech.handleRecognitionResult_;
- speech.recognition_.onspeechstart = speech.handleRecognitionSpeechStart_;
-};
-
-/**
- * Sets up the necessary states for voice search and then starts the
- * speech recognition interface.
- */
-speech.start = function() {
- view.show();
-
- speech.resetIdleTimer_(speech.IDLE_TIMEOUT_MS_);
-
- document.addEventListener(
- 'webkitvisibilitychange', speech.onVisibilityChange_, false);
-
- // Initialize |speech.recognition_| if it isn't already.
- if (!speech.recognition_) {
- speech.initWebkitSpeech_();
- }
-
- // If |speech.start()| is called too soon after |speech.stop()| then the
- // recognition interface hasn't yet reset and an error occurs. In this case
- // we need to hard-reset it and reissue the |recognition_.start()| command.
- try {
- speech.recognition_.start();
- speech.currentState_ = speech.State_.STARTED;
- } catch (error) {
- speech.initWebkitSpeech_();
- try {
- speech.recognition_.start();
- speech.currentState_ = speech.State_.STARTED;
- } catch (error2) {
- speech.stop();
- }
- }
-};
-
-/**
- * Hides the overlay and resets the speech state.
- */
-speech.stop = function() {
- speech.recognition_.abort();
- speech.currentState_ = speech.State_.STOPPED;
- view.hide();
- speech.reset_();
-};
-
-/**
- * Resets the internal state to the READY state.
- * @private
- */
-speech.reset_ = function() {
- window.clearTimeout(speech.idleTimer_);
- window.clearTimeout(speech.errorTimer_);
-
- document.removeEventListener(
- 'webkitvisibilitychange', speech.onVisibilityChange_, false);
-
- speech.interimResult_ = '';
- speech.finalResult_ = '';
- speech.currentState_ = speech.State_.READY;
- speech.usingKeyboardNavigation_ = false;
-};
-
-/**
- * Informs the view that the browser is receiving audio input.
- * @param {Event=} opt_event Emitted event for audio start.
- * @private
- */
-speech.handleRecognitionAudioStart_ = function(opt_event) {
- speech.resetIdleTimer_(speech.IDLE_TIMEOUT_MS_);
- speech.currentState_ = speech.State_.AUDIO_RECEIVED;
- view.setReadyForSpeech();
-};
-
-/**
- * Function is called when the user starts speaking.
- * @param {Event=} opt_event Emitted event for speech start.
- * @private
- */
-speech.handleRecognitionSpeechStart_ = function(opt_event) {
- speech.resetIdleTimer_(speech.IDLE_TIMEOUT_MS_);
- speech.currentState_ = speech.State_.SPEECH_RECEIVED;
- view.setReceivingSpeech();
-};
-
-/**
- * Processes the recognition results arriving from the Web Speech API.
- * @param {SpeechRecognitionEvent} responseEvent Event coming from the API.
- * @private
- */
-speech.handleRecognitionResult_ = function(responseEvent) {
- speech.resetIdleTimer_(speech.IDLE_TIMEOUT_MS_);
-
- switch (speech.currentState_) {
- case speech.State_.RESULT_RECEIVED:
- case speech.State_.SPEECH_RECEIVED:
- // Normal, expected states for processing results.
- break;
- case speech.State_.AUDIO_RECEIVED:
- // Network bugginess (the onaudiostart packet was lost).
- speech.handleRecognitionSpeechStart_();
- break;
- case speech.State_.STARTED:
- // Network bugginess (the onspeechstart packet was lost).
- speech.handleRecognitionAudioStart_();
- speech.handleRecognitionSpeechStart_();
- break;
- default:
- // Not expecting results in any other states.
- return;
- }
-
- const results = responseEvent.results;
- if (results.length == 0) {
- return;
- }
- speech.currentState_ = speech.State_.RESULT_RECEIVED;
- speech.interimResult_ = '';
- speech.finalResult_ = '';
-
- const finalResult = results[responseEvent.resultIndex];
- // Process final results.
- if (finalResult.isFinal) {
- speech.finalResult_ = finalResult[0].transcript;
- view.updateSpeechResult(speech.finalResult_, speech.finalResult_);
-
- speech.submitFinalResult_();
- return;
- }
-
- // Process interim results.
- for (let j = 0; j < results.length; j++) {
- const result = results[j][0];
- speech.interimResult_ += result.transcript;
- if (result.confidence > speech.RECOGNITION_CONFIDENCE_THRESHOLD_) {
- speech.finalResult_ += result.transcript;
- }
- }
- view.updateSpeechResult(speech.interimResult_, speech.finalResult_);
-
- // Force-stop long queries.
- if (speech.interimResult_.length > speech.QUERY_LENGTH_LIMIT_) {
- if (speech.finalResult_) {
- speech.submitFinalResult_();
- } else {
- speech.onErrorReceived_(RecognitionError.NO_MATCH);
- }
- }
-};
-
-/**
- * Convert a |RecognitionError| to a |LOG_TYPE| error constant,
- * for UMA logging.
- * @param {RecognitionError} error The received error.
- * @private
- */
-speech.errorToLogType_ = function(error) {
- switch (error) {
- case RecognitionError.ABORTED:
- return LOG_TYPE.ERROR_ABORTED;
- case RecognitionError.AUDIO_CAPTURE:
- return LOG_TYPE.ERROR_AUDIO_CAPTURE;
- case RecognitionError.BAD_GRAMMAR:
- return LOG_TYPE.ERROR_BAD_GRAMMAR;
- case RecognitionError.LANGUAGE_NOT_SUPPORTED:
- return LOG_TYPE.ERROR_LANGUAGE_NOT_SUPPORTED;
- case RecognitionError.NETWORK:
- return LOG_TYPE.ERROR_NETWORK;
- case RecognitionError.NO_MATCH:
- return LOG_TYPE.ERROR_NO_MATCH;
- case RecognitionError.NO_SPEECH:
- return LOG_TYPE.ERROR_NO_SPEECH;
- case RecognitionError.NOT_ALLOWED:
- return LOG_TYPE.ERROR_NOT_ALLOWED;
- case RecognitionError.SERVICE_NOT_ALLOWED:
- return LOG_TYPE.ERROR_SERVICE_NOT_ALLOWED;
- default:
- return LOG_TYPE.ERROR_OTHER;
- }
-};
-
-/**
- * Handles state transition for the controller when an error occurs
- * during speech recognition.
- * @param {RecognitionError} error The appropriate error state from
- * the RecognitionError enum.
- * @private
- */
-speech.onErrorReceived_ = function(error) {
- speech.logEvent(speech.errorToLogType_(error));
- speech.resetIdleTimer_(speech.IDLE_TIMEOUT_MS_);
- speech.errorTimeoutMs_ = speech.getRecognitionErrorTimeout_(error);
- if (error != RecognitionError.ABORTED) {
- speech.currentState_ = speech.State_.ERROR_RECEIVED;
- view.showError(error);
- window.clearTimeout(speech.idleTimer_);
- speech.resetErrorTimer_(speech.errorTimeoutMs_);
- }
-};
-
-/**
- * Called when an error from Web Speech API is received.
- * @param {SpeechRecognitionError} error The error event.
- * @private
- */
-speech.handleRecognitionError_ = function(error) {
- speech.onErrorReceived_(speech.getRecognitionError_(error.error));
-};
-
-/**
- * Stops speech recognition when no matches are found.
- * @private
- */
-speech.handleRecognitionOnNoMatch_ = function() {
- speech.onErrorReceived_(RecognitionError.NO_MATCH);
-};
-
-/**
- * Stops the UI when the Web Speech API reports that it has halted speech
- * recognition.
- * @private
- */
-speech.handleRecognitionEnd_ = function() {
- window.clearTimeout(speech.idleTimer_);
-
- let error;
- switch (speech.currentState_) {
- case speech.State_.STARTED:
- error = RecognitionError.AUDIO_CAPTURE;
- break;
- case speech.State_.AUDIO_RECEIVED:
- error = RecognitionError.NO_SPEECH;
- break;
- case speech.State_.SPEECH_RECEIVED:
- case speech.State_.RESULT_RECEIVED:
- error = RecognitionError.NO_MATCH;
- break;
- case speech.State_.ERROR_RECEIVED:
- error = RecognitionError.OTHER;
- break;
- default:
- return;
- }
-
- // If error has not yet been displayed.
- if (speech.currentState_ != speech.State_.ERROR_RECEIVED) {
- view.showError(error);
- speech.resetErrorTimer_(speech.ERROR_TIMEOUT_LONG_MS_);
- }
- speech.currentState_ = speech.State_.STOPPED;
-};
-
-/**
- * Determines whether the user's browser is probably running on a Mac.
- * @return {boolean} True iff the user's browser is running on a Mac.
- * @private
- */
-speech.isUserAgentMac_ = function() {
- return window.navigator.userAgent.includes('Macintosh');
-};
-
-/**
- * Determines, if the given KeyboardEvent |code| is a space or enter key.
- * @param {string} code A KeyboardEvent's |code| property.
- * @return True, iff the code represents a space or enter key.
- * @private
- */
-speech.isSpaceOrEnter_ = function(code) {
- switch (code) {
- case KEYCODE.ENTER:
- case KEYCODE.NUMPAD_ENTER:
- case KEYCODE.SPACE:
- return true;
- default:
- return false;
- }
-};
-
-/**
- * Determines if the given event's target id is for a button or navigation link.
- * @param {string} id An event's target id.
- * @return True, iff the id is for a button or link.
- * @private
- */
-speech.isButtonOrLink_ = function(id) {
- switch (id) {
- case text.RETRY_LINK_ID:
- case text.SUPPORT_LINK_ID:
- case view.CLOSE_BUTTON_ID:
- return true;
- default:
- return false;
- }
-};
-
-/**
- * Handles the following keyboard actions.
- * - <CTRL> + <SHIFT> + <.> starts voice input(<CMD> + <SHIFT> + <.> on mac).
- * - <ESC> aborts voice input when the recognition interface is active.
- * - <ENTER> or <SPACE> interprets as a click if the target is a button or
- * navigation link, otherwise it submits the speech query if there is one
- * @param {!Event} event The keydown event.
- */
-speech.onKeyDown = function(event) {
- if (speech.isUiDefinitelyHidden_()) {
- const ctrlKeyPressed =
- event.ctrlKey || (speech.isUserAgentMac_() && event.metaKey);
- if (speech.currentState_ == speech.State_.READY &&
- event.code == KEYCODE.PERIOD && event.shiftKey && ctrlKeyPressed) {
- speech.logEvent(LOG_TYPE.ACTION_ACTIVATE_KEYBOARD);
- speech.start();
- }
- } else {
- // Ensures that keyboard events are not propagated during voice input.
- event.stopPropagation();
-
- if (event.code == KEYCODE.TAB) {
- speech.usingKeyboardNavigation_ = true;
- } else if (speech.isSpaceOrEnter_(event.code)) {
- if (event.target != null && speech.isButtonOrLink_(event.target.id)) {
- view.onWindowClick_(event);
- } else if (speech.finalResult_) {
- speech.submitFinalResult_();
- } else {
- speech.logEvent(LOG_TYPE.ACTION_CLOSE_OVERLAY);
- speech.stop();
- }
- } else if (event.code == KEYCODE.ESC) {
- speech.logEvent(LOG_TYPE.ACTION_CLOSE_OVERLAY);
- speech.stop();
- }
- }
-};
-
-/**
- * Displays the no match error if no interactions occur after some time while
- * the interface is active. This is a safety net in case the onend event
- * doesn't fire, or the user has persistent noise in the background, and does
- * not speak. If a high confidence transcription was received, then this submits
- * the search query instead of displaying an error.
- * @private
- */
-speech.onIdleTimeout_ = function() {
- if (speech.finalResult_) {
- speech.submitFinalResult_();
- return;
- }
-
- switch (speech.currentState_) {
- case speech.State_.STARTED:
- case speech.State_.AUDIO_RECEIVED:
- case speech.State_.SPEECH_RECEIVED:
- case speech.State_.RESULT_RECEIVED:
- case speech.State_.ERROR_RECEIVED:
- speech.onErrorReceived_(RecognitionError.NO_MATCH);
- break;
- }
-};
-
-/**
- * Aborts the speech recognition interface when the user switches to a new
- * tab or window.
- * @private
- */
-speech.onVisibilityChange_ = function() {
- if (speech.isUiDefinitelyHidden_()) {
- return;
- }
-
- if (document.webkitHidden) {
- speech.stop();
- }
-};
-
-/**
- * Aborts the speech session if the UI is showing and omnibox gets focused. Does
- * not abort if the user is using keyboard navigation (i.e. tab).
- */
-speech.onOmniboxFocused = function() {
- if (!speech.isUiDefinitelyHidden_() && !speech.usingKeyboardNavigation_) {
- speech.logEvent(LOG_TYPE.ACTION_CLOSE_OVERLAY);
- speech.stop();
- }
-};
-
-/**
- * Change the location of this tab to the new URL. Used for query submission.
- * @param {!URL} url The URL to navigate to.
- * @private
- */
-speech.navigateToUrl_ = function(url) {
- window.location.href = url.href;
-};
-
-/**
- * Submits the final spoken speech query to perform a search.
- * @private
- */
-speech.submitFinalResult_ = function() {
- window.clearTimeout(speech.idleTimer_);
- if (!speech.finalResult_) {
- throw new Error('Submitting empty query.');
- }
-
- const searchParams = new URLSearchParams();
- // Add the encoded query. Getting |speech.finalResult_| needs to happen
- // before stopping speech.
- searchParams.append('q', speech.finalResult_);
- // Add a parameter to indicate that this request is a voice search.
- searchParams.append('gs_ivs', '1');
-
- // Build the query URL.
- const queryUrl = new URL('/search', speech.googleBaseUrl_);
- queryUrl.search = searchParams.toString();
-
- speech.logEvent(LOG_TYPE.ACTION_QUERY_SUBMITTED);
- speech.stop();
- speech.navigateToUrl_(queryUrl);
-};
-
-/**
- * Returns the error type based on the error string received from the webkit
- * speech recognition API.
- * @param {string} error The error string received from the webkit speech
- * recognition API.
- * @return {RecognitionError} The appropriate error state from
- * the RecognitionError enum.
- * @private
- */
-speech.getRecognitionError_ = function(error) {
- switch (error) {
- case 'aborted':
- return RecognitionError.ABORTED;
- case 'audio-capture':
- return RecognitionError.AUDIO_CAPTURE;
- case 'bad-grammar':
- return RecognitionError.BAD_GRAMMAR;
- case 'language-not-supported':
- return RecognitionError.LANGUAGE_NOT_SUPPORTED;
- case 'network':
- return RecognitionError.NETWORK;
- case 'no-speech':
- return RecognitionError.NO_SPEECH;
- case 'not-allowed':
- return RecognitionError.NOT_ALLOWED;
- case 'service-not-allowed':
- return RecognitionError.SERVICE_NOT_ALLOWED;
- default:
- return RecognitionError.OTHER;
- }
-};
-
-/**
- * Returns a timeout based on the error received from the webkit speech
- * recognition API.
- * @param {RecognitionError} error An error from the RecognitionError enum.
- * @return {number} The appropriate timeout duration for displaying the error.
- * @private
- */
-speech.getRecognitionErrorTimeout_ = function(error) {
- switch (error) {
- case RecognitionError.AUDIO_CAPTURE:
- case RecognitionError.NO_SPEECH:
- case RecognitionError.NOT_ALLOWED:
- case RecognitionError.SERVICE_NOT_ALLOWED:
- case RecognitionError.NO_MATCH:
- return speech.ERROR_TIMEOUT_LONG_MS_;
- default:
- return speech.ERROR_TIMEOUT_SHORT_MS_;
- }
-};
-
-/**
- * Resets the idle state timeout.
- * @param {number} duration The duration after which to close the UI.
- * @private
- */
-speech.resetIdleTimer_ = function(duration) {
- window.clearTimeout(speech.idleTimer_);
- speech.idleTimer_ = window.setTimeout(speech.onIdleTimeout_, duration);
-};
-
-/**
- * Resets the idle error state timeout.
- * @param {number} duration The duration after which to close the UI during an
- * error state.
- * @private
- */
-speech.resetErrorTimer_ = function(duration) {
- window.clearTimeout(speech.errorTimer_);
- speech.errorTimer_ = window.setTimeout(speech.stop, duration);
-};
-
-/**
- * Check to see if the speech recognition interface is running, and has
- * received any results.
- * @return {boolean} True, if the speech recognition interface is running,
- * and has received any results.
- */
-speech.hasReceivedResults = function() {
- return speech.currentState_ == speech.State_.RESULT_RECEIVED;
-};
-
-/**
- * Check to see if the speech recognition interface is running.
- * @return {boolean} True, if the speech recognition interface is running.
- */
-speech.isRecognizing = function() {
- switch (speech.currentState_) {
- case speech.State_.STARTED:
- case speech.State_.AUDIO_RECEIVED:
- case speech.State_.SPEECH_RECEIVED:
- case speech.State_.RESULT_RECEIVED:
- return true;
- }
- return false;
-};
-
-/**
- * Check if the controller is in a state where the UI is definitely hidden.
- * Since we show the UI for a few seconds after we receive an error from the
- * API, we need a separate definition to |speech.isRecognizing()| to indicate
- * when the UI is hidden. <strong>Note:</strong> that if this function
- * returns false, it might not necessarily mean that the UI is visible.
- * @return {boolean} True if the UI is hidden.
- * @private
- */
-speech.isUiDefinitelyHidden_ = function() {
- switch (speech.currentState_) {
- case speech.State_.READY:
- case speech.State_.UNINITIALIZED:
- return true;
- }
- return false;
-};
-
-/**
- * Handles click events during speech recognition.
- * @param {boolean} shouldSubmit True if a query should be submitted.
- * @param {boolean} shouldRetry True if the interface should be restarted.
- * @param {boolean} navigatingAway True if the browser is navigating away
- * from the NTP.
- * @private
- */
-speech.onClick_ = function(shouldSubmit, shouldRetry, navigatingAway) {
- if (speech.finalResult_ && shouldSubmit) {
- speech.submitFinalResult_();
- } else if (speech.currentState_ == speech.State_.STOPPED && shouldRetry) {
- speech.reset_();
- speech.start();
- } else if (speech.currentState_ == speech.State_.STOPPED && navigatingAway) {
- // If the user clicks on a "Learn more" or "Details" support page link
- // from an error message, do nothing, and let Chrome navigate to that page.
- } else {
- speech.logEvent(LOG_TYPE.ACTION_CLOSE_OVERLAY);
- speech.stop();
- }
-};
-
-/**
- * @param {string} message
- * @private
- */
-speech.screenReaderAnnounce_ = function(message) {
- const annoucer = $(speech.SCREEN_READER_ANNOUNCER_);
- annoucer.innerText = '';
- setTimeout(() => {
- annoucer.innerText = message;
- }, 100);
-};
-
-/* TEXT VIEW */
-
-/**
- * Provides methods for styling and animating the text areas
- * left of the microphone button.
- */
-const text = {};
-
-/**
- * ID for the "Try Again" link shown in error output.
- * @const
- */
-text.RETRY_LINK_ID = 'voice-retry-link';
-
-/**
- * ID for the Voice Search support site link shown in error output.
- * @const
- */
-text.SUPPORT_LINK_ID = 'voice-support-link';
-
-/**
- * Class for the links shown in error output.
- * @const @private
- */
-text.ERROR_LINK_CLASS_ = 'voice-text-link';
-
-/**
- * Class name for the speech recognition result output area.
- * @const @private
- */
-text.TEXT_AREA_CLASS_ = 'voice-text';
-
-/**
- * Class name for the "Listening..." text animation.
- * @const @private
- */
-text.LISTENING_ANIMATION_CLASS_ = 'listening-animation';
-
-/**
- * ID of the final / high confidence speech recognition results element.
- * @const @private
- */
-text.FINAL_TEXT_AREA_ID_ = 'voice-text-f';
-
-/**
- * ID of the interim / low confidence speech recognition results element.
- * @const @private
- */
-text.INTERIM_TEXT_AREA_ID_ = 'voice-text-i';
-
-/**
- * The line height of the speech recognition results text.
- * @const @private
- */
-text.LINE_HEIGHT_ = 1.2;
-
-/**
- * Font size in the full page view in pixels.
- * @const @private
- */
-text.FONT_SIZE_ = 32;
-
-/**
- * Delay in milliseconds before showing the initializing message.
- * @const @private
- */
-text.INITIALIZING_TIMEOUT_MS_ = 300;
-
-/**
- * Delay in milliseconds before showing the listening message.
- * @const @private
- */
-text.LISTENING_TIMEOUT_MS_ = 2000;
-
-/**
- * Base link target for help regarding voice search. To be appended
- * with a locale string for proper target site localization.
- * @const @private
- */
-text.SUPPORT_LINK_BASE_ =
- 'https://support.google.com/chrome/?p=ui_voice_search&hl=';
-
-/**
- * The final / high confidence speech recognition result element.
- * @private {Element}
- */
-text.final_;
-
-/**
- * The interim / low confidence speech recognition result element.
- * @private {Element}
- */
-text.interim_;
-
-/**
- * Stores the ID of the initializing message timer.
- * @private {number}
- */
-text.initializingTimer_;
-
-/**
- * Stores the ID of the listening message timer.
- * @private {number}
- */
-text.listeningTimer_;
-
-/**
- * Finds the text view elements.
- */
-text.init = function() {
- text.final_ = $(text.FINAL_TEXT_AREA_ID_);
- text.interim_ = $(text.INTERIM_TEXT_AREA_ID_);
- text.clear();
-};
-
-/**
- * Updates the text elements with new recognition results.
- * @param {string} interimText Low confidence speech recognition result text.
- * @param {string} opt_finalText High confidence speech recognition result
- * text, defaults to an empty string.
- */
-text.updateTextArea = function(interimText, opt_finalText = '') {
- window.clearTimeout(text.initializingTimer_);
- text.clearListeningTimeout();
-
- text.interim_.textContent = interimText;
- text.final_.textContent = opt_finalText;
-
- text.interim_.className = text.final_.className = text.getTextClassName_();
-};
-
-/**
- * Sets the text view to the initializing state. The initializing message
- * shown while waiting for permission is not displayed immediately, but after
- * a short timeout. The reason for this is that the "Waiting..." message would
- * still appear ("blink") every time a user opens Voice Search, even if they
- * have already granted and persisted microphone permission for the NTP,
- * and could therefore directly proceed to the "Speak now" message.
- */
-text.showInitializingMessage = function() {
- text.interim_.textContent = '';
- text.final_.textContent = '';
-
- const displayMessage = function() {
- if (text.interim_.textContent == '') {
- text.updateTextArea(speech.messages.waiting);
- }
- };
- text.initializingTimer_ =
- window.setTimeout(displayMessage, text.INITIALIZING_TIMEOUT_MS_);
-};
-
-/**
- * Sets the text view to the ready state.
- */
-text.showReadyMessage = function() {
- window.clearTimeout(text.initializingTimer_);
- text.clearListeningTimeout();
- text.updateTextArea(speech.messages.ready);
- text.startListeningMessageAnimation_();
-};
-
-/**
- * Display an error message in the text area for the given error.
- * @param {RecognitionError} error The error that occured.
- */
-text.showErrorMessage = function(error) {
- text.updateTextArea(text.getErrorMessage_(error));
-
- const linkElement = text.getErrorLink_(error);
- // Setting textContent removes all children (no need to clear link elements).
- if (linkElement) {
- text.interim_.textContent += ' ';
- text.interim_.appendChild(linkElement);
- }
-};
-
-/**
- * Returns an error message based on the error.
- * @param {RecognitionError} error The error that occured.
- * @private
- */
-text.getErrorMessage_ = function(error) {
- switch (error) {
- case RecognitionError.NO_MATCH:
- return speech.messages.noTranslation;
- case RecognitionError.NO_SPEECH:
- return speech.messages.noVoice;
- case RecognitionError.AUDIO_CAPTURE:
- return speech.messages.audioError;
- case RecognitionError.NETWORK:
- return speech.messages.networkError;
- case RecognitionError.NOT_ALLOWED:
- case RecognitionError.SERVICE_NOT_ALLOWED:
- return speech.messages.permissionError;
- case RecognitionError.LANGUAGE_NOT_SUPPORTED:
- return speech.messages.languageError;
- default:
- return speech.messages.otherError;
- }
-};
-
-/**
- * Returns an error message help link based on the error.
- * @param {RecognitionError} error The error that occured.
- * @private
- */
-text.getErrorLink_ = function(error) {
- const linkElement = document.createElement('a');
- linkElement.className = text.ERROR_LINK_CLASS_;
-
- switch (error) {
- case RecognitionError.NO_MATCH:
- linkElement.id = text.RETRY_LINK_ID;
- linkElement.tabIndex = '0';
- linkElement.textContent = speech.messages.tryAgain;
- // When clicked, |view.onWindowClick_| gets called.
- return linkElement;
- case RecognitionError.NO_SPEECH:
- case RecognitionError.AUDIO_CAPTURE:
- linkElement.id = text.SUPPORT_LINK_ID;
- linkElement.href = text.SUPPORT_LINK_BASE_ + getChromeUILanguage();
- linkElement.textContent = speech.messages.learnMore;
- linkElement.target = '_blank';
- return linkElement;
- case RecognitionError.NOT_ALLOWED:
- case RecognitionError.SERVICE_NOT_ALLOWED:
- linkElement.id = text.SUPPORT_LINK_ID;
- linkElement.href = text.SUPPORT_LINK_BASE_ + getChromeUILanguage();
- linkElement.textContent = speech.messages.details;
- linkElement.target = '_blank';
- return linkElement;
- default:
- return null;
- }
-};
-
-/**
- * Clears the text elements.
- */
-text.clear = function() {
- text.updateTextArea('');
-
- text.clearListeningTimeout();
- window.clearTimeout(text.initializingTimer_);
-
- text.interim_.className = text.TEXT_AREA_CLASS_;
- text.final_.className = text.TEXT_AREA_CLASS_;
-};
-
-/**
- * Cancels listening message display.
- */
-text.clearListeningTimeout = function() {
- window.clearTimeout(text.listeningTimer_);
-};
-
-/**
- * Determines the class name of the text output Elements.
- * @return {string} The class name.
- * @private
- */
-text.getTextClassName_ = function() {
- // Shift up for every line.
- const oneLineHeight = text.LINE_HEIGHT_ * text.FONT_SIZE_ + 1;
- const twoLineHeight = text.LINE_HEIGHT_ * text.FONT_SIZE_ * 2 + 1;
- const threeLineHeight = text.LINE_HEIGHT_ * text.FONT_SIZE_ * 3 + 1;
- const fourLineHeight = text.LINE_HEIGHT_ * text.FONT_SIZE_ * 4 + 1;
-
- const height = text.interim_.scrollHeight;
- let className = text.TEXT_AREA_CLASS_;
-
- if (height > fourLineHeight) {
- className += ' voice-text-5l';
- } else if (height > threeLineHeight) {
- className += ' voice-text-4l';
- } else if (height > twoLineHeight) {
- className += ' voice-text-3l';
- } else if (height > oneLineHeight) {
- className += ' voice-text-2l';
- }
- return className;
-};
-
-/**
- * Displays the listening message animation after the ready message has been
- * shown for |text.LISTENING_TIMEOUT_MS_| milliseconds without further user
- * action.
- * @private
- */
-text.startListeningMessageAnimation_ = function() {
- const animateListeningText = function() {
- // If speech is active with no results yet, show the message and animation.
- if (speech.isRecognizing() && !speech.hasReceivedResults()) {
- text.updateTextArea(speech.messages.listening);
- text.interim_.classList.add(text.LISTENING_ANIMATION_CLASS_);
- }
- };
-
- text.listeningTimer_ =
- window.setTimeout(animateListeningText, text.LISTENING_TIMEOUT_MS_);
-};
-
-/* END TEXT VIEW */
-
-/* MICROPHONE VIEW */
-
-/**
- * Provides methods for animating the microphone button and icon
- * on the Voice Search full screen overlay.
- */
-const microphone = {};
-
-/**
- * ID for the button Element.
- * @const
- */
-microphone.RED_BUTTON_ID = 'voice-button';
-
-/**
- * ID for the level animations Element that indicates input volume.
- * @const @private
- */
-microphone.LEVEL_ID_ = 'voice-level';
-
-/**
- * ID for the container of the microphone, red button and level animations.
- * @const @private
- */
-microphone.CONTAINER_ID_ = 'voice-button-container';
-
-/**
- * The minimum transform scale for the volume rings.
- * @const @private
- */
-microphone.LEVEL_SCALE_MINIMUM_ = 0.5;
-
-/**
- * The range of the transform scale for the volume rings.
- * @const @private
- */
-microphone.LEVEL_SCALE_RANGE_ = 0.55;
-
-/**
- * The minimum transition time (in milliseconds) for the volume rings.
- * @const @private
- */
-microphone.LEVEL_TIME_STEP_MINIMUM_ = 170;
-
-/**
- * The range of the transition time for the volume rings.
- * @const @private
- */
-microphone.LEVEL_TIME_STEP_RANGE_ = 10;
-
-/**
- * The button with the microphone icon.
- * @private {Element}
- */
-microphone.button_;
-
-/**
- * The voice level element that is displayed when the user starts speaking.
- * @private {Element}
- */
-microphone.level_;
-
-/**
- * Variable to indicate whether level animations are underway.
- * @private {boolean}
- */
-microphone.isLevelAnimating_ = false;
-
-/**
- * Creates/finds the output elements for the microphone rendering and animation.
- */
-microphone.init = function() {
- // Get the button element and microphone container.
- microphone.button_ = $(microphone.RED_BUTTON_ID);
-
- // Get the animation elements.
- microphone.level_ = $(microphone.LEVEL_ID_);
-};
-
-/**
- * Starts the volume circles animations, if it has not started yet.
- */
-microphone.startInputAnimation = function() {
- if (!microphone.isLevelAnimating_) {
- microphone.isLevelAnimating_ = true;
- microphone.runLevelAnimation_();
- }
-};
-
-/**
- * Stops the volume circles animations.
- */
-microphone.stopInputAnimation = function() {
- microphone.isLevelAnimating_ = false;
-};
-
-/**
- * Runs the volume level animation.
- * @private
- */
-microphone.runLevelAnimation_ = function() {
- if (!microphone.isLevelAnimating_) {
- microphone.level_.style.removeProperty('opacity');
- microphone.level_.style.removeProperty('transition');
- microphone.level_.style.removeProperty('transform');
- return;
- }
- const scale = microphone.LEVEL_SCALE_MINIMUM_ +
- Math.random() * microphone.LEVEL_SCALE_RANGE_;
- const timeStep = Math.round(
- microphone.LEVEL_TIME_STEP_MINIMUM_ +
- Math.random() * microphone.LEVEL_TIME_STEP_RANGE_);
- microphone.level_.style.setProperty(
- 'transition', 'transform ' + timeStep + 'ms ease-in-out');
- microphone.level_.style.setProperty('transform', 'scale(' + scale + ')');
- window.setTimeout(microphone.runLevelAnimation_, timeStep);
-};
-
-/* END MICROPHONE VIEW */
-
-/* VIEW */
-
-/**
- * Provides methods for manipulating and animating the Voice Search
- * full screen overlay.
- */
-const view = {};
-
-/**
- * ID for the close button in the speech output container.
- * @const
- */
-view.CLOSE_BUTTON_ID = 'voice-close-button';
-
-/**
- * Class name of the speech recognition interface on the homepage.
- * @const @private
- */
-view.OVERLAY_CLASS_ = 'overlay';
-
-/**
- * Class name of the speech recognition interface when it is hidden on the
- * homepage.
- * @const @private
- */
-view.OVERLAY_HIDDEN_CLASS_ = 'overlay-hidden';
-
-/**
- * ID for the dialog that contains the speech recognition interface.
- * @const @private
- */
-view.DIALOG_ID_ = 'voice-overlay-dialog';
-
-/**
- * ID for the speech output background.
- * @const @private
- */
-view.BACKGROUND_ID_ = 'voice-overlay';
-
-/**
- * ID for the speech output container.
- * @const @private
- */
-view.CONTAINER_ID_ = 'voice-outer';
-
-/**
- * Class name used to modify the UI to the 'listening' state.
- * @const @private
- */
-view.MICROPHONE_LISTENING_CLASS_ = 'outer voice-ml';
-
-/**
- * Class name used to modify the UI to the 'receiving speech' state.
- * @const @private
- */
-view.RECEIVING_SPEECH_CLASS_ = 'outer voice-rs';
-
-/**
- * Class name used to modify the UI to the 'error received' state.
- * @const @private
- */
-view.ERROR_RECEIVED_CLASS_ = 'outer voice-er';
-
-/**
- * Class name used to modify the UI to the inactive state.
- * @const @private
- */
-view.INACTIVE_CLASS_ = 'outer';
-
-/**
- * Background element and container of all other elements.
- * @private {Element}
- */
-view.background_;
-
-/**
- * The container used to position the microphone and text output area.
- * @private {Element}
- */
-view.container_;
-
-/**
- * True if the the last error message shown was for the 'no-match' error.
- * @private {boolean}
- */
-view.isNoMatchShown_ = false;
-
-/**
- * True if the UI elements are visible.
- * @private {boolean}
- */
-view.isVisible_ = false;
-
-/**
- * The function to call when there is a click event.
- * @private {Function}
- */
-view.onClick_;
-
-/**
- * Displays the UI.
- */
-view.show = function() {
- if (!view.isVisible_) {
- text.showInitializingMessage();
- view.showView_();
- window.addEventListener('click', view.onWindowClick_, false);
- }
-};
-
-/**
- * Sets the output area text to listening. This should only be called when
- * the Web Speech API starts receiving audio input (i.e., onaudiostart).
- */
-view.setReadyForSpeech = function() {
- if (view.isVisible_) {
- view.container_.className = view.MICROPHONE_LISTENING_CLASS_;
- text.showReadyMessage();
- }
-};
-
-/**
- * Shows the pulsing animation emanating from the microphone. This should only
- * be called when the Web Speech API starts receiving speech input (i.e.,
- * |onspeechstart|). Do note that this may also be run when the Web Speech API
- * is receiving speech recognition results (|onresult|), because |onspeechstart|
- * may not have been called.
- */
-view.setReceivingSpeech = function() {
- if (view.isVisible_) {
- view.container_.className = view.RECEIVING_SPEECH_CLASS_;
- microphone.startInputAnimation();
- text.clearListeningTimeout();
- }
-};
-
-/**
- * Updates the speech recognition results output with the latest results.
- * @param {string} interimResultText Low confidence recognition text (grey).
- * @param {string} finalResultText High confidence recognition text (black).
- */
-view.updateSpeechResult = function(interimResultText, finalResultText) {
- if (view.isVisible_) {
- // If the Web Speech API is receiving speech recognition results
- // (|onresult|) and |onspeechstart| has not been called.
- if (view.container_.className != view.RECEIVING_SPEECH_CLASS_) {
- view.setReceivingSpeech();
- }
- text.updateTextArea(interimResultText, finalResultText);
- }
-};
-
-/**
- * Hides the UI and stops animations.
- */
-view.hide = function() {
- window.removeEventListener('click', view.onWindowClick_, false);
- view.stopMicrophoneAnimations_();
- view.hideView_();
- view.isNoMatchShown_ = false;
- text.clear();
-};
-
-/**
- * Find the page elements that will be used to render the speech recognition
- * interface area.
- * @param {Function} onClick The function to call when there is a click event
- * in the window.
- */
-view.init = function(onClick) {
- view.onClick_ = onClick;
-
- view.dialog_ = $(view.DIALOG_ID_);
- view.background_ = $(view.BACKGROUND_ID_);
- view.container_ = $(view.CONTAINER_ID_);
-
- text.init();
- microphone.init();
-};
-
-/**
- * Sets accessibility titles/labels for the page elements.
- * @param {!Object} translatedStrings Dictionary of localized title strings.
- */
-view.setTitles = function(translatedStrings) {
- const closeButton = $(view.CLOSE_BUTTON_ID);
- closeButton.title = translatedStrings.voiceCloseTooltip;
- closeButton.setAttribute('aria-label', translatedStrings.voiceCloseTooltip);
-};
-
-/**
- * Displays an error message and stops animations.
- * @param {RecognitionError} error The error type.
- */
-view.showError = function(error) {
- view.container_.className = view.ERROR_RECEIVED_CLASS_;
- text.showErrorMessage(error);
- view.stopMicrophoneAnimations_();
- view.isNoMatchShown_ = (error == RecognitionError.NO_MATCH);
-};
-
-/**
- * Makes the view visible.
- * @private
- */
-view.showView_ = function() {
- if (!view.isVisible_) {
- view.dialog_.showModal();
- view.background_.className = view.OVERLAY_HIDDEN_CLASS_;
- view.background_.className = view.OVERLAY_CLASS_;
- view.isVisible_ = true;
- }
-};
-
-/**
- * Hides the view.
- * @private
- */
-view.hideView_ = function() {
- view.dialog_.close();
- view.background_.className = view.OVERLAY_HIDDEN_CLASS_;
- view.container_.className = view.INACTIVE_CLASS_;
- view.background_.removeAttribute('style');
- view.isVisible_ = false;
-};
-
-/**
- * Stops the animations in the microphone view.
- * @private
- */
-view.stopMicrophoneAnimations_ = function() {
- microphone.stopInputAnimation();
-};
-
-/**
- * Makes sure that a click anywhere closes the UI when it is active.
- * @param {!Event} event The click event.
- * @private
- */
-view.onWindowClick_ = function(event) {
- if (!view.isVisible_) {
- return;
- }
- const retryLinkClicked = event.target.id === text.RETRY_LINK_ID;
- const supportLinkClicked = event.target.id === text.SUPPORT_LINK_ID;
- const micIconClicked = event.target.id === microphone.RED_BUTTON_ID;
-
- const submitQuery = micIconClicked && !view.isNoMatchShown_;
- const shouldRetry =
- retryLinkClicked || (micIconClicked && view.isNoMatchShown_);
- const navigatingAway = supportLinkClicked;
-
- speech.usingKeyboardNavigation_ = false;
-
- if (shouldRetry) {
- if (micIconClicked) {
- speech.logEvent(LOG_TYPE.ACTION_TRY_AGAIN_MIC_BUTTON);
- } else if (retryLinkClicked) {
- speech.logEvent(LOG_TYPE.ACTION_TRY_AGAIN_LINK);
- }
- }
- if (supportLinkClicked) {
- speech.logEvent(LOG_TYPE.ACTION_SUPPORT_LINK_CLICKED);
- }
-
- view.onClick_(submitQuery, shouldRetry, navigatingAway);
-};
-
-/* END VIEW */
diff --git a/chromium/chrome/browser/resources/local_state/BUILD.gn b/chromium/chrome/browser/resources/local_state/BUILD.gn
index 996b02bd479..266dc84df7c 100644
--- a/chromium/chrome/browser/resources/local_state/BUILD.gn
+++ b/chromium/chrome/browser/resources/local_state/BUILD.gn
@@ -2,15 +2,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/typescript/ts_library.gni")
-js_type_check("closure_compile") {
- deps = [ ":local_state" ]
-}
-
-js_library("local_state") {
- deps = [
- "//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js:util.m",
- ]
+ts_library("build") {
+ sources = [ "local_state.ts" ]
+ deps = [ "//ui/webui/resources:library" ]
}
diff --git a/chromium/chrome/browser/resources/local_state/local_state.js b/chromium/chrome/browser/resources/local_state/local_state.ts
index d5191e236ae..761b898a123 100644
--- a/chromium/chrome/browser/resources/local_state/local_state.js
+++ b/chromium/chrome/browser/resources/local_state/local_state.ts
@@ -11,7 +11,7 @@ import {$} from 'chrome://resources/js/util.m.js';
// When the page loads, request the JSON local state data from C++.
document.addEventListener('DOMContentLoaded', function() {
- sendWithPromise('requestJson').then(localState => {
+ sendWithPromise('requestJson').then((localState: string) => {
$('content').textContent = localState;
});
});
diff --git a/chromium/chrome/browser/resources/management/management_browser_proxy.js b/chromium/chrome/browser/resources/management/management_browser_proxy.js
index 4636c7db5a6..65dee7211d0 100644
--- a/chromium/chrome/browser/resources/management/management_browser_proxy.js
+++ b/chromium/chrome/browser/resources/management/management_browser_proxy.js
@@ -33,6 +33,7 @@ export let BrowserReportingResponse;
* @typedef {{
* browserManagementNotice: string,
* extensionReportingTitle: string,
+ * managedWebsitesSubtitle: string,
* pageSubtitle: string,
* managed: boolean,
* overview: string,
@@ -76,6 +77,7 @@ export const DeviceReportingType = {
APP_INFO_AND_ACTIVITY: 'app info and activity',
LOGS: 'logs',
PRINT: 'print',
+ PRINT_JOBS: 'print jobs',
CROSTINI: 'crostini',
USERNAME: 'username',
EXTENSION: 'extension',
@@ -97,6 +99,9 @@ export class ManagementBrowserProxy {
/** @return {!Promise<!Array<!Extension>>} */
getExtensions() {}
+ /** @return {!Promise<!Array<!String>>} */
+ getManagedWebsites() {}
+
// <if expr="chromeos">
/**
* @return {!Promise<boolean>} Boolean describing trust root configured
@@ -137,6 +142,11 @@ export class ManagementBrowserProxyImpl {
return sendWithPromise('getExtensions');
}
+ /** @override */
+ getManagedWebsites() {
+ return sendWithPromise('getManagedWebsites');
+ }
+
// <if expr="chromeos">
/** @override */
getLocalTrustRootsInfo() {
diff --git a/chromium/chrome/browser/resources/management/management_ui.html b/chromium/chrome/browser/resources/management/management_ui.html
index 750fdd0dd00..5e763b27e58 100644
--- a/chromium/chrome/browser/resources/management/management_ui.html
+++ b/chromium/chrome/browser/resources/management/management_ui.html
@@ -362,6 +362,22 @@
</table>
</section>
</template>
+ <template is="dom-if"
+ if="[[showManagedWebsitesInfo_(managedWebsites_)]]">
+ <section class="managed-webistes">
+ <h2 class="cr-title-text">$i18n{managedWebsites}</h2>
+ <div class="subtitle">
+ [[managedWebsitesSubtitle_]]
+ </div>
+ <div class="content-indented">
+ <template is="dom-repeat" items="[[managedWebsites_]]">
+ <div class="report">
+ [[item]]
+ </div>
+ </template>
+ </div>
+ </section>
+ </template>
</div>
</div>
</main>
diff --git a/chromium/chrome/browser/resources/management/management_ui.js b/chromium/chrome/browser/resources/management/management_ui.js
index 90aa0b4518a..08d8f216be4 100644
--- a/chromium/chrome/browser/resources/management/management_ui.js
+++ b/chromium/chrome/browser/resources/management/management_ui.js
@@ -4,7 +4,7 @@
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
-import 'chrome://resources/cr_elements/cr_page_host_style_css.m.js';
+import 'chrome://resources/cr_elements/cr_page_host_style_css.js';
import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/icons.m.js';
@@ -53,6 +53,12 @@ Polymer({
*/
extensions_: Array,
+ /**
+ * List of messages related to browser reporting.
+ * @private (?Array<!String>)
+ */
+ managedWebsites_: Array,
+
// <if expr="chromeos">
/**
* List of messages related to device reporting.
@@ -132,6 +138,7 @@ Polymer({
info => this.threatProtectionInfo_ = info);
this.getExtensions_();
+ this.getManagedWebsites_();
// <if expr="chromeos">
this.getDeviceReportingInfo_();
this.getPluginVmDataCollectionStatus_();
@@ -181,6 +188,13 @@ Polymer({
},
/** @private */
+ getManagedWebsites_() {
+ this.browserProxy_.getManagedWebsites().then(managedWebsites => {
+ this.managedWebsites_ = managedWebsites;
+ });
+ },
+
+ /** @private */
getThreatProtectionInfo_() {
this.browserProxy_.getThreatProtectionInfo().then(info => {
this.threatProtectionInfo_ = info;
@@ -262,6 +276,8 @@ Polymer({
return 'management:report';
case DeviceReportingType.PRINT:
return 'cr:print';
+ case DeviceReportingType.PRINT_JOBS:
+ return 'cr:print';
case DeviceReportingType.CROSTINI:
return 'management:linux';
case DeviceReportingType.USERNAME:
@@ -294,6 +310,15 @@ Polymer({
},
/**
+ * @return {boolean} True of there is managed websites info to show.
+ * @private
+ */
+ showManagedWebsitesInfo_() {
+ return !!this.managedWebsites_ && this.managedWebsites_.length > 0;
+ },
+
+
+ /**
* @param {ReportingType} reportingType
* @returns {string} The associated icon.
* @private
@@ -342,6 +367,7 @@ Polymer({
this.browserProxy_.getContextualManagedData().then(data => {
this.managed_ = data.managed;
this.extensionReportingSubtitle_ = data.extensionReportingTitle;
+ this.managedWebsitesSubtitle_ = data.managedWebsitesSubtitle;
this.subtitle_ = data.pageSubtitle;
// <if expr="chromeos">
this.customerLogo_ = data.customerLogo;
diff --git a/chromium/chrome/browser/resources/media/BUILD.gn b/chromium/chrome/browser/resources/media/BUILD.gn
index e87511109be..0f0a3db97dd 100644
--- a/chromium/chrome/browser/resources/media/BUILD.gn
+++ b/chromium/chrome/browser/resources/media/BUILD.gn
@@ -37,7 +37,6 @@ js_type_check("closure_compile") {
deps = [
":media_data_table",
":media_engagement",
- ":media_feeds",
":media_history",
]
}
@@ -63,15 +62,5 @@ js_library("media_history") {
]
}
-js_library("media_feeds") {
- deps = [
- ":media_data_table",
- "//chrome/browser/media/feeds:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:promise_resolver.m",
- "//ui/webui/resources/js:util.m",
- ]
-}
-
js_library("media_data_table") {
}
diff --git a/chromium/chrome/browser/resources/media/OWNERS b/chromium/chrome/browser/resources/media/OWNERS
deleted file mode 100644
index 8e63383c5ab..00000000000
--- a/chromium/chrome/browser/resources/media/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# For Media Engagement
-mlamouri@chromium.org
-
-# For WebRTC
-per-file webrtc_*=file://third_party/webrtc_overrides/OWNERS
diff --git a/chromium/chrome/browser/resources/media/media_feeds.html b/chromium/chrome/browser/resources/media/media_feeds.html
deleted file mode 100644
index b1e1be94ac6..00000000000
--- a/chromium/chrome/browser/resources/media/media_feeds.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
- <title>Media Feeds</title>
- <meta charset="utf-8">
- <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
- <style>
- body {
- font-family: 'Roboto', 'Noto', sans-serif;
- font-size: 14px;
- }
-
- button {
- margin-bottom: 20px;
- }
-
- table {
- border-collapse: collapse;
- margin-bottom: 20px;
- }
-
- table td,
- table th {
- border: 1px solid #777;
- padding-inline-end: 4px;
- padding-inline-start: 4px;
- }
-
- table th {
- background: rgb(224, 236, 255);
- cursor: pointer;
- padding-bottom: 4px;
- padding-inline-end: 4px;
- padding-top: 4px;
- white-space: nowrap;
- }
-
- .url-cell {
- background-color: rgba(230, 230, 230, 0.5);
- }
-
- .name-cell {
- background-color: rgba(230, 230, 230, 0.5);
- }
-
- table tr:hover {
- background: rgb(255, 255, 187);
- }
-
- th.sort-column {
- padding-inline-end: 16px;
- }
-
- th.sort-column::after {
- content: '▲';
- position: absolute;
- }
-
- th[sort-reverse].sort-column::after {
- content: '▼';
- position: absolute;
- }
-
- div#fetch-logs-content {
- color: red;
- }
- </style>
-</head>
-<body>
- <h1>Media Feeds</h1>
- <button id="copy-all-to-clipboard">Copy all to clipboard</button>
- <table>
- <thead>
- <tr id="config-table-header">
- <th>
- Setting Name
- </th>
- <th>
- Setting Value
- </th>
- </tr>
- </thead>
- <tbody id="config-table-body">
- </tbody>
- </table>
- <table id="feeds-table">
- <thead>
- <tr id="feed-table-header">
- <th sort-key="id" class="sort-column" sort-reverse>
- ID
- </th>
- <th sort-key="url">
- Url
- </th>
- <th sort-key="displayName">
- Display Name
- </th>
- <th sort-key="lastDiscoveryTime">
- Last Discovery Time
- </th>
- <th sort-key="lastFetchTime">
- Last Fetch Time
- </th>
- <th sort-key="userStatus">
- User Status
- </th>
- <th sort-key="userIdentifier">
- User ID
- </th>
- <th sort-key="lastFetchResult">
- Last Fetch Result
- </th>
- <th sort-key="fetchFailedCount">
- Fetch Failed Count
- </th>
- <th sort-key="lastFetchTimeNotCacheHit">
- Last Fetch Time (not cache hit)
- </th>
- <th sort-key="lastFetchItemCount">
- Last Fetch Item Count
- </th>
- <th sort-key="lastFetchPlayNextCount">
- Last Fetch Play Next Count
- </th>
- <th sort-key="lastFetchContentTypes">
- Last Fetch Content Types
- </th>
- <th sort-key="lastDisplayTime">
- Last Display Time
- </th>
- <th sort-key="resetReason">
- Reset Reason
- </th>
- <th data-key="cookieNameFilter">
- Cookie Name Filter
- </th>
- <th data-key="safeSearchResult">
- Safe Search Result
- </th>
- <th data-key="favicon">
- Favicon
- </th>
- <th data-key="logos">
- Logos
- </th>
- <th data-key="actions">
- Actions
- </th>
- </tr>
- </thead>
- <tbody id="feed-table-body">
- </tbody>
- </table>
-
- <div id="feed-content" style="display:none;">
- <hr>
- <h2>Feed Contents: <span id="current-feed"></span></h2>
- <table id="feed-items-table">
- <thead>
- <tr>
- <th sort-key="type" class="sort-column" sort-reverse>
- Type
- </th>
- <th sort-key="name">
- Name
- </th>
- <th sort-key="author">
- Author
- </th>
- <th sort-key="datePublished">
- Date Published
- </th>
- <th sort-key="isFamilyFriendly">
- Family Friendly
- </th>
- <th sort-key="actionStatus">
- Action Status
- </th>
- <th sort-key="action.url">
- Action URL
- </th>
- <th sort-key="action.startTime">
- Action Start Time (secs)
- </th>
- <th sort-key="interactionCounters">
- Interaction Counters
- </th>
- <th sort-key="contentRatings">
- Content Ratings
- </th>
- <th sort-key="genre">
- Genre
- </th>
- <th sort-key="live">
- Live Details
- </th>
- <th sort-key="tvEpisode">
- TV Episode
- </th>
- <th sort-key="playNextCandidate">
- Play Next Candidate
- </th>
- <th sort-key="identifiers">
- Identifiers
- </th>
- <th sort-key="shownCount">
- Shown Count
- </th>
- <th sort-key="clicked">
- Clicked
- </th>
- <th sort-key="images">
- Images
- </th>
- <th sort-key="safeSearchResult">
- Safe Search Result
- </th>
- <th sort-key="duration">
- Duration (secs)
- </th>
- </tr>
- </thead>
- <tbody>
- </tbody>
- </table>
- <div id="fetch-logs">
- <h3>Fetch logs:</h3>
- <div id="fetch-logs-content"></div>
- </div>
- </div>
- <script type="module" src="media_feeds.js"></script>
-</body>
-</html>
diff --git a/chromium/chrome/browser/resources/media/media_feeds.js b/chromium/chrome/browser/resources/media/media_feeds.js
deleted file mode 100644
index 534a34c3a8f..00000000000
--- a/chromium/chrome/browser/resources/media/media_feeds.js
+++ /dev/null
@@ -1,680 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
-import 'chrome://resources/mojo/url/mojom/origin.mojom-lite.js';
-import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
-import './ui/gfx/geometry/mojom/geometry.mojom-lite.js';
-import './media_session.mojom-lite.js';
-import './media_feeds_store.mojom-lite.js';
-
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-import {$} from 'chrome://resources/js/util.m.js';
-
-import {MediaDataTable, MediaDataTableDelegate} from './media_data_table.js';
-
-// Allow a function to be provided by tests, which will be called when
-// the page has been populated with media feeds details.
-const mediaFeedsPageIsPopulatedResolver = new PromiseResolver();
-window.whenPageIsPopulatedForTest = function() {
- return mediaFeedsPageIsPopulatedResolver.promise;
-};
-
-const mediaFeedItemsPageIsPopulatedResolver = new PromiseResolver();
-window.whenFeedTableIsPopulatedForTest = function() {
- return mediaFeedItemsPageIsPopulatedResolver.promise;
-};
-
-const mediaFeedsConfigTableIsPopulatedResolver = new PromiseResolver();
-window.whenConfigTableIsPopulatedForTest = function() {
- return mediaFeedsConfigTableIsPopulatedResolver.promise;
-};
-
-const mediaFeedsConfigTableSafeSearchPrefIsUpdatedResolver =
- new PromiseResolver();
-window.whenConfigTableSafeSearchPrefIsUpdatedForTest = function() {
- return mediaFeedsConfigTableSafeSearchPrefIsUpdatedResolver.promise;
-};
-
-const mediaFeedsConfigTableBackgroundFetchingPrefIsUpdatedResolver =
- new PromiseResolver();
-window.whenConfigTableBackgroundFetchingPrefIsUpdatedForTest = function() {
- return mediaFeedsConfigTableBackgroundFetchingPrefIsUpdatedResolver.promise;
-};
-
-let delegate = null;
-let feedsTable = null;
-let feedItemsTable = null;
-let store = null;
-let configTableBody = null;
-
-/** @implements {MediaDataTableDelegate} */
-class MediaFeedsTableDelegate {
- /**
- * Formats a field to be displayed in the data table and inserts it into the
- * element.
- * @param {Element} td
- * @param {?Object} data
- * @param {string} key
- * @param {Object} dataRow
- */
- insertDataField(td, data, key, dataRow) {
- if (key == 'actions') {
- const a = document.createElement('a');
- a.href = '#feed-content';
- a.textContent = 'Show Contents';
- td.appendChild(a);
-
- a.addEventListener('click', () => {
- showFeedContents(dataRow);
-
- // Clear old logs and hide the area from display.
- $('fetch-logs').style.display = 'none';
- $('fetch-logs-content').textContent = '';
- });
-
- td.appendChild(document.createElement('br'));
-
- const fetchFeed = document.createElement('a');
- fetchFeed.href = '#feed-content';
- fetchFeed.textContent = 'Fetch Feed';
- td.appendChild(fetchFeed);
-
- fetchFeed.addEventListener('click', () => {
- store.fetchMediaFeed(dataRow.id).then(response => {
- updateFeedsTable();
- showFeedContents(dataRow);
-
- $('fetch-logs').style.display = 'block';
- $('fetch-logs-content').textContent = response.logs;
- });
- });
- }
-
- if (data === undefined || data === null) {
- return;
- }
-
- if (key === 'url') {
- // Format a mojo GURL.
- td.textContent = data.url;
- } else if (
- key === 'lastDiscoveryTime' || key === 'lastFetchTime' ||
- key === 'lastFetchTimeNotCacheHit' || key === 'datePublished' ||
- key === 'lastDisplayTime') {
- // Format a mojo time.
- td.textContent =
- convertMojoTimeToJS(/** @type {mojoBase.mojom.Time} */ (data))
- .toLocaleString();
- } else if (key === 'userStatus') {
- // Format a FeedUserStatus.
- if (data == mediaFeeds.mojom.FeedUserStatus.kAuto) {
- td.textContent = 'Auto';
- } else if (data == mediaFeeds.mojom.FeedUserStatus.kDisabled) {
- td.textContent = 'Disabled';
- } else if (data == mediaFeeds.mojom.FeedUserStatus.kEnabled) {
- td.textContent = 'Enabled';
- }
- } else if (key === 'lastFetchResult') {
- // Format a FetchResult.
- if (data == mediaFeeds.mojom.FetchResult.kNone) {
- td.textContent = 'None';
- } else if (data == mediaFeeds.mojom.FetchResult.kSuccess) {
- td.textContent = 'Success';
- } else if (data == mediaFeeds.mojom.FetchResult.kFailedBackendError) {
- td.textContent = 'Failed (Backend Error)';
- } else if (data == mediaFeeds.mojom.FetchResult.kFailedNetworkError) {
- td.textContent = 'Failed (Network Error)';
- }
- } else if (key === 'lastFetchContentTypes') {
- // Format a MediaFeedItemType.
- const contentTypes = [];
- const itemType = parseInt(data, 10);
-
- if (itemType & mediaFeeds.mojom.MediaFeedItemType.kVideo) {
- contentTypes.push('Video');
- } else if (itemType & mediaFeeds.mojom.MediaFeedItemType.kTVSeries) {
- contentTypes.push('TV Series');
- } else if (itemType & mediaFeeds.mojom.MediaFeedItemType.kMovie) {
- contentTypes.push('Movie');
- }
-
- td.textContent =
- contentTypes.length === 0 ? 'None' : contentTypes.join(',');
- } else if (key === 'logos' || key === 'images') {
- // Format an array of mojo media images.
- // TODO(crbug.com/1074478): Display the image content attributes.
- data.forEach((image) => {
- const a = document.createElement('a');
- a.href = image.src.url;
- a.textContent = image.src.url;
- a.target = '_blank';
- td.appendChild(a);
- td.appendChild(document.createElement('br'));
-
- const contentAttributes = [];
- if (image.contentAttributes && image.contentAttributes.length !== 0) {
- const p = document.createElement('p');
- const contentAttributes = [];
-
- image.contentAttributes.forEach((contentAttribute) => {
- contentAttributes.push(formatContentAttribute(contentAttribute));
- });
-
- p.textContent = 'ContentAttributes=' + contentAttributes.join(', ');
- td.appendChild(p);
- }
- });
- } else if (key == 'type') {
- // Format a MediaFeedItemType.
- switch (parseInt(data, 10)) {
- case mediaFeeds.mojom.MediaFeedItemType.kVideo:
- td.textContent = 'Video';
- break;
- case mediaFeeds.mojom.MediaFeedItemType.kTVSeries:
- td.textContent = 'TV Series';
- break;
- case mediaFeeds.mojom.MediaFeedItemType.kMovie:
- td.textContent = 'Movie';
- break;
- }
- } else if (key == 'isFamilyFriendly') {
- // Format a IsFamilyFriendly.
- switch (parseInt(data, 10)) {
- case mediaFeeds.mojom.IsFamilyFriendly.kUnknown:
- td.textContent = 'Unknown';
- break;
- case mediaFeeds.mojom.IsFamilyFriendly.kYes:
- td.textContent = 'Yes';
- break;
- case mediaFeeds.mojom.IsFamilyFriendly.kNo:
- td.textContent = 'No';
- break;
- }
- } else if (key == 'clicked') {
- // Format a boolean.
- td.textContent = data ? 'Yes' : 'No';
- } else if (key == 'actionStatus') {
- // Format a MediaFeedItemActionStatus.
- switch (parseInt(data, 10)) {
- case mediaFeeds.mojom.MediaFeedItemActionStatus.kUnknown:
- td.textContent = 'Unknown';
- break;
- case mediaFeeds.mojom.MediaFeedItemActionStatus.kActive:
- td.textContent = 'Active';
- break;
- case mediaFeeds.mojom.MediaFeedItemActionStatus.kPotential:
- td.textContent = 'Potential';
- break;
- case mediaFeeds.mojom.MediaFeedItemActionStatus.kCompleted:
- td.textContent = 'Completed';
- break;
- }
- } else if (key == 'safeSearchResult') {
- // Format a SafeSearchResult.
- switch (parseInt(data, 10)) {
- case mediaFeeds.mojom.SafeSearchResult.kUnknown:
- td.textContent = 'Unknown';
- break;
- case mediaFeeds.mojom.SafeSearchResult.kSafe:
- td.textContent = 'Safe';
- break;
- case mediaFeeds.mojom.SafeSearchResult.kUnsafe:
- td.textContent = 'Unsafe';
- break;
- }
- } else if (key == 'startTime' || key == 'duration') {
- // Format a start time.
- td.textContent =
- timeDeltaToSeconds(/** @type {mojoBase.mojom.TimeDelta} */ (data));
- } else if (key == 'interactionCounters') {
- // Format interaction counters.
- const counters = [];
-
- Object.keys(data).forEach((key) => {
- let keyString = '';
-
- switch (parseInt(key, 10)) {
- case mediaFeeds.mojom.InteractionCounterType.kWatch:
- keyString = 'Watch';
- break;
- case mediaFeeds.mojom.InteractionCounterType.kLike:
- keyString = 'Like';
- break;
- case mediaFeeds.mojom.InteractionCounterType.kDislike:
- keyString = 'Dislike';
- break;
- }
-
- counters.push(keyString + '=' + data[key]);
- });
-
- td.textContent = counters.join(' ');
- } else if (key == 'contentRatings') {
- // Format content ratings.
- const ratings = [];
-
- data.forEach((rating) => {
- ratings.push(rating.agency + ' ' + rating.value);
- });
-
- td.textContent = ratings.join(', ');
- } else if (key == 'author') {
- // Format a mojom author.
- const a = document.createElement('a');
- a.href = data.url;
- a.textContent = data.name;
- a.target = '_blank';
- td.appendChild(a);
- } else if (key == 'name') {
- // Format a mojo string16.
- td.textContent =
- decodeString16(/** @type {mojoBase.mojom.String16} */ (data));
- } else if (key == 'genre') {
- // Format an array of strings.
- td.textContent = data.join(', ');
- } else if (key == 'live') {
- td.textContent =
- formatLiveDetails(/** @type {mediaFeeds.mojom.LiveDetails} */ (data));
- } else if (key == 'tvEpisode') {
- // Format a TV Episode.
- td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
- ' SeasonNumber=' + data.seasonNumber + ' ' +
- formatIdentifiers(/** @type {Array<mediaFeeds.mojom.Identifier>} */ (
- data.identifiers)) + ' DurationSecs=' +
- timeDeltaToSeconds(data.duration);
- if (data.live) {
- td.textContent +=
- ' LiveDetails=' + formatLiveDetails(
- /** @type {mediaFeeds.mojom.LiveDetails} */ (data.live));
- }
- } else if (key == 'playNextCandidate') {
- // Format a Play Next Candidate.
- td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
- ' SeasonNumber=' + data.seasonNumber + ' ' +
- formatIdentifiers(
- /** @type {Array<mediaFeeds.mojom.Identifier>} */ (
- data.identifiers)) +
- ' ActionURL=' + data.action.url.url;
-
- if (data.action.startTime) {
- td.textContent +=
- ' ActionStartTimeSecs=' + timeDeltaToSeconds(data.action.startTime);
- }
-
- td.textContent += ' DurationSecs=' + timeDeltaToSeconds(data.duration);
- } else if (key == 'identifiers') {
- // Format identifiers.
- td.textContent = formatIdentifiers(
- /** @type {Array<mediaFeeds.mojom.Identifier>} */ (data));
- } else if (key === 'lastFetchItemCount') {
- // Format the fetch item count.
- td.textContent =
- data + ' (' + dataRow.lastFetchSafeItemCount + ' confirmed as safe)';
- } else if (key == 'resetReason') {
- // Format a ResetReason.
- switch (parseInt(data, 10)) {
- case mediaFeeds.mojom.ResetReason.kNone:
- td.textContent = 'None';
- break;
- case mediaFeeds.mojom.ResetReason.kCookies:
- td.textContent = 'Cookies';
- break;
- case mediaFeeds.mojom.ResetReason.kVisit:
- td.textContent = 'Visit';
- break;
- case mediaFeeds.mojom.ResetReason.kCache:
- td.textContent = 'Cache';
- break;
- }
- } else if (key === 'userIdentifier') {
- if (data) {
- td.textContent = 'Name=' + data.name;
-
- if (data.email) {
- td.textContent += ' Email=' + data.email;
- }
-
- if (data.image) {
- td.textContent += ' Image=' + data.image.src.url;
- }
- }
- } else if (key === 'favicon') {
- td.textContent = data.url;
- } else {
- td.textContent = data;
- }
- }
-
- /**
- * Compares two objects based on |sortKey|.
- * @param {string} sortKey The name of the property to sort by.
- * @param {?Object} a The first object to compare.
- * @param {?Object} b The second object to compare.
- * @return {number} A negative number if |a| should be ordered
- * before |b|, a positive number otherwise.
- */
- compareTableItem(sortKey, a, b) {
- const val1 = a[sortKey];
- const val2 = b[sortKey];
-
- if (sortKey === 'url') {
- return val1.url > val2.url ? 1 : -1;
- } else if (
- sortKey === 'id' || sortKey === 'displayName' ||
- sortKey === 'userStatus' || sortKey === 'lastFetchResult' ||
- sortKey === 'fetchFailedCount' || sortKey === 'lastFetchItemCount' ||
- sortKey === 'lastFetchPlayNextCount' ||
- sortKey === 'lastFetchContentTypes' || sortKey === 'safeSearchResult' ||
- sortKey === 'type' || sortKey === 'cookieNameFilter') {
- return val1 > val2 ? 1 : -1;
- } else if (
- sortKey === 'lastDiscoveryTime' || sortKey === 'lastFetchTime' ||
- sortKey === 'lastFetchTimeNotCacheHit' ||
- sortKey === 'lastDisplayTime') {
- return val1.internalValue > val2.internalValue ? 1 : -1;
- }
-
- assertNotReached('Unsupported sort key: ' + sortKey);
- return 0;
- }
-}
-
-/**
- * Convert a time delta to seconds.
- * @param {mojoBase.mojom.TimeDelta} timeDelta
- * @returns {number}
- */
-function timeDeltaToSeconds(timeDelta) {
- return Number(timeDelta.microseconds) / 1000 / 1000;
-}
-
-/**
- * Formats an array of identifiers for display.
- * @param {Array<mediaFeeds.mojom.Identifier>} mojoIdentifiers
- * @returns {string}
- */
-function formatIdentifiers(mojoIdentifiers) {
- const identifiers = [];
-
- mojoIdentifiers.forEach((identifier) => {
- let keyString = '';
-
- switch (identifier.type) {
- case mediaFeeds.mojom.Identifier_Type.kTMSRootId:
- keyString = 'TMSRootId';
- break;
- case mediaFeeds.mojom.Identifier_Type.kTMSId:
- keyString = 'TMSId';
- break;
- case mediaFeeds.mojom.Identifier_Type.kPartnerId:
- keyString = 'PartnerId';
- break;
- }
-
- identifiers.push(keyString + '=' + identifier.value);
- });
-
- return identifiers.join(' ');
-}
-
-/**
- * Formats a LiveDetails struct for display.
- * @param {mediaFeeds.mojom.LiveDetails} mojoLiveDetails
- * @returns {string}
- */
-function formatLiveDetails(mojoLiveDetails) {
- let textContent = 'Live';
-
- if (mojoLiveDetails.startTime) {
- textContent += ' ' +
- 'StartTime=' +
- convertMojoTimeToJS(
- /** @type {mojoBase.mojom.Time} */ (mojoLiveDetails.startTime))
- .toLocaleString();
- }
-
- if (mojoLiveDetails.endTime) {
- textContent += ' ' +
- 'EndTime=' +
- convertMojoTimeToJS(
- /** @type {mojoBase.mojom.Time} */ (mojoLiveDetails.endTime))
- .toLocaleString();
- }
-
- return textContent;
-}
-
-/**
- * Formats a single ContentAttribute for display.
- * @param {mediaFeeds.mojom.ContentAttribute} contentAttribute
- * @returns {string}
- */
-function formatContentAttribute(contentAttribute) {
- switch (parseInt(contentAttribute, 10)) {
- case mediaFeeds.mojom.ContentAttribute.kIconic:
- return 'Iconic';
- case mediaFeeds.mojom.ContentAttribute.kSceneStill:
- return 'SceneStill';
- case mediaFeeds.mojom.ContentAttribute.kPoster:
- return 'Poster';
- case mediaFeeds.mojom.ContentAttribute.kBackground:
- return 'Background';
- case mediaFeeds.mojom.ContentAttribute.kForDarkBackground:
- return 'ForDarkBackground';
- case mediaFeeds.mojom.ContentAttribute.kForLightBackground:
- return 'ForLightBackground';
- case mediaFeeds.mojom.ContentAttribute.kCentered:
- return 'Centered';
- case mediaFeeds.mojom.ContentAttribute.kRightCentered:
- return 'RightCentered';
- case mediaFeeds.mojom.ContentAttribute.kLeftCentered:
- return 'LeftCentered';
- case mediaFeeds.mojom.ContentAttribute.kHasTransparentBackground:
- return 'HasTransparentBackground';
- case mediaFeeds.mojom.ContentAttribute.kHasTitle:
- return 'HasTitle';
- case mediaFeeds.mojom.ContentAttribute.kNoTitle:
- return 'NoTitle';
- default:
- return 'Unknown';
- }
-}
-
-/**
- * Parses utf16 coded string.
- * @param {?mojoBase.mojom.String16} arr
- * @return {string}
- */
-function decodeString16(arr) {
- if (arr == null) {
- return '';
- }
-
- return arr.data.map(ch => String.fromCodePoint(ch)).join('');
-}
-
-/**
- * Converts a mojo time to a JS time.
- * @param {mojoBase.mojom.Time} mojoTime
- * @return {Date}
- */
-function convertMojoTimeToJS(mojoTime) {
- if (mojoTime === null) {
- return new Date();
- }
-
- // The new Date().getTime() returns the number of milliseconds since the
- // UNIX epoch (1970-01-01 00::00:00 UTC), while |internalValue| of the
- // device.mojom.Geoposition represents the value of microseconds since the
- // Windows FILETIME epoch (1601-01-01 00:00:00 UTC). So add the delta when
- // sets the |internalValue|. See more info in //base/time/time.h.
- const windowsEpoch = Date.UTC(1601, 0, 1, 0, 0, 0, 0);
- const unixEpoch = Date.UTC(1970, 0, 1, 0, 0, 0, 0);
- // |epochDeltaInMs| equals to base::Time::kTimeTToMicrosecondsOffset.
- const epochDeltaInMs = unixEpoch - windowsEpoch;
- const timeInMs = Number(mojoTime.internalValue) / 1000;
-
- return new Date(timeInMs - epochDeltaInMs);
-}
-
-/**
- * Creates a single row in the config table.
- * @param {string} name The name of the config setting.
- * @param {string} value The value of the config setting.
- * @return {!Node}
- */
-function createConfigRow(name, value) {
- const tr = document.createElement('tr');
-
- const nameCell = document.createElement('td');
- nameCell.textContent = name;
- tr.appendChild(nameCell);
-
- const valueCell = document.createElement('td');
- valueCell.textContent = value;
- tr.appendChild(valueCell);
-
- return tr;
-}
-
-/**
- * Creates a single row in the config table with a toggle button.
- * @param {string} name The name of the config setting.
- * @param {string} value The value of the config setting.
- * @param {Function} clickAction The function to be called to toggle the row.
- * @return {!Node}
- */
-function createConfigRowWithToggle(name, value, clickAction) {
- const tr = document.createElement('tr');
-
- const nameCell = document.createElement('td');
- nameCell.textContent = name;
- tr.appendChild(nameCell);
-
- const valueCell = document.createElement('td');
- tr.appendChild(valueCell);
-
- const a = document.createElement('a');
- a.href = '#';
- a.textContent = value + ' (Toggle)';
- a.addEventListener('click', clickAction);
- valueCell.appendChild(a);
-
- return tr;
-}
-
-/**
- * Regenerates the config table.
- * @param {!mediaFeeds.mojom.DebugInformation} info The debug info
- */
-function renderConfigTable(info) {
- configTableBody.innerHTML = trustedTypes.emptyHTML;
-
- configTableBody.appendChild(createConfigRow(
- 'Safe Search Enabled (value)',
- formatFeatureFlag(info.safeSearchFeatureEnabled)));
-
- configTableBody.appendChild(createConfigRowWithToggle(
- 'Safe Search Enabled (pref)', formatFeatureFlag(info.safeSearchPrefValue),
- () => {
- store.setSafeSearchEnabledPref(!info.safeSearchPrefValue).then(() => {
- updateConfigTable().then(
- () => mediaFeedsConfigTableSafeSearchPrefIsUpdatedResolver
- .resolve());
- });
- }));
-
- configTableBody.appendChild(createConfigRow(
- 'Background Fetching Enabled (value)',
- formatFeatureFlag(info.backgroundFetchingFeatureEnabled)));
-
- configTableBody.appendChild(createConfigRowWithToggle(
- 'Background Fetching Enabled (pref)',
- formatFeatureFlag(info.backgroundFetchingPrefValue), () => {
- store.setBackgroundFetchingPref(!info.backgroundFetchingPrefValue)
- .then(() => {
- updateConfigTable().then(
- () =>
- mediaFeedsConfigTableBackgroundFetchingPrefIsUpdatedResolver
- .resolve());
- });
- }));
-}
-
-/**
- * Retrieve debug info and render the config table.
- */
-function updateConfigTable() {
- return store.getDebugInformation().then(response => {
- renderConfigTable(response.info);
- mediaFeedsConfigTableIsPopulatedResolver.resolve();
- });
-}
-
-/**
- * Converts a boolean into a string value.
- * @param {boolean} value The value of the config setting.
- * @return {string}
- */
-function formatFeatureFlag(value) {
- return value ? 'Enabled' : 'Disabled';
-}
-
-/**
- * Retrieve feed info and render the feed table.
- */
-function updateFeedsTable() {
- store.getMediaFeeds().then(response => {
- feedsTable.setData(response.feeds);
- mediaFeedsPageIsPopulatedResolver.resolve();
- });
-}
-
-/**
- * Retrieve feed items and render the feed contents table.
- * @param {Object} dataRow
- */
-function showFeedContents(dataRow) {
- store.getItemsForMediaFeed(dataRow.id).then(response => {
- feedItemsTable.setData(response.items);
-
- // Show the feed items section.
- $('current-feed').textContent = dataRow.url.url;
- $('feed-content').style.display = 'block';
-
- mediaFeedItemsPageIsPopulatedResolver.resolve();
- });
-}
-
-document.addEventListener('DOMContentLoaded', () => {
- store = mediaFeeds.mojom.MediaFeedsStore.getRemote();
-
- configTableBody = $('config-table-body');
- updateConfigTable();
-
- delegate = new MediaFeedsTableDelegate();
- feedsTable = new MediaDataTable($('feeds-table'), delegate);
- feedItemsTable = new MediaDataTable($('feed-items-table'), delegate);
-
- updateFeedsTable();
-
- // Add handler to 'copy all to clipboard' button
- const copyAllToClipboardButton = $('copy-all-to-clipboard');
- copyAllToClipboardButton.addEventListener('click', (e) => {
- // Make sure nothing is selected
- window.getSelection().removeAllRanges();
-
- document.execCommand('selectAll');
- document.execCommand('copy');
-
- // And deselect everything at the end.
- window.getSelection().removeAllRanges();
- });
-});
diff --git a/chromium/chrome/browser/resources/media/webrtc_logs.html b/chromium/chrome/browser/resources/media/webrtc_logs.html
index 20cd3c16c86..25331a68465 100644
--- a/chromium/chrome/browser/resources/media/webrtc_logs.html
+++ b/chromium/chrome/browser/resources/media/webrtc_logs.html
@@ -5,11 +5,7 @@
<title>$i18n{webrtcLogsTitle}</title>
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="stylesheet" href="webrtc_logs.css">
- <script src="chrome://resources/js/load_time_data.js"></script>
- <script src="chrome://resources/js/assert.js"></script>
- <script src="chrome://resources/js/util.js"></script>
- <script src="strings.js"></script>
- <script src="webrtc_logs.js"></script>
+ <script type="module" src="webrtc_logs.js"></script>
</head>
<body>
<header><h1>$i18n{webrtcLogsTitle}</h1></header>
diff --git a/chromium/chrome/browser/resources/media/webrtc_logs.js b/chromium/chrome/browser/resources/media/webrtc_logs.js
index c5457268fef..085b9148481 100644
--- a/chromium/chrome/browser/resources/media/webrtc_logs.js
+++ b/chromium/chrome/browser/resources/media/webrtc_logs.js
@@ -2,22 +2,25 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import './strings.m.js';
+import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+
/**
* Requests the list of WebRTC logs from the backend.
*/
function requestWebRtcLogsList() {
- chrome.send('requestWebRtcLogsList');
+ sendWithPromise('requestWebRtcLogsList').then(updateWebRtcLogsList);
}
/**
* Callback from backend with the list of WebRTC logs. Builds the UI.
- * @param {array} textLogsList The list of WebRTC text logs.
- * @param {array} eventLogsList The list of WebRTC event logs.
- * @param {string} version The browser version.
+ * @param {!{textLogs: !Array, eventLogs: !Array, version: string}} results
*/
-function updateWebRtcLogsList(textLogsList, eventLogsList, version) {
- updateWebRtcTextLogsList(textLogsList, version);
- updateWebRtcEventLogsList(eventLogsList);
+function updateWebRtcLogsList({textLogs, eventLogs, version}) {
+ updateWebRtcTextLogsList(textLogs, version);
+ updateWebRtcEventLogsList(eventLogs);
}
function updateWebRtcTextLogsList(textLogsList, version) {
diff --git a/chromium/chrome/browser/resources/media_router/extension/manifest.yaml b/chromium/chrome/browser/resources/media_router/extension/manifest.yaml
index 4ec3bc881a7..26b83ac62d7 100644
--- a/chromium/chrome/browser/resources/media_router/extension/manifest.yaml
+++ b/chromium/chrome/browser/resources/media_router/extension/manifest.yaml
@@ -41,11 +41,7 @@
# script-src: https://feedback.googleusercontent.com https://www.google.com
# https://www.gstatic.com/feedback
# child-src: https://www.google.com
- #
- # Webview elements are implemented as a custom <object> elements that loads
- # dynamic plugin data. Without an "object-src 'self'" permission in the CSP,
- # webview elements fail to attach to extension pages (crbug.com/509854).
- "content_security_policy": "default-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self' https://feedback.googleusercontent.com https://www.google.com https://www.gstatic.com; child-src https://www.google.com; connect-src 'self' http://*:* https://*:*; font-src https://fonts.gstatic.com; object-src 'self';",
+ "content_security_policy": "default-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self' https://feedback.googleusercontent.com https://www.google.com https://www.gstatic.com; child-src https://www.google.com; connect-src 'self' http://*:* https://*:*; font-src https://fonts.gstatic.com;",
# Setting the public key fixes the extension id to:
# enhhojjnijigcajfphajepfemndkmdlo
diff --git a/chromium/chrome/browser/resources/memories/BUILD.gn b/chromium/chrome/browser/resources/memories/BUILD.gn
index 98622b34574..5f3280b8093 100644
--- a/chromium/chrome/browser/resources/memories/BUILD.gn
+++ b/chromium/chrome/browser/resources/memories/BUILD.gn
@@ -6,6 +6,7 @@ import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_js.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
js_type_check("closure_compile") {
@@ -14,10 +15,18 @@ js_type_check("closure_compile") {
deps = [ ":memories" ]
}
-js_library("memories") {
+js_library("app") {
deps = [
":browser_proxy",
+ ":memory_card",
+ ":mojom_conversion_mixin",
+ ":page_thumbnail",
+ ":router",
"//chrome/browser/ui/webui/memories:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
+ "//url/mojom:url_mojom_origin_webui_js",
]
}
@@ -28,9 +37,118 @@ js_library("browser_proxy") {
]
}
+js_library("memories") {
+ deps = [ ":app" ]
+}
+
+js_library("memory_card") {
+ deps = [
+ ":memory_tile",
+ ":mojom_conversion_mixin",
+ ":page_favicon",
+ ":page_thumbnail",
+ ":search_query",
+ ":top_visit",
+ ":utils",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//url/mojom:url_mojom_origin_webui_js",
+ ]
+}
+
+js_library("memory_tile") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//url/mojom:url_mojom_origin_webui_js",
+ ]
+}
+
+js_library("mojom_conversion_mixin") {
+ deps = [
+ "//mojo/public/mojom/base:base_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+}
+
+js_library("page_favicon") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:icon.m",
+ "//url/mojom:url_mojom_origin_webui_js",
+ ]
+}
+
+js_library("page_thumbnail") {
+ deps = [
+ ":mojom_conversion_mixin",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//url/mojom:url_mojom_origin_webui_js",
+ ]
+}
+
+js_library("router") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+}
+
+js_library("search_query") {
+ deps = [
+ ":mojom_conversion_mixin",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+}
+
+js_library("top_visit") {
+ deps = [
+ ":visit_row",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m",
+ ]
+}
+
+js_library("utils") {
+ deps = [ "//url/mojom:url_mojom_origin_webui_js" ]
+}
+
+js_library("visit_row") {
+ deps = [
+ ":mojom_conversion_mixin",
+ ":page_favicon",
+ ":utils",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//url/mojom:url_mojom_origin_webui_js",
+ ]
+}
+
+html_to_js("web_components_local") {
+ js_files = [
+ "app.js",
+ "memory_card.js",
+ "memory_tile.js",
+ "page_favicon.js",
+ "page_thumbnail.js",
+ "router.js",
+ "search_query.js",
+ "shared_vars.js",
+ "top_visit.js",
+ "visit_row.js",
+ ]
+}
+
+group("web_components") {
+ public_deps = [ ":web_components_local" ]
+}
+
grd_prefix = "memories"
preprocess_folder = "preprocessed"
preprocess_manifest = "preprocessed_manifest.json"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
preprocess_if_expr("preprocess") {
defines = chrome_grit_defines + [ "is_official_build=$is_official_build" ]
@@ -40,9 +158,31 @@ preprocess_if_expr("preprocess") {
in_files = [
"browser_proxy.js",
"memories.js",
+ "mojom_conversion_mixin.js",
+ "utils.js",
]
}
+preprocess_if_expr("preprocess_gen") {
+ defines = chrome_grit_defines + [ "is_official_build=$is_official_build" ]
+ in_folder = target_gen_dir
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [
+ "app.js",
+ "memory_card.js",
+ "memory_tile.js",
+ "page_favicon.js",
+ "page_thumbnail.js",
+ "router.js",
+ "search_query.js",
+ "shared_vars.js",
+ "top_visit.js",
+ "visit_row.js",
+ ]
+ deps = [ ":web_components" ]
+}
+
generate_grd("build_memories_api_mojo_grdp") {
grd_prefix = "$grd_prefix" + "_API"
out_grd = "$target_gen_dir/memories_api_mojo_resources.grdp"
@@ -57,11 +197,9 @@ generate_grd("build_memories_definition_mojo_grdp") {
grd_prefix = "$grd_prefix" + "_DEFINITION"
out_grd = "$target_gen_dir/memories_definition_mojo_resources.grdp"
input_files = [ "memories.mojom-webui.js" ]
- resource_path_rewrites = [
- "memories.mojom-webui.js|components/memories/core/memories.mojom-webui.js",
- ]
+ resource_path_rewrites = [ "memories.mojom-webui.js|components/history_clusters/core/memories.mojom-webui.js" ]
input_files_base_dir =
- rebase_path("$root_gen_dir/mojom-webui/components/memories/core",
+ rebase_path("$root_gen_dir/mojom-webui/components/history_clusters/core",
root_build_dir)
}
@@ -78,8 +216,12 @@ generate_grd("build_grd") {
":build_memories_api_mojo_grdp",
":build_memories_definition_mojo_grdp",
":preprocess",
+ ":preprocess_gen",
+ ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_manifest",
+ "$target_gen_dir/$preprocess_gen_manifest",
]
- manifest_files = [ "$target_gen_dir/$preprocess_manifest" ]
}
grit("resources") {
@@ -89,7 +231,7 @@ grit("resources") {
deps = [
":build_grd",
"//chrome/browser/ui/webui/memories:mojo_bindings_webui_js",
- "//components/memories/core:mojo_bindings_webui_js",
+ "//components/history_clusters/core:mojo_bindings_webui_js",
]
outputs = [
"grit/memories_resources.h",
diff --git a/chromium/chrome/browser/resources/memories/OWNERS b/chromium/chrome/browser/resources/memories/OWNERS
index 100d7c6b9e0..d03b4327dac 100644
--- a/chromium/chrome/browser/resources/memories/OWNERS
+++ b/chromium/chrome/browser/resources/memories/OWNERS
@@ -1 +1 @@
-file://components/memories/OWNERS
+file://components/history_clusters/OWNERS
diff --git a/chromium/chrome/browser/resources/memories/app.html b/chromium/chrome/browser/resources/memories/app.html
new file mode 100644
index 00000000000..8a048b59402
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/app.html
@@ -0,0 +1,71 @@
+<style include="cr-shared-style">
+ :host {
+ color: var(--cr-primary-text-color);
+ display: block;
+ font-size: 0.8125rem; /* 13px */
+ }
+
+ cr-toolbar {
+ --cr-toolbar-field-width: var(--memory-card-width);
+ }
+
+ #container {
+ height: calc(100% - var(--cr-toolbar-height));
+ overflow-x: hidden;
+ overflow-y: scroll;
+ }
+
+ #header {
+ align-items: center;
+ display: flex;
+ margin: var(--memory-card-padding) auto 0;
+ width: var(--memory-card-width);
+ }
+
+ page-thumbnail {
+ --thumbnail-max-height: 100px;
+ --thumbnail-max-width: 100px;
+ margin-inline-end: 25px;
+ }
+
+ #title {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #title #description {
+ color: var(--cr-secondary-text-color);
+ font-size: 0.75rem; /* 12px */
+ line-height: 20px;
+ }
+
+ #title #text {
+ font-size: 2.25rem; /* 36px */
+ line-height: 42px;
+ }
+
+ #memories {
+ margin: var(--memory-card-padding) auto;
+ width: var(--memory-card-width);
+ }
+</style>
+<memories-router query="{{query_}}"></memories-router>
+<cr-toolbar page-name="Memories" clear-label="$i18n{clearLabel}"
+ search-prompt="$i18n{searchPrompt}" on-search-changed="onSearchChanged_">
+</cr-toolbar>
+<div id="container">
+ <div id="header" hidden="[[!decodeMojoString16(result_.title)]]">
+ <page-thumbnail page="[[createPageWithThumbnail_(result_.thumbnailUrl)]]"
+ hidden="[[!result_.thumbnailUrl]]">
+ </page-thumbnail>
+ <div id="title">
+ <span id="description">$i18n{memoryTitleDescription}</span>
+ <span id="text">[[decodeMojoString16(result_.title)]]</span>
+ </div>
+ </div>
+ <div id="memories">
+ <template is="dom-repeat" items="[[result_.memories]]">
+ <memory-card memory="[[item]]"></memory-card>
+ </template>
+ </div>
+</div>
diff --git a/chromium/chrome/browser/resources/memories/app.js b/chromium/chrome/browser/resources/memories/app.js
new file mode 100644
index 00000000000..a741586953a
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/app.js
@@ -0,0 +1,134 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './memory_card.js';
+import './page_thumbnail.js';
+import './router.js';
+import './shared_vars.js';
+import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+
+import {MemoriesResult, PageCallbackRouter, PageHandlerRemote} from '/chrome/browser/ui/webui/memories/memories.mojom-webui.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+import {MojomConversionMixinBase} from './mojom_conversion_mixin.js';
+
+/**
+ * @fileoverview This file provides the root custom element for the Memories
+ * landing page.
+ */
+
+/** @polymer */
+class MemoriesAppElement extends MojomConversionMixinBase {
+ static get is() {
+ return 'memories-app';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * The currently displayed Memories returned by the browser in response to
+ * a request for Memories related to a given query or those within a given
+ * timespan.
+ * @private {!MemoriesResult}
+ */
+ result_: Object,
+
+ /**
+ * The current query for which related Memories are requested and shown.
+ * @private {string}
+ */
+ query_: {
+ type: String,
+ observer: 'onQueryChanged_',
+ },
+ };
+ }
+
+ constructor() {
+ super();
+ /** @private {PageHandlerRemote} */
+ this.pageHandler_ = BrowserProxy.getInstance().handler;
+ /** @private {!PageCallbackRouter} */
+ this.callbackRouter_ = BrowserProxy.getInstance().callbackRouter;
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * Called when the value of the search field changes.
+ * @param {!CustomEvent<string>} e
+ * @private
+ */
+ onSearchChanged_(e) {
+ // Update the query based on the value of the search field, if necessary.
+ if (e.detail !== this.query_) {
+ this.query_ = e.detail;
+ }
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /**
+ * @param {Url} thumbnailUrl
+ * @return {!{thumbnailUrl: Url}} WebPage with the thumbnailUrl property only.
+ * @private
+ */
+ createPageWithThumbnail_(thumbnailUrl) {
+ return {thumbnailUrl};
+ }
+
+ /**
+ * @return {!CrToolbarSearchFieldElement}
+ * @private
+ */
+ getSearchField_() {
+ const crToolbarElement = /** @type {CrToolbarElement} */ (
+ this.shadowRoot.querySelector('cr-toolbar'));
+ return crToolbarElement.getSearchField();
+ }
+
+ /**
+ * @return {!Promise} A promise that resolves when the browser is idle.
+ * @private
+ */
+ onBrowserIdle_() {
+ return new Promise((resolve) => {
+ window.requestIdleCallback(resolve);
+ });
+ }
+
+ /** @private */
+ onQueryChanged_() {
+ // Update the value of the search field based on the query, if necessary.
+ const searchField = this.getSearchField_();
+ if (searchField.getValue() !== this.query_) {
+ searchField.setValue(this.query_);
+ }
+ // <if expr="not is_official_build">
+ this.onBrowserIdle_().then(() => {
+ this.pageHandler_.getSampleMemories(this.query_.trim())
+ .then(({result}) => {
+ this.result_ = result;
+ });
+ });
+ // </if>
+ }
+}
+
+customElements.define(MemoriesAppElement.is, MemoriesAppElement);
diff --git a/chromium/chrome/browser/resources/memories/memories.html b/chromium/chrome/browser/resources/memories/memories.html
index 35ab054e708..406f8b792bc 100644
--- a/chromium/chrome/browser/resources/memories/memories.html
+++ b/chromium/chrome/browser/resources/memories/memories.html
@@ -5,21 +5,25 @@
<meta name="color-scheme" content="light dark">
<title>$i18n{title}</title>
<link rel="stylesheet" href="chrome://resources/css/md_colors.css">
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
<style>
html {
background: var(--md-background-color);
- overflow: hidden;
}
- html,
body {
- height: 100%;
+ font-size: 16px; /* TODO(crbug.com/1173990): Remove once fixed. */
margin: 0;
}
+
+ html,
+ body,
+ memories-app {
+ height: 100%;
+ }
</style>
</head>
<body>
- <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
<script type="module" src="memories.js"></script>
<memories-app></memories-app>
</body>
diff --git a/chromium/chrome/browser/resources/memories/memories.js b/chromium/chrome/browser/resources/memories/memories.js
index b120c69e1c0..a42cf1521b2 100644
--- a/chromium/chrome/browser/resources/memories/memories.js
+++ b/chromium/chrome/browser/resources/memories/memories.js
@@ -2,16 +2,4 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {MemoriesResult} from '/chrome/browser/ui/webui/memories/memories.mojom-webui.js';
-
-import {BrowserProxy} from './browser_proxy.js';
-
-// <if expr="not is_official_build">
-const query = decodeURI(window.location.hash.substr(1));
-if (query) {
- BrowserProxy.getInstance().handler.getSampleMemories(query).then(
- (/** @type {!MemoriesResult} */ result) => {
- console.log(result);
- });
-}
-// </if>
+import './app.js';
diff --git a/chromium/chrome/browser/resources/memories/memory_card.html b/chromium/chrome/browser/resources/memories/memory_card.html
new file mode 100644
index 00000000000..c3a4727305d
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/memory_card.html
@@ -0,0 +1,138 @@
+<style include="cr-shared-style">
+ :host {
+ background-color: #fff;
+ border: 1px solid var(--border-color);
+ border-radius: var(--pill-border-radius);
+ box-sizing: border-box;
+ display: block;
+ padding: var(--memory-card-padding);
+ width: var(--memory-card-width);
+ }
+
+ .section + .section {
+ margin-top: 16px;
+ }
+
+ .section .header {
+ font-size: 0.875rem; /* 14px */
+ line-height: 20px;
+ }
+
+ #queries {
+ display: flex;
+ flex-wrap: wrap;
+ }
+
+ search-query {
+ margin-top: 10px;
+ }
+
+ search-query:not(:last-of-type) {
+ margin-inline-end: 10px;
+ }
+
+ #tab-groups-and-bookmarks {
+ display: flex;
+ }
+
+ memory-tile {
+ --tile-width: 160px;
+ margin-top: 10px;
+ width: var(--tile-width);
+ }
+
+ memory-tile:not(:last-of-type) {
+ /* There can be a maximum of 4 tiles in a row. Calculate the space between
+ them accordingly. */
+ margin-inline-end: calc((var(--memory-card-width) -
+ 2 * var(--memory-card-padding) -
+ 4 * var(--tile-width)) / 3);
+ }
+
+ .tab-group .thumbnails {
+ --thumbnail-margin: 4px;
+ --thumbnail-size: 60px;
+ background-color: var(--image-background-color);
+ border-radius: var(--image-border-radius);
+ box-sizing: border-box;
+ display: flex;
+ flex-wrap: wrap;
+ height: var(--tile-width);
+ /* There can be a maximum of 4 thumbnails in a 2x2 grid. Calculate the
+ padding accordingly. */
+ padding: calc((var(--tile-width) -
+ 2 * (var(--thumbnail-size) + 2 * var(--thumbnail-margin))
+ ) / 2);
+ width: var(--tile-width);
+ }
+
+ .tab-group page-thumbnail {
+ --thumbnail-max-height: var(--thumbnail-size);
+ --thumbnail-max-width: var(--thumbnail-size);
+ margin: var(--thumbnail-margin);
+ }
+
+ .bookmark page-thumbnail {
+ --thumbnail-max-height: var(--tile-width);
+ --thumbnail-max-width: var(--tile-width);
+ }
+
+ .bookmark [slot='secondaryCaption'] {
+ align-items: center;
+ display: flex;
+ }
+
+ .bookmark page-favicon {
+ flex-shrink: 0;
+ height: 16px;
+ width: 16px;
+ }
+
+ .bookmark .hostname {
+ margin-inline-start: 8px;
+ }
+</style>
+<div class="section" hidden="[[!memory.relatedSearches.length]]">
+ <div class="header">$i18n{relatedSearchesSectionHeader}</div>
+ <div id="queries">
+ <template is="dom-repeat" items="[[memory.relatedSearches]]">
+ <search-query search-query="[[item]]"></search-query>
+ </template>
+ </div>
+</div>
+<div class="section" hidden="[[!hasRelatedTabGroupsOrBookmarks_]]">
+ <div class="header">$i18n{relatedTabGroupsAndBookmarksSectionHeader}</div>
+ <div id="tab-groups-and-bookmarks">
+ <template is="dom-repeat"
+ items="[[arrayItems_(memory.relatedTabGroups, 2)]]" as="tabGroup">
+ <memory-tile class="tab-group">
+ <div slot="main" class="thumbnails">
+ <template is="dom-repeat" items="[[arrayItems_(tabGroup.pages, 4)]]">
+ <page-thumbnail is-clickable page="[[item]]"></page-thumbnail>
+ </template>
+ </div>
+ <div slot="primaryCaption">[[decodeMojoString16(tabGroup.title)]]</div>
+ <div slot="secondaryCaption">$i18n{tabGroupTileCaption}</div>
+ </memory-tile>
+ </template>
+ <template is="dom-repeat" items="[[arrayItems_(memory.bookmarks, 2)]]">
+ <memory-tile url="[[item.url]]" class="bookmark">
+ <page-thumbnail slot="main" is-bookmark page="[[item]]" tabindex="-1">
+ </page-thumbnail>
+ <div slot="primaryCaption">[[decodeMojoString16(item.title)]]</div>
+ <div slot="secondaryCaption">
+ <page-favicon url="[[item.url]]"></page-favicon>
+ <span class="hostname">[[getHostnameFromUrl_(item.url)]]</span>
+ </div>
+ </memory-tile>
+ </template>
+ </div>
+</div>
+<div class="section" hidden="[[!memory.topVisits.length]]">
+ <div class="header">$i18n{topVisitsSectionHeader}</div>
+ <div id="top-visits">
+ <template is="dom-repeat" items="[[memory.topVisits]]">
+ <top-visit visit="[[item]]"></top-visit>
+ </template>
+ </div>
+</div>
diff --git a/chromium/chrome/browser/resources/memories/memory_card.js b/chromium/chrome/browser/resources/memories/memory_card.js
new file mode 100644
index 00000000000..19cf5807978
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/memory_card.js
@@ -0,0 +1,91 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './memory_tile.js';
+import './page_favicon.js';
+import './page_thumbnail.js';
+import './search_query.js';
+import './shared_vars.js';
+import './top_visit.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+
+import {Memory} from '/components/history_clusters/core/memories.mojom-webui.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {MojomConversionMixinBase} from './mojom_conversion_mixin.js';
+import {getHostnameFromUrl} from './utils.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a Memory.
+ */
+
+/** @polymer */
+class MemoryCardElement extends MojomConversionMixinBase {
+ static get is() {
+ return 'memory-card';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The Memory displayed by this element.
+ * @type {!Memory}
+ */
+ memory: Object,
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * Whether the Memory has related tab groups or bookmarks.
+ * @private {boolean}
+ */
+ hasRelatedTabGroupsOrBookmarks_: {
+ type: Boolean,
+ computed: 'computeHasRelatedTabGroupsOrBookmarks_(memory)'
+ },
+ };
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /** @private */
+ computeHasRelatedTabGroupsOrBookmarks_() {
+ return this.memory.relatedTabGroups.length > 0 ||
+ this.memory.bookmarks.length > 0;
+ }
+
+ /**
+ * @param {!Url} url
+ * @return {string} The domain name of the URL without the leading 'www.'.
+ * @private
+ */
+ getHostnameFromUrl_(url) {
+ return getHostnameFromUrl(url);
+ }
+
+ /**
+ * @param {!Array} array
+ * @param {number} num
+ * @return {!Array} Shallow copy of the first |num| items of the input array.
+ * @private
+ */
+ arrayItems_(array, num) {
+ return array.slice(0, num);
+ }
+}
+
+customElements.define(MemoryCardElement.is, MemoryCardElement);
diff --git a/chromium/chrome/browser/resources/memories/memory_tile.html b/chromium/chrome/browser/resources/memories/memory_tile.html
new file mode 100644
index 00000000000..7f482346769
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/memory_tile.html
@@ -0,0 +1,35 @@
+<style>
+ :host {
+ display: inline-flex;
+ flex-direction: column;
+ }
+
+ a {
+ color: inherit;
+ text-decoration: none;
+ }
+
+ [name$='Caption'] {
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: var(--caption-max-lines);
+ display: -webkit-box;
+ line-height: 20px;
+ overflow: hidden;
+ }
+
+ [name='primaryCaption'] {
+ --caption-max-lines: 2;
+ font-size: 0.875rem; /* 14px */
+ margin-top: 12px;
+ }
+
+ [name='secondaryCaption'] {
+ --caption-max-lines: 1;
+ color: var(--cr-secondary-text-color);
+ }
+</style>
+<a href$="[[url.url]]">
+ <slot name="main"></slot>
+ <slot name="primaryCaption"></slot>
+ <slot name="secondaryCaption"></slot>
+</a>
diff --git a/chromium/chrome/browser/resources/memories/memory_tile.js b/chromium/chrome/browser/resources/memories/memory_tile.js
new file mode 100644
index 00000000000..a1e385ceaa9
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/memory_tile.js
@@ -0,0 +1,39 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './shared_vars.js';
+
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a tile with
+ * slots for a main section at the top and primary and secondary captions below.
+ */
+
+class MemoryTileElement extends PolymerElement {
+ static get is() {
+ return 'memory-tile';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * Optional URL to navigate to when the tile is clicked.
+ * @type {Url}
+ */
+ url: Object,
+ };
+ }
+}
+
+customElements.define(MemoryTileElement.is, MemoryTileElement);
diff --git a/chromium/chrome/browser/resources/memories/mojom_conversion_mixin.js b/chromium/chrome/browser/resources/memories/mojom_conversion_mixin.js
new file mode 100644
index 00000000000..b7352ba5abe
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/mojom_conversion_mixin.js
@@ -0,0 +1,37 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/**
+ * @fileoverview This file provides a mixin class for conversion of Mojom types
+ * to JS types as computed bindings, e.g., [[decodeMojoString16(mojoString16)]],
+ * or in JS, e.g., this.decodeMojoString16(mojoString16).
+ */
+
+/** @interface */
+class MojomConversionMixinInterface {
+ /**
+ * Converts a Mojo String16 to a JS string.
+ * @param {?String16} str
+ * @return {string}
+ */
+ decodeMojoString16(str) {}
+}
+
+function MojomConversionMixin(superClass) {
+ return class extends superClass {
+ decodeMojoString16(str) {
+ return str ? str.data.map(ch => String.fromCodePoint(ch)).join('') : '';
+ }
+ };
+}
+
+/**
+ * @constructor
+ * @extends PolymerElement
+ * @implements {MojomConversionMixinInterface}
+ */
+export const MojomConversionMixinBase = MojomConversionMixin(PolymerElement);
diff --git a/chromium/chrome/browser/resources/memories/page_favicon.html b/chromium/chrome/browser/resources/memories/page_favicon.html
new file mode 100644
index 00000000000..605e8141d19
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/page_favicon.html
@@ -0,0 +1,6 @@
+<style>
+ :host {
+ background-position: center;
+ background-repeat: no-repeat;
+ }
+</style>
diff --git a/chromium/chrome/browser/resources/memories/page_favicon.js b/chromium/chrome/browser/resources/memories/page_favicon.js
new file mode 100644
index 00000000000..9eb8cde908d
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/page_favicon.js
@@ -0,0 +1,57 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {getFaviconForPageURL} from 'chrome://resources/js/icon.m.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a page favicon.
+ */
+
+class PageFavicon extends PolymerElement {
+ static get is() {
+ return 'page-favicon';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The URL for which the favicon is shown.
+ * @type {!Url}
+ */
+ url: Object,
+
+ /**
+ * The element's style attribute.
+ * @type {string}
+ */
+ style: {
+ type: String,
+ reflectToAttribute: true,
+ computed: `computeStyle_(url)`,
+ },
+ };
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /** @private */
+ computeStyle_() {
+ return `background-image:${
+ getFaviconForPageURL(this.url.url, false, '', 24)}`;
+ }
+}
+
+customElements.define(PageFavicon.is, PageFavicon);
diff --git a/chromium/chrome/browser/resources/memories/page_thumbnail.html b/chromium/chrome/browser/resources/memories/page_thumbnail.html
new file mode 100644
index 00000000000..ba896393110
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/page_thumbnail.html
@@ -0,0 +1,47 @@
+<style>
+ :host {
+ align-items: center;
+ display: flex;
+ height: var(--thumbnail-max-height);
+ justify-content: center;
+ width: var(--thumbnail-max-width);
+ }
+
+ a {
+ position: relative;
+ }
+
+ :host(:not([is-clickable])) a {
+ cursor: default;
+ pointer-events: none;
+ }
+
+ img {
+ border-radius: var(--image-border-radius);
+ max-height: var(--thumbnail-max-height);
+ max-width: var(--thumbnail-max-width);
+ }
+
+ :host([is-bookmark]) #bookmark-icon {
+ -webkit-mask-image: url(chrome://resources/images/icon_bookmark.svg);
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: var(--cr-icon-size);
+ background-color: var(--google-blue-600);
+ height: var(--cr-icon-size);
+ left: 10px;
+ position: absolute;
+ top: 10px;
+ width: var(--cr-icon-size);
+ }
+
+ :host-context([dir='rtl']):host([is-bookmark]) #bookmark-icon {
+ left: unset;
+ right: 10px;
+ }
+</style>
+<a href$="[[page.url.url]]">
+ <img title="[[decodeMojoString16(page.title)]]"
+ src$="[[getThumbnailSrc_(page.thumbnailUrl)]]">
+ <div id="bookmark-icon"></div>
+</a>
diff --git a/chromium/chrome/browser/resources/memories/page_thumbnail.js b/chromium/chrome/browser/resources/memories/page_thumbnail.js
new file mode 100644
index 00000000000..1b7a207851d
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/page_thumbnail.js
@@ -0,0 +1,56 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './shared_vars.js';
+
+import {WebPage} from '/components/history_clusters/core/memories.mojom-webui.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {MojomConversionMixinBase} from './mojom_conversion_mixin.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a page
+ * thumbnail.
+ */
+
+/** @polymer */
+class PageThumbnailElement extends MojomConversionMixinBase {
+ static get is() {
+ return 'page-thumbnail';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The page for which the thumbnail is shown.
+ * @type {!WebPage}
+ */
+ page: Object,
+ };
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /**
+ * @param {Url} thumbnailUrl
+ * @return {string}
+ * @private
+ */
+ getThumbnailSrc_(thumbnailUrl) {
+ return thumbnailUrl ? `chrome://image?${thumbnailUrl.url}` : '';
+ }
+}
+
+customElements.define(PageThumbnailElement.is, PageThumbnailElement);
diff --git a/chromium/chrome/browser/resources/memories/router.html b/chromium/chrome/browser/resources/memories/router.html
new file mode 100644
index 00000000000..7da98f67f71
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/router.html
@@ -0,0 +1,3 @@
+<iron-location query="{{queryParamsString_}}" dwell-time="200"></iron-location>
+<iron-query-params params-string="{{queryParamsString_}}"
+ params-object="{{queryParamsObject_}}"></iron-query-params>
diff --git a/chromium/chrome/browser/resources/memories/router.js b/chromium/chrome/browser/resources/memories/router.js
new file mode 100644
index 00000000000..f8fd007c967
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/router.js
@@ -0,0 +1,80 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/polymer/v3_0/iron-location/iron-location.js';
+import 'chrome://resources/polymer/v3_0/iron-location/iron-query-params.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/**
+ * @fileoverview This file provides a custom element that routes the query
+ * parameters of the page URL to the search query.
+ */
+
+class MemoriesRouterElement extends PolymerElement {
+ static get is() {
+ return 'memories-router';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The value of the query parameter with the name q.
+ * @type {string}
+ */
+ query: {
+ type: String,
+ notify: true,
+ observer: 'onQueryChanged_',
+ },
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * The parsed query parameters of the page URL ({foo: 'bar'}).
+ * @private {!Object}
+ */
+ queryParamsObject_: {
+ type: Object,
+ observer: 'onQueryParamsObjectChanged_',
+ },
+
+ /**
+ * The string query parameters of the page URL ('?foo=bar'), provided by
+ * <iron-location> and parsed by <iron-query-params> into
+ * |queryParamsObject_| and vice versa. Not to be modified directly.
+ * @private {string}
+ */
+ queryParamsString_: {
+ type: String,
+ },
+ };
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /** @private */
+ onQueryChanged_() {
+ this.queryParamsObject_ = this.query ? {q: this.query} : {};
+ }
+
+ /** @private */
+ onQueryParamsObjectChanged_() {
+ this.query = this.queryParamsObject_.q || '';
+ }
+}
+
+customElements.define(MemoriesRouterElement.is, MemoriesRouterElement);
diff --git a/chromium/chrome/browser/resources/memories/search_query.html b/chromium/chrome/browser/resources/memories/search_query.html
new file mode 100644
index 00000000000..a23655bffa6
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/search_query.html
@@ -0,0 +1,33 @@
+<style>
+ :host {
+ border: 1px solid var(--border-color);
+ border-radius: var(--pill-border-radius);
+ display: block;
+ }
+
+ a {
+ color: inherit;
+ display: flex;
+ padding: 6px 16px 6px 12px;
+ text-decoration: none;
+ }
+
+ #icon {
+ -webkit-mask-image: url(chrome://resources/images/icon_search.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background-color: var(--google-grey-600);
+ height: var(--cr-icon-size);
+ width: var(--cr-icon-size);
+ }
+
+ #text {
+ font-size: 0.875rem; /* 14px */
+ line-height: 22px;
+ margin-inline-start: 8px;
+ }
+</style>
+<a href$="[[searchQuery.url.url]]">
+ <div id="icon"></div>
+ <div id="text">[[decodeMojoString16(searchQuery.query)]]</div>
+</a>
diff --git a/chromium/chrome/browser/resources/memories/search_query.js b/chromium/chrome/browser/resources/memories/search_query.js
new file mode 100644
index 00000000000..03cbc70b577
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/search_query.js
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './shared_vars.js';
+
+import {SearchQuery} from '/components/history_clusters/core/memories.mojom-webui.js';
+import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {MojomConversionMixinBase} from './mojom_conversion_mixin.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a search query.
+ */
+
+/** @polymer */
+class SearchQueryElement extends MojomConversionMixinBase {
+ static get is() {
+ return 'search-query';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The search query to display.
+ * @type {!SearchQuery}
+ */
+ searchQuery: Object,
+ };
+ }
+}
+
+customElements.define(SearchQueryElement.is, SearchQueryElement);
diff --git a/chromium/chrome/browser/resources/memories/shared_vars.html b/chromium/chrome/browser/resources/memories/shared_vars.html
new file mode 100644
index 00000000000..6c3e6644061
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/shared_vars.html
@@ -0,0 +1,14 @@
+<custom-style>
+<style>
+ html {
+ --border-color: var(--google-grey-refresh-300);
+ --image-background-color: var(--google-grey-refresh-100);
+ --image-border-radius: 8px;
+ --memory-card-padding: 24px;
+ --memory-card-width: 742px;
+ --pill-border-radius: 16px;
+ --visit-row-favicon-size: var(--visit-row-height);
+ --visit-row-height: 36px;
+ }
+</style>
+</custom-style>
diff --git a/chromium/chrome/browser/resources/memories/shared_vars.js b/chromium/chrome/browser/resources/memories/shared_vars.js
new file mode 100644
index 00000000000..098a4389a11
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/shared_vars.js
@@ -0,0 +1,10 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
+
+const template = document.createElement('template');
+template.innerHTML = `{__html_template__}`;
+document.head.appendChild(template.content.cloneNode(true));
diff --git a/chromium/chrome/browser/resources/memories/top_visit.html b/chromium/chrome/browser/resources/memories/top_visit.html
new file mode 100644
index 00000000000..fe8d4a8ecd3
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/top_visit.html
@@ -0,0 +1,55 @@
+<style>
+ :host {
+ display: block;
+ padding: 10px 0;
+ position: relative;
+ }
+
+ #vertical-line {
+ --vertical-line-width: 2px;
+ border-inline-start: var(--vertical-line-width) solid var(--image-background-color);
+ height: 100%;
+ left: calc((var(--visit-row-favicon-size) - var(--vertical-line-width)) / 2);
+ position: absolute;
+ }
+
+ :host-context([dir='rtl']) #vertical-line {
+ left: unset;
+ right: calc((var(--visit-row-favicon-size) - var(--vertical-line-width)) / 2);
+ }
+
+ :host(:last-of-type) #vertical-line {
+ display: none;
+ }
+
+ cr-expand-button {
+ --cr-active-background-color: transparent;
+ --cr-hover-background-color: transparent;
+ --cr-section-vertical-padding: 0;
+ }
+
+ #related-visits {
+ margin-inline-start: 52px;
+ }
+
+ #related-visits visit-row {
+ padding: 4px 0;
+ }
+</style>
+<div id="vertical-line"></div>
+<template is="dom-if" if="[[visit.relatedVisits.length]]">
+ <cr-expand-button expanded="{{expanded_}}">
+ <visit-row is-top-visit visit="[[visit]]" on-visit-click="onVisitClick_">
+ </visit-row>
+ </cr-expand-button>
+ <iron-collapse opened="[[expanded_]]">
+ <div id="related-visits">
+ <template is="dom-repeat" items="[[visit.relatedVisits]]">
+ <visit-row visit="[[item]]"></visit-row>
+ </template>
+ </div>
+ </iron-collapse>
+</template>
+<template is="dom-if" if="[[!visit.relatedVisits.length]]">
+ <visit-row is-top-visit visit="[[visit]]"></visit-row>
+</template>
diff --git a/chromium/chrome/browser/resources/memories/top_visit.js b/chromium/chrome/browser/resources/memories/top_visit.js
new file mode 100644
index 00000000000..c3c62bc7e4f
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/top_visit.js
@@ -0,0 +1,66 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './shared_vars.js';
+import './visit_row.js';
+import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js';
+import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
+
+import {Visit} from '/components/history_clusters/core/memories.mojom-webui.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a top visit
+ * within a Memory. A top visit is a featured, i.e., visible, visit with an
+ * optional set of related visits which are not visible by default.
+ */
+
+class TopVisitElement extends PolymerElement {
+ static get is() {
+ return 'top-visit';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The top visit to display
+ * @type {!Visit}
+ */
+ visit: Object,
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * Whether the related visits of the top visit are expanded/visible.
+ * @private {boolean}
+ */
+ expanded_: Boolean,
+ };
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @param {!CustomEvent<{event:!MouseEvent}>} e
+ * @private
+ */
+ onVisitClick_(e) {
+ // Prevent the enclosing <cr-expand-button> from receiving this event.
+ e.detail.event.stopImmediatePropagation();
+ }
+}
+
+customElements.define(TopVisitElement.is, TopVisitElement);
diff --git a/chromium/chrome/browser/resources/memories/utils.js b/chromium/chrome/browser/resources/memories/utils.js
new file mode 100644
index 00000000000..a0c26103c2e
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/utils.js
@@ -0,0 +1,18 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+
+/**
+ * @fileoverview This file provides shared utility functions used by the custom
+ * elements in the Memories landing page.
+ */
+
+/**
+ * @param {!Url} url
+ * @return {string} The domain name of the URL without the leading 'www.'.
+ */
+export function getHostnameFromUrl(url) {
+ return new URL(url.url).hostname.replace(/^(www\.)/, '');
+}
diff --git a/chromium/chrome/browser/resources/memories/visit_row.html b/chromium/chrome/browser/resources/memories/visit_row.html
new file mode 100644
index 00000000000..1618bbfcf4d
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/visit_row.html
@@ -0,0 +1,69 @@
+<style include="cr-shared-style">
+ :host {
+ display: block;
+ line-height: var(--visit-row-height);
+ position: relative;
+ }
+
+ #header {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ #start-justtified {
+ color: inherit;
+ display: flex;
+ overflow: hidden;
+ text-decoration: none;
+ z-index: 1;
+ }
+
+ #end-justified {
+ display: flex;
+ flex-shrink: 0;
+ }
+
+ page-favicon {
+ flex-shrink: 0;
+ height: var(--visit-row-favicon-size);
+ margin-inline-end: 16px;
+ width: var(--visit-row-favicon-size);
+ }
+
+ :host([is-top-visit]) page-favicon {
+ background-color: var(--image-background-color);
+ border-radius: var(--image-border-radius);
+ }
+
+ #title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ #hostname,
+ #separator,
+ #timestamp {
+ flex-shrink: 0;
+ margin-inline-start: 8px;
+ }
+
+ #hostname,
+ #timestamp {
+ color: var(--cr-secondary-text-color);
+ }
+</style>
+<div id="header">
+ <a id="start-justtified" href="[[visit.url.url]]" on-click="onClick_">
+ <page-favicon url="[[visit.url]]"></page-favicon>
+ <span id="title">[[decodeMojoString16(visit.pageTitle)]]</span>
+ <span id="separator">–</span>
+ <span id="hostname">[[getHostnameFromUrl_(visit.url)]]</span>
+ </a>
+ <div id="end-justified">
+ <div id="timestamp">[[getTimeOfVisit_(visit)]]</div>
+ <cr-icon-button id="action" class="icon-more-vert"
+ hidden="[[visit.relatedVisits.length]]">
+ </cr-icon-button>
+ </div>
+</div>
diff --git a/chromium/chrome/browser/resources/memories/visit_row.js b/chromium/chrome/browser/resources/memories/visit_row.js
new file mode 100644
index 00000000000..f6f1ffe49da
--- /dev/null
+++ b/chromium/chrome/browser/resources/memories/visit_row.js
@@ -0,0 +1,102 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './page_favicon.js';
+import './shared_vars.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+
+import {Visit} from '/components/history_clusters/core/memories.mojom-webui.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {MojomConversionMixinBase} from './mojom_conversion_mixin.js';
+import {getHostnameFromUrl} from './utils.js';
+
+/**
+ * @fileoverview This file provides a custom element displaying a visit to a
+ * page within a Memory. A visit features the page favicon, title, a timestamp,
+ * as well as an action menu.
+ */
+
+/** @polymer */
+class VisitRowElement extends MojomConversionMixinBase {
+ static get is() {
+ return 'visit-row';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * The visit to display.
+ * @type {!Visit}
+ */
+ visit: Object,
+
+ /**
+ * Whether the visit is a top visit.
+ * @type {boolean}
+ */
+ isTopVisit: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+ };
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @param {!MouseEvent} event
+ * @private
+ */
+ onClick_(event) {
+ // Only handle main (usually the left) and auxiliary (usually the wheel or
+ // the middle) button presses.
+ if (event.button > 1) {
+ return;
+ }
+
+ this.dispatchEvent(new CustomEvent('visit-click', {
+ bubbles: true,
+ composed: true,
+ detail: {event},
+ }));
+ }
+
+ //============================================================================
+ // Helper methods
+ //============================================================================
+
+ /**
+ * @param {!Url} url
+ * @return {string} The domain name of the URL without the leading 'www.'.
+ * @private
+ */
+ getHostnameFromUrl_(url) {
+ return getHostnameFromUrl(url);
+ }
+
+ /**
+ * @param {!Visit} visit
+ * @return {string} Time of day or relative date of visit, e.g., "1 day ago",
+ * depending on if the visit is a top visit.
+ * @private
+ */
+ getTimeOfVisit_(visit) {
+ return this.decodeMojoString16(
+ this.isTopVisit ? visit.relativeDate : visit.timeOfDay);
+ }
+}
+
+customElements.define(VisitRowElement.is, VisitRowElement);
diff --git a/chromium/chrome/browser/resources/nearby_internals/BUILD.gn b/chromium/chrome/browser/resources/nearby_internals/BUILD.gn
index c6c552fe7e7..a1569cc6ff4 100644
--- a/chromium/chrome/browser/resources/nearby_internals/BUILD.gn
+++ b/chromium/chrome/browser/resources/nearby_internals/BUILD.gn
@@ -37,6 +37,7 @@ preprocess_if_expr("preprocess") {
"nearby_contact_browser_proxy.js",
"nearby_http_browser_proxy.js",
"nearby_logs_browser_proxy.js",
+ "nearby_prefs_browser_proxy.js",
"nearby_ui_trigger_browser_proxy.js",
"types.js",
]
@@ -91,6 +92,7 @@ js_type_check("closure_compile") {
":nearby_http_browser_proxy",
":nearby_internals",
":nearby_logs_browser_proxy",
+ ":nearby_prefs_browser_proxy",
":nearby_ui_trigger_browser_proxy",
":types",
":ui_trigger_list_object",
@@ -109,6 +111,7 @@ js_library("nearby_internals") {
":nearby_contact_browser_proxy",
":nearby_http_browser_proxy",
":nearby_logs_browser_proxy",
+ ":nearby_prefs_browser_proxy",
":nearby_ui_trigger_browser_proxy",
":types",
":ui_trigger_list_object",
@@ -122,6 +125,7 @@ js_library("logging_tab") {
deps = [
":log_object",
":nearby_logs_browser_proxy",
+ ":nearby_prefs_browser_proxy",
":types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:cr.m",
@@ -144,6 +148,13 @@ js_library("nearby_logs_browser_proxy") {
]
}
+js_library("nearby_prefs_browser_proxy") {
+ deps = [
+ ":types",
+ "//ui/webui/resources/js:cr.m",
+ ]
+}
+
js_library("nearby_http_browser_proxy") {
deps = [
":types",
diff --git a/chromium/chrome/browser/resources/nearby_internals/logging_tab.html b/chromium/chrome/browser/resources/nearby_internals/logging_tab.html
index 4b9873f5c54..b31d6d0d904 100644
--- a/chromium/chrome/browser/resources/nearby_internals/logging_tab.html
+++ b/chromium/chrome/browser/resources/nearby_internals/logging_tab.html
@@ -28,6 +28,10 @@
on-click="onClearLogsButtonClicked_">
Clear Logs
</cr-button>
+<cr-button class="internals-button"
+ on-click="onClearPrefsButtonClicked_">
+ Reset Nearby
+</cr-button>
<iron-list items="[[logList_]]" as="log" id="logs-list">
<template>
<log-object log-message="[[log]]">
diff --git a/chromium/chrome/browser/resources/nearby_internals/logging_tab.js b/chromium/chrome/browser/resources/nearby_internals/logging_tab.js
index c8b6b8dd5c0..9a7f6bc88de 100644
--- a/chromium/chrome/browser/resources/nearby_internals/logging_tab.js
+++ b/chromium/chrome/browser/resources/nearby_internals/logging_tab.js
@@ -11,6 +11,7 @@ import './shared_style.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {NearbyLogsBrowserProxy} from './nearby_logs_browser_proxy.js';
+import {NearbyPrefsBrowserProxy} from './nearby_prefs_browser_proxy.js';
import {LogMessage, Severity} from './types.js';
/**
@@ -65,12 +66,16 @@ Polymer({
/** @private {?NearbyLogsBrowserProxy}*/
browserProxy_: null,
+ /** @private {?NearbyPrefsBrowserProxy}*/
+ prefsBrowserProxy_: null,
+
/**
* Initialize |browserProxy_| and |logList_|.
* @override
*/
created() {
this.browserProxy_ = NearbyLogsBrowserProxy.getInstance();
+ this.prefsBrowserProxy_ = NearbyPrefsBrowserProxy.getInstance();
},
/**
@@ -96,6 +101,14 @@ Polymer({
},
/**
+ * Clears Nearby Share Prefs.
+ * @private
+ */
+ onClearPrefsButtonClicked_() {
+ this.prefsBrowserProxy_.clearNearbyPrefs();
+ },
+
+ /**
* Saves and downloads javascript logs that appear on the page.
* @private
*/
diff --git a/chromium/chrome/browser/resources/nearby_internals/nearby_internals.js b/chromium/chrome/browser/resources/nearby_internals/nearby_internals.js
index eb9b5542acd..f4acb6e6278 100644
--- a/chromium/chrome/browser/resources/nearby_internals/nearby_internals.js
+++ b/chromium/chrome/browser/resources/nearby_internals/nearby_internals.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.m.js';
+import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.js';
import 'chrome://resources/polymer/v3_0/iron-location/iron-location.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import './http_tab.js';
diff --git a/chromium/chrome/browser/resources/nearby_internals/nearby_prefs_browser_proxy.js b/chromium/chrome/browser/resources/nearby_internals/nearby_prefs_browser_proxy.js
new file mode 100644
index 00000000000..e5d2539dfb1
--- /dev/null
+++ b/chromium/chrome/browser/resources/nearby_internals/nearby_prefs_browser_proxy.js
@@ -0,0 +1,20 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+
+/**
+ * JavaScript hooks into the native WebUI handler to communicate with C++ about
+ * Nearby prefs.
+ */
+export class NearbyPrefsBrowserProxy {
+ /**
+ * Tells C++ side to clear Nearby Prefs.
+ */
+ clearNearbyPrefs() {
+ chrome.send('clearNearbyPrefs');
+ }
+}
+
+addSingletonGetter(NearbyPrefsBrowserProxy);
diff --git a/chromium/chrome/browser/resources/nearby_share/BUILD.gn b/chromium/chrome/browser/resources/nearby_share/BUILD.gn
index da79967679c..af083025070 100644
--- a/chromium/chrome/browser/resources/nearby_share/BUILD.gn
+++ b/chromium/chrome/browser/resources/nearby_share/BUILD.gn
@@ -39,12 +39,10 @@ generate_grd("build_grd") {
":build_mojo_grdp",
":preprocess_gen",
":preprocess_src",
- "shared:build_v2_grdp",
"shared:build_v3_grdp",
]
grdp_files = [
"$target_gen_dir/nearby_share_mojo_resources.grdp",
- "$target_gen_dir/shared/nearby_share_resources_v2.grdp",
"$target_gen_dir/shared/nearby_share_resources_v3.grdp",
]
input_files = [ "nearby_share_pulse_animation.json" ]
@@ -137,7 +135,7 @@ js_library("app") {
"./shared:nearby_share_settings_behavior.m",
"./shared:nearby_visibility_page.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
]
extra_deps = [ "./shared:modulize" ]
}
diff --git a/chromium/chrome/browser/resources/nearby_share/app.js b/chromium/chrome/browser/resources/nearby_share/app.js
index 02f928541af..e833852805b 100644
--- a/chromium/chrome/browser/resources/nearby_share/app.js
+++ b/chromium/chrome/browser/resources/nearby_share/app.js
@@ -8,7 +8,7 @@
* of the ChromeOS share sheet.
*/
-import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.m.js';
+import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
import './shared/nearby_onboarding_page.m.js';
import './shared/nearby_visibility_page.m.js';
import './nearby_confirmation_page.js';
diff --git a/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.html b/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.html
index e8c89cbf1c2..a3077271c05 100644
--- a/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.html
+++ b/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.html
@@ -120,7 +120,7 @@
</template>
<!-- TODO(crbug.com/1149546) factor error section into its own component -->
- <template is="dom-if" if="[[errorTitle_]]">
+ <template is="dom-if" if="[[errorTitle_]]" restamp>
<div id="errorSection">
<iron-icon id="errorIcon" icon="nearby20:info"></iron-icon>
<div id="error" role="alert" aria-labelledby="errorTitle"
diff --git a/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
index c42c6736816..5ea7876d882 100644
--- a/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
+++ b/chromium/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -23,6 +23,8 @@ import './strings.m.js';
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getDiscoveryManager} from './discovery_manager.js';
+
/** @implements {nearbyShare.mojom.TransferUpdateListenerInterface} */
class TransferUpdateListener {
/**
@@ -204,7 +206,7 @@ Polymer({
break;
case nearbyShare.mojom.TransferStatus.kInProgress:
case nearbyShare.mojom.TransferStatus.kComplete:
- this.fire('close');
+ getDiscoveryManager().stopDiscovery().then(() => this.fire('close'));
break;
case nearbyShare.mojom.TransferStatus.kRejected:
this.errorTitle_ = this.i18n('nearbyShareErrorCantShare');
@@ -223,6 +225,19 @@ Polymer({
case nearbyShare.mojom.TransferStatus.kNotEnoughSpace:
case nearbyShare.mojom.TransferStatus.kFailed:
case nearbyShare.mojom.TransferStatus.kAwaitingRemoteAcceptanceFailed:
+ case nearbyShare.mojom.TransferStatus.kDecodeAdvertisementFailed:
+ case nearbyShare.mojom.TransferStatus.kMissingTransferUpdateCallback:
+ case nearbyShare.mojom.TransferStatus.kMissingShareTarget:
+ case nearbyShare.mojom.TransferStatus.kMissingEndpointId:
+ case nearbyShare.mojom.TransferStatus.kMissingPayloads:
+ case nearbyShare.mojom.TransferStatus.kPairedKeyVerificationFailed:
+ case nearbyShare.mojom.TransferStatus.kInvalidIntroductionFrame:
+ case nearbyShare.mojom.TransferStatus.kIncompletePayloads:
+ case nearbyShare.mojom.TransferStatus.kFailedToCreateShareTarget:
+ case nearbyShare.mojom.TransferStatus.kFailedToInitiateOutgoingConnection:
+ case nearbyShare.mojom.TransferStatus
+ .kFailedToReadOutgoingConnectionResponse:
+ case nearbyShare.mojom.TransferStatus.kUnexpectedDisconnection:
this.errorTitle_ = this.i18n('nearbyShareErrorCantShare');
this.errorDescription_ = this.i18n('nearbyShareErrorSomethingWrong');
break;
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/BUILD.gn b/chromium/chrome/browser/resources/nearby_share/shared/BUILD.gn
index 76051f5a320..1a52a159db0 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/BUILD.gn
+++ b/chromium/chrome/browser/resources/nearby_share/shared/BUILD.gn
@@ -12,17 +12,8 @@ import("./nearby_shared.gni")
assert(is_chromeos, "Nearby Share is CrOS only")
os_settings_dir = "$root_gen_dir/chrome/browser/resources/settings/chromeos"
-preprocess_v2_manifest = "preprocessed_v2_manifest.json"
preprocess_v3_manifest = "preprocessed_v3_manifest.json"
-generate_grd("build_v2_grdp") {
- grd_prefix = "nearby_share"
- out_grd = "$target_gen_dir/${grd_prefix}_resources_v2.grdp"
- deps = [ ":preprocess_v2" ]
- manifest_files = [ "$target_gen_dir/$preprocess_v2_manifest" ]
- resource_path_prefix = "shared"
-}
-
generate_grd("build_v3_grdp") {
grd_prefix = "nearby_share"
out_grd = "$target_gen_dir/${grd_prefix}_resources_v3.grdp"
@@ -31,38 +22,6 @@ generate_grd("build_v3_grdp") {
resource_path_prefix = "shared"
}
-preprocess_if_expr("preprocess_v2") {
- in_folder = "./"
- out_folder = "$os_settings_dir/preprocess_v2/shared"
- out_manifest = "$target_gen_dir/$preprocess_v2_manifest"
- in_files = [
- "nearby_contact_manager.html",
- "nearby_contact_manager.js",
- "nearby_contact_visibility.html",
- "nearby_contact_visibility.js",
- "nearby_device_icon.html",
- "nearby_device_icon.js",
- "nearby_device.html",
- "nearby_device.js",
- "nearby_onboarding_page.html",
- "nearby_onboarding_page.js",
- "nearby_page_template.html",
- "nearby_page_template.js",
- "nearby_preview.html",
- "nearby_preview.js",
- "nearby_progress.html",
- "nearby_progress.js",
- "nearby_share_settings.html",
- "nearby_share_settings.js",
- "nearby_share_settings_behavior.html",
- "nearby_share_settings_behavior.js",
- "nearby_shared_share_type_icons.html",
- "nearby_shared_icons.html",
- "nearby_visibility_page.html",
- "nearby_visibility_page.js",
- ]
-}
-
preprocess_if_expr("preprocess_v3") {
deps = [ ":polymer3_elements" ]
in_folder = "$target_gen_dir"
@@ -73,6 +32,7 @@ preprocess_if_expr("preprocess_v3") {
"nearby_contact_visibility.m.js",
"nearby_device_icon.m.js",
"nearby_device.m.js",
+ "nearby_metrics_logger.m.js",
"nearby_onboarding_page.m.js",
"nearby_page_template.m.js",
"nearby_preview.m.js",
@@ -92,6 +52,7 @@ js_type_check("closure_compile") {
":nearby_contact_visibility",
":nearby_device",
":nearby_device_icon",
+ ":nearby_metrics_logger",
":nearby_onboarding_page",
":nearby_page_template",
":nearby_preview",
@@ -144,6 +105,9 @@ js_library("nearby_device") {
]
}
+js_library("nearby_metrics_logger") {
+}
+
js_library("nearby_page_template") {
}
@@ -167,6 +131,7 @@ js_library("nearby_progress") {
js_library("nearby_onboarding_page") {
deps = [
+ ":nearby_metrics_logger",
":nearby_page_template",
":nearby_share_settings_behavior",
"//third_party/polymer/v1_0/components-chromium/iron-icon:iron-icon-extracted",
@@ -212,6 +177,7 @@ js_type_check("closure_compile_module") {
":nearby_contact_visibility.m",
":nearby_device.m",
":nearby_device_icon.m",
+ ":nearby_metrics_logger.m",
":nearby_onboarding_page.m",
":nearby_page_template.m",
":nearby_preview.m",
@@ -290,10 +256,11 @@ js_library("nearby_device.m") {
js_library("nearby_onboarding_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.m.js" ]
deps = [
+ ":nearby_metrics_logger.m",
":nearby_page_template.m",
":nearby_share_settings_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":nearby_onboarding_page_module" ]
@@ -357,6 +324,12 @@ js_library("nearby_visibility_page.m") {
extra_deps = [ ":nearby_visibility_page_module" ]
}
+js_library("nearby_metrics_logger.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.m.js" ]
+ deps = []
+ extra_deps = [ ":modulize" ]
+}
+
polymer_modulizer("nearby_contact_visibility") {
js_file = "nearby_contact_visibility.js"
html_file = "nearby_contact_visibility.html"
@@ -436,6 +409,7 @@ polymer_modulizer("nearby_visibility_page") {
js_modulizer("modulize") {
input_files = [
"nearby_contact_manager.js",
+ "nearby_metrics_logger.js",
"nearby_share_settings.js",
"nearby_share_settings_behavior.js",
]
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_device.html b/chromium/chrome/browser/resources/nearby_share/shared/nearby_device.html
index a6431c3510a..83e207e38f2 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_device.html
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_device.html
@@ -73,7 +73,7 @@
}
</style>
- <div id="wrapper">
+ <div id="wrapper" title="[[shareTarget.name]]">
<nearby-device-icon id="icon" share-target="[[shareTarget]]">
</nearby-device-icon>
<div id="name">[[shareTarget.name]]</div>
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.html b/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.html
new file mode 100644
index 00000000000..4627ed8dbb6
--- /dev/null
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.html
@@ -0,0 +1 @@
+<script src="nearby_metrics_logger.html"></script> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js b/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js
new file mode 100644
index 00000000000..0c90731dc1a
--- /dev/null
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js
@@ -0,0 +1,120 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// #import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+
+/**
+ * This enum is tied directly to a UMA enum defined in
+ * //tools/metrics/histograms/enums.xml, and should always reflect it (do not
+ * change one without changing the other).
+ * These values are persisted to logs. Entries should not be renumbered and
+ * numeric values should never be reused.
+ * @enum {number}
+ */
+/* #export */ const NearbyShareOnboardingFinalState = {
+ DEVICE_NAME_PAGE: 0,
+ VISIBILITY_PAGE: 1,
+ COMPLETE: 2,
+ MAX: 3,
+};
+
+/**
+ * This enum is tied directly to a UMA enum defined in
+ * //tools/metrics/histograms/enums.xml, and should always reflect it (do not
+ * change one without changing the other).
+ * These values are persisted to logs. Entries should not be renumbered and
+ * numeric values should never be reused.
+ * @enum {number}
+ */
+const NearbyShareOnboardingEntryPoint = {
+ SETTINGS: 0,
+ TRAY: 1,
+ SHARE_SHEET: 2,
+ MAX: 3,
+};
+
+const NearbyShareOnboardingResultHistogramName =
+ 'Nearby.Share.Onboarding.Result';
+const NearbyShareOnboardingEntryPointHistogramName =
+ 'Nearby.Share.Onboarding.EntryPoint';
+const NearbyShareOnboardingDurationHistogramName =
+ 'Nearby.Share.Onboarding.Duration';
+
+/**
+ * Tracks time that onboarding is started. Gets set to null after onboarding is
+ * complete as a way to track if onboarding is in progress.
+ * @type {?number}
+ */
+let onboardingInitiatedTimestamp;
+
+/**
+ * Records the onboarding flow entrypoint and stores the time at which
+ * onboarding was initiated. The url param is used to infer the entrypoint.
+ * @param {URL} url
+ */
+/* #export */ function processOnboardingInitiatedMetrics(url) {
+ let nearbyShareOnboardingEntryPoint;
+
+ if (url.hostname === 'nearby') {
+ nearbyShareOnboardingEntryPoint =
+ NearbyShareOnboardingEntryPoint.SHARE_SHEET;
+ } else if (url.hostname === 'os-settings') {
+ const urlParams = new URLSearchParams(url.search);
+
+ nearbyShareOnboardingEntryPoint =
+ (urlParams.get('entrypoint') === 'settings') ?
+ NearbyShareOnboardingEntryPoint.SETTINGS :
+ NearbyShareOnboardingEntryPoint.TRAY;
+ } else {
+ assertNotReached('Invalid nearbyShareOnboardingEntryPoint');
+ }
+
+ chrome.send('metricsHandler:recordInHistogram', [
+ NearbyShareOnboardingEntryPointHistogramName,
+ nearbyShareOnboardingEntryPoint, NearbyShareOnboardingEntryPoint.MAX
+ ]);
+
+ // Set time at which onboarding was initiated to track duration.
+ onboardingInitiatedTimestamp = window.performance.now();
+}
+
+/**
+ * If onboarding was cancelled this function is invoked to record during which
+ * step the cancellation occurred.
+ *
+ * @param {NearbyShareOnboardingFinalState} nearbyShareOnboardingFinalState
+ */
+/* #export */ function processOnboardingCancelledMetrics(
+ nearbyShareOnboardingFinalState) {
+ if (!onboardingInitiatedTimestamp) {
+ return;
+ }
+ chrome.send('metricsHandler:recordInHistogram', [
+ NearbyShareOnboardingResultHistogramName, nearbyShareOnboardingFinalState,
+ NearbyShareOnboardingFinalState.MAX
+ ]);
+ onboardingInitiatedTimestamp = null;
+}
+
+/**
+ * Records a metric for successful onboarding flow completion and the time it
+ * took to complete.
+ */
+/* #export */ function processOnboardingCompleteMetrics() {
+ if (!onboardingInitiatedTimestamp) {
+ return;
+ }
+ chrome.send('metricsHandler:recordInHistogram', [
+ NearbyShareOnboardingResultHistogramName,
+ NearbyShareOnboardingFinalState.COMPLETE,
+ NearbyShareOnboardingFinalState.MAX
+ ]);
+
+ chrome.send('metricsHandler:recordMediumTime', [
+ NearbyShareOnboardingDurationHistogramName,
+ window.performance.now() - onboardingInitiatedTimestamp
+ ]);
+
+ onboardingInitiatedTimestamp = null;
+} \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html b/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
index 687515056ce..dcde68ccc23 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
@@ -7,6 +7,7 @@
<link rel="import" href="./nearby_page_template.html">
<link rel="import" href="./nearby_share_settings.html">
<link rel="import" href="./nearby_share_settings_behavior.html">
+<link rel="import" href="./nearby_metrics_logger.html">
<dom-module id="nearby-onboarding-page">
<template>
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js b/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
index cf9a413bb68..da2cddc865d 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
@@ -40,6 +40,8 @@ Polymer({
/** @private */
onClose_() {
+ processOnboardingCancelledMetrics(
+ NearbyShareOnboardingFinalState.DEVICE_NAME_PAGE);
this.fire('onboarding-cancelled');
},
@@ -58,6 +60,7 @@ Polymer({
/** @private */
onViewEnterStart_() {
this.$$('#deviceName').focus();
+ processOnboardingInitiatedMetrics(new URL(document.URL));
},
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_shared.gni b/chromium/chrome/browser/resources/nearby_share/shared/nearby_shared.gni
index 8ea9dd7f307..49b63283130 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_shared.gni
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_shared.gni
@@ -8,6 +8,7 @@ nearby_shared_auto_imports = [
"chrome/browser/resources/nearby_share/shared/nearby_contact_manager.html|getContactManager,observeContactManager",
"ui/webui/resources/html/assert.html|assert,assertNotReached",
"ui/webui/resources/html/cr.html|sendWithPromise",
+ "chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.html|processOnboardingInitiatedMetrics,processOnboardingCompleteMetrics,processOnboardingCancelledMetrics,NearbyShareOnboardingFinalState",
]
nearby_shared_namespace_rewrites = [
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.html b/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.html
index 0842f3d108d..fec11132f39 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.html
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.html
@@ -4,6 +4,7 @@
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="nearby_share_settings_behavior.html">
<link rel="import" href="nearby_contact_visibility.html">
+<link rel="import" href="nearby_metrics_logger.html">
<dom-module id="nearby-visibility-page">
<template>
diff --git a/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js b/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
index 15f4ab503b4..8e4af382bc9 100644
--- a/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
+++ b/chromium/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
@@ -42,11 +42,14 @@ Polymer({
(this.$.contactVisibility);
contactVisibility.saveVisibilityAndAllowedContacts();
this.set('settings.enabled', true);
+ processOnboardingCompleteMetrics();
this.fire('onboarding-complete');
},
/** @private */
onClose_() {
+ processOnboardingCancelledMetrics(
+ NearbyShareOnboardingFinalState.VISIBILITY_PAGE);
this.fire('onboarding-cancelled');
},
diff --git a/chromium/chrome/browser/resources/net_internals/BUILD.gn b/chromium/chrome/browser/resources/net_internals/BUILD.gn
index a0902ecd148..64a00c7bfc7 100644
--- a/chromium/chrome/browser/resources/net_internals/BUILD.gn
+++ b/chromium/chrome/browser/resources/net_internals/BUILD.gn
@@ -4,10 +4,13 @@
import("//chrome/common/features.gni")
import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_if_expr.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+preprocess_folder = "preprocessed"
+preprocess_manifest = "preprocessed_manifest.json"
+
grit("resources") {
- source = "net_internals_resources.grd"
defines = chrome_grit_defines
enable_input_discovery_for_gn_analyze = false
@@ -31,10 +34,8 @@ generate_grd("build_grd") {
"dns_view.js",
"domain_security_policy_view.js",
"events_view.js",
- "index.html",
"index.js",
"main.css",
- "main.js",
"proxy_view.js",
"sockets_view.js",
"tab_switcher_view.js",
@@ -42,4 +43,16 @@ generate_grd("build_grd") {
"view.js",
]
input_files_base_dir = rebase_path(".", "//")
+ deps = [ ":preprocess" ]
+ manifest_files = [ "$target_gen_dir/$preprocess_manifest" ]
+}
+
+preprocess_if_expr("preprocess") {
+ in_folder = "./"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_manifest"
+ in_files = [
+ "index.html",
+ "main.js",
+ ]
}
diff --git a/chromium/chrome/browser/resources/net_internals/main.js b/chromium/chrome/browser/resources/net_internals/main.js
index 611d8f6bd01..e532614659f 100644
--- a/chromium/chrome/browser/resources/net_internals/main.js
+++ b/chromium/chrome/browser/resources/net_internals/main.js
@@ -2,10 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {addSingletonGetter, isChromeOS} from 'chrome://resources/js/cr.m.js';
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
import {BrowserBridge} from './browser_bridge.js';
+// <if expr="chromeos">
import {CrosView} from './chromeos_view.js';
+// </if>
import {DnsView} from './dns_view.js';
import {DomainSecurityPolicyView} from './domain_security_policy_view.js';
import {EventsView} from './events_view.js';
@@ -73,17 +75,15 @@ export class MainView extends WindowView {
this.hashToTabId_[tabHash] = tabId;
}.bind(this);
- // Populate the main tabs. Even tabs that don't contain information for
- // the running OS should be created, so they can load log dumps from other
- // OSes.
+ // Populate the main tabs.
addTab(EventsView);
addTab(ProxyView);
addTab(DnsView);
addTab(SocketsView);
addTab(DomainSecurityPolicyView);
+ // <if expr="chromeos">
addTab(CrosView);
-
- this.tabSwitcher_.showTabLink(CrosView.TAB_ID, isChromeOS);
+ // </if>
}
/**
@@ -117,10 +117,12 @@ export class MainView extends WindowView {
parsed.tabHash = EventsView.TAB_HASH;
}
+ // <if expr="not chromeos">
// Don't switch to the chromeos view if not on chromeos.
- if (!isChromeOS && parsed.tabHash == '#chromeos') {
+ if (parsed.tabHash == '#chromeos') {
parsed.tabHash = EventsView.TAB_HASH;
}
+ // </if>
if (!parsed.tabHash) {
// Default to the events tab.
diff --git a/chromium/chrome/browser/resources/net_internals/tab_switcher_view.js b/chromium/chrome/browser/resources/net_internals/tab_switcher_view.js
index 5f2b86d7f76..32c63b064ab 100644
--- a/chromium/chrome/browser/resources/net_internals/tab_switcher_view.js
+++ b/chromium/chrome/browser/resources/net_internals/tab_switcher_view.js
@@ -108,24 +108,6 @@ export class TabSwitcherView extends View {
this.tabListWidth_ = $(TAB_LIST_ID).offsetWidth;
}
- showTabLink(tabId, isVisible) {
- const wasActive = this.activeTabId_ == tabId;
-
- setNodeDisplay(this.tabIdToLink_[tabId], isVisible);
- this.tabIdsLinkVisibility_.set(tabId, isVisible);
-
- if (wasActive && !isVisible) {
- // If the link for active tab is being hidden, then switch to the first
- // tab which is still visible.
- for (const [localTabId, enabled] of this.tabIdsLinkVisibility_) {
- if (enabled) {
- this.switchToTab(localTabId);
- break;
- }
- }
- }
- }
-
getAllTabViews() {
return this.tabIdToView_;
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
index e6c75abb1e5..17570fbe30f 100644
--- a/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -18,17 +18,18 @@ js_type_check("closure_compile") {
deps = [
":app",
- ":browser_proxy",
":customize_dialog",
":doodle_share_dialog",
":iframe",
":lazy_load",
":logo",
":new_tab_page",
+ ":new_tab_page_proxy",
":one_google_bar_api",
":promo_browser_command_proxy",
":utils",
":voice_search_overlay",
+ ":window_proxy",
"modules:module_descriptor",
"modules:module_registry",
"modules:modules",
@@ -45,9 +46,9 @@ js_library("new_tab_page") {
deps = [
":app",
":background_manager",
- ":browser_proxy",
":promo_browser_command_proxy",
":utils",
+ ":window_proxy",
"modules:module_descriptor",
"modules:module_header",
"modules:module_registry",
@@ -65,23 +66,22 @@ js_library("lazy_load") {
]
}
-js_library("browser_proxy") {
- deps = [
- ":background_manager",
- ":utils",
- "//chrome/browser/ui/webui/new_tab_page:mojo_bindings_js_library_for_compile",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:cr.m",
- ]
+js_library("window_proxy") {
+}
+
+js_library("new_tab_page_proxy") {
+ deps = [ "//chrome/browser/ui/webui/new_tab_page:mojo_bindings_js_library_for_compile" ]
}
js_library("app") {
deps = [
":background_manager",
- ":browser_proxy",
":customize_dialog_types",
+ ":metrics_utils",
+ ":new_tab_page_proxy",
":one_google_bar_api",
":promo_browser_command_proxy",
+ ":window_proxy",
"modules:module_wrapper",
"modules:modules",
"realbox:realbox",
@@ -95,22 +95,21 @@ js_library("app") {
}
js_library("promo_browser_command_proxy") {
- deps = [
- "//chrome/browser/promo_browser_command:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
- ]
+ deps = [ "//chrome/browser/promo_browser_command:mojo_bindings_js_library_for_compile" ]
}
js_library("middle_slot_promo") {
deps = [
- ":browser_proxy",
+ ":new_tab_page_proxy",
+ ":window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
js_library("most_visited") {
deps = [
- ":browser_proxy",
+ ":new_tab_page_proxy",
+ ":window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -128,6 +127,7 @@ js_library("customize_dialog") {
":customize_dialog_types",
":customize_modules",
":customize_shortcuts",
+ ":new_tab_page_proxy",
":utils",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/customize_themes",
@@ -141,8 +141,8 @@ js_library("customize_dialog_types") {
js_library("customize_backgrounds") {
deps = [
- ":browser_proxy",
":customize_dialog_types",
+ ":new_tab_page_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
@@ -155,8 +155,8 @@ js_library("mini_page") {
js_library("customize_shortcuts") {
deps = [
- ":browser_proxy",
":mini_page",
+ ":new_tab_page_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
]
@@ -164,7 +164,7 @@ js_library("customize_shortcuts") {
js_library("customize_modules") {
deps = [
- ":browser_proxy",
+ ":new_tab_page_proxy",
"modules:module_registry",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
@@ -179,6 +179,8 @@ js_library("customize_modules") {
js_library("voice_search_overlay") {
deps = [
+ ":new_tab_page_proxy",
+ ":window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
@@ -188,15 +190,25 @@ js_library("voice_search_overlay") {
js_library("utils") {
}
+js_library("metrics_utils") {
+ deps = [ "//ui/webui/resources/js:load_time_data.m" ]
+ externs_list = [ "//third_party/closure_compiler/externs/metrics_private.js" ]
+}
+
js_library("iframe") {
deps = [
+ ":utils",
+ ":window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
]
}
js_library("logo") {
deps = [
":doodle_share_dialog",
+ ":new_tab_page_proxy",
+ ":window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
]
@@ -215,7 +227,9 @@ js_library("doodle_share_dialog") {
js_library("background_manager") {
deps = [
":utils",
+ ":window_proxy",
"//ui/webui/resources/js:event_tracker.m",
+ "//ui/webui/resources/js:promise_resolver.m",
]
}
@@ -266,13 +280,15 @@ preprocess_if_expr("preprocess") {
out_manifest = "$target_gen_dir/$preprocess_manifest"
in_files = [
"background_manager.js",
- "browser_proxy.js",
+ "window_proxy.js",
+ "new_tab_page_proxy.js",
"img.js",
"lazy_load.js",
"customize_dialog_types.js",
"new_tab_page.js",
"promo_browser_command_proxy.js",
"utils.js",
+ "metrics_utils.js",
]
}
@@ -365,7 +381,7 @@ generate_grd("build_grd") {
grdp_files = [
"$target_gen_dir/icons/resources.grdp",
- "$target_gen_dir/modules/drive/icons/resources.grdp",
+ "$target_gen_dir/modules/cart/icons/resources.grdp",
"$target_gen_dir/new_tab_page_mojo_resources.grdp",
"$target_gen_dir/promo_browser_command_mojo_resources.grdp",
"$target_gen_dir/realbox/realbox_mojo_resources.grdp",
@@ -381,7 +397,7 @@ generate_grd("build_grd") {
":build_promo_browser_command_mojo_grdp",
":build_task_module_mojo_grdp",
"icons:build_grdp",
- "modules/drive/icons:build_grdp",
+ "modules/cart/icons:build_grdp",
"realbox:build_realbox_mojo_grdp",
"realbox:build_search_mojo_grdp",
]
diff --git a/chromium/chrome/browser/resources/new_tab_page/app.js b/chromium/chrome/browser/resources/new_tab_page/app.js
index 2863e7c0e99..81bc331d1f1 100644
--- a/chromium/chrome/browser/resources/new_tab_page/app.js
+++ b/chromium/chrome/browser/resources/new_tab_page/app.js
@@ -21,13 +21,15 @@ import {SkColor} from 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-w
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {BackgroundManager} from './background_manager.js';
-import {BrowserProxy} from './browser_proxy.js';
import {BackgroundSelection, BackgroundSelectionType, CustomizeDialogPage} from './customize_dialog_types.js';
+import {recordLoadDuration} from './metrics_utils.js';
import {ModuleDescriptor} from './modules/module_descriptor.js';
import {ModuleRegistry} from './modules/module_registry.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
import {oneGoogleBarApi} from './one_google_bar_api.js';
import {PromoBrowserCommandProxy} from './promo_browser_command_proxy.js';
import {$$} from './utils.js';
+import {WindowProxy} from './window_proxy.js';
/**
* @typedef {{
@@ -274,9 +276,9 @@ class AppElement extends PolymerElement {
performance.mark('app-creation-start');
super();
/** @private {!newTabPage.mojom.PageCallbackRouter} */
- this.callbackRouter_ = BrowserProxy.getInstance().callbackRouter;
+ this.callbackRouter_ = NewTabPageProxy.getInstance().callbackRouter;
/** @private {newTabPage.mojom.PageHandlerRemote} */
- this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_ = NewTabPageProxy.getInstance().handler;
/** @private {!BackgroundManager} */
this.backgroundManager_ = BackgroundManager.getInstance();
/** @private {?number} */
@@ -359,9 +361,9 @@ class AppElement extends PolymerElement {
/** @override */
ready() {
super.ready();
- this.pageHandler_.onAppRendered(BrowserProxy.getInstance().now());
+ this.pageHandler_.onAppRendered(WindowProxy.getInstance().now());
// Let the browser breath and then render remaining elements.
- BrowserProxy.getInstance().waitForLazyRender().then(() => {
+ WindowProxy.getInstance().waitForLazyRender().then(() => {
ensureLazyLoaded();
this.lazyRender_ = true;
});
@@ -435,7 +437,7 @@ class AppElement extends PolymerElement {
endOfBodyScript.appendChild(document.createTextNode(parts.endOfBodyScript));
document.body.appendChild(endOfBodyScript);
- this.pageHandler_.onOneGoogleBarRendered(BrowserProxy.getInstance().now());
+ this.pageHandler_.onOneGoogleBarRendered(WindowProxy.getInstance().now());
oneGoogleBarApi.trackDarkModeChanges();
}
@@ -546,12 +548,21 @@ class AppElement extends PolymerElement {
/** @private */
async onLazyRendered_() {
+ // Instantiate modules even if |modulesEnabled| is false to counterfactually
+ // trigger a HaTS survey in a potential control group.
+ if (!loadTimeData.getBoolean('modulesLoadEnabled') &&
+ !loadTimeData.getBoolean('modulesEnabled')) {
+ return;
+ }
+ const descriptors = await ModuleRegistry.getInstance().initializeModules(
+ loadTimeData.getInteger('modulesLoadTimeout'));
+ if (descriptors) {
+ this.pageHandler_.onModulesLoadedWithData();
+ }
if (!loadTimeData.getBoolean('modulesEnabled')) {
return;
}
- this.moduleDescriptors_ =
- await ModuleRegistry.getInstance().initializeModules(
- loadTimeData.getInteger('modulesLoadTimeout'));
+ this.moduleDescriptors_ = descriptors;
}
/** @private */
@@ -642,13 +653,16 @@ class AppElement extends PolymerElement {
onModulesLoadedAndVisibilityDeterminedChange_() {
if (this.modulesLoadedAndVisibilityDetermined_ &&
loadTimeData.getBoolean('modulesEnabled')) {
- this.pageHandler_.onModulesRendered(BrowserProxy.getInstance().now());
+ recordLoadDuration(
+ 'NewTabPage.Modules.ShownTime', WindowProxy.getInstance().now());
this.moduleDescriptors_.forEach(({id}) => {
chrome.metricsPrivate.recordBoolean(
`NewTabPage.Modules.EnabledOnNTPLoad.${id}`,
!this.disabledModules_.all &&
!this.disabledModules_.ids.includes(id));
});
+ chrome.metricsPrivate.recordBoolean(
+ 'NewTabPage.Modules.VisibleOnNTPLoad', !this.disabledModules_.all);
}
}
@@ -830,8 +844,7 @@ class AppElement extends PolymerElement {
oneGoogleBar.style.zIndex = '1000';
}
this.oneGoogleBarLoaded_ = true;
- this.pageHandler_.onOneGoogleBarRendered(
- BrowserProxy.getInstance().now());
+ this.pageHandler_.onOneGoogleBarRendered(WindowProxy.getInstance().now());
} else if (data.messageType === 'overlaysUpdated') {
this.$.oneGoogleBarClipPath.querySelectorAll('rect').forEach(el => {
el.remove();
@@ -957,6 +970,10 @@ class AppElement extends PolymerElement {
* @private
*/
onUndoRemoveModuleButtonClick_() {
+ if (!this.removedModuleData_) {
+ return;
+ }
+
// Restore the module.
this.removedModuleData_.undo();
diff --git a/chromium/chrome/browser/resources/new_tab_page/background_manager.js b/chromium/chrome/browser/resources/new_tab_page/background_manager.js
index eda3617ec45..d61c8513f1a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/background_manager.js
+++ b/chromium/chrome/browser/resources/new_tab_page/background_manager.js
@@ -3,11 +3,11 @@
// found in the LICENSE file.
import {skColorToRgba} from 'chrome://resources/js/color_utils.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {strictQuery} from './utils.js';
+import {WindowProxy} from './window_proxy.js';
/**
* @fileoverview The background manager brokers access to background related
@@ -55,10 +55,24 @@ class LoadTimeResolver {
}
}
+/** @type {BackgroundManager} */
+let instance = null;
+
export class BackgroundManager {
+ /** @return {!BackgroundManager} */
+ static getInstance() {
+ return instance || (instance = new BackgroundManager());
+ }
+
+ /** @param {BackgroundManager} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
- /** @private {Element} */
- this.backgroundImage_ = document.body.querySelector('#backgroundImage');
+ /** @private {!HTMLIFrameElement} */
+ this.backgroundImage_ =
+ strictQuery(document.body, '#backgroundImage', HTMLIFrameElement);
/** @private {LoadTimeResolver} */
this.loadTimeResolver_ = null;
/** @private {string} */
@@ -137,12 +151,10 @@ export class BackgroundManager {
getBackgroundImageLoadTime() {
if (!this.loadTimeResolver_) {
this.loadTimeResolver_ = new LoadTimeResolver(this.backgroundImage_.src);
- BrowserProxy.getInstance().postMessage(
+ WindowProxy.getInstance().postMessage(
this.backgroundImage_, 'sendLoadTime',
'chrome-untrusted://new-tab-page');
}
return this.loadTimeResolver_.promise;
}
}
-
-addSingletonGetter(BackgroundManager);
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
index d8584f6836f..502d1d3b6d0 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
@@ -10,8 +10,8 @@ import './iframe.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
import {BackgroundSelection, BackgroundSelectionType} from './customize_dialog_types.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
/** Element that lets the user configure the background. */
class CustomizeBackgroundsElement extends PolymerElement {
@@ -70,7 +70,7 @@ class CustomizeBackgroundsElement extends PolymerElement {
return;
}
/** @private {newTabPage.mojom.PageHandlerRemote} */
- this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_ = NewTabPageProxy.getInstance().handler;
this.pageHandler_.getBackgroundCollections().then(({collections}) => {
this.collections_ = collections;
});
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
index 9329ef432c8..77fc44bf58f 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
@@ -17,8 +17,8 @@ import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
import {BackgroundSelection, BackgroundSelectionType, CustomizeDialogPage} from './customize_dialog_types.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
import {createScrollBorders} from './utils.js';
/**
@@ -91,7 +91,7 @@ class CustomizeDialogElement extends PolymerElement {
constructor() {
super();
/** @private {newTabPage.mojom.PageHandlerRemote} */
- this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_ = NewTabPageProxy.getInstance().handler;
/** @private {!Array<!IntersectionObserver>} */
this.intersectionObservers_ = [];
this.backgroundSelection = {type: BackgroundSelectionType.NO_SELECTION};
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_modules.html b/chromium/chrome/browser/resources/new_tab_page/customize_modules.html
index 3203247dcc8..9be2fafb412 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_modules.html
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_modules.html
@@ -34,13 +34,14 @@
max-width: 544px;
}
- .toggle-row {
+ .toggle-row,
+ .discount-toggle-row {
align-items: center;
display: flex;
height: 52px;
}
- .toggle-row + .toggle-row {
+ .toggle-section + .toggle-section {
border-top: 1px solid var(--ntp-border-color);
}
@@ -73,15 +74,30 @@
</cr-policy-indicator>
</div>
<div id="toggles">
- <template is="dom-repeat" items="[[modules_]]">
- <div class="toggle-row">
- <div class="toggle-name">[[item.name]]</div>
- <cr-policy-indicator indicator-type="devicePolicy"
- hidden="[[!showManagedByPolicy_]]">
- </cr-policy-indicator>
- <cr-toggle checked="{{item.checked}}"
- disabled="[[moduleToggleDisabled_(show_, showManagedByPolicy_)]]">
- </cr-toggle>
+ <template id="toggleRepeat" is="dom-repeat" items="[[modules_]]">
+ <div class="toggle-section">
+ <div class="toggle-row">
+ <div class="toggle-name">[[item.name]]</div>
+ <cr-policy-indicator indicator-type="devicePolicy"
+ hidden="[[!showManagedByPolicy_]]">
+ </cr-policy-indicator>
+ <cr-toggle checked="{{item.checked}}"
+ disabled="[[moduleToggleDisabled_(show_, showManagedByPolicy_)]]">
+ </cr-toggle>
+ </div>
+ <!-- Discount toggle is a workaround for crbug.com/1199465 and will be
+ removed after module customization is better defined. Please avoid
+ using similar pattern for other features. -->
+ <template is="dom-if"
+ if=
+ "[[showDiscountToggle_(item.id, item.checked, discountToggleEligible_)]]">
+ <div class="discount-toggle-row">
+ <div class="toggle-name">
+ $i18n{modulesCartDiscountConsentAccept}
+ </div>
+ <cr-toggle checked="{{discountToggle_.enabled}}"></cr-toggle>
+ </div>
+ </template>
</div>
</template>
</div>
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_modules.js b/chromium/chrome/browser/resources/new_tab_page/customize_modules.js
index e77caf9e90d..c92401848ad 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_modules.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_modules.js
@@ -13,8 +13,9 @@ import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {ChromeCartProxy} from './modules/cart/chrome_cart_proxy.js';
import {ModuleRegistry} from './modules/module_registry.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
/** Element that lets the user configure modules settings. */
class CustomizeModulesElement extends PolymerElement {
@@ -59,6 +60,28 @@ class CustomizeModulesElement extends PolymerElement {
value: () => ModuleRegistry.getInstance().getDescriptors().map(
d => ({name: d.name, id: d.id, checked: true, hidden: false})),
},
+
+ /**
+ * @private {
+ * !Object<{
+ * enabled: boolean,
+ * initiallyEnabled: boolean,
+ * }>
+ * }
+ */
+ // Discount toggle is a workaround for crbug.com/1199465 and will be
+ // removed after module customization is better defined. Please avoid
+ // using similar pattern for other features.
+ discountToggle_: {
+ type: Object,
+ value: {enabled: false, initiallyEnabled: false},
+ },
+
+ /** @private */
+ discountToggleEligible_: {
+ type: Boolean,
+ value: false,
+ }
};
}
@@ -72,7 +95,7 @@ class CustomizeModulesElement extends PolymerElement {
connectedCallback() {
super.connectedCallback();
this.setDisabledModulesListenerId_ =
- BrowserProxy.getInstance()
+ NewTabPageProxy.getInstance()
.callbackRouter.setDisabledModules.addListener((all, ids) => {
this.show_ = !all;
this.modules_.forEach(({id}, i) => {
@@ -82,13 +105,24 @@ class CustomizeModulesElement extends PolymerElement {
this.set(`modules_.${i}.disabled`, ids.includes(id));
});
});
- BrowserProxy.getInstance().handler.updateDisabledModules();
+ NewTabPageProxy.getInstance().handler.updateDisabledModules();
+ this.set(
+ 'discountToggleEligible_',
+ loadTimeData.getBoolean('ruleBasedDiscountEnabled'));
+ if (!this.discountToggleEligible_) {
+ return;
+ }
+ ChromeCartProxy.getInstance().handler.getDiscountEnabled().then(
+ ({enabled}) => {
+ this.set('discountToggle_.enabled', enabled);
+ this.discountToggle_.initiallyEnabled = enabled;
+ });
}
/** @override */
disconnectedCallback() {
super.disconnectedCallback();
- BrowserProxy.getInstance().callbackRouter.removeListener(
+ NewTabPageProxy.getInstance().callbackRouter.removeListener(
assert(this.setDisabledModulesListenerId_));
}
@@ -106,7 +140,7 @@ class CustomizeModulesElement extends PolymerElement {
}
apply() {
- const handler = BrowserProxy.getInstance().handler;
+ const handler = NewTabPageProxy.getInstance().handler;
handler.setModulesVisible(this.show_);
this.modules_
.filter(({checked, initiallyChecked}) => checked !== initiallyChecked)
@@ -120,6 +154,15 @@ class CustomizeModulesElement extends PolymerElement {
chrome.metricsPrivate.recordSparseHashable(base, id);
chrome.metricsPrivate.recordSparseHashable(`${base}.Customize`, id);
});
+ // Discount toggle is a workaround for crbug.com/1199465 and will be
+ // removed after module customization is better defined. Please avoid
+ // using similar pattern for other features.
+ if (this.discountToggleEligible_ &&
+ this.discountToggle_.enabled !==
+ this.discountToggle_.initiallyEnabled) {
+ ChromeCartProxy.getInstance().handler.setDiscountEnabled(
+ this.discountToggle_.enabled);
+ }
}
/**
@@ -151,6 +194,17 @@ class CustomizeModulesElement extends PolymerElement {
moduleToggleDisabled_() {
return this.showManagedByPolicy_ || !this.show_;
}
+
+ /**
+ * @param {string} id
+ * @param {boolean} checked
+ * @param {boolean} eligible
+ * @return {boolean}
+ * @private
+ */
+ showDiscountToggle_(id, checked, eligible) {
+ return id === 'chrome_cart' && checked && eligible;
+ }
}
customElements.define(CustomizeModulesElement.is, CustomizeModulesElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
index 0e54ab45b8e..4192b1eac10 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
@@ -11,7 +11,7 @@ import {assert} from 'chrome://resources/js/assert.m.js';
import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
/** Element that lets the user configure shortcut settings. */
class CustomizeShortcutsElement extends PolymerElement {
@@ -35,7 +35,7 @@ class CustomizeShortcutsElement extends PolymerElement {
constructor() {
super();
- const {callbackRouter, handler} = BrowserProxy.getInstance();
+ const {callbackRouter, handler} = NewTabPageProxy.getInstance();
/** @private {!newTabPage.mojom.PageCallbackRouter} */
this.callbackRouter_ = callbackRouter;
/** @private {newTabPage.mojom.PageHandlerRemote} */
diff --git a/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js
index efb31ab9e71..ea61ff09d85 100644
--- a/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js
+++ b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {WindowProxy} from './window_proxy.js';
/**
* The ID of the doodle app for Facebook. Used to share doodles to Facebook.
@@ -48,7 +48,7 @@ class DoodleShareDialogElement extends PolymerElement {
`?app_id=${FACEBOOK_APP_ID}` +
`&href=${encodeURIComponent(this.url.url)}` +
`&hashtag=${encodeURIComponent('#GoogleDoodle')}`;
- BrowserProxy.getInstance().open(url);
+ WindowProxy.getInstance().open(url);
this.notifyShare_(newTabPage.mojom.DoodleShareChannel.kFacebook);
}
@@ -56,7 +56,7 @@ class DoodleShareDialogElement extends PolymerElement {
onTwitterClick_() {
const url = 'https://twitter.com/intent/tweet' +
`?text=${encodeURIComponent(`${this.title}\n${this.url.url}`)}`;
- BrowserProxy.getInstance().open(url);
+ WindowProxy.getInstance().open(url);
this.notifyShare_(newTabPage.mojom.DoodleShareChannel.kTwitter);
}
@@ -64,7 +64,7 @@ class DoodleShareDialogElement extends PolymerElement {
onEmailClick_() {
const url = `mailto:?subject=${encodeURIComponent(this.title)}` +
`&body=${encodeURIComponent(this.url.url)}`;
- BrowserProxy.getInstance().navigate(url);
+ WindowProxy.getInstance().navigate(url);
this.notifyShare_(newTabPage.mojom.DoodleShareChannel.kEmail);
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/icons/BUILD.gn
index 3b594424fc7..eb88ea850dc 100644
--- a/chromium/chrome/browser/resources/new_tab_page/icons/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/BUILD.gn
@@ -11,7 +11,6 @@ generate_grd("build_grdp") {
"account_circle.svg",
"backgrounds.svg",
"cards.svg",
- "cart_fallback.svg",
"check_circle.svg",
"chevron.svg",
"colored_header.svg",
diff --git a/chromium/chrome/browser/resources/new_tab_page/iframe.js b/chromium/chrome/browser/resources/new_tab_page/iframe.js
index 14afd7b04a7..e12c07b09ed 100644
--- a/chromium/chrome/browser/resources/new_tab_page/iframe.js
+++ b/chromium/chrome/browser/resources/new_tab_page/iframe.js
@@ -2,8 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {assert} from 'chrome://resources/js/assert.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+
+import {strictQuery} from './utils.js';
+import {WindowProxy} from './window_proxy.js';
/**
* @fileoverview Wrapper around <iframe> element that lets us mock out loading
@@ -40,8 +43,10 @@ class IframeElement extends PolymerElement {
* @param {*} message
*/
postMessage(message) {
- BrowserProxy.getInstance().postMessage(
- this.$.iframe, message, new URL(this.src).origin);
+ assert(this.shadowRoot);
+ WindowProxy.getInstance().postMessage(
+ strictQuery(this.shadowRoot, '#iframe', HTMLIFrameElement), message,
+ new URL(this.src).origin);
}
/**
@@ -49,7 +54,7 @@ class IframeElement extends PolymerElement {
* @private
*/
computeSrc_() {
- return BrowserProxy.getInstance().createIframeSrc(this.src);
+ return WindowProxy.getInstance().createIframeSrc(this.src);
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/logo.js b/chromium/chrome/browser/resources/new_tab_page/logo.js
index f228613ce84..f965b9d10a9 100644
--- a/chromium/chrome/browser/resources/new_tab_page/logo.js
+++ b/chromium/chrome/browser/resources/new_tab_page/logo.js
@@ -12,8 +12,9 @@ import {skColorToRgba} from 'chrome://resources/js/color_utils.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
import {$$} from './utils.js';
+import {WindowProxy} from './window_proxy.js';
/** @type {number} */
const SHARE_BUTTON_SIZE_PX = 26;
@@ -144,7 +145,7 @@ class LogoElement extends PolymerElement {
/** @private {!EventTracker} */
this.eventTracker_ = new EventTracker();
/** @private {newTabPage.mojom.PageHandlerRemote} */
- this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_ = NewTabPageProxy.getInstance().handler;
this.pageHandler_.getDoodle().then(({doodle}) => {
this.doodle_ = doodle;
this.loaded_ = true;
@@ -306,7 +307,7 @@ class LogoElement extends PolymerElement {
onClickUrl.searchParams.append(param[0], param[1]);
}
}
- BrowserProxy.getInstance().open(onClickUrl.toString());
+ WindowProxy.getInstance().open(onClickUrl.toString());
}
/** @private */
@@ -325,7 +326,7 @@ class LogoElement extends PolymerElement {
async logImageRendered_(type, logUrl) {
const {imageClickParams, interactionLogUrl, shareId} =
await this.pageHandler_.onDoodleImageRendered(
- type, BrowserProxy.getInstance().now(), logUrl);
+ type, WindowProxy.getInstance().now(), logUrl);
this.imageClickParams_ = imageClickParams;
this.interactionLogUrl_ = interactionLogUrl;
this.shareId_ = shareId;
diff --git a/chromium/chrome/browser/resources/new_tab_page/metrics_utils.js b/chromium/chrome/browser/resources/new_tab_page/metrics_utils.js
new file mode 100644
index 00000000000..4671db6029c
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/metrics_utils.js
@@ -0,0 +1,70 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+
+/**
+ * Records |durationMs| in the |metricName| histogram.
+ * @param {string} metricName
+ * @param {number} durationMs
+ */
+export function recordDuration(metricName, durationMs) {
+ chrome.metricsPrivate.recordValue(
+ {
+ metricName,
+ type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LOG,
+ min: 1,
+ max: 60000, // 60 seconds.
+ buckets: 100,
+ },
+ Math.floor(durationMs));
+}
+
+/**
+ * Records the duration between navigation start and |msSinceEpoch| in the
+ * |metricName| histogram.
+ * @param {string} metricName
+ * @param {number} msSinceEpoch
+ */
+export function recordLoadDuration(metricName, msSinceEpoch) {
+ recordDuration(
+ metricName,
+ msSinceEpoch - /** @type {number} */
+ (loadTimeData.getValue('navigationStartTime')));
+}
+
+/**
+ * Records |value| (expected to be between 0 and 10) into the ten-bucket
+ * |metricName| histogram.
+ * @param {string} metricName
+ * @param {number} value
+ */
+export function recordPerdecage(metricName, value) {
+ chrome.metricsPrivate.recordValue(
+ {
+ metricName,
+ type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
+ min: 1, // Choose 1 if real min is 0.
+ max: 11, // Exclusive.
+ buckets: 12, // Numbers 0-10 and unused overflow bucket of 11.
+ },
+ value);
+}
+
+/**
+ * Records that an event has happened rather than a value in the |metricName|
+ * histogram.
+ * @param {string} metricName
+ */
+export function recordOccurence(metricName) {
+ chrome.metricsPrivate.recordValue(
+ {
+ metricName,
+ type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
+ min: 1,
+ max: 1,
+ buckets: 1,
+ },
+ 1);
+}
diff --git a/chromium/chrome/browser/resources/new_tab_page/middle_slot_promo.js b/chromium/chrome/browser/resources/new_tab_page/middle_slot_promo.js
index 7de830c412c..4c107c7f69a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/middle_slot_promo.js
+++ b/chromium/chrome/browser/resources/new_tab_page/middle_slot_promo.js
@@ -5,9 +5,11 @@
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+
import {ImgElement} from './img.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
import {PromoBrowserCommandProxy} from './promo_browser_command_proxy.js';
+import {WindowProxy} from './window_proxy.js';
/**
* If a promo exists with content and can be shown, an element containing
@@ -16,7 +18,7 @@ import {PromoBrowserCommandProxy} from './promo_browser_command_proxy.js';
* @return {!Promise<Element>}
*/
export async function renderPromo() {
- const browserHandler = BrowserProxy.getInstance().handler;
+ const browserHandler = NewTabPageProxy.getInstance().handler;
const promoBrowserCommandHandler =
PromoBrowserCommandProxy.getInstance().handler;
const {promo} = await browserHandler.getPromo();
@@ -31,11 +33,13 @@ export async function renderPromo() {
return null;
}
const el = /** @type {!HTMLAnchorElement} */ (document.createElement('a'));
+ /** @type {?promoBrowserCommand.mojom.Command} */
let commandId = null;
if (!commandIdMatch) {
el.href = target.url;
} else {
- commandId = +commandIdMatch[1];
+ commandId =
+ /** @type {promoBrowserCommand.mojom.Command} */ (+commandIdMatch[1]);
// Make sure we don't send unsupported commands to the browser.
if (!Object.values(promoBrowserCommand.mojom.Command)
.includes(commandId)) {
@@ -103,7 +107,7 @@ export async function renderPromo() {
.every(({canShow}) => canShow);
if (hasContent && canShow) {
browserHandler.onPromoRendered(
- BrowserProxy.getInstance().now(), promo.logUrl || null);
+ WindowProxy.getInstance().now(), promo.logUrl || null);
return container;
}
return null;
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/BUILD.gn
index 907101b0442..21f3f8ea368 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/BUILD.gn
@@ -10,7 +10,10 @@ import("//ui/webui/resources/tools/generate_grd.gni")
import("//ui/webui/webui_features.gni")
js_library("module_descriptor") {
- deps = [ "..:browser_proxy" ]
+ deps = [
+ "..:metrics_utils",
+ "..:window_proxy",
+ ]
}
js_library("modules") {
@@ -28,7 +31,10 @@ js_library("modules") {
js_library("module_wrapper") {
deps = [
":module_descriptor",
+ "..:metrics_utils",
+ "..:window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
]
externs_list = [ "//third_party/closure_compiler/externs/metrics_private.js" ]
}
@@ -42,7 +48,7 @@ js_library("module_header") {
js_library("module_registry") {
deps = [
":module_descriptor",
- "//ui/webui/resources/js:cr.m",
+ "..:new_tab_page_proxy",
]
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/cart/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/cart/BUILD.gn
index 627b69b461d..546e9432535 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/cart/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/BUILD.gn
@@ -18,10 +18,7 @@ js_library("module") {
}
js_library("chrome_cart_proxy") {
- deps = [
- "//chrome/browser/cart:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
- ]
+ deps = [ "//chrome/browser/cart:mojo_bindings_js_library_for_compile" ]
}
html_to_js("web_components") {
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/cart/chrome_cart_proxy.js b/chromium/chrome/browser/resources/new_tab_page/modules/cart/chrome_cart_proxy.js
index f29b8faa384..8c526d33bda 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/cart/chrome_cart_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/chrome_cart_proxy.js
@@ -4,19 +4,28 @@
import './chrome_cart.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
/**
* @fileoverview This file provides a class that exposes the Mojo handler
* interface used for sending requests from NTP chrome cart module JS to the
* browser and receiving the browser response.
*/
+/** @type {ChromeCartProxy} */
+let instance = null;
+
export class ChromeCartProxy {
+ /** @return {!ChromeCartProxy} */
+ static getInstance() {
+ return instance || (instance = new ChromeCartProxy());
+ }
+
+ /** @param {ChromeCartProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!chromeCart.mojom.CartHandlerRemote} */
this.handler = chromeCart.mojom.CartHandler.getRemote();
}
}
-
-addSingletonGetter(ChromeCartProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/BUILD.gn
index b9fe9188272..e1b7f106ae8 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/BUILD.gn
@@ -5,13 +5,12 @@
import("//ui/webui/resources/tools/generate_grd.gni")
generate_grd("build_grdp") {
- grd_prefix = "drive"
+ grd_prefix = "cart"
out_grd = "$target_gen_dir/resources.grdp"
input_files = [
- "google_docs_logo.svg",
- "google_sheets_logo.svg",
- "google_slides_logo.svg",
+ "cart_fallback.svg",
+ "consent_label.svg",
]
input_files_base_dir = rebase_path(".", "//")
- resource_path_prefix = "modules/drive/icons"
+ resource_path_prefix = "modules/cart/icons"
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/cart_fallback.svg b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/cart_fallback.svg
index d5212e47485..d5212e47485 100644
--- a/chromium/chrome/browser/resources/new_tab_page/icons/cart_fallback.svg
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/cart_fallback.svg
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/consent_label.svg b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/consent_label.svg
new file mode 100644
index 00000000000..bf0744e9c05
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/icons/consent_label.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24" fill="#455A64"><path fill="none" d="M0 0h24v24H0z"/><path d="M19 2h-5.87c-.8 0-1.56.32-2.12.88l-8.13 8.13a3 3 0 0 0 0 4.24l5.87 5.87c.59.59 1.36.88 2.12.88s1.54-.29 2.12-.88L21.12 13c.56-.56.88-1.33.88-2.12V5c0-1.66-1.34-3-3-3zm1 8.88c0 .27-.1.52-.29.71l-8.13 8.12c-.25.26-.55.29-.71.29s-.45-.04-.71-.29l-5.87-5.87a1.017 1.017 0 0 1 0-1.42l8.13-8.13c.19-.19.45-.29.71-.29H19c.55 0 1 .45 1 1v5.88z"/><circle cx="16.5" cy="7.5" r="1.5"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.html b/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.html
index f0d4354d0bd..542934cc747 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.html
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.html
@@ -4,6 +4,23 @@
flex-direction: column;
height: 100%;
width: 100%;
+ --discount-chip-background: rgb(230, 244, 234);
+ --discount-chip-text-color: var(--google-green-700);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ :host {
+ --discount-chip-background: linear-gradient(0deg,
+ rgba(129, 201, 149, 0.12), rgba(129, 201, 149, 0.12)), #202124;
+ --discount-chip-text-color: rgb(129,201,149);
+ }
+ }
+
+ /* Adjusting header margin and cartCarousel to make sure
+ * the discount chip doesn't get clipped due to
+ * overflow-x: hidden */
+ ntp-module-header {
+ margin-bottom: 0;
}
:host(:hover) .side-scroll-button {
@@ -12,17 +29,28 @@
#moduleContent {
display: flex;
- height: 100%;
+ height: 166px;
+ padding-bottom: 16px;
position: relative;
}
+ :host([header-description-text]) #moduleContent {
+ height: 158px;
+ }
+
#cartCarousel {
display: inline-block;
overflow-x: hidden;
+ padding-top: 24px;
white-space: nowrap;
z-index: 0;
}
+ :host([header-description-text]) #cartCarousel {
+ padding-top: 16px;
+ }
+
+ #consentCard,
.cart-item {
border: 1px solid var(--ntp-border-color);
border-radius: 4px;
@@ -30,6 +58,71 @@
flex-direction: column;
height: 140px;
margin: 0 4px;
+ }
+
+ #consentCard {
+ width: 244px;
+ }
+
+ #consentIconContainer {
+ background: var(--discount-chip-background);
+ border-radius: 4px;
+ height: 24px;
+ margin-inline-end: auto;
+ margin-inline-start: auto;
+ margin-top: 16px;
+ width: 24px;
+ }
+
+ #consentIcon {
+ -webkit-mask-image: url(modules/cart/icons/consent_label.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background-color: var(--discount-chip-text-color);
+ height: 15px;
+ margin-inline-end: auto;
+ margin-inline-start: auto;
+ margin-top: 4.5px;
+ width: 15px;
+ }
+
+ #consentContent {
+ color: var(--cr-primary-text-color);
+ font-size: 13px;
+ font-weight: 400;
+ height: 40px;
+ line-height: 20px;
+ margin-inline-end: auto;
+ margin-inline-start: auto;
+ margin-top: 4px;
+ text-align: center;
+ white-space: normal;
+ width: 220px;
+ }
+
+ #consentButtonContainer {
+ display: inline-block;
+ margin-inline-start: 16px;
+ margin-top: 8px;
+ }
+
+ .discount-chip {
+ background: var(--discount-chip-background);
+ border-radius: 4px;
+ color: var(--discount-chip-text-color);
+ font-size: 12px;
+ height: 24px;
+ left: 50%;
+ line-height: 24px;
+ position: absolute;
+ text-align: center;
+ top: -18px;
+ transform: translateX(-50%);
+ width: 102px;
+ z-index: 1;
+ }
+
+ .cart-item {
outline: none;
position: relative;
text-decoration: none;
@@ -147,8 +240,8 @@
background-color: var(--ntp-module-scroll-button-color);
border-radius: 50%;
position: absolute;
- top: 45%;
- transform: translateY(-45%);
+ top: 50%;
+ transform: translateY(-50%);
visibility: hidden;
z-index: 2;
}
@@ -197,10 +290,36 @@
</template>
<div id="cartCarousel">
<div id="leftProbe" class="probe"></div>
+ <template id="consentCardElement" is="dom-if"
+ if="[[showDiscountConsent]]">
+ <div id="consentCard">
+ <div id="consentIconContainer">
+ <div id="consentIcon"></div>
+ </div>
+ <span id="consentContent">
+ $i18n{modulesCartDiscountConsentContent}
+ </span>
+ <div id="consentButtonContainer">
+ <cr-button id="cancelButton"
+ class="cancel-button" on-click="onDisallowDiscount_"
+ on-auxclick="onDisallowDiscount_">
+ $i18n{modulesCartDiscountConsentReject}
+ </cr-button>
+ <cr-button id="actionButton"
+ class="action-button" on-click="onAllowDiscount_"
+ on-auxclick="onAllowDiscount_">
+ $i18n{modulesCartDiscountConsentAccept}
+ </cr-button>
+ </div>
+ </div>
+ </template>
<template id="cartItemRepeat" is="dom-repeat" items="[[cartItems]]">
<a class="cart-item" title="[[item.merchant]]"
href="[[item.cartUrl.url]]" on-click="onCartItemClick_"
on-auxclick="onCartItemClick_">
+ <template is="dom-if" if="[[item.discountText]]">
+ <div class="discount-chip">[[item.discountText]]</div>
+ </template>
<cr-icon-button class="icon-more-vert"
title="$i18n{moreActions}" on-click="onCartMenuButtonClick_">
</cr-icon-button>
@@ -230,7 +349,7 @@
<template id="thumbnailFallback" is="dom-if"
if="[[!item.productImageUrls.length]]">
<img class="thumbnail-fallback"
- src="chrome://new-tab-page/icons/cart_fallback.svg">
+ src="modules/cart/icons/cart_fallback.svg">
</template>
</div>
</a>
@@ -263,3 +382,12 @@
$i18n{undo}
</cr-button>
</cr-toast>
+<cr-toast id="confirmDiscountConsentToast" duration="10000">
+ <div id="confirmDiscountConsentMessage">
+ [[confirmDiscountConsentString_]]
+ </div>
+ <cr-button id="confirmDiscountConsentButton"
+ on-click="onConfirmDiscountConsentClick_">
+ $i18n{modulesCartDiscountConsentConfirmationDismiss}
+ </cr-button>
+</cr-toast>
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.js b/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.js
index 2a0fbddb4f4..dbc5fec3169 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/cart/module.js
@@ -43,7 +43,13 @@ class ChromeCartModuleElement extends mixinBehaviors
headerChipText: String,
/** @type {string} */
- headerDescriptionText: String,
+ headerDescriptionText: {
+ type: String,
+ reflectToAttribute: true,
+ },
+
+ /** @type {boolean} */
+ showDiscountConsent: Boolean,
/** @private {boolean} */
showLeftScrollButton_: Boolean,
@@ -57,9 +63,6 @@ class ChromeCartModuleElement extends mixinBehaviors
/** @private {string} */
cartMenuRemoveItem_: String,
- /** @private {number} */
- height: Number,
-
/**
* Data about the most recently dismissed cart item.
* @type {?{message: string, restoreCallback: function()}}
@@ -69,6 +72,12 @@ class ChromeCartModuleElement extends mixinBehaviors
type: Object,
value: null,
},
+
+ /** @private {string} */
+ confirmDiscountConsentString_: String,
+
+ /** @private {string} */
+ discountConsentIconSrc_: String,
};
}
@@ -303,9 +312,18 @@ class ChromeCartModuleElement extends mixinBehaviors
const scrollOffset = Math.max(
leftScrollShadow ? leftScrollShadow.offsetWidth : 0,
rightScrollShadow ? rightScrollShadow.offsetWidth : 0);
+ let leftPosition = carts[index].offsetLeft - scrollOffset;
+ // TODO(crbug.com/1198632): This could make a left scroll jump over cart
+ // items.
+ if (index === 0) {
+ const consentCard = this.shadowRoot.getElementById('consentCard');
+ if (consentCard) {
+ leftPosition -= consentCard.offsetWidth;
+ }
+ }
this.$.cartCarousel.scrollTo({
top: 0,
- left: carts[index].offsetLeft - scrollOffset,
+ left: leftPosition,
behavior: this.scrollBehavior,
});
}
@@ -332,33 +350,57 @@ class ChromeCartModuleElement extends mixinBehaviors
ChromeCartProxy.getInstance().handler.onCartItemClicked(index);
this.dispatchEvent(new Event('usage', {bubbles: true, composed: true}));
}
+
+ /** @private */
+ onDisallowDiscount_() {
+ this.showDiscountConsent = false;
+ this.confirmDiscountConsentString_ =
+ loadTimeData.getString('modulesCartDiscountConsentRejectConfirmation');
+ $$(this, '#confirmDiscountConsentToast').show();
+ ChromeCartProxy.getInstance().handler.onDiscountConsentAcknowledged(false);
+ }
+
+ /** @private */
+ onAllowDiscount_() {
+ this.showDiscountConsent = false;
+ this.confirmDiscountConsentString_ =
+ loadTimeData.getString('modulesCartDiscountConsentAcceptConfirmation');
+ $$(this, '#confirmDiscountConsentToast').show();
+ ChromeCartProxy.getInstance().handler.onDiscountConsentAcknowledged(true);
+ }
+
+ /** @private */
+ onConfirmDiscountConsentClick_() {
+ $$(this, '#confirmDiscountConsentToast').hide();
+ }
}
customElements.define(ChromeCartModuleElement.is, ChromeCartModuleElement);
/** @return {!Promise<?HTMLElement>} */
async function createCartElement() {
- const {visible} =
+ const {welcomeVisible} =
await ChromeCartProxy.getInstance().handler.getWarmWelcomeVisible();
const {carts} =
await ChromeCartProxy.getInstance().handler.getMerchantCarts();
+ const {consentVisible} = await ChromeCartProxy.getInstance()
+ .handler.getDiscountConsentCardVisible();
ChromeCartProxy.getInstance().handler.onModuleCreated(carts.length);
if (carts.length === 0) {
return null;
}
const element = new ChromeCartModuleElement();
- if (visible) {
+ if (welcomeVisible) {
element.headerChipText = loadTimeData.getString('modulesCartHeaderNew');
element.headerDescriptionText =
loadTimeData.getString('modulesCartWarmWelcome');
- element.height = 226;
}
element.cartItems = carts;
+ element.showDiscountConsent = consentVisible;
return element;
}
/** @type {!ModuleDescriptor} */
export const chromeCartDescriptor = new ModuleDescriptor(
/*id=*/ 'chrome_cart',
- /*name=*/ loadTimeData.getString('modulesCartSentence'),
- /*heightPx=*/ 216, createCartElement);
+ /*name=*/ loadTimeData.getString('modulesCartSentence'), createCartElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/drive/BUILD.gn
index 8ad4524af4a..d6989efc184 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/drive/BUILD.gn
@@ -15,10 +15,8 @@ js_library("module") {
}
js_library("drive_module_proxy") {
- deps = [
- "//chrome/browser/search/drive:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
- ]
+ deps =
+ [ "//chrome/browser/search/drive:mojo_bindings_js_library_for_compile" ]
}
html_to_js("web_components") {
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/drive_module_proxy.js b/chromium/chrome/browser/resources/new_tab_page/modules/drive/drive_module_proxy.js
index a92b9c4fb5d..20db0a8dbf8 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/drive_module_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/drive/drive_module_proxy.js
@@ -4,19 +4,28 @@
import './drive.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
/**
* @fileoverview This file provides a class that exposes the Mojo handler
* interface used for sending requests from NTP dummy module JS to the browser
* and receiving the browser response.
*/
+/** @type {DriveProxy} */
+let instance = null;
+
export class DriveProxy {
+ /** @return {!DriveProxy} */
+ static getInstance() {
+ return instance || (instance = new DriveProxy());
+ }
+
+ /** @param {DriveProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!drive.mojom.DriveHandlerRemote} */
this.handler = drive.mojom.DriveHandler.getRemote();
}
}
-
-addSingletonGetter(DriveProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_docs_logo.svg b/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_docs_logo.svg
deleted file mode 100644
index 1cec678ad7c..00000000000
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_docs_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="26" height="36" viewBox="0 0 26 36" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M20.719 18.41H5.281v2.863H20.72v-2.864zm-4.062 4.908H5.28v2.864h11.376v-2.864z" fill="#fff"/><path d="M17.063 9l4.188.205L26 9l-8.938-9-.203 5.494L17.062 9z" fill="#0066DA"/><path d="M20.719 13.5H5.281v2.864H20.72V13.5z" fill="#fff"/><path d="M17.063 9V0H2.438A2.445 2.445 0 0 0 0 2.455v31.09A2.445 2.445 0 0 0 2.438 36h21.125A2.445 2.445 0 0 0 26 33.545V9h-8.938zm-.813 16.773H5.687v-2.046H16.25v2.046zm4.063-4.91H5.688v-2.045h14.625v2.046zm0-4.909H5.688V13.91h14.625v2.045z" fill="#2684FC"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_sheets_logo.svg b/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_sheets_logo.svg
deleted file mode 100644
index 9c7b0cc4ba6..00000000000
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_sheets_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="26" height="36" viewBox="0 0 26 36" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M23.563 36H2.438A2.445 2.445 0 0 1 0 33.545V2.455A2.445 2.445 0 0 1 2.438 0h14.624L26 9v24.545A2.445 2.445 0 0 1 23.562 36z" fill="#00AC47"/><path d="M17.063 0L26 9h-8.938V0z" fill="#00832D"/><path d="M19.094 13.91H4.875v11.862h16.25V13.909h-2.031zM6.906 15.954h5.078v2.863H6.906v-2.863zm0 7.772v-2.863h5.078v2.863H6.906zm12.188 0h-5.078v-2.863h5.078v2.863zm0-4.909h-5.078v-2.863h5.078v2.863z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_slides_logo.svg b/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_slides_logo.svg
deleted file mode 100644
index 6ea313f06b1..00000000000
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/icons/google_slides_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="52" height="72" viewBox="0 0 52 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.125 72H4.875C2.18 72 0 69.803 0 67.091V4.91C0 2.197 2.18 0 4.875 0h29.25L52 18v49.091c0 2.713-2.182 4.91-4.875 4.91z" fill="#FFBA00"/><path d="M34.125 0L52 18H34.125V0z" fill="#FF9500"/><path d="M38.187 27.819H9.75v22.09h32.5V27.82h-4.063zm0 18H13.812v-13.91h24.375v13.91z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.html b/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.html
index bf9b7a11c9a..af17f574345 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.html
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.html
@@ -1,38 +1,78 @@
<style>
:host {
+ --ntp-modules-drive-row-margin: 15px;
+ display: block;
height: 100%;
width: 100%;
}
#files {
display: flex;
+ flex-direction: column;
}
.file {
+ align-items: center;
+ border-top: 0.5px solid var(--ntp-border-color);
color: var(--cr-primary-text-color);
- display: block;
- margin-inline-start: 16px;
+ display: flex;
+ flex-shrink: 0;
+ height: 38px;
+ margin-inline-end: var(--ntp-modules-drive-row-margin);
+ margin-inline-start: var(--ntp-modules-drive-row-margin);
text-decoration: none;
- width: 165px;
}
- .file-icon-container {
- align-items: center;
- background: var(--google-grey-refresh-100);
- border-radius: 4px;
- display: flex;
- height: 136px;
- justify-content: center;
- margin-bottom: 8px;
+ .file:hover {
+ background-color: var(--ntp-hover-background-color);
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-end: var(--ntp-modules-drive-row-margin);
+ padding-inline-start: var(--ntp-modules-drive-row-margin);
+ }
+
+ .file:hover + .file {
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-end: var(--ntp-modules-drive-row-margin);
+ padding-inline-start: var(--ntp-modules-drive-row-margin);
}
.file-icon {
- max-height: 80px;
- width: 80px;
+ margin-inline-end: 8px;
+ }
+
+ .file-title {
+ flex-basis: 0;
+ flex-grow: 250;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
.file-description {
color: var(--cr-secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .file-info {
+ display: flex;
+ }
+
+ .justification-container {
+ align-items: center;
+ display: flex;
+ flex-basis: 0;
+ flex-grow: 186;
+ overflow: hidden;
+ }
+
+ .user-image {
+ border-radius: 50%;
+ margin-inline-end: 8px;
+ max-height: 30px;
}
</style>
<ntp-module-header
@@ -44,16 +84,26 @@
</ntp-module-header>
<div id="files">
<template id="fileRepeat" is="dom-repeat" items="[[files]]">
- <a class="file" href="[[getTargetUrl_(item)]]">
- <div class="file-icon-container">
- <img
- class="file-icon"
- draggable="false"
- src="[[getImageSrc_(item)]]">
- </img>
+ <a class="file" href="[[item.itemUrl.url]]" on-click="onFileClick_"
+ on-auxclick="onFileClick_">
+ <img
+ is="ntp-img"
+ class="file-icon"
+ draggable="false"
+ auto-src="[[getImageSrc_(item)]]">
+ </img>
+ <div class="file-title" title="[[item.title]]">[[item.title]]</div>
+ <div class="justification-container">
+ <template is="dom-if" if="[[item.untrustedPhotoUrl]]">
+ <img
+ is="ntp-img"
+ class="user-image"
+ draggable="false"
+ auto-src="[[item.untrustedPhotoUrl.url]]">
+ </img>
+ </template>
+ <div class="file-description">[[item.justificationText]]</div>
</div>
- <div class="file-title">[[item.title]]</div>
- <div class="file-description">[[item.justificationText]]</div>
</a>
</template>
</div>
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.js b/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.js
index 6599405e47b..07b52dee38b 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/drive/module.js
@@ -35,6 +35,12 @@ class DriveModuleElement extends mixinBehaviors
};
}
+ constructor() {
+ super();
+ /** @private {IntersectionObserver} */
+ this.intersectionObserver_ = null;
+ }
+
/** @private */
onDisableButtonClick_() {
this.dispatchEvent(new CustomEvent('disable-module', {
@@ -54,44 +60,18 @@ class DriveModuleElement extends mixinBehaviors
* @private
*/
getImageSrc_(file) {
- switch (file.type) {
- case (drive.mojom.FileType.kDoc):
- return 'modules/drive/icons/google_docs_logo.svg';
- case (drive.mojom.FileType.kSheet):
- return 'modules/drive/icons/google_sheets_logo.svg';
- case (drive.mojom.FileType.kSlide):
- return 'modules/drive/icons/google_slides_logo.svg';
- default:
- // TODO(crbug/1176982): Need to return an image
- // in the case we don't know the type of
- // drive item.
- return '';
- }
+ return 'https://drive-thirdparty.googleusercontent.com/16/type/' +
+ file.mimeType;
}
/**
- * @param {drive.mojom.File} file
- * @return {string}
+ * @param {!Event} e
* @private
*/
- getTargetUrl_(file) {
- const id = file.id;
- // TODO(crbug/1177439): Use URL from ItemSuggest to generate URL.
- switch (file.type) {
- case (drive.mojom.FileType.kDoc):
- return `https://docs.google.com/document/d/${id}/edit?usp=drive_web`;
- case (drive.mojom.FileType.kSlide):
- return `https://docs.google.com/presentation/d/${
- id}/edit?usp=drive_web`;
- case (drive.mojom.FileType.kSheet):
- return `https://docs.google.com/spreadsheets/d/${
- id}/edit?usp=drive_web`;
- default:
- // TODO(crbug/1177426): Generic drive link leads to preview of page,
- // will need to decide if this is appropriate or we want to navigate
- // directly to the page we want.
- return `https://drive.google.com/file/d/${id}/view?usp=drive_web`;
- }
+ onFileClick_(e) {
+ this.dispatchEvent(new Event('usage', {bubbles: true, composed: true}));
+ const index = this.$.fileRepeat.indexForElement(e.target);
+ chrome.metricsPrivate.recordSmallCount('NewTabPage.Drive.FileClick', index);
}
}
@@ -114,4 +94,4 @@ async function createDriveElement() {
export const driveDescriptor = new ModuleDescriptor(
/*id=*/ 'drive',
/*name=*/ loadTimeData.getString('modulesDriveSentence'),
- /*heightPx=*/ 260, createDriveElement);
+ createDriveElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/BUILD.gn
index d3be9cc937c..adec6ab2b82 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/BUILD.gn
@@ -17,10 +17,7 @@ js_library("module") {
}
js_library("foo_proxy") {
- deps = [
- "//chrome/browser/ui/webui/new_tab_page/foo:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
- ]
+ deps = [ "//chrome/browser/ui/webui/new_tab_page/foo:mojo_bindings_js_library_for_compile" ]
}
html_to_js("web_components") {
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/foo_proxy.js b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/foo_proxy.js
index b6d711f67c4..0bb2ebac48c 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/foo_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/foo_proxy.js
@@ -4,19 +4,28 @@
import '../../foo.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
/**
* @fileoverview This file provides a class that exposes the Mojo handler
* interface used for sending requests from NTP dummy module JS to the browser
* and receiving the browser response.
*/
+/** @type {FooProxy} */
+let instance = null;
+
export class FooProxy {
+ /** @return {!FooProxy} */
+ static getInstance() {
+ return instance || (instance = new FooProxy());
+ }
+
+ /** @param {FooProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!foo.mojom.FooHandlerRemote} */
this.handler = foo.mojom.FooHandler.getRemote();
}
}
-
-addSingletonGetter(FooProxy); \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/module.js b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/module.js
index e88404fe3aa..7841fad89fe 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/dummy/module.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/dummy/module.js
@@ -82,12 +82,10 @@ function createDummyElement(titleId) {
export const dummyDescriptor = new ModuleDescriptor(
/*id=*/ 'dummy',
/*name=*/ loadTimeData.getString('modulesDummyTitle'),
- /*heightPx=*/ 314,
() => Promise.resolve(createDummyElement('modulesDummyTitle')));
/** @type {!ModuleDescriptor} */
export const dummyDescriptor2 = new ModuleDescriptor(
/*id=*/ 'dummy2',
/*name=*/ loadTimeData.getString('modulesDummy2Title'),
- /*heightPx=*/ 314,
() => Promise.resolve(createDummyElement('modulesDummy2Title')));
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/module_descriptor.js b/chromium/chrome/browser/resources/new_tab_page/modules/module_descriptor.js
index 24f3e359e2e..cfe822a31b5 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/module_descriptor.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/module_descriptor.js
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {BrowserProxy} from '../browser_proxy.js';
-import {mojoTimeDelta} from '../utils.js';
+import {recordDuration, recordLoadDuration} from '../metrics_utils.js';
+import {WindowProxy} from '../window_proxy.js';
/**
* @fileoverview Provides the module descriptor. Each module must create a
@@ -19,16 +19,13 @@ export class ModuleDescriptor {
/**
* @param {string} id
* @param {string} name
- * @param {number} heightPx
* @param {!InitializeModuleCallback} initializeCallback
*/
- constructor(id, name, heightPx, initializeCallback) {
+ constructor(id, name, initializeCallback) {
/** @private {string} */
this.id_ = id;
/** @private {string} */
this.name_ = name;
- /** @private {number} */
- this.heightPx_ = heightPx;
/** @private {HTMLElement} */
this.element_ = null;
/** @private {!InitializeModuleCallback} */
@@ -45,11 +42,6 @@ export class ModuleDescriptor {
return this.name_;
}
- /** @return {number} */
- get heightPx() {
- return this.heightPx_;
- }
-
/** @return {?HTMLElement} */
get element() {
return this.element_;
@@ -63,10 +55,10 @@ export class ModuleDescriptor {
* @return {!Promise}
*/
async initialize(timeout) {
- const loadStartTime = BrowserProxy.getInstance().now();
+ const loadStartTime = WindowProxy.getInstance().now();
this.element_ = await Promise.race([
this.initializeCallback_(), new Promise(resolve => {
- BrowserProxy.getInstance().setTimeout(() => {
+ WindowProxy.getInstance().setTimeout(() => {
resolve(null);
}, timeout);
})
@@ -74,11 +66,11 @@ export class ModuleDescriptor {
if (!this.element_) {
return;
}
- if (this.element_.height !== undefined) {
- this.heightPx_ = this.element_.height;
- }
- const loadEndTime = BrowserProxy.getInstance().now();
- BrowserProxy.getInstance().handler.onModuleLoaded(
- this.id_, mojoTimeDelta(loadEndTime - loadStartTime), loadEndTime);
+ const loadEndTime = WindowProxy.getInstance().now();
+ const duration = loadEndTime - loadStartTime;
+ recordLoadDuration('NewTabPage.Modules.Loaded', loadEndTime);
+ recordLoadDuration(`NewTabPage.Modules.Loaded.${this.id_}`, loadEndTime);
+ recordDuration('NewTabPage.Modules.LoadDuration', duration);
+ recordDuration(`NewTabPage.Modules.LoadDuration.${this.id_}`, duration);
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/module_registry.js b/chromium/chrome/browser/resources/new_tab_page/modules/module_registry.js
index 3f41bdd28a4..bc4b9dc0bb4 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/module_registry.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/module_registry.js
@@ -2,8 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-import {BrowserProxy} from '../browser_proxy.js';
+import {NewTabPageProxy} from '../new_tab_page_proxy.js';
import {ModuleDescriptor} from './module_descriptor.js';
/**
@@ -11,7 +10,20 @@ import {ModuleDescriptor} from './module_descriptor.js';
* provides management function such as instantiating the local module UIs.
*/
+/** @type {ModuleRegistry} */
+let instance = null;
+
export class ModuleRegistry {
+ /** @return {!ModuleRegistry} */
+ static getInstance() {
+ return instance || (instance = new ModuleRegistry());
+ }
+
+ /** @param {ModuleRegistry} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @private {!Array<!ModuleDescriptor>} */
this.descriptors_ = [];
@@ -42,13 +54,13 @@ export class ModuleRegistry {
// Capture updateDisabledModules -> setDisabledModules round trip in a
// promise for convenience.
const disabledIds = await new Promise((resolve, _) => {
- const callbackRouter = BrowserProxy.getInstance().callbackRouter;
+ const callbackRouter = NewTabPageProxy.getInstance().callbackRouter;
const listenerId =
callbackRouter.setDisabledModules.addListener((all, ids) => {
callbackRouter.removeListener(listenerId);
resolve(all ? this.descriptors_.map(({id}) => id) : ids);
});
- BrowserProxy.getInstance().handler.updateDisabledModules();
+ NewTabPageProxy.getInstance().handler.updateDisabledModules();
});
await Promise.all(
this.descriptors_.filter(d => disabledIds.indexOf(d.id) < 0)
@@ -56,5 +68,3 @@ export class ModuleRegistry {
return this.descriptors_.filter(descriptor => !!descriptor.element);
}
}
-
-addSingletonGetter(ModuleRegistry);
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/module_wrapper.js b/chromium/chrome/browser/resources/new_tab_page/modules/module_wrapper.js
index c03d2c91509..8de30daaaca 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/module_wrapper.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/module_wrapper.js
@@ -5,7 +5,9 @@
import {assert} from 'chrome://resources/js/assert.m.js';
import {html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from '../browser_proxy.js';
+import {recordLoadDuration, recordOccurence, recordPerdecage} from '../metrics_utils.js';
+import {WindowProxy} from '../window_proxy.js';
+
import {ModuleDescriptor} from './module_descriptor.js';
/** @fileoverview Element that implements the common module UI. */
@@ -37,20 +39,23 @@ class ModuleWrapperElement extends PolymerElement {
onDescriptorChange_(newValue, oldValue) {
assert(!oldValue);
this.$.moduleElement.appendChild(this.descriptor.element);
- this.$.moduleElement.style.height = `${this.descriptor.heightPx}px`;
// Log at most one usage per module per NTP page load. This is possible,
// if a user opens a link in a new tab.
this.descriptor.element.addEventListener('usage', () => {
- BrowserProxy.getInstance().handler.onModuleUsage(this.descriptor.id);
+ recordOccurence('NewTabPage.Modules.Usage');
+ recordOccurence(`NewTabPage.Modules.Usage.${this.descriptor.id}`);
}, {once: true});
// Install observer to log module header impression.
const headerObserver = new IntersectionObserver(([{intersectionRatio}]) => {
if (intersectionRatio >= 1.0) {
headerObserver.disconnect();
- BrowserProxy.getInstance().handler.onModuleImpression(
- this.descriptor.id, BrowserProxy.getInstance().now());
+ const time = WindowProxy.getInstance().now();
+ recordLoadDuration('NewTabPage.Modules.Impression', time);
+ recordLoadDuration(
+ `NewTabPage.Modules.Impression.${this.descriptor.id}`, time);
+ this.dispatchEvent(new Event('detect-impression'));
}
}, {threshold: 1.0});
@@ -62,17 +67,6 @@ class ModuleWrapperElement extends PolymerElement {
Math.floor(Math.max(intersectionPerdecage, intersectionRatio * 10));
}, {threshold: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]});
window.addEventListener('unload', () => {
- const recordPerdecage = (metricName, value) => {
- chrome.metricsPrivate.recordValue(
- {
- metricName,
- type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
- min: 1, // Choose 1 if real min is 0.
- max: 11, // Exclusive.
- buckets: 12, // Numbers 0-10 and unused overflow bucket of 11.
- },
- value);
- };
recordPerdecage(
'NewTabPage.Modules.ImpressionRatio', intersectionPerdecage);
recordPerdecage(
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/BUILD.gn
index aa9ef979f29..f517a61996a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/BUILD.gn
@@ -20,7 +20,6 @@ js_library("module") {
js_library("task_module_handler_proxy") {
deps = [
"//chrome/browser/search/task_module:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
]
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.html b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.html
index 2a804a4f992..2293d89abe2 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.html
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.html
@@ -10,6 +10,7 @@
box-sizing: border-box;
display: block;
flex-grow: 1;
+ padding-bottom: 15px;
padding-inline-end: 15px;
padding-inline-start: 15px;
width: 100%;
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.js b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.js
index a44461aff4e..4e54996b481 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/module.js
@@ -234,12 +234,10 @@ async function createModule(taskModuleType) {
export const recipeTasksDescriptor = new ModuleDescriptor(
/*id=*/ 'recipe_tasks',
/*name=*/ loadTimeData.getString('modulesRecipeTasksSentence'),
- /*heightPx=*/ 300,
createModule.bind(null, taskModule.mojom.TaskModuleType.kRecipe));
/** @type {!ModuleDescriptor} */
export const shoppingTasksDescriptor = new ModuleDescriptor(
/*id=*/ 'shopping_tasks',
/*name=*/ loadTimeData.getString('modulesShoppingTasksSentence'),
- /*heightPx=*/ 324,
createModule.bind(null, taskModule.mojom.TaskModuleType.kShopping));
diff --git a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/task_module_handler_proxy.js b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/task_module_handler_proxy.js
index 2b45ab66d53..7f8c1dd247d 100644
--- a/chromium/chrome/browser/resources/new_tab_page/modules/task_module/task_module_handler_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/modules/task_module/task_module_handler_proxy.js
@@ -4,18 +4,27 @@
import './task_module.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
/**
* @fileoverview This file provides a class that exposes the Mojo handler
* interface used for retrieving a shopping task for a task module.
*/
+/** @type {TaskModuleHandlerProxy} */
+let instance = null;
+
export class TaskModuleHandlerProxy {
+ /** @return {!TaskModuleHandlerProxy} */
+ static getInstance() {
+ return instance || (instance = new TaskModuleHandlerProxy());
+ }
+
+ /** @param {TaskModuleHandlerProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!taskModule.mojom.TaskModuleHandlerRemote} */
this.handler = taskModule.mojom.TaskModuleHandler.getRemote();
}
}
-
-addSingletonGetter(TaskModuleHandlerProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/most_visited.js b/chromium/chrome/browser/resources/new_tab_page/most_visited.js
index b716bcb2d68..7a318539e3b 100644
--- a/chromium/chrome/browser/resources/new_tab_page/most_visited.js
+++ b/chromium/chrome/browser/resources/new_tab_page/most_visited.js
@@ -21,7 +21,8 @@ import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {Debouncer, html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
+import {WindowProxy} from './window_proxy.js';
/**
* @enum {number}
@@ -227,7 +228,7 @@ class MostVisitedElement extends PolymerElement {
super();
/** @private {boolean} */
this.adding_ = false;
- const {callbackRouter, handler} = BrowserProxy.getInstance();
+ const {callbackRouter, handler} = NewTabPageProxy.getInstance();
/** @private {!newTabPage.mojom.PageCallbackRouter} */
this.callbackRouter_ = callbackRouter;
/** @private {newTabPage.mojom.PageHandlerRemote} */
@@ -294,12 +295,13 @@ class MostVisitedElement extends PolymerElement {
/** @private {!Function} */
this.boundOnWidthChange_ = this.updateScreenWidth_.bind(this);
- const {matchMedia} = BrowserProxy.getInstance();
/** @private {!MediaQueryList} */
- this.mediaListenerWideWidth_ = matchMedia('(min-width: 672px)');
+ this.mediaListenerWideWidth_ =
+ WindowProxy.getInstance().matchMedia('(min-width: 672px)');
this.mediaListenerWideWidth_.addListener(this.boundOnWidthChange_);
/** @private {!MediaQueryList} */
- this.mediaListenerMediumWidth_ = matchMedia('(min-width: 560px)');
+ this.mediaListenerMediumWidth_ =
+ WindowProxy.getInstance().matchMedia('(min-width: 560px)');
this.mediaListenerMediumWidth_.addListener(this.boundOnWidthChange_);
this.updateScreenWidth_();
/** @private {!function(Event)} */
@@ -628,6 +630,7 @@ class MostVisitedElement extends PolymerElement {
/** @private */
onDialogClose_() {
+ this.dialogTileUrl_ = '';
if (this.adding_) {
this.$.addShortcut.focus();
}
@@ -918,7 +921,7 @@ class MostVisitedElement extends PolymerElement {
performance.measure('most-visited-rendered');
this.pageHandler_.onMostVisitedTilesRendered(
this.tiles_.slice(0, assert(this.maxVisibleTiles_)),
- BrowserProxy.getInstance().now());
+ WindowProxy.getInstance().now());
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js
index 98fa96e07da..38b3a50b5f7 100644
--- a/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js
@@ -13,9 +13,9 @@
import './app.js';
export {BackgroundManager} from './background_manager.js';
-export {BrowserProxy} from './browser_proxy.js';
export {BackgroundSelectionType, CustomizeDialogPage} from './customize_dialog_types.js';
export {ImgElement} from './img.js';
+export {recordDuration, recordLoadDuration, recordOccurence, recordPerdecage} from './metrics_utils.js';
export {ChromeCartProxy} from './modules/cart/chrome_cart_proxy.js';
export {chromeCartDescriptor} from './modules/cart/module.js';
export {DriveProxy} from './modules/drive/drive_module_proxy.js';
@@ -29,6 +29,8 @@ export {ModuleHeaderElement} from './modules/module_header.js';
export {ModuleRegistry} from './modules/module_registry.js';
export {recipeTasksDescriptor, shoppingTasksDescriptor} from './modules/task_module/module.js';
export {TaskModuleHandlerProxy} from './modules/task_module/task_module_handler_proxy.js';
+export {NewTabPageProxy} from './new_tab_page_proxy.js';
export {PromoBrowserCommandProxy} from './promo_browser_command_proxy.js';
export {RealboxBrowserProxy} from './realbox/realbox_browser_proxy.js';
export {$$, createScrollBorders, decodeString16, mojoString16} from './utils.js';
+export {WindowProxy} from './window_proxy.js';
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page_proxy.js b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_proxy.js
new file mode 100644
index 00000000000..174d1e63d73
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_proxy.js
@@ -0,0 +1,53 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TODO(crbug.com/1179821): Migrate to JS module Mojo bindings.
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
+import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
+
+import './realbox/omnibox.mojom-lite.js';
+import './realbox/realbox.mojom-lite.js';
+import './new_tab_page.mojom-lite.js';
+
+/** @type {?NewTabPageProxy} */
+let instance = null;
+
+/** Holds Mojo interfaces for communication with the browser process. */
+export class NewTabPageProxy {
+ /** @return {!NewTabPageProxy} */
+ static getInstance() {
+ if (!instance) {
+ const handler = new newTabPage.mojom.PageHandlerRemote();
+ const callbackRouter = new newTabPage.mojom.PageCallbackRouter();
+ newTabPage.mojom.PageHandlerFactory.getRemote().createPageHandler(
+ callbackRouter.$.bindNewPipeAndPassRemote(),
+ handler.$.bindNewPipeAndPassReceiver());
+ instance = new NewTabPageProxy(handler, callbackRouter);
+ }
+ return instance;
+ }
+
+ /**
+ * @param {!newTabPage.mojom.PageHandlerRemote} handler
+ * @param {!newTabPage.mojom.PageCallbackRouter} callbackRouter
+ */
+ static setInstance(handler, callbackRouter) {
+ instance = new NewTabPageProxy(handler, callbackRouter);
+ }
+
+ /**
+ * @param {!newTabPage.mojom.PageHandlerRemote} handler
+ * @param {!newTabPage.mojom.PageCallbackRouter} callbackRouter
+ * @private
+ */
+ constructor(handler, callbackRouter) {
+ this.handler = handler;
+ this.callbackRouter = callbackRouter;
+ }
+}
diff --git a/chromium/chrome/browser/resources/new_tab_page/promo_browser_command_proxy.js b/chromium/chrome/browser/resources/new_tab_page/promo_browser_command_proxy.js
index 2abad05a86c..7f55460d4b0 100644
--- a/chromium/chrome/browser/resources/new_tab_page/promo_browser_command_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/promo_browser_command_proxy.js
@@ -4,19 +4,28 @@
import './promo_browser_command.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
/**
* @fileoverview This file provides a class that exposes the Mojo handler
* interface used for sending the NTP promos browser commands to the browser and
* receiving the browser response.
*/
+/** @type {PromoBrowserCommandProxy} */
+let instance = null;
+
export class PromoBrowserCommandProxy {
+ /** @return {!PromoBrowserCommandProxy} */
+ static getInstance() {
+ return instance || (instance = new PromoBrowserCommandProxy());
+ }
+
+ /** @param {PromoBrowserCommandProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!promoBrowserCommand.mojom.CommandHandlerRemote} */
this.handler = promoBrowserCommand.mojom.CommandHandler.getRemote();
}
}
-
-addSingletonGetter(PromoBrowserCommandProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/realbox/BUILD.gn
index d9c9c8b343b..93a8fefb4d8 100644
--- a/chromium/chrome/browser/resources/new_tab_page/realbox/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox/BUILD.gn
@@ -24,7 +24,6 @@ js_library("realbox") {
js_library("realbox_browser_proxy") {
deps = [
"//chrome/browser/ui/webui/realbox:mojo_bindings_js_library_for_compile",
- "//ui/webui/resources/js:cr.m",
]
}
@@ -80,9 +79,7 @@ preprocess_if_expr("preprocess") {
in_folder = "./"
out_folder = "$target_gen_dir/$preprocess_folder"
out_manifest = "$target_gen_dir/$preprocess_manifest"
- in_files = [
- "realbox_browser_proxy.js",
- ]
+ in_files = [ "realbox_browser_proxy.js" ]
}
preprocess_if_expr("preprocess_gen") {
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_browser_proxy.js b/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_browser_proxy.js
index e9e23d7cf19..ee250f8d2de 100644
--- a/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_browser_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_browser_proxy.js
@@ -2,9 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import './realbox.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
+import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+import './omnibox.mojom-lite.js';
+import './realbox.mojom-lite.js';
/**
* @fileoverview This file provides a singleton class that exposes the Mojo
@@ -12,16 +18,27 @@ import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
* realbox JS and the browser.
*/
+/** @type {RealboxBrowserProxy} */
+let instance = null;
+
export class RealboxBrowserProxy {
+ /** @return {!RealboxBrowserProxy} */
+ static getInstance() {
+ return instance || (instance = new RealboxBrowserProxy());
+ }
+
+ /** @param {RealboxBrowserProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
+ }
+
constructor() {
/** @type {!realbox.mojom.PageHandlerRemote} */
this.handler = realbox.mojom.PageHandler.getRemote();
- /** @type {realbox.mojom.PageCallbackRouter} */
+ /** @type {!realbox.mojom.PageCallbackRouter} */
this.callbackRouter = new realbox.mojom.PageCallbackRouter();
this.handler.setPage(this.callbackRouter.$.bindNewPipeAndPassRemote());
}
}
-
-addSingletonGetter(RealboxBrowserProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_match.html b/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_match.html
index bb822ad97e1..4dd4fa5cb16 100644
--- a/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_match.html
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox/realbox_match.html
@@ -71,7 +71,9 @@
}
#remove {
+ --cr-icon-button-active-background-color: rgba(var(--google-grey-900-rgb), .16);
--cr-icon-button-fill-color: var(--search-box-icon, var(--google-grey-refresh-700));
+ --cr-icon-button-hover-background-color: rgba(var(--google-grey-900-rgb), .1);
--cr-icon-button-icon-size: 16px;
--cr-icon-button-margin-end: 0;
--cr-icon-button-margin-start: 0;
diff --git a/chromium/chrome/browser/resources/new_tab_page/utils.js b/chromium/chrome/browser/resources/new_tab_page/utils.js
index 72e8a89d3af..da4bc1d82ca 100644
--- a/chromium/chrome/browser/resources/new_tab_page/utils.js
+++ b/chromium/chrome/browser/resources/new_tab_page/utils.js
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {assert} from 'chrome://resources/js/assert.m.js';
+
/**
* Given a |container| that has scrollable content, <div>'s before and after the
* |container| are created with an attribute "scroll-border". These <div>'s are
@@ -78,3 +80,19 @@ export function mojoTimeDelta(timeDelta) {
export function $$(element, selector) {
return element.shadowRoot.querySelector(selector);
}
+
+/**
+ * Queries |selector| on |root| and returns the resulting element. Throws
+ * exception if there is no resulting element or if element is not of type
+ * |type|.
+ * @param {!Element|!ShadowRoot} root
+ * @param {string} selector
+ * @param {!function(new:T)} type
+ * @return {!T}
+ * @template T
+ */
+export function strictQuery(root, selector, type) {
+ const element = root.querySelector(selector);
+ assert(element && element instanceof type);
+ return element;
+}
diff --git a/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.js b/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.js
index bc7a0c06658..ade60f3d2be 100644
--- a/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.js
+++ b/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.js
@@ -9,7 +9,9 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {BrowserProxy} from './browser_proxy.js';
+
+import {NewTabPageProxy} from './new_tab_page_proxy.js';
+import {WindowProxy} from './window_proxy.js';
/**
* Threshold for considering an interim speech transcript result as "confident
@@ -195,7 +197,7 @@ class VoiceSearchOverlayElement extends PolymerElement {
constructor() {
super();
/** @private {newTabPage.mojom.PageHandlerRemote} */
- this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_ = NewTabPageProxy.getInstance().handler;
/** @private {webkitSpeechRecognition} */
this.voiceRecognition_ = new webkitSpeechRecognition();
this.voiceRecognition_.continuous = false;
@@ -211,8 +213,8 @@ class VoiceSearchOverlayElement extends PolymerElement {
this.voiceRecognition_.onnomatch = () => {
this.onError_(Error.kNoMatch);
};
- /** @private {number|undefined} */
- this.timerId_ = undefined;
+ /** @private {?number} */
+ this.timerId_ = null;
}
/** @override */
@@ -307,8 +309,8 @@ class VoiceSearchOverlayElement extends PolymerElement {
/** @private */
resetIdleTimer_() {
- BrowserProxy.getInstance().clearTimeout(this.timerId_);
- this.timerId_ = BrowserProxy.getInstance().setTimeout(
+ WindowProxy.getInstance().clearTimeout(this.timerId_);
+ this.timerId_ = WindowProxy.getInstance().setTimeout(
this.onIdleTimeout_.bind(this), IDLE_TIMEOUT_MS);
}
@@ -332,8 +334,8 @@ class VoiceSearchOverlayElement extends PolymerElement {
* @private
*/
resetErrorTimer_(duration) {
- BrowserProxy.getInstance().clearTimeout(this.timerId_);
- this.timerId_ = BrowserProxy.getInstance().setTimeout(() => {
+ WindowProxy.getInstance().clearTimeout(this.timerId_);
+ this.timerId_ = WindowProxy.getInstance().setTimeout(() => {
this.$.dialog.close();
}, duration);
}
@@ -426,7 +428,7 @@ class VoiceSearchOverlayElement extends PolymerElement {
queryUrl.search = searchParams.toString();
this.pageHandler_.onVoiceSearchAction(
newTabPage.mojom.VoiceSearchAction.kQuerySubmitted);
- BrowserProxy.getInstance().navigate(queryUrl.href);
+ WindowProxy.getInstance().navigate(queryUrl.href);
}
/** @private */
@@ -474,12 +476,12 @@ class VoiceSearchOverlayElement extends PolymerElement {
this.state_ !== State.RESULT_RECEIVED) {
return;
}
- this.micVolumeLevel_ = BrowserProxy.getInstance().random();
+ this.micVolumeLevel_ = WindowProxy.getInstance().random();
this.micVolumeDuration_ = Math.round(
VOLUME_ANIMATION_DURATION_MIN_MS +
- BrowserProxy.getInstance().random() *
+ WindowProxy.getInstance().random() *
VOLUME_ANIMATION_DURATION_RANGE_MS);
- BrowserProxy.getInstance().setTimeout(
+ WindowProxy.getInstance().setTimeout(
this.animateVolume_.bind(this), this.micVolumeDuration_);
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js b/chromium/chrome/browser/resources/new_tab_page/window_proxy.js
index 5449caae556..2de767dca3c 100644
--- a/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/window_proxy.js
@@ -1,33 +1,20 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
-import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
-import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
+/** @type {?WindowProxy} */
+let instance = null;
-import './realbox/omnibox.mojom-lite.js';
-import './realbox/realbox.mojom-lite.js';
-import './new_tab_page.mojom-lite.js';
-
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-
-export class BrowserProxy {
- constructor() {
- /** @type {newTabPage.mojom.PageCallbackRouter} */
- this.callbackRouter = new newTabPage.mojom.PageCallbackRouter();
-
- /** @type {newTabPage.mojom.PageHandlerRemote} */
- this.handler = new newTabPage.mojom.PageHandlerRemote();
+/** Abstracts some builtin JS functions to mock them in tests. */
+export class WindowProxy {
+ /** @return {!WindowProxy} */
+ static getInstance() {
+ return instance || (instance = new WindowProxy());
+ }
- const factory = newTabPage.mojom.PageHandlerFactory.getRemote();
- factory.createPageHandler(
- this.callbackRouter.$.bindNewPipeAndPassRemote(),
- this.handler.$.bindNewPipeAndPassReceiver());
+ /** @param {?WindowProxy} newInstance */
+ static setInstance(newInstance) {
+ instance = newInstance;
}
/** @param {string} href */
@@ -49,7 +36,7 @@ export class BrowserProxy {
return window.setTimeout(callback, duration);
}
- /** @param {number} id */
+ /** @param {?number} id */
clearTimeout(id) {
window.clearTimeout(id);
}
@@ -100,5 +87,3 @@ export class BrowserProxy {
iframe.contentWindow.postMessage(message, targetOrigin);
}
}
-
-addSingletonGetter(BrowserProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/.eslintrc.js b/chromium/chrome/browser/resources/new_tab_page_third_party/.eslintrc.js
new file mode 100644
index 00000000000..52e5ab65cc6
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/.eslintrc.js
@@ -0,0 +1,11 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module.exports = {
+ 'env': {
+ 'browser': true,
+ 'es6': true,
+ },
+ 'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]},
+};
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
new file mode 100644
index 00000000000..ff03136a97a
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
@@ -0,0 +1,121 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/common/features.gni")
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_js.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ closure_flags = default_closure_args + mojom_js_args
+ deps = [ ":new_tab_page_third_party" ]
+}
+
+js_library("new_tab_page_third_party") {
+ deps = [
+ ":browser_proxy",
+ ":most_visited",
+ ]
+}
+
+js_library("browser_proxy") {
+ deps = [
+ "//chrome/browser/ui/webui/new_tab_page_third_party:mojo_bindings_js_library_for_compile",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:cr.m",
+ ]
+}
+
+js_library("most_visited") {
+ deps = [
+ ":browser_proxy",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/cr_elements/cr_toast:cr_toast.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js/cr/ui:focus_outline_manager.m",
+ ]
+}
+
+html_to_js("web_components_local") {
+ js_files = [ "most_visited.js" ]
+}
+
+group("web_components") {
+ public_deps = [ ":web_components_local" ]
+}
+
+grd_prefix = "new_tab_page_third_party"
+preprocess_folder = "preprocessed"
+preprocess_manifest = "preprocessed_manifest.json"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+
+preprocess_if_expr("preprocess") {
+ in_folder = "./"
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_manifest"
+ in_files = [
+ "browser_proxy.js",
+ "new_tab_page_third_party.js",
+ ]
+}
+
+preprocess_if_expr("preprocess_gen") {
+ deps = [ ":web_components" ]
+ in_folder = target_gen_dir
+ out_folder = "$target_gen_dir/$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [ "most_visited.js" ]
+}
+
+generate_grd("build_new_tab_page_third_party_mojo_grdp") {
+ grd_prefix = grd_prefix
+ out_grd = "$target_gen_dir/new_tab_page_third_party_mojo_resources.grdp"
+ input_files = [ "new_tab_page_third_party.mojom-lite.js" ]
+ input_files_base_dir =
+ rebase_path(
+ "$root_gen_dir/chrome/browser/ui/webui/new_tab_page_third_party",
+ root_build_dir)
+}
+
+generate_grd("build_grd") {
+ grd_prefix = grd_prefix
+ out_grd = "$target_gen_dir/resources.grd"
+ input_files = [ "new_tab_page_third_party.html" ]
+ input_files_base_dir = rebase_path(".", "//")
+ grdp_files =
+ [ "$target_gen_dir/new_tab_page_third_party_mojo_resources.grdp" ]
+ deps = [
+ ":build_new_tab_page_third_party_mojo_grdp",
+ ":preprocess",
+ ":preprocess_gen",
+ ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_manifest",
+ "$target_gen_dir/$preprocess_gen_manifest",
+ ]
+}
+
+grit("resources") {
+ defines = chrome_grit_defines
+ enable_input_discovery_for_gn_analyze = false
+ source = "$target_gen_dir/resources.grd"
+ deps = [
+ ":build_grd",
+ "//chrome/browser/ui/webui/new_tab_page_third_party:mojo_bindings_js",
+ ]
+ outputs = [
+ "grit/new_tab_page_third_party_resources.h",
+ "grit/new_tab_page_third_party_resources_map.cc",
+ "grit/new_tab_page_third_party_resources_map.h",
+ "new_tab_page_third_party_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/OWNERS b/chromium/chrome/browser/resources/new_tab_page_third_party/OWNERS
new file mode 100644
index 00000000000..834fda6a253
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/OWNERS
@@ -0,0 +1,3 @@
+aee@chromium.org
+mahmadi@chromium.org
+tiborg@chromium.org
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/browser_proxy.js b/chromium/chrome/browser/resources/new_tab_page_third_party/browser_proxy.js
new file mode 100644
index 00000000000..f6a9b38be18
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/browser_proxy.js
@@ -0,0 +1,43 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
+import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
+
+import './new_tab_page_third_party.mojom-lite.js';
+
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+
+export class BrowserProxy {
+ constructor() {
+ /** @type {newTabPageThirdParty.mojom.PageCallbackRouter} */
+ this.callbackRouter = new newTabPageThirdParty.mojom.PageCallbackRouter();
+
+ /** @type {newTabPageThirdParty.mojom.PageHandlerRemote} */
+ this.handler = new newTabPageThirdParty.mojom.PageHandlerRemote();
+
+ const factory = newTabPageThirdParty.mojom.PageHandlerFactory.getRemote();
+ factory.createPageHandler(
+ this.callbackRouter.$.bindNewPipeAndPassRemote(),
+ this.handler.$.bindNewPipeAndPassReceiver());
+ }
+
+ /**
+ * @param {string} query
+ * @return {!MediaQueryList}
+ */
+ matchMedia(query) {
+ return window.matchMedia(query);
+ }
+
+ /** @return {number} */
+ now() {
+ return Date.now();
+ }
+}
+
+addSingletonGetter(BrowserProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.html b/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.html
new file mode 100644
index 00000000000..87f129e49ac
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.html
@@ -0,0 +1,216 @@
+<style include="cr-hidden-style cr-icons">
+ :host {
+ --icon-button-color-active: var(--google-grey-refresh-700);
+ --icon-button-color: var(--google-grey-600);
+ --icon-size: 48px;
+ --tile-hover-color: rgba(var(--google-grey-900-rgb), .1);
+ --tile-size: 112px;
+ --title-height: 32px;
+ --ntp-focus-shadow-color: rgba(var(--google-blue-600-rgb), .4);
+ --ntp-focus-shadow: 0 0 0 2px var(--ntp-focus-shadow-color);
+ }
+
+ :host([show-background-image_]) {
+ --ntp-theme-text-shadow: 0 0 16px rgba(0, 0, 0, .3);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ :host {
+ --ntp-focus-shadow-color: rgba(var(--google-blue-refresh-300-rgb), .5);
+ }
+ }
+
+
+ #container {
+ --content-width: calc(var(--column-count) * var(--tile-size)
+ /* We add an extra pixel because rounding errors on different zooms can
+ * make the width shorter than it should be. */
+ + 1px);
+ display: flex;
+ flex-wrap: wrap;
+ height: calc(var(--row-count) * var(--tile-size));
+ justify-content: center;
+ margin-bottom: 8px;
+ overflow: hidden;
+ padding: 2px; /* Padding added so focus rings are not clipped. */
+ transition: opacity 300ms ease-in-out;
+ width: calc(var(--content-width) + 12px);
+ }
+
+ .query-tile-icon {
+ -webkit-mask-image: url(chrome://resources/images/icon_search.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background-color: var(--google-grey-700);
+ height: 24px;
+ width: 24px;
+ }
+
+ :host([use-white-tile-icon_]) .query-tile-icon {
+ background-color: var(--google-grey-400);
+ }
+
+ .tile {
+ -webkit-tap-highlight-color: transparent;
+ align-items: center;
+ border-radius: 4px;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: flex;
+ flex-direction: column;
+ height: var(--tile-size);
+ opacity: 1;
+ outline: none;
+ position: relative;
+ text-decoration: none;
+ transition-duration: 300ms;
+ transition-property: left, top;
+ transition-timing-function: ease-in-out;
+ user-select: none;
+ width: var(--tile-size);
+ }
+
+ .tile:hover {
+ background-color: var(--tile-hover-color);
+ }
+
+ :host-context(.focus-outline-visible) .tile:focus {
+ box-shadow: var(--ntp-focus-shadow);
+ }
+
+ .tile-icon {
+ align-items: center;
+ background-color: var(--ntp-theme-shortcut-background-color);
+ border-radius: 50%;
+ display: flex;
+ flex-shrink: 0;
+ height: var(--icon-size);
+ justify-content: center;
+ margin-top: 16px;
+ width: var(--icon-size);
+ }
+
+ .tile-icon img {
+ height: 24px;
+ width: 24px;
+ }
+
+ .tile-title {
+ align-items: center;
+ border-radius: 12px;
+ color: var(--ntp-theme-text-color);
+ display: flex;
+ height: var(--title-height);
+ line-height: calc(var(--title-height) / 2);
+ margin-top: 6px;
+ padding: 2px 8px;
+ width: 88px;
+ }
+
+ :host([use-title-pill_]) .tile-title {
+ background-color: white;
+ color: var(--google-grey-800);
+ }
+
+ .tile-title span {
+ font-weight: 400;
+ overflow: hidden;
+ text-align: center;
+ text-overflow: ellipsis;
+ text-shadow: var(--ntp-theme-text-shadow);
+ white-space: nowrap;
+ width: 100%;
+ }
+
+ .tile[query-tile] .tile-title span {
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ display: -webkit-box;
+ white-space: initial;
+ }
+
+ :host([use-title-pill_]) .tile-title span {
+ text-shadow: none;
+ }
+
+ .title-rtl {
+ direction: rtl;
+ }
+
+ .title-ltr {
+ direction: ltr;
+ }
+
+ cr-icon-button {
+ --cr-icon-button-fill-color: var(--icon-button-color);
+ --cr-icon-button-size: 28px;
+ --cr-icon-button-transition: none;
+ margin: 4px 2px;
+ opacity: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ transition: opacity 100ms ease-in-out;
+ }
+
+ :host-context([dir=rtl]) cr-icon-button {
+ left: 0;
+ right: unset;
+ }
+
+ .tile:hover cr-icon-button {
+ opacity: 1;
+ transition-delay: 400ms;
+ }
+
+ cr-icon-button:active,
+ :host-context(.focus-outline-visible) cr-icon-button:focus,
+ cr-icon-button:hover {
+ --cr-icon-button-fill-color: var(--icon-button-color-active);
+ opacity: 1;
+ transition-delay: 0s;
+ }
+</style>
+<div id="container"
+ style="--ntp-theme-text-color: [[rgbaOrInherit_(theme_.shortcutTextColor)]];
+ --ntp-theme-shortcut-background-color:
+ [[rgbaOrInherit_(theme_.shortcutBackgroundColor)]];
+ --column-count: [[columnCount_]]; --row-count: [[rowCount_]];">
+ <dom-repeat id="tiles" items="[[tiles_]]" on-dom-change="onTilesRendered_">
+ <template>
+ <a class="tile" href$="[[item.url.url]]" title$="[[item.title]]"
+ hidden$="[[isHidden_(index, maxVisibleTiles_)]]"
+ on-click="onTileClick_" on-keydown="onTileKeyDown_"
+ query-tile$="[[item.isQueryTile]]">
+ <cr-icon-button id="removeButton" class="icon-clear"
+ title="$i18n{linkRemove}" on-click="onTileRemoveButtonClick_"
+ tabindex="0" hidden$="[[customLinksEnabled_]]"></cr-icon-button>
+ <div class="tile-icon">
+ <img src$="[[getFaviconUrl_(item.url)]]" draggable="false"
+ hidden$="[[item.isQueryTile]]"></img>
+ <div class="query-tile-icon" draggable="false"
+ hidden$="[[!item.isQueryTile]]"></div>
+ </div>
+ <div class$="tile-title [[getTileTitleDirectionClass_(item)]]">
+ <span>[[item.title]]</span>
+ </div>
+ </a>
+ </template>
+ </dom-repeat>
+</div>
+<cr-toast id="toast" duration="10000">
+ <div>$i18n{linkRemovedMsg}</div>
+ <dom-if if="[[showToastButtons_]]">
+ <template>
+ <cr-button id="undo" aria-label="$i18n{undoDescription}"
+ on-click="onUndoClick_">
+ $i18n{undo}
+ </cr-button>
+ <cr-button id="restore"
+ aria-label="$i18n{restoreThumbnailsShort}"
+ on-click="onRestoreDefaultsClick_">
+ $i18n{restoreThumbnailsShort}
+ </cr-button>
+ </template>
+ </dom-if>
+</cr-toast>
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.js b/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.js
new file mode 100644
index 00000000000..f2d2ae3b8e2
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/most_visited.js
@@ -0,0 +1,404 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import 'chrome://resources/cr_elements/cr_icons_css.m.js';
+import 'chrome://resources/cr_elements/cr_toast/cr_toast.m.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
+import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
+import './strings.m.js';
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {skColorToRgba} from 'chrome://resources/js/color_utils.js';
+import {isMac} from 'chrome://resources/js/cr.m.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
+import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+
+/**
+ * @enum {number}
+ * @const
+ */
+const ScreenWidth = {
+ NARROW: 0,
+ MEDIUM: 1,
+ WIDE: 2,
+};
+
+class MostVisitedElement extends PolymerElement {
+ static get is() {
+ return 'ntp3p-most-visited';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ /**
+ * When the tile icon background is dark, the add icon color is white for
+ * contrast. This can be used to determine the color of the tile hover as
+ * well.
+ */
+ useWhiteTileIcon_: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+
+ /* If true wraps the tile titles in white pills. */
+ useTitlePill_: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+
+ /** @private */
+ columnCount_: {
+ type: Number,
+ computed: `computeColumnCount_(tiles_, screenWidth_)`,
+ },
+
+ /** @private */
+ rowCount_: {
+ type: Number,
+ computed: 'computeRowCount_(columnCount_, tiles_)',
+ },
+
+ /** @private */
+ maxVisibleTiles_: {
+ type: Number,
+ computed: 'computeMaxVisibleTiles_(columnCount_, rowCount_)',
+ },
+
+ /** @private */
+ showToastButtons_: Boolean,
+
+ /** @private {!ScreenWidth} */
+ screenWidth_: Number,
+
+ /** @private {!Array<!newTabPageThirdParty.mojom.MostVisitedTile>} */
+ tiles_: Array,
+
+ /** @private {!newTabPageThirdParty.mojom.Theme} */
+ theme_: Object,
+ };
+ }
+
+ /** @private {!Array<!HTMLElement>} */
+ get tileElements_() {
+ return /** @type {!Array<!HTMLElement>} */ (
+ Array.from(this.shadowRoot.querySelectorAll('.tile:not([hidden])')));
+ }
+
+ constructor() {
+ performance.mark('most-visited-creation-start');
+ super();
+ const {callbackRouter, handler} = BrowserProxy.getInstance();
+ /** @private {!newTabPageThirdParty.mojom.PageCallbackRouter} */
+ this.callbackRouter_ = callbackRouter;
+ /** @private {newTabPageThirdParty.mojom.PageHandlerRemote} */
+ this.pageHandler_ = handler;
+ /** @private {?number} */
+ this.setMostVisitedTilesListenerId_ = null;
+ /** @private {?number} */
+ this.setThemeListenerId_ = null;
+ }
+
+ /** @override */
+ connectedCallback() {
+ super.connectedCallback();
+ /** @private {boolean} */
+ this.isRtl_ = window.getComputedStyle(this)['direction'] === 'rtl';
+ /** @private {!EventTracker} */
+ this.eventTracker_ = new EventTracker();
+
+ this.setThemeListenerId_ =
+ this.callbackRouter_.setTheme.addListener(theme => {
+ this.useWhiteTileIcon_ = theme.shortcutUseWhiteTileIcon;
+ this.useTitlePill_ = theme.shortcutUseTitlePill;
+ this.theme_ = theme;
+ });
+ this.setMostVisitedTilesListenerId_ =
+ this.callbackRouter_.setMostVisitedTiles.addListener(tiles => {
+ performance.measure('most-visited-mojo', 'most-visited-mojo-start');
+ this.tiles_ = tiles.slice(0, 8);
+ });
+ performance.mark('most-visited-mojo-start');
+ this.eventTracker_.add(document, 'visibilitychange', () => {
+ // This updates the most visited tiles every time the NTP tab gets
+ // activated.
+ if (document.visibilityState === 'visible') {
+ this.pageHandler_.updateTheme();
+ this.pageHandler_.updateMostVisitedTiles();
+ }
+ });
+ this.pageHandler_.updateTheme();
+ this.pageHandler_.updateMostVisitedTiles();
+ FocusOutlineManager.forDocument(document);
+ }
+
+ /** @override */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.callbackRouter_.removeListener(assert(this.setThemeListenerId_));
+ this.callbackRouter_.removeListener(
+ assert(this.setMostVisitedTilesListenerId_));
+ this.mediaListenerWideWidth_.removeListener(
+ assert(this.boundOnWidthChange_));
+ this.mediaListenerMediumWidth_.removeListener(
+ assert(this.boundOnWidthChange_));
+ this.ownerDocument.removeEventListener(
+ 'keydown', this.boundOnDocumentKeyDown_);
+ this.eventTracker_.removeAll();
+ }
+
+ /** @override */
+ ready() {
+ super.ready();
+
+ /** @private {!Function} */
+ this.boundOnWidthChange_ = this.updateScreenWidth_.bind(this);
+ const {matchMedia} = BrowserProxy.getInstance();
+ /** @private {!MediaQueryList} */
+ this.mediaListenerWideWidth_ = matchMedia('(min-width: 672px)');
+ this.mediaListenerWideWidth_.addListener(this.boundOnWidthChange_);
+ /** @private {!MediaQueryList} */
+ this.mediaListenerMediumWidth_ = matchMedia('(min-width: 560px)');
+ this.mediaListenerMediumWidth_.addListener(this.boundOnWidthChange_);
+ this.updateScreenWidth_();
+ /** @private {!function(Event)} */
+ this.boundOnDocumentKeyDown_ = e =>
+ this.onDocumentKeyDown_(/** @type {!KeyboardEvent} */ (e));
+ this.ownerDocument.addEventListener(
+ 'keydown', this.boundOnDocumentKeyDown_);
+
+ performance.measure('most-visited-creation', 'most-visited-creation-start');
+ }
+
+ /**
+ * @param {!skia.mojom.SkColor} skColor
+ * @return {string}
+ * @private
+ */
+ rgbaOrInherit_(skColor) {
+ return skColor ? skColorToRgba(skColor) : 'inherit';
+ }
+
+ /**
+ * @return {number}
+ * @private
+ */
+ computeColumnCount_() {
+ let maxColumns = 3;
+ if (this.screenWidth_ === ScreenWidth.WIDE ||
+ this.screenWidth_ === ScreenWidth.MEDIUM) {
+ maxColumns = 4;
+ }
+
+ const shortcutCount = this.tiles_ ? this.tiles_.length : 0;
+ const tileCount = Math.min(8, shortcutCount);
+ const columnCount = tileCount <= maxColumns ?
+ tileCount :
+ Math.min(maxColumns, Math.ceil(tileCount / 2));
+ return columnCount || 3;
+ }
+
+ /**
+ * @return {number}
+ * @private
+ */
+ computeRowCount_() {
+ if (this.columnCount_ === 0) {
+ return 0;
+ }
+
+ const shortcutCount = this.tiles_ ? this.tiles_.length : 0;
+ return this.columnCount_ <= shortcutCount ? 2 : 1;
+ }
+
+ /**
+ * @return {number}
+ * @private
+ */
+ computeMaxVisibleTiles_() {
+ return this.columnCount_ * this.rowCount_;
+ }
+
+ /**
+ * @param {!url.mojom.Url} url
+ * @return {string}
+ * @private
+ */
+ getFaviconUrl_(url) {
+ const faviconUrl = new URL('chrome://favicon2/');
+ faviconUrl.searchParams.set('size', '24');
+ faviconUrl.searchParams.set('scale_factor', '1x');
+ faviconUrl.searchParams.set('show_fallback_monogram', '');
+ faviconUrl.searchParams.set('page_url', url.url);
+ return faviconUrl.href;
+ }
+
+ /**
+ * @param {!newTabPageThirdParty.mojom.MostVisitedTile} tile
+ * @return {string}
+ * @private
+ */
+ getTileTitleDirectionClass_(tile) {
+ return tile.titleDirection === mojoBase.mojom.TextDirection.RIGHT_TO_LEFT ?
+ 'title-rtl' :
+ 'title-ltr';
+ }
+
+ /**
+ * @param {number} index
+ * @return {boolean}
+ * @private
+ */
+ isHidden_(index) {
+ return index >= this.maxVisibleTiles_;
+ }
+
+ /**
+ * @param {!KeyboardEvent} e
+ * @private
+ */
+ onDocumentKeyDown_(e) {
+ if (e.altKey || e.shiftKey) {
+ return;
+ }
+
+ const modifier = isMac ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey;
+ if (modifier && e.key === 'z') {
+ e.preventDefault();
+ this.onUndoClick_();
+ }
+ }
+
+ /** @private */
+ onRestoreDefaultsClick_() {
+ if (!this.$.toast.open || !this.showToastButtons_) {
+ return;
+ }
+ this.$.toast.hide();
+ this.pageHandler_.restoreMostVisitedDefaults();
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onTileRemoveButtonClick_(e) {
+ e.preventDefault();
+ const {index} = this.$.tiles.modelForElement(e.target.parentElement);
+ this.tileRemove_(index);
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onTileClick_(e) {
+ if (e.defaultPrevented) {
+ // Ignore previousely handled events.
+ return;
+ }
+
+ e.preventDefault();
+
+ this.pageHandler_.onMostVisitedTileNavigation(
+ this.$.tiles.itemForElement(e.target),
+ this.$.tiles.indexForElement(e.target), e.button || 0, e.altKey,
+ e.ctrlKey, e.metaKey, e.shiftKey);
+ }
+
+ /**
+ * @param {!KeyboardEvent} e
+ * @private
+ */
+ onTileKeyDown_(e) {
+ if (e.altKey || e.shiftKey || e.metaKey || e.ctrlKey) {
+ return;
+ }
+
+ if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight' &&
+ e.key !== 'ArrowUp' && e.key !== 'ArrowDown' && e.key !== 'Delete') {
+ return;
+ }
+
+ const {index} = this.$.tiles.modelForElement(e.target);
+ if (e.key === 'Delete') {
+ this.tileRemove_(index);
+ return;
+ }
+
+ const advanceKey = this.isRtl_ ? 'ArrowLeft' : 'ArrowRight';
+ const delta = (e.key === advanceKey || e.key === 'ArrowDown') ? 1 : -1;
+ this.tileFocus_(Math.max(0, index + delta));
+ }
+
+ /** @private */
+ onUndoClick_() {
+ if (!this.$.toast.open || !this.showToastButtons_) {
+ return;
+ }
+ this.$.toast.hide();
+ this.pageHandler_.undoMostVisitedTileAction();
+ }
+
+ /**
+ * @param {number} index
+ * @private
+ */
+ tileFocus_(index) {
+ if (index < 0) {
+ return;
+ }
+ const tileElements = this.tileElements_;
+ if (index < tileElements.length) {
+ tileElements[index].focus();
+ }
+ }
+
+ /**
+ * @param {number} index
+ * @return {!Promise}
+ * @private
+ */
+ async tileRemove_(index) {
+ const {url, isQueryTile} = this.tiles_[index];
+ this.pageHandler_.deleteMostVisitedTile(url);
+ // Do not show the toast buttons when a query tile is removed unless it is a
+ // custom link. Removal is not reversible for non custom link query tiles.
+ this.showToastButtons_ = !isQueryTile;
+ this.$.toast.show();
+ this.tileFocus_(index);
+ }
+
+ /** @private */
+ updateScreenWidth_() {
+ if (this.mediaListenerWideWidth_.matches) {
+ this.screenWidth_ = ScreenWidth.WIDE;
+ } else if (this.mediaListenerMediumWidth_.matches) {
+ this.screenWidth_ = ScreenWidth.MEDIUM;
+ } else {
+ this.screenWidth_ = ScreenWidth.NARROW;
+ }
+ }
+
+ /** @private */
+ onTilesRendered_() {
+ performance.measure('most-visited-rendered');
+ this.pageHandler_.onMostVisitedTilesRendered(
+ this.tiles_.slice(0, assert(this.maxVisibleTiles_)),
+ BrowserProxy.getInstance().now());
+ }
+}
+
+customElements.define(MostVisitedElement.is, MostVisitedElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.html b/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.html
new file mode 100644
index 00000000000..ea64ac7c732
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}"
+ $i18n{hascustombackground} $i18n{isdark}>
+ <head>
+ <meta charset="utf-8">
+ <title>$i18n{title}</title>
+ <style>
+ html {
+ background-attachment: fixed;
+ background-color: $i18n{colorBackground};
+ background-position: $i18n{backgroundPosition};
+ background-repeat: $i18n{backgroundTiling};
+ height: 100%;
+ overflow: auto;
+ }
+
+ html[has-custom-background] {
+ background-image: -webkit-image-set(
+ url(chrome://theme/IDR_THEME_NTP_BACKGROUND?$i18n{themeId}) 1x,
+ url(chrome://theme/IDR_THEME_NTP_BACKGROUND@2x?$i18n{themeId}) 2x);
+ }
+
+ body {
+ align-items: center;
+ display: flex;
+ height: 100vh;
+ justify-content: center;
+ margin: 0;
+ }
+
+ html[dark] ntp3p-most-visited {
+ --icon-button-color-active: var(--google-grey-refresh-300);
+ --icon-button-color: white;
+ --tile-hover-color: rgba(255, 255, 255, .1);
+ }
+ </style>
+ </head>
+ <body>
+ <ntp3p-most-visited></ntp3p-most-visited>
+ <script type="module" src="new_tab_page_third_party.js"></script>
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.js b/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.js
new file mode 100644
index 00000000000..23f5627e9e0
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page_third_party/new_tab_page_third_party.js
@@ -0,0 +1,26 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './most_visited.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+
+const {callbackRouter, handler} = BrowserProxy.getInstance();
+
+callbackRouter.setTheme.addListener(theme => {
+ const html = document.documentElement;
+ html.toggleAttribute('has-custom-background', theme.hasCustomBackground);
+ html.toggleAttribute('dark', theme.isDark);
+ const style = html.style;
+ style.backgroundColor = theme.colorBackground;
+ const backgroundImage = `-webkit-image-set(
+ url(chrome://theme/IDR_THEME_NTP_BACKGROUND?${theme.id}) 1x,
+ url(chrome://theme/IDR_THEME_NTP_BACKGROUND@2x?${theme.id}) 2x)`;
+ style.backgroundImage = theme.hasCustomBackground ? backgroundImage : 'unset';
+ style.backgroundRepeat = theme.backgroundTiling;
+ style.backgroundPosition = theme.backgroundPosition;
+});
+handler.updateTheme();
+
+export {BrowserProxy};
diff --git a/chromium/chrome/browser/resources/ntp4/apps_page.js b/chromium/chrome/browser/resources/ntp4/apps_page.js
index 79f9096a376..af7eb777d7f 100644
--- a/chromium/chrome/browser/resources/ntp4/apps_page.js
+++ b/chromium/chrome/browser/resources/ntp4/apps_page.js
@@ -500,7 +500,11 @@ App.prototype = {
* @private
*/
onKeydown_(e) {
- if (e.key == 'Enter') {
+ if (e.key === 'F10' && e.shiftKey) {
+ this.appContents_.dispatchEvent(new MouseEvent('contextmenu'));
+ e.preventDefault();
+ e.stopPropagation();
+ } else if (e.key == 'Enter') {
chrome.send('launchApp', [
this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, '', 0, e.altKey, e.ctrlKey,
e.metaKey, e.shiftKey
diff --git a/chromium/chrome/browser/resources/ntp4/incognito_tab.html b/chromium/chrome/browser/resources/ntp4/incognito_tab.html
index 4b25b7dc84d..d6361fa036d 100644
--- a/chromium/chrome/browser/resources/ntp4/incognito_tab.html
+++ b/chromium/chrome/browser/resources/ntp4/incognito_tab.html
@@ -1,7 +1,6 @@
<!doctype html>
<html dir="$i18n{textdirection}"
hascustombackground="$i18n{hasCustomBackground}"
- bookmarkbarattached="$i18n{bookmarkbarattached}"
lang="$i18n{language}"
class="md">
<head>
diff --git a/chromium/chrome/browser/resources/ntp4/incognito_tab.js b/chromium/chrome/browser/resources/ntp4/incognito_tab.js
index 503d34c3963..22bf151fe18 100644
--- a/chromium/chrome/browser/resources/ntp4/incognito_tab.js
+++ b/chromium/chrome/browser/resources/ntp4/incognito_tab.js
@@ -37,13 +37,3 @@ window.addEventListener('load', function() {
};
chrome.send('observeCookieControlsSettingsChanges');
});
-
-// Handle the bookmark bar, theme, and font size change requests
-// from the C++ side.
-const ntp = {
- /** @param {string} attached */
- setBookmarkBarAttached(attached) {
- document.documentElement.setAttribute('bookmarkbarattached', attached);
- },
-};
-window.ntp = ntp;
diff --git a/chromium/chrome/browser/resources/ntp4/incognito_tab_theme.css b/chromium/chrome/browser/resources/ntp4/incognito_tab_theme.css
index e6c6a69ec75..8eb4523b5df 100644
--- a/chromium/chrome/browser/resources/ntp4/incognito_tab_theme.css
+++ b/chromium/chrome/browser/resources/ntp4/incognito_tab_theme.css
@@ -5,7 +5,7 @@
html {
background-attachment: fixed;
background-color: $i18n{colorBackground};
- background-position: $i18n{backgroundBarDetached};
+ background-position: $i18n{backgroundPosition};
background-repeat: $i18n{backgroundTiling};
height: 100%;
overflow: auto;
@@ -15,10 +15,6 @@ html[hascustombackground='true'] {
background-image: url(chrome://theme/IDR_THEME_NTP_BACKGROUND?$i18n{themeId});
}
-html[bookmarkbarattached='true'] {
- background-position: $i18n{backgroundBarAttached};
-}
-
#attribution-img {
content: url(chrome://theme/IDR_THEME_NTP_ATTRIBUTION?$i18n{themeId});
}
diff --git a/chromium/chrome/browser/resources/ntp4/new_tab.html b/chromium/chrome/browser/resources/ntp4/new_tab.html
index eca1c674f67..c965195d941 100644
--- a/chromium/chrome/browser/resources/ntp4/new_tab.html
+++ b/chromium/chrome/browser/resources/ntp4/new_tab.html
@@ -1,6 +1,5 @@
<!doctype html>
-<html class="starting-up" dir="$i18n{textdirection}"
- bookmarkbarattached="$i18n{bookmarkbarattached}" lang="$i18n{language}">
+<html class="starting-up" dir="$i18n{textdirection}" lang="$i18n{language}">
<head>
<meta charset="utf-8">
<title>$i18n{title}</title>
diff --git a/chromium/chrome/browser/resources/ntp4/new_tab.js b/chromium/chrome/browser/resources/ntp4/new_tab.js
index 7db6f7acf87..781c972fdae 100644
--- a/chromium/chrome/browser/resources/ntp4/new_tab.js
+++ b/chromium/chrome/browser/resources/ntp4/new_tab.js
@@ -219,10 +219,6 @@ function layoutFooter() {
}
}
-function setBookmarkBarAttached(attached) {
- document.documentElement.setAttribute('bookmarkbarattached', attached);
-}
-
/**
* Set the dominant color for a node. This will be called in response to
* getFaviconDominantColor. The node represented by |id| better have a setter
@@ -389,7 +385,6 @@ const exports = {
appsPrefChangeCallback,
getAppsCallback,
setAppToBeHighlighted,
- setBookmarkBarAttached,
setFaviconDominantColor,
updateLogin,
};
diff --git a/chromium/chrome/browser/resources/ntp4/new_tab_theme.css b/chromium/chrome/browser/resources/ntp4/new_tab_theme.css
index 48aea9313ee..e08c1abc213 100644
--- a/chromium/chrome/browser/resources/ntp4/new_tab_theme.css
+++ b/chromium/chrome/browser/resources/ntp4/new_tab_theme.css
@@ -6,14 +6,10 @@ html {
background-attachment: fixed;
background-color: $i18n{colorBackground};
background-image: url(chrome://theme/IDR_THEME_NTP_BACKGROUND?$i18n{themeId});
- background-position: $i18n{backgroundBarDetached};
+ background-position: $i18n{backgroundPosition};
background-repeat: $i18n{backgroundTiling};
}
-html[bookmarkbarattached='true'] {
- background-position: $i18n{backgroundBarAttached};
-}
-
body {
color: $i18n{colorTextRgba};
height: 100%;
diff --git a/chromium/chrome/browser/resources/pdf/elements/shared-css.html b/chromium/chrome/browser/resources/pdf/elements/shared-css.html
index 16e61e42588..f53ceae474d 100644
--- a/chromium/chrome/browser/resources/pdf/elements/shared-css.html
+++ b/chromium/chrome/browser/resources/pdf/elements/shared-css.html
@@ -2,6 +2,7 @@
<style>
cr-icon-button {
--cr-icon-button-fill-color: var(--pdf-toolbar-text-color);
+ --cr-icon-button-focus-outline-color: var(--google-grey-500);
margin: 0;
}
diff --git a/chromium/chrome/browser/resources/pdf/pdf_viewer.html b/chromium/chrome/browser/resources/pdf/pdf_viewer.html
index 386bd576254..fbc809859cd 100644
--- a/chromium/chrome/browser/resources/pdf/pdf_viewer.html
+++ b/chromium/chrome/browser/resources/pdf/pdf_viewer.html
@@ -58,15 +58,14 @@
}
#content-focus-rectangle {
- border: 2px solid var(--google-grey-600);
+ border: 2px solid var(--google-grey-500);
border-radius: 2px;
box-sizing: border-box;
height: 100%;
pointer-events: none;
- position: fixed;
+ position: absolute;
+ top: 0;
width: 100%;
- /* z-index for this should be higher than toolbar. */
- z-index: 5;
}
viewer-ink-host {
@@ -107,6 +106,7 @@
#main {
flex: 1;
overflow: hidden;
+ position: relative;
}
#scroller {
@@ -176,7 +176,8 @@
<div id="sizer"></div>
<div id="content"></div>
</div>
- <div>
+ <div id="content-focus-rectangle" hidden$="[[!documentHasFocus_]]"></div>
+ </div>
</div>
<template is="dom-if" if="[[showPasswordDialog_]]" restamp>
@@ -197,5 +198,3 @@
<if expr="chromeos">
<viewer-form-warning id="form-warning"></viewer-form-warning>
</if>
-
-<div id="content-focus-rectangle" hidden$="[[!documentHasFocus_]]"></div>
diff --git a/chromium/chrome/browser/resources/pdf/pdf_viewer.js b/chromium/chrome/browser/resources/pdf/pdf_viewer.js
index 3212a430738..2b3ccb1f19c 100644
--- a/chromium/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chromium/chrome/browser/resources/pdf/pdf_viewer.js
@@ -972,7 +972,7 @@ export class PDFViewerElement extends PDFViewerBaseElement {
const result = await this.currentController.saveAttachment(index);
// Cap the PDF attachment size at 100 MB. This cap should be kept in sync
- // with and is also enforced in pdf/out_of_process_instance.cc.
+ // with and is also enforced in pdf/pdf_view_plugin_base.h.
const MAX_FILE_SIZE = 100 * 1000 * 1000;
const bufView = new Uint8Array(result.dataToSave);
assert(
diff --git a/chromium/chrome/browser/resources/pdf/viewport.js b/chromium/chrome/browser/resources/pdf/viewport.js
index c852530aec9..b3749d35f68 100644
--- a/chromium/chrome/browser/resources/pdf/viewport.js
+++ b/chromium/chrome/browser/resources/pdf/viewport.js
@@ -341,6 +341,16 @@ export class Viewport {
*/
getViewportRect_() {
const zoom = this.getZoom();
+ // Zoom can be 0 in the case of a PDF that is in a hidden iframe. Avoid
+ // returning undefined values in this case. See https://crbug.com/1202725.
+ if (zoom === 0) {
+ return {
+ x: 0,
+ y: 0,
+ width: 0,
+ height: 0,
+ };
+ }
return {
x: this.position.x / zoom,
y: this.position.y / zoom,
diff --git a/chromium/chrome/browser/resources/plugin_metadata/OWNERS b/chromium/chrome/browser/resources/plugin_metadata/OWNERS
index e87d635528d..2a42cbefb8f 100644
--- a/chromium/chrome/browser/resources/plugin_metadata/OWNERS
+++ b/chromium/chrome/browser/resources/plugin_metadata/OWNERS
@@ -1,2 +1 @@
-jschuh@chromium.org
wfh@chromium.org
diff --git a/chromium/chrome/browser/resources/print_preview/BUILD.gn b/chromium/chrome/browser/resources/print_preview/BUILD.gn
index 4bb4a579ef3..ad04b3e197f 100644
--- a/chromium/chrome/browser/resources/print_preview/BUILD.gn
+++ b/chromium/chrome/browser/resources/print_preview/BUILD.gn
@@ -97,8 +97,6 @@ preprocess_if_expr("preprocess") {
"data/destination_policies.js",
"data/destination_store.js",
"data/document_info.js",
- "data/invitation.js",
- "data/invitation_store.js",
"data/local_parsers.js",
"data/margins.js",
"data/measurement_system.js",
@@ -146,7 +144,6 @@ preprocess_if_expr("preprocess_generated") {
"ui/duplex_settings.js",
"ui/header.js",
"ui/icons.js",
- "ui/invitation_promo.js",
"ui/layout_settings.js",
"ui/margin_control.js",
"ui/margin_control_container.js",
@@ -299,7 +296,6 @@ js_library("cloud_print_interface") {
deps = [
":native_layer",
"data:destination",
- "data:invitation",
"//ui/webui/resources/js/cr:event_target.m",
]
}
@@ -310,7 +306,6 @@ js_library("cloud_print_interface_impl") {
":native_layer_cros",
"data:cloud_parsers",
"data:destination",
- "data:invitation",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js/cr:event_target.m",
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
index a90c3d57aeb..b4981d4e04c 100644
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
+++ b/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
@@ -4,7 +4,6 @@
import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
import {Destination, DestinationOrigin} from './data/destination.js';
-import {Invitation} from './data/invitation.js';
import {NativeLayer} from './native_layer.js';
/**
@@ -53,24 +52,6 @@ export let CloudPrintInterfaceSearchDoneDetail;
*/
export let CloudPrintInterfacePrinterFailedDetail;
-/**
- * @typedef {{
- * invitations: !Array<!Invitation>,
- * user: string,
- * }}
- */
-export let CloudPrintInterfaceInvitesDoneDetail;
-
-/**
- * @typedef {{
- * invitation: !Invitation,
- * printer: ?Destination,
- * accept: boolean,
- * user: string,
- * }}
- */
-export let CloudPrintInterfaceProcessInviteDetail;
-
/** @interface */
export class CloudPrintInterface {
/** @return {boolean} Whether cookie destinations are disabled. */
@@ -114,19 +95,6 @@ export class CloudPrintInterface {
setUsers(users) {}
/**
- * Sends Google Cloud Print printer sharing invitations API requests.
- * @param {string} account Account the request is sent for.
- */
- invites(account) {}
-
- /**
- * Accepts or rejects printer sharing invitation.
- * @param {!Invitation} invitation Invitation to process.
- * @param {boolean} accept Whether to accept this invitation.
- */
- processInvite(invitation, accept) {}
-
- /**
* Sends a Google Cloud Print submit API request.
* @param {!Destination} destination Cloud destination to
* print to.
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js
index 867f3f586f8..62fb5446cbc 100644
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js
+++ b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js
@@ -7,9 +7,8 @@ import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
import {CloudPrintInterface, CloudPrintInterfaceErrorEventDetail, CloudPrintInterfaceEventType} from './cloud_print_interface.js';
-import {parseCloudDestination, parseInvitation} from './data/cloud_parsers.js';
+import {parseCloudDestination} from './data/cloud_parsers.js';
import {CloudOrigins, DestinationOrigin} from './data/destination.js';
-import {Invitation} from './data/invitation.js';
// <if expr="chromeos">
import {NativeLayerCrosImpl} from './native_layer_cros.js';
// </if>
@@ -109,7 +108,12 @@ export class CloudPrintInterfaceImpl {
});
}
this.abortSearchRequests_(origins);
- this.search_(true, account, origins);
+ if (opt_account) {
+ // No need to send two search requests if we don't know the account. The
+ // server only sends back the XSRF token once so the other request will
+ // fail.
+ this.search_(true, account, origins);
+ }
this.search_(false, account, origins);
}
@@ -142,30 +146,6 @@ export class CloudPrintInterfaceImpl {
}
/** @override */
- invites(account) {
- const params = [
- new HttpParam('client', 'chrome'),
- ];
- this.sendOrQueueRequest_(this.buildRequest_(
- 'GET', 'invites', params, DestinationOrigin.COOKIES, account,
- this.onInvitesDone_.bind(this)));
- }
-
- /** @override */
- processInvite(invitation, accept) {
- const params = [
- new HttpParam('printerid', invitation.destination.id),
- new HttpParam('email', invitation.scopeId),
- new HttpParam('accept', accept ? 'true' : 'false'),
- new HttpParam('use_cdd', 'true'),
- ];
- this.sendOrQueueRequest_(this.buildRequest_(
- 'POST', 'processinvite', params, invitation.destination.origin,
- invitation.destination.account,
- this.onProcessInviteDone_.bind(this, invitation, accept)));
- }
-
- /** @override */
submit(destination, printTicket, documentTitle, data) {
const result = VERSION_REGEXP_.exec(navigator.userAgent);
let chromeVersion = 'unknown';
@@ -302,7 +282,15 @@ export class CloudPrintInterfaceImpl {
sendRequest_(request) {
request.xhr.onreadystatechange =
this.onReadyStateChange_.bind(this, request);
- request.xhr.send(request.body);
+ request.xhr.onerror = () => {
+ console.warn('Error with request to Cloud Print');
+ };
+ try {
+ request.xhr.send(request.body);
+ } catch (error) {
+ console.warn('Error with request to Cloud Print: ' + request.body);
+ // Do nothing because otherwise JS crash reporting system will go crazy.
+ }
}
/**
@@ -452,7 +440,7 @@ export class CloudPrintInterfaceImpl {
printerList.push(
parseCloudDestination(printerJson, request.origin, activeUser));
} catch (err) {
- console.error('Unable to parse cloud print destination: ' + err);
+ console.warn('Unable to parse cloud print destination: ' + err);
}
});
// Extract and store users.
@@ -481,73 +469,6 @@ export class CloudPrintInterfaceImpl {
}
/**
- * Called when invitations search request completes.
- * @param {!CloudPrintRequest} request Request that has been
- * completed.
- * @private
- */
- onInvitesDone_(request) {
- const activeUser = (request.result && request.result['request'] &&
- request.result['request']['user']) ||
- '';
- if (request.xhr.status === 200 && request.result['success']) {
- // Extract invitations.
- const invitationListJson = request.result['invites'] || [];
- const invitationList = [];
- invitationListJson.forEach(function(invitationJson) {
- try {
- invitationList.push(parseInvitation(invitationJson, activeUser));
- } catch (e) {
- console.error('Unable to parse invitation: ' + e);
- }
- });
- // Dispatch INVITES_DONE event.
- this.eventTarget_.dispatchEvent(
- new CustomEvent(CloudPrintInterfaceEventType.INVITES_DONE, {
- detail: {
- invitations: invitationList,
- user: activeUser,
- }
- }));
- } else {
- this.eventTarget_.dispatchEvent(new CustomEvent(
- CloudPrintInterfaceEventType.INVITES_FAILED, {detail: activeUser}));
- }
- }
-
- /**
- * Called when invitation processing request completes.
- * @param {!Invitation} invitation Processed invitation.
- * @param {boolean} accept Whether this invitation was accepted or rejected.
- * @param {!CloudPrintRequest} request Request that has been
- * completed.
- * @private
- */
- onProcessInviteDone_(invitation, accept, request) {
- const activeUser = (request.result && request.result['request'] &&
- request.result['request']['user']) ||
- '';
- let printer = null;
- if (request.xhr.status === 200 && request.result['success'] && accept) {
- try {
- printer = parseCloudDestination(
- request.result['printer'], request.origin, activeUser);
- } catch (e) {
- console.error('Failed to parse cloud print destination: ' + e);
- }
- }
- this.eventTarget_.dispatchEvent(
- new CustomEvent(CloudPrintInterfaceEventType.PROCESS_INVITE_DONE, {
- detail: {
- printer: printer,
- invitation: invitation,
- accept: accept,
- user: activeUser,
- }
- }));
- }
-
- /**
* Called when the submit request completes.
* @param {!CloudPrintRequest} request Request that has been
* completed.
@@ -607,7 +528,7 @@ export class CloudPrintInterfaceImpl {
printer =
parseCloudDestination(printerJson, request.origin, activeUser);
} catch (err) {
- console.error(
+ console.warn(
'Failed to parse cloud print destination: ' +
JSON.stringify(printerJson));
return;
diff --git a/chromium/chrome/browser/resources/print_preview/data/BUILD.gn b/chromium/chrome/browser/resources/print_preview/data/BUILD.gn
index 605131b45f3..2374f58d954 100644
--- a/chromium/chrome/browser/resources/print_preview/data/BUILD.gn
+++ b/chromium/chrome/browser/resources/print_preview/data/BUILD.gn
@@ -17,8 +17,6 @@ js_type_check("closure_compile_module") {
":destination_policies",
":destination_store",
":document_info",
- ":invitation",
- ":invitation_store",
":local_parsers",
":margins",
":measurement_system",
@@ -60,15 +58,6 @@ js_library("destination_store") {
]
}
-js_library("invitation_store") {
- deps = [
- ":invitation",
- "..:cloud_print_interface",
- "//ui/webui/resources/js:event_tracker.m",
- "//ui/webui/resources/js/cr:event_target.m",
- ]
-}
-
if (is_chromeos_ash) {
js_library("print_server_store") {
deps = [
@@ -99,15 +88,10 @@ js_library("destination_match") {
js_library("cloud_parsers") {
deps = [
":destination",
- ":invitation",
"//ui/webui/resources/js:assert.m",
]
}
-js_library("invitation") {
- deps = [ ":destination" ]
-}
-
js_library("destination") {
deps = [
"//ui/webui/resources/js:assert.m",
@@ -184,7 +168,6 @@ js_library("user_manager") {
deps = [
":destination",
":destination_store",
- ":invitation_store",
"..:cloud_print_interface",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:event_tracker.m",
diff --git a/chromium/chrome/browser/resources/print_preview/data/cloud_parsers.js b/chromium/chrome/browser/resources/print_preview/data/cloud_parsers.js
index a0c08b5d7b6..94b68ed3b61 100644
--- a/chromium/chrome/browser/resources/print_preview/data/cloud_parsers.js
+++ b/chromium/chrome/browser/resources/print_preview/data/cloud_parsers.js
@@ -5,7 +5,6 @@
import {assert} from 'chrome://resources/js/assert.m.js';
import {Cdd} from './cdd.js';
import {Destination, DestinationCertificateStatus, DestinationConnectionStatus, DestinationOrigin, DestinationType} from './destination.js';
-import {Invitation} from './invitation.js';
/**
* Enumeration of cloud destination field names.
@@ -130,64 +129,3 @@ export function parseCloudDestination(json, origin, account) {
}
return cloudDest;
}
-
-/**
- * Enumeration of invitation field names.
- * @enum {string}
- */
-const InvitationField = {
- PRINTER: 'printer',
- RECEIVER: 'receiver',
- SENDER: 'sender'
-};
-
-/**
- * Enumeration of cloud destination types that are supported by print preview.
- * @enum {string}
- */
-const InvitationAclType = {
- DOMAIN: 'DOMAIN',
- GROUP: 'GROUP',
- PUBLIC: 'PUBLIC',
- USER: 'USER'
-};
-
-/**
- * Parses printer sharing invitation from JSON from GCP invite API response.
- * @param {!Object} json Object that represents a invitation search response.
- * @param {string} account The account this invitation is sent for.
- * @return {!Invitation} Parsed invitation.
- */
-export function parseInvitation(json, account) {
- if (!json.hasOwnProperty(InvitationField.SENDER) ||
- !json.hasOwnProperty(InvitationField.RECEIVER) ||
- !json.hasOwnProperty(InvitationField.PRINTER)) {
- throw Error('Invitation does not have necessary info.');
- }
-
- const nameFormatter = function(name, scope) {
- return name && scope ? (name + ' (' + scope + ')') : (name || scope);
- };
-
- const sender = json[InvitationField.SENDER];
- const senderName = nameFormatter(sender['name'], sender['email']);
-
- const receiver = json[InvitationField.RECEIVER];
- let receiverName = '';
- const receiverType = receiver['type'];
- if (receiverType === InvitationAclType.USER) {
- // It's a personal invitation, empty name indicates just that.
- } else if (
- receiverType === InvitationAclType.GROUP ||
- receiverType === InvitationAclType.DOMAIN) {
- receiverName = nameFormatter(receiver['name'], receiver['scope']);
- } else {
- throw Error('Invitation of unsupported receiver type');
- }
-
- const destination = parseCloudDestination(
- json[InvitationField.PRINTER], DestinationOrigin.COOKIES, account);
-
- return new Invitation(
- senderName, receiverName, destination, receiver, account);
-}
diff --git a/chromium/chrome/browser/resources/print_preview/data/destination_store.js b/chromium/chrome/browser/resources/print_preview/data/destination_store.js
index 295b3f2036b..e2de5b10b9c 100644
--- a/chromium/chrome/browser/resources/print_preview/data/destination_store.js
+++ b/chromium/chrome/browser/resources/print_preview/data/destination_store.js
@@ -8,7 +8,7 @@ import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_t
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CloudPrintInterface, CloudPrintInterfaceEventType, CloudPrintInterfacePrinterFailedDetail, CloudPrintInterfaceProcessInviteDetail, CloudPrintInterfaceSearchDoneDetail} from '../cloud_print_interface.js';
+import {CloudPrintInterface, CloudPrintInterfaceEventType, CloudPrintInterfacePrinterFailedDetail, CloudPrintInterfaceSearchDoneDetail} from '../cloud_print_interface.js';
import {Metrics, MetricsContext} from '../metrics.js';
import {CapabilitiesResponse, NativeLayer, NativeLayerImpl} from '../native_layer.js';
// <if expr="chromeos">
@@ -217,12 +217,6 @@ export class DestinationStore extends EventTarget {
/** @private {boolean} */
this.initialDestinationSelected_ = false;
- /** @private {boolean} */
- this.initialized_ = false;
-
- /** @private {boolean} */
- this.readyToReloadCookieDestinations_ = false;
-
/**
* Maps user account to the list of origins for which destinations are
* already loaded.
@@ -297,11 +291,6 @@ export class DestinationStore extends EventTarget {
this.useSystemDefaultAsDefault_ =
loadTimeData.getBoolean('useSystemDefaultPrinter');
- // <if expr="chromeos">
- /** @private */
- this.saveToDriveFlagEnabled_ = loadTimeData.getBoolean('printSaveToDrive');
- // </if>
-
addListenerCallback('printers-added', this.onPrintersAdded_.bind(this));
}
@@ -397,7 +386,7 @@ export class DestinationStore extends EventTarget {
this.pdfPrinterEnabled_ = !pdfPrinterDisabled;
this.createLocalPdfPrintDestination_();
// <if expr="chromeos">
- if (this.saveToDriveFlagEnabled_ && isDriveMounted) {
+ if (isDriveMounted) {
this.createLocalDrivePrintDestination_();
}
// </if>
@@ -406,27 +395,21 @@ export class DestinationStore extends EventTarget {
// destinationsInserted_ may never be called.
if (this.typesToSearch_.size === 0) {
this.tryToSelectInitialDestination_();
- this.initialized_ = true;
- if (this.readyToReloadCookieDestinations_) {
- this.reloadUserCookieBasedDestinations(this.activeUser_);
- }
return;
}
// Load all possible printers.
for (const printerType of this.typesToSearch_) {
if (printerType === PrinterType.CLOUD_PRINTER) {
- this.startLoadCloudDestinations();
+ // Accounts are not known on startup. Send an initial search query to
+ // get tokens and user accounts.
+ this.cloudPrintInterface_.search();
} else if (
printerType !== PrinterType.PRIVET_PRINTER ||
loadTimeData.getBoolean('forceEnablePrivetPrinting')) {
this.startLoadDestinations_(printerType);
}
}
- this.initialized_ = true;
- if (this.readyToReloadCookieDestinations_) {
- this.reloadUserCookieBasedDestinations(this.activeUser_);
- }
}
/** @private */
@@ -597,7 +580,7 @@ export class DestinationStore extends EventTarget {
matchRules = JSON.parse(serializedDefaultDestinationSelectionRulesStr);
}
} catch (e) {
- console.error('Failed to parse defaultDestinationSelectionRules: ' + e);
+ console.warn('Failed to parse defaultDestinationSelectionRules: ' + e);
}
if (!matchRules) {
return null;
@@ -606,7 +589,7 @@ export class DestinationStore extends EventTarget {
const isLocal = !matchRules.kind || matchRules.kind === 'local';
const isCloud = !matchRules.kind || matchRules.kind === 'cloud';
if (!isLocal && !isCloud) {
- console.error('Unsupported type: "' + matchRules.kind + '"');
+ console.warn('Unsupported type: "' + matchRules.kind + '"');
return null;
}
@@ -627,7 +610,7 @@ export class DestinationStore extends EventTarget {
idRegExp = new RegExp(matchRules.idPattern || '.*');
}
} catch (e) {
- console.error('Failed to parse regexp for "id": ' + e);
+ console.warn('Failed to parse regexp for "id": ' + e);
}
let displayNameRegExp = null;
@@ -636,7 +619,7 @@ export class DestinationStore extends EventTarget {
displayNameRegExp = new RegExp(matchRules.namePattern || '.*');
}
} catch (e) {
- console.error('Failed to parse regexp for "name": ' + e);
+ console.warn('Failed to parse regexp for "name": ' + e);
}
return new DestinationMatch(
@@ -674,10 +657,6 @@ export class DestinationStore extends EventTarget {
this.cloudPrintInterface_.getEventTarget(),
CloudPrintInterfaceEventType.PRINTER_FAILED,
this.onCloudPrintPrinterFailed_.bind(this));
- this.tracker_.add(
- this.cloudPrintInterface_.getEventTarget(),
- CloudPrintInterfaceEventType.PROCESS_INVITE_DONE,
- this.onCloudPrintProcessInviteDone_.bind(this));
}
/** @param {string} key Key identifying the destination to select */
@@ -839,11 +818,6 @@ export class DestinationStore extends EventTarget {
* @param {string} account
*/
reloadUserCookieBasedDestinations(account) {
- if (!this.initialized_) {
- this.readyToReloadCookieDestinations_ = true;
- return;
- }
-
const origins = this.loadedCloudOrigins_.get(account) || [];
if (origins.includes(DestinationOrigin.COOKIES)) {
this.dispatchEvent(
@@ -1169,13 +1143,16 @@ export class DestinationStore extends EventTarget {
const payload = event.detail;
const searchingCloudPrintersDone =
this.typesToSearch_.has(PrinterType.CLOUD_PRINTER) &&
- !this.cloudPrintInterface_.isCloudDestinationSearchInProgress();
+ !this.cloudPrintInterface_.isCloudDestinationSearchInProgress() &&
+ (!!payload.user ||
+ event.type === CloudPrintInterfaceEventType.SEARCH_FAILED);
if (searchingCloudPrintersDone) {
this.typesToSearch_.delete(PrinterType.CLOUD_PRINTER);
}
if (payload.printers && payload.printers.length > 0) {
this.insertDestinations_(payload.printers);
- } else if (searchingCloudPrintersDone) {
+ }
+ if (searchingCloudPrintersDone) {
this.tryToSelectInitialDestination_();
}
if (payload.searchDone) {
@@ -1222,19 +1199,6 @@ export class DestinationStore extends EventTarget {
}
/**
- * Called when printer sharing invitation was processed successfully.
- * @param {!CustomEvent<!CloudPrintInterfaceProcessInviteDetail>}
- * event Contains detailed information about the invite and newly
- * accepted destination (if known).
- * @private
- */
- onCloudPrintProcessInviteDone_(event) {
- if (event.detail.accept && event.detail.printer) {
- this.insertDestination_(event.detail.printer);
- }
- }
-
- /**
* Called when a printer or printers are detected after sending getPrinters
* from the native layer.
* @param {!PrinterType} type The type of printer(s) added.
diff --git a/chromium/chrome/browser/resources/print_preview/data/invitation.js b/chromium/chrome/browser/resources/print_preview/data/invitation.js
deleted file mode 100644
index 833bb40b125..00000000000
--- a/chromium/chrome/browser/resources/print_preview/data/invitation.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {Destination} from './destination.js';
-
-export class Invitation {
- /**
- * Printer sharing invitation data object.
- * @param {string} sender Text identifying invitation sender.
- * @param {string} receiver Text identifying invitation receiver. Empty in
- * case of a personal invitation. Identifies a group or domain in case
- * of an invitation received by a group manager.
- * @param {!Destination} destination Shared destination.
- * @param {!Object} aclEntry JSON representation of the ACL entry this
- * invitation was sent to.
- * @param {string} account User account this invitation is sent for.
- */
- constructor(sender, receiver, destination, aclEntry, account) {
- /**
- * Text identifying invitation sender.
- * @private {string}
- */
- this.sender_ = sender;
-
- /**
- * Text identifying invitation receiver. Empty in case of a personal
- * invitation. Identifies a group or domain in case of an invitation
- * received by a group manager.
- * @private {string}
- */
- this.receiver_ = receiver;
-
- /**
- * Shared destination.
- * @private {!Destination}
- */
- this.destination_ = destination;
-
- /**
- * JSON representation of the ACL entry this invitation was sent to.
- * @private {!Object}
- */
- this.aclEntry_ = aclEntry;
-
- /**
- * Account this invitation is sent for.
- * @private {string}
- */
- this.account_ = account;
- }
-
- /** @return {string} Text identifying invitation sender. */
- get sender() {
- return this.sender_;
- }
-
- /** @return {string} Text identifying invitation receiver. */
- get receiver() {
- return this.receiver_;
- }
-
- /**
- * @return {boolean} Whether this user acts as a manager for a group of
- * users.
- */
- get asGroupManager() {
- return !!this.receiver_;
- }
-
- /** @return {!Destination} Shared destination. */
- get destination() {
- return this.destination_;
- }
-
- /** @return {string} Scope (account) this invitation was sent to. */
- get scopeId() {
- return this.aclEntry_['scope'] || '';
- }
-
- /** @return {string} Account this invitation is sent for. */
- get account() {
- return this.account_;
- }
-}
diff --git a/chromium/chrome/browser/resources/print_preview/data/invitation_store.js b/chromium/chrome/browser/resources/print_preview/data/invitation_store.js
deleted file mode 100644
index fc2a58d687a..00000000000
--- a/chromium/chrome/browser/resources/print_preview/data/invitation_store.js
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
-import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
-
-import {CloudPrintInterface, CloudPrintInterfaceEventType, CloudPrintInterfaceInvitesDoneDetail, CloudPrintInterfaceProcessInviteDetail} from '../cloud_print_interface.js';
-
-import {Invitation} from './invitation.js';
-
-/**
- * @enum {number}
- * @private
- */
-const InvitationStoreLoadStatus = {
- IN_PROGRESS: 1,
- DONE: 2,
- FAILED: 3,
-};
-
-export class InvitationStore extends EventTarget {
- /** Printer sharing invitations data store. */
- constructor() {
- super();
-
- /**
- * Maps user account to the list of invitations for this account.
- * @private {!Object<!Array<!Invitation>>}
- */
- this.invitations_ = {};
-
- /**
- * Maps user account to the flag whether the invitations for this account
- * were successfully loaded.
- * @private {!Object<InvitationStoreLoadStatus>}
- */
- this.loadStatus_ = {};
-
- /**
- * Event tracker used to track event listeners of the destination store.
- * @private {!EventTracker}
- */
- this.tracker_ = new EventTracker();
-
- /**
- * Used to fetch and process invitations.
- * @private {CloudPrintInterface}
- */
- this.cloudPrintInterface_ = null;
-
- /**
- * Invitation being processed now. Only one invitation can be processed at
- * a time.
- * @private {Invitation}
- */
- this.invitationInProgress_ = null;
- }
-
- /**
- * @return {Invitation} Currently processed invitation or
- * {@code null}.
- */
- get invitationInProgress() {
- return this.invitationInProgress_;
- }
-
- /**
- * @param {string} account Account to filter invitations by.
- * @return {!Array<!Invitation>} List of invitations for the
- * {@code account}.
- */
- invitations(account) {
- return this.invitations_[account] || [];
- }
-
- /**
- * Sets the invitation store's Google Cloud Print interface.
- * @param {!CloudPrintInterface} cloudPrintInterface Interface
- * to set.
- */
- setCloudPrintInterface(cloudPrintInterface) {
- assert(this.cloudPrintInterface_ === null);
- this.cloudPrintInterface_ = cloudPrintInterface;
- this.tracker_.add(
- this.cloudPrintInterface_.getEventTarget(),
- CloudPrintInterfaceEventType.INVITES_DONE,
- this.onCloudPrintInvitesDone_.bind(this));
- this.tracker_.add(
- this.cloudPrintInterface_.getEventTarget(),
- CloudPrintInterfaceEventType.INVITES_FAILED,
- this.onCloudPrintInvitesFailed_.bind(this));
- this.tracker_.add(
- this.cloudPrintInterface_.getEventTarget(),
- CloudPrintInterfaceEventType.PROCESS_INVITE_DONE,
- this.onCloudPrintProcessInviteDone_.bind(this));
- }
-
- /** Removes all events being tracked from the tracker. */
- resetTracker() {
- this.tracker_.removeAll();
- }
-
- /**
- * Initiates loading of cloud printer sharing invitations for the user
- * account given by |user|.
- * @param {string} user The user to load invitations for.
- */
- startLoadingInvitations(user) {
- if (!this.cloudPrintInterface_) {
- return;
- }
- if (this.loadStatus_.hasOwnProperty(user)) {
- if (this.loadStatus_[user] === InvitationStoreLoadStatus.DONE) {
- this.dispatchEvent(
- new CustomEvent(InvitationStore.EventType.INVITATION_SEARCH_DONE));
- }
- return;
- }
-
- this.loadStatus_[user] = InvitationStoreLoadStatus.IN_PROGRESS;
- this.cloudPrintInterface_.invites(user);
- }
-
- /**
- * Accepts or rejects the {@code invitation}, based on {@code accept} value.
- * @param {!Invitation} invitation Invitation to process.
- * @param {boolean} accept Whether to accept this invitation.
- */
- processInvitation(invitation, accept) {
- if (this.invitationInProgress_) {
- return;
- }
- this.invitationInProgress_ = invitation;
- this.cloudPrintInterface_.processInvite(invitation, accept);
- }
-
- /**
- * Removes processed invitation from the internal storage.
- * @param {!Invitation} invitation Processed invitation.
- * @private
- */
- invitationProcessed_(invitation) {
- if (this.invitations_.hasOwnProperty(invitation.account)) {
- this.invitations_[invitation.account] =
- this.invitations_[invitation.account].filter(function(i) {
- return i !== invitation;
- });
- }
- if (this.invitationInProgress_ === invitation) {
- this.invitationInProgress_ = null;
- }
- }
-
- /**
- * Called when printer sharing invitations are fetched.
- * @param {!CustomEvent<!CloudPrintInterfaceInvitesDoneDetail>}
- * event Contains the list of invitations.
- * @private
- */
- onCloudPrintInvitesDone_(event) {
- this.loadStatus_[event.detail.user] = InvitationStoreLoadStatus.DONE;
- this.invitations_[event.detail.user] = event.detail.invitations;
-
- this.dispatchEvent(
- new CustomEvent(InvitationStore.EventType.INVITATION_SEARCH_DONE));
- }
-
- /**
- * Called when printer sharing invitations fetch has failed.
- * @param {!CustomEvent<string>} event Contains the user for whom invite
- * fetch failed.
- * @private
- */
- onCloudPrintInvitesFailed_(event) {
- this.loadStatus_[event.detail] = InvitationStoreLoadStatus.FAILED;
- }
-
- /**
- * Called when printer sharing invitation was processed successfully.
- * @param {!CustomEvent<!CloudPrintInterfaceProcessInviteDetail>}
- * event Contains detailed information about the invite.
- * @private
- */
- onCloudPrintProcessInviteDone_(event) {
- this.invitationProcessed_(event.detail.invitation);
- this.dispatchEvent(
- new CustomEvent(InvitationStore.EventType.INVITATION_PROCESSED));
- }
-}
-
-/**
- * Event types dispatched by the data store.
- * @enum {string}
- */
-InvitationStore.EventType = {
- INVITATION_PROCESSED: 'InvitationStore.INVITATION_PROCESSED',
- INVITATION_SEARCH_DONE: 'InvitationStore.INVITATION_SEARCH_DONE'
-};
diff --git a/chromium/chrome/browser/resources/print_preview/data/model.js b/chromium/chrome/browser/resources/print_preview/data/model.js
index e92982c05e5..93f8806406e 100644
--- a/chromium/chrome/browser/resources/print_preview/data/model.js
+++ b/chromium/chrome/browser/resources/print_preview/data/model.js
@@ -993,7 +993,7 @@ Polymer({
savedSettings =
/** @type {SerializedSettings} */ (JSON.parse(savedSettingsStr));
} catch (e) {
- console.error('Unable to parse state ' + e);
+ console.warn('Unable to parse state ' + e);
return; // use default values rather than updating.
}
if (savedSettings.version !== 2) {
@@ -1418,7 +1418,7 @@ Polymer({
const selectedOption = destination.getSelectedColorOption(
/** @type {boolean} */ (this.settings.color.value));
if (!selectedOption) {
- console.error('Could not find correct color option');
+ console.warn('Could not find correct color option');
} else {
cjt.print.color = {type: selectedOption.type};
if (selectedOption.hasOwnProperty('vendor_id')) {
diff --git a/chromium/chrome/browser/resources/print_preview/data/printer_status_cros.js b/chromium/chrome/browser/resources/print_preview/data/printer_status_cros.js
index 1593f085123..c200cda30dd 100644
--- a/chromium/chrome/browser/resources/print_preview/data/printer_status_cros.js
+++ b/chromium/chrome/browser/resources/print_preview/data/printer_status_cros.js
@@ -89,34 +89,39 @@ export const ERROR_STRING_KEY_MAP = new Map([
* responsibility is to determine which status reason is most relevant to
* surface to the user. Any status reason with a severity of WARNING or ERROR
* will get highest precedence since this usually means the printer is in a
- * bad state. NO_ERROR status reason is the next highest precedence so the
- * printer can be shown as available whenever possible.
+ * bad state. If there does not exist an error status reason with a high enough
+ * severity, then return NO_ERROR.
* @param {!PrinterStatus} printerStatus
* @return {!PrinterStatusReason} Status reason extracted from |printerStatus|.
*/
export function getStatusReasonFromPrinterStatus(printerStatus) {
if (!printerStatus.printerId) {
- // TODO(crbug.com/1027400): Remove console log once bug is confirmed fix.
+ // TODO(crbug.com/1027400): Remove console.warn once bug is confirmed fix.
console.warn('Received printer status missing printer id');
return PrinterStatusReason.UNKNOWN_REASON;
}
+ let statusReason = PrinterStatusReason.NO_ERROR;
+ for (const printerStatusReason of printerStatus.statusReasons) {
+ const reason = printerStatusReason.reason;
+ const severity = printerStatusReason.severity;
+ if (severity !== PrinterStatusSeverity.ERROR &&
+ severity !== PrinterStatusSeverity.WARNING) {
+ continue;
+ }
- let seenNoErrorReason = false;
- for (const statusReason of printerStatus.statusReasons) {
- const reason = statusReason.reason;
- const severity = statusReason.severity;
-
+ // Always prioritize an ERROR severity status, unless it's for unknown
+ // reasons.
if (reason !== PrinterStatusReason.UNKNOWN_REASON &&
- (severity === PrinterStatusSeverity.WARNING ||
- severity === PrinterStatusSeverity.ERROR)) {
+ severity === PrinterStatusSeverity.ERROR) {
return reason;
}
- seenNoErrorReason =
- seenNoErrorReason || reason === PrinterStatusReason.NO_ERROR;
+ if (reason !== PrinterStatusReason.UNKNOWN_REASON ||
+ statusReason === PrinterStatusReason.NO_ERROR) {
+ statusReason = reason;
+ }
}
- return seenNoErrorReason ? PrinterStatusReason.NO_ERROR :
- PrinterStatusReason.UNKNOWN_REASON;
+ return statusReason;
}
/**
diff --git a/chromium/chrome/browser/resources/print_preview/data/user_manager.js b/chromium/chrome/browser/resources/print_preview/data/user_manager.js
index 844f5e68206..d3c7728b8df 100644
--- a/chromium/chrome/browser/resources/print_preview/data/user_manager.js
+++ b/chromium/chrome/browser/resources/print_preview/data/user_manager.js
@@ -12,7 +12,6 @@ import {CloudPrintInterfaceImpl} from '../cloud_print_interface_impl.js';
import {Destination, DestinationOrigin} from './destination.js';
import {DestinationStore} from './destination_store.js';
-import {InvitationStore} from './invitation_store.js';
/**
* @typedef {{ activeUser: string,
@@ -41,9 +40,6 @@ Polymer({
/** @type {?DestinationStore} */
destinationStore: Object,
- /** @type {?InvitationStore} */
- invitationStore: Object,
-
/** @type {!Array<string>} */
users: {
type: Array,
@@ -69,37 +65,18 @@ Polymer({
this.initialized_ = false;
},
- /**
- * @param {?Array<string>} userAccounts
- * @param {boolean} syncAvailable
- */
- initUserAccounts(userAccounts, syncAvailable) {
+ initUserAccounts() {
assert(!this.initialized_);
this.initialized_ = true;
- if (!userAccounts) {
- assert(this.cloudPrintDisabled);
- this.activeUser = '';
+ if (this.cloudPrintDisabled) {
return;
}
- // If cloud print is enabled, listen for account changes.
- assert(!this.cloudPrintDisabled);
- if (syncAvailable) {
- this.addWebUIListener(
- 'user-accounts-updated', this.updateUsers_.bind(this));
- this.updateUsers_(userAccounts);
- } else {
- // Request the cookies destinations from the Google Cloud Print server
- // directly. We have to do this in incognito mode in order to get the
- // user's login state.
+ this.addWebUIListener('check-for-account-update', () => {
this.destinationStore.startLoadCloudDestinations(
DestinationOrigin.COOKIES);
- this.addWebUIListener('check-for-account-update', () => {
- this.destinationStore.startLoadCloudDestinations(
- DestinationOrigin.COOKIES);
- });
- }
+ });
},
/** @private */
@@ -187,6 +164,5 @@ Polymer({
}
this.destinationStore.reloadUserCookieBasedDestinations(user);
- this.invitationStore.startLoadingInvitations(user);
},
});
diff --git a/chromium/chrome/browser/resources/print_preview/metrics.js b/chromium/chrome/browser/resources/print_preview/metrics.js
index dc889e6ad99..867e4b470a0 100644
--- a/chromium/chrome/browser/resources/print_preview/metrics.js
+++ b/chromium/chrome/browser/resources/print_preview/metrics.js
@@ -42,12 +42,8 @@ Metrics.DestinationSearchBucket = {
ACCOUNT_CHANGED: 9,
// User tried to log into another account.
ADD_ACCOUNT_SELECTED: 10,
- // Printer sharing invitation was shown to the user.
- INVITATION_AVAILABLE: 11,
- // User accepted printer sharing invitation.
- INVITATION_ACCEPTED: 12,
- // User rejected printer sharing invitation.
- INVITATION_REJECTED: 13,
+ // Note: values 11-13 are intentionally unset as these correspond to
+ // deprecated values in histograms/enums.xml. These enums are append-only.
// User clicked on Manage button
MANAGE_BUTTON_CLICKED: 14,
// Max value.
diff --git a/chromium/chrome/browser/resources/print_preview/native_layer.js b/chromium/chrome/browser/resources/print_preview/native_layer.js
index 5d642ddc3da..ef33d40d68b 100644
--- a/chromium/chrome/browser/resources/print_preview/native_layer.js
+++ b/chromium/chrome/browser/resources/print_preview/native_layer.js
@@ -80,8 +80,6 @@ export let Policies;
* pdfPrinterDisabled: boolean,
* destinationsManaged: boolean,
* cloudPrintURL: (string | undefined),
- * userAccounts: (Array<string> | undefined),
- * syncAvailable: boolean,
* isDriveMounted: (boolean | undefined),
* }}
* @see corresponding field name definitions in print_preview_handler.cc
diff --git a/chromium/chrome/browser/resources/print_preview/print_preview.js b/chromium/chrome/browser/resources/print_preview/print_preview.js
index ed4fc15d50c..e9cc254aae9 100644
--- a/chromium/chrome/browser/resources/print_preview/print_preview.js
+++ b/chromium/chrome/browser/resources/print_preview/print_preview.js
@@ -18,7 +18,6 @@ export {ColorModeRestriction, DuplexModeRestriction, PinModeRestriction} from '.
// </if>
export {DestinationErrorType, DestinationStore} from './data/destination_store.js';
export {PageLayoutInfo} from './data/document_info.js';
-export {InvitationStore} from './data/invitation_store.js';
export {LocalDestinationInfo, ProvisionalDestinationInfo} from './data/local_parsers.js';
export {CustomMarginsOrientation, Margins, MarginsSetting, MarginsType} from './data/margins.js';
export {MeasurementSystem, MeasurementSystemUnitType} from './data/measurement_system.js';
diff --git a/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn b/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
index d589d17d69c..bd8e09c68eb 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
@@ -148,7 +148,6 @@ js_library("destination_settings") {
"..:cloud_print_interface_impl",
"../data:destination",
"../data:destination_store",
- "../data:invitation_store",
"../data:state",
"../data:user_manager",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -438,29 +437,16 @@ js_library("plugin_proxy") {
]
}
-js_library("invitation_promo") {
- deps = [
- "..:metrics",
- "../data:invitation",
- "../data:invitation_store",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:event_tracker.m",
- "//ui/webui/resources/js:i18n_behavior.m",
- ]
-}
-
if (is_chromeos_ash) {
js_library("destination_dialog_cros") {
deps = [
":destination_list",
- ":invitation_promo",
":print_preview_search_box",
":provisional_destination_resolver",
"..:metrics",
"..:native_layer",
"../data:destination",
"../data:destination_store",
- "../data:invitation_store",
"../data:print_server_store",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -474,13 +460,11 @@ if (is_chromeos_ash) {
js_library("destination_dialog") {
deps = [
":destination_list",
- ":invitation_promo",
":print_preview_search_box",
"..:metrics",
"..:native_layer",
"../data:destination",
"../data:destination_store",
- "../data:invitation_store",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:event_tracker.m",
@@ -538,7 +522,7 @@ js_library("print_preview_search_box") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field_behavior.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field_behavior",
]
}
@@ -581,7 +565,6 @@ html_to_js("web_components") {
"duplex_settings.js",
"header.js",
"icons.js",
- "invitation_promo.js",
"layout_settings.js",
"link_container.js",
"margin_control_container.js",
diff --git a/chromium/chrome/browser/resources/print_preview/ui/advanced_settings_item.js b/chromium/chrome/browser/resources/print_preview/ui/advanced_settings_item.js
index 529f0335ac6..57756ddecb1 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/advanced_settings_item.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/advanced_settings_item.js
@@ -5,7 +5,7 @@
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
-import 'chrome://resources/cr_elements/search_highlight_style_css.m.js';
+import 'chrome://resources/cr_elements/search_highlight_style_css.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/cr_elements/md_select_css.m.js';
import './print_preview_shared_css.js';
diff --git a/chromium/chrome/browser/resources/print_preview/ui/app.js b/chromium/chrome/browser/resources/print_preview/ui/app.js
index 65b0cbff83e..c3f930bcb85 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/app.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/app.js
@@ -11,7 +11,6 @@ import {assert} from 'chrome://resources/js/assert.m.js';
import {isMac, isWindows} from 'chrome://resources/js/cr.m.js';
import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {hasKeyModifiers} from 'chrome://resources/js/util.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -116,17 +115,6 @@ Polymer({
/** @private {number} */
maxSheets_: Number,
-
- // <if expr="chromeos">
- /** @private */
- saveToDriveFlagEnabled_: {
- type: Boolean,
- value() {
- return loadTimeData.getBoolean('printSaveToDrive');
- },
- readOnly: true,
- },
- // </if>
},
listeners: {
@@ -350,7 +338,6 @@ Polymer({
this.$.sidebar.init(
settings.isInAppKioskMode, settings.printerName,
settings.serializedDefaultDestinationSelectionRulesStr,
- settings.userAccounts || null, settings.syncAvailable,
settings.pdfPrinterDisabled, settings.isDriveMounted || false);
this.destinationsManaged_ = settings.destinationsManaged;
this.isInKioskAutoPrintMode_ = settings.isInKioskAutoPrintMode;
@@ -586,7 +573,7 @@ Polymer({
* @private
*/
onPrintFailed_(httpError) {
- console.error('Printing failed with error code ' + httpError);
+ console.warn('Printing failed with error code ' + httpError);
this.error_ = Error.PRINT_FAILED;
this.$.state.transitTo(State.FATAL_ERROR);
},
@@ -629,11 +616,11 @@ Polymer({
this.error_ = Error.CLOUD_PRINT_ERROR;
this.$.state.transitTo(State.FATAL_ERROR);
if (event.detail.status === 200) {
- console.error(
+ console.warn(
'Google Cloud Print Error: ' +
`(${event.detail.errorCode}) ${event.detail.message}`);
} else {
- console.error(
+ console.warn(
'Google Cloud Print Error: ' +
`HTTP status ${event.detail.status}`);
}
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.html b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.html
index df858712d3b..920f646f064 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.html
@@ -33,9 +33,4 @@
$i18n{cancel}
</cr-button>
</div>
- <template is="dom-if" if="[[activeUser]]">
- <print-preview-invitation-promo slot="footer" active-user="[[activeUser]]"
- invitation-store="[[invitationStore]]" metrics="[[metrics_]]">
- </print-preview-invitation-promo>
- </template>
</cr-dialog>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.js b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.js
index 6086c40f17f..375214dbd4f 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog.js
@@ -14,7 +14,6 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import '../print_preview_utils.js';
import './destination_dialog_css.js';
import './destination_list.js';
-import './invitation_promo.js';
import './print_preview_search_box.js';
import './print_preview_shared_css.js';
import './print_preview_vars_css.js';
@@ -29,7 +28,6 @@ import {beforeNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/p
import {Destination} from '../data/destination.js';
import {DestinationStore} from '../data/destination_store.js';
-import {InvitationStore} from '../data/invitation_store.js';
import {Metrics, MetricsContext} from '../metrics.js';
import {NativeLayerImpl} from '../native_layer.js';
@@ -47,9 +45,6 @@ Polymer({
observer: 'onDestinationStoreSet_',
},
- /** @type {?InvitationStore} */
- invitationStore: Object,
-
activeUser: {
type: String,
observer: 'onActiveUserChange_',
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.html b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.html
index 742a53d029e..47f41d28ebf 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.html
@@ -66,9 +66,4 @@
$i18n{cancel}
</cr-button>
</div>
- <template is="dom-if" if="[[activeUser]]">
- <print-preview-invitation-promo slot="footer" active-user="[[activeUser]]"
- invitation-store="[[invitationStore]]" metrics="[[metrics_]]">
- </print-preview-invitation-promo>
- </template>
</cr-dialog>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.js b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.js
index 735554b6aec..6242ca32475 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_dialog_cros.js
@@ -15,7 +15,6 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import '../print_preview_utils.js';
import './destination_dialog_css.js';
import './destination_list.js';
-import './invitation_promo.js';
import './print_preview_search_box.js';
import './print_preview_shared_css.js';
import './print_preview_vars_css.js';
@@ -32,7 +31,6 @@ import {beforeNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/p
import {Destination} from '../data/destination.js';
import {DestinationStore} from '../data/destination_store.js';
-import {InvitationStore} from '../data/invitation_store.js';
import {PrintServerStore} from '../data/print_server_store.js';
import {Metrics, MetricsContext} from '../metrics.js';
import {NativeLayerImpl} from '../native_layer.js';
@@ -55,9 +53,6 @@ Polymer({
observer: 'onDestinationStoreSet_',
},
- /** @type {?InvitationStore} */
- invitationStore: Object,
-
activeUser: {
type: String,
observer: 'onActiveUserChange_',
@@ -96,15 +91,6 @@ Polymer({
value: null,
},
- /** @private */
- saveToDriveFlagEnabled_: {
- type: Boolean,
- value() {
- return loadTimeData.getBoolean('printSaveToDrive');
- },
- readOnly: true,
- },
-
/** @private {boolean} */
isSingleServerFetchingMode_: {
type: Boolean,
@@ -247,17 +233,14 @@ Polymer({
* @private
*/
getDestinationList_() {
- const destinations = this.destinationStore.destinations(this.activeUser);
- // When |saveToDriveFlagEnabled_| is true, we don't want to show a
- // 'Save to Drive' option in the destination dialog.
- if (this.saveToDriveFlagEnabled_) {
- return destinations.filter(
- destination => destination.id !== Destination.GooglePromotedId.DOCS &&
- destination.id !==
- Destination.GooglePromotedId.SAVE_TO_DRIVE_CROS);
- }
-
- return destinations;
+ // Filter out the 'Save to Drive' option so it is not shown in the
+ // list of available options.
+ return this.destinationStore.destinations(this.activeUser)
+ .filter(
+ destination =>
+ destination.id !== Destination.GooglePromotedId.DOCS &&
+ destination.id !==
+ Destination.GooglePromotedId.SAVE_TO_DRIVE_CROS);
},
/** @private */
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select.html b/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
index 6d3d49c902e..4769176b955 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
@@ -20,10 +20,6 @@
<option value="[[pdfDestinationKey_]]" hidden$="[[pdfPrinterDisabled]]">
$i18n{printToPDF}
</option>
- <option value="[[driveDestinationKey]]"
- hidden$="[[!driveDestinationKey]]">
- $i18n{printToGoogleDrive}
- </option>
<option value="noDestinations"
hidden$="[[!noDestinations]]" selected$="[[noDestinations]]">
$i18n{noDestinationsMessage}
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select.js b/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
index 5ca517fe59e..ebd291efda0 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
@@ -46,8 +46,6 @@ Polymer({
disabled: Boolean,
- driveDestinationKey: String,
-
loaded: Boolean,
noDestinations: Boolean,
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js
index e3de2d5f66c..bcfeeae05ab 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js
@@ -101,15 +101,6 @@ Polymer({
computed: 'computeIsCurrentDestinationCrosLocal_(destination)',
reflectToAttribute: true,
},
-
- /** @private */
- saveToDriveFlagEnabled_: {
- type: Boolean,
- value() {
- return loadTimeData.getBoolean('printSaveToDrive');
- },
- readOnly: true,
- },
},
/** @private {!IronMetaElement} */
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
index b8af9cfc655..4d416935376 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
@@ -8,8 +8,7 @@
<template is="dom-if" if="[[!cloudPrintDisabled_]]">
<print-preview-user-manager id="userManager" active-user="{{activeUser_}}"
cloud-print-disabled="[[cloudPrintDisabled_]]"
- users="{{users_}}" destination-store="[[destinationStore_]]"
- invitation-store="[[invitationStore_]]">
+ users="{{users_}}" destination-store="[[destinationStore_]]">
</print-preview-user-manager>
</template>
<if expr="not chromeos">
@@ -18,7 +17,6 @@
destination="[[destination]]"
disabled="[[shouldDisableDropdown_(
destinationState, state, disabled)]]"
- drive-destination-key="[[driveDestinationKey_]]"
loaded="[[loaded_]]"
no-destinations="[[noDestinations_]]"
pdf-printer-disabled="[[pdfPrinterDisabled_]]"
@@ -29,7 +27,6 @@
<template>
<print-preview-destination-dialog
destination-store="[[destinationStore_]]"
- invitation-store="[[invitationStore_]]"
recent-destination-list="[[recentDestinationList_]]"
active-user="[[activeUser_]]" users="[[users_]]"
current-destination-account="[[destination.account]]"
@@ -55,7 +52,6 @@
<template>
<print-preview-destination-dialog-cros
destination-store="[[destinationStore_]]"
- invitation-store="[[invitationStore_]]"
recent-destination-list="[[recentDestinationList_]]"
active-user="[[activeUser_]]" users="[[users_]]"
current-destination-account="[[destination.account]]"
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
index b39d8efb8ce..da98d8f12e2 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
@@ -38,7 +38,6 @@ import {SAVE_TO_DRIVE_CROS_DESTINATION_KEY} from '../data/destination.js';
// </if>
import {getPrinterTypeForDestination, PrinterType} from '../data/destination_match.js';
import {DestinationErrorType, DestinationStore} from '../data/destination_store.js';
-import {InvitationStore} from '../data/invitation_store.js';
import {Error, State} from '../data/state.js';
import {SettingsBehavior} from './settings_behavior.js';
@@ -128,13 +127,13 @@ Polymer({
/** @private {!Array<!Destination>} */
displayedDestinations_: Array,
+ // <if expr="chromeos">
/** @private {string} */
driveDestinationKey_: {
type: String,
value: '',
},
- // <if expr="chromeos">
hasPinSetting_: {
type: Boolean,
computed: 'computeHasPinSetting_(settings.pin.available)',
@@ -142,9 +141,6 @@ Polymer({
},
// </if>
- /** @private {?InvitationStore} */
- invitationStore_: Object,
-
/** @private {boolean} */
isDialogOpen_: {
type: Boolean,
@@ -178,15 +174,6 @@ Polymer({
},
readOnly: true,
},
-
- /** @private */
- saveToDriveFlagEnabled_: {
- type: Boolean,
- value() {
- return loadTimeData.getBoolean('printSaveToDrive');
- },
- readOnly: true,
- },
// </if>
},
@@ -230,28 +217,11 @@ Polymer({
/** @override */
detached() {
- if (!this.cloudPrintDisabled_) {
- this.invitationStore_.resetTracker();
- }
this.destinationStore_.resetTracker();
this.tracker_.removeAll();
},
/** @private */
- updateDriveDestination_() {
- let key = createDestinationKey(
- Destination.GooglePromotedId.DOCS, DestinationOrigin.COOKIES,
- this.activeUser_);
- // <if expr="chromeos">
- if (this.saveToDriveFlagEnabled_) {
- key = SAVE_TO_DRIVE_CROS_DESTINATION_KEY;
- }
- // </if>
- this.driveDestinationKey_ =
- this.destinationStore_.getDestinationByKey(key) ? key : '';
- },
-
- /** @private */
onActiveUserChanged_() {
this.updateDropdownDestinations_();
@@ -294,6 +264,32 @@ Polymer({
this.destinationStore_.selectDefaultDestination();
},
+ filterRecentDestinations_(recentDestinations) {
+ let filteredDestinations = recentDestinations;
+ // Remove unsupported privet printers from the sticky settings,
+ // to free up these spots for supported printers.
+ // TODO(rbpotter): Remove this logic a milestone after the policy and flag
+ // have been removed.
+ if (!loadTimeData.getBoolean('forceEnablePrivetPrinting')) {
+ filteredDestinations = recentDestinations.filter(d => {
+ return d.origin !== DestinationOrigin.PRIVET;
+ });
+ }
+
+ // <if expr="chromeos">
+ // Remove Cloud Print Drive destination. The Chrome OS version will always
+ // be shown in the dropdown and is still supported.
+ filteredDestinations = filteredDestinations.filter(d => {
+ return d.id !== Destination.GooglePromotedId.DOCS;
+ });
+ // </if>
+
+ if (filteredDestinations.length !== recentDestinations.length) {
+ this.setSetting('recentDestinations', filteredDestinations);
+ }
+ return filteredDestinations;
+ },
+
/**
* @param {string} defaultPrinter The system default printer ID.
* @param {boolean} pdfPrinterDisabled Whether the PDF printer is disabled.
@@ -301,28 +297,26 @@ Polymer({
on Chrome OS.
* @param {string} serializedDefaultDestinationRulesStr String with rules
* for selecting a default destination.
- * @param {?Array<string>} userAccounts The signed in user accounts.
- * @param {boolean} syncAvailable Whether sync is available. Used to
- * determine whether to wait for user info updates from the handler, or
- * to always send requests to the Google Cloud Print server.
*/
init(
defaultPrinter, pdfPrinterDisabled, isDriveMounted,
- serializedDefaultDestinationRulesStr, userAccounts, syncAvailable) {
+ serializedDefaultDestinationRulesStr) {
const cloudPrintInterface = CloudPrintInterfaceImpl.getInstance();
this.pdfPrinterDisabled_ = pdfPrinterDisabled;
let recentDestinations =
/** @type {!Array<!RecentDestination>} */ (
this.getSettingValue('recentDestinations'));
+ // <if expr="chromeos">
+ this.driveDestinationKey_ =
+ isDriveMounted ? SAVE_TO_DRIVE_CROS_DESTINATION_KEY : '';
+ // </if>
if (cloudPrintInterface.isConfigured()) {
this.cloudPrintDisabled_ = false;
this.destinationStore_.setCloudPrintInterface(cloudPrintInterface);
- this.invitationStore_ = new InvitationStore();
- this.invitationStore_.setCloudPrintInterface(cloudPrintInterface);
beforeNextRender(this, () => {
- this.shadowRoot.querySelector('#userManager')
- .initUserAccounts(userAccounts, syncAvailable);
+ this.shadowRoot.querySelector('#userManager').initUserAccounts();
+ recentDestinations = this.filterRecentDestinations_(recentDestinations);
recentDestinations = recentDestinations.slice(
0, this.getRecentDestinationsDisplayCount_(recentDestinations));
this.destinationStore_.init(
@@ -332,20 +326,7 @@ Polymer({
return;
}
- // Remove unsupported privet printers from the sticky settings,
- // to free up these spots for supported printers.
- // TODO (rbpotter): Remove this logic a milestone after the policy and flag
- // have been removed.
- if (!loadTimeData.getBoolean('forceEnablePrivetPrinting')) {
- const filteredRecentDestinations = recentDestinations.filter(d => {
- return d.origin !== DestinationOrigin.PRIVET;
- });
- if (filteredRecentDestinations.length !== recentDestinations.length) {
- this.setSetting('recentDestinations', filteredRecentDestinations);
- recentDestinations = filteredRecentDestinations;
- }
- }
-
+ recentDestinations = this.filterRecentDestinations_(recentDestinations);
recentDestinations = recentDestinations.slice(
0, this.getRecentDestinationsDisplayCount_(recentDestinations));
this.destinationStore_.init(
@@ -459,8 +440,7 @@ Polymer({
}
// </if>
- return destination.id === Destination.GooglePromotedId.SAVE_AS_PDF ||
- destination.id === Destination.GooglePromotedId.DOCS;
+ return destination.id === Destination.GooglePromotedId.SAVE_AS_PDF;
},
/** @private */
@@ -547,7 +527,6 @@ Polymer({
}
this.displayedDestinations_ = updatedDestinations;
- this.updateDriveDestination_();
},
/**
@@ -589,9 +568,6 @@ Polymer({
const value = e.detail;
if (value === 'seeMore') {
this.destinationStore_.startLoadAllDestinations();
- if (this.activeUser_) {
- this.invitationStore_.startLoadingInvitations(this.activeUser_);
- }
this.$.destinationDialog.get().show();
this.lastUser_ = this.activeUser_;
this.isDialogOpen_ = true;
@@ -609,7 +585,6 @@ Polymer({
assert(!this.cloudPrintDisabled_);
this.shadowRoot.querySelector('#userManager')
.updateActiveUser(e.detail, true);
- this.updateDriveDestination_();
},
/** @private */
diff --git a/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.html b/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.html
deleted file mode 100644
index e66707cdcfa..00000000000
--- a/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<style include="print-preview-shared action-link md-select cr-hidden-style throbber">
- :host {
- align-items: center;
- background: rgb(248, 249, 250);
- color: var(--cr-primary-text-color);
- display: flex;
- flex-direction: column;
- padding: 16px 20px;
- text-align: center;
- }
-
- @media (prefers-color-scheme: dark) {
- :host {
- background: rgb(50, 54, 57);
- }
- }
-
- :host([is-hidden_]) {
- display: none;
- }
-
- #buttons {
- display: flex;
- padding: 12px 0;
- }
-
- cr-button {
- margin: 0 4px;
- }
-
- @media (prefers-color-scheme: light) {
- cr-button {
- background-color: white;
- }
- }
-
- #details {
- color: var(--cr-secondary-text-color);
- font-size: calc(10 / 13 * 1em);
- font-weight: 500;
- }
-</style>
-<div inner-h-t-m-l="[[getInvitationText_(invitation_)]]"></div>
-<div id="buttons">
- <cr-button on-click="onAcceptClick_">
- [[getAcceptButtonText_(invitation_)]]
- </cr-button>
- <cr-button on-click="onRejectClick_">$i18n{reject}</cr-button>
- <div id="invitation-process-throbber" class="throbber" hidden></div>
-</div>
-<div id="details">$i18nRaw{registerPrinterInformationMessage}</div>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.js b/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.js
deleted file mode 100644
index 820fba2469f..00000000000
--- a/chromium/chrome/browser/resources/print_preview/ui/invitation_promo.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/hidden_style_css.m.js';
-import 'chrome://resources/cr_elements/shared_vars_css.m.js';
-import 'chrome://resources/js/action_link.js';
-import 'chrome://resources/cr_elements/action_link_css.m.js';
-import './print_preview_shared_css.js';
-import './print_preview_vars_css.js';
-import './throbber_css.js';
-import '../strings.m.js';
-
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
-import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {Invitation} from '../data/invitation.js';
-import {InvitationStore} from '../data/invitation_store.js';
-import {Metrics, MetricsContext} from '../metrics.js';
-
-Polymer({
- is: 'print-preview-invitation-promo',
-
- _template: html`{__html_template__}`,
-
- behaviors: [I18nBehavior],
-
- properties: {
- activeUser: {
- type: String,
- observer: 'onActiveUserChanged_',
- },
-
- /** @type {?InvitationStore} */
- invitationStore: Object,
-
- /** @type {!MetricsContext} */
- metrics: Object,
-
- /** @private {?Invitation} */
- invitation_: {
- type: Object,
- value: null,
- },
-
- /** @private {boolean} */
- isHidden_: {
- type: Boolean,
- reflectToAttribute: true,
- computed: 'computeIsHidden_(invitation_)',
- }
- },
-
- /** @private {!EventTracker} */
- tracker_: new EventTracker(),
-
- /** @private */
- attached() {
- const invitationStore = assert(this.invitationStore);
- this.tracker_.add(
- invitationStore, InvitationStore.EventType.INVITATION_SEARCH_DONE,
- this.updateInvitations_.bind(this));
- this.tracker_.add(
- invitationStore, InvitationStore.EventType.INVITATION_PROCESSED,
- this.updateInvitations_.bind(this));
- this.updateInvitations_();
- },
-
- /** @override */
- detached() {
- this.tracker_.removeAll();
- },
-
- /**
- * @return {boolean}
- * @private
- */
- computeIsHidden_() {
- return !this.invitation_;
- },
-
- /** @private */
- onActiveUserChanged_() {
- if (!this.activeUser) {
- return;
- }
-
- this.invitationStore.startLoadingInvitations(this.activeUser);
- },
-
- /**
- * Updates printer sharing invitations UI.
- * @private
- */
- updateInvitations_() {
- const invitations = this.activeUser ?
- this.invitationStore.invitations(this.activeUser) :
- [];
- if (this.invitation_ !== invitations[0]) {
- this.metrics.record(Metrics.DestinationSearchBucket.INVITATION_AVAILABLE);
- }
- this.invitation_ = invitations.length > 0 ? invitations[0] : null;
- },
-
- /**
- * @return {string} The text show show on the "accept" button in the
- * invitation promo. 'Accept', 'Accept for group', or empty if there is no
- * invitation.
- * @private
- */
- getAcceptButtonText_() {
- if (!this.invitation_) {
- return '';
- }
-
- return this.invitation_.asGroupManager ? this.i18n('acceptForGroup') :
- this.i18n('accept');
- },
-
- /**
- * @return {string} The formatted text to show for the invitation promo.
- * @private
- */
- getInvitationText_() {
- if (!this.invitation_) {
- return '';
- }
-
- if (this.invitation_.asGroupManager) {
- return this.i18nAdvanced('groupPrinterSharingInviteText', {
- substitutions: [
- this.invitation_.sender, this.invitation_.destination.displayName,
- this.invitation_.receiver
- ]
- });
- }
-
- return this.i18nAdvanced('printerSharingInviteText', {
- substitutions:
- [this.invitation_.sender, this.invitation_.destination.displayName]
- });
- },
-
- /** @private */
- onAcceptClick_() {
- this.metrics.record(Metrics.DestinationSearchBucket.INVITATION_ACCEPTED);
- this.invitationStore.processInvitation(assert(this.invitation_), true);
- this.updateInvitations_();
- },
-
- /** @private */
- onRejectClick_() {
- this.metrics.record(Metrics.DestinationSearchBucket.INVITATION_REJECTED);
- this.invitationStore.processInvitation(assert(this.invitation_), false);
- this.updateInvitations_();
- },
-});
diff --git a/chromium/chrome/browser/resources/print_preview/ui/more_settings.html b/chromium/chrome/browser/resources/print_preview/ui/more_settings.html
index d1bda1ab294..abfc5c79d8f 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/more_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/more_settings.html
@@ -18,8 +18,9 @@
:host cr-expand-button {
flex: 1;
- margin-inline-end: calc(var(--print-preview-sidebar-margin) + 6px);
- margin-inline-start: var(--print-preview-sidebar-margin);
+ /* Padding here as cr-expand-button has a background on hover. */
+ padding-inline-end: calc(var(--print-preview-sidebar-margin) + 6px);
+ padding-inline-start: var(--print-preview-sidebar-margin);
--cr-expand-button-size: 28px;
}
diff --git a/chromium/chrome/browser/resources/print_preview/ui/print_preview_search_box.js b/chromium/chrome/browser/resources/print_preview/ui/print_preview_search_box.js
index ebbc6056c40..0dab637e353 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/print_preview_search_box.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/print_preview_search_box.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
import './print_preview_shared_css.js';
-import {CrSearchFieldBehavior} from 'chrome://resources/cr_elements/cr_search_field/cr_search_field_behavior.m.js';
+import {CrSearchFieldBehavior} from 'chrome://resources/cr_elements/cr_search_field/cr_search_field_behavior.js';
import {stripDiacritics} from 'chrome://resources/js/search_highlight_utils.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/chrome/browser/resources/print_preview/ui/scaling_settings.html b/chromium/chrome/browser/resources/print_preview/ui/scaling_settings.html
index eda43e16760..5bc5d0a1106 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/scaling_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/scaling_settings.html
@@ -8,10 +8,12 @@
<option value="[[ScalingValue.DEFAULT]]">
$i18n{optionDefaultScaling}
</option>
- <option value="[[ScalingValue.FIT_TO_PAGE]]" hidden$="[[!isPdf]]">
+ <option value="[[ScalingValue.FIT_TO_PAGE]]" hidden$="[[!isPdf]]"
+ disabled$="[[!isPdf]]">
$i18n{optionFitToPage}
</option>
- <option value="[[ScalingValue.FIT_TO_PAPER]]" hidden$="[[!isPdf]]">
+ <option value="[[ScalingValue.FIT_TO_PAPER]]" hidden$="[[!isPdf]]"
+ disabled$="[[!isPdf]]">
$i18n{optionFitToPaper}
</option>
<option value="[[ScalingValue.CUSTOM]]">
diff --git a/chromium/chrome/browser/resources/print_preview/ui/sidebar.js b/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
index 1e6053e27ac..0f041563fdc 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
@@ -145,15 +145,13 @@ Polymer({
* @param {string} defaultPrinter The system default printer ID.
* @param {string} serializedDestinationSelectionRulesStr String with rules
* for selecting the default destination.
- * @param {?Array<string>} userAccounts The signed in user accounts.
- * @param {boolean} syncAvailable
* @param {boolean} pdfPrinterDisabled Whether the PDF printer is disabled.
* @param {boolean} isDriveMounted Whether Google Drive is mounted. Only used
on Chrome OS.
*/
init(
appKioskMode, defaultPrinter, serializedDestinationSelectionRulesStr,
- userAccounts, syncAvailable, pdfPrinterDisabled, isDriveMounted) {
+ pdfPrinterDisabled, isDriveMounted) {
this.isInAppKioskMode_ = appKioskMode;
pdfPrinterDisabled = this.isInAppKioskMode_ || pdfPrinterDisabled;
// If PDF printing is disabled, then Save to Drive also needs to be disabled
@@ -161,7 +159,7 @@ Polymer({
isDriveMounted = !pdfPrinterDisabled && isDriveMounted;
this.$.destinationSettings.init(
defaultPrinter, pdfPrinterDisabled, isDriveMounted,
- serializedDestinationSelectionRulesStr, userAccounts, syncAvailable);
+ serializedDestinationSelectionRulesStr);
},
/**
diff --git a/chromium/chrome/browser/resources/read_later/app.js b/chromium/chrome/browser/resources/read_later/app.js
index 7433b130ce1..5dcf1a2988c 100644
--- a/chromium/chrome/browser/resources/read_later/app.js
+++ b/chromium/chrome/browser/resources/read_later/app.js
@@ -9,17 +9,16 @@ import 'chrome://resources/cr_elements/mwb_shared_style.js';
import 'chrome://resources/cr_elements/mwb_shared_vars.js';
import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
import './read_later_shared_style.js';
+import './strings.m.js';
import {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {listenOnce} from 'chrome://resources/js/util.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {listenOnce} from 'chrome://resources/js/util.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ReadLaterApiProxy, ReadLaterApiProxyImpl} from './read_later_api_proxy.js';
import {ReadLaterItemElement} from './read_later_item.js';
-import './strings.js';
-
/** @type {!Set<string>} */
const navigationKeys = new Set(['ArrowDown', 'ArrowUp']);
diff --git a/chromium/chrome/browser/resources/read_later/side_panel/side_panel.html b/chromium/chrome/browser/resources/read_later/side_panel/side_panel.html
index 17b4023ebf5..98e15f47086 100644
--- a/chromium/chrome/browser/resources/read_later/side_panel/side_panel.html
+++ b/chromium/chrome/browser/resources/read_later/side_panel/side_panel.html
@@ -3,15 +3,23 @@
<head>
<meta charset="utf-8">
<title>Side panel</title>
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
<style>
html,
body {
- width: 320px;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ }
+
+ body {
+ overflow: auto;
}
</style>
</head>
<body>
- <h1>Side panel</h1>
+ <side-panel></side-panel>
<script type="module" src="side_panel/side_panel.js"></script>
</script>
</body>
diff --git a/chromium/chrome/browser/resources/read_later/side_panel/side_panel.js b/chromium/chrome/browser/resources/read_later/side_panel/side_panel.js
index e69de29bb2d..ce927b470c6 100644
--- a/chromium/chrome/browser/resources/read_later/side_panel/side_panel.js
+++ b/chromium/chrome/browser/resources/read_later/side_panel/side_panel.js
@@ -0,0 +1,336 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import '../read_later_item.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import 'chrome://resources/cr_elements/mwb_shared_style.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ReadLaterApiProxyImpl} from '../read_later_api_proxy.js';
+
+const readLaterApi = ReadLaterApiProxyImpl.getInstance();
+
+class SidePanel extends PolymerElement {
+ static get is() {
+ return 'side-panel';
+ }
+
+ static get template() {
+ return html`
+ <style include="mwb-shared-style cr-hidden-style">
+ #header {
+ align-items: center;
+ display: flex;
+ padding: 16px 0 4px 8px;
+ }
+
+ #searchContainer {
+ background: #f1f3f4;
+ border-radius: 8px;
+ display: flex;
+ flex: 1;
+ height: 36px;
+ }
+
+ cr-icon-button {
+ margin: 0;
+ }
+
+ input {
+ appearance: none;
+ background: transparent;
+ border: 0;
+ display: block;
+ flex: 1;
+ height: 100%;
+ line-height: 36px;
+ outline: none;
+ }
+
+ #tabs {
+ display: flex;
+ height: 48px;
+ position: relative;
+ width: 100%;
+ }
+
+ #tabs a {
+ cursor: pointer;
+ display: block;
+ flex: 1;
+ line-height: 48px;
+ text-align: center;
+ }
+
+ #tabs span {
+ position: relative;
+ }
+
+ #tabs a[active] span::after {
+ content: '';
+ display: block;
+ background: #1A73E8;
+ bottom: -8px;
+ border-radius: 3px 3px 0 0;
+ height: 3px;
+ left: 2px;
+ position: absolute;
+ right: 2px;
+ }
+
+ #tabsBorder {
+ background: #dadce0;
+ bottom: 8px;
+ height: 1px;
+ position: absolute;
+ width: 100%;
+ }
+
+ .tab {
+ display: none;
+ }
+
+ .tab[active] {
+ display: block;
+ }
+
+ h2 {
+ font-size: 11px;
+ font-weight: normal;
+ padding: 16px 16px 8px 16px;
+ text-transform: uppercase;
+ }
+ </style>
+
+ <div id="header">
+ <div id="searchContainer">
+ <cr-icon-button iron-icon="cr:search"></cr-icon-button>
+ <input value="{{searchQuery_::input}}">
+ </div>
+ <cr-icon-button iron-icon="cr:close" on-click="close_"></cr-icon-button>
+ </div>
+
+ <div id="tabs">
+ <template is="dom-repeat" items="[[tabs_]]">
+ <a on-click="activateTab_"
+ active$="[[isActiveTab_(item.id, activeTab_)]]">
+ <span>[[item.label]]</span>
+ </a>
+ </template>
+ <div id="tabsBorder"></div>
+ </div>
+
+ <div id="readingList" class="tab"
+ active$="[[isActiveTab_('readingList', activeTab_)]]">
+ <h2>Unread</h2>
+ <template is="dom-repeat" items="[[unreadItems_]]">
+ <read-later-item class="mwb-list-item" data="[[item]]"
+ hidden$="[[shouldHideItem_(item.title, searchQuery_)]]">
+ </read-later-item>
+ </template>
+ <h2>Read</h2>
+ <template is="dom-repeat" items="[[readItems_]]">
+ <read-later-item class="mwb-list-item" data="[[item]]"
+ hidden$="[[shouldHideItem_(item.title, searchQuery_)]]">
+ </read-later-item>
+ </template>
+ </div>
+
+ <div id="bookmarks" class="tab"
+ active$="[[isActiveTab_('bookmarks', activeTab_)]]">
+ <template is="dom-repeat" items="[[bookmarkFolders_]]">
+ <bookmark-folder folder="[[item]]"
+ search-query="[[searchQuery_]]"></bookmark-folder>
+ </template>
+ </div>
+ `;
+ }
+
+ static get properties() {
+ return {
+ unreadItems_: {
+ type: Array,
+ value: () => [],
+ },
+ readItems_: {
+ type: Array,
+ value: () => [],
+ },
+ bookmarkFolders_: {
+ type: Array,
+ value: () => [],
+ },
+ tabs_: {
+ type: Array,
+ value: () => {
+ return [
+ {
+ id: 'readingList',
+ label: 'Reading list',
+ },
+ {
+ id: 'bookmarks',
+ label: 'Bookmarks',
+ },
+ ];
+ },
+ },
+ activeTab_: {
+ type: Object,
+ value: () => {},
+ },
+ searchQuery_: {
+ type: String,
+ value: '',
+ }
+ };
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this.activeTab_ = this.tabs_[0];
+ readLaterApi.getReadLaterEntries().then(({entries}) => {
+ this.unreadItems_ = entries.unreadEntries;
+ this.readItems_ = entries.readEntries;
+ });
+ readLaterApi.getCallbackRouter().itemsChanged.addListener(
+ items => this.onReadLaterItemsUpdated_(items));
+ chrome.bookmarks.getTree(([{children}]) => {
+ this.bookmarkFolders_ = children;
+ });
+ }
+
+ activateTab_(event) {
+ this.activeTab_ = event.model.item;
+ }
+
+ close_() {
+ readLaterApi.closeUI();
+ }
+
+ isActiveTab_(tabId) {
+ return this.activeTab_.id === tabId;
+ }
+
+ onReadLaterItemsUpdated_(items) {
+ this.unreadItems_ = items.unreadEntries;
+ this.readItems_ = items.readEntries;
+ }
+
+ shouldHideItem_(title) {
+ if (this.searchQuery_.length === 0) {
+ return false;
+ }
+
+ return title.toLowerCase().indexOf(this.searchQuery_.toLowerCase()) === -1;
+ }
+}
+customElements.define(SidePanel.is, SidePanel);
+
+class BookmarkFolder extends PolymerElement {
+ static get is() {
+ return 'bookmark-folder';
+ }
+
+ static get template() {
+ return html`
+ <style include="cr-hidden-style">
+ </style>
+ <template is="dom-repeat" items="[[folder.children]]">
+ <template is="dom-if" if="[[item.children]]">
+ <bookmark-folder folder="[[item]]" search-query="[[searchQuery]]">
+ </bookmark-folder>
+ </template>
+ <template is="dom-if" if="[[!item.children]]">
+ <bookmark-item item="[[item]]"
+ hidden$="[[shouldHideItem_(item.title, searchQuery)]]">
+ </bookmark-item>
+ </template>
+ </template>
+ `;
+ }
+
+ static get properties() {
+ return {
+ folder: {
+ type: Object,
+ value: () => {},
+ },
+ searchQuery: {
+ type: String,
+ value: () => '',
+ },
+ };
+ }
+
+ shouldHideItem_(title) {
+ if (this.searchQuery.length === 0) {
+ return false;
+ }
+
+ return title.toLowerCase().indexOf(this.searchQuery.toLowerCase()) === -1;
+ }
+}
+customElements.define(BookmarkFolder.is, BookmarkFolder);
+
+class BookmarkItem extends PolymerElement {
+ static get is() {
+ return 'bookmark-item';
+ }
+
+ static get template() {
+ return html`
+ <style>
+ :host {
+ align-items: center;
+ cursor: pointer;
+ display: flex;
+ height: 40px;
+ line-height: 40px;
+ overflow: hidden;
+ padding: 0 16px;
+ white-space: nowrap;
+ }
+
+ :host(:hover) {
+ background: var(--mwb-list-item-hover-background-color);
+ }
+
+ #favicon {
+ width: 16px;
+ height: 16px;
+ margin-right: 16px;
+ }
+
+ #title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ </style>
+
+ <img id="favicon" src="chrome://favicon/[[item.url]]">
+ <div id="title">[[item.title]]</div>
+ `;
+ }
+
+ static get properties() {
+ return {
+ item: {
+ type: Object,
+ value: () => {},
+ },
+ };
+ }
+
+ constructor() {
+ super();
+ this.addEventListener('click', () => this.onClick_());
+ }
+
+ onClick_() {
+ chrome.tabs.create({url: this.item.url});
+ }
+}
+customElements.define(BookmarkItem.is, BookmarkItem);
diff --git a/chromium/chrome/browser/resources/sandbox_internals/sandbox_internals_win.js b/chromium/chrome/browser/resources/sandbox_internals/sandbox_internals_win.js
index 2416dccbf3c..8e77245b860 100644
--- a/chromium/chrome/browser/resources/sandbox_internals/sandbox_internals_win.js
+++ b/chromium/chrome/browser/resources/sandbox_internals/sandbox_internals_win.js
@@ -284,6 +284,59 @@ class DecodeMitigations {
const DECODE_MITIGATIONS = new DecodeMitigations();
+const WELL_KNOWN_SIDS = {
+ 'S-1-15-3-1': 'InternetClient',
+ 'S-1-15-3-2': 'InternetClientServer',
+ 'S-1-15-3-3': 'PrivateNetworkClientServer',
+ 'S-1-15-3-4': 'PicturesLibrary',
+ 'S-1-15-3-5': 'VideosLibrary',
+ 'S-1-15-3-6': 'MusicLibrary',
+ 'S-1-15-3-7': 'DocumentsLibrary',
+ 'S-1-15-3-8': 'EnterpriseAuthentication',
+ 'S-1-15-3-9': 'SharedUserCertificates',
+ 'S-1-15-3-10': 'RemovableStorage',
+ 'S-1-15-3-11': 'Appointments',
+ 'S-1-15-3-12': 'Contacts',
+ 'S-1-15-3-1024-3424233489-972189580-2057154623-747635277-1604371224-316187997-3786583170-1043257646':
+ 'chromeInstallFiles',
+ 'S-1-15-3-1024-1502825166-1963708345-2616377461-2562897074-4192028372-3968301570-1997628692-1435953622':
+ 'lpacAppExperience',
+ 'S-1-15-3-1024-2302894289-466761758-1166120688-1039016420-2430351297-4240214049-4028510897-3317428798':
+ 'lpacChromeInstallFiles',
+ 'S-1-15-3-1024-2405443489-874036122-4286035555-1823921565-1746547431-2453885448-3625952902-991631256':
+ 'lpacCom',
+ 'S-1-15-3-1024-3203351429-2120443784-2872670797-1918958302-2829055647-4275794519-765664414-2751773334':
+ 'lpacCryptoServices',
+ 'S-1-15-3-1024-126078593-3658686728-1984883306-821399696-3684079960-564038680-3414880098-3435825201':
+ 'lpacEnterprisePolicyChangeNotifications',
+ 'S-1-15-3-1024-1788129303-2183208577-3999474272-3147359985-1757322193-3815756386-151582180-1888101193':
+ 'lpacIdentityServices',
+ 'S-1-15-3-1024-3153509613-960666767-3724611135-2725662640-12138253-543910227-1950414635-4190290187':
+ 'lpacInstrumentation',
+ 'S-1-15-3-1024-1692970155-4054893335-185714091-3362601943-3526593181-1159816984-2199008581-497492991':
+ 'lpacMedia',
+ 'S-1-15-3-1024-220022770-701261984-3991292956-4208751020-2918293058-3396419331-1700932348-2078364891':
+ 'lpacPnPNotifications',
+ 'S-1-15-3-1024-528118966-3876874398-709513571-1907873084-3598227634-3698730060-278077788-3990600205':
+ 'lpacServicesManagement',
+ 'S-1-15-3-1024-1864111754-776273317-3666925027-2523908081-3792458206-3582472437-4114419977-1582884857':
+ 'lpacSessionManagement',
+ 'S-1-15-3-1024-1065365936-1281604716-3511738428-1654721687-432734479-3232135806-4053264122-3456934681':
+ 'registryRead',
+};
+
+/**
+ * Maps capabilities to well known values.
+ * @param {string}
+ * @return {string}
+ */
+function mapCapabilitySid(sid) {
+ if (WELL_KNOWN_SIDS[sid]) {
+ return WELL_KNOWN_SIDS[sid];
+ }
+ return sid;
+}
+
/**
* Adds a row to the sandbox-status table.
* @param {!Array<Node>} args
@@ -365,6 +418,45 @@ function makeMitigationEntry(platformMitigations) {
}
/**
+ * Formats a lowbox sid or appcontainer configuration (policies can only
+ * have one or the other).
+ * @param {PolicyDiagnostic} policy
+ * @return {Node}
+ */
+function makeLowboxAcEntry(policy) {
+ if (policy.lowboxSid) {
+ // Lowbox token does not have capabilities but should match AC entries.
+ const fixed = document.createElement('div');
+ fixed.classList.add('mitigations');
+ fixed.innerText = policy.lowboxSid;
+ const col = document.createElement('td');
+ col.appendChild(fixed);
+ return col;
+ }
+ if (policy.appContainerSid) {
+ // AC has identifying SID plus lockdown capabilities.
+ const expander = {
+ expanded: false,
+ caps: policy.appContainerCapabilities,
+ onClick: function(col) {
+ this.expanded = !this.expanded;
+ col.innerText = this.getText();
+ return this.expanded;
+ },
+ getText: function() {
+ if (this.expanded) {
+ return this.caps.map(mapCapabilitySid).sort().join('\n');
+ } else {
+ return '';
+ }
+ }
+ };
+ return makeExpandableEntry(policy.appContainerSid, expander);
+ }
+ return makeTextEntry('');
+}
+
+/**
* Adds policy information for a process to the sandbox-status table.
* @param {number} pid
* @param {string} type
@@ -381,9 +473,11 @@ function addRowForProcess(pid, type, name, sandbox, policy) {
].map(makeTextEntry);
// Clickable mitigations item.
entries.push(makeMitigationEntry(policy.platformMitigations));
+ entries.push(makeLowboxAcEntry(policy));
addRow(entries);
} else {
- addRow([pid, type, name, 'Not Sandboxed', '', '', ''].map(makeTextEntry));
+ addRow(
+ [pid, type, name, 'Not Sandboxed', '', '', '', ''].map(makeTextEntry));
}
}
@@ -400,7 +494,8 @@ function onGetSandboxDiagnostics(results) {
// Titles.
addRow([
- 'Process', 'Type', 'Name', 'Sandbox', 'Lockdown', 'Integrity', 'Mitigations'
+ 'Process', 'Type', 'Name', 'Sandbox', 'Lockdown', 'Integrity',
+ 'Mitigations', 'Lowbox/AppContainer'
].map(makeTextEntry));
// Browser Processes.
diff --git a/chromium/chrome/browser/resources/settings/BUILD.gn b/chromium/chrome/browser/resources/settings/BUILD.gn
index b752f26146d..cdf4406a57c 100644
--- a/chromium/chrome/browser/resources/settings/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/BUILD.gn
@@ -8,9 +8,7 @@ import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/preprocess_if_expr.gni")
import("//tools/polymer/html_to_js.gni")
-import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("//ui/webui/webui_features.gni")
import("../tools/optimize_webui.gni")
import("settings.gni")
@@ -101,7 +99,9 @@ preprocess_if_expr("preprocess") {
out_manifest = "$target_gen_dir/$preprocess_manifest"
in_files = [
"a11y_page/captions_browser_proxy.js",
+ "about_page/about_page_browser_proxy.js",
"appearance_page/appearance_browser_proxy.js",
+ "appearance_page/fonts_browser_proxy.js",
"autofill_page/merge_exceptions_store_copies_behavior.js",
"autofill_page/merge_passwords_store_copies_behavior.js",
"autofill_page/multi_store_exception_entry.js",
@@ -112,23 +112,41 @@ preprocess_if_expr("preprocess") {
"autofill_page/show_password_behavior.js",
"chrome_cleanup_page/chrome_cleanup_proxy.js",
"clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js",
+ "controls/pref_control_behavior.js",
+ "controls/settings_boolean_control_behavior.js",
"controls/settings_idle_load.js",
"downloads_page/downloads_browser_proxy.js",
"ensure_lazy_loaded.js",
+ "extension_control_browser_proxy.js",
+ "global_scroll_target_behavior.js",
"hats_browser_proxy.js",
"i18n_setup.js",
"incompatible_applications_page/incompatible_applications_browser_proxy.js",
+ "languages_page/languages.js",
+ "languages_page/languages_browser_proxy.js",
"languages_page/languages_settings_metrics_proxy.js",
"lazy_load.js",
+ "lifetime_browser_proxy.js",
"metrics_browser_proxy.js",
"on_startup_page/on_startup_browser_proxy.js",
"on_startup_page/startup_urls_page_browser_proxy.js",
"open_window_proxy.js",
"page_visibility.js",
+ "people_page/sync_browser_proxy.js",
+ "people_page/profile_info_browser_proxy.js",
+ "prefs/prefs_behavior.js",
+ "prefs/prefs.js",
+ "prefs/prefs_types.js",
+ "prefs/pref_util.js",
+ "privacy_page/privacy_page_browser_proxy.js",
"privacy_page/security_keys_browser_proxy.js",
"reset_page/reset_browser_proxy.js",
"route.js",
+ "router.js",
"safety_check_page/safety_check_browser_proxy.js",
+ "search_engines_page/search_engines_browser_proxy.js",
+ "search_settings.js",
+ "setting_id_param_util.js",
"settings.js",
"settings_page/main_page_behavior.js",
"settings_routes.js",
@@ -144,6 +162,7 @@ preprocess_if_expr("preprocess") {
in_files += [
"autofill_page/blocking_request_manager.js",
"languages_page/languages_metrics_proxy.js",
+ "people_page/account_manager_browser_proxy.js",
"site_settings/android_info_browser_proxy.js",
]
} else {
@@ -167,12 +186,11 @@ preprocess_if_expr("preprocess_generated") {
out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
in_files = [
"a11y_page/a11y_page.js",
- "a11y_page/captions_subpage.m.js",
- "about_page/about_page_browser_proxy.m.js",
+ "a11y_page/captions_subpage.js",
+ "a11y_page/live_caption_section.js",
"about_page/about_page.js",
"appearance_page/appearance_fonts_page.js",
"appearance_page/appearance_page.js",
- "appearance_page/fonts_browser_proxy.m.js",
"appearance_page/home_url_input.js",
"autofill_page/autofill_page.js",
"autofill_page/avatar_icon.js",
@@ -204,51 +222,37 @@ preprocess_if_expr("preprocess_generated") {
"clear_browsing_data_dialog/history_deletion_dialog.js",
"clear_browsing_data_dialog/installed_app_checkbox.js",
"clear_browsing_data_dialog/passwords_deletion_dialog.js",
- "controls/controlled_button.m.js",
- "controls/controlled_radio_button.m.js",
- "controls/extension_controlled_indicator.m.js",
- "controls/password_prompt_dialog.m.js",
- "controls/settings_boolean_control_behavior.m.js",
+ "controls/controlled_button.js",
+ "controls/controlled_radio_button.js",
+ "controls/extension_controlled_indicator.js",
+ "controls/password_prompt_dialog.js",
"controls/settings_checkbox.js",
- "controls/settings_dropdown_menu.m.js",
- "controls/pref_control_behavior.m.js",
- "controls/settings_radio_group.m.js",
- "controls/settings_slider.m.js",
- "controls/settings_textarea.m.js",
- "controls/settings_toggle_button.m.js",
+ "controls/settings_dropdown_menu.js",
+ "controls/settings_radio_group.js",
+ "controls/settings_slider.js",
+ "controls/settings_textarea.js",
+ "controls/settings_toggle_button.js",
"downloads_page/downloads_page.js",
- "extension_control_browser_proxy.m.js",
- "global_scroll_target_behavior.m.js",
- "icons.m.js",
- "languages_page/languages.m.js",
- "languages_page/languages_browser_proxy.m.js",
+ "icons.js",
"languages_page/add_languages_dialog.js",
"languages_page/languages_page.js",
"languages_page/languages_subpage.js",
- "lifetime_browser_proxy.m.js",
"settings_menu/settings_menu.js",
"on_startup_page/on_startup_page.js",
"on_startup_page/startup_url_dialog.js",
"on_startup_page/startup_url_entry.js",
"on_startup_page/startup_urls_page.js",
- "people_page/sync_account_control.m.js",
- "people_page/sync_browser_proxy.m.js",
- "people_page/sync_encryption_options.m.js",
+ "people_page/sync_account_control.js",
+ "people_page/sync_encryption_options.js",
"people_page/people_page.js",
- "people_page/profile_info_browser_proxy.m.js",
- "people_page/signout_dialog.m.js",
- "people_page/sync_controls.m.js",
- "people_page/sync_page.m.js",
- "prefs/prefs.m.js",
- "prefs/prefs_behavior.m.js",
- "prefs/prefs_types.m.js",
- "prefs/pref_util.m.js",
+ "people_page/signout_dialog.js",
+ "people_page/sync_controls.js",
+ "people_page/sync_page.js",
"privacy_page/collapse_radio_button.js",
"privacy_page/cookies_page.js",
"privacy_page/do_not_track_toggle.js",
"privacy_page/privacy_page.js",
- "privacy_page/personalization_options.m.js",
- "privacy_page/privacy_page_browser_proxy.m.js",
+ "privacy_page/personalization_options.js",
"privacy_page/secure_dns.js",
"privacy_page/secure_dns_input.js",
"privacy_page/security_page.js",
@@ -262,14 +266,12 @@ preprocess_if_expr("preprocess_generated") {
"reset_page/reset_page.js",
"reset_page/reset_profile_dialog.js",
"reset_page/reset_profile_banner.js",
- "router.m.js",
"safety_check_page/safety_check_child.js",
"safety_check_page/safety_check_extensions_child.js",
"safety_check_page/safety_check_page.js",
"safety_check_page/safety_check_passwords_child.js",
"safety_check_page/safety_check_safe_browsing_child.js",
"safety_check_page/safety_check_updates_child.js",
- "search_engines_page/search_engines_browser_proxy.m.js",
"search_engines_page/omnibox_extension_entry.js",
"search_engines_page/search_engine_dialog.js",
"search_engines_page/search_engine_entry_css.js",
@@ -277,16 +279,14 @@ preprocess_if_expr("preprocess_generated") {
"search_engines_page/search_engines_list.js",
"search_engines_page/search_engines_page.js",
"search_page/search_page.js",
- "search_settings.m.js",
"settings_main/settings_main.js",
- "settings_page/settings_animated_pages.m.js",
- "settings_page/settings_section.m.js",
- "settings_page/settings_subpage.m.js",
+ "settings_page/settings_animated_pages.js",
+ "settings_page/settings_section.js",
+ "settings_page/settings_subpage.js",
"settings_ui/settings_ui.js",
- "setting_id_param_util.m.js",
- "settings_page_css.m.js",
- "settings_shared_css.m.js",
- "settings_vars_css.m.js",
+ "settings_page_css.js",
+ "settings_shared_css.js",
+ "settings_vars_css.js",
"site_favicon.js",
"site_settings/add_site_dialog.js",
"site_settings/all_sites.js",
@@ -329,9 +329,7 @@ preprocess_if_expr("preprocess_generated") {
in_files += [ "languages_page/edit_dictionary_page.js" ]
}
- if (is_chromeos_ash) {
- in_files += [ "people_page/account_manager_browser_proxy.m.js" ]
- } else {
+ if (!is_chromeos_ash) {
if (!is_chromeos_lacros) {
in_files += [
"default_browser_page/default_browser_page.js",
@@ -364,86 +362,6 @@ grit("resources") {
group("closure_compile") {
deps = [
- ":local_resources",
- "a11y_page:closure_compile",
- "about_page:closure_compile",
- "appearance_page:closure_compile",
- "controls:closure_compile",
- "languages_page:closure_compile",
- "people_page:closure_compile",
- "prefs:closure_compile",
- "privacy_page:closure_compile",
- "privacy_sandbox:closure_compile",
- "search_engines_page:closure_compile",
- "settings_page:closure_compile",
- ]
-
- if (is_chromeos_ash) {
- deps += [ "../../../test/data/webui/settings/chromeos:closure_compile" ]
- }
-}
-
-js_type_check("local_resources") {
- uses_legacy_modules = true
- deps = [
- ":extension_control_browser_proxy",
- ":global_scroll_target_behavior",
- ":lifetime_browser_proxy",
- ":router",
- ":search_settings",
- ":setting_id_param_util",
- ]
-}
-
-js_library("extension_control_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("global_scroll_target_behavior") {
- deps = [
- ":router",
- "//ui/webui/resources/js:cr",
- ]
-}
-
-js_library("lifetime_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("router") {
- deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/metrics_private.js" ]
-}
-
-js_library("search_settings") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:search_highlight_utils",
- "//ui/webui/resources/js:util",
- ]
- externs_list = [ "$externs_path/pending_polymer.js" ]
-}
-
-js_library("setting_id_param_util") {
- deps = [
- ":router",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
-# Polymer 3 related rules.
-
-group("closure_compile_module") {
- deps = [
":closure_compile_local_module",
"a11y_page:closure_compile_module",
"about_page:closure_compile_module",
@@ -458,6 +376,7 @@ group("closure_compile_module") {
"people_page:closure_compile_module",
"prefs:closure_compile_module",
"privacy_page:closure_compile_module",
+ "privacy_sandbox:closure_compile",
"reset_page:closure_compile_module",
"safety_check_page:closure_compile_module",
"search_engines_page:closure_compile_module",
@@ -492,19 +411,19 @@ js_type_check("closure_compile_local_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
deps = [
- ":extension_control_browser_proxy.m",
- ":global_scroll_target_behavior.m",
+ ":extension_control_browser_proxy",
+ ":global_scroll_target_behavior",
":hats_browser_proxy",
":i18n_setup",
":lazy_load",
- ":lifetime_browser_proxy.m",
+ ":lifetime_browser_proxy",
":metrics_browser_proxy",
":open_window_proxy",
":page_visibility",
":route",
- ":router.m",
- ":search_settings.m",
- ":setting_id_param_util.m",
+ ":router",
+ ":search_settings",
+ ":setting_id_param_util",
":settings",
":settings_routes",
":site_favicon",
@@ -514,25 +433,23 @@ js_type_check("closure_compile_local_module") {
js_library("settings") {
deps = [
":hats_browser_proxy",
- ":lifetime_browser_proxy.m",
+ ":lifetime_browser_proxy",
":metrics_browser_proxy",
":open_window_proxy",
- "about_page:about_page_browser_proxy.m",
+ "about_page:about_page_browser_proxy",
"autofill_page:multi_store_exception_entry",
"autofill_page:multi_store_password_ui_entry",
"autofill_page:password_manager_proxy",
- "people_page:sync_browser_proxy.m",
- "privacy_page:privacy_page_browser_proxy.m",
+ "people_page:sync_browser_proxy",
+ "privacy_page:privacy_page_browser_proxy",
"safety_check_page:safety_check_browser_proxy",
- "search_engines_page:search_engines_browser_proxy.m",
+ "search_engines_page:search_engines_browser_proxy",
"settings_ui:settings_ui",
]
}
-js_library("extension_control_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/extension_control_browser_proxy.m.js" ]
+js_library("extension_control_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
externs_list = [ "$externs_path/chrome_send.js" ]
}
@@ -540,13 +457,11 @@ js_library("i18n_setup") {
deps = [ "//ui/webui/resources/js:load_time_data.m" ]
}
-js_library("global_scroll_target_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/global_scroll_target_behavior.m.js" ]
+js_library("global_scroll_target_behavior") {
deps = [
- ":router.m",
+ ":router",
"//ui/webui/resources/js:promise_resolver.m",
]
- extra_deps = [ ":modulize" ]
}
js_library("hats_browser_proxy") {
@@ -559,7 +474,7 @@ js_library("lazy_load") {
"autofill_page:payments_section",
"chrome_cleanup_page:chrome_cleanup_proxy",
"clear_browsing_data_dialog:clear_browsing_data_browser_proxy",
- "languages_page:languages_browser_proxy.m",
+ "languages_page:languages_browser_proxy",
"languages_page:languages_metrics_proxy",
"languages_page:languages_page",
"languages_page:languages_settings_metrics_proxy",
@@ -574,10 +489,8 @@ js_library("lazy_load") {
]
}
-js_library("lifetime_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/lifetime_browser_proxy.m.js" ]
+js_library("lifetime_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
js_library("metrics_browser_proxy") {
@@ -595,25 +508,21 @@ js_library("page_visibility") {
js_library("route") {
deps = [
":page_visibility",
- ":router.m",
+ ":router",
":settings_routes",
"//ui/webui/resources/js:load_time_data.m",
]
}
-js_library("router.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/router.m.js" ]
+js_library("router") {
deps = [
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":modulize" ]
externs_list = [ "$externs_path/metrics_private.js" ]
}
-js_library("search_settings.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/search_settings.m.js" ]
+js_library("search_settings") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -622,20 +531,17 @@ js_library("search_settings.m") {
"//ui/webui/resources/js:search_highlight_utils.m",
"//ui/webui/resources/js:util.m",
]
- extra_deps = [ ":modulize" ]
}
-js_library("setting_id_param_util.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/setting_id_param_util.m.js" ]
+js_library("setting_id_param_util") {
deps = [
- ":router.m",
+ ":router",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":modulize" ]
}
js_library("settings_routes") {
- deps = [ ":router.m" ]
+ deps = [ ":router" ]
}
js_library("site_favicon") {
@@ -648,18 +554,17 @@ js_library("site_favicon") {
group("polymer3_elements") {
public_deps = [
# Sub-folder targets
- "a11y_page:polymer3_elements",
+ "a11y_page:web_components",
"about_page:web_components",
"appearance_page:web_components",
"autofill_page:web_components",
"basic_page:web_components",
"clear_browsing_data_dialog:web_components",
- "controls:polymer3_elements",
+ "controls:web_components",
"downloads_page:web_components",
- "languages_page:polymer3_elements",
+ "languages_page:web_components",
"on_startup_page:web_components",
- "people_page:polymer3_elements",
- "prefs:polymer3_elements",
+ "people_page:web_components",
"privacy_page:polymer3_elements",
"reset_page:web_components",
"safety_check_page:web_components",
@@ -667,17 +572,12 @@ group("polymer3_elements") {
"search_page:web_components",
"settings_main:web_components",
"settings_menu:web_components",
- "settings_page:polymer3_elements",
+ "settings_page:web_components",
"settings_ui:web_components",
"site_settings:web_components",
"site_settings_page:web_components",
# Local targets
- ":icons_module",
- ":modulize",
- ":settings_page_css_module",
- ":settings_shared_css_module",
- ":settings_vars_css_module",
":web_components_local",
]
@@ -696,49 +596,12 @@ group("polymer3_elements") {
}
}
-polymer_modulizer("icons") {
- js_file = "icons.m.js"
- html_file = "icons.html"
- html_type = "iron-iconset"
-}
-
-polymer_modulizer("settings_page_css") {
- js_file = "settings_page_css.m.js"
- html_file = "settings_page_css.html"
- html_type = "style-module"
-}
-
-polymer_modulizer("settings_shared_css") {
- js_file = "settings_shared_css.m.js"
- html_file = "settings_shared_css.html"
- html_type = "style-module"
-}
-
-polymer_modulizer("settings_vars_css") {
- js_file = "settings_vars_css.m.js"
- html_file = "settings_vars_css.html"
- html_type = "custom-style"
-}
-
html_to_js("web_components_local") {
- js_files = [ "site_favicon.js" ]
-}
-
-js_modulizer("modulize") {
- input_files = [
- "extension_control_browser_proxy.js",
- "global_scroll_target_behavior.js",
- "lifetime_browser_proxy.js",
- "router.js",
- "search_settings.js",
- "setting_id_param_util.js",
+ js_files = [
+ "icons.js",
+ "settings_vars_css.js",
+ "settings_page_css.js",
+ "settings_shared_css.js",
+ "site_favicon.js",
]
- namespace_rewrites = settings_namespace_rewrites + [
- "cr.search_highlight_utils.createEmptySearchBubble|createEmptySearchBubble",
- "cr.search_highlight_utils.findAndRemoveHighlights|findAndRemoveHighlights",
- "cr.search_highlight_utils.highlight|highlight",
- "cr.search_highlight_utils.removeHighlights|removeHighlights",
- "cr.search_highlight_utils.stripDiacritics|stripDiacritics",
- "Polymer.DomIf|DomIf",
- ]
}
diff --git a/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn b/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
index b5d41ad4922..9e000fce653 100644
--- a/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
@@ -3,34 +3,17 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":captions_subpage" ]
-}
-
-js_library("captions_subpage") {
- deps = [
- "../appearance_page:fonts_browser_proxy",
- "../controls:settings_dropdown_menu",
- "../controls:settings_toggle_button",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/cr_elements/cr_slider:cr_slider",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/metrics_private.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
deps = [
":a11y_page",
":captions_browser_proxy",
- ":captions_subpage.m",
+ ":captions_subpage",
+ ":live_caption_section",
]
}
@@ -38,7 +21,7 @@ js_library("a11y_page") {
deps = [
":captions_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -49,41 +32,31 @@ js_library("captions_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
}
-js_library("captions_subpage.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/a11y_page/captions_subpage.m.js" ]
+js_library("captions_subpage") {
deps = [
- "../appearance_page:fonts_browser_proxy.m",
- "../controls:settings_dropdown_menu.m",
- "../controls:settings_toggle_button.m",
- "../prefs:prefs_behavior.m",
+ "../appearance_page:fonts_browser_proxy",
+ "../controls:settings_dropdown_menu",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":captions_subpage_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":a11y_page_module",
- ":captions_subpage_module",
+js_library("live_caption_section") {
+ deps = [
+ "../controls:settings_toggle_button",
+ "../prefs:prefs_behavior",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
-polymer_modulizer("a11y_page") {
- js_file = "a11y_page.js"
- html_file = "a11y_page.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("captions_subpage") {
- js_file = "captions_subpage.js"
- html_file = "captions_subpage.html"
- html_type = "dom-module"
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/controls/settings_dropdown_menu.html|DropdownMenuOptionList",
- "chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.html|FontsBrowserProxy, FontsBrowserProxyImpl, FontsData",
- ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [
+ "a11y_page.js",
+ "captions_subpage.js",
+ "live_caption_section.js",
+ ]
}
diff --git a/chromium/chrome/browser/resources/settings/about_page/BUILD.gn b/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
index 158cdc92a35..40e84f8bfd9 100644
--- a/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
@@ -4,33 +4,22 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":about_page_browser_proxy" ]
-}
-
-js_library("about_page_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
deps = [
":about_page",
- ":about_page_browser_proxy.m",
+ ":about_page_browser_proxy",
]
}
js_library("about_page") {
deps = [
- ":about_page_browser_proxy.m",
- "..:lifetime_browser_proxy.m",
- "..:router.m",
+ ":about_page_browser_proxy",
+ "..:lifetime_browser_proxy",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -39,24 +28,10 @@ js_library("about_page") {
]
}
-js_library("about_page_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/about_page/about_page_browser_proxy.m.js" ]
+js_library("about_page_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-group("web_components") {
- public_deps = [
- ":modulize",
- ":web_components_local",
- ]
-}
-
-html_to_js("web_components_local") {
+html_to_js("web_components") {
js_files = [ "about_page.js" ]
}
-
-js_modulizer("modulize") {
- input_files = [ "about_page_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn b/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
index 9ea21661741..d670f09b9b2 100644
--- a/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
@@ -4,22 +4,8 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":fonts_browser_proxy" ]
-}
-
-js_library("fonts_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
@@ -27,7 +13,7 @@ js_type_check("closure_compile_module") {
":appearance_browser_proxy",
":appearance_fonts_page",
":appearance_page",
- ":fonts_browser_proxy.m",
+ ":fonts_browser_proxy",
":home_url_input",
]
}
@@ -45,8 +31,8 @@ js_library("appearance_browser_proxy") {
js_library("appearance_fonts_page") {
deps = [
- ":fonts_browser_proxy.m",
- "../controls:settings_dropdown_menu.m",
+ ":fonts_browser_proxy",
+ "../controls:settings_dropdown_menu",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_slider:cr_slider.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -59,25 +45,24 @@ js_library("appearance_page") {
":appearance_browser_proxy",
"..:page_visibility",
"..:route",
- "..:router.m",
- "../controls:settings_dropdown_menu.m",
- "../settings_page:settings_animated_pages.m",
+ "..:router",
+ "../controls:settings_dropdown_menu",
+ "../prefs:prefs_behavior",
+ "../settings_page:settings_animated_pages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
]
}
-js_library("fonts_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.m.js" ]
+js_library("fonts_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
js_library("home_url_input") {
deps = [
":appearance_browser_proxy",
- "../controls:pref_control_behavior.m",
+ "../controls:pref_control_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
@@ -86,22 +71,10 @@ js_library("home_url_input") {
]
}
-group("web_components") {
- public_deps = [
- ":modulize",
- ":web_components_local",
- ]
-}
-
-html_to_js("web_components_local") {
+html_to_js("web_components") {
js_files = [
"appearance_fonts_page.js",
"appearance_page.js",
"home_url_input.js",
]
}
-
-js_modulizer("modulize") {
- input_files = [ "fonts_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn b/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
index 978cd6d51a9..d056b70664a 100644
--- a/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
@@ -62,8 +62,8 @@ js_library("autofill_page") {
":password_check_behavior",
"..:open_window_proxy",
"..:route",
- "..:router.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../prefs:prefs_behavior",
]
externs_list = [
"$externs_path/passwords_private.js",
@@ -90,7 +90,7 @@ js_library("autofill_section") {
js_library("avatar_icon") {
deps = [
- "../people_page:sync_browser_proxy.m",
+ "../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
@@ -129,7 +129,7 @@ js_library("password_check") {
":password_check_behavior",
":password_manager_proxy",
"..:route",
- "../prefs:prefs_behavior.m",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -228,7 +228,7 @@ js_library("passwords_list_handler") {
":password_manager_proxy",
":password_move_to_account_dialog",
":password_remove_dialog",
- "../people_page:sync_browser_proxy.m",
+ "../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
@@ -271,7 +271,7 @@ js_library("password_remove_dialog") {
deps = [
":avatar_icon",
":multi_store_password_ui_entry",
- "../people_page:sync_browser_proxy.m",
+ "../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_checkbox:cr_checkbox.m",
@@ -298,11 +298,11 @@ js_library("passwords_section") {
":password_list_item",
":password_manager_proxy",
":passwords_list_handler",
- "..:global_scroll_target_behavior.m",
+ "..:global_scroll_target_behavior",
"..:route",
- "../people_page:profile_info_browser_proxy.m",
- "../people_page:sync_browser_proxy.m",
- "../prefs:prefs_behavior.m",
+ "../people_page:profile_info_browser_proxy",
+ "../people_page:sync_browser_proxy",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-keys-behavior:iron-a11y-keys-behavior",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
@@ -330,7 +330,7 @@ js_library("passwords_device_section") {
"..:i18n_setup",
"..:open_window_proxy",
"..:route",
- "../people_page:sync_browser_proxy.m",
+ "../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-keys-behavior:iron-a11y-keys-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:util.m",
diff --git a/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn b/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
index dcb01001d62..9e7247dba59 100644
--- a/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
@@ -16,10 +16,10 @@ js_library("basic_page") {
deps = [
"..:page_visibility",
"..:route",
- "..:router.m",
- "..:search_settings.m",
+ "..:router",
+ "..:search_settings",
"../chrome_cleanup_page:chrome_cleanup_proxy",
- "../prefs:prefs_behavior.m",
+ "../prefs:prefs_behavior",
"../privacy_page:privacy_page",
"../safety_check_page:safety_check_page",
"../search_page",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
index 0d8ca2c23fd..5aacc77816e 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -12,67 +12,16 @@ import("//ui/webui/webui_features.gni")
import("../../tools/optimize_webui.gni")
import("./os_settings.gni")
-preprocess_folder_v2 = "preprocess_v2"
preprocess_folder_v3 = "preprocess_v3"
-preprocess_v2_manifest = "preprocessed_v2_manifest.json"
preprocess_v3_manifest = "preprocessed_manifest.json"
preprocess_gen_v3_manifest = "preprocessed_gen_manifest.json"
preprocess_external_mojo_manifest = "preprocessed_external_mojo_manifest.json"
preprocess_mojo_manifest = "preprocessed_mojo_manifest.json"
if (optimize_webui) {
- build_manifest_v2 = "build_v2_manifest.json"
build_manifest_v3 = "build_v3_manifest.json"
- optimize_webui("build") {
- host = "os-settings"
- html_in_files = [
- "chromeos/os_settings.html",
- "chromeos/lazy_load.html",
- ]
- html_out_files = [
- "vulcanized.html",
- "lazy_load.vulcanized.html",
- ]
- insert_in_head = "<base href=\"chrome://os-settings\">"
- input = rebase_path("$target_gen_dir/$preprocess_folder_v2", root_build_dir)
- js_out_files = [
- "crisper.js",
- "lazy_load.crisper.js",
- ]
- out_manifest = "$target_gen_dir/$build_manifest_v2"
- excludes = [
- # TODO(calamity): Update optimize_webui to handle generated files.
- "chrome://resources/chromeos/colors/cros_colors.generated.css",
- "chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.html",
- "chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.html",
- "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html",
- "chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js",
- "chrome://os-settings/app-management/app_management.mojom-lite.js",
- "chrome://os-settings/app-management/file_path.mojom-lite.js",
- "chrome://os-settings/app-management/image.mojom-lite.js",
- "chrome://os-settings/app-management/types.mojom-lite.js",
- "chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
- "chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom.html",
- "chrome://resources/mojo/mojo/public/mojom/base/string16.mojom.html",
- "chrome://resources/mojo/mojo/public/mojom/base/time.mojom.html",
- "chrome://resources/mojo/skia/public/mojom/bitmap.mojom-lite.js",
- "chrome://resources/mojo/skia/public/mojom/image_info.mojom-lite.js",
- "chrome://resources/mojo/url/mojom/url.mojom-lite.js",
- "mojo/nearby_share.mojom-lite.js",
- "mojo/nearby_share_share_type.mojom-lite.js",
- "mojo/nearby_share_target_types.mojom-lite.js",
- "mojo/nearby_share_settings.mojom-lite.js",
- ]
-
- deps = [
- ":preprocess_mojo_v2",
- ":preprocess_v2",
- "../../nearby_share/shared:preprocess_v2",
- ]
- }
-
optimize_webui("build_polymer3") {
host = "os-settings"
input = rebase_path("$target_gen_dir/$preprocess_folder_v3", root_build_dir)
@@ -125,25 +74,6 @@ if (optimize_webui) {
}
}
-# OS Settings specific mojo files, bundled in optimized builds. No need for a
-# manifest as the preprocess_mojo_v3 target generates the manifest file for the
-# grd.
-preprocess_if_expr("preprocess_mojo_v2") {
- deps = [
- "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js",
- ]
- in_folder = get_path_info("../../../ui/webui/settings/chromeos/", "gen_dir")
- out_folder = "$target_gen_dir/$preprocess_folder_v2"
- in_files = [
- "constants/routes.mojom-lite.js",
- "constants/setting.mojom-lite.js",
- "search/search.mojom-lite.js",
- "search/search_result_icon.mojom-lite.js",
- "search/user_action_recorder.mojom-lite.js",
- ]
-}
-
# OS Settings specific mojo files, bundled in optimized builds.
preprocess_if_expr("preprocess_mojo_v3") {
deps = [
@@ -208,6 +138,7 @@ generate_grd("build_grd") {
input_files = [
"os_settings_v3.html",
"images/computer_and_bluetooth_switch.svg",
+ "images/error_badge.svg",
"images/icon_add_circle.svg",
"images/icon_add_wifi.svg",
"images/icon_add_cellular.svg",
@@ -234,14 +165,8 @@ generate_grd("build_grd") {
]
if (optimize_webui) {
- deps += [
- ":build",
- ":build_polymer3",
- ]
- manifest_files += [
- "$target_gen_dir/$build_manifest_v2",
- "$target_gen_dir/$build_manifest_v3",
- ]
+ deps += [ ":build_polymer3" ]
+ manifest_files += [ "$target_gen_dir/$build_manifest_v3" ]
input_files += [ "../../nearby_share/shared/nearby_shared_icons.html" ]
resource_path_rewrites += [
"../../nearby_share/shared/nearby_shared_icons.html|shared/nearby_shared_icons.html",
@@ -254,18 +179,12 @@ generate_grd("build_grd") {
deps += [
":preprocess_gen_v3",
":preprocess_mojo_v3",
- ":preprocess_v2",
":preprocess_v3",
- "../../nearby_share/shared:build_v2_grdp",
"../../nearby_share/shared:build_v3_grdp",
]
- grdp_files += [
- "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_resources_v2.grdp",
- "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_resources_v3.grdp",
- ]
+ grdp_files += [ "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_resources_v3.grdp" ]
manifest_files += [
"$target_gen_dir/$preprocess_gen_v3_manifest",
- "$target_gen_dir/$preprocess_v2_manifest",
"$target_gen_dir/$preprocess_v3_manifest",
"$target_gen_dir/$preprocess_mojo_manifest",
]
@@ -279,11 +198,32 @@ preprocess_if_expr("preprocess_v3") {
out_folder = "$target_gen_dir/$preprocess_folder_v3"
out_manifest = "$target_gen_dir/$preprocess_v3_manifest"
in_files = [
+ "appearance_page/fonts_browser_proxy.js",
+ "about_page/about_page_browser_proxy.js",
"chromeos/ensure_lazy_loaded.m.js",
"chromeos/lazy_load.js",
"chromeos/os_settings.js",
+ "controls/pref_control_behavior.js",
+ "controls/settings_boolean_control_behavior.js",
+ "extension_control_browser_proxy.js",
+ "global_scroll_target_behavior.js",
"i18n_setup.js",
+ "languages_page/languages.js",
+ "languages_page/languages_browser_proxy.js",
+ "lifetime_browser_proxy.js",
"page_visibility.js",
+ "people_page/account_manager_browser_proxy.js",
+ "people_page/profile_info_browser_proxy.js",
+ "people_page/sync_browser_proxy.js",
+ "prefs/prefs_behavior.js",
+ "prefs/prefs.js",
+ "prefs/prefs_types.js",
+ "prefs/pref_util.js",
+ "privacy_page/privacy_page_browser_proxy.js",
+ "router.js",
+ "search_engines_page/search_engines_browser_proxy.js",
+ "search_settings.js",
+ "setting_id_param_util.js",
]
}
@@ -294,9 +234,8 @@ preprocess_if_expr("preprocess_gen_v3") {
out_folder = "$target_gen_dir/$preprocess_folder_v3"
out_manifest = "$target_gen_dir/$preprocess_gen_v3_manifest"
in_files = [
- "a11y_page/captions_subpage.m.js",
- "appearance_page/fonts_browser_proxy.m.js",
- "about_page/about_page_browser_proxy.m.js",
+ "a11y_page/captions_subpage.js",
+ "a11y_page/live_caption_section.js",
"chromeos/ambient_mode_page/album_item.m.js",
"chromeos/ambient_mode_page/album_list.m.js",
"chromeos/ambient_mode_page/ambient_mode_browser_proxy.m.js",
@@ -351,6 +290,7 @@ preprocess_if_expr("preprocess_gen_v3") {
"chromeos/internet_page/esim_install_error_dialog.m.js",
"chromeos/internet_page/esim_remove_profile_dialog.m.js",
"chromeos/internet_page/esim_rename_dialog.m.js",
+ "chromeos/internet_page/cellular_banner.m.js",
"chromeos/internet_page/cellular_networks_list.m.js",
"chromeos/internet_page/cellular_setup_dialog.m.js",
"chromeos/internet_page/cellular_setup_settings_delegate.m.js",
@@ -449,6 +389,7 @@ preprocess_if_expr("preprocess_gen_v3") {
"chromeos/os_files_page/smb_shares_page.m.js",
"chromeos/os_icons.m.js",
"chromeos/os_languages_page/add_input_methods_dialog.m.js",
+ "chromeos/os_languages_page/add_spellcheck_languages_dialog.js",
"chromeos/os_languages_page/change_device_language_dialog.m.js",
"chromeos/os_languages_page/input_method_options_page.m.js",
"chromeos/os_languages_page/input_method_util.m.js",
@@ -523,600 +464,31 @@ preprocess_if_expr("preprocess_gen_v3") {
"chromeos/personalization_page/change_picture_browser_proxy.m.js",
"chromeos/personalization_page/personalization_page.m.js",
"chromeos/personalization_page/wallpaper_browser_proxy.m.js",
- "chromeos/personalization_page/wallpaper_constants.m.js",
- "chromeos/personalization_page/wallpaper_subpage.m.js",
"chromeos/pref_to_setting_metric_converter.m.js",
"chromeos/route_origin_behavior.m.js",
"chromeos/search_handler.m.js",
- "controls/controlled_button.m.js",
- "controls/controlled_radio_button.m.js",
- "controls/extension_controlled_indicator.m.js",
- "controls/password_prompt_dialog.m.js",
- "controls/pref_control_behavior.m.js",
- "controls/settings_boolean_control_behavior.m.js",
- "controls/settings_dropdown_menu.m.js",
- "controls/settings_radio_group.m.js",
- "controls/settings_slider.m.js",
- "controls/settings_textarea.m.js",
- "controls/settings_toggle_button.m.js",
- "extension_control_browser_proxy.m.js",
- "global_scroll_target_behavior.m.js",
- "icons.m.js",
- "languages_page/languages.m.js",
- "languages_page/languages_browser_proxy.m.js",
- "lifetime_browser_proxy.m.js",
- "people_page/account_manager_browser_proxy.m.js",
- "people_page/profile_info_browser_proxy.m.js",
- "people_page/signout_dialog.m.js",
- "people_page/sync_account_control.m.js",
- "people_page/sync_browser_proxy.m.js",
- "people_page/sync_controls.m.js",
- "people_page/sync_encryption_options.m.js",
- "people_page/sync_page.m.js",
- "prefs/pref_util.m.js",
- "prefs/prefs.m.js",
- "prefs/prefs_behavior.m.js",
- "prefs/prefs_types.m.js",
- "privacy_page/personalization_options.m.js",
- "privacy_page/privacy_page_browser_proxy.m.js",
- "router.m.js",
- "search_settings.m.js",
- "search_engines_page/search_engines_browser_proxy.m.js",
- "setting_id_param_util.m.js",
- "settings_page/settings_animated_pages.m.js",
- "settings_page/settings_section.m.js",
- "settings_page/settings_subpage.m.js",
- "settings_page_css.m.js",
- "settings_shared_css.m.js",
- "settings_vars_css.m.js",
- ]
-}
-
-preprocess_if_expr("preprocess_v2") {
- defines = chrome_grit_defines
- in_folder = "../"
- out_folder = "$target_gen_dir/$preprocess_folder_v2"
- out_manifest = "$target_gen_dir/$preprocess_v2_manifest"
- in_files = [
- "a11y_page/captions_subpage.html",
- "a11y_page/captions_subpage.js",
- "about_page/about_page_browser_proxy.html",
- "about_page/about_page_browser_proxy.js",
- "appearance_page/fonts_browser_proxy.html",
- "appearance_page/fonts_browser_proxy.js",
- "chromeos/ambient_mode_page/album_item.html",
- "chromeos/ambient_mode_page/album_item.js",
- "chromeos/ambient_mode_page/album_list.html",
- "chromeos/ambient_mode_page/album_list.js",
- "chromeos/ambient_mode_page/ambient_mode_browser_proxy.html",
- "chromeos/ambient_mode_page/ambient_mode_browser_proxy.js",
- "chromeos/ambient_mode_page/ambient_mode_page.html",
- "chromeos/ambient_mode_page/ambient_mode_page.js",
- "chromeos/ambient_mode_page/ambient_mode_photos_page.html",
- "chromeos/ambient_mode_page/ambient_mode_photos_page.js",
- "chromeos/ambient_mode_page/text_with_tooltip.html",
- "chromeos/ambient_mode_page/text_with_tooltip.js",
- "chromeos/ambient_mode_page/art_album_dialog.html",
- "chromeos/ambient_mode_page/art_album_dialog.js",
- "chromeos/ambient_mode_page/constants.html",
- "chromeos/ambient_mode_page/constants.js",
- "chromeos/ambient_mode_page/topic_source_item.html",
- "chromeos/ambient_mode_page/topic_source_item.js",
- "chromeos/ambient_mode_page/topic_source_list.html",
- "chromeos/ambient_mode_page/topic_source_list.js",
- "chromeos/bluetooth_page/bluetooth_device_list_item.html",
- "chromeos/bluetooth_page/bluetooth_device_list_item.js",
- "chromeos/bluetooth_page/bluetooth_page.html",
- "chromeos/bluetooth_page/bluetooth_page.js",
- "chromeos/bluetooth_page/bluetooth_subpage.html",
- "chromeos/bluetooth_page/bluetooth_subpage.js",
- "chromeos/crostini_page/crostini_arc_adb.html",
- "chromeos/crostini_page/crostini_arc_adb.js",
- "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.html",
- "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js",
- "chromeos/crostini_page/crostini_browser_proxy.html",
- "chromeos/crostini_page/crostini_browser_proxy.js",
- "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.html",
- "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js",
- "chromeos/crostini_page/crostini_disk_resize_dialog.html",
- "chromeos/crostini_page/crostini_disk_resize_dialog.js",
- "chromeos/crostini_page/crostini_export_import.html",
- "chromeos/crostini_page/crostini_export_import.js",
- "chromeos/crostini_page/crostini_import_confirmation_dialog.html",
- "chromeos/crostini_page/crostini_import_confirmation_dialog.js",
- "chromeos/crostini_page/crostini_mic_sharing_dialog.html",
- "chromeos/crostini_page/crostini_mic_sharing_dialog.js",
- "chromeos/crostini_page/crostini_page.html",
- "chromeos/crostini_page/crostini_page.js",
- "chromeos/crostini_page/crostini_port_forwarding.html",
- "chromeos/crostini_page/crostini_port_forwarding.js",
- "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.html",
- "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js",
- "chromeos/crostini_page/crostini_subpage.html",
- "chromeos/crostini_page/crostini_subpage.js",
- "chromeos/date_time_page/date_time_page.html",
- "chromeos/date_time_page/date_time_page.js",
- "chromeos/date_time_page/date_time_types.html",
- "chromeos/date_time_page/date_time_types.js",
- "chromeos/date_time_page/timezone_browser_proxy.html",
- "chromeos/date_time_page/timezone_browser_proxy.js",
- "chromeos/date_time_page/timezone_selector.html",
- "chromeos/date_time_page/timezone_selector.js",
- "chromeos/date_time_page/timezone_subpage.html",
- "chromeos/date_time_page/timezone_subpage.js",
- "chromeos/deep_linking_behavior.html",
- "chromeos/deep_linking_behavior.js",
- "chromeos/device_page/device_page.html",
- "chromeos/device_page/device_page.js",
- "chromeos/device_page/device_page_browser_proxy.html",
- "chromeos/device_page/device_page_browser_proxy.js",
- "chromeos/device_page/display.html",
- "chromeos/device_page/display.js",
- "chromeos/device_page/display_layout.html",
- "chromeos/device_page/display_layout.js",
- "chromeos/device_page/display_overscan_dialog.html",
- "chromeos/device_page/display_overscan_dialog.js",
- "chromeos/device_page/drag_behavior.html",
- "chromeos/device_page/drag_behavior.js",
- "chromeos/device_page/keyboard.html",
- "chromeos/device_page/keyboard.js",
- "chromeos/device_page/layout_behavior.html",
- "chromeos/device_page/layout_behavior.js",
- "chromeos/device_page/night_light_slider.html",
- "chromeos/device_page/night_light_slider.js",
- "chromeos/device_page/pointers.html",
- "chromeos/device_page/pointers.js",
- "chromeos/device_page/power.html",
- "chromeos/device_page/power.js",
- "chromeos/device_page/storage.html",
- "chromeos/device_page/storage.js",
- "chromeos/device_page/storage_external.html",
- "chromeos/device_page/storage_external.js",
- "chromeos/device_page/storage_external_entry.html",
- "chromeos/device_page/storage_external_entry.js",
- "chromeos/device_page/stylus.html",
- "chromeos/device_page/stylus.js",
- "chromeos/ensure_lazy_loaded.html",
- "chromeos/google_assistant_page/google_assistant_browser_proxy.html",
- "chromeos/google_assistant_page/google_assistant_browser_proxy.js",
- "chromeos/google_assistant_page/google_assistant_page.html",
- "chromeos/google_assistant_page/google_assistant_page.js",
- "chromeos/guest_os/guest_os_browser_proxy.html",
- "chromeos/guest_os/guest_os_browser_proxy.js",
- "chromeos/guest_os/guest_os_shared_paths.html",
- "chromeos/guest_os/guest_os_shared_paths.js",
- "chromeos/guest_os/guest_os_shared_usb_devices.html",
- "chromeos/guest_os/guest_os_shared_usb_devices.js",
- "chromeos/internet_page/esim_install_error_dialog.js",
- "chromeos/internet_page/esim_install_error_dialog.html",
- "chromeos/internet_page/esim_remove_profile_dialog.js",
- "chromeos/internet_page/esim_remove_profile_dialog.html",
- "chromeos/internet_page/esim_rename_dialog.js",
- "chromeos/internet_page/esim_rename_dialog.html",
- "chromeos/internet_page/cellular_networks_list.js",
- "chromeos/internet_page/cellular_networks_list.html",
- "chromeos/internet_page/cellular_setup_dialog.html",
- "chromeos/internet_page/cellular_setup_dialog.js",
- "chromeos/internet_page/cellular_setup_settings_delegate.html",
- "chromeos/internet_page/cellular_setup_settings_delegate.js",
- "chromeos/internet_page/internet_config.html",
- "chromeos/internet_page/internet_config.js",
- "chromeos/internet_page/internet_detail_menu.html",
- "chromeos/internet_page/internet_detail_menu.js",
- "chromeos/internet_page/internet_detail_page.html",
- "chromeos/internet_page/internet_detail_page.js",
- "chromeos/internet_page/internet_known_networks_page.html",
- "chromeos/internet_page/internet_known_networks_page.js",
- "chromeos/internet_page/internet_page.html",
- "chromeos/internet_page/internet_page.js",
- "chromeos/internet_page/internet_page_browser_proxy.html",
- "chromeos/internet_page/internet_page_browser_proxy.js",
- "chromeos/internet_page/internet_shared_css.html",
- "chromeos/internet_page/internet_subpage.html",
- "chromeos/internet_page/internet_subpage.js",
- "chromeos/internet_page/network_proxy_section.html",
- "chromeos/internet_page/network_proxy_section.js",
- "chromeos/internet_page/network_summary.html",
- "chromeos/internet_page/network_summary.js",
- "chromeos/internet_page/network_summary_item.html",
- "chromeos/internet_page/network_summary_item.js",
- "chromeos/internet_page/tether_connection_dialog.html",
- "chromeos/internet_page/tether_connection_dialog.js",
- "chromeos/kerberos_page/kerberos_accounts.html",
- "chromeos/kerberos_page/kerberos_accounts.js",
- "chromeos/kerberos_page/kerberos_accounts_browser_proxy.html",
- "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js",
- "chromeos/kerberos_page/kerberos_add_account_dialog.html",
- "chromeos/kerberos_page/kerberos_add_account_dialog.js",
- "chromeos/kerberos_page/kerberos_page.html",
- "chromeos/kerberos_page/kerberos_page.js",
- "chromeos/lazy_load.html",
- "chromeos/localized_link/localized_link.html",
- "chromeos/localized_link/localized_link.js",
- "chromeos/metrics_recorder.html",
- "chromeos/metrics_recorder.js",
- "chromeos/multidevice_page/multidevice_browser_proxy.html",
- "chromeos/multidevice_page/multidevice_browser_proxy.js",
- "chromeos/multidevice_page/multidevice_constants.html",
- "chromeos/multidevice_page/multidevice_constants.js",
- "chromeos/multidevice_page/multidevice_feature_behavior.html",
- "chromeos/multidevice_page/multidevice_feature_behavior.js",
- "chromeos/multidevice_page/multidevice_feature_item.html",
- "chromeos/multidevice_page/multidevice_feature_item.js",
- "chromeos/multidevice_page/multidevice_feature_toggle.html",
- "chromeos/multidevice_page/multidevice_feature_toggle.js",
- "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.html",
- "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js",
- "chromeos/multidevice_page/multidevice_page.html",
- "chromeos/multidevice_page/multidevice_page.js",
- "chromeos/multidevice_page/multidevice_radio_button.html",
- "chromeos/multidevice_page/multidevice_radio_button.js",
- "chromeos/multidevice_page/multidevice_smartlock_subpage.html",
- "chromeos/multidevice_page/multidevice_smartlock_subpage.js",
- "chromeos/multidevice_page/multidevice_subpage.html",
- "chromeos/multidevice_page/multidevice_subpage.js",
- "chromeos/multidevice_page/multidevice_tether_item.html",
- "chromeos/multidevice_page/multidevice_tether_item.js",
- "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.html",
- "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js",
- "chromeos/multidevice_page/multidevice_task_continuation_item.html",
- "chromeos/multidevice_page/multidevice_task_continuation_item.js",
- "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html",
- "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js",
- "chromeos/multidevice_page/multidevice_wifi_sync_item.html",
- "chromeos/multidevice_page/multidevice_wifi_sync_item.js",
- "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.html",
- "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.js",
- "chromeos/nearby_share_page/nearby_share_confirm_page.html",
- "chromeos/nearby_share_page/nearby_share_confirm_page.js",
- "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.html",
- "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js",
- "chromeos/nearby_share_page/nearby_share_data_usage_dialog.html",
- "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js",
- "chromeos/nearby_share_page/nearby_share_device_name_dialog.html",
- "chromeos/nearby_share_page/nearby_share_device_name_dialog.js",
- "chromeos/nearby_share_page/nearby_share_high_visibility_page.html",
- "chromeos/nearby_share_page/nearby_share_high_visibility_page.js",
- "chromeos/nearby_share_page/nearby_share_receive_dialog.html",
- "chromeos/nearby_share_page/nearby_share_receive_dialog.js",
- "chromeos/nearby_share_page/nearby_share_receive_manager.html",
- "chromeos/nearby_share_page/nearby_share_receive_manager.js",
- "chromeos/nearby_share_page/nearby_share_subpage.html",
- "chromeos/nearby_share_page/nearby_share_subpage.js",
- "chromeos/nearby_share_page/types.html",
- "chromeos/nearby_share_page/types.js",
- "chromeos/on_startup_page/on_startup_page.html",
- "chromeos/on_startup_page/on_startup_page.js",
- "chromeos/os_a11y_page/manage_a11y_page.html",
- "chromeos/os_a11y_page/manage_a11y_page.js",
- "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.html",
- "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.js",
- "chromeos/os_a11y_page/os_a11y_page.html",
- "chromeos/os_a11y_page/os_a11y_page.js",
- "chromeos/os_a11y_page/os_a11y_page_browser_proxy.html",
- "chromeos/os_a11y_page/os_a11y_page_browser_proxy.js",
- "chromeos/os_a11y_page/switch_access_action_assignment_dialog.html",
- "chromeos/os_a11y_page/switch_access_action_assignment_dialog.js",
- "chromeos/os_a11y_page/switch_access_constants.html",
- "chromeos/os_a11y_page/switch_access_constants.js",
- "chromeos/os_a11y_page/switch_access_setup_guide_dialog.html",
- "chromeos/os_a11y_page/switch_access_setup_guide_dialog.js",
- "chromeos/os_a11y_page/switch_access_subpage.html",
- "chromeos/os_a11y_page/switch_access_subpage.js",
- "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.html",
- "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.js",
- "chromeos/os_a11y_page/tts_subpage.html",
- "chromeos/os_a11y_page/tts_subpage.js",
- "chromeos/os_a11y_page/tts_subpage_browser_proxy.html",
- "chromeos/os_a11y_page/tts_subpage_browser_proxy.js",
- "chromeos/os_about_page/channel_switcher_dialog.html",
- "chromeos/os_about_page/channel_switcher_dialog.js",
- "chromeos/os_about_page/detailed_build_info.html",
- "chromeos/os_about_page/detailed_build_info.js",
- "chromeos/os_about_page/device_name_browser_proxy.html",
- "chromeos/os_about_page/device_name_browser_proxy.js",
- "chromeos/os_about_page/edit_hostname_dialog.html",
- "chromeos/os_about_page/edit_hostname_dialog.js",
- "chromeos/os_about_page/os_about_page.html",
- "chromeos/os_about_page/os_about_page.js",
- "chromeos/os_about_page/update_warning_dialog.html",
- "chromeos/os_about_page/update_warning_dialog.js",
- "chromeos/os_apps_page/android_apps_browser_proxy.html",
- "chromeos/os_apps_page/android_apps_browser_proxy.js",
- "chromeos/os_apps_page/android_apps_subpage.html",
- "chromeos/os_apps_page/android_apps_subpage.js",
- "chromeos/os_apps_page/app_management_page/actions.html",
- "chromeos/os_apps_page/app_management_page/actions.js",
- "chromeos/os_apps_page/app_management_page/api_listener.html",
- "chromeos/os_apps_page/app_management_page/api_listener.js",
- "chromeos/os_apps_page/app_management_page/app_detail_view.html",
- "chromeos/os_apps_page/app_management_page/app_detail_view.js",
- "chromeos/os_apps_page/app_management_page/app_item.html",
- "chromeos/os_apps_page/app_management_page/app_item.js",
- "chromeos/os_apps_page/app_management_page/app_management_page.html",
- "chromeos/os_apps_page/app_management_page/app_management_page.js",
- "chromeos/os_apps_page/app_management_page/arc_detail_view.html",
- "chromeos/os_apps_page/app_management_page/arc_detail_view.js",
- "chromeos/os_apps_page/app_management_page/browser_proxy.html",
- "chromeos/os_apps_page/app_management_page/browser_proxy.js",
- "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.html",
- "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js",
- "chromeos/os_apps_page/app_management_page/constants.html",
- "chromeos/os_apps_page/app_management_page/constants.js",
- "chromeos/os_apps_page/app_management_page/dom_switch.html",
- "chromeos/os_apps_page/app_management_page/dom_switch.js",
- "chromeos/os_apps_page/app_management_page/fake_page_handler.js",
- "chromeos/os_apps_page/app_management_page/icons.html",
- "chromeos/os_apps_page/app_management_page/main_view.html",
- "chromeos/os_apps_page/app_management_page/main_view.js",
- "chromeos/os_apps_page/app_management_page/permission_item.html",
- "chromeos/os_apps_page/app_management_page/permission_item.js",
- "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.html",
- "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js",
- "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.html",
- "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js",
- "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.html",
- "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js",
- "chromeos/os_apps_page/app_management_page/pwa_detail_view.html",
- "chromeos/os_apps_page/app_management_page/pwa_detail_view.js",
- "chromeos/os_apps_page/app_management_page/reducers.html",
- "chromeos/os_apps_page/app_management_page/reducers.js",
- "chromeos/os_apps_page/app_management_page/shared_style.html",
- "chromeos/os_apps_page/app_management_page/shared_vars.html",
- "chromeos/os_apps_page/app_management_page/store.html",
- "chromeos/os_apps_page/app_management_page/store.js",
- "chromeos/os_apps_page/app_management_page/store_client.html",
- "chromeos/os_apps_page/app_management_page/store_client.js",
- "chromeos/os_apps_page/app_management_page/toggle_row.html",
- "chromeos/os_apps_page/app_management_page/toggle_row.js",
- "chromeos/os_apps_page/app_management_page/types.js",
- "chromeos/os_apps_page/app_management_page/uninstall_button.html",
- "chromeos/os_apps_page/app_management_page/uninstall_button.js",
- "chromeos/os_apps_page/app_management_page/util.html",
- "chromeos/os_apps_page/app_management_page/util.js",
- "chromeos/os_apps_page/os_apps_page.html",
- "chromeos/os_apps_page/os_apps_page.js",
- "chromeos/os_files_page/os_files_page.html",
- "chromeos/os_files_page/os_files_page.js",
- "chromeos/os_files_page/smb_shares_page.html",
- "chromeos/os_files_page/smb_shares_page.js",
- "chromeos/os_icons.html",
- "chromeos/os_languages_page/add_input_methods_dialog.html",
- "chromeos/os_languages_page/add_input_methods_dialog.js",
- "chromeos/os_languages_page/change_device_language_dialog.html",
- "chromeos/os_languages_page/change_device_language_dialog.js",
- "chromeos/os_languages_page/input_method_options_page.html",
- "chromeos/os_languages_page/input_method_options_page.js",
- "chromeos/os_languages_page/input_method_util.html",
- "chromeos/os_languages_page/input_method_util.js",
- "chromeos/os_languages_page/input_page.html",
- "chromeos/os_languages_page/input_page.js",
- "chromeos/os_languages_page/languages_metrics_proxy.html",
- "chromeos/os_languages_page/languages_metrics_proxy.js",
- "chromeos/os_languages_page/manage_input_methods_page.html",
- "chromeos/os_languages_page/manage_input_methods_page.js",
- "chromeos/os_languages_page/os_add_languages_dialog.html",
- "chromeos/os_languages_page/os_add_languages_dialog.js",
- "chromeos/os_languages_page/os_edit_dictionary_page.html",
- "chromeos/os_languages_page/os_edit_dictionary_page.js",
- "chromeos/os_languages_page/os_languages_page.html",
- "chromeos/os_languages_page/os_languages_page.js",
- "chromeos/os_languages_page/os_languages_page_v2.html",
- "chromeos/os_languages_page/os_languages_page_v2.js",
- "chromeos/os_languages_page/os_languages_section.html",
- "chromeos/os_languages_page/os_languages_section.js",
- "chromeos/os_languages_page/shared_style.html",
- "chromeos/os_languages_page/shared_vars.html",
- "chromeos/os_languages_page/smart_inputs_page.html",
- "chromeos/os_languages_page/smart_inputs_page.js",
- "chromeos/os_page_visibility.html",
- "chromeos/os_page_visibility.js",
- "chromeos/os_people_page/account_manager.html",
- "chromeos/os_people_page/account_manager.js",
- "chromeos/os_people_page/fingerprint_browser_proxy.html",
- "chromeos/os_people_page/fingerprint_browser_proxy.js",
- "chromeos/os_people_page/fingerprint_list.html",
- "chromeos/os_people_page/fingerprint_list.js",
- "chromeos/os_people_page/lock_screen.html",
- "chromeos/os_people_page/lock_screen.js",
- "chromeos/os_people_page/lock_screen_password_prompt_dialog.html",
- "chromeos/os_people_page/lock_screen_password_prompt_dialog.js",
- "chromeos/os_people_page/lock_state_behavior.html",
- "chromeos/os_people_page/lock_state_behavior.js",
- "chromeos/os_people_page/os_people_page.html",
- "chromeos/os_people_page/os_people_page.js",
- "chromeos/os_people_page/os_sync_browser_proxy.html",
- "chromeos/os_people_page/os_sync_browser_proxy.js",
- "chromeos/os_people_page/os_sync_controls.html",
- "chromeos/os_people_page/os_sync_controls.js",
- "chromeos/os_people_page/pin_autosubmit_dialog.html",
- "chromeos/os_people_page/pin_autosubmit_dialog.js",
- "chromeos/os_people_page/setup_fingerprint_dialog.html",
- "chromeos/os_people_page/setup_fingerprint_dialog.js",
- "chromeos/os_people_page/setup_pin_dialog.html",
- "chromeos/os_people_page/setup_pin_dialog.js",
- "chromeos/os_people_page/user_list.html",
- "chromeos/os_people_page/user_list.js",
- "chromeos/os_people_page/users_add_user_dialog.html",
- "chromeos/os_people_page/users_add_user_dialog.js",
- "chromeos/os_people_page/users_page.html",
- "chromeos/os_people_page/users_page.js",
- "chromeos/os_printing_page/cups_add_print_server_dialog.html",
- "chromeos/os_printing_page/cups_add_print_server_dialog.js",
- "chromeos/os_printing_page/cups_add_printer_dialog.html",
- "chromeos/os_printing_page/cups_add_printer_dialog.js",
- "chromeos/os_printing_page/cups_add_printer_manually_dialog.html",
- "chromeos/os_printing_page/cups_add_printer_manually_dialog.js",
- "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.html",
- "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js",
- "chromeos/os_printing_page/cups_edit_printer_dialog.html",
- "chromeos/os_printing_page/cups_edit_printer_dialog.js",
- "chromeos/os_printing_page/cups_nearby_printers.html",
- "chromeos/os_printing_page/cups_nearby_printers.js",
- "chromeos/os_printing_page/cups_printer_dialog_error.html",
- "chromeos/os_printing_page/cups_printer_dialog_error.js",
- "chromeos/os_printing_page/cups_printer_dialog_util.html",
- "chromeos/os_printing_page/cups_printer_dialog_util.js",
- "chromeos/os_printing_page/cups_printer_shared_css.html",
- "chromeos/os_printing_page/cups_printer_types.html",
- "chromeos/os_printing_page/cups_printer_types.js",
- "chromeos/os_printing_page/cups_printers.html",
- "chromeos/os_printing_page/cups_printers.js",
- "chromeos/os_printing_page/cups_printers_browser_proxy.html",
- "chromeos/os_printing_page/cups_printers_browser_proxy.js",
- "chromeos/os_printing_page/cups_printers_entry.html",
- "chromeos/os_printing_page/cups_printers_entry.js",
- "chromeos/os_printing_page/cups_printers_entry_list_behavior.html",
- "chromeos/os_printing_page/cups_printers_entry_list_behavior.js",
- "chromeos/os_printing_page/cups_printers_entry_manager.html",
- "chromeos/os_printing_page/cups_printers_entry_manager.js",
- "chromeos/os_printing_page/cups_saved_printers.html",
- "chromeos/os_printing_page/cups_saved_printers.js",
- "chromeos/os_printing_page/cups_settings_add_printer_dialog.html",
- "chromeos/os_printing_page/cups_settings_add_printer_dialog.js",
- "chromeos/os_printing_page/os_printing_page.html",
- "chromeos/os_printing_page/os_printing_page.js",
- "chromeos/os_privacy_page/os_privacy_page.html",
- "chromeos/os_privacy_page/os_privacy_page.js",
- "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.html",
- "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.js",
- "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.html",
- "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js",
- "chromeos/os_reset_page/os_powerwash_dialog.html",
- "chromeos/os_reset_page/os_powerwash_dialog.js",
- "chromeos/os_reset_page/os_reset_browser_proxy.html",
- "chromeos/os_reset_page/os_reset_browser_proxy.js",
- "chromeos/os_reset_page/os_reset_page.html",
- "chromeos/os_reset_page/os_reset_page.js",
- "chromeos/os_route.html",
- "chromeos/os_route.js",
- "chromeos/os_search_page/os_search_page.html",
- "chromeos/os_search_page/os_search_page.js",
- "chromeos/os_search_page/os_search_selection_dialog.html",
- "chromeos/os_search_page/os_search_selection_dialog.js",
- "chromeos/os_settings.html",
- "chromeos/os_settings_icons_css.html",
- "chromeos/os_settings_main/os_settings_main.html",
- "chromeos/os_settings_main/os_settings_main.js",
- "chromeos/os_settings_menu/os_settings_menu.html",
- "chromeos/os_settings_menu/os_settings_menu.js",
- "chromeos/os_settings_page/main_page_behavior.html",
- "chromeos/os_settings_page/main_page_behavior.js",
- "chromeos/os_settings_page/os_settings_page.html",
- "chromeos/os_settings_page/os_settings_page.js",
- "chromeos/os_settings_page/settings_idle_load.html",
- "chromeos/os_settings_page/settings_idle_load.js",
- "chromeos/os_settings_routes.html",
- "chromeos/os_settings_routes.js",
- "chromeos/os_settings_search_box/os_search_result_row.html",
- "chromeos/os_settings_search_box/os_search_result_row.js",
- "chromeos/os_settings_search_box/os_settings_search_box.html",
- "chromeos/os_settings_search_box/os_settings_search_box.js",
- "chromeos/os_settings_ui/os_settings_ui.html",
- "chromeos/os_settings_ui/os_settings_ui.js",
- "chromeos/os_toolbar/os_toolbar.html",
- "chromeos/os_toolbar/os_toolbar.js",
- "chromeos/parental_controls_page/parental_controls_browser_proxy.html",
- "chromeos/parental_controls_page/parental_controls_browser_proxy.js",
- "chromeos/parental_controls_page/parental_controls_page.html",
- "chromeos/parental_controls_page/parental_controls_page.js",
- "chromeos/personalization_page/change_picture.html",
- "chromeos/personalization_page/change_picture.js",
- "chromeos/personalization_page/change_picture_browser_proxy.html",
- "chromeos/personalization_page/change_picture_browser_proxy.js",
- "chromeos/personalization_page/personalization_page.html",
- "chromeos/personalization_page/personalization_page.js",
- "chromeos/personalization_page/wallpaper_browser_proxy.html",
- "chromeos/personalization_page/wallpaper_browser_proxy.js",
- "chromeos/personalization_page/wallpaper_constants.html",
- "chromeos/personalization_page/wallpaper_constants.js",
- "chromeos/personalization_page/wallpaper_subpage.js",
- "chromeos/personalization_page/wallpaper_subpage.html",
- "chromeos/pref_to_setting_metric_converter.html",
- "chromeos/pref_to_setting_metric_converter.js",
- "chromeos/route_origin_behavior.html",
- "chromeos/route_origin_behavior.js",
- "chromeos/search_handler.html",
- "chromeos/search_handler.js",
- "controls/controlled_button.html",
"controls/controlled_button.js",
- "controls/controlled_radio_button.html",
"controls/controlled_radio_button.js",
- "controls/extension_controlled_indicator.html",
"controls/extension_controlled_indicator.js",
- "controls/password_prompt_dialog.html",
"controls/password_prompt_dialog.js",
- "controls/pref_control_behavior.html",
- "controls/pref_control_behavior.js",
- "controls/settings_boolean_control_behavior.html",
- "controls/settings_boolean_control_behavior.js",
- "controls/settings_dropdown_menu.html",
"controls/settings_dropdown_menu.js",
- "controls/settings_radio_group.html",
"controls/settings_radio_group.js",
- "controls/settings_slider.html",
"controls/settings_slider.js",
- "controls/settings_textarea.html",
"controls/settings_textarea.js",
- "controls/settings_toggle_button.html",
"controls/settings_toggle_button.js",
- "extension_control_browser_proxy.html",
- "extension_control_browser_proxy.js",
- "global_scroll_target_behavior.html",
- "global_scroll_target_behavior.js",
- "i18n_setup.html",
- "icons.html",
- "languages_page/languages.html",
- "languages_page/languages.js",
- "languages_page/languages_browser_proxy.html",
- "languages_page/languages_browser_proxy.js",
- "lifetime_browser_proxy.html",
- "lifetime_browser_proxy.js",
- "people_page/account_manager_browser_proxy.html",
- "people_page/account_manager_browser_proxy.js",
- "people_page/profile_info_browser_proxy.html",
- "people_page/profile_info_browser_proxy.js",
- "people_page/signout_dialog.html",
+ "icons.js",
"people_page/signout_dialog.js",
- "people_page/sync_account_control.html",
"people_page/sync_account_control.js",
- "people_page/sync_browser_proxy.html",
- "people_page/sync_browser_proxy.js",
- "people_page/sync_controls.html",
"people_page/sync_controls.js",
- "people_page/sync_encryption_options.html",
"people_page/sync_encryption_options.js",
- "people_page/sync_page.html",
"people_page/sync_page.js",
- "prefs/pref_util.html",
- "prefs/pref_util.js",
- "prefs/prefs.html",
- "prefs/prefs.js",
- "prefs/prefs_behavior.html",
- "prefs/prefs_behavior.js",
- "prefs/prefs_types.html",
- "prefs/prefs_types.js",
- "privacy_page/personalization_options.html",
"privacy_page/personalization_options.js",
- "privacy_page/privacy_page_browser_proxy.html",
- "privacy_page/privacy_page_browser_proxy.js",
- "router.html",
- "router.js",
- "search_engines_page/search_engines_browser_proxy.html",
- "search_engines_page/search_engines_browser_proxy.js",
- "search_settings.html",
- "search_settings.js",
- "setting_id_param_util.html",
- "setting_id_param_util.js",
- "settings_page/settings_animated_pages.html",
"settings_page/settings_animated_pages.js",
- "settings_page/settings_section.html",
"settings_page/settings_section.js",
- "settings_page/settings_subpage.html",
"settings_page/settings_subpage.js",
- "settings_page_css.html",
- "settings_shared_css.html",
- "settings_vars_css.html",
+ "settings_page_css.js",
+ "settings_shared_css.js",
+ "settings_vars_css.js",
]
}
@@ -1161,6 +533,7 @@ group("closure_compile_module") {
js_type_check("closure_compile_local_module") {
is_polymer3 = true
+ closure_flags = os_settings_closure_flags
deps = [
":lazy_load",
":metrics_recorder.m",
@@ -1185,8 +558,8 @@ js_library("lazy_load") {
js_library("deep_linking_behavior.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/deep_linking_behavior.m.js" ]
deps = [
- "..:router.m",
- "..:setting_id_param_util.m",
+ "..:router",
+ "..:setting_id_param_util",
"//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js_library_for_compile",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -1222,7 +595,7 @@ js_library("os_route.m") {
]
deps = [
":os_settings_routes.m",
- "..:router.m",
+ "..:router",
"//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js_library_for_compile",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -1237,7 +610,10 @@ js_library("os_settings_icons_css.m") {
js_library("os_settings_routes.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_routes.m.js" ]
- deps = [ "//ui/webui/resources/js:load_time_data.m" ]
+ deps = [
+ "..:router",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
extra_deps = [ ":modulize" ]
}
@@ -1310,19 +686,9 @@ group("polymer3_elements") {
":os_settings_icons_css_module",
# Shared with browser settings
- "..:modulize",
- "..:settings_shared_css_module",
- "..:settings_vars_css_module",
- "../../settings:settings_page_css_module",
- "../a11y_page:captions_subpage_module",
- "../about_page:modulize",
- "../appearance_page:modulize",
- "../prefs:modulize",
- "../prefs:prefs_module",
- "../search_engines_page:modulize",
- "../settings_page:settings_animated_pages_module",
- "../settings_page:settings_section_module",
- "../settings_page:settings_subpage_module",
+ "..:web_components_local",
+ "../a11y_page:web_components",
+ "../settings_page:web_components",
]
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
index b4a0a69ae55..c62e2e99e9f 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":album_item.m",
@@ -41,8 +42,8 @@ js_library("ambient_mode_page.m") {
":constants.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -56,7 +57,7 @@ js_library("ambient_mode_photos_page.m") {
":ambient_mode_browser_proxy.m",
":constants.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -108,7 +109,7 @@ js_library("album_list.m") {
deps = [
":constants.m",
"..:os_route.m",
- "../..:global_scroll_target_behavior.m",
+ "../..:global_scroll_target_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
extra_deps = [ ":album_list_module" ]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
index 92311e69248..5e31e0470dc 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":bluetooth_device_list_item.m",
@@ -34,9 +35,9 @@ js_library("bluetooth_page.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
- "../../settings_page:settings_animated_pages.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
+ "../../settings_page:settings_animated_pages",
"//services/device/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -54,7 +55,7 @@ js_library("bluetooth_subpage.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//services/device/public/mojom:mojom_js_library_for_compile",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/bluetooth:bluetooth_dialog.m",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
index 53b95ef20e8..ce5047372ed 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":crostini_arc_adb.m",
@@ -32,7 +33,7 @@ js_library("crostini_arc_adb.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"../localized_link:localized_link.m",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
@@ -101,7 +102,7 @@ js_library("crostini_export_import.m") {
":crostini_import_confirmation_dialog.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -125,7 +126,7 @@ js_library("crostini_mic_sharing_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_mic_sharing_dialog.m.js" ]
deps = [
":crostini_browser_proxy.m",
- "../../prefs:prefs_behavior.m",
+ "../../prefs:prefs_behavior",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -143,13 +144,13 @@ js_library("crostini_page.m") {
":crostini_subpage.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"../guest_os:guest_os_shared_paths.m",
"../guest_os:guest_os_shared_usb_devices.m",
"../localized_link:localized_link.m",
- "//chrome/browser/resources/settings/settings_page:settings_animated_pages.m",
- "//chrome/browser/resources/settings/settings_page:settings_subpage.m",
+ "//chrome/browser/resources/settings/settings_page:settings_animated_pages",
+ "//chrome/browser/resources/settings/settings_page:settings_subpage",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
@@ -165,8 +166,8 @@ js_library("crostini_port_forwarding.m") {
":crostini_browser_proxy.m",
":crostini_port_forwarding_add_port_dialog.m",
"..:metrics_recorder.m",
- "../../controls:settings_toggle_button.m",
- "../../prefs:prefs_behavior.m",
+ "../../controls:settings_toggle_button",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
@@ -206,11 +207,11 @@ js_library("crostini_subpage.m") {
"..:metrics_recorder.m",
"..:os_route.m",
"..:route_origin_behavior.m",
- "../..:router.m",
- "../../controls:settings_toggle_button.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../controls:settings_toggle_button",
+ "../../prefs:prefs_behavior",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -240,6 +241,7 @@ polymer_modulizer("crostini_arc_adb") {
html_file = "crostini_arc_adb.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -248,6 +250,7 @@ polymer_modulizer("crostini_arc_adb_confirmation_dialog") {
html_file = "crostini_arc_adb_confirmation_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -256,6 +259,7 @@ polymer_modulizer("crostini_disk_resize_dialog") {
html_file = "crostini_disk_resize_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -264,6 +268,7 @@ polymer_modulizer("crostini_disk_resize_confirmation_dialog") {
html_file = "crostini_disk_resize_confirmation_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -272,6 +277,7 @@ polymer_modulizer("crostini_export_import") {
html_file = "crostini_export_import.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -280,6 +286,7 @@ polymer_modulizer("crostini_import_confirmation_dialog") {
html_file = "crostini_import_confirmation_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -288,6 +295,7 @@ polymer_modulizer("crostini_mic_sharing_dialog") {
html_file = "crostini_mic_sharing_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -296,6 +304,7 @@ polymer_modulizer("crostini_page") {
html_file = "crostini_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -304,6 +313,7 @@ polymer_modulizer("crostini_port_forwarding") {
html_file = "crostini_port_forwarding.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -312,6 +322,7 @@ polymer_modulizer("crostini_port_forwarding_add_port_dialog") {
html_file = "crostini_port_forwarding_add_port_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -320,6 +331,7 @@ polymer_modulizer("crostini_subpage") {
html_file = "crostini_subpage.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
index 5349f5f84cc..7b48834b820 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":date_time_page.m",
@@ -23,7 +24,7 @@ js_library("date_time_page.m") {
deps = [
"..:deep_linking_behavior.m",
"..:os_settings_routes.m",
- "../../prefs:prefs_behavior.m",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator.m",
@@ -55,9 +56,9 @@ js_library("timezone_selector.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/timezone_selector.m.js" ]
deps = [
":timezone_browser_proxy.m",
- "../../controls:settings_dropdown_menu.m",
- "../../prefs:prefs_behavior.m",
- "../../prefs:prefs_types.m",
+ "../../controls:settings_dropdown_menu",
+ "../../prefs:prefs_behavior",
+ "../../prefs:prefs_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
]
@@ -71,8 +72,8 @@ js_library("timezone_subpage.m") {
":timezone_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_settings_routes.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
index c592e6dd89a..d3b9d81c225 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -9,6 +9,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":device_page.m",
@@ -34,7 +35,7 @@ js_library("device_page.m") {
deps = [
":device_page_browser_proxy.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":device_page_module" ]
@@ -54,8 +55,8 @@ js_library("display.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/display.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
- "../../controls:settings_slider.m",
+ "../..:router",
+ "../../controls:settings_slider",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_slider:cr_slider.m",
"//ui/webui/resources/js:cr.m",
@@ -101,8 +102,8 @@ js_library("keyboard.m") {
"..:deep_linking_behavior.m",
"..:os_route.m",
"../..:i18n_setup",
- "../..:router.m",
- "../../controls:settings_dropdown_menu.m",
+ "../..:router",
+ "../../controls:settings_dropdown_menu",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
@@ -125,7 +126,7 @@ js_library("layout_behavior.m") {
js_library("night_light_slider.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/night_light_slider.m.js" ]
deps = [
- "../../prefs:prefs_behavior.m",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior",
"//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior",
]
@@ -138,8 +139,8 @@ js_library("pointers.m") {
":device_page_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../controls:settings_toggle_button.m",
+ "../..:router",
+ "../../controls:settings_toggle_button",
"../localized_link:localized_link.m",
]
extra_deps = [ ":pointers_module" ]
@@ -152,8 +153,8 @@ js_library("power.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_types.m",
+ "../..:router",
+ "../../prefs:prefs_types",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
@@ -166,7 +167,7 @@ js_library("storage.m") {
":device_page_browser_proxy.m",
"..:os_route.m",
"..:route_origin_behavior.m",
- "../..:router.m",
+ "../..:router",
"../localized_link:localized_link.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -189,7 +190,7 @@ js_library("storage_external.m") {
js_library("storage_external_entry.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.m.js" ]
deps = [
- "../../prefs:prefs_behavior.m",
+ "../../prefs:prefs_behavior",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
extra_deps = [ ":storage_external_entry_module" ]
@@ -202,8 +203,8 @@ js_library("stylus.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_types.m",
+ "../..:router",
+ "../../prefs:prefs_types",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
@@ -234,7 +235,7 @@ polymer_modulizer("device_page") {
js_file = "device_page.js"
html_file = "device_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -243,7 +244,7 @@ polymer_modulizer("display") {
js_file = "display.js"
html_file = "display.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -252,7 +253,7 @@ polymer_modulizer("display_layout") {
js_file = "display_layout.js"
html_file = "display_layout.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -261,7 +262,7 @@ polymer_modulizer("display_overscan_dialog") {
js_file = "display_overscan_dialog.js"
html_file = "display_overscan_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -270,7 +271,7 @@ polymer_modulizer("keyboard") {
js_file = "keyboard.js"
html_file = "keyboard.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -279,7 +280,7 @@ polymer_modulizer("night_light_slider") {
js_file = "night_light_slider.js"
html_file = "night_light_slider.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -288,7 +289,7 @@ polymer_modulizer("pointers") {
js_file = "pointers.js"
html_file = "pointers.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -297,7 +298,7 @@ polymer_modulizer("power") {
js_file = "power.js"
html_file = "power.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -306,7 +307,7 @@ polymer_modulizer("storage") {
js_file = "storage.js"
html_file = "storage.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -315,7 +316,7 @@ polymer_modulizer("storage_external") {
js_file = "storage_external.js"
html_file = "storage_external.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -324,7 +325,7 @@ polymer_modulizer("storage_external_entry") {
js_file = "storage_external_entry.js"
html_file = "storage_external_entry.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -333,7 +334,7 @@ polymer_modulizer("stylus") {
js_file = "stylus.js"
html_file = "stylus.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
index d6a287c6255..6f8a007dd5b 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
@@ -6,8 +6,10 @@ import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":google_assistant_browser_proxy.m",
@@ -27,17 +29,17 @@ js_library("google_assistant_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.m.js" ]
deps = [
":google_assistant_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/controls:controlled_button.m",
- "//chrome/browser/resources/settings/controls:settings_toggle_button.m",
- "//chrome/browser/resources/settings/prefs:pref_util.m",
- "//chrome/browser/resources/settings/prefs:prefs.m",
- "//chrome/browser/resources/settings/prefs:prefs_behavior.m",
+ "//chrome/browser/resources/settings/controls:controlled_button",
+ "//chrome/browser/resources/settings/controls:settings_toggle_button",
+ "//chrome/browser/resources/settings/prefs:pref_util",
+ "//chrome/browser/resources/settings/prefs:prefs",
+ "//chrome/browser/resources/settings/prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -59,6 +61,7 @@ polymer_modulizer("google_assistant_page") {
html_file = "google_assistant_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
index 034e35e3712..3c255b35a41 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":guest_os_browser_proxy.m",
@@ -62,6 +63,7 @@ polymer_modulizer("guest_os_shared_paths") {
html_file = "guest_os_shared_paths.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -70,6 +72,7 @@ polymer_modulizer("guest_os_shared_usb_devices") {
html_file = "guest_os_shared_usb_devices.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
index 1e43c887605..d30eb2c5c96 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -6,10 +6,13 @@ import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
+ ":cellular_banner.m",
":cellular_networks_list.m",
":cellular_setup_dialog.m",
":cellular_setup_settings_delegate.m",
@@ -31,6 +34,18 @@ js_type_check("closure_compile_module") {
]
}
+js_library("cellular_banner.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/cellular_banner.m.js" ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ extra_deps = [ ":cellular_banner_module" ]
+}
+
js_library("cellular_setup_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.m.js" ]
deps = [
@@ -47,7 +62,7 @@ js_library("internet_config.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_config.m.js" ]
deps = [
":internet_shared_css.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -63,9 +78,10 @@ js_library("internet_config.m") {
js_library("internet_detail_menu.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.m.js" ]
deps = [
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider.m",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -80,14 +96,14 @@ js_library("internet_detail_page.m") {
":internet_shared_css.m",
":network_proxy_section.m",
":tether_connection_dialog.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//chrome/browser/resources/settings/chromeos/os_people_page:os_sync_browser_proxy.m",
- "//chrome/browser/resources/settings/controls:controlled_button.m",
- "//chrome/browser/resources/settings/controls:settings_toggle_button.m",
- "//chrome/browser/resources/settings/people_page:sync_browser_proxy.m",
- "//chrome/browser/resources/settings/prefs:prefs.m",
+ "//chrome/browser/resources/settings/controls:controlled_button",
+ "//chrome/browser/resources/settings/controls:settings_toggle_button",
+ "//chrome/browser/resources/settings/people_page:sync_browser_proxy",
+ "//chrome/browser/resources/settings/prefs:prefs",
"//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
@@ -121,7 +137,7 @@ js_library("internet_known_networks_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.m.js" ]
deps = [
":internet_shared_css.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
@@ -132,7 +148,7 @@ js_library("internet_known_networks_page.m") {
"//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/js:assert.m",
]
extra_deps = [ ":internet_known_networks_page_module" ]
@@ -150,13 +166,13 @@ js_library("internet_page.m") {
":internet_page_browser_proxy.m",
":internet_subpage.m",
":network_summary.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/prefs:prefs.m",
- "//chrome/browser/resources/settings/settings_page:settings_animated_pages.m",
- "//chrome/browser/resources/settings/settings_page:settings_subpage.m",
+ "//chrome/browser/resources/settings/prefs:prefs",
+ "//chrome/browser/resources/settings/settings_page:settings_animated_pages",
+ "//chrome/browser/resources/settings/settings_page:settings_subpage",
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/cellular_setup:cellular_types.m",
@@ -164,8 +180,10 @@ js_library("internet_page.m") {
"//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider.m",
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior.m",
"//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
+ "//ui/webui/resources/cr_components/chromeos/network:sim_lock_dialogs.m",
"//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
+ "//ui/webui/resources/cr_elements/cr_toast:cr_toast.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -197,7 +215,7 @@ js_library("internet_subpage.m") {
deps = [
":cellular_networks_list.m",
":internet_page_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:metrics_recorder.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
@@ -212,7 +230,7 @@ js_library("internet_subpage.m") {
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior.m",
"//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -224,11 +242,11 @@ js_library("network_proxy_section.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.m.js" ]
deps = [
":internet_shared_css.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/controls:extension_controlled_indicator.m",
- "//chrome/browser/resources/settings/controls:settings_toggle_button.m",
- "//chrome/browser/resources/settings/prefs:prefs_behavior.m",
+ "//chrome/browser/resources/settings/controls:extension_controlled_indicator",
+ "//chrome/browser/resources/settings/controls:settings_toggle_button",
+ "//chrome/browser/resources/settings/prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/network:cr_policy_network_behavior_mojo.m",
@@ -293,14 +311,19 @@ js_library("cellular_networks_list.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.m.js" ]
deps = [
":esim_install_error_dialog.m",
+ "../multidevice_page:multidevice_browser_proxy.m",
+ "../multidevice_page:multidevice_constants.m",
"//chrome/browser/resources/settings/chromeos/localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/cellular_setup:cellular_types.m",
"//ui/webui/resources/cr_components/chromeos/cellular_setup:esim_manager_listener_behavior.m",
"//ui/webui/resources/cr_components/chromeos/cellular_setup:esim_manager_utils.m",
+ "//ui/webui/resources/cr_components/chromeos/network:cellular_utils.m",
"//ui/webui/resources/cr_components/chromeos/network:network_list_types.m",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
+ "//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
extra_deps = [ ":cellular_networks_list_module" ]
}
@@ -331,7 +354,10 @@ js_library("esim_rename_dialog.m") {
js_library("esim_remove_profile_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.m.js" ]
deps = [
+ "//chrome/browser/resources/settings:router",
+ "//chrome/browser/resources/settings/chromeos:os_route.m",
"//ui/webui/resources/cr_components/chromeos/cellular_setup:esim_manager_utils.m",
+ "//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -341,6 +367,7 @@ js_library("esim_remove_profile_dialog.m") {
group("polymer3_elements") {
public_deps = [
+ ":cellular_banner_module",
":cellular_networks_list_module",
":cellular_setup_dialog_module",
":esim_install_error_dialog_module",
@@ -361,11 +388,21 @@ group("polymer3_elements") {
]
}
+polymer_modulizer("cellular_banner") {
+ js_file = "cellular_banner.js"
+ html_file = "cellular_banner.html"
+ html_type = "dom-module"
+ auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
+ namespace_rewrites = os_settings_namespace_rewrites
+}
+
polymer_modulizer("internet_config") {
js_file = "internet_config.js"
html_file = "internet_config.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -374,6 +411,7 @@ polymer_modulizer("internet_detail_menu") {
html_file = "internet_detail_menu.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -382,6 +420,7 @@ polymer_modulizer("internet_detail_page") {
html_file = "internet_detail_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports + [ "chrome/browser/resources/settings/chromeos/internet_page/internet_page_browser_proxy.html|InternetPageBrowserProxy,InternetPageBrowserProxyImpl" ]
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -390,6 +429,7 @@ polymer_modulizer("internet_known_networks_page") {
html_file = "internet_known_networks_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -398,6 +438,7 @@ polymer_modulizer("internet_page") {
html_file = "internet_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -405,6 +446,7 @@ polymer_modulizer("internet_shared_css") {
js_file = "internet_shared_css.m.js"
html_file = "internet_shared_css.html"
html_type = "style-module"
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("internet_subpage") {
@@ -412,6 +454,7 @@ polymer_modulizer("internet_subpage") {
html_file = "internet_subpage.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -420,6 +463,7 @@ polymer_modulizer("network_proxy_section") {
html_file = "network_proxy_section.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -428,6 +472,7 @@ polymer_modulizer("network_summary") {
html_file = "network_summary.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -436,6 +481,7 @@ polymer_modulizer("network_summary_item") {
html_file = "network_summary_item.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -444,6 +490,7 @@ polymer_modulizer("tether_connection_dialog") {
html_file = "tether_connection_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites =
[ "cros_network_config.mojom.m.js|cros_network_config.mojom-lite.js" ]
}
@@ -453,6 +500,7 @@ polymer_modulizer("cellular_setup_dialog") {
html_file = "cellular_setup_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -461,6 +509,7 @@ polymer_modulizer("cellular_networks_list") {
html_file = "cellular_networks_list.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -469,6 +518,7 @@ polymer_modulizer("esim_install_error_dialog") {
html_file = "esim_install_error_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -477,6 +527,7 @@ polymer_modulizer("esim_rename_dialog") {
html_file = "esim_rename_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -485,6 +536,7 @@ polymer_modulizer("esim_remove_profile_dialog") {
html_file = "esim_remove_profile_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
index 58e816f2c16..cf9510c1227 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":kerberos_accounts.m",
@@ -24,8 +25,8 @@ js_library("kerberos_accounts.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../people_page:account_manager_browser_proxy.m",
+ "../..:router",
+ "../../people_page:account_manager_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:cr.m",
@@ -50,7 +51,7 @@ js_library("kerberos_add_account_dialog.m") {
deps = [
":kerberos_accounts_browser_proxy.m",
"..:metrics_recorder.m",
- "//chrome/browser/resources/settings/controls:settings_textarea.m",
+ "//chrome/browser/resources/settings/controls:settings_textarea",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
@@ -66,8 +67,8 @@ js_library("kerberos_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
- "../../settings_page:settings_animated_pages.m",
+ "../..:router",
+ "../../settings_page:settings_animated_pages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -82,7 +83,7 @@ group("polymer3_elements") {
":kerberos_add_account_dialog_module",
":kerberos_page_module",
":modulize",
- "../../people_page:polymer3_elements",
+ "../../people_page:web_components",
]
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
index 44b1ac21144..ab8cb38b928 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":localized_link.m" ]
}
@@ -30,6 +31,7 @@ polymer_modulizer("localized_link") {
html_file = "localized_link.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports =
os_settings_auto_imports +
[ "ui/webui/resources/html/assert.html|assert,assertNotReached" ]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index 07a6db99799..add0f2010bc 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":multidevice_browser_proxy.m",
@@ -60,7 +61,7 @@ js_library("multidevice_feature_item.m") {
":multidevice_feature_behavior.m",
"..:os_route.m",
"..:route_origin_behavior.m",
- "../..:router.m",
+ "../..:router",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -88,9 +89,9 @@ js_library("multidevice_page.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../controls:password_prompt_dialog.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../controls:password_prompt_dialog",
+ "../../prefs:prefs_behavior",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -128,8 +129,8 @@ js_library("multidevice_smartlock_subpage.m") {
"..:metrics_recorder.m",
"..:os_route.m",
"..:os_settings_routes.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -148,7 +149,7 @@ js_library("multidevice_subpage.m") {
"..:deep_linking_behavior.m",
"..:os_route.m",
"..:os_settings_routes.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior.m",
]
@@ -176,7 +177,7 @@ js_library("multidevice_task_continuation_item.m") {
":multidevice_feature_behavior.m",
":multidevice_feature_item.m",
":multidevice_task_continuation_disabled_link.m",
- "../../people_page:sync_browser_proxy.m",
+ "../../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
@@ -191,8 +192,8 @@ js_library("multidevice_wifi_sync_item.m") {
":multidevice_wifi_sync_disabled_link.m",
"..:os_route.m",
"..:route_origin_behavior.m",
- "../..:router.m",
- "../../people_page:sync_browser_proxy.m",
+ "../..:router",
+ "../../people_page:sync_browser_proxy",
"../os_people_page:os_sync_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -206,7 +207,7 @@ js_library("multidevice_task_continuation_disabled_link.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -220,7 +221,7 @@ js_library("multidevice_wifi_sync_disabled_link.m") {
":multidevice_feature_behavior.m",
"..:os_route.m",
"..:route_origin_behavior.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
index a50e06aa768..9c526816696 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
@@ -14,7 +14,11 @@ js_type_check("closure_compile_module") {
# TODO(crbug.com/1121865): browser_resolver_prefix_replacements allows path
# from ../../shared/* to resolve to ../../../nearby_share/shared/* for closure
# purposes.
- closure_flags = default_closure_args + [ "browser_resolver_prefix_replacements=\"../../shared/=../../../nearby_share/shared/\"" ]
+ closure_flags = os_settings_closure_flags + [
+ "js_module_root=../../chrome/browser/resources/nearby_share",
+ "js_module_root=./gen/chrome/browser/resources/nearby_share",
+ "browser_resolver_prefix_replacements=\"../../shared/=../../../nearby_share/shared/\"",
+ ]
deps = [
":nearby_share_confirm_page.m",
":nearby_share_contact_visibility_dialog.m",
@@ -54,9 +58,9 @@ js_library("nearby_share_data_usage_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.m.js" ]
deps = [
":types.m",
- "../../prefs:prefs.m",
- "../../prefs:prefs_behavior.m",
- "../../prefs:prefs_types.m",
+ "../../prefs:prefs",
+ "../../prefs:prefs_behavior",
+ "../../prefs:prefs_types",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button.m",
@@ -101,7 +105,7 @@ js_library("nearby_share_receive_dialog.m") {
"//chrome/browser/resources/nearby_share/shared:nearby_visibility_page.m",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -117,7 +121,7 @@ js_library("nearby_share_receive_manager.m") {
"//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":modulize" ]
@@ -135,14 +139,14 @@ js_library("nearby_share_subpage.m") {
":types.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs.m",
- "../../prefs:prefs_behavior.m",
- "../../prefs:prefs_types.m",
+ "../..:router",
+ "../../prefs:prefs",
+ "../../prefs:prefs_behavior",
+ "../../prefs:prefs_types",
"//chrome/browser/resources/nearby_share/shared:nearby_onboarding_page.m",
"//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior.m",
"//chrome/browser/resources/nearby_share/shared:nearby_visibility_page.m",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data",
@@ -179,8 +183,7 @@ group("polymer3_elements") {
":nearby_share_high_visibility_page_module",
":nearby_share_receive_dialog_module",
":nearby_share_subpage_module",
- "../../controls:polymer3_elements",
- "../../prefs:polymer3_elements",
+ "../../controls:web_components",
"//chrome/browser/ui/webui/nearby_share:mojom_js",
]
}
@@ -205,6 +208,7 @@ polymer_modulizer("nearby_share_confirm_page") {
html_file = "nearby_share_confirm_page.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -214,6 +218,7 @@ polymer_modulizer("nearby_share_contact_visibility_dialog") {
html_type = "dom-module"
namespace_rewrites =
os_settings_namespace_rewrites + nearby_shared_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports =
os_settings_auto_imports + nearby_shared_auto_imports_closure_fix
}
@@ -223,6 +228,7 @@ polymer_modulizer("nearby_share_data_usage_dialog") {
html_file = "nearby_share_data_usage_dialog.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -232,6 +238,7 @@ polymer_modulizer("nearby_share_device_name_dialog") {
html_type = "dom-module"
namespace_rewrites =
os_settings_namespace_rewrites + nearby_shared_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports =
os_settings_auto_imports + nearby_shared_auto_imports_closure_fix
}
@@ -241,6 +248,7 @@ polymer_modulizer("nearby_share_high_visibility_page") {
html_file = "nearby_share_high_visibility_page.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -261,6 +269,7 @@ polymer_modulizer("nearby_share_subpage") {
html_type = "dom-module"
namespace_rewrites =
os_settings_namespace_rewrites + nearby_shared_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports =
os_settings_auto_imports + nearby_shared_auto_imports_closure_fix +
[ "chrome/browser/resources/settings/chromeos/os_route.html|routes" ]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/on_startup_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/on_startup_page/BUILD.gn
index 0619e64a67c..971803b7255 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/on_startup_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/on_startup_page/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":on_startup_page.m" ]
}
@@ -17,9 +18,9 @@ js_library("on_startup_page.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
- "../../settings_page:settings_animated_pages.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
+ "../../settings_page:settings_animated_pages",
"//services/device/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index 4755f099244..1301a0d2835 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -6,8 +6,10 @@ import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":externs.m",
@@ -34,13 +36,14 @@ js_library("manage_a11y_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.m.js" ]
deps = [
":manage_a11y_page_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
"//chrome/browser/resources/settings/chromeos:route_origin_behavior.m",
"//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy.m",
- "//chrome/browser/resources/settings/controls:settings_slider.m",
- "//chrome/browser/resources/settings/controls:settings_toggle_button.m",
+ "//chrome/browser/resources/settings/controls:settings_slider",
+ "//chrome/browser/resources/settings/controls:settings_toggle_button",
+ "//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
@@ -58,12 +61,13 @@ js_library("os_a11y_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.m.js" ]
deps = [
":os_a11y_page_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
- "//chrome/browser/resources/settings/a11y_page:captions_subpage.m",
- "//chrome/browser/resources/settings/appearance_page:fonts_browser_proxy.m",
+ "//chrome/browser/resources/settings:router",
+ "//chrome/browser/resources/settings/a11y_page:captions_subpage",
+ "//chrome/browser/resources/settings/a11y_page:live_caption_section",
+ "//chrome/browser/resources/settings/appearance_page:fonts_browser_proxy",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/settings_page:settings_animated_pages.m",
+ "//chrome/browser/resources/settings/settings_page:settings_animated_pages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -82,7 +86,7 @@ js_library("switch_access_action_assignment_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.m.js" ]
deps = [
":switch_access_constants.m",
- "//chrome/browser/resources/settings/prefs:prefs_behavior.m",
+ "//chrome/browser/resources/settings/prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -105,7 +109,7 @@ js_library("switch_access_setup_guide_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.m.js" ]
deps = [
":switch_access_constants.m",
- "//chrome/browser/resources/settings/prefs:prefs_behavior.m",
+ "//chrome/browser/resources/settings/prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -121,10 +125,10 @@ js_library("switch_access_subpage.m") {
deps = [
":switch_access_constants.m",
":switch_access_subpage_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/prefs:prefs_behavior.m",
+ "//chrome/browser/resources/settings/prefs:prefs_behavior",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -143,11 +147,11 @@ js_library("tts_subpage.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.m.js" ]
deps = [
":tts_subpage_browser_proxy.m",
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
- "//chrome/browser/resources/settings/controls:settings_slider.m",
- "//chrome/browser/resources/settings/languages_page:languages_browser_proxy.m",
+ "//chrome/browser/resources/settings/controls:settings_slider",
+ "//chrome/browser/resources/settings/languages_page:languages_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m",
@@ -183,6 +187,7 @@ polymer_modulizer("manage_a11y_page") {
html_file = "manage_a11y_page.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -192,6 +197,7 @@ polymer_modulizer("os_a11y_page") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("switch_access_action_assignment_dialog") {
@@ -199,6 +205,7 @@ polymer_modulizer("switch_access_action_assignment_dialog") {
html_file = "switch_access_action_assignment_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -207,6 +214,7 @@ polymer_modulizer("switch_access_setup_guide_dialog") {
html_file = "switch_access_setup_guide_dialog.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -215,6 +223,7 @@ polymer_modulizer("switch_access_subpage") {
html_file = "switch_access_subpage.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
@@ -223,6 +232,7 @@ polymer_modulizer("tts_subpage") {
html_file = "tts_subpage.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
index 47997a80ae3..b1b4c16d9c5 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":channel_switcher_dialog.m",
@@ -22,7 +23,7 @@ js_type_check("closure_compile_module") {
js_library("channel_switcher_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.m.js" ]
deps = [
- "../../about_page:about_page_browser_proxy.m",
+ "../../about_page:about_page_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -37,10 +38,11 @@ js_library("detailed_build_info.m") {
":edit_hostname_dialog.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../about_page:about_page_browser_proxy.m",
+ "../..:router",
+ "../../about_page:about_page_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
+ "//ui/webui/resources/cr_elements/policy:cr_tooltip_icon.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":detailed_build_info_module" ]
@@ -56,7 +58,7 @@ js_library("device_name_browser_proxy.m") {
js_library("edit_hostname_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/edit_hostname_dialog.m.js" ]
deps = [
- "../../about_page:about_page_browser_proxy.m",
+ "../../about_page:about_page_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -71,9 +73,9 @@ js_library("os_about_page.m") {
"..:deep_linking_behavior.m",
"..:os_route.m",
"../..:i18n_setup",
- "../..:lifetime_browser_proxy.m",
- "../..:router.m",
- "../../about_page:about_page_browser_proxy.m",
+ "../..:lifetime_browser_proxy",
+ "../..:router",
+ "../../about_page:about_page_browser_proxy",
"../os_settings_page:main_page_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -87,7 +89,7 @@ js_library("os_about_page.m") {
js_library("update_warning_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.m.js" ]
deps = [
- "../../about_page:about_page_browser_proxy.m",
+ "../../about_page:about_page_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -109,7 +111,7 @@ polymer_modulizer("channel_switcher_dialog") {
js_file = "channel_switcher_dialog.js"
html_file = "channel_switcher_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -118,7 +120,7 @@ polymer_modulizer("detailed_build_info") {
js_file = "detailed_build_info.js"
html_file = "detailed_build_info.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -127,7 +129,7 @@ polymer_modulizer("edit_hostname_dialog") {
js_file = "edit_hostname_dialog.js"
html_file = "edit_hostname_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -136,7 +138,7 @@ polymer_modulizer("os_about_page") {
js_file = "os_about_page.js"
html_file = "os_about_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -145,7 +147,7 @@ polymer_modulizer("update_warning_dialog") {
js_file = "update_warning_dialog.js"
html_file = "update_warning_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
index ec07547bc9c..610e4b68b5b 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":android_apps_browser_proxy.m",
@@ -27,8 +28,8 @@ js_library("android_apps_subpage.m") {
":android_apps_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -44,9 +45,9 @@ js_library("os_apps_page.m") {
":android_apps_subpage.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../../:router.m",
- "../../prefs:prefs_behavior.m",
- "../../settings_page:settings_animated_pages.m",
+ "../../:router",
+ "../../prefs:prefs_behavior",
+ "../../settings_page:settings_animated_pages",
"../localized_link:localized_link.m",
"./app_management_page:constants.m",
"./app_management_page:store_client.m",
@@ -69,7 +70,7 @@ polymer_modulizer("android_apps_subpage") {
js_file = "android_apps_subpage.js"
html_file = "android_apps_subpage.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -78,7 +79,7 @@ polymer_modulizer("os_apps_page") {
js_file = "os_apps_page.js"
html_file = "os_apps_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
index a6e7ada57db..3d3487b1401 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
@@ -9,6 +9,7 @@ import("../../os_settings.gni")
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = os_settings_closure_flags
deps = [
":actions.m",
":api_listener.m",
@@ -65,7 +66,7 @@ js_library("app_detail_view.m") {
":dom_switch.m",
":store_client.m",
"../..:os_route.m",
- "../../..:router.m",
+ "../../..:router",
"./plugin_vm_page:plugin_vm_detail_view.m",
"//ui/webui/resources/js:assert.m",
]
@@ -91,6 +92,7 @@ js_library("app_management_page.m") {
":main_view.m",
":store.m",
":store_client.m",
+ "../../..:router",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
extra_deps = [ ":app_management_page_module" ]
@@ -167,7 +169,7 @@ js_library("main_view.m") {
":store_client.m",
":util.m",
"../..:os_route.m",
- "../../..:router.m",
+ "../../..:router",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
@@ -292,7 +294,7 @@ js_library("util.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/util.m.js" ]
deps = [
"../..:os_route.m",
- "../../..:router.m",
+ "../../..:router",
]
extra_deps = [ ":modulize" ]
}
@@ -322,7 +324,7 @@ polymer_modulizer("app_detail_view") {
js_file = "app_detail_view.js"
html_file = "app_detail_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -331,7 +333,7 @@ polymer_modulizer("app_item") {
js_file = "app_item.js"
html_file = "app_item.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -340,7 +342,7 @@ polymer_modulizer("app_management_page") {
js_file = "app_management_page.js"
html_file = "app_management_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -349,7 +351,7 @@ polymer_modulizer("arc_detail_view") {
js_file = "arc_detail_view.js"
html_file = "arc_detail_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -358,7 +360,7 @@ polymer_modulizer("chrome_app_detail_view") {
js_file = "chrome_app_detail_view.js"
html_file = "chrome_app_detail_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -367,7 +369,7 @@ polymer_modulizer("dom_switch") {
js_file = "dom_switch.js"
html_file = "dom_switch.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -382,7 +384,7 @@ polymer_modulizer("main_view") {
js_file = "main_view.js"
html_file = "main_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -391,7 +393,7 @@ polymer_modulizer("permission_item") {
js_file = "permission_item.js"
html_file = "permission_item.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -400,7 +402,7 @@ polymer_modulizer("pin_to_shelf_item") {
js_file = "pin_to_shelf_item.js"
html_file = "pin_to_shelf_item.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -409,7 +411,7 @@ polymer_modulizer("pwa_detail_view") {
js_file = "pwa_detail_view.js"
html_file = "pwa_detail_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -430,7 +432,7 @@ polymer_modulizer("toggle_row") {
js_file = "toggle_row.js"
html_file = "toggle_row.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -439,7 +441,7 @@ polymer_modulizer("uninstall_button") {
js_file = "uninstall_button.js"
html_file = "uninstall_button.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
index 821c119f7e4..c707d42be48 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
@@ -9,6 +9,7 @@ import("../../../os_settings.gni")
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = os_settings_closure_flags
deps = [
":plugin_vm_browser_proxy.m",
":plugin_vm_detail_view.m",
@@ -30,7 +31,7 @@ js_library("plugin_vm_detail_view.m") {
"../:store_client.m",
"../:util.m",
"../../..:os_route.m",
- "../../../..:router.m",
+ "../../../..:router",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -49,7 +50,7 @@ polymer_modulizer("plugin_vm_detail_view") {
js_file = "plugin_vm_detail_view.js"
html_file = "plugin_vm_detail_view.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
index 3afdf177347..ac2deececa2 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":os_files_page.m",
@@ -19,7 +20,7 @@ js_library("os_files_page.m") {
deps = [
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
]
extra_deps = [ ":os_files_page_module" ]
}
@@ -28,7 +29,7 @@ js_library("smb_shares_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_files_page/smb_shares_page.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
extra_deps = [ ":smb_shares_page_module" ]
@@ -47,6 +48,7 @@ polymer_modulizer("os_files_page") {
html_file = "os_files_page.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -55,5 +57,6 @@ polymer_modulizer("smb_shares_page") {
html_file = "smb_shares_page.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
index 69d47f8e850..19681d78a16 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -8,9 +8,11 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":add_input_methods_dialog.m",
+ ":add_spellcheck_languages_dialog",
":change_device_language_dialog.m",
":input_method_options_page.m",
":input_method_util.m",
@@ -31,14 +33,28 @@ js_library("add_input_methods_dialog.m") {
extra_deps = [ ":add_input_methods_dialog_module" ]
}
+js_library("add_spellcheck_languages_dialog") {
+ deps = [
+ "..:metrics_recorder.m",
+ "../../languages_page:languages_types",
+ "../../prefs:prefs_behavior",
+ "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
+ "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ ]
+}
+
js_library("change_device_language_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.m.js" ]
deps = [
- "../..:lifetime_browser_proxy.m",
- "../../languages_page:languages.m",
+ "../..:lifetime_browser_proxy",
+ "../../languages_page:languages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
extra_deps = [ ":change_device_language_dialog_module" ]
}
@@ -53,7 +69,7 @@ js_library("input_method_options_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.m.js" ]
deps = [
":input_method_util.m",
- "../../prefs:prefs.m",
+ "../../prefs:prefs",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":input_method_options_page_module" ]
@@ -63,13 +79,14 @@ js_library("input_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.m.js" ]
deps = [
":add_input_methods_dialog.m",
+ ":add_spellcheck_languages_dialog",
":input_method_util.m",
":languages_metrics_proxy.m",
":os_edit_dictionary_page.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
"../..:i18n_setup",
- "../..:router.m",
+ "../..:router",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -94,11 +111,11 @@ js_library("manage_input_methods_page.m") {
js_library("os_add_languages_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.m.js" ]
deps = [
- "../../languages_page:languages.m",
+ "../../languages_page:languages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
extra_deps = [ ":os_add_languages_dialog_module" ]
}
@@ -107,8 +124,8 @@ js_library("os_edit_dictionary_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.m.js" ]
deps = [
"..:os_route.m",
- "../..:global_scroll_target_behavior.m",
- "../../languages_page:languages_browser_proxy.m",
+ "../..:global_scroll_target_behavior",
+ "../../languages_page:languages_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
@@ -126,8 +143,8 @@ js_library("os_languages_page.m") {
"..:metrics_recorder.m",
"..:os_route.m",
"../..:i18n_setup",
- "../..:lifetime_browser_proxy.m",
- "../..:router.m",
+ "../..:lifetime_browser_proxy",
+ "../..:router",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
@@ -149,7 +166,7 @@ js_library("os_languages_page_v2.m") {
"..:metrics_recorder.m",
"..:os_route.m",
"../..:i18n_setup",
- "../..:router.m",
+ "../..:router",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
@@ -169,10 +186,10 @@ js_library("os_languages_section.m") {
":manage_input_methods_page.m",
":os_languages_page.m",
"..:os_route.m",
- "../..:router.m",
- "../../languages_page:languages.m",
- "../../settings_page:settings_animated_pages.m",
- "../../settings_page:settings_subpage.m",
+ "../..:router",
+ "../../languages_page:languages",
+ "../../settings_page:settings_animated_pages",
+ "../../settings_page:settings_subpage",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -186,8 +203,8 @@ js_library("smart_inputs_page.m") {
deps = [
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs_behavior.m",
+ "../..:router",
+ "../../prefs:prefs_behavior",
"//ui/webui/resources/js:load_time_data.m",
]
extra_deps = [ ":smart_inputs_page_module" ]
@@ -196,6 +213,7 @@ js_library("smart_inputs_page.m") {
group("polymer3_elements") {
public_deps = [
":add_input_methods_dialog_module",
+ ":add_spellcheck_languages_dialog_module",
":change_device_language_dialog_module",
":input_method_options_page_module",
":input_page_module",
@@ -209,8 +227,6 @@ group("polymer3_elements") {
":shared_style_module",
":shared_vars_module",
":smart_inputs_page_module",
- "../../languages_page:languages_module",
- "../../languages_page:modulize",
]
}
@@ -218,16 +234,22 @@ polymer_modulizer("add_input_methods_dialog") {
js_file = "add_input_methods_dialog.js"
html_file = "add_input_methods_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
+polymer_modulizer("add_spellcheck_languages_dialog") {
+ js_file = "add_spellcheck_languages_dialog.js"
+ html_file = "add_spellcheck_languages_dialog.html"
+ html_type = "v3-ready"
+}
+
polymer_modulizer("change_device_language_dialog") {
js_file = "change_device_language_dialog.js"
html_file = "change_device_language_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -236,7 +258,7 @@ polymer_modulizer("manage_input_methods_page") {
js_file = "manage_input_methods_page.js"
html_file = "manage_input_methods_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -245,7 +267,7 @@ polymer_modulizer("os_add_languages_dialog") {
js_file = "os_add_languages_dialog.js"
html_file = "os_add_languages_dialog.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -254,7 +276,7 @@ polymer_modulizer("os_edit_dictionary_page") {
js_file = "os_edit_dictionary_page.js"
html_file = "os_edit_dictionary_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -263,7 +285,7 @@ polymer_modulizer("os_languages_page") {
js_file = "os_languages_page.js"
html_file = "os_languages_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -272,7 +294,7 @@ polymer_modulizer("os_languages_page_v2") {
js_file = "os_languages_page_v2.js"
html_file = "os_languages_page_v2.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -281,7 +303,7 @@ polymer_modulizer("os_languages_section") {
js_file = "os_languages_section.js"
html_file = "os_languages_section.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -290,7 +312,7 @@ polymer_modulizer("input_method_options_page") {
js_file = "input_method_options_page.js"
html_file = "input_method_options_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -299,7 +321,7 @@ polymer_modulizer("input_page") {
js_file = "input_page.js"
html_file = "input_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -320,7 +342,7 @@ polymer_modulizer("smart_inputs_page") {
js_file = "smart_inputs_page.js"
html_file = "smart_inputs_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
index 88f73f2b261..02d006c3737 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":account_manager.m",
@@ -33,8 +34,8 @@ js_library("account_manager.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
- "../../people_page:account_manager_browser_proxy.m",
+ "../..:router",
+ "../../people_page:account_manager_browser_proxy",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
@@ -62,7 +63,7 @@ js_library("fingerprint_list.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior",
"//third_party/polymer/v3_0/components-chromium/paper-ripple:paper-ripple",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -83,14 +84,15 @@ js_library("lock_screen.m") {
":lock_state_behavior.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../controls:settings_dropdown_menu.m",
- "../../controls:settings_toggle_button.m",
+ "../..:router",
+ "../../controls:settings_dropdown_menu",
+ "../../controls:settings_toggle_button",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/quick_unlock:lock_screen_constants.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js:plural_string_proxy",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
@@ -101,7 +103,7 @@ js_library("lock_screen_password_prompt_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.m.js" ]
deps = [
":lock_state_behavior.m",
- "../../controls:password_prompt_dialog.m",
+ "../../controls:password_prompt_dialog",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/quick_unlock:lock_screen_constants.m",
]
@@ -111,7 +113,7 @@ js_library("lock_screen_password_prompt_dialog.m") {
js_library("lock_state_behavior.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.m.js" ]
deps = [
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -131,15 +133,15 @@ js_library("os_people_page.m") {
"..:deep_linking_behavior.m",
"..:os_page_visibility.m",
"..:os_route.m",
- "../..:router.m",
- "../../settings_page:settings_animated_pages.m",
+ "../..:router",
+ "../../settings_page:settings_animated_pages",
"../kerberos_page:kerberos_accounts.m",
"../localized_link:localized_link.m",
"../parental_controls_page:parental_controls_page.m",
- "//chrome/browser/resources/settings/people_page:profile_info_browser_proxy.m",
- "//chrome/browser/resources/settings/people_page:signout_dialog.m",
- "//chrome/browser/resources/settings/people_page:sync_browser_proxy.m",
- "//chrome/browser/resources/settings/people_page:sync_page.m",
+ "//chrome/browser/resources/settings/people_page:profile_info_browser_proxy",
+ "//chrome/browser/resources/settings/people_page:signout_dialog",
+ "//chrome/browser/resources/settings/people_page:sync_browser_proxy",
+ "//chrome/browser/resources/settings/people_page:sync_page",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/quick_unlock:lock_screen_constants.m",
"//ui/webui/resources/cr_elements/chromeos/cr_picture:png.m",
@@ -170,7 +172,7 @@ js_library("os_sync_controls.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../../:router.m",
+ "../../:router",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
@@ -198,7 +200,7 @@ js_library("setup_pin_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.m.js" ]
deps = [
":lock_screen_password_prompt_dialog.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/chromeos/quick_unlock:setup_pin_keyboard.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -210,7 +212,7 @@ js_library("user_list.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/user_list.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -240,7 +242,7 @@ js_library("users_page.m") {
":users_add_user_dialog.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
@@ -263,8 +265,8 @@ group("polymer3_elements") {
":user_list_module",
":users_add_user_dialog_module",
":users_page_module",
- "../../:icons_module",
- "../../people_page:polymer3_elements",
+ "../..:web_components_local",
+ "../../people_page:web_components",
"../../privacy_page:polymer3_elements",
"../kerberos_page:polymer3_elements",
]
@@ -274,7 +276,7 @@ polymer_modulizer("account_manager") {
js_file = "account_manager.js"
html_file = "account_manager.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
@@ -337,6 +339,7 @@ polymer_modulizer("pin_autosubmit_dialog") {
js_file = "pin_autosubmit_dialog.js"
html_file = "pin_autosubmit_dialog.html"
html_type = "dom-module"
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("setup_pin_dialog") {
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
index 218e1301e60..64da7e4bddf 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":cups_add_print_server_dialog.m",
@@ -121,7 +122,7 @@ js_library("cups_printers.m") {
":cups_settings_add_printer_dialog.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior.m",
"//ui/webui/resources/cr_components/chromeos/network:onc_mojo.m",
"//ui/webui/resources/js:assert.m",
@@ -183,7 +184,7 @@ js_library("os_printing_page.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
index e80213c79f6..5e9fc8687ad 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":os_privacy_page.m",
@@ -22,7 +23,7 @@ js_library("os_privacy_page.m") {
":peripheral_data_access_protection_dialog.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"../os_people_page:lock_screen.m",
"../os_people_page:lock_state_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -43,7 +44,7 @@ js_library("peripheral_data_access_browser_proxy.m") {
js_library("peripheral_data_access_protection_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_privacy_page/peripheral_data_access_protection_dialog.m.js" ]
deps = [
- "../../prefs:prefs_behavior.m",
+ "../../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
]
@@ -63,6 +64,7 @@ polymer_modulizer("os_privacy_page") {
html_file = "os_privacy_page.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -71,6 +73,7 @@ polymer_modulizer("peripheral_data_access_protection_dialog") {
html_file = "peripheral_data_access_protection_dialog.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
index 618d4db00de..6903b003c2c 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":os_powerwash_dialog.m",
@@ -21,7 +22,7 @@ js_library("os_powerwash_dialog.m") {
deps = [
":os_reset_browser_proxy.m",
"..:metrics_recorder.m",
- "../..:lifetime_browser_proxy.m",
+ "../..:lifetime_browser_proxy",
"../localized_link:localized_link.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
@@ -42,7 +43,7 @@ js_library("os_reset_page.m") {
deps = [
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
@@ -63,6 +64,7 @@ polymer_modulizer("os_powerwash_dialog") {
html_file = "os_powerwash_dialog.html"
html_type = "dom-module"
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
}
@@ -70,7 +72,7 @@ polymer_modulizer("os_reset_page") {
js_file = "os_reset_page.js"
html_file = "os_reset_page.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports +
[ "ui/webui/resources/html/assert.html|assert" ]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
index f42bfc52f91..2e44bd6f19c 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
@@ -5,8 +5,10 @@
import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":os_search_page.m",
@@ -17,16 +19,16 @@ js_type_check("closure_compile_module") {
js_library("os_search_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.m.js" ]
deps = [
- "//chrome/browser/resources/settings:router.m",
+ "//chrome/browser/resources/settings:router",
"//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
"//chrome/browser/resources/settings/chromeos:os_route.m",
"//chrome/browser/resources/settings/chromeos/google_assistant_page:google_assistant_page.m",
- "//chrome/browser/resources/settings/controls:extension_controlled_indicator.m",
- "//chrome/browser/resources/settings/search_engines_page:search_engines_browser_proxy.m",
- "//chrome/browser/resources/settings/settings_page:settings_animated_pages.m",
- "//chrome/browser/resources/settings/settings_page:settings_subpage.m",
+ "//chrome/browser/resources/settings/controls:extension_controlled_indicator",
+ "//chrome/browser/resources/settings/search_engines_page:search_engines_browser_proxy",
+ "//chrome/browser/resources/settings/settings_page:settings_animated_pages",
+ "//chrome/browser/resources/settings/settings_page:settings_subpage",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row.m",
+ "//ui/webui/resources/cr_elements/cr_link_row:cr_link_row",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
@@ -40,6 +42,7 @@ js_library("os_search_page.m") {
js_library("os_search_selection_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_search_page/os_search_selection_dialog.m.js" ]
deps = [
+ "//chrome/browser/resources/settings/search_engines_page:search_engines_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -63,6 +66,7 @@ polymer_modulizer("os_search_page") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("os_search_selection_dialog") {
@@ -71,4 +75,5 @@ polymer_modulizer("os_search_selection_dialog") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings.gni b/chromium/chrome/browser/resources/settings/chromeos/os_settings.gni
index a700060df85..5c5f43530ab 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -7,6 +7,39 @@ import("//ui/webui/resources/cr_components/chromeos/os_cr_components.gni")
import("//ui/webui/resources/cr_elements/chromeos/os_cr_elements.gni")
import("../settings.gni")
+# Common namespace rewrites for all polymer_modulizer() or js_modulizer()
+# targets in Settings.
+settings_namespace_rewrites = [
+ "Polymer.DomIf|DomIf",
+ "Polymer.IronResizableBehavior|IronResizableBehavior",
+ "settings.AboutPageBrowserProxy|AboutPageBrowserProxy",
+ "settings.Account|Account",
+ "settings.AccountManagerBrowserProxy|AccountManagerBrowserProxy",
+ "settings.ExtensionControlBrowserProxy|ExtensionControlBrowserProxy",
+ "settings.FontsBrowserProxy|FontsBrowserProxy",
+ "settings.LanguagesBrowserProxy|LanguagesBrowserProxy",
+ "settings.LifetimeBrowserProxy|LifetimeBrowserProxy",
+ "settings.MetricsReporting|MetricsReporting",
+ "settings.MinimumRoutes|MinimumRoutes",
+ "settings.PageStatus|PageStatus",
+ "Settings.PrefUtil.prefToString|prefToString",
+ "Settings.PrefUtil.stringToPrefValue|stringToPrefValue",
+ "settings.PrivacyPageBrowserProxy|PrivacyPageBrowserProxy",
+ "settings.ProfileInfo|ProfileInfo",
+ "settings.ResolverOption|ResolverOption",
+ "settings.Route|Route",
+ "settings.SearchEnginesBrowserProxy|SearchEnginesBrowserProxy",
+ "settings.SearchRequest|SearchRequest",
+ "settings.SecureDnsMode|SecureDnsMode",
+ "settings.SecureDnsSetting|SecureDnsSetting",
+ "settings.SecureDnsUiManagementMode|SecureDnsUiManagementMode",
+ "settings.StatusAction|StatusAction",
+ "settings.StoredAccount|StoredAccount",
+ "settings.SyncBrowserProxy|SyncBrowserProxy",
+ "settings.SyncPrefs|SyncPrefs",
+ "settings.SyncStatus|SyncStatus",
+]
+
os_settings_namespace_rewrites = settings_namespace_rewrites +
cr_components_chromeos_namespace_rewrites +
cr_elements_chromeos_namespace_rewrites + [
@@ -152,6 +185,16 @@ os_settings_namespace_rewrites = settings_namespace_rewrites +
"settings.recordNavigation|recordNavigation",
]
+settings_auto_imports = [
+ "chrome/browser/resources/settings/controls/pref_control_behavior.html|PrefControlBehavior",
+ "chrome/browser/resources/settings/controls/settings_boolean_control_behavior.html|SettingsBooleanControlBehavior",
+ "chrome/browser/resources/settings/extension_control_browser_proxy.html|ExtensionControlBrowserProxyImpl,ExtensionControlBrowserProxy",
+ "chrome/browser/resources/settings/i18n_setup.html|loadTimeData",
+ "chrome/browser/resources/settings/prefs/prefs_behavior.html|PrefsBehavior",
+ "chrome/browser/resources/settings/prefs/prefs_types.html|CrSettingsPrefs",
+ "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior",
+]
+
os_settings_auto_imports = settings_auto_imports +
cr_components_chromeos_auto_imports +
cr_elements_chromeos_auto_imports + [
@@ -190,7 +233,6 @@ os_settings_auto_imports = settings_auto_imports +
"chrome/browser/resources/settings/chromeos/os_settings_routes.html|OsSettingsRoutes",
"chrome/browser/resources/settings/chromeos/personalization_page/change_picture_browser_proxy.html|ChangePictureBrowserProxy,ChangePictureBrowserProxyImpl,DefaultImage",
"chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_browser_proxy.html|WallpaperBrowserProxy,WallpaperBrowserProxyImpl",
- "chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_constants.html|WallpaperCollection",
"chrome/browser/resources/settings/chromeos/parental_controls_page/parental_controls_browser_proxy.html|ParentalControlsBrowserProxy,ParentalControlsBrowserProxyImpl",
"chrome/browser/resources/settings/chromeos/route_origin_behavior.html|RouteOriginBehaviorImpl,RouteOriginBehavior",
"chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.html|FontsBrowserProxy,FontsBrowserProxyImpl",
@@ -223,6 +265,7 @@ os_settings_auto_imports = settings_auto_imports +
"ui/webui/resources/html/icon.html|getImage",
"ui/webui/resources/html/list_property_update_behavior.html|ListPropertyUpdateBehavior",
"ui/webui/resources/html/parse_html_subset.html|parseHtmlSubset",
+ "ui/webui/resources/html/plural_string_proxy.html|PluralStringProxyImpl",
"ui/webui/resources/html/polymer.html|afterNextRender,Polymer,html,flush,Templatizer,TemplateInstanceBase",
"ui/webui/resources/html/util.html|HTMLEscape,listenOnce",
"ui/webui/resources/html/web_ui_listener_behavior.html|WebUIListenerBehavior",
@@ -240,4 +283,62 @@ os_settings_auto_imports = settings_auto_imports +
"third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior.html|IronResizableBehavior",
]
-os_settings_migrated_imports = settings_migrated_imports
+os_settings_closure_flags = settings_closure_flags
+
+os_settings_migrated_imports = [
+ "chrome/browser/resources/settings/a11y_page/captions_subpage.html",
+ "chrome/browser/resources/settings/about_page/about_page_browser_proxy.html",
+ "chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.html",
+ "chrome/browser/resources/settings/chromeos/os_languages_page/add_spellcheck_languages_dialog.html",
+ "chrome/browser/resources/settings/controls/controlled_button.html",
+ "chrome/browser/resources/settings/controls/controlled_radio_button.html",
+ "chrome/browser/resources/settings/controls/extension_controlled_indicator.html",
+ "chrome/browser/resources/settings/controls/password_prompt_dialog.html",
+ "chrome/browser/resources/settings/controls/pref_control_behavior.html",
+ "chrome/browser/resources/settings/controls/settings_boolean_control_behavior.html",
+ "chrome/browser/resources/settings/controls/settings_dropdown_menu.html",
+ "chrome/browser/resources/settings/controls/settings_radio_group.html",
+ "chrome/browser/resources/settings/controls/settings_slider.html",
+ "chrome/browser/resources/settings/controls/settings_textarea.html",
+ "chrome/browser/resources/settings/controls/settings_toggle_button.html",
+ "chrome/browser/resources/settings/ensure_lazy_loaded.html",
+ "chrome/browser/resources/settings/extension_control_browser_proxy.html",
+ "chrome/browser/resources/settings/global_scroll_target_behavior.html",
+ "chrome/browser/resources/settings/i18n_setup.html",
+ "chrome/browser/resources/settings/icons.html",
+ "chrome/browser/resources/settings/languages_page/languages_browser_proxy.html",
+ "chrome/browser/resources/settings/languages_page/languages.html",
+ "chrome/browser/resources/settings/lifetime_browser_proxy.html",
+ "chrome/browser/resources/settings/people_page/account_manager_browser_proxy.html",
+ "chrome/browser/resources/settings/people_page/profile_info_browser_proxy.html",
+ "chrome/browser/resources/settings/people_page/signout_dialog.html",
+ "chrome/browser/resources/settings/people_page/sync_browser_proxy.html",
+ "chrome/browser/resources/settings/people_page/sync_controls.html",
+ "chrome/browser/resources/settings/people_page/sync_page.html",
+ "chrome/browser/resources/settings/prefs/prefs_behavior.html",
+ "chrome/browser/resources/settings/prefs/prefs.html",
+ "chrome/browser/resources/settings/prefs/prefs_types.html",
+ "chrome/browser/resources/settings/prefs/pref_util.html",
+ "chrome/browser/resources/settings/privacy_page/personalization_options.html",
+ "chrome/browser/resources/settings/router.html",
+ "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html",
+ "chrome/browser/resources/settings/search_settings.html",
+ "chrome/browser/resources/settings/setting_id_param_util.html",
+ "chrome/browser/resources/settings/settings_main/settings_main.html",
+ "chrome/browser/resources/settings/settings_menu/settings_menu.html",
+ "chrome/browser/resources/settings/settings_page/settings_animated_pages.html",
+ "chrome/browser/resources/settings/settings_page/settings_section.html",
+ "chrome/browser/resources/settings/settings_page/settings_subpage.html",
+ "chrome/browser/resources/settings/settings_page_css.html",
+ "chrome/browser/resources/settings/settings_shared_css.html",
+ "chrome/browser/resources/settings/settings_vars_css.html",
+ "ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html",
+ "ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html",
+ "ui/webui/resources/cr_elements/cr_page_host_style_css.html",
+ "ui/webui/resources/cr_elements/cr_search_field/cr_search_field.html",
+ "ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html",
+ "ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html",
+ "ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.html",
+ "ui/webui/resources/cr_elements/find_shortcut_behavior.html",
+ "ui/webui/resources/html/plural_string_proxy.html",
+]
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
index a9aaff5e783..969036418b4 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
@@ -6,8 +6,10 @@ import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":os_settings_main.m" ]
}
@@ -17,7 +19,7 @@ js_library("os_settings_main.m") {
deps = [
"..:os_page_visibility.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"../os_settings_page:os_settings_page.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -33,7 +35,7 @@ polymer_modulizer("os_settings_main") {
js_file = "os_settings_main.js"
html_file = "os_settings_main.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
index 71c10d6f5bd..aef012681f4 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
@@ -5,8 +5,10 @@
import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":os_settings_menu.m" ]
}
@@ -15,7 +17,7 @@ js_library("os_settings_menu.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.m.js" ]
deps = [
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
@@ -31,5 +33,6 @@ polymer_modulizer("os_settings_menu") {
html_file = "os_settings_menu.html"
html_type = "dom-module"
auto_imports = os_settings_auto_imports
+ migrated_imports = os_settings_migrated_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
index d51d3857ab5..fd02dd04d2d 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":main_page_behavior.m",
@@ -23,9 +24,9 @@ js_library("os_settings_page.m") {
":settings_idle_load.m",
"..:os_page_visibility.m",
"..:os_route.m",
- "../..:router.m",
- "../..:search_settings.m",
- "../../settings_page:settings_section.m",
+ "../..:router",
+ "../..:search_settings",
+ "../../settings_page:settings_section",
"../bluetooth_page:bluetooth_page.m",
"../crostini_page:crostini_page.m",
"../device_page:device_page.m",
@@ -52,8 +53,8 @@ js_library("os_settings_page.m") {
js_library("main_page_behavior.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.m.js" ]
deps = [
- "../..:router.m",
- "../../settings_page:settings_section.m",
+ "../..:router",
+ "../../settings_page:settings_section",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:util.m",
@@ -88,6 +89,7 @@ polymer_modulizer("os_settings_page") {
"ui/webui/resources/html/assert.html|assert",
]
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("settings_idle_load") {
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
index 4a76273af01..826d6d1f797 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":os_search_result_row.m",
@@ -20,7 +21,7 @@ js_library("os_search_result_row.m") {
"..:os_icons.m",
"..:os_route.m",
"..:search_handler.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -38,12 +39,12 @@ js_library("os_settings_search_box.m") {
"..:metrics_recorder.m",
"..:os_route.m",
"..:search_handler.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/iron-dropdown:iron-dropdown",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -64,6 +65,7 @@ polymer_modulizer("os_search_result_row") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
polymer_modulizer("os_settings_search_box") {
@@ -72,4 +74,5 @@ polymer_modulizer("os_settings_search_box") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
index 2cbe86eabb7..a2b8f537430 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
@@ -5,8 +5,10 @@
import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
+import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":os_settings_ui.m" ]
}
@@ -18,14 +20,14 @@ js_library("os_settings_ui.m") {
"..:os_page_visibility.m",
"..:os_route.m",
"..:pref_to_setting_metric_converter.m",
- "../..:router.m",
- "../../prefs:prefs.m",
+ "../..:router",
+ "../../prefs:prefs",
"../os_settings_main:os_settings_main.m",
"../os_toolbar:os_toolbar.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_container_shadow_behavior.m",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:util.m",
@@ -41,7 +43,7 @@ polymer_modulizer("os_settings_ui") {
js_file = "os_settings_ui.js"
html_file = "os_settings_ui.html"
html_type = "dom-module"
- migrated_imports = settings_migrated_imports
+ migrated_imports = os_settings_migrated_imports
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
index 072b6c1a1d2..3969ca60e76 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/polymer/polymer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [ ":os_toolbar.m" ]
}
@@ -17,7 +18,7 @@ js_library("os_toolbar.m") {
"../os_settings_search_box:os_settings_search_box.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
"//ui/webui/resources/js:load_time_data.m",
]
extra_deps = [ ":os_toolbar_module" ]
@@ -33,4 +34,5 @@ polymer_modulizer("os_toolbar") {
html_type = "dom-module"
auto_imports = os_settings_auto_imports
namespace_rewrites = os_settings_namespace_rewrites
+ migrated_imports = os_settings_migrated_imports
}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
index 1b66dbff9c6..8979a80416c 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
@@ -8,6 +8,7 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":parental_controls_browser_proxy.m",
@@ -24,7 +25,7 @@ js_library("parental_controls_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/parental_controls_page/parental_controls_page.m.js" ]
deps = [
":parental_controls_browser_proxy.m",
- "../..:router.m",
+ "../..:router",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
index 0130ac7611c..01f6e29059d 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
@@ -8,14 +8,13 @@ import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile_module") {
+ closure_flags = os_settings_closure_flags
is_polymer3 = true
deps = [
":change_picture.m",
":change_picture_browser_proxy.m",
":personalization_page.m",
":wallpaper_browser_proxy.m",
- ":wallpaper_constants.m",
- ":wallpaper_subpage.m",
]
}
@@ -26,7 +25,7 @@ js_library("change_picture.m") {
"..:deep_linking_behavior.m",
"..:metrics_recorder.m",
"..:os_route.m",
- "../..:router.m",
+ "../..:router",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/iron-selector:iron-selector",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -54,9 +53,9 @@ js_library("personalization_page.m") {
":wallpaper_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
- "../..:router.m",
- "../../prefs:prefs.m",
- "../../settings_page:settings_animated_pages.m",
+ "../..:router",
+ "../../prefs:prefs",
+ "../../settings_page:settings_animated_pages",
"../ambient_mode_page:ambient_mode_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
@@ -66,33 +65,15 @@ js_library("personalization_page.m") {
js_library("wallpaper_browser_proxy.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_browser_proxy.m.js" ]
- deps = [ ":wallpaper_constants.m" ]
externs_list = [ "$externs_path/chrome_send.js" ]
extra_deps = [ ":modulize" ]
}
-js_library("wallpaper_constants.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_constants.m.js" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("wallpaper_subpage.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_subpage.m.js" ]
- deps = [
- ":wallpaper_browser_proxy.m",
- ":wallpaper_constants.m",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:i18n_behavior.m",
- ]
- extra_deps = [ ":wallpaper_subpage_module" ]
-}
-
group("polymer3_elements") {
public_deps = [
":change_picture_module",
":modulize",
":personalization_page_module",
- ":wallpaper_subpage_module",
]
}
@@ -117,20 +98,10 @@ polymer_modulizer("personalization_page") {
auto_imports = os_settings_auto_imports
}
-polymer_modulizer("wallpaper_subpage") {
- js_file = "wallpaper_subpage.js"
- html_file = "wallpaper_subpage.html"
- html_type = "dom-module"
- migrated_imports = os_settings_migrated_imports
- namespace_rewrites = os_settings_namespace_rewrites
- auto_imports = os_settings_auto_imports
-}
-
js_modulizer("modulize") {
input_files = [
"change_picture_browser_proxy.js",
"wallpaper_browser_proxy.js",
- "wallpaper_constants.js",
]
namespace_rewrites = os_settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn b/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
index a7d9d965421..88363c9eb79 100644
--- a/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
@@ -26,10 +26,10 @@ js_library("clear_browsing_data_dialog") {
deps = [
":clear_browsing_data_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"../controls:settings_checkbox",
- "../controls:settings_dropdown_menu.m",
- "../people_page:sync_browser_proxy.m",
+ "../controls:settings_dropdown_menu",
+ "../people_page:sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/controls/BUILD.gn b/chromium/chrome/browser/resources/settings/controls/BUILD.gn
index 5c7ff591492..edf4f98dc26 100644
--- a/chromium/chrome/browser/resources/settings/controls/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/controls/BUILD.gn
@@ -4,12 +4,11 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":controlled_button",
":controlled_radio_button",
@@ -17,7 +16,9 @@ js_type_check("closure_compile") {
":password_prompt_dialog",
":pref_control_behavior",
":settings_boolean_control_behavior",
+ ":settings_checkbox",
":settings_dropdown_menu",
+ ":settings_idle_load",
":settings_radio_group",
":settings_slider",
":settings_textarea",
@@ -28,7 +29,8 @@ js_type_check("closure_compile") {
js_library("controlled_button") {
deps = [
":pref_control_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
]
}
@@ -36,183 +38,58 @@ js_library("controlled_radio_button") {
deps = [
":pref_control_behavior",
"../prefs:pref_util",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior:iron-a11y-keys-behavior-extracted",
- "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior",
- "//ui/webui/resources/js:assert",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("extension_controlled_indicator") {
- deps = [
- "..:extension_control_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_library("password_prompt_dialog") {
- deps = [
- "..:router",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
- ]
- externs_list = chrome_extension_public_externs +
- [ "$externs_path/quick_unlock_private.js" ]
- extra_sources = [ "$interfaces_path/quick_unlock_private_interface.js" ]
-}
-
-js_library("pref_control_behavior") {
- deps = [ "../prefs:prefs_types" ]
-}
-
-js_library("settings_boolean_control_behavior") {
- deps = [
- ":pref_control_behavior",
- "../prefs:prefs_types",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
- ]
-}
-
-js_library("settings_dropdown_menu") {
- deps = [
- ":pref_control_behavior",
- "../prefs:pref_util",
- "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("settings_radio_group") {
- deps = [
- ":pref_control_behavior",
- "../prefs:pref_util",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("settings_slider") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_slider:cr_slider",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
- ]
-}
-
-js_library("settings_textarea") {
-}
-
-js_library("settings_toggle_button") {
- deps = [
- ":settings_boolean_control_behavior",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- closure_flags = settings_closure_flags
- deps = [
- ":controlled_button.m",
- ":controlled_radio_button.m",
- ":extension_controlled_indicator.m",
- ":password_prompt_dialog.m",
- ":pref_control_behavior.m",
- ":settings_boolean_control_behavior.m",
- ":settings_checkbox",
- ":settings_dropdown_menu.m",
- ":settings_idle_load",
- ":settings_radio_group.m",
- ":settings_slider.m",
- ":settings_textarea.m",
- ":settings_toggle_button.m",
- ]
-}
-
-js_library("controlled_button.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/controlled_button.m.js" ]
- deps = [
- ":pref_control_behavior.m",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
- ]
- extra_deps = [ ":controlled_button_module" ]
-}
-
-js_library("controlled_radio_button.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/controlled_radio_button.m.js" ]
- deps = [
- ":pref_control_behavior.m",
- "../prefs:pref_util.m",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-keys-behavior:iron-a11y-keys-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior.m",
"//ui/webui/resources/js:assert.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":controlled_radio_button_module" ]
}
-js_library("extension_controlled_indicator.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/extension_controlled_indicator.m.js" ]
+js_library("extension_controlled_indicator") {
deps = [
- "..:extension_control_browser_proxy.m",
+ "..:extension_control_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":extension_controlled_indicator_module" ]
}
-js_library("password_prompt_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/password_prompt_dialog.m.js" ]
+js_library("password_prompt_dialog") {
deps = [
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
]
externs_list = chrome_extension_public_externs +
[ "$externs_path/quick_unlock_private.js" ]
- extra_deps = [ ":password_prompt_dialog_module" ]
}
-js_library("pref_control_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/pref_control_behavior.m.js" ]
- deps = [ "../prefs:prefs_types.m" ]
- extra_deps = [ ":modulize" ]
+js_library("pref_control_behavior") {
+ deps = [ "../prefs:prefs_types" ]
}
-js_library("settings_boolean_control_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.m.js" ]
+js_library("settings_boolean_control_behavior") {
deps = [
- ":pref_control_behavior.m",
- "../prefs:prefs_types.m",
+ ":pref_control_behavior",
+ "../prefs:prefs_types",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":modulize" ]
}
js_library("settings_checkbox") {
deps = [
- ":settings_boolean_control_behavior.m",
+ ":settings_boolean_control_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
-js_library("settings_dropdown_menu.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_dropdown_menu.m.js" ]
+js_library("settings_dropdown_menu") {
deps = [
- ":pref_control_behavior.m",
- "../prefs:pref_util.m",
+ ":pref_control_behavior",
+ "../prefs:pref_util",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
@@ -220,7 +97,6 @@ js_library("settings_dropdown_menu.m") {
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":settings_dropdown_menu_module" ]
}
js_library("settings_idle_load") {
@@ -230,20 +106,17 @@ js_library("settings_idle_load") {
]
}
-js_library("settings_radio_group.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_radio_group.m.js" ]
+js_library("settings_radio_group") {
deps = [
- ":pref_control_behavior.m",
- "../prefs:pref_util.m",
+ ":pref_control_behavior",
+ "../prefs:pref_util",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":settings_radio_group_module" ]
}
-js_library("settings_slider.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_slider.m.js" ]
+js_library("settings_slider") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_slider:cr_slider.m",
@@ -251,134 +124,33 @@ js_library("settings_slider.m") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":settings_slider_module" ]
}
-js_library("settings_textarea.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_textarea.m.js" ]
+js_library("settings_textarea") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":settings_textarea_module" ]
}
-js_library("settings_toggle_button.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_toggle_button.m.js" ]
+js_library("settings_toggle_button") {
deps = [
- ":settings_boolean_control_behavior.m",
+ ":settings_boolean_control_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
]
- extra_deps = [ ":settings_toggle_button_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":controlled_button_module",
- ":controlled_radio_button_module",
- ":extension_controlled_indicator_module",
- ":modulize",
- ":password_prompt_dialog_module",
- ":settings_dropdown_menu_module",
- ":settings_radio_group_module",
- ":settings_slider_module",
- ":settings_textarea_module",
- ":settings_toggle_button_module",
- ":web_components",
- ]
}
html_to_js("web_components") {
- js_files = [ "settings_checkbox.js" ]
-}
-
-polymer_modulizer("controlled_button") {
- js_file = "controlled_button.js"
- html_file = "controlled_button.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports
- migrated_imports = settings_migrated_imports
-}
-
-polymer_modulizer("controlled_radio_button") {
- js_file = "controlled_radio_button.js"
- html_file = "controlled_radio_button.html"
- html_type = "dom-module"
- auto_imports =
- settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/prefs/pref_util.html|prefToString",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("extension_controlled_indicator") {
- js_file = "extension_controlled_indicator.js"
- html_file = "extension_controlled_indicator.html"
- html_type = "dom-module"
- auto_imports = [
- "chrome/browser/resources/settings/extension_control_browser_proxy.html|ExtensionControlBrowserProxyImpl",
- "ui/webui/resources/html/assert.html|assert",
- ]
- migrated_imports = settings_migrated_imports
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("password_prompt_dialog") {
- js_file = "password_prompt_dialog.js"
- html_file = "password_prompt_dialog.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("settings_dropdown_menu") {
- js_file = "settings_dropdown_menu.js"
- html_file = "settings_dropdown_menu.html"
- html_type = "dom-module"
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/prefs/pref_util.html|stringToPrefValue, prefToString",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("settings_radio_group") {
- js_file = "settings_radio_group.js"
- html_file = "settings_radio_group.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/prefs/pref_util.html|stringToPrefValue, prefToString" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("settings_slider") {
- js_file = "settings_slider.js"
- html_file = "settings_slider.html"
- html_type = "dom-module"
- migrated_imports = settings_migrated_imports
- auto_imports =
- settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/cr_elements/cr_slider/cr_slider.html|SliderTick",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("settings_textarea") {
- js_file = "settings_textarea.js"
- html_file = "settings_textarea.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("settings_toggle_button") {
- js_file = "settings_toggle_button.js"
- html_file = "settings_toggle_button.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports
-}
-
-js_modulizer("modulize") {
- input_files = [
- "pref_control_behavior.js",
- "settings_boolean_control_behavior.js",
+ js_files = [
+ "controlled_button.js",
+ "controlled_radio_button.js",
+ "extension_controlled_indicator.js",
+ "password_prompt_dialog.js",
+ "settings_checkbox.js",
+ "settings_dropdown_menu.js",
+ "settings_radio_group.js",
+ "settings_slider.js",
+ "settings_textarea.js",
+ "settings_toggle_button.js",
]
}
diff --git a/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn b/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
index a8679afb78f..7de15a4e178 100644
--- a/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
@@ -22,7 +22,7 @@ js_library("downloads_browser_proxy") {
js_library("downloads_page") {
deps = [
":downloads_browser_proxy",
- "../prefs:prefs_behavior.m",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:util.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn b/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
index 0b69fea713b..6b0e3218101 100644
--- a/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
@@ -4,64 +4,16 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [
- ":languages",
- ":languages_browser_proxy",
- ]
-}
-
-js_library("languages_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [
- "$externs_path/chrome_send.js",
- "$externs_path/input_method_private.js",
- "$externs_path/language_settings_private.js",
- ]
- extra_sources = [
- "$interfaces_path/input_method_private_interface.js",
- "$interfaces_path/language_settings_private_interface.js",
- ]
-}
-
-js_library("languages") {
- deps = [
- ":languages_browser_proxy",
- ":languages_types",
- "../prefs",
- "../prefs:prefs_types",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:promise_resolver",
- ]
- externs_list = [
- "$externs_path/input_method_private.js",
- "$externs_path/language_settings_private.js",
- ]
- extra_sources = [
- "$interfaces_path/input_method_private_interface.js",
- "$interfaces_path/language_settings_private_interface.js",
- ]
-}
-
-js_library("languages_types") {
- externs_list = [ "$externs_path/language_settings_private.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
deps = [
":add_languages_dialog",
":edit_dictionary_page",
- ":languages.m",
- ":languages_browser_proxy.m",
+ ":languages",
+ ":languages_browser_proxy",
":languages_metrics_proxy",
":languages_page",
":languages_settings_metrics_proxy",
@@ -70,23 +22,26 @@ js_type_check("closure_compile_module") {
]
}
+js_library("languages_types") {
+ externs_list = [ "$externs_path/language_settings_private.js" ]
+}
+
js_library("add_languages_dialog") {
deps = [
- ":languages.m",
":languages_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
]
}
js_library("edit_dictionary_page") {
deps = [
- ":languages_browser_proxy.m",
- "..:global_scroll_target_behavior.m",
+ ":languages_browser_proxy",
+ "..:global_scroll_target_behavior",
"..:route",
- "../prefs:prefs.m",
+ "../prefs:prefs",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
@@ -94,14 +49,13 @@ js_library("edit_dictionary_page") {
]
}
-js_library("languages.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/languages.m.js" ]
+js_library("languages") {
deps = [
- ":languages_browser_proxy.m",
+ ":languages_browser_proxy",
":languages_types",
- "../prefs:prefs.m",
- "../prefs:prefs_behavior.m",
- "../prefs:prefs_types.m",
+ "../prefs:prefs",
+ "../prefs:prefs_behavior",
+ "../prefs:prefs_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
@@ -117,11 +71,9 @@ js_library("languages.m") {
"$interfaces_path/input_method_private_interface.js",
"$interfaces_path/language_settings_private_interface.js",
]
- extra_deps = [ ":languages_module" ]
}
-js_library("languages_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/languages_browser_proxy.m.js" ]
+js_library("languages_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [
"$externs_path/chrome_send.js",
@@ -132,7 +84,6 @@ js_library("languages_browser_proxy.m") {
"$interfaces_path/input_method_private_interface.js",
"$interfaces_path/language_settings_private_interface.js",
]
- extra_deps = [ ":modulize" ]
}
js_library("languages_metrics_proxy") {
@@ -147,13 +98,13 @@ js_library("languages_settings_metrics_proxy") {
js_library("languages_page") {
deps = [
- ":languages.m",
+ ":languages",
":languages_metrics_proxy",
":languages_settings_metrics_proxy",
- "..:lifetime_browser_proxy.m",
+ "..:lifetime_browser_proxy",
"..:route",
- "..:router.m",
- "../settings_page:settings_animated_pages.m",
+ "..:router",
+ "../settings_page:settings_animated_pages",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m",
"//ui/webui/resources/js:assert.m",
@@ -165,12 +116,12 @@ js_library("languages_page") {
js_library("languages_subpage") {
deps = [
- ":languages.m",
+ ":languages",
":languages_metrics_proxy",
":languages_settings_metrics_proxy",
- "..:lifetime_browser_proxy.m",
+ "..:lifetime_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
@@ -181,14 +132,6 @@ js_library("languages_subpage") {
]
}
-group("polymer3_elements") {
- public_deps = [
- ":languages_module",
- ":modulize",
- ":web_components",
- ]
-}
-
html_to_js("web_components") {
js_files = [
"add_languages_dialog.js",
@@ -197,20 +140,3 @@ html_to_js("web_components") {
"languages_subpage.js",
]
}
-
-polymer_modulizer("languages") {
- js_file = "languages.js"
- html_file = "languages.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/languages_page/languages_browser_proxy.html|LanguagesBrowserProxy,LanguagesBrowserProxyImpl",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|isChromeOS, isWindows",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-js_modulizer("modulize") {
- input_files = [ "languages_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/people_page/BUILD.gn b/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
index afc593c57eb..9e66b15d73d 100644
--- a/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -5,13 +5,14 @@
import("//build/config/chromeos/ui_mode.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags + mojom_js_args
deps = [
+ ":account_manager_browser_proxy",
+ ":people_page",
":profile_info_browser_proxy",
":signout_dialog",
":sync_account_control",
@@ -21,99 +22,6 @@ js_type_check("closure_compile") {
":sync_page",
]
- if (is_chromeos_ash) {
- deps += [ ":account_manager_browser_proxy" ]
- }
-}
-
-js_library("account_manager_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("profile_info_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("signout_dialog") {
- deps = [
- ":profile_info_browser_proxy",
- ":sync_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("sync_page") {
- deps = [
- ":sync_account_control",
- ":sync_browser_proxy",
- ":sync_encryption_options",
- "../privacy_page:personalization_options",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("sync_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
-
- externs_list = [ "$externs_path/metrics_private.js" ]
-}
-
-js_library("sync_controls") {
- deps = [ "..:router" ]
-}
-
-js_library("sync_account_control") {
- deps = [
- ":profile_info_browser_proxy",
- ":sync_browser_proxy",
- "..:router",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("sync_encryption_options") {
- deps = [
- ":sync_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_input",
- "//ui/webui/resources/cr_elements/cr_radio_group",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- closure_flags = settings_closure_flags + mojom_js_args
- deps = [
- ":account_manager_browser_proxy.m",
- ":people_page",
- ":profile_info_browser_proxy.m",
- ":signout_dialog.m",
- ":sync_account_control.m",
- ":sync_browser_proxy.m",
- ":sync_controls.m",
- ":sync_encryption_options.m",
- ":sync_page.m",
- ]
-
if (!is_chromeos_ash) {
deps += [
":import_data_browser_proxy",
@@ -124,10 +32,8 @@ js_type_check("closure_compile_module") {
}
}
-js_library("account_manager_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/account_manager_browser_proxy.m.js" ]
+js_library("account_manager_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
if (!is_chromeos_ash) {
@@ -140,7 +46,7 @@ if (!is_chromeos_ash) {
deps = [
":import_data_browser_proxy",
"../controls:settings_checkbox",
- "../prefs:prefs_behavior.m",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -150,10 +56,10 @@ if (!is_chromeos_ash) {
js_library("manage_profile") {
deps = [
":manage_profile_browser_proxy",
- ":sync_browser_proxy.m",
+ ":sync_browser_proxy",
"..:i18n_setup",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_components/customize_themes",
]
@@ -169,14 +75,14 @@ if (!is_chromeos_ash) {
js_library("people_page") {
deps = [
- ":account_manager_browser_proxy.m",
- ":profile_info_browser_proxy.m",
- ":sync_browser_proxy.m",
+ ":account_manager_browser_proxy",
+ ":profile_info_browser_proxy",
+ ":sync_browser_proxy",
"..:i18n_setup",
"..:open_window_proxy",
"..:page_visibility",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/chromeos/cr_picture:png.m",
"//ui/webui/resources/cr_elements/cr_toast:cr_toast.m",
@@ -187,99 +93,80 @@ js_library("people_page") {
]
}
-js_library("profile_info_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/profile_info_browser_proxy.m.js" ]
+js_library("profile_info_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("signout_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/signout_dialog.m.js" ]
+js_library("signout_dialog") {
deps = [
- ":profile_info_browser_proxy.m",
- ":sync_browser_proxy.m",
+ ":profile_info_browser_proxy",
+ ":sync_browser_proxy",
"..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":signout_dialog_module" ]
}
-js_library("sync_account_control.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_account_control.m.js" ]
+js_library("sync_account_control") {
deps = [
- ":sync_browser_proxy.m",
+ ":sync_browser_proxy",
"..:i18n_setup",
- "..:router.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":sync_account_control_module" ]
}
-js_library("sync_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_browser_proxy.m.js" ]
+js_library("sync_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [ "$externs_path/metrics_private.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("sync_controls.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_controls.m.js" ]
+js_library("sync_controls") {
deps = [
- ":sync_browser_proxy.m",
+ ":sync_browser_proxy",
"..:i18n_setup",
- "..:router.m",
+ "..:router",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":sync_controls_module" ]
}
-js_library("sync_encryption_options.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_encryption_options.m.js" ]
+js_library("sync_encryption_options") {
deps = [
- ":sync_browser_proxy.m",
+ ":sync_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_radio_group:cr_radio_group.m",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":sync_encryption_options_module" ]
}
-js_library("sync_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_page.m.js" ]
+js_library("sync_page") {
deps = [
- ":sync_browser_proxy.m",
- ":sync_encryption_options.m",
+ ":sync_browser_proxy",
+ ":sync_encryption_options",
"..:i18n_setup",
- "..:router.m",
- "../privacy_page:personalization_options.m",
+ "..:router",
+ "../privacy_page:personalization_options",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":sync_page_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":signout_dialog_module",
- ":sync_account_control_module",
- ":sync_controls_module",
- ":sync_encryption_options_module",
- ":sync_page_module",
- ":web_components",
- ]
}
html_to_js("web_components") {
- js_files = [ "people_page.js" ]
+ js_files = [
+ "people_page.js",
+ "signout_dialog.js",
+ "sync_account_control.js",
+ "sync_controls.js",
+ "sync_encryption_options.js",
+ "sync_page.js",
+ ]
if (!is_chromeos_ash) {
js_files += [
@@ -288,76 +175,3 @@ html_to_js("web_components") {
]
}
}
-
-polymer_modulizer("signout_dialog") {
- js_file = "signout_dialog.js"
- html_file = "signout_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/people_page/profile_info_browser_proxy.html|ProfileInfoBrowserProxyImpl",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncStatus",
- ]
-}
-
-polymer_modulizer("sync_account_control") {
- js_file = "sync_account_control.js"
- html_file = "sync_account_control.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,SyncStatus,StatusAction,StoredAccount",
- "chrome/browser/resources/settings/router.html|Route,Router",
- "ui/webui/resources/html/assert.html|assert",
- ]
-}
-
-polymer_modulizer("sync_controls") {
- js_file = "sync_controls.js"
- html_file = "sync_controls.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,StatusAction,SyncStatus,SyncPrefs",
- "ui/webui/resources/html/assert.html|assert",
- ]
-}
-
-polymer_modulizer("sync_encryption_options") {
- js_file = "sync_encryption_options.js"
- html_file = "sync_encryption_options.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncPrefs,SyncStatus",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- ]
-}
-
-polymer_modulizer("sync_page") {
- js_file = "sync_page.js"
- html_file = "sync_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/polymer.html|Polymer,html,flush",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,PageStatus,StatusAction,SyncStatus,SyncPrefs",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [
- "account_manager_browser_proxy.js",
- "profile_info_browser_proxy.js",
- "sync_browser_proxy.js",
- ]
-
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/prefs/BUILD.gn b/chromium/chrome/browser/resources/settings/prefs/BUILD.gn
index 43c5a8d4055..12a790888f9 100644
--- a/chromium/chrome/browser/resources/settings/prefs/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/prefs/BUILD.gn
@@ -3,12 +3,10 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
deps = [
":pref_util",
":prefs",
@@ -18,94 +16,24 @@ js_type_check("closure_compile") {
}
js_library("pref_util") {
- deps = [ "//ui/webui/resources/js:cr" ]
+ deps = [ "//ui/webui/resources/js:assert.m" ]
externs_list = [ "$externs_path/settings_private.js" ]
}
js_library("prefs") {
deps = [
":pref_util",
- ":prefs_behavior",
":prefs_types",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
- extra_sources = [ "$interfaces_path/settings_private_interface.js" ]
-}
-
-js_library("prefs_behavior") {
- deps = [ "//ui/webui/resources/js:assert" ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("prefs_types") {
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":pref_util.m",
- ":prefs.m",
- ":prefs_behavior.m",
- ":prefs_types.m",
- ]
-}
-
-js_library("pref_util.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/prefs/pref_util.m.js" ]
- deps = [ "//ui/webui/resources/js:assert.m" ]
- externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("prefs.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/prefs/prefs.m.js" ]
- deps = [
- ":pref_util.m",
- ":prefs_types.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":prefs_module" ]
extra_sources = [ "$interfaces_path/settings_private_interface.js" ]
}
-js_library("prefs_behavior.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/prefs/prefs_behavior.m.js",
- ]
+js_library("prefs_behavior") {
deps = [ "//ui/webui/resources/js:assert.m" ]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("prefs_types.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/prefs/prefs_types.m.js",
- ]
- extra_deps = [ ":modulize" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":prefs_module",
- ]
-}
-
-polymer_modulizer("prefs") {
- js_file = "prefs.js"
- html_file = "prefs.html"
- html_type = "dom-module"
- auto_imports =
- settings_auto_imports + [ "ui/webui/resources/html/assert.html|assert" ]
-}
-
-js_modulizer("modulize") {
- input_files = [
- "prefs_behavior.js",
- "prefs_types.js",
- "pref_util.js",
- ]
+js_library("prefs_types") {
}
diff --git a/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
index 1dabaa4ed58..44d93bce35d 100644
--- a/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -4,40 +4,8 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [
- ":personalization_options",
- ":privacy_page_browser_proxy",
- ]
-}
-
-js_library("personalization_options") {
- deps = [
- ":privacy_page_browser_proxy",
- "..:router",
- "../controls:settings_toggle_button",
- "../people_page:signout_dialog",
- "../people_page:sync_browser_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("privacy_page_browser_proxy") {
- deps = [
- "..:lifetime_browser_proxy",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
@@ -46,9 +14,9 @@ js_type_check("closure_compile_module") {
":cookies_page",
":disable_safebrowsing_dialog",
":do_not_track_toggle",
- ":personalization_options.m",
+ ":personalization_options",
":privacy_page",
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
":secure_dns",
":secure_dns_input",
":security_keys_bio_enroll_dialog",
@@ -68,9 +36,9 @@ js_library("cookies_page") {
":do_not_track_toggle",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
- "../controls:settings_toggle_button.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../controls:settings_toggle_button",
+ "../prefs:prefs_behavior",
"../site_settings:site_list",
"../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -89,9 +57,9 @@ js_library("collapse_radio_button") {
js_library("secure_dns") {
deps = [
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
"..:i18n_setup",
- "../prefs:prefs_behavior.m",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
@@ -99,7 +67,7 @@ js_library("secure_dns") {
js_library("secure_dns_input") {
deps = [
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
"..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
@@ -115,39 +83,37 @@ js_library("disable_safebrowsing_dialog") {
js_library("do_not_track_toggle") {
deps = [
"..:metrics_browser_proxy",
- "../controls:settings_toggle_button.m",
+ "../controls:settings_toggle_button",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
}
-js_library("personalization_options.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/personalization_options.m.js" ]
+js_library("personalization_options") {
deps = [
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
"..:i18n_setup",
- "..:lifetime_browser_proxy.m",
- "../controls:settings_toggle_button.m",
- "../people_page:signout_dialog.m",
- "../people_page:sync_browser_proxy.m",
- "../prefs:prefs_behavior.m",
+ "..:lifetime_browser_proxy",
+ "../controls:settings_toggle_button",
+ "../people_page:signout_dialog",
+ "../people_page:sync_browser_proxy",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":personalization_options_module" ]
}
js_library("privacy_page") {
deps = [
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
"..:hats_browser_proxy",
"..:i18n_setup",
"..:metrics_browser_proxy",
"..:page_visibility",
"..:route",
- "..:router.m",
- "../controls:settings_toggle_button.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../controls:settings_toggle_button",
+ "../prefs:prefs_behavior",
"../site_settings:constants",
"../site_settings:site_data_details_subpage",
"../site_settings:site_settings_prefs_browser_proxy",
@@ -159,10 +125,8 @@ js_library("privacy_page") {
]
}
-js_library("privacy_page_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.m.js" ]
+js_library("privacy_page_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
js_library("security_keys_bio_enroll_dialog") {
@@ -230,32 +194,25 @@ js_library("security_keys_subpage") {
js_library("security_page") {
deps = [
":disable_safebrowsing_dialog",
- ":privacy_page_browser_proxy.m",
+ ":privacy_page_browser_proxy",
"..:i18n_setup",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../prefs:prefs_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
}
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":personalization_options_module",
- ":v3_ready_elements",
- ]
-}
-
-html_to_js("v3_ready_elements") {
+html_to_js("polymer3_elements") {
js_files = [
"collapse_radio_button.js",
"cookies_page.js",
"disable_safebrowsing_dialog.js",
"do_not_track_toggle.js",
+ "personalization_options.js",
"privacy_page.js",
"secure_dns.js",
"secure_dns_input.js",
@@ -268,21 +225,3 @@ html_to_js("v3_ready_elements") {
"security_page.js",
]
}
-
-polymer_modulizer("personalization_options") {
- js_file = "personalization_options.js"
- html_file = "personalization_options.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl,MetricsReporting",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|StatusAction,SyncStatus",
- "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxyImpl",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "privacy_page_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn b/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
index 02c4d2ecf3a..0dcbc7e5872 100644
--- a/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
@@ -25,7 +25,7 @@ js_library("reset_page") {
deps = [
":reset_profile_dialog",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
"//ui/webui/resources/js:assert",
@@ -37,7 +37,7 @@ js_library("reset_profile_banner") {
deps = [
":reset_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
]
@@ -47,7 +47,7 @@ js_library("reset_profile_dialog") {
deps = [
":reset_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
diff --git a/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn b/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
index cb944579003..a3bb95d3446 100644
--- a/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
@@ -42,7 +42,7 @@ js_library("safety_check_chrome_cleaner_child") {
":safety_check_child",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"../chrome_cleanup_page:chrome_cleanup_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -75,6 +75,7 @@ js_library("safety_check_page") {
":safety_check_updates_child",
"..:hats_browser_proxy",
"..:metrics_browser_proxy",
+ "..:route",
"../autofill_page:password_manager_proxy",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
@@ -90,7 +91,7 @@ js_library("safety_check_passwords_child") {
":safety_check_child",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"../autofill_page:password_manager_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -103,7 +104,7 @@ js_library("safety_check_safe_browsing_child") {
":safety_check_child",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -114,7 +115,7 @@ js_library("safety_check_safe_browsing_child") {
js_library("safety_check_updates_child") {
deps = [
":safety_check_child",
- "..:lifetime_browser_proxy.m",
+ "..:lifetime_browser_proxy",
"..:metrics_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
diff --git a/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn b/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
index 831f872d7ce..35dfeb6e5bd 100644
--- a/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
@@ -4,21 +4,8 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":search_engines_browser_proxy" ]
-}
-
-js_library("search_engines_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
@@ -26,7 +13,7 @@ js_type_check("closure_compile_module") {
":omnibox_extension_entry",
":search_engine_dialog",
":search_engine_entry",
- ":search_engines_browser_proxy.m",
+ ":search_engines_browser_proxy",
":search_engines_list",
":search_engines_page",
]
@@ -34,8 +21,8 @@ js_type_check("closure_compile_module") {
js_library("omnibox_extension_entry") {
deps = [
- ":search_engines_browser_proxy.m",
- "..:extension_control_browser_proxy.m",
+ ":search_engines_browser_proxy",
+ "..:extension_control_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:assert.m",
@@ -45,7 +32,7 @@ js_library("omnibox_extension_entry") {
js_library("search_engine_dialog") {
deps = [
- ":search_engines_browser_proxy.m",
+ ":search_engines_browser_proxy",
"..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -55,7 +42,7 @@ js_library("search_engine_dialog") {
js_library("search_engine_entry") {
deps = [
- ":search_engines_browser_proxy.m",
+ ":search_engines_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:assert.m",
@@ -63,23 +50,21 @@ js_library("search_engine_entry") {
]
}
-js_library("search_engines_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.m.js" ]
+js_library("search_engines_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
js_library("search_engines_list") {
deps = [
- ":search_engines_browser_proxy.m",
+ ":search_engines_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
js_library("search_engines_page") {
deps = [
- ":search_engines_browser_proxy.m",
- "..:global_scroll_target_behavior.m",
+ ":search_engines_browser_proxy",
+ "..:global_scroll_target_behavior",
"..:settings_routes",
"//third_party/polymer/v3_0/components-chromium/iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -88,14 +73,7 @@ js_library("search_engines_page") {
]
}
-group("web_components") {
- public_deps = [
- ":modulize",
- ":web_components_local",
- ]
-}
-
-html_to_js("web_components_local") {
+html_to_js("web_components") {
js_files = [
"omnibox_extension_entry.js",
"search_engine_dialog.js",
@@ -105,8 +83,3 @@ html_to_js("web_components_local") {
"search_engines_page.js",
]
}
-
-js_modulizer("modulize") {
- input_files = [ "search_engines_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/search_page/BUILD.gn b/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
index 19a32b66c7f..76bb08d3c96 100644
--- a/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
@@ -15,8 +15,8 @@ js_type_check("closure_compile_module") {
js_library("search_page") {
deps = [
"..:route",
- "..:router.m",
- "../search_engines_page:search_engines_browser_proxy.m",
+ "..:router",
+ "../search_engines_page:search_engines_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:cr.m",
]
diff --git a/chromium/chrome/browser/resources/settings/settings.gni b/chromium/chrome/browser/resources/settings/settings.gni
index c3de1fe6cf8..9dcf9e091a6 100644
--- a/chromium/chrome/browser/resources/settings/settings.gni
+++ b/chromium/chrome/browser/resources/settings/settings.gni
@@ -4,63 +4,8 @@
import("//third_party/closure_compiler/compile_js.gni")
-# Common namespace rewrites for all polymer_modulizer() or js_modulizer()
-# targets in Settings.
-settings_namespace_rewrites = [
- "cr.search_highlight_utils.createEmptySearchBubble|createEmptySearchBubble",
- "cr.search_highlight_utils.findAndRemoveHighlights|findAndRemoveHighlights",
- "cr.search_highlight_utils.highlight|highlight",
- "cr.search_highlight_utils.removeHighlights|removeHighlights",
- "cr.search_highlight_utils.stripDiacritics|stripDiacritics",
- "Polymer.DomIf|DomIf",
- "Polymer.IronResizableBehavior|IronResizableBehavior",
- "settings.AboutPageBrowserProxy|AboutPageBrowserProxy",
- "settings.Account|Account",
- "settings.AccountManagerBrowserProxy|AccountManagerBrowserProxy",
- "settings.ExtensionControlBrowserProxy|ExtensionControlBrowserProxy",
- "settings.FontsBrowserProxy|FontsBrowserProxy",
- "settings.LanguagesBrowserProxy|LanguagesBrowserProxy",
- "settings.LifetimeBrowserProxy|LifetimeBrowserProxy",
- "settings.MetricsReporting|MetricsReporting",
- "settings.MinimumRoutes|MinimumRoutes",
- "settings.PageStatus|PageStatus",
- "Settings.PrefUtil.prefToString|prefToString",
- "Settings.PrefUtil.stringToPrefValue|stringToPrefValue",
- "settings.PrivacyPageBrowserProxy|PrivacyPageBrowserProxy",
- "settings.ProfileInfo|ProfileInfo",
- "settings.ResolverOption|ResolverOption",
- "settings.Route|Route",
- "settings.SearchEnginesBrowserProxy|SearchEnginesBrowserProxy",
- "settings.SearchRequest|SearchRequest",
- "settings.SecureDnsMode|SecureDnsMode",
- "settings.SecureDnsSetting|SecureDnsSetting",
- "settings.SecureDnsUiManagementMode|SecureDnsUiManagementMode",
- "settings.StatusAction|StatusAction",
- "settings.StoredAccount|StoredAccount",
- "settings.SyncBrowserProxy|SyncBrowserProxy",
- "settings.SyncPrefs|SyncPrefs",
- "settings.SyncStatus|SyncStatus",
-]
-
-settings_auto_imports = [
- "chrome/browser/resources/settings/controls/pref_control_behavior.html|PrefControlBehavior",
- "chrome/browser/resources/settings/controls/settings_boolean_control_behavior.html|SettingsBooleanControlBehavior",
- "chrome/browser/resources/settings/extension_control_browser_proxy.html|ExtensionControlBrowserProxyImpl,ExtensionControlBrowserProxy",
- "chrome/browser/resources/settings/i18n_setup.html|loadTimeData",
- "chrome/browser/resources/settings/prefs/prefs_behavior.html|PrefsBehavior",
- "chrome/browser/resources/settings/prefs/prefs_types.html|CrSettingsPrefs",
- "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior",
-]
-
settings_closure_flags =
default_closure_args + [
"js_module_root=../../chrome/browser/resources/settings/",
"js_module_root=./gen/chrome/browser/resources/settings/",
]
-
-settings_migrated_imports = [
- "chrome/browser/resources/settings/i18n_setup.html",
- "chrome/browser/resources/settings/ensure_lazy_loaded.html",
- "chrome/browser/resources/settings/settings_main/settings_main.html",
- "chrome/browser/resources/settings/settings_menu/settings_menu.html",
-]
diff --git a/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
index 6b441420f80..32758a85b66 100644
--- a/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
@@ -16,10 +16,10 @@ js_library("settings_main") {
deps = [
"..:page_visibility",
"..:route",
- "..:router.m",
- "..:search_settings.m",
+ "..:router",
+ "..:search_settings",
"../about_page:about_page",
- "../about_page:about_page_browser_proxy.m",
+ "../about_page:about_page_browser_proxy",
"../basic_page:basic_page",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//ui/webui/resources/js:assert.m",
diff --git a/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
index eda91b4f18e..bbdd3074c81 100644
--- a/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
@@ -15,7 +15,7 @@ js_type_check("closure_compile_module") {
js_library("settings_menu") {
deps = [
"..:page_visibility",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
]
diff --git a/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
index def3e76c305..f1bffe2a7d0 100644
--- a/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
@@ -3,152 +3,68 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [
- ":settings_animated_pages",
- ":settings_section",
- ":settings_subpage",
- ]
-}
-
-js_library("settings_animated_pages") {
- deps = [
- ":settings_subpage",
- "..:router",
- "..:setting_id_param_util",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/pending_polymer.js" ]
-}
-
-js_library("settings_section") {
-}
-
-js_library("settings_subpage") {
- deps = [
- "..:router",
- "..:setting_id_param_util",
- "//third_party/polymer/v1_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior-extracted",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
closure_flags = settings_closure_flags
deps = [
":main_page_behavior",
- ":settings_animated_pages.m",
- ":settings_section.m",
- ":settings_subpage.m",
+ ":settings_animated_pages",
+ ":settings_section",
+ ":settings_subpage",
]
}
js_library("main_page_behavior") {
deps = [
- ":settings_section.m",
- "..:router.m",
+ ":settings_section",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:util.m",
]
}
-js_library("settings_animated_pages.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_page/settings_animated_pages.m.js" ]
+js_library("settings_animated_pages") {
deps = [
- ":settings_subpage.m",
- "..:router.m",
- "..:setting_id_param_util.m",
+ ":settings_subpage",
+ "..:router",
+ "..:setting_id_param_util",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":settings_animated_pages_module" ]
}
-js_library("settings_section.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_page/settings_section.m.js" ]
+js_library("settings_section") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":settings_section_module" ]
}
-js_library("settings_subpage.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_page/settings_subpage.m.js" ]
+js_library("settings_subpage") {
deps = [
- "..:router.m",
- "..:setting_id_param_util.m",
+ "..:router",
+ "..:setting_id_param_util",
"//third_party/polymer/v3_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":settings_subpage_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":settings_animated_pages_module",
- ":settings_section_module",
- ":settings_subpage_module",
- ]
}
-polymer_modulizer("settings_animated_pages") {
- js_file = "settings_animated_pages.js"
- html_file = "settings_animated_pages.html"
- html_type = "dom-module"
- auto_imports = [
- "chrome/browser/resources/settings/router.html|Route, Router, RouteObserverBehavior",
- "chrome/browser/resources/settings/setting_id_param_util.html|getSettingIdParameter",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/polymer.html|afterNextRender, dom, DomIf, html, Polymer",
+html_to_js("web_components") {
+ js_files = [
+ "settings_animated_pages.js",
+ "settings_section.js",
+ "settings_subpage.js",
]
- namespace_rewrites = settings_namespace_rewrites + [
- "Polymer.dom|dom",
- "Polymer.DomIf|DomIf",
- ]
-}
-
-polymer_modulizer("settings_section") {
- js_file = "settings_section.js"
- html_file = "settings_section.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("settings_subpage") {
- js_file = "settings_subpage.js"
- html_file = "settings_subpage.html"
- html_type = "dom-module"
- migrated_imports = settings_migrated_imports
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/router.html|RouteObserverBehavior,Router",
- "chrome/browser/resources/settings/setting_id_param_util.html|getSettingIdParameter",
- "third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior.html|IronResizableBehavior",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/polymer.html|html, Polymer, afterNextRender",
- "ui/webui/resources/html/util.html|listenOnce",
- ]
- namespace_rewrites = settings_namespace_rewrites +
- [ "Polymer.IronResizableBehavior|IronResizableBehavior" ]
}
diff --git a/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
index 2af69be5e69..471c48717cc 100644
--- a/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
@@ -14,20 +14,20 @@ js_type_check("closure_compile_module") {
js_library("settings_ui") {
deps = [
- "..:global_scroll_target_behavior.m",
+ "..:global_scroll_target_behavior",
"..:page_visibility",
"..:route",
- "..:router.m",
+ "..:router",
"../basic_page:basic_page",
- "../prefs:prefs.m",
+ "../prefs:prefs",
"../settings_main:settings_main",
"../settings_menu:settings_menu",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_container_shadow_behavior.m",
- "//ui/webui/resources/cr_elements:find_shortcut_behavior.m",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
+ "//ui/webui/resources/cr_elements:find_shortcut_behavior",
+ "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer",
"//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
diff --git a/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn b/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
index e7d6b859b7d..10726d3c580 100644
--- a/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
@@ -57,8 +57,8 @@ js_library("all_sites") {
":local_data_browser_proxy",
":site_settings_behavior",
":site_settings_prefs_browser_proxy",
- "..:global_scroll_target_behavior.m",
- "..:router.m",
+ "..:global_scroll_target_behavior",
+ "..:router",
"..:settings_routes",
"//third_party/polymer/v3_0/components-chromium/iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -174,7 +174,7 @@ js_library("settings_category_default_radio_group") {
deps = [
":constants",
":site_settings_behavior",
- "../controls:settings_radio_group.m",
+ "../controls:settings_radio_group",
"../privacy_page:collapse_radio_button",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
@@ -187,12 +187,12 @@ js_library("site_data") {
deps = [
":local_data_browser_proxy",
":site_settings_behavior",
- "..:global_scroll_target_behavior.m",
+ "..:global_scroll_target_behavior",
"..:metrics_browser_proxy",
"..:route",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -207,7 +207,7 @@ js_library("site_data_details_subpage") {
":local_data_browser_proxy",
"..:metrics_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
@@ -232,7 +232,7 @@ js_library("site_details") {
":site_settings_behavior",
":website_usage_browser_proxy",
"..:metrics_browser_proxy",
- "..:router.m",
+ "..:router",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -260,7 +260,7 @@ js_library("site_entry") {
":site_settings_behavior",
":site_settings_prefs_browser_proxy",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
@@ -295,7 +295,7 @@ js_library("site_list_entry") {
":constants",
":site_settings_behavior",
"..:route",
- "..:router.m",
+ "..:router",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
diff --git a/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
index 37b50fcd15c..3e4078bfe3e 100644
--- a/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
@@ -19,9 +19,9 @@ js_type_check("closure_compile_module") {
js_library("recent_site_permissions") {
deps = [
"..:route",
- "..:router.m",
- "../people_page:sync_browser_proxy.m",
- "../prefs:prefs_behavior.m",
+ "..:router",
+ "../people_page:sync_browser_proxy",
+ "../prefs:prefs_behavior",
"../site_settings:constants",
"../site_settings:site_settings_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -33,7 +33,7 @@ js_library("recent_site_permissions") {
js_library("site_settings_list") {
deps = [
- "..:router.m",
+ "..:router",
"../site_settings:constants",
"../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -49,7 +49,7 @@ js_library("site_settings_page") {
":recent_site_permissions",
":site_settings_list",
"..:route",
- "..:router.m",
+ "..:router",
"../site_settings:constants",
"../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chromium/chrome/browser/resources/settings/system_page/BUILD.gn b/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
index 276b5491ea9..21eff9ab251 100644
--- a/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
@@ -18,7 +18,7 @@ js_type_check("closure_compile_module") {
js_library("system_page") {
deps = [
":system_page_browser_proxy",
- "..:lifetime_browser_proxy.m",
+ "..:lifetime_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
externs_list = [ "$externs_path/settings_private.js" ]
diff --git a/chromium/chrome/browser/resources/signin/BUILD.gn b/chromium/chrome/browser/resources/signin/BUILD.gn
index 7be31ec8760..a48867dbfea 100644
--- a/chromium/chrome/browser/resources/signin/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/BUILD.gn
@@ -10,6 +10,7 @@ group("closure_compile") {
if (!is_chromeos_ash) {
deps += [
"dice_web_signin_intercept:closure_compile",
+ "enterprise_profile_welcome:closure_compile",
"profile_customization:closure_compile",
"profile_picker:closure_compile",
"signin_email_confirmation:closure_compile",
@@ -27,6 +28,7 @@ group("web_components") {
if (!is_chromeos_ash) {
public_deps += [
"dice_web_signin_intercept:web_components",
+ "enterprise_profile_welcome:web_components",
"profile_customization:web_components",
"signin_email_confirmation:web_components",
"signin_error:web_components",
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/BUILD.gn b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/BUILD.gn
new file mode 100644
index 00000000000..d83ec28644e
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/BUILD.gn
@@ -0,0 +1,32 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ deps = [
+ ":enterprise_profile_welcome_app",
+ ":enterprise_profile_welcome_browser_proxy",
+ ]
+}
+
+js_library("enterprise_profile_welcome_app") {
+ deps = [
+ ":enterprise_profile_welcome_browser_proxy",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
+ ]
+}
+
+js_library("enterprise_profile_welcome_browser_proxy") {
+ deps = [ "//ui/webui/resources/js:cr.m" ]
+ externs_list = [ "$externs_path/chrome_send.js" ]
+}
+
+html_to_js("web_components") {
+ js_files = [ "enterprise_profile_welcome_app.js" ]
+}
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/DIR_METADATA b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/DIR_METADATA
new file mode 100644
index 00000000000..3f722310112
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Services>SignIn"
+} \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/OWNERS b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/OWNERS
new file mode 100644
index 00000000000..6a54c090faf
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/OWNERS
@@ -0,0 +1,2 @@
+file://components/signin/OWNERS
+file://components/enterprise/OWNERS \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome.html b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome.html
new file mode 100644
index 00000000000..eed360db715
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+ <head>
+ <meta charset="utf-8">
+ <meta name="color-scheme" content="light dark">
+ <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ <link rel="import" href="signin_vars_css.html">
+ <style>
+ body {
+ margin: 0;
+ }
+ @media (prefers-color-scheme: dark) {
+ body {
+ --md-background-color: var(--signin-dark-customized-background-color);
+ background-color: var(--md-background-color);
+ }
+ }
+ </style>
+ <title>$i18n{enterpriseProfileWelcomeTitle}</title>
+ </head>
+ <body>
+ <enterprise-profile-welcome-app></enterprise-profile-welcome-app>
+ <script type="module" src="enterprise_profile_welcome_app.js"></script>
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
new file mode 100644
index 00000000000..2491622dbc2
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
@@ -0,0 +1,202 @@
+<style include="signin-dialog-shared">
+ :host {
+ --avatar-size: 100px;
+ --banner-height: 244px;
+ --footer-margin: 40px;
+ --text-font-size: 1.16em;
+ color: var(--cr-primary-text-color);
+ display: block;
+ }
+
+ .secondary {
+ color: var(--cr-secondary-text-color);
+ }
+
+ .action-container {
+ bottom: 0;
+ box-sizing: border-box;
+ position: absolute;
+ width: 100%;
+ }
+
+ #headerContainer {
+ background-color: var(--header-background-color);
+ height: var(--banner-height);
+ position: relative;
+ width: 100%;
+ }
+
+ #banner {
+ background-image: url(images/enterprise_profile_welcome_illustration.svg);
+ background-position: center;
+ background-repeat: no-repeat;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ z-index: 0;
+ }
+
+ #avatarContainer {
+ bottom: calc(var(--avatar-size)/-2);
+ height: var(--avatar-size);
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ width: var(--avatar-size);
+ z-index: 1;
+ }
+
+ #avatar {
+ border: 2px solid var(--md-background-color);
+ border-radius: 50%;
+ height: 100%;
+ width: 100%;
+ }
+
+ .work-badge {
+ --badge-width: 30px;
+ --badge-offset: -6px;
+ border: 3px solid white;
+ border-radius: 50%;
+ bottom: var(--badge-offset);
+ height: var(--badge-width);
+ inset-inline-end: var(--badge-offset);
+ position: absolute;
+ width: var(--badge-width);
+ }
+
+ .work-badge > iron-icon {
+ --work-icon-size: 20px;
+ background-color: var(--md-background-color);
+ border-radius: 50%;
+ box-shadow: 0 0 2px rgba(60, 64, 67, 0.12), 0 0 6px rgba(60, 64, 67, 0.15);
+ color: var(--signin-work-badge-foreground-color);
+ height: var(--work-icon-size);
+ padding: calc((var(--badge-width) - var(--work-icon-size)) / 2);
+ width: var(--work-icon-size);
+ }
+
+ #contentContainer {
+ margin-bottom: calc(48px + var(--footer-margin));
+ margin-inline: auto;
+ margin-top: 104px;
+ text-align: center;
+ }
+
+ #contentContainer h2 {
+ font-size: 1.85em;
+ font-weight: normal;
+ margin-bottom: 8px;
+ }
+
+ .info-box {
+ align-items: center;
+ border: 1px solid var(--google-grey-200);
+ border-radius: 8px;
+ color: var(--google-grey-refresh-700);
+ display: flex;
+ flex-direction: row;
+ margin-inline: auto;
+ margin-top: 32px;
+ padding-block: 12px;
+ padding-inline-end: 18px;
+ width: 514px;
+ }
+
+ .info-box > p {
+ flex-grow: 1;
+ margin-block: 0;
+ text-align: start;
+ }
+
+ .icon-container {
+ --icon-container-size: 28px;
+ --icon-container-margin: 16px;
+ background-color: var(--google-grey-refresh-100);
+ border-radius: 50%;
+ height: var(--icon-container-size);
+ margin-inline: var(--icon-container-margin);
+ width: var(--icon-container-size);
+ }
+
+ .icon-container iron-icon {
+ --icon-size: 16px;
+ height: var(--icon-size);
+ padding: calc((var(--icon-container-size) - var(--icon-size)) / 2);
+ width: var(--icon-size);
+ }
+
+ #buttonsContainer {
+ --action-container-padding: var(--footer-margin);
+ }
+
+ #buttonsContainer cr-button {
+ font-size: var(--text-font-size);
+ min-width: 111px;
+ }
+
+ #buttonsContainer #cancelButton {
+ font-weight: normal;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ .work-badge {
+ border-color: var(--md-background-color);
+ }
+
+ .work-badge > iron-icon {
+ box-shadow: 0 0 2px rgba(60, 64, 67, 0.12), 0 0 6px
+ rgba(60, 64, 67, 0.15);
+ }
+
+ .info-box {
+ border-color: var(--google-grey-600);
+ color: var(--google-grey-refresh-100);
+ }
+
+ .icon-container {
+ background-color: var(--google-grey-refresh-700);
+ }
+ }
+</style>
+
+<div id="headerContainer">
+ <div id="banner"></div>
+ <div id="avatarContainer">
+ <img id="avatar" alt="" src="[[pictureUrl_]]">
+ <div class="work-badge" hidden="[[!showEnterpriseBadge_]]">
+ <iron-icon class="icon" icon="cr:domain"></iron-icon>
+ </div>
+ </div>
+</div>
+
+<div id="contentContainer">
+ <h2>
+ $i18n{enterpriseProfileWelcomeTitle}
+ </h2>
+ <template is="dom-if" if="[[enterpriseTitle_]]">
+ <p class="secondary">
+ [[enterpriseTitle_]]
+ </p>
+ </template>
+ <template is="dom-if" if="[[enterpriseInfo_]]">
+ <div class="info-box">
+ <div class="icon-container">
+ <iron-icon icon="cr:domain"></iron-icon>
+ </div>
+ <p>
+ [[enterpriseInfo_]]
+ </p>
+ </div>
+ </template>
+</div>
+<div id="buttonsContainer" class="action-container">
+ <cr-button class="action-button" on-click="onProceed_">
+ [[proceedLabel_]]
+ </cr-button>
+ <cr-button id="cancelButton" on-click="onCancel_">
+ $i18n{cancelLabel}
+ </cr-button>
+</div>
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.js b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.js
new file mode 100644
index 00000000000..8d3550e270d
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.js
@@ -0,0 +1,99 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
+import 'chrome://resources/cr_elements/icons.m.js';
+import './strings.m.js';
+import './signin_shared_css.js';
+import './signin_vars_css.js';
+
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {EnterpriseProfileInfo, EnterpriseProfileWelcomeBrowserProxy, EnterpriseProfileWelcomeBrowserProxyImpl} from './enterprise_profile_welcome_browser_proxy.js';
+
+Polymer({
+ is: 'enterprise-profile-welcome-app',
+
+ _template: html`{__html_template__}`,
+
+ behaviors: [
+ WebUIListenerBehavior,
+ ],
+
+ properties: {
+ /** Whether the account is managed */
+ showEnterpriseBadge_: {
+ type: Boolean,
+ value: false,
+ },
+
+ /** URL for the profile picture */
+ pictureUrl_: {
+ type: String,
+ },
+
+ /** The title about enterprise management */
+ enterpriseTitle_: {
+ type: String,
+ },
+
+ /** The detailed info about enterprise management */
+ enterpriseInfo_: {
+ type: String,
+ },
+
+ /** The label for the button to proceed with the flow */
+ proceedLabel_: {
+ type: String,
+ },
+ },
+
+ /** @private {?EnterpriseProfileWelcomeBrowserProxy} */
+ enterpriseProfileWelcomeBrowserProxy_: null,
+
+ /** @override */
+ ready() {
+ this.enterpriseProfileWelcomeBrowserProxy_ =
+ EnterpriseProfileWelcomeBrowserProxyImpl.getInstance();
+ this.addWebUIListener(
+ 'on-profile-info-changed',
+ (/** @type {!EnterpriseProfileInfo} */ info) =>
+ this.setProfileInfo_(info));
+ this.enterpriseProfileWelcomeBrowserProxy_.initialized().then(
+ info => this.setProfileInfo_(info));
+ },
+
+ /**
+ * Called when the proceed button is clicked.
+ * @private
+ */
+ onProceed_() {
+ this.enterpriseProfileWelcomeBrowserProxy_.proceed();
+ },
+
+ /**
+ * Called when the cancel button is clicked.
+ * @private
+ */
+ onCancel_() {
+ this.enterpriseProfileWelcomeBrowserProxy_.cancel();
+ },
+
+ /**
+ * @param {!EnterpriseProfileInfo} info
+ * @private
+ */
+ setProfileInfo_(info) {
+ this.style.setProperty('--header-background-color', info.backgroundColor);
+ this.pictureUrl_ = info.pictureUrl;
+ this.showEnterpriseBadge_ = info.showEnterpriseBadge;
+ this.enterpriseTitle_ = info.enterpriseTitle;
+ this.enterpriseInfo_ = info.enterpriseInfo;
+ this.proceedLabel_ = info.proceedLabel;
+ },
+}); \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_browser_proxy.js b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_browser_proxy.js
new file mode 100644
index 00000000000..4fb6b1a4fe7
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_browser_proxy.js
@@ -0,0 +1,62 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview A helper object used by the enterprise profile welcome screen
+ * to interact with the browser.
+ */
+
+import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+
+/**
+ * Enterprise profile info sent from C++.
+ * @typedef {{
+ * backgroundColor: string,
+ * pictureUrl: string,
+ * showEnterpriseBadge: boolean,
+ * enterpriseTitle: string,
+ * enterpriseInfo: string,
+ * proceedLabel: string,
+ * }}
+ */
+export let EnterpriseProfileInfo;
+
+/** @interface */
+export class EnterpriseProfileWelcomeBrowserProxy {
+ /**
+ * Called when the page is ready
+ * @return {!Promise<!EnterpriseProfileInfo>}
+ */
+ initialized() {}
+
+ /**
+ * Called when the user clicks the proceed button.
+ */
+ proceed() {}
+
+ /**
+ * Called when the user clicks the cancel button.
+ */
+ cancel() {}
+}
+
+/** @implements {EnterpriseProfileWelcomeBrowserProxy} */
+export class EnterpriseProfileWelcomeBrowserProxyImpl {
+ /** @override */
+ initialized() {
+ return sendWithPromise('initialized');
+ }
+
+ /** @override */
+ proceed() {
+ chrome.send('proceed');
+ }
+
+ /** @override */
+ cancel() {
+ chrome.send('cancel');
+ }
+}
+
+addSingletonGetter(EnterpriseProfileWelcomeBrowserProxyImpl); \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg
new file mode 100644
index 00000000000..920abb78100
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg
@@ -0,0 +1 @@
+<svg width="768" height="204" viewBox="0 0 768 204" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M625.349 182.757h-13.05v-13.268h-12.975v-13.344h-12.975v-13.268h-9.45V68.409h-43.275v65.495h-26.475v-29.45h-43.35v69.56" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M693.671 162.813l-13.65 5.905c-.825.383-1.8 0-2.1-.844l-5.775-13.958c-.375-.843 0-1.84.825-2.147l13.65-5.905c.825-.384 1.8 0 2.1.843l5.775 13.958c.375.844 0 1.841-.825 2.148z" fill="#34A853"/><path d="M576.899 68.41V83.9c1.125.154 2.325.23 3.525.23 14.325 0 25.95-11.887 25.95-26.535s-11.625-26.535-25.95-26.535-25.95 11.887-25.95 26.535c0 3.835.825 7.516 2.25 10.813h20.175z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M580.424 8.437v9.356M538.799 33.055l7.95 4.678M614.099 77.536l7.95 4.678M614.099 37.733l7.95-4.678M509.325 76.31V40.646H476.55v49.467h-20.025V67.873H423.75v69.253" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M549.074 79.913h-6.3v8.13h6.3v-8.13zM563.625 79.913h-6.3v8.13h6.3v-8.13zM549.074 98.012h-6.3v8.129h6.3v-8.13zM563.625 98.012h-6.3v8.129h6.3v-8.13zM549.074 116.112h-6.3v8.13h6.3v-8.13zM563.625 116.112h-6.3v8.13h6.3v-8.13zM549.074 134.211h-6.3v8.129h6.3v-8.129z" fill="#FBBC05"/><path d="M518.849 151.85h-6.3v8.129h6.3v-8.129zM518.849 169.949h-6.3v8.13h6.3v-8.13z" fill="#4285F4"/><path d="M563.625 134.211h-6.3v8.129h6.3v-8.129z" fill="#FBBC05"/><path d="M486.599 117.723h-6.3v8.129h6.3v-8.129zM501.149 117.723h-6.3v8.129h6.3v-8.129zM486.599 135.821h-6.3v8.13h6.3v-8.13zM501.149 135.821h-6.3v8.13h6.3v-8.13zM486.599 153.92h-6.3v8.129h6.3v-8.129zM668.325 89.883c4.184 0 7.575-3.468 7.575-7.745 0-4.279-3.391-7.746-7.575-7.746s-7.575 3.468-7.575 7.746c0 4.277 3.391 7.745 7.575 7.745z" fill="#4285F4"/><path d="M150.291 105.311l11.243-55.464-9.838-1.532-9.946 66.459 46.703 7.165 1.297-8.423-39.459-8.205z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M260.867 31.61l-2.85 16.75c-.143.962.641 1.684 1.425 1.443l14.324-5.53c.784-.32.998-1.523.357-2.084L262.72 31.05c-.641-.72-1.639-.32-1.853.561z" fill="#4285F4"/><path d="M341.839 139.986c3.571-1.305 5.49-5.447 4.317-9.249-1.226-3.802-5.117-5.845-8.688-4.596l-17.057 6.128c-3.571 1.305-5.489 5.448-4.317 9.25 1.226 3.801 5.117 5.844 8.688 4.596l17.057-6.129z" fill="#FBBC05"/><path d="M182.25 68.018l23.25 4.84-18.524-28.377-4.726 23.537z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M151.5 165.654c2.9 0 5.25-2.404 5.25-5.369 0-2.964-2.35-5.368-5.25-5.368-2.899 0-5.25 2.404-5.25 5.368 0 2.965 2.351 5.369 5.25 5.369z" fill="#FBBC05"/><path d="M252.494 189.251l-46.002-16.628a2.614 2.614 0 0 1-1.551-3.337l24.392-70.614c.481-1.367 1.925-2.078 3.263-1.586l46.002 16.628a2.614 2.614 0 0 1 1.551 3.336l-24.392 70.615a2.617 2.617 0 0 1-3.263 1.586z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M258.859 183.891l-5.616-2.024M261.267 176.999l-5.617-2.023M263.62 170.107l-5.616-2.024M266.027 163.16l-5.616-2.024M268.434 156.268l-5.616-2.024M270.788 149.322l-5.617-2.024M273.195 142.429l-5.617-2.024M275.549 135.538l-5.564-2.078M277.955 128.592l-5.616-2.024M280.362 121.701l-5.616-2.024" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M243.239 121.097l14.228.219-6.9-12.69-7.328 12.471z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M250.522 108.597l6.915 12.716 74.194-42.187-6.915-12.716-74.194 42.187zM187.124 44.676L164.06 39.88l-13.31 65.565 46.182 9.593 8.568-42.24-18.376-28.122z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M156.783 93.162c-.381 4.907 2.608 9.483 7.227 11.082.706.22 1.467-.221 1.576-.937l1.63-8.105c.163-.661-.272-1.378-.978-1.488l-7.988-1.654c-.707-.166-1.413.386-1.467 1.102z" fill="#34A853"/><path d="M178.125 95.098c3.521 0 6.375-2.918 6.375-6.519 0-3.6-2.854-6.518-6.375-6.518s-6.375 2.918-6.375 6.518c0 3.6 2.854 6.52 6.375 6.52z" fill="#FBBC05"/><path d="M177.432 106.546l-7.235-1.459c-1.478-.302-2.446-1.761-2.141-3.219.306-1.459 1.784-2.415 3.262-2.113l7.235 1.459c1.478.302 2.446 1.76 2.141 3.219-.255 1.459-1.733 2.415-3.262 2.113z" fill="#4285F4"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.html b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
index 45e7e0b57c4..3b0a2be0c3b 100644
--- a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
+++ b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
@@ -7,20 +7,8 @@
#header {
background-color: var(--header-background-color);
- color: var(--header-text-color);
- height: 136px;
- margin-bottom: 8px
- }
-
- #headerText {
- font-size: 15px;
- font-weight: bold;
- line-height: 18px;
- margin: 16px auto 9px;
- overflow: hidden;
- text-align: center;
- text-overflow: ellipsis;
- white-space: nowrap;
+ height: 124px;
+ margin-bottom: 16px
}
#avatarContainer {
@@ -30,6 +18,7 @@
height: var(--avatar-size);
left: calc(50% - var(--avatar-size)/2);
position: absolute;
+ top: 30px;
width: var(--avatar-size);
}
@@ -69,29 +58,37 @@
width: var(--work-icon-size);
}
+ #body {
+ color: var(--cr-secondary-text-color);
+ font-size: 13px;
+ line-height: 20px;
+ margin: 0 16px;
+ text-align: center;
+ }
+
+ #title {
+ color: var(--cr-primary-text-color);
+ font-size: 15px;
+ font-weight: 500;
+ line-height: 22px;
+ margin: 0 0 8px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
#nameInput {
--cr-input-placeholder-color: var(--google-grey-900);
--cr-input-padding-bottom: 8px;
--cr-input-padding-top: 8px;
+ flex-grow: 1;
height: 32px;
- margin: 8px auto 16px;
- maxlength: 16;
- width: 114px;
- }
-
- #lineSeparator {
- border-top: 1px solid var(--cr-separator-color);
+ margin: 16px auto;
+ width: 148px;
}
#pickThemeContainer {
- margin: 16px auto auto;
- }
-
- #pickThemeTitle {
- color: var(--cr-secondary-text-color);
- font-size: 15px;
- font-weight: 500;
- margin-bottom: 16px;
+ flex-grow: 1;
+ margin: 16px auto;
}
#themeSelector {
@@ -108,19 +105,11 @@
width: 111px;
}
-
- @media (prefers-color-scheme: dark) {
- #lineSeparator {
- color: white;
- opacity: 0.1;
- }
- }
</style>
-<div role="dialog" id="customizeDialog" aria-labelledby="headerText"
- aria-describedby="pickThemeTitle">
+<div role="dialog" id="customizeDialog" aria-labelledby="title"
+ aria-describedby="content">
<div id="header">
- <div id="headerText">[[initialProfileName_]]</div>
<div id="avatarContainer">
<img id="avatar" alt="" src="[[pictureUrl_]]">
<div class="work-badge" id="badge" hidden="[[!isManaged_]]">
@@ -129,15 +118,17 @@
</div>
</div>
+ <div id="body">
+ <div id="title">[[welcomeTitle_]]</div>
+ <div id="content">$i18n{profileCustomizationText}</div>
+ </div>
+
<cr-input id="nameInput" pattern=".*\\S.*" value="{{profileName_}}"
aria-label="$i18n{profileCustomizationInputLabel}" auto-validate
required spellcheck="false">
</cr-input>
- <div id="lineSeparator"></div>
-
<div id="pickThemeContainer">
- <div id="pickThemeTitle">$i18n{profileCustomizationPickThemeTitle}</div>
<cr-customize-themes id="themeSelector" auto-confirm-theme-changes>
</cr-customize-themes>
</div>
diff --git a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.js b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.js
index 7c6e75bf40d..55bfabf679d 100644
--- a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.js
+++ b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_app.js
@@ -34,12 +34,6 @@ Polymer({
value: false,
},
- /** Initial local profile name, non-editable */
- initialProfileName_: {
- type: String,
- value: () => loadTimeData.getString('profileName'),
- },
-
/** Local profile name, editable by user input */
profileName_: {
type: String,
@@ -50,6 +44,11 @@ Polymer({
pictureUrl_: {
type: String,
},
+
+ /** Welcome title for the bubble */
+ welcomeTitle_: {
+ type: String,
+ },
},
/** @private {?ProfileCustomizationBrowserProxy} */
@@ -59,7 +58,7 @@ Polymer({
ready() {
// profileName_ is only set now, because it triggers a validation of the
// input which crashes if it's done too early.
- this.profileName_ = this.initialProfileName_;
+ this.profileName_ = loadTimeData.getString('profileName');
this.profileCustomizationBrowserProxy_ =
ProfileCustomizationBrowserProxyImpl.getInstance();
this.addWebUIListener(
@@ -92,10 +91,10 @@ Polymer({
* @private
*/
setProfileInfo_(profileInfo) {
- this.style.setProperty('--header-text-color', profileInfo.textColor);
this.style.setProperty(
'--header-background-color', profileInfo.backgroundColor);
this.pictureUrl_ = profileInfo.pictureUrl;
this.isManaged_ = profileInfo.isManaged;
+ this.welcomeTitle_ = profileInfo.welcomeTitle;
},
});
diff --git a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_browser_proxy.js b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_browser_proxy.js
index 91e5e9f7981..4e784c3487e 100644
--- a/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_browser_proxy.js
+++ b/chromium/chrome/browser/resources/signin/profile_customization/profile_customization_browser_proxy.js
@@ -12,10 +12,10 @@ import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js
/**
* Profile info (colors and avatar) sent from C++.
* @typedef {{
- * textColor: string,
* backgroundColor: string,
* pictureUrl: string,
* isManaged: boolean,
+ * welcomeTitle: string,
* }}
*/
export let ProfileInfo;
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/BUILD.gn b/chromium/chrome/browser/resources/signin/profile_picker/BUILD.gn
index 1eb98fb957c..9cf0e72d1e1 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/profile_picker/BUILD.gn
@@ -106,6 +106,7 @@ preprocess_if_expr("preprocess_generated") {
"profile_creation_flow/local_profile_customization.js",
"profile_picker_shared_css.js",
"profile_creation_flow/shared_css.js",
+ "profile_switch.js",
]
}
@@ -150,6 +151,7 @@ js_type_check("profile_picker_files") {
":profile_picker",
":profile_picker_app",
":profile_picker_main_view",
+ ":profile_switch",
]
}
@@ -168,6 +170,7 @@ js_library("ensure_lazy_loaded") {
js_library("lazy_load") {
deps = [
+ ":profile_switch",
"profile_creation_flow:local_profile_customization",
"profile_creation_flow:profile_type_choice",
]
@@ -201,9 +204,10 @@ js_library("profile_picker_app") {
":ensure_lazy_loaded",
":navigation_behavior",
":profile_picker_main_view",
+ ":profile_switch",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
]
}
@@ -242,6 +246,10 @@ js_library("policy_helper") {
deps = [ "//ui/webui/resources/js:load_time_data.m" ]
}
+js_library("profile_switch") {
+ deps = [ ":manage_profiles_browser_proxy" ]
+}
+
group("web_components") {
public_deps = [
":web_components_local",
@@ -256,5 +264,6 @@ html_to_js("web_components_local") {
"profile_card.js",
"profile_card_menu.js",
"profile_picker_shared_css.js",
+ "profile_switch.js",
]
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/ensure_lazy_loaded.js b/chromium/chrome/browser/resources/signin/profile_picker/ensure_lazy_loaded.js
index 78ccede4f17..c72fef6a6fd 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/ensure_lazy_loaded.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/ensure_lazy_loaded.js
@@ -19,6 +19,7 @@ export function ensureLazyLoaded() {
lazyLoadPromise = Promise.all([
'profile-type-choice',
'local-profile-customization',
+ 'profile-switch',
].map(name => customElements.whenDefined(name)));
}
return lazyLoadPromise;
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/lazy_load.js b/chromium/chrome/browser/resources/signin/profile_picker/lazy_load.js
index 6ed3d8f89ad..baff46e452a 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/lazy_load.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/lazy_load.js
@@ -4,3 +4,4 @@
import './profile_creation_flow/profile_type_choice.js';
import './profile_creation_flow/local_profile_customization.js';
+import './profile_switch.js';
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js b/chromium/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
index d2e4df8fa69..e6b71cf1167 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
@@ -137,6 +137,24 @@ export class ManageProfilesBrowserProxy {
/** Records impression of a sign-in promo to metrics. */
recordSignInPromoImpression() {}
+
+ /**
+ * Gets a profile for which the profile switch screen is shown.
+ * @return {!Promise<!ProfileState>}
+ */
+ getSwitchProfile() {}
+
+ /**
+ * Switches to an already existing profile at `profile_path`.
+ * @param {string} profilePath
+ */
+ confirmProfileSwitch(profilePath) {}
+
+ /**
+ * Cancels the profile switch which aborts the sign-in profile creation
+ * flow.
+ */
+ cancelProfileSwitch() {}
}
/** @implements {ManageProfilesBrowserProxy} */
@@ -212,6 +230,21 @@ export class ManageProfilesBrowserProxyImpl {
recordSignInPromoImpression() {
chrome.send('recordSignInPromoImpression');
}
+
+ /** @override */
+ getSwitchProfile() {
+ return sendWithPromise('getSwitchProfile');
+ }
+
+ /** @override */
+ confirmProfileSwitch(profilePath) {
+ chrome.send('confirmProfileSwitch', [profilePath]);
+ }
+
+ /** @override */
+ cancelProfileSwitch() {
+ chrome.send('cancelProfileSwitch');
+ }
}
addSingletonGetter(ManageProfilesBrowserProxyImpl);
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/navigation_behavior.js b/chromium/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
index 4f30c4a5e0a..dfde8de99f4 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
@@ -19,6 +19,7 @@ const Pages = {
LOCAL_PROFILE_CUSTOMIZATION: 2,
LOAD_SIGNIN: 3,
LOAD_FORCE_SIGNIN: 4,
+ PROFILE_SWITCH: 5,
};
/**
@@ -28,6 +29,7 @@ const Pages = {
export const Routes = {
MAIN: 'main-view',
NEW_PROFILE: 'new-profile',
+ PROFILE_SWITCH: 'profile-switch',
};
/**
@@ -57,6 +59,8 @@ function computeStep(route) {
return ProfileCreationSteps.LOCAL_PROFILE_CUSTOMIZATION;
}
return ProfileCreationSteps.PROFILE_TYPE_CHOICE;
+ case Routes.PROFILE_SWITCH:
+ return 'profileSwitch';
default:
assertNotReached();
}
@@ -75,6 +79,15 @@ if (!history.state || !history.state.route || !history.state.step) {
},
'', path);
break;
+ case `/${Routes.PROFILE_SWITCH}`:
+ history.replaceState(
+ {
+ route: Routes.PROFILE_SWITCH,
+ step: computeStep(Routes.PROFILE_SWITCH),
+ isFirst: true
+ },
+ '', path);
+ break;
default:
history.replaceState(
{route: Routes.MAIN, step: computeStep(Routes.MAIN), isFirst: true},
@@ -104,6 +117,9 @@ export function recordPageVisited(step) {
case ProfileCreationSteps.LOAD_FORCE_SIGNIN:
page = Pages.LOAD_FORCE_SIGNIN;
break;
+ case 'profileSwitch':
+ page = Pages.PROFILE_SWITCH;
+ break;
default:
assertNotReached();
}
@@ -132,7 +148,8 @@ window.addEventListener('popstate', notifyObservers);
* @param {!Routes} route
*/
export function navigateTo(route) {
- assert([Routes.MAIN, Routes.NEW_PROFILE].includes(route));
+ assert(
+ [Routes.MAIN, Routes.NEW_PROFILE, Routes.PROFILE_SWITCH].includes(route));
navigateToStep(route, computeStep(route));
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/policy_helper.js b/chromium/chrome/browser/resources/signin/profile_picker/policy_helper.js
index 8630e2e7875..b70d6a25b90 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/policy_helper.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/policy_helper.js
@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import './strings.m.js';
+
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import './strings.js';
/** @return {boolean} */
export function isGuestModeEnabled() {
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_card.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_card.html
index 9c38239a671..c73a824a4f8 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_card.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_card.html
@@ -19,7 +19,7 @@
}
#avatarContainer {
- height: var(--avatar-icon-size);
+ height: var(--profile-card-avatar-icon-size);
position: relative;
}
@@ -39,7 +39,7 @@
justify-content: center;
position: absolute;
right: -6px;
- top: calc(var(--avatar-icon-size) - var(--domain-icon-size)
+ top: calc(var(--profile-card-avatar-icon-size) - var(--domain-icon-size)
- var(--domain-icon-border-size));
width: var(--domain-icon-size);
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_card_menu.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
index ace58a6433d..d907cc48b21 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
@@ -64,7 +64,7 @@
}
#avatarContainer {
- height: var(--avatar-icon-size);
+ height: var(--profile-card-avatar-icon-size);
position: relative;
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
index 429b10a0453..bbc4772a881 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
@@ -91,6 +91,9 @@
display: flex;
flex-direction: column;
padding: 15px 36px 23px;
+ /* Positions tooltips relatively to this container.
+ Fix for https://crbug.com/1182108 */
+ position: relative;
}
#colorPickerHeader {
@@ -174,7 +177,7 @@
--theme-shape-color:[[profileThemeInfo.themeShapeColor]]">
<iron-icon class="banner" icon="profiles:customize-banner"></iron-icon>
<cr-icon-button id="backButton" iron-icon="cr:arrow-back"
- on-click="onClickBack_" aria-label="$i18n{backButtonLabel}">
+ on-click="onClickBack_" aria-label$="[[getBackButtonAriaLabel_()]]">
</cr-icon-button>
<h2 id="title">$i18n{localProfileCreationTitle}</h2>
<div id="avatarContainer">
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js
index 12009495587..698d8edd369 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js
@@ -200,6 +200,15 @@ Polymer({
},
/**
+ * @return {!string}
+ * @private
+ */
+ getBackButtonAriaLabel_() {
+ return this.i18n(
+ 'backButtonAriaLabel', this.i18n('localProfileCreationTitle'));
+ },
+
+ /**
* @return {boolean}
* @private
*/
@@ -313,6 +322,7 @@ Polymer({
info: {
chromeThemeId: this.profileThemeInfo.colorId,
},
+ isForced: false,
};
},
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
index 5ed2ff86c1d..d970f5f2813 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
@@ -9,11 +9,49 @@
background-image: url(profile_creation_flow/images/banner_light_image.svg);
}
- @media (prefers-color-scheme: dark) {
- #signinPromoBanner {
- background-image:
- url(profile_creation_flow/images/banner_dark_image.svg);
- }
+ #infoContainer {
+ bottom: 0;
+ box-sizing: border-box;
+ margin-bottom: 58px;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ }
+
+ .info-box {
+ align-items: center;
+ border: 1px solid var(--google-grey-200);
+ border-radius: 8px;
+ color: var(--google-grey-refresh-700);
+ display: inline-flex;
+ flex-direction: row;
+ margin-inline: auto;
+ max-width: 780px;
+ padding-block: 12px;
+ padding-inline-end: 18px;
+ }
+
+ .info-box > p {
+ flex-grow: 1;
+ margin-block: 0;
+ text-align: start;
+ }
+
+ .icon-container {
+ --icon-container-size: 28px;
+ --icon-container-margin: 16px;
+ background-color: var(--google-grey-refresh-100);
+ border-radius: 50%;
+ height: var(--icon-container-size);
+ margin-inline: var(--icon-container-margin);
+ width: var(--icon-container-size);
+ }
+
+ .icon-container iron-icon {
+ --icon-size: 16px;
+ height: var(--icon-size);
+ padding: calc((var(--icon-container-size) - var(--icon-size)) / 2);
+ width: var(--icon-size);
}
#bannerContainer {
@@ -37,13 +75,29 @@
margin-bottom: 48px;
text-align: center;
}
+
+ @media (prefers-color-scheme: dark) {
+ #signinPromoBanner {
+ background-image:
+ url(profile_creation_flow/images/banner_dark_image.svg);
+ }
+
+ .info-box {
+ border-color: var(--google-grey-600);
+ color: var(--google-grey-refresh-100);
+ }
+
+ .icon-container {
+ background-color: var(--google-grey-refresh-700);
+ }
+ }
</style>
<div id="headerContainer"
style$="--theme-frame-color:[[profileThemeInfo.themeFrameColor]];
--theme-text-color:[[profileThemeInfo.themeFrameTextColor]];">
<cr-icon-button id="backButton" iron-icon="cr:arrow-back"
- on-click="onClickBack_" aria-label="$i18n{backButtonLabel}"
+ on-click="onClickBack_" aria-label$="[[getBackButtonAriaLabel_()]]"
disabled="[[loadSigninInProgess_]]">
</cr-icon-button>
<div id="signinPromoBanner" class="banner"></div>
@@ -65,3 +119,16 @@
$i18n{notNowButtonLabel}
</cr-button>
</div>
+
+<template is="dom-if" if="[[managedDeviceDisclaimer_]]">
+ <div id="infoContainer">
+ <div class="info-box">
+ <div class="icon-container">
+ <iron-icon icon="cr:domain"></iron-icon>
+ </div>
+ <p>
+ $i18n{managedDeviceDisclaimer}
+ </p>
+ </div>
+ </div>
+</template>
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js
index 87eca70c6b4..08fab8c1b64 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js
@@ -4,11 +4,15 @@
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import './shared_css.js';
import {assert} from 'chrome://resources/js/assert.m.js';
+import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl} from '../manage_profiles_browser_proxy.js';
import {navigateToPreviousRoute, navigateToStep, ProfileCreationSteps, recordPageVisited, Routes} from '../navigation_behavior.js';
@@ -18,7 +22,7 @@ Polymer({
_template: html`{__html_template__}`,
- behaviors: [WebUIListenerBehavior],
+ behaviors: [I18nBehavior, WebUIListenerBehavior],
properties: {
/** @type {!AutogeneratedThemeColorInfo} */
@@ -34,6 +38,21 @@ Polymer({
type: Boolean,
value: false,
},
+
+ /**
+ * The disclaimer for managed devices.
+ * @private {boolean}
+ */
+ managedDeviceDisclaimer_: {
+ type: Boolean,
+ value() {
+ return loadTimeData.getString('managedDeviceDisclaimer').length > 0;
+ },
+ },
+ },
+
+ listeners: {
+ 'view-enter-start': 'onViewEnterStart_',
},
/** @private {?ManageProfilesBrowserProxy} */
@@ -50,6 +69,11 @@ Polymer({
},
/** @private */
+ onViewEnterStart_() {
+ afterNextRender(this, () => focusWithoutInk(this.$.backButton));
+ },
+
+ /** @private */
onNotNowClick_() {
navigateToStep(
Routes.NEW_PROFILE, ProfileCreationSteps.LOCAL_PROFILE_CUSTOMIZATION);
@@ -77,5 +101,14 @@ Polymer({
// TODO(crbug.com/1126913): If failed, show some error message to inform the
// user.
this.loadSigninInProgess_ = false;
+ },
+
+ /**
+ * @return {!string}
+ * @private
+ */
+ getBackButtonAriaLabel_() {
+ return this.i18n(
+ 'backButtonAriaLabel', this.i18n('profileTypeChoiceTitle'));
}
});
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.html
index c18b7ccbac6..9db07bdc5a7 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.html
@@ -26,7 +26,14 @@
<template>
<local-profile-customization slot="view"
profile-theme-info="{{newProfileThemeInfo}}">
- </local-profile-customizatione>
+ </local-profile-customization>
+ </template>
+ </cr-lazy-render>
+
+ <cr-lazy-render id="profileSwitch">
+ <template>
+ <profile-switch slot="view">
+ </profile-switch>
</template>
</cr-lazy-render>
</cr-view-manager>
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.js b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
index 0115fd5509a..540234f9546 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.m.js';
+import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js';
import './profile_picker_main_view.js';
import './profile_picker_shared_css.js';
-import './strings.js';
+import './strings.m.js';
import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
@@ -116,6 +116,8 @@ Polymer({
return this.i18n('profileTypeChoiceTitle');
case ProfileCreationSteps.LOCAL_PROFILE_CUSTOMIZATION:
return this.i18n('localProfileCreationTitle');
+ case 'profileSwitch':
+ return this.i18n('profileSwitchTitle');
default:
return '';
}
@@ -132,6 +134,8 @@ Polymer({
case Routes.NEW_PROFILE:
return Promise.all(
[this.initializeNewProfileThemeInfo_(), ensureLazyLoaded()]);
+ case Routes.PROFILE_SWITCH:
+ return ensureLazyLoaded();
default:
// |this.currentRoute_| should be set by now.
assertNotReached();
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
index bd94755bdc5..6ef1e6e9ee7 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
@@ -1,11 +1,8 @@
<style include="profile-picker-shared cr-hidden-style cr-shared-style">
:host {
- --avatar-icon-size: 74px;
--banner-img-height: 400px;
--banner-img-width: 169px;
- --profile-item-height: 178px;
--profile-item-margin: 4px;
- --profile-item-width: 162px;
}
.banner {
@@ -112,8 +109,8 @@
}
iron-icon[icon='profiles:add'] {
- --iron-icon-height: var(--avatar-icon-size);
- --iron-icon-width: var(--avatar-icon-size);
+ --iron-icon-height: var(--profile-card-avatar-icon-size);
+ --iron-icon-width: var(--profile-card-avatar-icon-size);
--iron-icon-fill-color: var(--google-grey-refresh-100);
--iron-icon-stroke-color: var(--google-grey-refresh-700);
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
index f1c5345ec0b..2b0cc9a8e24 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
@@ -11,7 +11,7 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import './icons.js';
import './profile_card.js';
import './profile_picker_shared_css.js';
-import './strings.js';
+import './strings.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_shared_css.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_shared_css.html
index cbcb9db0921..6e6c8c7ff43 100644
--- a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_shared_css.html
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_shared_css.html
@@ -1,11 +1,14 @@
<template>
<style include="cr-shared-style">
:host {
+ --profile-card-avatar-icon-size: 74px;
--text-font-size: 1.16em;
--scrollbar-width: 4px;
--scrollbar-background: var(--google-grey-refresh-100);
--footer-spacing: 40px;
--profile-card-hover-color: var(--md-background-color);
+ --profile-item-height: 178px;
+ --profile-item-width: 162px;
}
html {
@@ -77,10 +80,10 @@
}
.profile-avatar {
- border-radius: 37px;
+ border-radius: 50%;
flex-shrink: 0;
- height: var(--avatar-icon-size);
- width: var(--avatar-icon-size);
+ height: var(--profile-card-avatar-icon-size);
+ width: var(--profile-card-avatar-icon-size);
}
@media (prefers-color-scheme: dark) {
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.html
new file mode 100644
index 00000000000..3a159315fe1
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.html
@@ -0,0 +1,78 @@
+<style include="profile-picker-shared">
+ #outerContainer {
+ display: flex;
+ flex-flow: column;
+ height: 100%;
+ }
+
+ #profileCardContainer {
+ align-items: center;
+ align-self: center;
+ border: 1px solid var(--google-grey-300);
+ border-radius: 8px;
+ display: flex;
+ flex-direction: column;
+ height: var(--profile-item-height);
+ justify-content: center;
+ margin: 200px 0 37px;
+ position: relative;
+ width: var(--profile-item-width);
+ }
+
+ #avatarContainer {
+ height: var(--profile-card-avatar-icon-size);
+ position: relative;
+ }
+
+ #profileName {
+ top: 0;
+ }
+
+ #gaiaName {
+ bottom: 0;
+ }
+
+ #titleContainer {
+ text-align: center;
+ }
+
+ h2 {
+ margin-block-start: 0;
+ }
+
+ #actionContainer {
+ margin: auto 40px 40px auto;
+ }
+
+ cr-button {
+ margin-inline-start: 8px;
+ min-width: 111px;
+ }
+</style>
+
+<div id="outerContainer">
+ <div id="profileCardContainer">
+ <div id="avatarContainer">
+ <img class="profile-avatar" alt="" src="[[profileState_.avatarIcon]]">
+ </div>
+ <div id="profileName" class="profile-card-info prominent-text">
+ [[profileState_.localProfileName]]
+ </div>
+ <div id="gaiaName" class="profile-card-info secondary-text">
+ [[profileState_.gaiaName]]
+ </div>
+ </div>
+ <div id="titleContainer">
+ <h2>$i18n{profileSwitchTitle}</h2>
+ <h3>$i18n{profileSwitchSubtitle}</h3>
+ </div>
+ <div id="actionContainer">
+ <cr-button id="cancelButton" on-click="onCancelClick_">
+ $i18n{cancel}
+ </cr-button>
+ <cr-button id="switchButton" class="action-button"
+ disabled="[[!isProfileStateInitialized_]]" on-click="onSwitchClick_">
+ $i18n{switchButtonLabel}
+ </cr-button>
+ </div>
+</div>
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.js b/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.js
new file mode 100644
index 00000000000..0d5357054f5
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_switch.js
@@ -0,0 +1,53 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import './profile_picker_shared_css.js';
+
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl, ProfileState} from './manage_profiles_browser_proxy.js';
+
+Polymer({
+ is: 'profile-switch',
+
+ _template: html`{__html_template__}`,
+
+ properties: {
+ /** @type {ProfileState} */
+ profileState_: {
+ type: Object,
+ },
+
+ /** @type {boolean} */
+ isProfileStateInitialized_: {
+ type: Boolean,
+ value: false,
+ },
+ },
+
+ /** @private {?ManageProfilesBrowserProxy} */
+ manageProfilesBrowserProxy_: null,
+
+ /** @override */
+ ready() {
+ this.manageProfilesBrowserProxy_ =
+ ManageProfilesBrowserProxyImpl.getInstance();
+ this.manageProfilesBrowserProxy_.getSwitchProfile().then(profileState => {
+ this.profileState_ = profileState;
+ this.isProfileStateInitialized_ = true;
+ });
+ },
+
+ /** @private */
+ onCancelClick_() {
+ this.manageProfilesBrowserProxy_.cancelProfileSwitch();
+ },
+
+ /** @private */
+ onSwitchClick_() {
+ this.manageProfilesBrowserProxy_.confirmProfileSwitch(
+ this.profileState_.profilePath);
+ },
+});
diff --git a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html
index c7766f10e50..167012dcdce 100644
--- a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html
+++ b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html
@@ -110,9 +110,7 @@
z-index: 0;
}
- #avatar {
- border: 2px solid var(--md-background-color);
- border-radius: 50%;
+ #avatarContainer {
bottom: calc(var(--avatar-size)/-2);
height: var(--avatar-size);
left: 0;
@@ -123,6 +121,36 @@
z-index: 1;
}
+ #avatar {
+ border: 2px solid var(--md-background-color);
+ border-radius: 50%;
+ height: 100%;
+ width: 100%;
+ }
+
+ .work-badge {
+ --badge-width: 30px;
+ --badge-offset: -6px;
+ border: 3px solid white;
+ border-radius: 50%;
+ bottom: var(--badge-offset);
+ height: var(--badge-width);
+ inset-inline-end: var(--badge-offset);
+ position: absolute;
+ width: var(--badge-width);
+ }
+
+ .work-badge > iron-icon {
+ --work-icon-size: 20px;
+ background-color: var(--md-background-color);
+ border-radius: 50%;
+ box-shadow: 0 0 2px rgba(60, 64, 67, 0.12), 0 0 6px rgba(60, 64, 67, 0.15);
+ color: var(--signin-work-badge-foreground-color);
+ height: var(--work-icon-size);
+ padding: calc((var(--badge-width) - var(--work-icon-size)) / 2);
+ width: var(--work-icon-size);
+ }
+
#contentContainer {
margin-bottom: calc(48px + var(--footer-margin));
margin-top: 104px;
@@ -170,6 +198,10 @@
background-image:
url(images/sync_confirmation_refreshed_illustration_dark.svg);
}
+
+ .work-badge {
+ border-color: var(--md-background-color);
+ }
}
</style>
@@ -218,7 +250,12 @@
<template is="dom-if" if="[[isProfileCreationFlow_]]">
<div id="headerContainer" style$="--theme-frame-color:[[highlightColor_]]">
<div id="syncPromoBanner"></div>
- <img id="avatar" alt="" src="[[accountImageSrc_]]">
+ <div id="avatarContainer">
+ <img id="avatar" alt="" src="[[accountImageSrc_]]">
+ <div class="work-badge" hidden="[[!showEnterpriseBadge_]]">
+ <iron-icon class="icon" icon="cr:domain"></iron-icon>
+ </div>
+ </div>
</div>
<div id="contentContainer">
@@ -239,7 +276,7 @@
</div>
<div id="buttonsContainer" class="action-container">
<cr-button class="action-button" id="confirmButton"
- on-click="onConfirm_" consent-confirmation autofocus>
+ on-click="onConfirm_" consent-confirmation>
$i18n{syncConfirmationConfirmLabel}
</cr-button>
<cr-button id="notNowButton" on-click="onUndo_">
diff --git a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.js b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.js
index 04924cc2e40..13d403a268d 100644
--- a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.js
+++ b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.js
@@ -3,7 +3,9 @@
* found in the LICENSE file. */
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
+import 'chrome://resources/cr_elements/icons.m.js';
import './strings.m.js';
import './signin_shared_css.js';
import './signin_vars_css.js';
@@ -52,6 +54,12 @@ Polymer({
return loadTimeData.getString('highlightColor');
}
},
+
+ /** @private */
+ showEnterpriseBadge_: {
+ type: Boolean,
+ value: false,
+ }
},
/** @private {?SyncConfirmationBrowserProxy} */
@@ -62,8 +70,8 @@ Polymer({
this.syncConfirmationBrowserProxy_ =
SyncConfirmationBrowserProxyImpl.getInstance();
this.addWebUIListener(
- 'account-image-changed', this.handleAccountImageChanged_.bind(this));
- this.syncConfirmationBrowserProxy_.requestAccountImage();
+ 'account-info-changed', this.handleAccountInfoChanged_.bind(this));
+ this.syncConfirmationBrowserProxy_.requestAccountInfo();
},
/** @private */
@@ -112,11 +120,15 @@ Polymer({
/**
* Called when the account image changes.
- * @param {string} imageSrc
+ * @param {{
+ * src: string,
+ * showEnterpriseBadge: boolean,
+ * }} accountInfo
* @private
*/
- handleAccountImageChanged_(imageSrc) {
- this.accountImageSrc_ = imageSrc;
+ handleAccountInfoChanged_(accountInfo) {
+ this.accountImageSrc_ = accountInfo.src;
+ this.showEnterpriseBadge_ = accountInfo.showEnterpriseBadge;
},
});
diff --git a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_browser_proxy.js b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_browser_proxy.js
index b98c5ee1fe9..b91a1c35542 100644
--- a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_browser_proxy.js
+++ b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_browser_proxy.js
@@ -38,9 +38,9 @@ export class SyncConfirmationBrowserProxy {
initializedWithSize(height) {}
/**
- * Called when the WebUIListener for "account-image-changed" was added.
+ * Called when the WebUIListener for "account-info-changed" was added.
*/
- requestAccountImage() {}
+ requestAccountInfo() {}
}
/** @implements {SyncConfirmationBrowserProxy} */
@@ -66,8 +66,8 @@ export class SyncConfirmationBrowserProxyImpl {
}
/** @override */
- requestAccountImage() {
- chrome.send('accountImageRequest');
+ requestAccountInfo() {
+ chrome.send('accountInfoRequest');
}
}
diff --git a/chromium/chrome/browser/resources/signin/sync_confirmation/sync_loading_confirmation.html b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_loading_confirmation.html
new file mode 100644
index 00000000000..84b10181731
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/sync_confirmation/sync_loading_confirmation.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+ <head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ <script type="module"
+ src="chrome://resources/cr_elements/shared_vars_css.m.js">
+ </script>
+ <style>
+ html {
+ height: 100%;
+ width: 100%;
+ }
+
+ body {
+ color: var(--cr-primary-text-color);
+ height: 100%;
+ margin: 0;
+ min-width: 512px;
+ padding: 0;
+ text-align: center;
+ width: 100%;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background-color: var(--md-background-color);
+ }
+ }
+
+ .container {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ justify-content: center;
+ width: 100%;
+ }
+
+ .spinner {
+ background-image: url(chrome://resources/images/throbber_medium.svg);
+ background-size: 100%;
+ height: 48px;
+ width: 48px;
+ }
+
+ .title {
+ font-style: italic;
+ line-height: 32px;
+ margin-top: 16px;
+ }
+ </style>
+ <title>$i18n{syncLoadingConfirmationTitle}</title>
+ </head>
+ <body>
+ <div class="container">
+ <div class="spinner"></div>
+ <div class="title">$i18n{syncLoadingConfirmationTitle}</div>
+ </div>
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/ssl/OWNERS b/chromium/chrome/browser/resources/ssl/OWNERS
deleted file mode 100644
index 356795be919..00000000000
--- a/chromium/chrome/browser/resources/ssl/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/browser/ssl/OWNERS \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/sync_file_system_internals/OWNERS b/chromium/chrome/browser/resources/sync_file_system_internals/OWNERS
index 20f262936de..86da7f4de7a 100644
--- a/chromium/chrome/browser/resources/sync_file_system_internals/OWNERS
+++ b/chromium/chrome/browser/resources/sync_file_system_internals/OWNERS
@@ -1,4 +1,5 @@
calvinlo@chromium.org
kinuko@chromium.org
+mek@chromium.org
nhiroki@chromium.org
pwnall@chromium.org
diff --git a/chromium/chrome/browser/resources/tab_search/BUILD.gn b/chromium/chrome/browser/resources/tab_search/BUILD.gn
index 3dc6cc2e6a6..2af86b0c514 100644
--- a/chromium/chrome/browser/resources/tab_search/BUILD.gn
+++ b/chromium/chrome/browser/resources/tab_search/BUILD.gn
@@ -81,10 +81,12 @@ preprocess_if_expr("preprocess") {
out_folder = "$target_gen_dir/$preprocess_folder"
out_manifest = "$target_gen_dir/$preprocess_manifest"
in_files = [
+ "bimap.js",
"fuzzy_search.js",
"tab_data.js",
"tab_search.js",
"tab_search_api_proxy.js",
+ "title_item.js",
]
}
@@ -144,6 +146,7 @@ js_type_check("closure_compile") {
]
deps = [
":app",
+ ":bimap",
":fuzzy_search",
":infinite_list",
":tab_data",
@@ -151,6 +154,7 @@ js_type_check("closure_compile") {
":tab_search_api_proxy",
":tab_search_item",
":tab_search_search_field",
+ ":title_item",
]
}
@@ -162,6 +166,7 @@ js_library("app") {
":tab_search_api_proxy",
":tab_search_item",
":tab_search_search_field",
+ ":title_item",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:cr.m",
@@ -171,6 +176,10 @@ js_library("app") {
externs_list = [ "$externs_path/metrics_private.js" ]
}
+js_library("bimap") {
+ deps = []
+}
+
js_library("fuzzy_search") {
deps = [
":tab_data",
@@ -180,9 +189,9 @@ js_library("fuzzy_search") {
js_library("infinite_list") {
deps = [
+ ":bimap",
"//third_party/polymer/v3_0/components-chromium/iron-selector:iron-selector",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:list_property_update_behavior.m",
]
}
@@ -215,10 +224,14 @@ js_library("tab_search_item") {
js_library("tab_search_search_field") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field_behavior.m",
+ "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field_behavior",
]
}
+js_library("title_item") {
+ deps = []
+}
+
html_to_js("web_components") {
js_files = [
"app.js",
diff --git a/chromium/chrome/browser/resources/tab_search/app.html b/chromium/chrome/browser/resources/tab_search/app.html
index 78cc37b271d..c8ca413aa09 100644
--- a/chromium/chrome/browser/resources/tab_search/app.html
+++ b/chromium/chrome/browser/resources/tab_search/app.html
@@ -1,8 +1,4 @@
<style include="mwb-shared-style">
- #tabsList {
- --list-max-height: 280px;
- }
-
#no-results {
color: var(--cr-primary-text-color);
font-size: var(--mwb-primary-text-font-size);
@@ -40,41 +36,43 @@
--iron-icon-fill-color: var(--google-blue-refresh-300);
}
}
+
+ .list-section-title {
+ align-items: center;
+ background-color: var(--mwb-background-color);
+ color: var(--cr-secondary-text-color);
+ display: flex;
+ font-size: var(--mwb-list-section-title-font-size);
+ height: var(--mwb-list-section-title-height);
+ padding-inline-start: 8px;
+ position: sticky;
+ text-transform: uppercase;
+ top: 0;
+ z-index: 1000;
+ }
</style>
-<iron-iconset-svg name="ts" size="24">
- <svg>
- <defs>
- <g id="feedback">
- <path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z">
- </path>
- </g>
- </defs>
- </svg>
-</iron-iconset-svg>
<tab-search-search-field id="searchField" autofocus
clear-label="$i18n{clearSearch}" label="$i18n{searchTabs}"
on-focus="onSearchFocus_" on-keydown="onSearchKeyDown_"
on-search-changed="onSearchChanged_"
search-result-text="[[searchResultText_]]">
</tab-search-search-field>
-<div hidden="[[!filteredOpenTabs_.length]]">
- <infinite-list id="tabsList" items="[[filteredOpenTabs_]]">
- <template is="dom-repeat">
+<div hidden="[[!filteredTabItemsCount_(filteredOpenTabs_, filteredRecentlyClosedTabs_)]]">
+ <infinite-list id="tabsList" max-height="[[listMaxHeight_(availableHeight_)]]"
+ items="[[listItems_(filteredOpenTabs_, filteredRecentlyClosedTabs_)]]">
+ <template data-type="TitleItem">
+ <div class="list-section-title">[[item.title]]</div>
+ </template>
+ <template data-type="TabData" data-selectable>
<tab-search-item id="[[item.tab.tabId]]" aria-label="[[ariaLabel_(item)]]"
- class="mwb-list-item" data="[[item]]" on-click="onItemClick_"
- on-close="onItemClose_" on-focus="onItemFocus_"
- on-keydown="onItemKeyDown_" tabindex="0" role="option">
+ class="mwb-list-item" data="[[item]]" index="[[index]]"
+ on-click="onItemClick_" on-close="onItemClose_"
+ on-focus="onItemFocus_" on-keydown="onItemKeyDown_" role="option"
+ tabindex="0">
</tab-search-item>
</template>
</infinite-list>
</div>
-<div id="no-results" hidden="[[filteredOpenTabs_.length]]">
+<div id="no-results" hidden="[[filteredTabItemsCount_(filteredOpenTabs_, filteredRecentlyClosedTabs_)]]">
$i18n{noResultsFound}
</div>
-<template is="dom-if" if="[[feedbackButtonEnabled_]]">
- <button id="feedback-footer" class="mwb-list-item" on-click="onFeedbackClick_"
- on-focus="onFeedbackFocus_">
- <iron-icon id="feedback-icon" icon="ts:feedback"></iron-icon>
- <div id="feedback-text">$i18n{submitFeedback}</div>
- </button>
-</template>
diff --git a/chromium/chrome/browser/resources/tab_search/app.js b/chromium/chrome/browser/resources/tab_search/app.js
index ed05bd08158..7727c3c5fb4 100644
--- a/chromium/chrome/browser/resources/tab_search/app.js
+++ b/chromium/chrome/browser/resources/tab_search/app.js
@@ -10,8 +10,9 @@ import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
import './infinite_list.js';
import './tab_search_item.js';
import './tab_search_search_field.js';
-import './strings.js';
+import './strings.m.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {listenOnce} from 'chrome://resources/js/util.m.js';
import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
@@ -19,9 +20,15 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/poly
import {fuzzySearch} from './fuzzy_search.js';
import {InfiniteList, NO_SELECTION, selectorNavigationKeys} from './infinite_list.js';
-import {TabData} from './tab_data.js';
+import {ariaLabel, TabData, TabItemType} from './tab_data.js';
import {Tab, Window} from './tab_search.mojom-webui.js';
import {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js';
+import {TitleItem} from './title_item.js';
+
+// The minimum number of list items we allow viewing regardless of browser
+// height. Includes a half row that hints to the user the capability to scroll.
+/** @type {number} */
+const MINIMUM_AVAILABLE_HEIGHT_LIST_ITEM_COUNT = 5.5;
export class TabSearchAppElement extends PolymerElement {
static get is() {
@@ -47,11 +54,26 @@ export class TabSearchAppElement extends PolymerElement {
},
/** @private {!Array<!TabData>} */
+ recentlyClosedTabs_: {
+ type: Array,
+ value: [],
+ },
+
+ /** @private {number} */
+ availableHeight_: Number,
+
+ /** @private {!Array<!TabData>} */
filteredOpenTabs_: {
type: Array,
value: [],
},
+ /** @private {!Array<!TabData>} */
+ filteredRecentlyClosedTabs_: {
+ type: Array,
+ value: [],
+ },
+
/**
* Options for fuzzy search.
* @private {!Object}
@@ -78,17 +100,18 @@ export class TabSearchAppElement extends PolymerElement {
},
/** @private {boolean} */
- feedbackButtonEnabled_: {
- type: Boolean,
- value: () => loadTimeData.getBoolean('submitFeedbackEnabled'),
- },
-
- /** @private {boolean} */
moveActiveTabToBottom_: {
type: Boolean,
value: () => loadTimeData.getBoolean('moveActiveTabToBottom'),
},
+ recentlyClosedDefaultItemDisplayCount_: {
+ type: Number,
+ value: () =>
+ /** @type {number} */ (
+ loadTimeData.getValue('recentlyClosedDefaultItemDisplayCount')),
+ },
+
/** @private */
searchResultText_: {type: String, value: ''}
};
@@ -112,6 +135,14 @@ export class TabSearchAppElement extends PolymerElement {
this.onDocumentHidden_();
}
};
+
+ /** @private {!TitleItem} */
+ this.openTabsTitleItem_ =
+ new TitleItem(loadTimeData.getStringF('openTabs'));
+
+ /** @private {!TitleItem} */
+ this.recentlyClosedTabsTitleItem_ = new TitleItem(
+ loadTimeData.getStringF('recentlyClosedTabs'));
}
/** @override */
@@ -149,7 +180,8 @@ export class TabSearchAppElement extends PolymerElement {
const callbackRouter = this.apiProxy_.getCallbackRouter();
this.listenerIds_.push(
callbackRouter.tabsChanged.addListener(
- profileData => this.openTabsChanged_(profileData.windows)),
+ profileData => this.tabsChanged_(
+ profileData.windows, profileData.recentlyClosedTabs)),
callbackRouter.tabUpdated.addListener(tab => this.onTabUpdated_(tab)),
callbackRouter.tabsRemoved.addListener(
tabIds => this.onTabsRemoved_(tabIds)));
@@ -171,9 +203,38 @@ export class TabSearchAppElement extends PolymerElement {
'visibilitychange', this.visibilityChangedListener_);
}
+ /**
+ * @param {string} name A property whose value is specified in pixels.
+ * @return {number}
+ */
+ getStylePropertyPixelValue_(name) {
+ const pxValue = getComputedStyle(this).getPropertyValue(name);
+ assert(pxValue);
+
+ return Number.parseInt(pxValue.trim().slice(0, -2), 10);
+ }
+
+ /**
+ * Calculate the list's available height by subtracting the height used by
+ * the search and feedback fields.
+ *
+ * @param {number} height
+ * @return {number}
+ * @private
+ */
+ listMaxHeight_(height) {
+ return Math.max(
+ height - this.$.searchField.offsetHeight,
+ Math.round(
+ MINIMUM_AVAILABLE_HEIGHT_LIST_ITEM_COUNT *
+ this.getStylePropertyPixelValue_('--mwb-item-height')));
+ }
+
/** @private */
onDocumentHidden_() {
- (this.$.tabsList).selected = NO_SELECTION;
+ this.$.tabsList.scrollTop = 0;
+ this.$.tabsList.selected = NO_SELECTION;
+
this.$.searchField.setValue('');
this.$.searchField.getSearchInput().focus();
}
@@ -186,15 +247,16 @@ export class TabSearchAppElement extends PolymerElement {
'Tabs.TabSearch.WebUI.TabListDataReceived',
Math.round(Date.now() - getTabsStartTimestamp));
- // The infinite-list only triggers a dom-change event after it is ready
- // and observes a change on the list items.
- listenOnce(this.$.tabsList, 'dom-change', () => {
+ // The infinite-list produces viewport-filled events whenever a data or
+ // scroll position change triggers the the viewport fill logic.
+ listenOnce(this.$.tabsList, 'viewport-filled', () => {
// Push showUI() to the event loop to allow reflow to occur following
// the DOM update.
setTimeout(() => this.apiProxy_.showUI(), 0);
});
- this.openTabsChanged_(profileData.windows);
+ this.availableHeight_ = profileData.windows.find((t) => t.active).height;
+ this.tabsChanged_(profileData.windows, profileData.recentlyClosedTabs);
});
}
@@ -206,9 +268,9 @@ export class TabSearchAppElement extends PolymerElement {
// Replace the tab with the same tabId and trigger rerender.
for (let i = 0; i < this.openTabs_.length; ++i) {
if (this.openTabs_[i].tab.tabId === updatedTab.tabId) {
- this.openTabs_[i] =
- this.tabData_(updatedTab, this.openTabs_[i].inActiveWindow);
- this.updateFilteredTabs_(this.openTabs_);
+ this.openTabs_[i] = this.tabData_(
+ updatedTab, this.openTabs_[i].inActiveWindow, TabItemType.OPEN);
+ this.updateFilteredTabs_(this.openTabs_, this.recentlyClosedTabs_);
return;
}
}
@@ -251,10 +313,13 @@ export class TabSearchAppElement extends PolymerElement {
onSearchChanged_(e) {
this.searchText_ = e.detail;
- this.updateFilteredTabs_(this.openTabs_);
+ this.updateFilteredTabs_(this.openTabs_, this.recentlyClosedTabs_);
// Reset the selected item whenever a search query is provided.
/** @type {!InfiniteList} */ (this.$.tabsList).selected =
- this.filteredOpenTabs_.length > 0 ? 0 : NO_SELECTION;
+ (this.filteredOpenTabs_.length +
+ this.filteredRecentlyClosedTabs_.length) > 0 ?
+ 0 :
+ NO_SELECTION;
this.$.searchField.announce(this.getA11ySearchResultText_());
}
@@ -264,7 +329,11 @@ export class TabSearchAppElement extends PolymerElement {
* @private
*/
getA11ySearchResultText_() {
- const length = this.filteredOpenTabs_.length;
+ // TODO(romanarora): Screen readers' list item number announcement will
+ // not match as it counts the title items too. Investigate how to
+ // programmatically control announcements to avoid this.
+ const length =
+ this.filteredOpenTabs_.length + this.filteredRecentlyClosedTabs_.length;
let text;
if (this.searchText_.length > 0) {
text = loadTimeData.getStringF(
@@ -277,24 +346,30 @@ export class TabSearchAppElement extends PolymerElement {
return text;
}
- /** @private */
- onFeedbackClick_() {
- this.apiProxy_.showFeedbackPage();
- }
-
- /** @private */
- onFeedbackFocus_() {
- /** @type {!InfiniteList} */ (this.$.tabsList).selected = NO_SELECTION;
- }
-
/**
* @param {!Event} e
* @private
*/
onItemClick_(e) {
- const tabId = Number.parseInt(e.currentTarget.id, 10);
- this.apiProxy_.switchToTab(
- {tabId}, !!this.searchText_, /** @type {number} */ (e.model.index));
+ const tabData = /** @type {!TabData} */ (e.model.item);
+ this.tabItemAction_(
+ tabData.type, tabData.tab.tabId, /** @type {number} */ (e.model.index));
+ }
+
+ /**
+ * Trigger the click/press action associated with the given Tab item type for
+ * the given Tab Id.
+ * @param {!TabItemType} type
+ * @param {number} tabId
+ * @param {number} tabIndex
+ * @private
+ */
+ tabItemAction_(type, tabId, tabIndex) {
+ if (type === TabItemType.OPEN) {
+ this.apiProxy_.switchToTab({tabId}, !!this.searchText_, tabIndex);
+ } else {
+ this.apiProxy_.openRecentlyClosedTab(tabId);
+ }
}
/**
@@ -303,9 +378,10 @@ export class TabSearchAppElement extends PolymerElement {
*/
onItemClose_(e) {
performance.mark('close_tab:benchmark_begin');
- const tabId = Number.parseInt(e.currentTarget.id, 10);
+ const tabId = e.model.item.tab.tabId;
this.apiProxy_.closeTab(
- tabId, !!this.searchText_, /** @type {number} */ (e.model.index));
+ tabId, !!this.searchText_,
+ /** @type {number} */ (e.model.index));
this.announceA11y_(loadTimeData.getString('a11yTabClosed'));
listenOnce(this.$.tabsList, 'iron-items-changed', () => {
performance.mark('close_tab:benchmark_end');
@@ -324,23 +400,24 @@ export class TabSearchAppElement extends PolymerElement {
e.stopPropagation();
e.preventDefault();
- this.apiProxy_.switchToTab(
- {tabId: this.getSelectedTab_().tabId}, !!this.searchText_,
- this.getSelectedIndex());
+ const tabData = /** @type {!TabData} */ (e.model.item);
+ this.tabItemAction_(
+ tabData.type, tabData.tab.tabId, /** @type {number} */ (e.model.index));
}
/**
* @param {!Array<!Window>} newOpenWindows
+ * @param {!Array<!Tab>} recentlyClosedTabs
* @private
*/
- openTabsChanged_(newOpenWindows) {
- this.openTabs_ = [];
- newOpenWindows.forEach(({active, tabs}) => {
- tabs.forEach(tab => {
- this.openTabs_.push(this.tabData_(tab, active));
- });
- });
- this.updateFilteredTabs_(this.openTabs_);
+ tabsChanged_(newOpenWindows, recentlyClosedTabs) {
+ this.openTabs_ = newOpenWindows.reduce(
+ (acc, {active, tabs}) => acc.concat(
+ tabs.map(tab => this.tabData_(tab, active, TabItemType.OPEN))),
+ []);
+ this.recentlyClosedTabs_ = recentlyClosedTabs.map(
+ tab => this.tabData_(tab, false, TabItemType.RECENTLY_CLOSED));
+ this.updateFilteredTabs_(this.openTabs_, this.recentlyClosedTabs_);
// If there was no previously selected index, set the first item as
// selected; else retain the currently selected index. If the list
@@ -420,12 +497,11 @@ export class TabSearchAppElement extends PolymerElement {
// TODO(tluk): Fix this to use aria-activedescendant when it's updated to
// work with ShadowDOM elements.
- this.$.searchField.announce(
- this.ariaLabel_(this.filteredOpenTabs_[this.getSelectedIndex()]));
+ this.$.searchField.announce(ariaLabel(this.$.tabsList.selectedItem));
} else if (e.key === 'Enter') {
- this.apiProxy_.switchToTab(
- {tabId: this.getSelectedTab_().tabId}, !!this.searchText_,
- this.getSelectedIndex());
+ const tabData = /** @type {!TabData} */ (this.$.tabsList.selectedItem);
+ this.tabItemAction_(
+ tabData.type, tabData.tab.tabId, this.getSelectedIndex());
e.stopPropagation();
}
}
@@ -443,26 +519,70 @@ export class TabSearchAppElement extends PolymerElement {
* @private
*/
ariaLabel_(tabData) {
- return `${tabData.tab.title} ${tabData.hostname}`;
+ return ariaLabel(tabData);
+ }
+
+ /**
+ * @param {!Array<!TabData>} filteredOpenTabs
+ * @param {!Array<!TabData>} filteredRecentlyClosedTabs
+ * @return {number}
+ * @private
+ */
+ filteredTabItemsCount_(filteredOpenTabs, filteredRecentlyClosedTabs) {
+ return filteredOpenTabs.length + filteredRecentlyClosedTabs.length;
+ }
+
+ /**
+ * @param {!Array<!TabData>} filteredOpenTabs
+ * @param {!Array<!TabData>} filteredRecentlyClosedTabs
+ * @return {!Array<!TabData|!TitleItem>}
+ * @private
+ */
+ listItems_(filteredOpenTabs, filteredRecentlyClosedTabs) {
+ const items = [];
+ if (filteredOpenTabs.length !== 0) {
+ items.push(this.openTabsTitleItem_, ...filteredOpenTabs);
+ }
+
+ if (filteredRecentlyClosedTabs.length !== 0) {
+ items.push(
+ this.recentlyClosedTabsTitleItem_, ...filteredRecentlyClosedTabs);
+ }
+
+ return items;
}
/**
* @param {!Tab} tab
* @param {boolean} inActiveWindow
+ * @param {!TabItemType} type
* @return {!TabData}
* @private
*/
- tabData_(tab, inActiveWindow) {
- const hostname = new URL(tab.url).hostname;
- return /** @type {!TabData} */ ({hostname, inActiveWindow, tab});
+ tabData_(tab, inActiveWindow, type) {
+ const tabData = new TabData();
+ try {
+ tabData.hostname = new URL(tab.url).hostname;
+ } catch (e) {
+ // TODO(crbug.com/1186409): Remove this after we root cause the issue
+ console.error(`Error parsing URL on Tab Search: url=${tab.url}`);
+ tabData.hostname = '';
+ }
+ tabData.inActiveWindow = inActiveWindow;
+ tabData.tab = tab;
+ tabData.type = type;
+ tabData.a11yTypeText = loadTimeData.getStringF(
+ type === TabItemType.OPEN ? 'openTabs' : 'recentlyClosedTabs');
+ return tabData;
}
/**
- * @param {!Array<!TabData>} tabs
+ * @param {!Array<!TabData>} openTabs
+ * @param {!Array<!TabData>} recentlyClosedTabs
* @private
*/
- updateFilteredTabs_(tabs) {
- tabs.sort((a, b) => {
+ updateFilteredTabs_(openTabs, recentlyClosedTabs) {
+ openTabs.sort((a, b) => {
// Move the active tab to the bottom of the list
// because it's not likely users want to click on it.
if (this.moveActiveTabToBottom_) {
@@ -481,7 +601,13 @@ export class TabSearchAppElement extends PolymerElement {
});
this.filteredOpenTabs_ =
- fuzzySearch(this.searchText_, tabs, this.fuzzySearchOptions_);
+ fuzzySearch(this.searchText_, openTabs, this.fuzzySearchOptions_);
+ const filteredRecentlyClosedTabs = fuzzySearch(
+ this.searchText_, recentlyClosedTabs, this.fuzzySearchOptions_);
+ this.filteredRecentlyClosedTabs_ = this.searchText_.length ?
+ filteredRecentlyClosedTabs :
+ filteredRecentlyClosedTabs.slice(
+ 0, this.recentlyClosedDefaultItemDisplayCount_);
this.searchResultText_ = this.getA11ySearchResultText_();
}
diff --git a/chromium/chrome/browser/resources/tab_search/bimap.js b/chromium/chrome/browser/resources/tab_search/bimap.js
new file mode 100644
index 00000000000..d6c7495e118
--- /dev/null
+++ b/chromium/chrome/browser/resources/tab_search/bimap.js
@@ -0,0 +1,76 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'BiMap' is an implementation of a bidirectional map. It
+ * facilitates looking up for associated pairs in either direction.
+ */
+
+// TODO(romanarora): Investigate leveraging an existing data structures third
+// party library or moving this class to a shareable location.
+
+/**
+ * @template K, V
+ */
+export class BiMap {
+ /**
+ * @param {!Object=} map
+ */
+ constructor(map) {
+ /**
+ * @private {!Map<K, V>}
+ */
+ this.map_ = new Map();
+
+ /**
+ * @private {!Map<V, K>}
+ */
+ this.inverseMap_ = new Map();
+
+ for (const key in map) {
+ const value = map[key];
+ this.map_.set(key, value);
+ this.inverseMap_.set(value, key);
+ }
+ }
+
+ /**
+ * @param {K} key
+ * @return {V}
+ */
+ get(key) {
+ return this.map_.get(key);
+ }
+
+ /**
+ * @param {V} key
+ * @return {K}
+ */
+ invGet(key) {
+ return this.inverseMap_.get(key);
+ }
+
+ /**
+ * @param {K} key
+ * @param {V} value
+ */
+ set(key, value) {
+ this.map_.set(key, value);
+ this.inverseMap_.set(value, key);
+ }
+
+ /**
+ * @param {V} key
+ * @param {K} value
+ */
+ invSet(key, value) {
+ this.inverseMap_.set(key, value);
+ this.map_.set(value, key);
+ }
+
+ /** @return {number} */
+ size() {
+ return this.map_.size;
+ }
+}
diff --git a/chromium/chrome/browser/resources/tab_search/fuzzy_search.js b/chromium/chrome/browser/resources/tab_search/fuzzy_search.js
index b2a6950b08c..4f6c3b4bad1 100644
--- a/chromium/chrome/browser/resources/tab_search/fuzzy_search.js
+++ b/chromium/chrome/browser/resources/tab_search/fuzzy_search.js
@@ -35,7 +35,7 @@ export function fuzzySearch(input, records, options) {
result = new Fuse(records, options).search(input).map(result => {
const titleMatch = result.matches.find(e => e.key === 'tab.title');
const hostnameMatch = result.matches.find(e => e.key === 'hostname');
- const item = Object.assign({}, result.item);
+ const item = cloneTabDataObj(result.item);
if (titleMatch) {
item.titleHighlightRanges = convertToRanges(titleMatch.indices);
}
@@ -50,6 +50,16 @@ export function fuzzySearch(input, records, options) {
}
/**
+ * @param {!TabData} tabData
+ * @return {!TabData}
+ */
+function cloneTabDataObj(tabData) {
+ const clone = Object.assign({}, tabData);
+ Object.setPrototypeOf(clone, TabData.prototype);
+ return /** @type {!TabData} */ (clone);
+}
+
+/**
* Convert fuse.js matches [start1, end1], [start2, end2] ... to
* ranges {start:start1, length:length1}, {start:start2, length:length2} ...
* to be used by search_highlight_utils.js
@@ -101,7 +111,7 @@ function exactSearch(searchText, records, options) {
if (!titleHighlightRanges.length && !hostnameHighlightRanges.length) {
continue;
}
- const matchedTab = /** @type {!TabData} */ (Object.assign({}, tab));
+ const matchedTab = cloneTabDataObj(tab);
if (titleHighlightRanges.length) {
matchedTab.titleHighlightRanges = titleHighlightRanges;
}
diff --git a/chromium/chrome/browser/resources/tab_search/infinite_list.html b/chromium/chrome/browser/resources/tab_search/infinite_list.html
index 55b5dfe2b8d..518643be171 100644
--- a/chromium/chrome/browser/resources/tab_search/infinite_list.html
+++ b/chromium/chrome/browser/resources/tab_search/infinite_list.html
@@ -1,16 +1,15 @@
<style>
:host {
display: block;
- max-height: var(--list-max-height);
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
</style>
-<div id="items">
+<div id="container">
<iron-selector id="selector" on-keydown="onKeyDown_"
on-iron-select="onSelectedChanged_" role="listbox"
- selected-class="selected">
+ selectable="[[selectableSelector_()]]" selected-class="selected">
<slot></slot>
</iron-selector>
</div>
diff --git a/chromium/chrome/browser/resources/tab_search/infinite_list.js b/chromium/chrome/browser/resources/tab_search/infinite_list.js
index 62cc2c27b44..f67af0499f2 100644
--- a/chromium/chrome/browser/resources/tab_search/infinite_list.js
+++ b/chromium/chrome/browser/resources/tab_search/infinite_list.js
@@ -3,32 +3,39 @@
// found in the LICENSE file.
/**
- * @fileoverview 'infinite-list' is a component optimized for showing a
- * list of items that overflows the view and requires scrolling. For performance
- * reasons, The DOM items are added incrementally to the view as the user
- * scrolls through the list. The template inside this element represents the DOM
- * to create for each list item. The `items` property specifies an array of list
- * item data. The component leverages an <iron-selector> to manage item
- * selection and styling and a <dom-repeat> which renders the provided template.
- *
- * Note that the component expects a '--list-max-height' variable to be defined
- * in order to determine its maximum height. Additionally, it expects the
- * `chunkItemCount` property to be a number of DOM items that is large enough to
- * fill the view.
+ * @fileoverview 'infinite-list' is a component optimized for showing a list of
+ * items that overflows the view and requires scrolling. For performance
+ * reasons, the DOM items are incrementally added to the view as the user
+ * scrolls through the list. The component expects a `max-height` property to be
+ * specified in order to determine how many HTML elements to render initially.
+ * The templates inside this element are used to create each list item's
+ * HTML element. In order to associate the templates and items, a `data-type`
+ * attribute is used. The `items` property specifies an array of list item data.
+ * The component leverages an <iron-selector> to manage item selection and
+ * styling. Items that should selectable must be associated with a template that
+ * has a `data-selectable` attribute.
*/
import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
-import {assert, assertInstanceof} from 'chrome://resources/js/assert.m.js';
-import {updateListProperty} from 'chrome://resources/js/list_property_update_behavior.m.js';
-import {listenOnce} from 'chrome://resources/js/util.m.js';
-import {afterNextRender, DomRepeat, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {calculateSplices, html, PolymerElement, TemplateInstanceBase, templatize} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {BiMap} from './bimap.js';
/** @type {number} */
export const NO_SELECTION = -1;
+/**
+ * HTML class name used to recognize selectable items.
+ * @type {string}
+ */
+const SELECTABLE_CLASS_NAME = 'selectable';
+
/** @type {!Array<string>} */
-export const selectorNavigationKeys = ['ArrowUp', 'ArrowDown', 'Home', 'End'];
+export const selectorNavigationKeys =
+ Object.freeze(['ArrowUp', 'ArrowDown', 'Home', 'End']);
export class InfiniteList extends PolymerElement {
static get is() {
@@ -41,19 +48,17 @@ export class InfiniteList extends PolymerElement {
static get properties() {
return {
- /**
- * Controls the number of list items rendered initially, and added on
- * demand as the component is scrolled.
- */
- chunkItemCount: {
+ /** @type {number} */
+ maxHeight: {
type: Number,
- value: 10,
+ observer: 'onMaxHeightChanged_',
},
- /** @type {?Array<!Object>} */
+ /** @type {!Array<!Object>} */
items: {
type: Array,
observer: 'onItemsChanged_',
+ value: [],
},
};
}
@@ -62,94 +67,274 @@ export class InfiniteList extends PolymerElement {
super();
/**
- * An instance of DomRepeat in charge of stamping DOM item elements.
- * For performance reasons, the items property of this instance is
- * modified on scroll events so that it has enough items to render
- * the current scroll view.
- * @private {?DomRepeat}
+ * A map of type names associated with constructors used for creating list
+ * item template instances.
+ * @private {!Map<string, ?function(new:TemplateInstanceBase, !Object)>}
+ */
+ this.instanceConstructors_ = new Map();
+
+ /**
+ * An array of template instances each of which contain the HTMLElement
+ * associated with a given rendered item from the items array. The entries
+ * are ordered to match the item's index.
+ * @private {!Array<!TemplateInstanceBase>}
+ */
+ this.instances_ = [];
+
+ /**
+ * A set of class names for which the selectable style class should be
+ * applied.
+ * @private {!Set<string>}
+ */
+ this.selectableTypes_ = new Set();
+
+ /**
+ * Correlates the selectable item indexes to the `items` property indexes.
+ * @private {?BiMap<number, number>}
*/
- this.domRepeat_ = null;
+ this.selectableIndexToItemIndex_ = null;
}
/** @override */
ready() {
super.ready();
+ this.ensureTemplatized_();
+ this.addEventListener('scroll', () => this.onScroll_());
+ }
- this.domRepeat_ = assertInstanceof(
- this.firstChild, DomRepeat,
- 'infinite-list requires a dom-repeat child to be provided in light-dom');
+ /**
+ * Create and insert as many DOM items as necessary to ensure all items are
+ * rendered.
+ */
+ ensureAllDomItemsAvailable() {
+ if (this.items.length > 0) {
+ const shouldUpdateHeight = this.instances_.length !== this.items.length;
+ for (let i = this.instances_.length; i < this.items.length; i++) {
+ this.createAndInsertDomItem_(i);
+ }
- this.addEventListener('scroll', () => this.onScroll_());
+ if (shouldUpdateHeight) {
+ this.updateHeight_();
+ }
+ }
}
- /** @private */
- getDomItems_() {
+ /**
+ * @param {string} key Keyboard event key value.
+ * @param {boolean=} focusItem Whether to focus the selected item.
+ */
+ navigate(key, focusItem) {
const selector = /** @type {!IronSelectorElement} */ (this.$.selector);
- return Array.prototype.slice.call(
- selector.children, 0, selector.children.length - 1);
+
+ if ((key === 'ArrowUp' && selector.selected === 0) || key === 'End') {
+ this.ensureAllDomItemsAvailable();
+ selector.selected = this.selectableIndexToItemIndex_.size() - 1;
+ } else {
+ switch (key) {
+ case 'ArrowUp':
+ selector.selectPrevious();
+ break;
+ case 'ArrowDown':
+ selector.selectNext();
+ break;
+ case 'Home':
+ selector.selected = 0;
+ break;
+ case 'End':
+ this.$.selector.selected =
+ this.selectableIndexToItemIndex_.size() - 1;
+ break;
+ }
+ }
+
+ if (focusItem) {
+ selector.selectedItem.focus({preventScroll: true});
+ }
+ }
+
+ ensureTemplatized_() {
+ // The user provided light-dom template(s) to use when stamping DOM items.
+ const templates =
+ /** @type {!NodeList<!HTMLTemplateElement>} */ (
+ this.querySelectorAll('template'));
+ assert(templates.length > 0, 'At least one template must be provided');
+
+ // Initialize a map of class names to template instance constructors. On
+ // inserting DOM nodes, a lookup will be performed against the map to
+ // determine the correct constructor to use for rendering a given class
+ // type.
+ templates.forEach(template => {
+ const className = assert(template.getAttribute('data-type'));
+ if (template.hasAttribute('data-selectable')) {
+ this.selectableTypes_.add(className);
+ }
+
+ const instanceProps = {
+ item: true,
+ // Selectable items require an `index` property to facilitate selection
+ // and navigation capabilities exposed through the `selected` and
+ // `selectedItem` properties, and the navigate method.
+ index: this.selectableTypes_.has(className),
+ };
+ this.instanceConstructors_.set(className, templatize(template, this, {
+ parentModel: true,
+ instanceProps,
+ }));
+ });
}
/**
- * @param {number} idx
+ * Create a DOM item and immediately insert it in the DOM tree. A reference is
+ * stored in the instances_ array for future item lifecycle operations.
+ * @param {number} index
* @private
*/
- isDomItemAtIndexAvailable_(idx) {
- return idx < this.domRepeat_.items.length;
+ createAndInsertDomItem_(index) {
+ const instance = this.createItemInstance_(index);
+ this.instances_[index] = assert(instance);
+ // Offset the insertion index to take into account the template elements
+ // that are present in the light DOM.
+ this.insertBefore(
+ instance.root, this.children[index + this.instanceConstructors_.size]);
}
- ensureAllDomItemsAvailable() {
- const lastItemIndex = this.items.length - 1;
- if (!this.isDomItemAtIndexAvailable_(lastItemIndex)) {
- this.ensureDomItemsAvailableStartingAt_(lastItemIndex);
+ /**
+ * @param {number} itemIndex
+ * @return {TemplateInstanceBase}
+ * @private
+ */
+ createItemInstance_(itemIndex) {
+ const item = this.items[itemIndex];
+ const instanceConstructor =
+ assert(this.instanceConstructors_.get(item.constructor.name));
+ const itemSelectable = this.isItemSelectable_(item);
+ const args = itemSelectable ?
+ {item, index: this.selectableIndexToItemIndex_.invGet(itemIndex)} :
+ {item};
+ const instance = new instanceConstructor(args);
+
+ if (itemSelectable) {
+ instance.children[0].classList.add(SELECTABLE_CLASS_NAME);
}
+
+ return instance;
}
/**
- * Ensure we have the required DOM items to fill the current view starting
- * at the specified index.
- *
- * @param {number} idx
+ * @return {number} The average DOM item height.
* @private
*/
- ensureDomItemsAvailableStartingAt_(idx) {
- if (this.domRepeat_.items.length === this.items.length) {
- return;
+ domItemAverageHeight_() {
+ // It must always be true that if this logic is invoked, there should be
+ // enough DOM items rendered to estimate an item average height. This is
+ // ensured by the logic that observes the items array.
+ const domItemCount = assert(this.instances_.length);
+ const lastDomItem = this.lastElementChild;
+ return (lastDomItem.offsetTop + lastDomItem.offsetHeight) / domItemCount;
+ }
+
+ /**
+ * Create and insert as many DOM items as necessary to ensure the selectable
+ * item at the specified index is present.
+ * @param {number} selectableItemIndex
+ * @private
+ */
+ ensureSelectableDomItemAvailable_(selectableItemIndex) {
+ const itemIndex = this.selectableIndexToItemIndex_.get(selectableItemIndex);
+ for (let i = this.instances_.length; i < itemIndex + 1; i++) {
+ this.createAndInsertDomItem_(i);
}
+ }
- const newItems = this.items.slice(
- this.domRepeat_.items.length,
- Math.min(idx + this.chunkItemCount, this.items.length));
- if (newItems.length > 0) {
- const startTime = performance.now();
- this.domRepeat_.push('items', ...newItems);
- listenOnce(this, 'dom-change', () => {
- afterNextRender(this, () => {
- performance.mark(`infinite_list_updated:${
- performance.now() - startTime}:benchmark_value`);
- });
- });
+ /**
+ * @param {number} index
+ * @return {!Element}
+ * @private
+ */
+ getDomItem_(index) {
+ return this.instances_[index].children[0];
+ }
+
+ /**
+ * @param {number} selectableItemIndex
+ * @return {!Element}
+ * @private
+ */
+ getSelectableDomItem_(selectableItemIndex) {
+ return this.getDomItem_(
+ this.selectableIndexToItemIndex_.get(selectableItemIndex));
+ }
+
+ /**
+ * @return {number} The number of items required to fill the current
+ * viewport.
+ */
+ viewportItemCount_() {
+ return Math.ceil(this.maxHeight / this.domItemAverageHeight_());
+ }
+
+ /**
+ * @param {number} height
+ * @return {boolean} Whether DOM items were created or not.
+ * @private
+ */
+ fillViewHeight_(height) {
+ const startTime = performance.now();
+
+ // Ensure we have added enough DOM items so that we are able to estimate
+ // item average height.
+ assert(this.items.length);
+ const initialDomItemCount = this.instances_.length;
+ if (initialDomItemCount === 0) {
+ this.createAndInsertDomItem_(0);
+ }
+
+ const desiredDomItemCount = Math.min(
+ Math.ceil(height / this.domItemAverageHeight_()), this.items.length);
+ // TODO(romanarora): Re-evaluate the average dom item height at given item
+ // insertion counts in order to determine more precisely the right number of
+ // items to render.
+ for (let i = this.instances_.length; i < desiredDomItemCount; i++) {
+ this.createAndInsertDomItem_(i);
+ }
+
+ // TODO(romanarora): Check if we have reached the desired height, and if not
+ // keep adding items.
+
+ if (initialDomItemCount !== desiredDomItemCount) {
+ performance.mark(`infinite_list_view_updated:${
+ performance.now() - startTime}:benchmark_value`);
+
+ return true;
}
+
+ return false;
}
/**
- * Adds additional DOM items as needed to fill the view based on user scroll
- * interactions.
+ * @param {!Object} item
+ * @return {boolean}
+ */
+ isItemSelectable_(item) {
+ return this.selectableTypes_.has(item.constructor.name);
+ }
+
+ /**
+ * @return {boolean} Whether a list item is selected and focused.
* @private
*/
- onScroll_() {
- if (this.scrollTop > 0 &&
- this.domRepeat_.items.length !== this.items.length) {
- const aboveScrollTopItemCount =
- Math.round(this.scrollTop / this.domItemAverageHeight_());
-
- // Ensure we have sufficient items to fill the current scroll position and
- // a full view following our current position.
- if (aboveScrollTopItemCount + this.chunkItemCount >
- this.domRepeat_.items.length) {
- this.ensureDomItemsAvailableStartingAt_(aboveScrollTopItemCount);
- this.updateScrollerSize_();
- }
+ isItemSelectedAndFocused_() {
+ const selectedItemIndex = this.$.selector.selected;
+ if (selectedItemIndex !== undefined) {
+ const selectedItem = this.getSelectableDomItem_(selectedItemIndex);
+ const deepActiveElement = getDeepActiveElement();
+
+ return selectedItem === deepActiveElement ||
+ (selectedItem.shadowRoot &&
+ selectedItem.shadowRoot.activeElement === deepActiveElement);
}
+
+ return false;
}
/**
@@ -178,73 +363,186 @@ export class InfiniteList extends PolymerElement {
}
/**
- * @return {number}
- * @private
- */
- domItemAverageHeight_() {
- const selector = /** @type {!IronSelectorElement} */ (this.$.selector);
- if (!selector.items || selector.items.length === 0) {
- return 0;
- }
-
- const domItemCount = selector.items.length;
- const lastDomItem = selector.items[domItemCount - 1];
- return (lastDomItem.offsetTop + lastDomItem.offsetHeight) / domItemCount;
- }
-
- /**
* Ensures that when the items property changes, only a chunk of the items
* needed to fill the current scroll position view are added to the DOM, thus
* improving rendering performance.
- *
* @param {!Array} newItems
* @param {!Array} oldItems
* @private
*/
onItemsChanged_(newItems, oldItems) {
- if (!this.domRepeat_) {
+ if (this.instanceConstructors_.size === 0) {
return;
}
- if (!oldItems || oldItems.length === 0) {
- this.domRepeat_.set('items', []);
- this.ensureDomItemsAvailableStartingAt_(0);
- listenOnce(this.$.selector, 'iron-items-changed', () => {
- this.updateScrollerSize_();
+ if (newItems.length === 0) {
+ this.selectableIndexToItemIndex_ = new BiMap();
+ // If the new items array is empty, there is nothing to be rendered, so we
+ // remove any DOM items present.
+ this.removeDomItems_(0, this.instances_.length);
+ this.resetSelected_();
+ } else {
+ const itemSelectedAndFocused = this.isItemSelectedAndFocused_();
+ this.selectableIndexToItemIndex_ = new BiMap();
+ newItems.forEach((item, index) => {
+ if (this.isItemSelectable_(item)) {
+ this.selectableIndexToItemIndex_.set(
+ this.selectableIndexToItemIndex_.size(), index);
+ }
});
- return;
- }
+ // If we had previously rendered some DOM items, we perform a partial
+ // update on them.
+ if (oldItems.length !== 0) {
+ // Update no more items than currently rendered and no less than what is
+ // required to fill the viewport.
+ const count =
+ Math.max(this.instances_.length, this.viewportItemCount_());
+ this.updateDomItems_(
+ newItems.slice(0, count), oldItems.slice(0, count));
+ }
+
+ this.fillViewHeight_(this.scrollTop + this.maxHeight);
+
+ // Since the new selectable items' length might be smaller than the old
+ // selectable items' length, we need to check if the selected index is
+ // still valid and if not adjust it.
+ const selector = /** @type {!IronSelectorElement} */ (this.$.selector);
+ if (selector.selected >= this.selectableIndexToItemIndex_.size()) {
+ selector.selected = this.selectableIndexToItemIndex_.size() - 1;
+ }
- updateListProperty(
- this.domRepeat_, 'items', tabData => tabData,
- newItems.slice(
- 0,
- Math.min(
- Math.max(this.domRepeat_.items.length, this.chunkItemCount),
- newItems.length)),
- true /* identityBasedUpdate= */);
+ // Restore focus to the selected item if necessary.
+ if (itemSelectedAndFocused) {
+ this.getSelectableDomItem_(/** @type {number} */ (selector.selected))
+ .focus();
+ }
+ }
if (newItems.length !== oldItems.length) {
- this.updateScrollerSize_();
+ this.updateHeight_();
}
+
+ this.dispatchEvent(
+ new CustomEvent('viewport-filled', {bubbles: true, composed: true}));
+ }
+
+ /**
+ * @param {number} height
+ * @private
+ */
+ onMaxHeightChanged_(height) {
+ this.style.maxHeight = height + 'px';
}
/**
- * Sets the scroll height of the component based on an estimated average
- * DOM item height and the total number of items.
+ * Adds additional DOM items as needed to fill the view based on user scroll
+ * interactions.
* @private
*/
- updateScrollerSize_() {
- if (this.$.selector.items.length !== 0) {
- const estScrollHeight = this.items.length * this.domItemAverageHeight_();
- this.$.items.style.height = estScrollHeight + 'px';
+ onScroll_() {
+ const scrollTop = this.scrollTop;
+ if (scrollTop > 0 && this.instances_.length !== this.items.length) {
+ if (this.fillViewHeight_(scrollTop + this.maxHeight)) {
+ this.updateHeight_();
+ }
+ }
+ }
+
+ /**
+ * @param {!Array} newItems
+ * @param {!Array} oldItems
+ * @private
+ */
+ updateDomItems_(newItems, oldItems) {
+ // Identify the differences between the original and new list of items.
+ // These are represented as splice objects containing removed and added
+ // item information at a given index. We leverage these splices to change
+ // only the affected items.
+ const splices = calculateSplices(newItems, oldItems);
+ for (const splice of splices) {
+ // If the splice applies to indices for which there are no instances yet
+ // there is no need to update them yet.
+ if (splice.index >= this.instances_.length) {
+ continue;
+ }
+
+ if (splice.addedCount === splice.removed.length) {
+ // If the number of added and removed items are equal, reuse the
+ // existing DOM instances and simply update their item binding.
+ const indexOfLastInstance =
+ Math.min(splice.index + splice.addedCount, this.instances_.length);
+ for (let i = splice.index; i < indexOfLastInstance; i++) {
+ // If the types don't match, we need to replace the existing instance.
+ if (oldItems[i].constructor !== newItems[i].constructor) {
+ this.getDomItem_(i).remove();
+ this.createAndInsertDomItem_(i);
+ continue;
+ }
+
+ this.instances_[i]['item'] = newItems[i];
+ }
+ continue;
+ }
+
+ // For simplicity, if new items have been added, we remove the no longer
+ // accurate template instances following the splice index and allow the
+ // component to ensure the viewport is full. If no items were added, we
+ // simply remove the no longer existing items and update any following
+ // template instances.
+ // TODO(romanarora): Introduce a DOM item reuse pool for a more
+ // efficient update.
+ const removeCount = splice.addedCount !== 0 ?
+ this.instances_.length - splice.index :
+ splice.removed.length;
+ this.removeDomItems_(splice.index, removeCount);
+ }
+
+ // Update the index property of the selectable item instances as it may no
+ // longer be accurate after the splices have taken place.
+ this.updateSelectableItemInstanceIndexes_();
+ }
+
+ /**
+ * @param {number} index
+ * @param {number} count
+ * @private
+ */
+ removeDomItems_(index, count) {
+ this.instances_.splice(index, count).forEach(instance => {
+ this.removeChild(instance.children[0]);
+ });
+ }
+
+ /** @private */
+ updateSelectableItemInstanceIndexes_() {
+ for (let itemIndex = 0; itemIndex < this.instances_.length; itemIndex++) {
+ const selectableItemIndex =
+ this.selectableIndexToItemIndex_.invGet(itemIndex);
+ if (selectableItemIndex !== undefined) {
+ this.instances_[itemIndex]['index'] = selectableItemIndex;
+ }
}
}
/**
+ * Sets the height of the component based on an estimated average DOM item
+ * height and the total number of items.
+ * @private
+ */
+ updateHeight_() {
+ const estScrollHeight = this.items.length > 0 ?
+ this.items.length * this.domItemAverageHeight_() :
+ 0;
+ this.$.container.style.height = estScrollHeight + 'px';
+ }
+
+ /**
* Ensure the scroll view can fully display a preceding or following list item
* to the one selected, if existing.
+ *
+ * TODO(romanarora): Selection navigation behavior should be configurable. The
+ * approach followed below might not be desired by all component users.
* @private
*/
onSelectedChanged_() {
@@ -253,90 +551,68 @@ export class InfiniteList extends PolymerElement {
return;
}
- const selectedIndex = /** @type{number} */ (selector.selected);
- if (selectedIndex === 0 || selectedIndex === this.items.length - 1) {
- /** @type {!Element} */ (selector.selectedItem).scrollIntoView({
+ const selectedIndex = /** @type {number} */ (selector.selected);
+ if (selectedIndex === 0) {
+ this.scrollTo({top: 0, behavior: 'smooth'});
+ return;
+ }
+
+ if (selectedIndex === this.selectableIndexToItemIndex_.size() - 1) {
+ this.getSelectableDomItem_(selectedIndex).scrollIntoView({
behavior: 'smooth'
});
- } else {
- // If the following DOM item to the currently selected item has not yet
- // been rendered, ensure it is by waiting for the next render frame
- // before we scroll it into the view.
- if (!this.isDomItemAtIndexAvailable_(selectedIndex + 1)) {
- this.ensureDomItemsAvailableStartingAt_(selectedIndex + 1);
-
- afterNextRender(this, this.onSelectedChanged_);
- return;
- }
+ return;
+ }
- const previousItem = selector.items[selector.selected - 1];
- if (previousItem.offsetTop < this.scrollTop) {
- /** @type {!Element} */ (previousItem)
- .scrollIntoView({behavior: 'smooth', block: 'nearest'});
- return;
- }
+ const previousItem = this.getSelectableDomItem_(selector.selected - 1);
+ if (previousItem.offsetTop < this.scrollTop) {
+ previousItem.scrollIntoView({behavior: 'smooth', block: 'nearest'});
+ return;
+ }
+
+ const nextItemIndex = /** @type {number} */ (selector.selected) + 1;
+ if (nextItemIndex < this.selectableIndexToItemIndex_.size()) {
+ this.ensureSelectableDomItemAvailable_(nextItemIndex);
- const nextItem =
- selector.items[/** @type {number} */ (selector.selected) + 1];
+ const nextItem = this.getSelectableDomItem_(nextItemIndex);
if (nextItem.offsetTop + nextItem.offsetHeight >
this.scrollTop + this.offsetHeight) {
- /** @type {!Element} */ (nextItem).scrollIntoView(
- {behavior: 'smooth', block: 'nearest'});
+ nextItem.scrollIntoView({behavior: 'smooth', block: 'nearest'});
}
}
}
/**
- * @param {string} key Keyboard event key value.
- * @param {boolean=} focusItem Whether to focus the selected item.
+ * Resets the selector's selection to the undefined state. This method
+ * suppresses a closure validation that would require modifying the
+ * IronSelectableBehavior's annotations for the selected property.
+ * @suppress {checkTypes}
+ * @private
*/
- navigate(key, focusItem) {
- const selector = /** @type {!IronSelectorElement} */ (this.$.selector);
-
- if ((key === 'ArrowUp' && selector.selected === 0) || key === 'End') {
- // If the DOM item to be selected has not yet been rendered, ensure it is
- // by waiting for the next render frame.
- const lastItemIndex = this.items.length - 1;
- if (!this.isDomItemAtIndexAvailable_(lastItemIndex)) {
- this.ensureDomItemsAvailableStartingAt_(lastItemIndex);
-
- afterNextRender(
- this, /** @type {function(...*)} */ (this.navigate),
- [key, focusItem]);
- return;
- }
- }
-
- switch (key) {
- case 'ArrowUp':
- selector.selectPrevious();
- break;
- case 'ArrowDown':
- selector.selectNext();
- break;
- case 'Home':
- selector.selected = 0;
- break;
- case 'End':
- this.$.selector.selected = this.items.length - 1;
- break;
- }
+ resetSelected_() {
+ /** @type {!IronSelectorElement} */ (this.$.selector).selected = undefined;
+ }
- if (focusItem) {
- selector.selectedItem.focus({preventScroll: true});
- }
+ /**
+ * @return {string}
+ * @private
+ */
+ selectableSelector_() {
+ return '.' + SELECTABLE_CLASS_NAME;
}
/** @param {number} index */
set selected(index) {
+ if (index === NO_SELECTION) {
+ this.resetSelected_();
+ return;
+ }
+
const selector = /** @type {!IronSelectorElement} */ (this.$.selector);
if (index !== selector.selected) {
+ assert(index < this.selectableIndexToItemIndex_.size());
+ this.ensureSelectableDomItemAvailable_(index);
selector.selected = index;
-
- if (index !== NO_SELECTION) {
- assert(index < this.items.length);
- this.ensureDomItemsAvailableStartingAt_(index);
- }
}
}
@@ -345,6 +621,18 @@ export class InfiniteList extends PolymerElement {
return this.$.selector.selected !== undefined ? this.$.selector.selected :
NO_SELECTION;
}
+
+ /**
+ * @return {?Object} The selected item's data, if any selected.
+ */
+ get selectedItem() {
+ if (this.$.selector.selected === undefined) {
+ return null;
+ }
+
+ return this
+ .items[this.selectableIndexToItemIndex_.get(this.$.selector.selected)];
+ }
}
customElements.define(InfiniteList.is, InfiniteList);
diff --git a/chromium/chrome/browser/resources/tab_search/tab_data.js b/chromium/chrome/browser/resources/tab_search/tab_data.js
index 035a3b4d7e3..410bb38c627 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_data.js
+++ b/chromium/chrome/browser/resources/tab_search/tab_data.js
@@ -4,6 +4,12 @@
import {Tab} from './tab_search.mojom-webui.js';
+/** @enum {number} */
+export const TabItemType = {
+ OPEN: 1,
+ RECENTLY_CLOSED: 2,
+};
+
/**
* TabData contains tabSearch.mojom.Tab and data derived from it.
* It makes tabSearch.mojom.Tab immutable and works well for closure compiler
@@ -25,5 +31,20 @@ export class TabData {
/** @type {boolean} */
this.inActiveWindow;
+
+ /** @type {!TabItemType} */
+ this.type;
+
+ /** @type {string} */
+ this.a11yTypeText;
}
}
+
+/**
+ * @param {!TabData} tabData
+ * @return {string}
+ */
+export function ariaLabel(tabData) {
+ return `${tabData.tab.title} ${tabData.hostname} ${
+ tabData.tab.lastActiveElapsedText} ${tabData.a11yTypeText}`;
+}
diff --git a/chromium/chrome/browser/resources/tab_search/tab_search.js b/chromium/chrome/browser/resources/tab_search/tab_search.js
index bca0a2e7e26..ea253302d62 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_search.js
+++ b/chromium/chrome/browser/resources/tab_search/tab_search.js
@@ -5,10 +5,12 @@
import './app.js';
export {TabSearchAppElement} from './app.js';
+export {BiMap} from './bimap.js';
export {fuzzySearch} from './fuzzy_search.js';
export {InfiniteList} from './infinite_list.js';
-export {TabData} from './tab_data.js';
+export {TabData, TabItemType} from './tab_data.js';
export {PageCallbackRouter, PageRemote, ProfileData, Tab} from './tab_search.mojom-webui.js';
export {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js';
export {TabSearchItem} from './tab_search_item.js';
export {TabSearchSearchField} from './tab_search_search_field.js';
+export {TitleItem} from './title_item.js';
diff --git a/chromium/chrome/browser/resources/tab_search/tab_search_api_proxy.js b/chromium/chrome/browser/resources/tab_search/tab_search_api_proxy.js
index 5136eecff67..7fdf7c43d33 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_search_api_proxy.js
+++ b/chromium/chrome/browser/resources/tab_search/tab_search_api_proxy.js
@@ -28,7 +28,8 @@ export class TabSearchApiProxy {
/** @return {Promise<{profileData: ProfileData}>} */
getProfileData() {}
- showFeedbackPage() {}
+ /** @param {number} tabId */
+ openRecentlyClosedTab(tabId) {}
/**
* @param {!SwitchToTabInfo} info
@@ -75,8 +76,8 @@ export class TabSearchApiProxyImpl {
}
/** @override */
- showFeedbackPage() {
- this.handler.showFeedbackPage();
+ openRecentlyClosedTab(tabId) {
+ this.handler.openRecentlyClosedTab(tabId);
}
/** @override */
diff --git a/chromium/chrome/browser/resources/tab_search/tab_search_item.html b/chromium/chrome/browser/resources/tab_search/tab_search_item.html
index 65ad03f74e5..64cb4358002 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_search_item.html
+++ b/chromium/chrome/browser/resources/tab_search/tab_search_item.html
@@ -3,7 +3,8 @@
outline: none;
}
- :host(:hover, .selected) .button-container {
+ :host(:hover) .button-container,
+ :host(.selected) .button-container {
height: auto;
width: auto;
}
@@ -17,16 +18,11 @@
.button-container cr-icon-button {
--cr-icon-button-fill-color: var(--mwb-icon-button-fill-color);
+ --cr-icon-button-focus-outline-color: transparent;
border: 2px solid transparent;
border-radius: 50%;
}
- @media (prefers-color-scheme: dark) {
- .button-container cr-icon-button {
- --cr-icon-button-ripple-opacity: 0.15;
- }
- }
-
.button-container cr-icon-button:hover {
background-color: var(--mwb-icon-button-hover-background-color);
}
@@ -47,13 +43,13 @@
.text-container {
flex-grow: 1;
overflow: hidden;
+ user-select: none;
}
#primaryText,
#secondaryText {
overflow: hidden;
text-overflow: ellipsis;
- user-select: none;
white-space: nowrap;
}
@@ -63,11 +59,27 @@
margin-bottom: 3px;
}
- #secondaryText {
+ #secondaryContainer {
color: var(--cr-secondary-text-color);
+ display: flex;
font-size: var(--mwb-secondary-text-font-size);
}
+ #secondaryTimestamp {
+ flex-shrink: 0;
+ }
+
+ #textAriaLabel {
+ clip: rect(0,0,0,0);
+ display: inline-block;
+ position: fixed;
+ }
+
+ #separator {
+ margin-inline-end: 4px;
+ margin-inline-start: 4px;
+ }
+
cr-icon-button {
--cr-icon-button-icon-size: var(--mwb-icon-size);
--cr-icon-button-margin-end: 0;
@@ -81,13 +93,23 @@
</style>
<div class="favicon" style="background-image:[[faviconUrl_(data.tab)]]"></div>
-<div class="text-container">
+<div id="textAriaLabel" title="[[ariaLabelForText_(data)]]"></div>
+<div class="text-container" aria-hidden="true">
<div id="primaryText" title="[[data.tab.title]]"></div>
- <div id="secondaryText"></div>
-</div>
-<div class="button-container">
- <cr-icon-button id="closeButton" aria-label="[[ariaLabel_(data.tab.title)]]"
- iron-icon="mwb16:close" noink="[[!buttonRipples_]]"
- no-ripple-on-focus on-click="onItemClose_" title="$i18n{closeTab}">
- </cr-icon-button>
+ <div id="secondaryContainer">
+ <div id="secondaryText"></div>
+ <div id="separator" hidden="[[!data.hostname]]">•</div>
+ <div id="secondaryTimestamp">
+ [[data.tab.lastActiveElapsedText]]
+ </div>
+ </div>
</div>
+<template is="dom-if" if="[[isCloseable_(data.type)]]">
+ <div class="button-container">
+ <cr-icon-button id="closeButton"
+ aria-label="[[ariaLabelForButton_(data.tab.title)]]"
+ iron-icon="mwb16:close" noink="[[!buttonRipples_]]"
+ no-ripple-on-focus on-click="onItemClose_" title="$i18n{closeTab}">
+ </cr-icon-button>
+ </div>
+</template>
diff --git a/chromium/chrome/browser/resources/tab_search/tab_search_item.js b/chromium/chrome/browser/resources/tab_search/tab_search_item.js
index ef85e120cf2..3f04d916829 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_search_item.js
+++ b/chromium/chrome/browser/resources/tab_search/tab_search_item.js
@@ -7,15 +7,15 @@ import 'chrome://resources/cr_elements/cr_icons_css.m.js';
import 'chrome://resources/cr_elements/mwb_shared_icons.js';
import 'chrome://resources/cr_elements/mwb_shared_vars.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import './strings.m.js';
import {getFaviconForPageURL} from 'chrome://resources/js/icon.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {highlight} from 'chrome://resources/js/search_highlight_utils.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {TabData} from './tab_data.js';
+import {ariaLabel, TabData, TabItemType} from './tab_data.js';
import {Tab} from './tab_search.mojom-webui.js';
-import './strings.js';
export class TabSearchItem extends PolymerElement {
static get is() {
@@ -39,10 +39,21 @@ export class TabSearchItem extends PolymerElement {
type: Boolean,
value: () => loadTimeData.getBoolean('useRipples'),
},
+
+ /** @type {number} */
+ index: Number,
};
}
/**
+ * @param {!TabItemType} type
+ * @return {boolean} Whether a close action can be performed on the item.
+ */
+ isCloseable_(type) {
+ return type === TabItemType.OPEN;
+ }
+
+ /**
* @param {!Event} e
* @private
*/
@@ -75,9 +86,19 @@ export class TabSearchItem extends PolymerElement {
this.data.hostnameHighlightRanges);
// Show chrome:// if it's a chrome internal url
- if (new URL(this.data.tab.url).protocol === 'chrome:') {
+ let secondaryLabel = this.data.hostname;
+ let protocol = '';
+ try {
+ protocol = new URL(this.data.tab.url).protocol;
+ } catch (e) {
+ // TODO(crbug.com/1186409): Remove this after we root cause the issue
+ console.error(
+ `Error parsing URL on Tab Search: url=${this.data.tab.url}`);
+ }
+ if (protocol === 'chrome:') {
/** @type {!HTMLElement} */ (this.$.secondaryText)
.prepend(document.createTextNode('chrome://'));
+ secondaryLabel = `chrome://${secondaryLabel}`;
}
}
@@ -100,7 +121,21 @@ export class TabSearchItem extends PolymerElement {
}
}
- ariaLabel_(title) {
+ /**
+ * @param {!TabData} tabData
+ * @return {string}
+ * @private
+ */
+ ariaLabelForText_(tabData) {
+ return ariaLabel(tabData);
+ }
+
+ /**
+ * @param {string} title
+ * @return {string}
+ * @private
+ */
+ ariaLabelForButton_(title) {
return `${loadTimeData.getString('closeTab')} ${title}`;
}
}
diff --git a/chromium/chrome/browser/resources/tab_search/tab_search_search_field.js b/chromium/chrome/browser/resources/tab_search/tab_search_search_field.js
index 522ae4c65af..675b3e45fa8 100644
--- a/chromium/chrome/browser/resources/tab_search/tab_search_search_field.js
+++ b/chromium/chrome/browser/resources/tab_search/tab_search_search_field.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/mwb_shared_vars.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
-import {CrSearchFieldBehavior, CrSearchFieldBehaviorInterface} from 'chrome://resources/cr_elements/cr_search_field/cr_search_field_behavior.m.js';
+import {CrSearchFieldBehavior, CrSearchFieldBehaviorInterface} from 'chrome://resources/cr_elements/cr_search_field/cr_search_field_behavior.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/chrome/browser/resources/tab_search/title_item.js b/chromium/chrome/browser/resources/tab_search/title_item.js
new file mode 100644
index 00000000000..2dd9c05ab2f
--- /dev/null
+++ b/chromium/chrome/browser/resources/tab_search/title_item.js
@@ -0,0 +1,11 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export class TitleItem {
+ /** @param {string} title */
+ constructor(title) {
+ /** @type {string} */
+ this.title = title;
+ }
+}
diff --git a/chromium/chrome/browser/resources/tab_strip/BUILD.gn b/chromium/chrome/browser/resources/tab_strip/BUILD.gn
index e51d54567f0..f03452fa9bf 100644
--- a/chromium/chrome/browser/resources/tab_strip/BUILD.gn
+++ b/chromium/chrome/browser/resources/tab_strip/BUILD.gn
@@ -46,7 +46,6 @@ preprocess_if_expr("preprocess") {
out_folder = "$target_gen_dir/$preprocess_folder"
out_manifest = "$target_gen_dir/$preprocess_manifest"
in_files = [
- "custom_element.js",
"drag_manager.js",
"tab_strip_embedder_proxy.js",
"tab_swiper.js",
@@ -89,7 +88,6 @@ js_type_check("closure_compile") {
deps = [
":alert_indicator",
":alert_indicators",
- ":custom_element",
":drag_manager",
":tab",
":tab_group",
@@ -102,8 +100,8 @@ js_type_check("closure_compile") {
js_library("alert_indicator") {
deps = [
- ":custom_element",
":tabs_api_proxy",
+ "//ui/webui/resources/js:custom_element",
"//ui/webui/resources/js:load_time_data.m",
]
}
@@ -111,14 +109,11 @@ js_library("alert_indicator") {
js_library("alert_indicators") {
deps = [
":alert_indicator",
- ":custom_element",
":tabs_api_proxy",
+ "//ui/webui/resources/js:custom_element",
]
}
-js_library("custom_element") {
-}
-
js_library("drag_manager") {
deps = [
":tab",
@@ -140,10 +135,10 @@ js_library("tabs_api_proxy") {
js_library("tab") {
deps = [
":alert_indicators",
- ":custom_element",
":tab_strip_embedder_proxy",
":tab_swiper",
":tabs_api_proxy",
+ "//ui/webui/resources/js:custom_element",
"//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:util.m",
@@ -153,22 +148,22 @@ js_library("tab") {
js_library("tab_group") {
deps = [
- ":custom_element",
":tab_strip_embedder_proxy",
":tabs_api_proxy",
+ "//ui/webui/resources/js:custom_element",
"//ui/webui/resources/js:load_time_data.m",
]
}
js_library("tab_list") {
deps = [
- ":custom_element",
":drag_manager",
":tab",
":tab_group",
":tab_strip_embedder_proxy",
":tabs_api_proxy",
"//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js:custom_element",
"//ui/webui/resources/js:event_tracker.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:util.m",
diff --git a/chromium/chrome/browser/resources/tab_strip/alert_indicator.js b/chromium/chrome/browser/resources/tab_strip/alert_indicator.js
index 480b42812e6..966b005f13a 100644
--- a/chromium/chrome/browser/resources/tab_strip/alert_indicator.js
+++ b/chromium/chrome/browser/resources/tab_strip/alert_indicator.js
@@ -3,9 +3,10 @@
// found in the LICENSE file.
import './strings.m.js';
+
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CustomElement} from './custom_element.js';
import {TabAlertState} from './tabs_api_proxy.js';
/** @const {string} */
diff --git a/chromium/chrome/browser/resources/tab_strip/alert_indicators.js b/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
index eec52526ad3..a60d8b6e33e 100644
--- a/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
+++ b/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
+
import {AlertIndicatorElement} from './alert_indicator.js';
-import {CustomElement} from './custom_element.js';
import {TabAlertState} from './tabs_api_proxy.js';
export class AlertIndicatorsElement extends CustomElement {
diff --git a/chromium/chrome/browser/resources/tab_strip/custom_element.js b/chromium/chrome/browser/resources/tab_strip/custom_element.js
deleted file mode 100644
index 50e2bdae652..00000000000
--- a/chromium/chrome/browser/resources/tab_strip/custom_element.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * Super class for all custom elements defined in the tab strip.
- */
-export class CustomElement extends HTMLElement {
- constructor() {
- super();
-
- this.attachShadow({mode: 'open'});
- const template = document.createElement('template');
- template.innerHTML = this.constructor.template || '';
- this.shadowRoot.appendChild(template.content.cloneNode(true));
- }
-
- /**
- * @param {string} query
- * @return {?Element}
- */
- $(query) {
- return this.shadowRoot.querySelector(query);
- }
-
- /**
- * @param {string} query
- * @return {!NodeList<!Element>}
- */
- $all(query) {
- return this.shadowRoot.querySelectorAll(query);
- }
-}
diff --git a/chromium/chrome/browser/resources/tab_strip/drag_manager.js b/chromium/chrome/browser/resources/tab_strip/drag_manager.js
index c765de48ebd..777cbecc960 100644
--- a/chromium/chrome/browser/resources/tab_strip/drag_manager.js
+++ b/chromium/chrome/browser/resources/tab_strip/drag_manager.js
@@ -254,10 +254,6 @@ class DragSession {
this.element_.setDragging(false);
this.element_.setDraggedOut(false);
-
- if (event.type === 'dragend') {
- this.maybeShowTabContextMenu_();
- }
}
/** @return {boolean} */
@@ -311,22 +307,6 @@ class DragSession {
this.element_.setDragging(false);
this.element_.setDraggedOut(false);
-
- if (!wasDraggingPlaceholder) {
- this.maybeShowTabContextMenu_();
- }
- }
-
- /** @private */
- maybeShowTabContextMenu_() {
- if (!isTabElement(this.element_) || this.hasMoved_) {
- return;
- }
-
- // If the user was dragging a tab and the tab has not ever been moved,
- // show a context menu instead.
- this.tabStripEmbedderProxy_.showTabContextMenu(
- this.element_.tab.id, this.lastPoint_.x, this.lastPoint_.y);
}
/**
@@ -553,16 +533,14 @@ export class DragManager {
return;
}
+ // If we are dragging a tab element ensure its touch pressed state is reset
+ // to avoid any associated css effects making it onto the drag image.
+ if (isTabElement(draggedItem)) {
+ /** @private {!TabElement} */ (draggedItem).setTouchPressed(false);
+ }
+
if (this.delegate_.shouldPreventDrag()) {
event.preventDefault();
-
- // The gesture to start a drag and to open a context menu are the same
- // on touch, so fallback to showing the context menu when drag is
- // prevented.
- if (isTabElement(draggedItem)) {
- this.tabStripEmbedderProxy_.showTabContextMenu(
- draggedItem.tab.id, event.clientX, event.clientY);
- }
return;
}
diff --git a/chromium/chrome/browser/resources/tab_strip/tab.html b/chromium/chrome/browser/resources/tab_strip/tab.html
index 9f70e2ac7ce..19ded056f1b 100644
--- a/chromium/chrome/browser/resources/tab_strip/tab.html
+++ b/chromium/chrome/browser/resources/tab_strip/tab.html
@@ -91,6 +91,12 @@
margin: 0;
}
+ :host([touch_pressed_]) #dragImage {
+ transform: scale(1.1);
+ transform-origin: center;
+ transition-duration: 300ms;
+ }
+
#progressSpinner,
#favicon,
#crashedIcon {
diff --git a/chromium/chrome/browser/resources/tab_strip/tab.js b/chromium/chrome/browser/resources/tab_strip/tab.js
index 84b0f04758c..a57db78b647 100644
--- a/chromium/chrome/browser/resources/tab_strip/tab.js
+++ b/chromium/chrome/browser/resources/tab_strip/tab.js
@@ -5,12 +5,12 @@
import './strings.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
import {getFavicon} from 'chrome://resources/js/icon.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {isRTL} from 'chrome://resources/js/util.m.js';
import {AlertIndicatorsElement} from './alert_indicators.js';
-import {CustomElement} from './custom_element.js';
import {TabStripEmbedderProxy, TabStripEmbedderProxyImpl} from './tab_strip_embedder_proxy.js';
import {TabSwiper} from './tab_swiper.js';
import {CloseTabAction, TabData, TabNetworkState, TabsApiProxy, TabsApiProxyImpl} from './tabs_api_proxy.js';
@@ -270,6 +270,7 @@ export class TabElement extends CustomElement {
* @private
*/
onPointerUp_(event) {
+ event.stopPropagation();
if (event.pointerType !== 'touch' && event.button === 2) {
this.embedderApi_.showTabContextMenu(
this.tab.id, event.clientX, event.clientY);
@@ -297,6 +298,11 @@ export class TabElement extends CustomElement {
return this.hasAttribute('dragged-out_');
}
+ /** @param {boolean} isTouchPressed */
+ setTouchPressed(isTouchPressed) {
+ this.toggleAttribute('touch_pressed_', isTouchPressed);
+ }
+
/**
* @return {!Promise}
*/
diff --git a/chromium/chrome/browser/resources/tab_strip/tab_group.js b/chromium/chrome/browser/resources/tab_strip/tab_group.js
index 33150b972f2..9fe4a804f42 100644
--- a/chromium/chrome/browser/resources/tab_strip/tab_group.js
+++ b/chromium/chrome/browser/resources/tab_strip/tab_group.js
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CustomElement} from './custom_element.js';
import {TabStripEmbedderProxy, TabStripEmbedderProxyImpl} from './tab_strip_embedder_proxy.js';
import {TabGroupVisualData} from './tabs_api_proxy.js';
diff --git a/chromium/chrome/browser/resources/tab_strip/tab_list.js b/chromium/chrome/browser/resources/tab_strip/tab_list.js
index 624875153f6..6998bc9bac7 100644
--- a/chromium/chrome/browser/resources/tab_strip/tab_list.js
+++ b/chromium/chrome/browser/resources/tab_strip/tab_list.js
@@ -10,10 +10,10 @@ import 'chrome://resources/cr_elements/icons.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js';
import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
+import {CustomElement} from 'chrome://resources/js/custom_element.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {isRTL} from 'chrome://resources/js/util.m.js';
-import {CustomElement} from './custom_element.js';
import {DragManager, DragManagerDelegate} from './drag_manager.js';
import {isTabElement, TabElement} from './tab.js';
import {isTabGroupElement, TabGroupElement} from './tab_group.js';
@@ -31,6 +31,25 @@ const SCROLL_PADDING = 32;
/** @type {boolean} */
let scrollAnimationEnabled = true;
+/** @const {number} */
+const TOUCH_CONTEXT_MENU_OFFSET_X = 8;
+
+/** @const {number} */
+const TOUCH_CONTEXT_MENU_OFFSET_Y = -40;
+
+/**
+ * Context menu should position below the element for touch.
+ * @param {!Element} element
+ * @return {!Object<{x: number, y: number}>}
+ */
+function getContextMenuPosition(element) {
+ const rect = element.getBoundingClientRect();
+ return {
+ x: rect.left + TOUCH_CONTEXT_MENU_OFFSET_X,
+ y: rect.bottom + TOUCH_CONTEXT_MENU_OFFSET_Y
+ };
+}
+
/** @param {boolean} enabled */
export function setScrollAnimationEnabledForTesting(enabled) {
scrollAnimationEnabled = enabled;
@@ -207,6 +226,12 @@ export class TabListElement extends CustomElement {
/** @private @const {!EventTracker} */
this.eventTracker_ = new EventTracker();
+ /** @private {!TabElement|null} */
+ this.lastTargetedTab_;
+
+ /** @private {!Object<{x: number, y: number}>|undefined} */
+ this.lastTouchPoint_;
+
/** @private {!Element} */
this.newTabButtonElement_ =
/** @type {!Element} */ (this.$('#newTabButton'));
@@ -241,9 +266,6 @@ export class TabListElement extends CustomElement {
/** @private {!Function} */
this.scrollListener_ = (e) => this.onScroll_(e);
- /** @private {!Function} */
- this.contextMenuListener_ = e => this.onContextMenu_(e);
-
this.addWebUIListener_(
'layout-changed', layout => this.applyCSSDictionary_(layout));
this.addWebUIListener_('theme-changed', () => {
@@ -255,12 +277,28 @@ export class TabListElement extends CustomElement {
this.addWebUIListener_(
'tab-thumbnail-updated', this.tabThumbnailUpdated_.bind(this));
+ this.addWebUIListener_('long-press', () => this.handleLongPress_());
+
+ this.addWebUIListener_(
+ 'context-menu-closed', () => this.clearLastTargetedTab_());
+
this.eventTracker_.add(
document, 'contextmenu', e => this.onContextMenu_(e));
this.eventTracker_.add(
+ document, 'pointerup',
+ e => this.onPointerUp_(/** @type {!PointerEvent} */ (e)));
+ this.eventTracker_.add(
document, 'visibilitychange', () => this.onDocumentVisibilityChange_());
this.eventTracker_.add(window, 'blur', () => this.onWindowBlur_());
this.eventTracker_.add(this, 'scroll', e => this.onScroll_(e));
+ this.eventTracker_.add(
+ document, 'touchstart', (e) => this.onTouchStart_(e));
+ // Touchend events happen when a touch gesture finishes normally (ie not due
+ // to the context menu appearing or drag starting). Clear the last targeted
+ // tab on a drag end to ensure `lastTargetedTab_` is cleared for the cases
+ // that do not end with a dragstart or the context menu appearing.
+ this.eventTracker_.add(
+ document, 'touchend', () => this.clearLastTargetedTab_());
this.addWebUIListener_(
'received-keyboard-focus', () => this.onReceivedKeyboardFocus_());
@@ -365,6 +403,8 @@ export class TabListElement extends CustomElement {
this.tabStripEmbedderProxy_.reportTabCreationDuration(
tabs.length, Date.now() - createTabsStartTimestamp);
+ this.addWebUIListener_(
+ 'show-context-menu', () => this.onShowContextMenu_());
this.addWebUIListener_('tab-created', tab => this.onTabCreated_(tab));
this.addWebUIListener_(
'tab-moved',
@@ -474,14 +514,34 @@ export class TabListElement extends CustomElement {
return parseInt(this.style.getPropertyValue(variable), 10);
}
+ /** @private */
+ handleLongPress_() {
+ if (this.lastTargetedTab_) {
+ this.lastTargetedTab_.setTouchPressed(true);
+ }
+ }
+
/**
* @param {!Event} event
* @private
*/
onContextMenu_(event) {
+ // Prevent the default context menu from triggering.
event.preventDefault();
- this.tabStripEmbedderProxy_.showBackgroundContextMenu(
- event.clientX, event.clientY);
+ }
+
+ /**
+ * @param {!PointerEvent} event
+ * @private
+ */
+ onPointerUp_(event) {
+ event.stopPropagation();
+ if (event.pointerType !== 'touch' && event.button === 2) {
+ // If processing an uncaught right click event show the background context
+ // menu.
+ this.tabStripEmbedderProxy_.showBackgroundContextMenu(
+ event.clientX, event.clientY);
+ }
}
/** @private */
@@ -570,6 +630,23 @@ export class TabListElement extends CustomElement {
tabElement.resetSwipe();
}
+ /** @private */
+ onShowContextMenu_() {
+ // If we do not have a touch point don't show the context menu.
+ if (!this.lastTouchPoint_) {
+ return;
+ }
+
+ if (this.lastTargetedTab_) {
+ const position = getContextMenuPosition(this.lastTargetedTab_);
+ this.tabStripEmbedderProxy_.showTabContextMenu(
+ this.lastTargetedTab_.tab.id, position.x, position.y);
+ } else {
+ this.tabStripEmbedderProxy_.showBackgroundContextMenu(
+ this.lastTouchPoint_.clientX, this.lastTouchPoint_.clientY);
+ }
+ }
+
/**
* @param {!TabData} tab
* @private
@@ -728,6 +805,28 @@ export class TabListElement extends CustomElement {
}
/**
+ * @param {!Event} event
+ * @private
+ */
+ onTouchStart_(event) {
+ const composedPath = /** @type {!Array<!Element>} */ (event.composedPath());
+ const dragOverTabElement =
+ /** @type {?TabElement} */ (composedPath.find(isTabElement));
+ this.lastTargetedTab_ = dragOverTabElement;
+ const touch = event.changedTouches[0];
+ this.lastTouchPoint_ = {clientX: touch.clientX, clientY: touch.clientY};
+ }
+
+ /** @private */
+ clearLastTargetedTab_() {
+ if (this.lastTargetedTab_) {
+ this.lastTargetedTab_.setTouchPressed(false);
+ }
+ this.lastTargetedTab_ = null;
+ this.lastTouchPoint_ = undefined;
+ }
+
+ /**
* @param {!TabElement} element
* @param {number} index
* @param {boolean} pinned
diff --git a/chromium/chrome/browser/resources/tools/optimize_webui.gni b/chromium/chrome/browser/resources/tools/optimize_webui.gni
index 5bcdb42a7d8..f21fbd980f4 100644
--- a/chromium/chrome/browser/resources/tools/optimize_webui.gni
+++ b/chromium/chrome/browser/resources/tools/optimize_webui.gni
@@ -2,32 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//build/config/python.gni")
-
-template("node") {
- # TODO(crbug.com/1112471): Get this to run cleanly under Python 3.
- python2_action(target_name) {
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-
- # Declare dependencies to all involved tools.
- inputs += [
- "//third_party/node/node.py",
- "//third_party/node/node_modules.py",
- "//third_party/node/node_modules.tar.gz.sha1",
- ]
-
- if (is_linux || is_chromeos) {
- inputs += [ "//third_party/node/linux/node-linux-x64.tar.gz.sha1" ]
- }
- if (is_win) {
- inputs += [ "//third_party/node/win/node.exe.sha1" ]
- }
- if (is_mac) {
- inputs += [ "//third_party/node/mac/node-darwin-x64.tar.gz.sha1" ]
- }
- }
-}
+import("//third_party/node/node.gni")
template("optimize_webui") {
node(target_name) {
@@ -38,11 +13,6 @@ template("optimize_webui") {
inputs = []
outputs = []
- if (defined(invoker.html_out_files)) {
- foreach(_out, invoker.html_out_files) {
- outputs += [ "$target_gen_dir/$_out" ]
- }
- }
foreach(_out, invoker.js_out_files) {
outputs += [ "$target_gen_dir/$_out" ]
}
@@ -83,25 +53,8 @@ template("optimize_webui") {
}
args += [ "--external_paths" ] + external_paths
- if (defined(invoker.html_in_files)) {
- args += [ "--html_in_files" ] + invoker.html_in_files
- }
-
- if (defined(invoker.html_out_files)) {
- args += [ "--html_out_files" ] + invoker.html_out_files
- }
-
- if (defined(invoker.insert_in_head)) {
- args += [
- "--insert_in_head",
- invoker.insert_in_head,
- ]
- }
-
- if (defined(invoker.js_module_in_files)) {
- inputs += [ "//chrome/browser/resources/tools/rollup_plugin.js" ]
- args += [ "--js_module_in_files" ] + invoker.js_module_in_files
- }
+ inputs += [ "//chrome/browser/resources/tools/rollup_plugin.js" ]
+ args += [ "--js_module_in_files" ] + invoker.js_module_in_files
if (defined(invoker.out_manifest)) {
args += [
diff --git a/chromium/chrome/browser/resources/tools/optimize_webui.py b/chromium/chrome/browser/resources/tools/optimize_webui.py
index ddada8e57bc..f41a89bf816 100755
--- a/chromium/chrome/browser/resources/tools/optimize_webui.py
+++ b/chromium/chrome/browser/resources/tools/optimize_webui.py
@@ -24,49 +24,9 @@ import node
import node_modules
-_RESOURCES_PATH = os.path.join(
- _SRC_PATH, 'ui', 'webui', 'resources', '').replace('\\', '/')
-
-
-_CR_ELEMENTS_PATH = os.path.join(
- _RESOURCES_PATH, 'cr_elements', '').replace('\\', '/')
-
-
-_CR_COMPONENTS_PATH = os.path.join(
- _RESOURCES_PATH, 'cr_components', '').replace('\\', '/')
-
-
-_CSS_RESOURCES_PATH = os.path.join(
- _RESOURCES_PATH, 'css', '').replace('\\', '/')
-
-
-_HTML_RESOURCES_PATH = os.path.join(
- _RESOURCES_PATH, 'html', '').replace('\\', '/')
-
-
-_JS_RESOURCES_PATH = os.path.join(_RESOURCES_PATH, 'js', '').replace('\\', '/')
-
-
-_IMAGES_RESOURCES_PATH = os.path.join(
- _RESOURCES_PATH, 'images', '').replace('\\', '/')
-
-
-_POLYMER_PATH = os.path.join(
- _SRC_PATH, 'third_party', 'polymer', 'v1_0', 'components-chromium',
- '').replace('\\', '/')
-
-
# These files are already combined and minified.
-_BASE_EXCLUDES = [
- # Excludes applying only to Polymer 2.
- 'chrome://resources/html/polymer.html',
- 'chrome://resources/polymer/v1_0/polymer/polymer.html',
- 'chrome://resources/polymer/v1_0/polymer/polymer-micro.html',
- 'chrome://resources/polymer/v1_0/polymer/polymer-mini.html',
- 'chrome://resources/js/load_time_data.js'
-]
+_BASE_EXCLUDES = []
for excluded_file in [
- # Common excludes for both Polymer 2 and 3.
'resources/polymer/v1_0/web-animations-js/web-animations-next-lite.min.js',
'resources/css/roboto.css',
'resources/css/text_defaults.css',
@@ -76,8 +36,6 @@ for excluded_file in [
'resources/mojo/mojo/public/mojom/base/time.mojom-lite.js',
'resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom.html',
'resources/mojo/services/network/public/mojom/ip_address.mojom.html',
-
- # Excludes applying only to Polymer 3.
'resources/polymer/v3_0/polymer/polymer_bundled.min.js',
'resources/js/load_time_data.m.js',
]:
@@ -86,44 +44,19 @@ for excluded_file in [
_BASE_EXCLUDES.append("chrome://" + excluded_file)
_BASE_EXCLUDES.append("//" + excluded_file)
-_VULCANIZE_BASE_ARGS = [
- '--inline-css',
- '--inline-scripts',
- '--rewrite-urls-in-templates',
- '--strip-comments',
-]
-
-_URL_MAPPINGS = []
-for (redirect_url, file_path) in [
- ('resources/cr_components/', _CR_COMPONENTS_PATH),
- ('resources/cr_elements/', _CR_ELEMENTS_PATH),
- ('resources/css/', _CSS_RESOURCES_PATH),
- ('resources/html/', _HTML_RESOURCES_PATH),
- ('resources/js/', _JS_RESOURCES_PATH),
- ('resources/polymer/v1_0/', _POLYMER_PATH),
- ('resources/images/', _IMAGES_RESOURCES_PATH),
-]:
- # Redirect both the chrome://resources form and the scheme-relative form.
- _URL_MAPPINGS.append(('chrome://' + redirect_url, file_path))
- _URL_MAPPINGS.append(('//' + redirect_url, file_path))
-
-
-_VULCANIZE_REDIRECT_ARGS = list(itertools.chain.from_iterable(map(
- lambda m: ['--redirect', '%s|%s' % (m[0], m[1])], _URL_MAPPINGS)))
-
-
-def _undo_mapping(mappings, url):
- for (redirect_url, file_path) in mappings:
- if url.startswith(redirect_url):
- return url.replace(redirect_url, file_path + os.sep, 1)
- # TODO(dbeam): can we make this stricter?
- return url
def _request_list_path(out_path, host_url):
host = host_url[host_url.find('://') + 3:-1]
return os.path.join(out_path, host + '_requestlist.txt')
-# Get a list of all files that were bundled with polymer-bundler and update the
+def _get_dep_path(dep, host_url, in_path):
+ if dep.startswith(host_url):
+ return dep.replace(host_url, os.path.relpath(in_path, _CWD))
+ elif not (dep.startswith('chrome://') or dep.startswith('//')):
+ return os.path.relpath(in_path, _CWD) + '/' + dep
+ return dep
+
+# Get a list of all files that were bundled with rollup and update the
# depfile accordingly such that Ninja knows when to re-trigger.
def _update_dep_file(in_folder, args, manifest):
in_path = os.path.join(_CWD, in_folder)
@@ -135,22 +68,12 @@ def _update_dep_file(in_folder, args, manifest):
# Add a slash in front of every dependency that is not a chrome:// URL, so
# that we can map it to the correct source file path below.
- request_list = map(
- lambda dep: '/' + dep if not (dep.startswith('chrome://') or dep.startswith('//')) else dep,
- request_list)
-
- # Undo the URL mappings applied by vulcanize to get file paths relative to
- # current working directory.
- url_mappings = _URL_MAPPINGS + [
- ('/', os.path.relpath(in_path, _CWD)),
- (args.host_url, os.path.relpath(in_path, _CWD)),
- ]
+ request_list = map(lambda dep: _get_dep_path(dep, args.host_url, in_path),
+ request_list)
- deps = [_undo_mapping(url_mappings, u) for u in request_list]
- deps = map(os.path.normpath, deps)
+ deps = map(os.path.normpath, request_list)
- out_file_name = args.html_out_files[0] if args.html_out_files else \
- args.js_out_files[0]
+ out_file_name = args.js_out_files[0]
with open(os.path.join(_CWD, args.depfile), 'w') as f:
deps_file_header = os.path.join(args.out_folder, out_file_name)
@@ -264,63 +187,6 @@ def _bundle_v3(tmp_out_dir, in_path, out_path, manifest_out_path, args,
return bundled_paths
-def _bundle_v2(tmp_out_dir, in_path, out_path, manifest_out_path, args,
- excludes):
- in_html_args = []
- for f in args.html_in_files:
- in_html_args.append(f)
-
- exclude_args = []
- for f in excludes:
- exclude_args.append('--exclude')
- exclude_args.append(f);
-
- node.RunNode(
- [node_modules.PathToBundler()] +
- _VULCANIZE_BASE_ARGS + _VULCANIZE_REDIRECT_ARGS + exclude_args +
- [
- '--manifest-out', manifest_out_path,
- '--root', in_path,
- '--redirect', '%s|%s' % (args.host_url, in_path + '/'),
- '--out-dir', os.path.relpath(tmp_out_dir, _CWD).replace('\\', '/'),
- '--shell', args.html_in_files[0],
- ] + in_html_args)
-
- for index, html_file in enumerate(args.html_in_files):
- with open(os.path.join(
- os.path.relpath(tmp_out_dir, _CWD), html_file), 'r') as f:
- output = f.read()
-
- # Grit includes are not supported, use HTML imports instead.
- output = output.replace('<include src="', '<include src-disabled="')
-
- if args.insert_in_head:
- assert '<head>' in output
- # NOTE(dbeam): polymer-bundler eats <base> tags after processing.
- # This undoes that by adding a <base> tag to the (post-processed)
- # generated output.
- output = output.replace('<head>', '<head>' + args.insert_in_head)
-
- # Open file again with 'w' such that the previous contents are
- # overwritten.
- with open(os.path.join(
- os.path.relpath(tmp_out_dir, _CWD), html_file), 'w') as f:
- f.write(output)
-
- bundled_paths = []
- for index, html_in_file in enumerate(args.html_in_files):
- bundled_paths.append(
- os.path.join(tmp_out_dir, args.html_out_files[index]))
- js_out_file = args.js_out_files[index]
-
- # Run crisper to separate the JS from the HTML file.
- node.RunNode([node_modules.PathToCrisper(),
- '--source', os.path.join(tmp_out_dir, html_in_file),
- '--script-in-head', 'false',
- '--html', bundled_paths[index],
- '--js', os.path.join(tmp_out_dir, js_out_file)])
- return bundled_paths
-
def _optimize(in_folder, args):
in_path = os.path.normpath(os.path.join(_CWD, in_folder)).replace('\\', '/')
out_path = os.path.join(_CWD, args.out_folder).replace('\\', '/')
@@ -330,27 +196,17 @@ def _optimize(in_folder, args):
excludes = _BASE_EXCLUDES + [
# This file is dynamically created by C++. Need to specify an exclusion
# URL for both the relative URL and chrome:// URL syntax.
- 'strings.js',
'strings.m.js',
- '%s/strings.js' % args.host_url,
'%s/strings.m.js' % args.host_url,
]
excludes.extend(args.exclude or [])
external_paths = args.external_paths or []
try:
- if args.js_module_in_files:
- pcb_out_paths = [os.path.join(tmp_out_dir, f) for f in args.js_out_files]
- bundled_paths = _bundle_v3(tmp_out_dir, in_path, out_path,
- manifest_out_path, args, excludes,
- external_paths)
- else:
- # Ensure Polymer 2 and Polymer 3 request lists don't collide.
- manifest_out_path = _request_list_path(out_path,
- args.host_url[:-1] + '-v2/')
- pcb_out_paths = [os.path.join(out_path, f) for f in args.html_out_files]
- bundled_paths = _bundle_v2(tmp_out_dir, in_path, out_path,
- manifest_out_path, args, excludes)
+ pcb_out_paths = [os.path.join(tmp_out_dir, f) for f in args.js_out_files]
+ bundled_paths = _bundle_v3(tmp_out_dir, in_path, out_path,
+ manifest_out_path, args, excludes,
+ external_paths)
# Run polymer-css-build.
node.RunNode([node_modules.PathToPolymerCssBuild()] +
@@ -375,22 +231,13 @@ def main(argv):
parser.add_argument('--exclude', nargs='*')
parser.add_argument('--external_paths', nargs='*')
parser.add_argument('--host', required=True)
- parser.add_argument('--html_in_files', nargs='*')
- parser.add_argument('--html_out_files', nargs='*')
parser.add_argument('--input', required=True)
- parser.add_argument('--insert_in_head')
parser.add_argument('--js_out_files', nargs='*', required=True)
parser.add_argument('--out_folder', required=True)
- parser.add_argument('--js_module_in_files', nargs='*')
+ parser.add_argument('--js_module_in_files', nargs='*', required=True)
parser.add_argument('--out-manifest')
args = parser.parse_args(argv)
- # Either JS module input files (for Polymer 3) or HTML input and output files
- # (for Polymer 2) should be provided.
- is_polymer2 = bool(args.html_out_files) and bool(args.html_in_files)
- is_polymer3 = bool(args.js_module_in_files)
- assert(is_polymer2 != is_polymer3)
-
# NOTE(dbeam): on Windows, GN can send dirs/like/this. When joined, you might
# get dirs/like/this\file.txt. This looks odd to windows. Normalize to right
# the slashes.
@@ -409,22 +256,11 @@ def main(argv):
# information about all files that were bundled. Grab it from there.
manifest = json.loads(open(manifest_out_path, 'r').read())
- # polymer-bundler reports any missing files in the output manifest, instead of
- # directly failing. Ensure that no such files were encountered.
- if '_missing' in manifest:
- raise Exception(
- 'polymer-bundler could not find files for the following URLs:\n' +
- '\n'.join(manifest['_missing']))
-
-
# Output a manifest file that will be used to auto-generate a grd file later.
if args.out_manifest:
manifest_data = {}
manifest_data['base_dir'] = '%s' % args.out_folder
- if (is_polymer3):
- manifest_data['files'] = manifest.keys()
- else:
- manifest_data['files'] = args.html_out_files + args.js_out_files
+ manifest_data['files'] = manifest.keys()
manifest_file = open(
os.path.normpath(os.path.join(_CWD, args.out_manifest)), 'wb')
json.dump(manifest_data, manifest_file)
diff --git a/chromium/chrome/browser/resources/tools/optimize_webui_test.py b/chromium/chrome/browser/resources/tools/optimize_webui_test.py
index d6caab182ed..15b7a867daa 100755
--- a/chromium/chrome/browser/resources/tools/optimize_webui_test.py
+++ b/chromium/chrome/browser/resources/tools/optimize_webui_test.py
@@ -58,19 +58,6 @@ class OptimizeWebUiTest(unittest.TestCase):
]
optimize_webui.main(args)
- def _write_files_to_src_dir(self):
- self._write_file_to_src_dir('element.html', '<div>got here!</div>')
- self._write_file_to_src_dir('element.js', "alert('yay');")
- self._write_file_to_src_dir('element_in_dir/element_in_dir.html',
- '<script src="element_in_dir.js">')
- self._write_file_to_src_dir('element_in_dir/element_in_dir.js',
- "alert('hello from element_in_dir');")
- self._write_file_to_src_dir('ui.html', '''
-<link rel="import" href="element.html">
-<link rel="import" href="element_in_dir/element_in_dir.html">
-<script src="element.js"></script>
-''')
-
def _write_v3_files_to_src_dir(self):
self._write_file_to_src_dir('element.js', "alert('yay');")
self._write_file_to_src_dir('element_in_dir/element_in_dir.js',
@@ -154,22 +141,6 @@ import './element_in_dir/element_in_dir.js';
self.assertIn(os.path.normpath('element_in_dir/element_in_dir.html'),
depfile_d)
- def testSimpleOptimize(self):
- self._write_files_to_src_dir()
- args = [
- '--host', 'fake-host',
- '--html_in_files', 'ui.html',
- '--html_out_files', 'fast.html',
- '--js_out_files', 'fast.js',
- ]
- self._run_optimize(args)
-
- fast_html = self._read_out_file('fast.html')
- self._check_output_html(fast_html)
- self.assertIn('<script src="fast.js"></script>', fast_html)
- self._check_output_js('fast.js')
- self._check_output_depfile(True)
-
def testV3SimpleOptimize(self):
self._write_v3_files_to_src_dir()
args = [
diff --git a/chromium/chrome/browser/resources/usb_internals/descriptor_panel.js b/chromium/chrome/browser/resources/usb_internals/descriptor_panel.js
index 51eeecaf4ee..aea2c7f6548 100644
--- a/chromium/chrome/browser/resources/usb_internals/descriptor_panel.js
+++ b/chromium/chrome/browser/resources/usb_internals/descriptor_panel.js
@@ -518,7 +518,7 @@ export class DescriptorPanel {
{
label: 'Class Code: ',
size: 1,
- formatter: formatByte,
+ formatter: formatClassCode,
},
{
label: 'Subclass Code: ',
@@ -3144,6 +3144,74 @@ function formatUnknown(rawData, offset) {
}
/**
+ * Returns a class code string with a description.
+ * @param {!Uint8Array} rawData
+ * @param {number} offset The offset of current field.
+ * @return {string}
+ */
+function formatClassCode(rawData, offset) {
+ return renderClassCodeWithDescription(rawData[offset]);
+}
+
+/**
+ * Returns a class code string with a description.
+ * @param {number} classCode
+ * @return {string}
+ */
+export function renderClassCodeWithDescription(classCode) {
+ const blockedByWebUsb = '(blocked by WebUSB)';
+ // USB Class Codes are defined by the USB-IF:
+ // https://www.usb.org/defined-class-codes
+ switch (classCode) {
+ case 0x00:
+ return `${classCode} (Device)`;
+ case 0x01:
+ return `${classCode} (Audio) ${blockedByWebUsb}`;
+ case 0x02:
+ return `${classCode} (Communications and CDC Control)`;
+ case 0x03:
+ return `${classCode} (HID) ${blockedByWebUsb}`;
+ case 0x05:
+ return `${classCode} (Physical)`;
+ case 0x06:
+ return `${classCode} (Still Imaging)`;
+ case 0x07:
+ return `${classCode} (Printer)`;
+ case 0x08:
+ return `${classCode} (Mass Storage) ${blockedByWebUsb}`;
+ case 0x09:
+ return `${classCode} (Hub)`;
+ case 0x0A:
+ return `${classCode} (CDC-Data)`;
+ case 0x0B:
+ return `${classCode} (Smart Card) ${blockedByWebUsb}`;
+ case 0x0D:
+ return `${classCode} (Content Security)`;
+ case 0x0E:
+ return `${classCode} (Video) ${blockedByWebUsb}`;
+ case 0x0F:
+ return `${classCode} (Personal Healthcare)`;
+ case 0x10:
+ return `${classCode} (Audio/Video Devices) ${blockedByWebUsb}`;
+ case 0x11:
+ return `${classCode} (Billboard Device)`;
+ case 0x12:
+ return `${classCode} (USB Type-C Bridge Device)`;
+ case 0xDC:
+ return `${classCode} (Diagnostic Device)`;
+ case 0xE0:
+ return `${classCode} (Wireless Controller) ${blockedByWebUsb}`;
+ case 0xEF:
+ return `${classCode} (Miscellaneous)`;
+ case 0xFE:
+ return `${classCode} (Application Specific)`;
+ case 0xFF:
+ return `${classCode} (Vendor Specific)`;
+ }
+ return `${classCode}`;
+}
+
+/**
* Parses language code to readable language name.
* @param {number} languageCode
* @return {string}
diff --git a/chromium/chrome/browser/resources/usb_internals/devices_page.js b/chromium/chrome/browser/resources/usb_internals/devices_page.js
index 0246d81f715..4d6f6878fda 100644
--- a/chromium/chrome/browser/resources/usb_internals/devices_page.js
+++ b/chromium/chrome/browser/resources/usb_internals/devices_page.js
@@ -14,7 +14,7 @@ import {Tree, TreeItem} from 'chrome://resources/js/cr/ui/tree.m.js';
import {queryRequiredElement} from 'chrome://resources/js/util.m.js';
import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
-import {DescriptorPanel} from './descriptor_panel.js';
+import {DescriptorPanel, renderClassCodeWithDescription} from './descriptor_panel.js';
import {UsbAlternateInterfaceInfo, UsbConfigurationInfo, UsbDeviceInfo, UsbDeviceRemote, UsbEndpointInfo, UsbInterfaceInfo, UsbTransferDirection, UsbTransferType} from './usb_device.mojom-webui.js';
import {UsbDeviceManagerRemote} from './usb_manager.mojom-webui.js';
@@ -171,7 +171,8 @@ class DevicePage {
async initializeDescriptorPanels_(tabPanel, guid) {
const usbDevice = new UsbDeviceRemote;
await this.usbManager_.getDevice(
- guid, usbDevice.$.bindNewPipeAndPassReceiver(), null);
+ guid, /*blocked_interface_classes=*/[],
+ usbDevice.$.bindNewPipeAndPassReceiver(), /*device_client=*/ null);
const deviceDescriptorPanel =
initialInspectorPanel(tabPanel, 'device-descriptor', usbDevice, guid);
@@ -205,7 +206,8 @@ function renderDeviceTree(device, root) {
root.add(customTreeItem(`USB Version: ${device.usbVersionMajor}.${
device.usbVersionMinor}.${device.usbVersionSubminor}`));
- root.add(customTreeItem(`Class Code: ${device.classCode}`));
+ root.add(customTreeItem(
+ `Class Code: ${renderClassCodeWithDescription(device.classCode)}`));
root.add(customTreeItem(`Subclass Code: ${device.subclassCode}`));
@@ -302,7 +304,8 @@ function renderAlternatesTreeItem(alternatesArray, root) {
const alternateItem =
customTreeItem(`Alternate ${alternate.alternateSetting}`);
- alternateItem.add(customTreeItem(`Class Code: ${alternate.classCode}`));
+ alternateItem.add(customTreeItem(
+ `Class Code: ${renderClassCodeWithDescription(alternate.classCode)}`));
alternateItem.add(
customTreeItem(`Subclass Code: ${alternate.subclassCode}`));
diff --git a/chromium/chrome/browser/resources/vr/assets/push_assets_component.py b/chromium/chrome/browser/resources/vr/assets/push_assets_component.py
index b47f275ad0d..fae1c92b14b 100755
--- a/chromium/chrome/browser/resources/vr/assets/push_assets_component.py
+++ b/chromium/chrome/browser/resources/vr/assets/push_assets_component.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
diff --git a/chromium/chrome/browser/resources/web_app_internals/web_app_internals.html b/chromium/chrome/browser/resources/web_app_internals/web_app_internals.html
index de72b2f52ff..d3bb46529c5 100644
--- a/chromium/chrome/browser/resources/web_app_internals/web_app_internals.html
+++ b/chromium/chrome/browser/resources/web_app_internals/web_app_internals.html
@@ -32,7 +32,9 @@
<h1>Web App Internals</h1>
<div class="section">
- BMO enabled: <b>[[isBmoEnabled_]]</b>
+ <p>Save JSON: <button id="saveButton">Save file</button></p>
+ <p>Load JSON: <input type="file" id="loadButton"></p>
+ <p>BMO enabled: <b>[[isBmoEnabled_]]</b></p>
<template is="dom-if" if="[[!isBmoEnabled_]]">
<p>
Web apps are using the extension system via bookmark apps, see
diff --git a/chromium/chrome/browser/resources/web_app_internals/web_app_internals.js b/chromium/chrome/browser/resources/web_app_internals/web_app_internals.js
index ea38e13eaa2..c4590274508 100644
--- a/chromium/chrome/browser/resources/web_app_internals/web_app_internals.js
+++ b/chromium/chrome/browser/resources/web_app_internals/web_app_internals.js
@@ -61,6 +61,10 @@ Polymer({
this.highlightHashedId_();
this.hashChangeListener_ = () => this.highlightHashedId_();
window.addEventListener('hashchange', this.hashChangeListener_);
+
+ this.$.saveButton.addEventListener('click', () => this.save());
+ this.$.loadButton.addEventListener(
+ 'change', event => this.load(event.target.files[0]));
})();
},
@@ -94,4 +98,38 @@ Polymer({
highlighted.scrollIntoView();
highlighted.classList.add('highlight');
},
+
+ /**
+ * Saves the data contents of the page to a JSON file.
+ * @private
+ */
+ save() {
+ const data = Object.fromEntries(
+ Object.keys(this.properties).map(key => [key, this[key]]));
+ const file = new Blob(
+ [JSON.stringify(data, null, ' ')], {type: 'application/json'});
+ const a = document.createElement('a');
+ a.href = URL.createObjectURL(file);
+ a.download = 'web-app-internals.json';
+ a.click();
+ URL.revokeObjectURL(a.href);
+ },
+
+ /**
+ * Loads the given JSON file as the data contents of the page.
+ * @param {File} file
+ * @private
+ * @suppress {checkTypes} Closure doesn't know about
+ FileReader.readAsText(File).
+ */
+ load(file) {
+ const reader = new FileReader();
+ reader.addEventListener('load', event => {
+ const json = JSON.parse(event.target.result);
+ for (const key of Object.keys(this.properties)) {
+ this[key] = json[key];
+ }
+ });
+ reader.readAsText(file);
+ },
});
diff --git a/chromium/chrome/browser/resources/webui_js_error/BUILD.gn b/chromium/chrome/browser/resources/webui_js_error/BUILD.gn
index c9278029733..0b2172a894b 100644
--- a/chromium/chrome/browser/resources/webui_js_error/BUILD.gn
+++ b/chromium/chrome/browser/resources/webui_js_error/BUILD.gn
@@ -16,7 +16,7 @@ preprocess_manifest = "preprocessed_manifest.json"
if (optimize_webui) {
build_manifest = "build_manifest.json"
optimize_webui("build") {
- host = "webui_js_error"
+ host = "webuijserror"
input = rebase_path("$target_gen_dir/$preprocess_folder", root_build_dir)
deps = [
":preprocess",
diff --git a/chromium/chrome/browser/resources/welcome/BUILD.gn b/chromium/chrome/browser/resources/welcome/BUILD.gn
index e440bae068d..482c97ccaa6 100644
--- a/chromium/chrome/browser/resources/welcome/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/BUILD.gn
@@ -9,6 +9,8 @@ import("//tools/grit/preprocess_if_expr.gni")
import("//tools/polymer/html_to_js.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+assert(!is_chromeos_ash && !is_android)
+
preprocess_folder = "preprocessed"
preprocess_manifest = "preprocessed_manifest.json"
preprocess_gen_manifest = "preprocessed_gen_manifest.json"
@@ -37,6 +39,34 @@ generate_grd("build_grd") {
"$target_gen_dir/$preprocess_manifest",
"$target_gen_dir/$preprocess_gen_manifest",
]
+
+ if (is_chrome_branded) {
+ deps += [ ":build_icons_grdp" ]
+ grdp_files = [ "$target_gen_dir/icon_resources.grdp" ]
+ }
+}
+
+if (is_chrome_branded) {
+ generate_grd("build_icons_grdp") {
+ grd_prefix = "welcome_images"
+ out_grd = "$target_gen_dir/icon_resources.grdp"
+ input_files = [
+ "module_icons/add_bookmarks.svg",
+ "module_icons/pick_a_background.svg",
+ "module_icons/set_default_dark.svg",
+ "module_icons/set_default_light.svg",
+ "ntp_thumbnails/art.jpg",
+ "ntp_thumbnails/cityscape.jpg",
+ "ntp_thumbnails/earth.jpg",
+ "ntp_thumbnails/geometric_shapes.jpg",
+ "ntp_thumbnails/landscape.jpg",
+ "set_default_dark.svg",
+ "set_default_light.svg",
+ ]
+ input_files_base_dir =
+ rebase_path("//chrome/app/theme/google_chrome/welcome/", "//")
+ resource_path_prefix = "images"
+ }
}
preprocess_if_expr("preprocess") {
@@ -161,7 +191,7 @@ js_library("welcome_app") {
"./shared:bookmark_proxy",
"./shared:nux_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
+ "//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager",
"//ui/webui/resources/js:load_time_data.m",
]
}
diff --git a/chromium/chrome/browser/resources/welcome/google_apps/nux_google_apps.html b/chromium/chrome/browser/resources/welcome/google_apps/nux_google_apps.html
index 8668e4e5d2c..f64c314544f 100644
--- a/chromium/chrome/browser/resources/welcome/google_apps/nux_google_apps.html
+++ b/chromium/chrome/browser/resources/welcome/google_apps/nux_google_apps.html
@@ -4,17 +4,13 @@
}
.chrome-logo {
- content: url(../images/module_icons/google_light.svg);
- height: 38px;
+ background-image: url(../images/module_icons/add_bookmarks.svg);
+ background-position: center bottom;
+ background-size: 170px 170px;
+ height: 146px;
margin: auto;
- margin-bottom: 16px;
- width: 42px;
- }
-
- @media (prefers-color-scheme: dark) {
- .chrome-logo {
- content: url(../images/module_icons/google_dark.svg);
- }
+ margin-bottom: 32px;
+ width: 170px;
}
h1 {
diff --git a/chromium/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.html b/chromium/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.html
index a0ae6dc77e9..fead178ad97 100644
--- a/chromium/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.html
+++ b/chromium/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.html
@@ -39,17 +39,14 @@
}
.ntp-background-logo {
- content: url(../images/module_icons/wallpaper_light.svg);
- height: 39px;
+ background-image: url(../images/module_icons/pick_a_background.svg);
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: 110px 110px;
+ height: 110px;
margin: auto;
- margin-bottom: 16px;
- width: 44px;
- }
-
- @media (prefers-color-scheme: dark) {
- .ntp-background-logo {
- content: url(../images/module_icons/wallpaper_dark.svg);
- }
+ margin-bottom: 32px;
+ width: 110px;
}
h1 {
diff --git a/chromium/chrome/browser/resources/welcome/welcome_app.js b/chromium/chrome/browser/resources/welcome/welcome_app.js
index b39af05ccb5..c2485220ec3 100644
--- a/chromium/chrome/browser/resources/welcome/welcome_app.js
+++ b/chromium/chrome/browser/resources/welcome/welcome_app.js
@@ -3,7 +3,7 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_toast/cr_toast.m.js';
-import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.m.js';
+import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import './google_apps/nux_google_apps.js';
import './landing_view.js';
diff --git a/chromium/chrome/browser/safe_browsing/BUILD.gn b/chromium/chrome/browser/safe_browsing/BUILD.gn
index a940b0d2a09..825663c0ead 100644
--- a/chromium/chrome/browser/safe_browsing/BUILD.gn
+++ b/chromium/chrome/browser/safe_browsing/BUILD.gn
@@ -21,6 +21,7 @@ static_library("safe_browsing") {
"//build:branding_buildflags",
"//chrome/app:generated_resources",
"//chrome/browser:browser_process",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/common",
"//chrome/common:constants",
@@ -44,6 +45,7 @@ static_library("safe_browsing") {
"//components/safe_browsing/core:ping_manager",
"//components/safe_browsing/core/browser",
"//components/safe_browsing/core/browser:referrer_chain_provider",
+ "//components/safe_browsing/core/browser/sync",
"//components/safe_browsing/core/common:interfaces",
"//components/safe_browsing/core/db:database_manager",
"//components/safe_browsing/core/db:v4_local_database_manager",
@@ -356,6 +358,7 @@ source_set("verdict_cache_manager_factory") {
deps = [
"//chrome/browser:browser_process",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/common",
"//components/content_settings/core/browser",
@@ -376,6 +379,7 @@ static_library("advanced_protection") {
]
deps = [
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//components/keyed_service/content",
"//components/prefs",
diff --git a/chromium/chrome/browser/safe_browsing/android/BUILD.gn b/chromium/chrome/browser/safe_browsing/android/BUILD.gn
index ec2a6b4e9fd..a2edc70556e 100644
--- a/chromium/chrome/browser/safe_browsing/android/BUILD.gn
+++ b/chromium/chrome/browser/safe_browsing/android/BUILD.gn
@@ -34,7 +34,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/feedback/android:java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
diff --git a/chromium/chrome/browser/safety_check/android/BUILD.gn b/chromium/chrome/browser/safety_check/android/BUILD.gn
index d96538d1e12..456e5314796 100644
--- a/chromium/chrome/browser/safety_check/android/BUILD.gn
+++ b/chromium/chrome/browser/safety_check/android/BUILD.gn
@@ -17,6 +17,7 @@ source_set("android") {
]
deps = [
":jni_headers",
+ "//chrome/common:buildflags",
"//components/prefs",
"//components/safety_check",
]
@@ -36,7 +37,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/password_check:public_java",
"//chrome/browser/password_check/android:password_check_java_enums",
@@ -74,7 +74,6 @@ android_library("javatests") {
"//base:base_java",
"//base:base_java_test_support",
"//base/test:test_support_java",
- "//chrome/browser/flags:java",
"//chrome/browser/password_check:public_java",
"//chrome/browser/preferences:java",
"//chrome/browser/settings:test_support_java",
diff --git a/chromium/chrome/browser/search/BUILD.gn b/chromium/chrome/browser/search/BUILD.gn
deleted file mode 100644
index affdfffc8ed..00000000000
--- a/chromium/chrome/browser/search/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-local_ntp_resources = "//chrome/browser/resources/local_ntp"
-
-action("local_ntp_code_generate") {
- script = "tools/generate_integrity_header.py"
- header_path = "$target_gen_dir/local_ntp_js_integrity.h"
- animations_js = local_ntp_resources + "/animations.js"
- assert_js = "//ui/webui/resources/js/assert.js"
- customize_js = local_ntp_resources + "/customize.js"
- doodles_js = local_ntp_resources + "/doodles.js"
- local_ntp_js = local_ntp_resources + "/local_ntp.js"
- utils_js = local_ntp_resources + "/utils.js"
- voice_js = local_ntp_resources + "/voice.js"
-
- inputs = [
- animations_js,
- assert_js,
- customize_js,
- doodles_js,
- local_ntp_js,
- utils_js,
- voice_js,
- ]
-
- outputs = [ header_path ]
-
- args = [
- "--output_path=" + rebase_path(header_path, root_build_dir),
- rebase_path(animations_js, root_build_dir),
- rebase_path(assert_js, root_build_dir),
- rebase_path(customize_js, root_build_dir),
- rebase_path(doodles_js, root_build_dir),
- rebase_path(local_ntp_js, root_build_dir),
- rebase_path(utils_js, root_build_dir),
- rebase_path(voice_js, root_build_dir),
- ]
-}
-
-source_set("generated") {
- sources = get_target_outputs(":local_ntp_code_generate")
-
- public_deps = [ ":local_ntp_code_generate" ]
-}
diff --git a/chromium/chrome/browser/search/drive/BUILD.gn b/chromium/chrome/browser/search/drive/BUILD.gn
index db4c29d8a60..3256c4bb1a8 100644
--- a/chromium/chrome/browser/search/drive/BUILD.gn
+++ b/chromium/chrome/browser/search/drive/BUILD.gn
@@ -6,4 +6,5 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojo_bindings") {
sources = [ "drive.mojom" ]
+ public_deps = [ "//url/mojom:url_mojom_gurl" ]
}
diff --git a/chromium/chrome/browser/search/drive/drive.mojom b/chromium/chrome/browser/search/drive/drive.mojom
index ea8b0c5bbf0..e85adf5e535 100644
--- a/chromium/chrome/browser/search/drive/drive.mojom
+++ b/chromium/chrome/browser/search/drive/drive.mojom
@@ -4,15 +4,7 @@
module drive.mojom;
-// The types of documents available within Google Drive.
-// TODO(crbug/1176927): Verify prioritized types from
-// Item Suggest.
-enum FileType {
- kDoc,
- kSlide,
- kSheet,
- kOther,
-};
+import "url/mojom/url.mojom";
// A Google Drive File.
struct File {
@@ -20,10 +12,15 @@ struct File {
string id;
// Information on why the Drive Item was returned.
string justification_text;
+ // The mime type of the Drive Item.
+ string mime_type;
// The name of the Drive Item.
string title;
- // The type of the Drive Item.
- FileType type;
+ // The URL of the active person's photo that
+ // must be served through SanitizedImageSource.
+ url.mojom.Url? untrusted_photo_url;
+ // The URL to navigate to the Drive Item.
+ url.mojom.Url item_url;
};
// Browser-side handler for requests from NTP Module UI.
diff --git a/chromium/chrome/browser/search_engines/android/BUILD.gn b/chromium/chrome/browser/search_engines/android/BUILD.gn
new file mode 100644
index 00000000000..ff0be3d69d6
--- /dev/null
+++ b/chromium/chrome/browser/search_engines/android/BUILD.gn
@@ -0,0 +1,56 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+import("//chrome/browser/buildflags.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java",
+ "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java",
+ "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java",
+ "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java",
+ "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java",
+ ]
+
+ srcjar_deps = [ "//components/search_engines:search_engine_type_java" ]
+
+ deps = [
+ ":java_resources",
+ "//base:base_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/omaha/android:java",
+ "//chrome/browser/preferences:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/ui/messages/android:java",
+ "//chrome/browser/version:java",
+ "//components/browser_ui/settings/android:java",
+ "//components/browser_ui/site_settings/android:java",
+ "//components/browser_ui/util/android:java",
+ "//components/content_settings/android:content_settings_enums_java",
+ "//components/location/android:location_java",
+ "//components/search_engines/android:java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_fragment_fragment_java",
+ "//ui/android:ui_full_java",
+ ]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+ resources_package = "org.chromium.chrome.browser.search_engines"
+}
+
+generate_jni("jni_headers") {
+ sources = [ "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java" ]
+}
+
+android_resources("java_resources") {
+ sources = [
+ "java/res/layout/search_engine.xml",
+ "java/res/layout/search_engine_recent_title.xml",
+ ]
+ deps = [
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//components/browser_ui/styles/android:java_resources",
+ ]
+}
diff --git a/chromium/chrome/browser/share/android/java_sources.gni b/chromium/chrome/browser/share/android/java_sources.gni
index 89c4797e259..39a67b2b345 100644
--- a/chromium/chrome/browser/share/android/java_sources.gni
+++ b/chromium/chrome/browser/share/android/java_sources.gni
@@ -19,6 +19,7 @@ share_java_sources = [
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntry.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsTabService.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsTabServiceFactory.java",
+ "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManager.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QRCodeGenerationRequest.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java",
diff --git a/chromium/chrome/browser/share/android/test_java_sources.gni b/chromium/chrome/browser/share/android/test_java_sources.gni
index 0734b0ac0da..425204efa7f 100644
--- a/chromium/chrome/browser/share/android/test_java_sources.gni
+++ b/chromium/chrome/browser/share/android/test_java_sources.gni
@@ -18,10 +18,12 @@ share_test_java_sources = [
]
share_junit_test_java_sources = [
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProviderUnitTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntryTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManagerTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationSharedPrefManagerTest.java",
diff --git a/chromium/chrome/browser/sharing/proto/BUILD.gn b/chromium/chrome/browser/sharing/proto/BUILD.gn
index 67a6d2dc5d6..e2bc23783ca 100644
--- a/chromium/chrome/browser/sharing/proto/BUILD.gn
+++ b/chromium/chrome/browser/sharing/proto/BUILD.gn
@@ -15,6 +15,6 @@ proto_library("proto") {
"remote_copy_message.proto",
"shared_clipboard_message.proto",
"sharing_message.proto",
- "sms_fetch_message.proto",
+ "sms_fetch_message_test_proto3_optional.proto",
]
}
diff --git a/chromium/chrome/browser/signin/services/android/BUILD.gn b/chromium/chrome/browser/signin/services/android/BUILD.gn
index c3cdbae8c06..babf160f7c6 100644
--- a/chromium/chrome/browser/signin/services/android/BUILD.gn
+++ b/chromium/chrome/browser/signin/services/android/BUILD.gn
@@ -15,7 +15,6 @@ generate_jni("jni_headers") {
android_library("java") {
sources = [
- "java/src/org/chromium/chrome/browser/signin/services/AccountInfoService.java",
"java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java",
"java/src/org/chromium/chrome/browser/signin/services/IdentityServicesProvider.java",
"java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java",
@@ -28,9 +27,8 @@ android_library("java") {
]
deps = [
":java_resources",
- "$google_play_services_package:google_play_services_auth_base_java",
"//base:base_java",
- "//base:jni_java",
+ "//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
"//components/browser_ui/util/android:java",
@@ -60,6 +58,7 @@ android_library("javatests") {
deps = [
":java",
"//base:base_java_test_support",
+ "//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/test/android:chrome_java_test_support",
"//components/signin/public/android:java",
@@ -79,17 +78,17 @@ android_library("junit") {
bypass_platform_checks = true
testonly = true
sources = [
- "junit/src/org/chromium/chrome/browser/signin/services/AccountInfoServiceTest.java",
- "junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java",
+ "junit/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheUnitTest.java",
"junit/src/org/chromium/chrome/browser/signin/services/SigninMetricsUtilsTest.java",
- "junit/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManagerTest.java",
"junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java",
]
deps = [
":java",
+ ":java_resources",
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
+ "//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/test/android:chrome_java_test_support",
"//components/signin/public/android:java",
diff --git a/chromium/chrome/browser/signin/ui/android/BUILD.gn b/chromium/chrome/browser/signin/ui/android/BUILD.gn
index c6ddc89c7c0..b7817dd2561 100644
--- a/chromium/chrome/browser/signin/ui/android/BUILD.gn
+++ b/chromium/chrome/browser/signin/ui/android/BUILD.gn
@@ -93,6 +93,7 @@ android_resources("java_resources") {
"java/res/layout/account_picker_state_general_error.xml",
"java/res/layout/account_picker_state_no_account.xml",
"java/res/layout/account_picker_state_signin_in_progress.xml",
+ "java/res/layout/account_row.xml",
"java/res/layout/confirm_import_sync_data.xml",
"java/res/layout/personalized_signin_promo_view_body.xml",
"java/res/layout/personalized_signin_promo_view_bookmarks.xml",
@@ -133,13 +134,17 @@ android_library("junit") {
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/signin/services/android:java",
"//chrome/browser/tab:java",
"//chrome/test/android:chrome_java_test_support",
+ "//components/prefs/android:java",
"//components/signin/core/browser:signin_enums_java",
"//components/signin/public/android:java",
"//components/signin/public/android:signin_java_test_support",
+ "//components/user_prefs/android:java",
"//content/public/android:content_java",
"//third_party/android_deps:robolectric_all_java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
@@ -156,24 +161,35 @@ android_library("javatests") {
"java/src/org/chromium/chrome/browser/signin/ui/ConfirmManagedSyncDataDialogIntegrationTest.java",
"java/src/org/chromium/chrome/browser/signin/ui/ConfirmSyncDataIntegrationTest.java",
"java/src/org/chromium/chrome/browser/signin/ui/SignOutDialogRenderTest.java",
+ "java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetRenderTest.java",
+ "java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetTest.java",
"java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerDialogFragmentTest.java",
]
deps = [
":java",
"//base:base_java",
"//base:base_java_test_support",
+ "//chrome/android:chrome_java",
+ "//chrome/browser/feedback/android:java",
"//chrome/browser/flags:java",
+ "//chrome/browser/incognito/interstitial/android:java",
+ "//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/signin/services/android:java",
+ "//chrome/browser/ui/android/night_mode:night_mode_java_test_support",
"//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/bottomsheet/android:java",
"//components/signin/core/browser:signin_enums_java",
"//components/signin/public/android:java",
"//components/signin/public/android:signin_java_test_support",
"//content/public/test/android:content_java_test_support",
"//third_party/android_deps:espresso_java",
"//third_party/android_support_test_runner:runner_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_fragment_fragment_java",
+ "//third_party/androidx:androidx_recyclerview_recyclerview_java",
"//third_party/androidx:androidx_test_runner_java",
+ "//third_party/hamcrest:hamcrest_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
"//ui/android:ui_java_test_support",
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.cc
index e67de10dd97..8d18a7025a6 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.cc
@@ -85,7 +85,7 @@ void SpellCheckHostChromeImpl::RequestDictionary() {
// more than once if we get requests from different renderers.
}
-void SpellCheckHostChromeImpl::NotifyChecked(const base::string16& word,
+void SpellCheckHostChromeImpl::NotifyChecked(const std::u16string& word,
bool misspelled) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -98,7 +98,7 @@ void SpellCheckHostChromeImpl::NotifyChecked(const base::string16& word,
#if BUILDFLAG(USE_RENDERER_SPELLCHECKER)
void SpellCheckHostChromeImpl::CallSpellingService(
- const base::string16& text,
+ const std::u16string& text,
CallSpellingServiceCallback callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -126,7 +126,7 @@ void SpellCheckHostChromeImpl::CallSpellingService(
void SpellCheckHostChromeImpl::CallSpellingServiceDone(
CallSpellingServiceCallback callback,
bool success,
- const base::string16& text,
+ const std::u16string& text,
const std::vector<SpellCheckResult>& service_results) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -191,7 +191,7 @@ std::vector<SpellCheckResult> SpellCheckHostChromeImpl::FilterCustomWordResults(
#endif // BUILDFLAG(USE_RENDERER_SPELLCHECKER)
#if BUILDFLAG(USE_BROWSER_SPELLCHECKER) && BUILDFLAG(ENABLE_SPELLING_SERVICE)
-void SpellCheckHostChromeImpl::CheckSpelling(const base::string16& word,
+void SpellCheckHostChromeImpl::CheckSpelling(const std::u16string& word,
int route_id,
CheckSpellingCallback callback) {
bool correct = spellcheck_platform::CheckSpelling(word, route_id);
@@ -199,15 +199,15 @@ void SpellCheckHostChromeImpl::CheckSpelling(const base::string16& word,
}
void SpellCheckHostChromeImpl::FillSuggestionList(
- const base::string16& word,
+ const std::u16string& word,
FillSuggestionListCallback callback) {
- std::vector<base::string16> suggestions;
+ std::vector<std::u16string> suggestions;
spellcheck_platform::FillSuggestionList(word, &suggestions);
std::move(callback).Run(suggestions);
}
void SpellCheckHostChromeImpl::RequestTextCheck(
- const base::string16& text,
+ const std::u16string& text,
int route_id,
RequestTextCheckCallback callback) {
DCHECK(!text.empty());
@@ -233,20 +233,6 @@ void SpellCheckHostChromeImpl::RequestTextCheck(
}
#if defined(OS_WIN)
-void SpellCheckHostChromeImpl::GetPerLanguageSuggestions(
- const base::string16& word,
- GetPerLanguageSuggestionsCallback callback) {
- SpellcheckService* spellcheck = GetSpellcheckService();
-
- if (!spellcheck) { // Teardown.
- std::move(callback).Run({});
- return;
- }
-
- spellcheck_platform::GetPerLanguageSuggestions(
- spellcheck->platform_spell_checker(), word, std::move(callback));
-}
-
void SpellCheckHostChromeImpl::InitializeDictionaries(
InitializeDictionariesCallback callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.h b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.h
index 67582f0e21e..e2bca2830bf 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.h
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl.h
@@ -50,10 +50,10 @@ class SpellCheckHostChromeImpl : public SpellCheckHostImpl {
// SpellCheckHostImpl:
void RequestDictionary() override;
- void NotifyChecked(const base::string16& word, bool misspelled) override;
+ void NotifyChecked(const std::u16string& word, bool misspelled) override;
#if BUILDFLAG(USE_RENDERER_SPELLCHECKER)
- void CallSpellingService(const base::string16& text,
+ void CallSpellingService(const std::u16string& text,
CallSpellingServiceCallback callback) override;
// Invoked when the remote Spelling service has finished checking the
@@ -61,7 +61,7 @@ class SpellCheckHostChromeImpl : public SpellCheckHostImpl {
void CallSpellingServiceDone(
CallSpellingServiceCallback callback,
bool success,
- const base::string16& text,
+ const std::u16string& text,
const std::vector<SpellCheckResult>& service_results) const;
// Filter out spelling corrections of custom dictionary words from the
@@ -75,20 +75,16 @@ class SpellCheckHostChromeImpl : public SpellCheckHostImpl {
#if BUILDFLAG(USE_BROWSER_SPELLCHECKER) && BUILDFLAG(ENABLE_SPELLING_SERVICE)
// Implementations of the following APIs for build configs that don't use the
// spelling service are in the base class SpellCheckHostImpl.
- void CheckSpelling(const base::string16& word,
+ void CheckSpelling(const std::u16string& word,
int route_id,
CheckSpellingCallback callback) override;
- void FillSuggestionList(const base::string16& word,
+ void FillSuggestionList(const std::u16string& word,
FillSuggestionListCallback callback) override;
- void RequestTextCheck(const base::string16& text,
+ void RequestTextCheck(const std::u16string& text,
int route_id,
RequestTextCheckCallback callback) override;
#if defined(OS_WIN)
- void GetPerLanguageSuggestions(
- const base::string16& word,
- GetPerLanguageSuggestionsCallback callback) override;
-
void InitializeDictionaries(InitializeDictionariesCallback callback) override;
#endif // defined(OS_WIN)
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
index 675f03f7a70..8853161f285 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/spellchecker/spell_check_host_chrome_impl.h"
+#include <memory>
+
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
@@ -19,7 +21,7 @@ class SpellCheckHostChromeImplMacBrowserTest : public InProcessBrowserTest {
public:
void SetUpOnMainThread() override {
content::BrowserContext* context = browser()->profile();
- renderer_.reset(new content::MockRenderProcessHost(context));
+ renderer_ = std::make_unique<content::MockRenderProcessHost>(context);
SpellCheckHostChromeImpl::Create(
renderer_->GetID(), spell_check_host_.BindNewPipeAndPassReceiver());
}
@@ -54,7 +56,7 @@ class SpellCheckHostChromeImplMacBrowserTest : public InProcessBrowserTest {
IN_PROC_BROWSER_TEST_F(SpellCheckHostChromeImplMacBrowserTest,
SpellCheckReturnMessage) {
spell_check_host_->RequestTextCheck(
- base::UTF8ToUTF16("zz."), 123,
+ u"zz.", 123,
base::BindOnce(&SpellCheckHostChromeImplMacBrowserTest::LogResult,
base::Unretained(this)));
RunUntilResultReceived();
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_unittest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_unittest.cc
index 2eecc346490..bc1d39a1a07 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_unittest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_unittest.cc
@@ -20,8 +20,8 @@ class SpellCheckHostChromeImplMacTest : public ::testing::Test {
TEST_F(SpellCheckHostChromeImplMacTest, CombineResults) {
std::vector<SpellCheckResult> local_results;
std::vector<SpellCheckResult> remote_results;
- base::string16 remote_suggestion = base::ASCIIToUTF16("remote");
- base::string16 local_suggestion = base::ASCIIToUTF16("local");
+ std::u16string remote_suggestion = u"remote";
+ std::u16string local_suggestion = u"local";
// Remote-only result - must be flagged as GRAMMAR after combine
remote_results.push_back(SpellCheckResult(SpellCheckResult::SPELLING, 0, 5));
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_unittest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_unittest.cc
index ca5f66fb20f..3712d2e9c08 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_unittest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_unittest.cc
@@ -49,10 +49,10 @@ class TestSpellCheckHostChromeImpl {
// results returned by the remote Spelling service.
TEST(SpellCheckHostChromeImplTest, CustomSpellingResults) {
std::vector<SpellCheckResult> service_results;
- service_results.push_back(SpellCheckResult(SpellCheckResult::SPELLING, 0, 6,
- base::ASCIIToUTF16("Hello")));
- service_results.push_back(SpellCheckResult(SpellCheckResult::SPELLING, 7, 5,
- base::ASCIIToUTF16("World")));
+ service_results.push_back(
+ SpellCheckResult(SpellCheckResult::SPELLING, 0, 6, u"Hello"));
+ service_results.push_back(
+ SpellCheckResult(SpellCheckResult::SPELLING, 7, 5, u"World"));
TestSpellCheckHostChromeImpl host_impl;
host_impl.GetCustomDictionary().AddWord("Helllo");
std::vector<SpellCheckResult> results =
@@ -71,10 +71,10 @@ TEST(SpellCheckHostChromeImplTest, CustomSpellingResults) {
// be retained in the results returned by the remote Spelling service.
TEST(SpellCheckHostChromeImplTest, SpellingServiceResults) {
std::vector<SpellCheckResult> service_results;
- service_results.push_back(SpellCheckResult(SpellCheckResult::SPELLING, 0, 6,
- base::ASCIIToUTF16("Hello")));
- service_results.push_back(SpellCheckResult(SpellCheckResult::SPELLING, 7, 5,
- base::ASCIIToUTF16("World")));
+ service_results.push_back(
+ SpellCheckResult(SpellCheckResult::SPELLING, 0, 6, u"Hello"));
+ service_results.push_back(
+ SpellCheckResult(SpellCheckResult::SPELLING, 7, 5, u"World"));
TestSpellCheckHostChromeImpl host_impl;
host_impl.GetCustomDictionary().AddWord("Hulo");
std::vector<SpellCheckResult> results =
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
index 851a50dd58b..184701510f7 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
@@ -62,7 +62,7 @@ class SpellCheckHostChromeImplWinBrowserTest : public InProcessBrowserTest {
}
void OnSuggestionResult(
- const std::vector<std::vector<::base::string16>>& suggestions) {
+ const std::vector<std::vector<::std::u16string>>& suggestions) {
received_result_ = true;
suggestion_result_ = suggestions;
if (quit_)
@@ -87,7 +87,6 @@ class SpellCheckHostChromeImplWinBrowserTest : public InProcessBrowserTest {
}
void RunSpellCheckReturnMessageTest();
- void RunGetPerLanguageSuggestionsTest();
protected:
PlatformSpellChecker* platform_spell_checker_;
@@ -97,7 +96,7 @@ class SpellCheckHostChromeImplWinBrowserTest : public InProcessBrowserTest {
bool received_result_ = false;
std::vector<SpellCheckResult> result_;
- std::vector<std::vector<::base::string16>> suggestion_result_;
+ std::vector<std::vector<::std::u16string>> suggestion_result_;
base::OnceClosure quit_;
};
@@ -120,7 +119,7 @@ void SpellCheckHostChromeImplWinBrowserTest::RunSpellCheckReturnMessageTest() {
RunUntilResultReceived();
spell_check_host_->RequestTextCheck(
- base::UTF8ToUTF16("zz."),
+ u"zz.",
/*route_id=*/123,
base::BindOnce(
&SpellCheckHostChromeImplWinBrowserTest::OnSpellcheckResult,
@@ -133,36 +132,6 @@ void SpellCheckHostChromeImplWinBrowserTest::RunSpellCheckReturnMessageTest() {
EXPECT_EQ(result_[0].decoration, SpellCheckResult::SPELLING);
}
-IN_PROC_BROWSER_TEST_F(SpellCheckHostChromeImplWinBrowserTest,
- GetPerLanguageSuggestions) {
- RunGetPerLanguageSuggestionsTest();
-}
-
-void SpellCheckHostChromeImplWinBrowserTest::
- RunGetPerLanguageSuggestionsTest() {
- if (!spellcheck::WindowsVersionSupportsSpellchecker()) {
- return;
- }
-
- spellcheck_platform::SetLanguage(
- platform_spell_checker_, "en-US",
- base::BindOnce(&SpellCheckHostChromeImplWinBrowserTest::
- SetLanguageCompletionCallback,
- base::Unretained(this)));
- RunUntilResultReceived();
-
- spell_check_host_->GetPerLanguageSuggestions(
- base::UTF8ToUTF16("tihs"),
- base::BindOnce(
- &SpellCheckHostChromeImplWinBrowserTest::OnSuggestionResult,
- base::Unretained(this)));
- RunUntilResultReceived();
-
- // Should have 1 vector of results, which should contain at least 1 suggestion
- ASSERT_EQ(1U, suggestion_result_.size());
- EXPECT_GT(suggestion_result_[0].size(), 0U);
-}
-
class SpellCheckHostChromeImplWinBrowserTestDelayInit
: public SpellCheckHostChromeImplWinBrowserTest {
public:
@@ -202,8 +171,3 @@ IN_PROC_BROWSER_TEST_F(SpellCheckHostChromeImplWinBrowserTestDelayInit,
SpellCheckReturnMessage) {
RunSpellCheckReturnMessageTest();
}
-
-IN_PROC_BROWSER_TEST_F(SpellCheckHostChromeImplWinBrowserTestDelayInit,
- GetPerLanguageSuggestions) {
- RunGetPerLanguageSuggestionsTest();
-}
diff --git a/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.cc b/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.cc
index 4218ae0c3f9..9f8dfa8ea86 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.cc
@@ -48,7 +48,7 @@ void SpellCheckPanelHostImpl::ShowSpellingPanel(bool show) {
}
void SpellCheckPanelHostImpl::UpdateSpellingPanelWithMisspelledWord(
- const base::string16& word) {
+ const std::u16string& word) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
spellcheck_platform::UpdateSpellingPanelWithMisspelledWord(word);
}
diff --git a/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.h b/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.h
index 68ed9657715..a5ef3d6d1e7 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.h
+++ b/chromium/chrome/browser/spellchecker/spell_check_panel_host_impl.h
@@ -34,7 +34,7 @@ class SpellCheckPanelHostImpl : public spellcheck::mojom::SpellCheckPanelHost {
// spellcheck::mojom::SpellCheckPanelHost:
void ShowSpellingPanel(bool show) override;
void UpdateSpellingPanelWithMisspelledWord(
- const base::string16& word) override;
+ const std::u16string& word) override;
DISALLOW_COPY_AND_ASSIGN(SpellCheckPanelHostImpl);
};
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_service.cc b/chromium/chrome/browser/spellchecker/spellcheck_service.cc
index d56c8c83de7..2f8356a65bf 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_service.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_service.cc
@@ -6,10 +6,12 @@
#include <algorithm>
#include <iterator>
+#include <memory>
#include <set>
#include <utility>
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/check_op.h"
#include "base/containers/contains.h"
#include "base/no_destructor.h"
@@ -162,7 +164,8 @@ SpellcheckService::SpellcheckService(content::BrowserContext* context)
base::BindRepeating(&SpellcheckService::InitForAllRenderers,
base::Unretained(this)));
- custom_dictionary_.reset(new SpellcheckCustomDictionary(context_->GetPath()));
+ custom_dictionary_ =
+ std::make_unique<SpellcheckCustomDictionary>(context_->GetPath());
custom_dictionary_->AddObserver(this);
custom_dictionary_->Load();
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc b/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
index 47173f566de..99b0710462a 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
@@ -314,7 +314,7 @@ class SpellcheckServiceHostBrowserTest : public SpellcheckServiceBrowserTest {
}
bool spelling_service_done_called_ = false;
- base::string16 word_;
+ std::u16string word_;
DISALLOW_COPY_AND_ASSIGN(SpellcheckServiceHostBrowserTest);
};
@@ -768,7 +768,7 @@ const std::vector<std::string> kSpellcheckDictionariesAfter = {
// spellcheck language preferences for the test profile.
IN_PROC_BROWSER_TEST_F(SpellcheckServiceWindowsHybridBrowserTestDelayInit,
PRE_WindowsHybridSpellcheckDelayInit) {
- GetPrefs()->SetString(language::prefs::kAcceptLanguages, kAcceptLanguages);
+ GetPrefs()->SetString(language::prefs::kSelectedLanguages, kAcceptLanguages);
base::Value spellcheck_dictionaries_list(base::Value::Type::LIST);
for (const auto& dictionary : kSpellcheckDictionariesBefore) {
spellcheck_dictionaries_list.Append(std::move(dictionary));
diff --git a/chromium/chrome/browser/spellchecker/spelling_request.cc b/chromium/chrome/browser/spellchecker/spelling_request.cc
index d3029666f29..76ef20c9ce6 100644
--- a/chromium/chrome/browser/spellchecker/spelling_request.cc
+++ b/chromium/chrome/browser/spellchecker/spelling_request.cc
@@ -27,7 +27,7 @@ bool CompareLocation(const SpellCheckResult& r1, const SpellCheckResult& r2) {
SpellingRequest::SpellingRequest(PlatformSpellChecker* platform_spell_checker,
SpellingServiceClient* client,
- const base::string16& text,
+ const std::u16string& text,
int render_process_id,
int document_tag,
RequestTextCheckCallback callback,
@@ -119,7 +119,7 @@ void SpellingRequest::OnCheckCompleted() {
void SpellingRequest::OnRemoteCheckCompleted(
bool success,
- const base::string16& text,
+ const std::u16string& text,
const std::vector<SpellCheckResult>& results) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
remote_success_ = success;
diff --git a/chromium/chrome/browser/spellchecker/spelling_request.h b/chromium/chrome/browser/spellchecker/spelling_request.h
index a0ead52dd83..94901920822 100644
--- a/chromium/chrome/browser/spellchecker/spelling_request.h
+++ b/chromium/chrome/browser/spellchecker/spelling_request.h
@@ -23,7 +23,7 @@ class SpellingRequest {
SpellingRequest(PlatformSpellChecker* platform_spell_checker,
SpellingServiceClient* client,
- const base::string16& text,
+ const std::u16string& text,
int render_process_id,
int document_tag,
RequestTextCheckCallback callback,
@@ -49,7 +49,7 @@ class SpellingRequest {
// Called when server-side checking is complete. Must be called on UI thread.
void OnRemoteCheckCompleted(bool success,
- const base::string16& text,
+ const std::u16string& text,
const std::vector<SpellCheckResult>& results);
// Called when local checking is complete. Must be called on UI thread.
@@ -68,7 +68,7 @@ class SpellingRequest {
bool remote_success_;
// The string to be spell-checked.
- base::string16 text_;
+ std::u16string text_;
// Callback to send the results to renderer. Note that both RequestTextCheck
// and RequestPartialTextCheck have the same callback signatures, so both
diff --git a/chromium/chrome/browser/spellchecker/spelling_service_client_unittest.cc b/chromium/chrome/browser/spellchecker/spelling_service_client_unittest.cc
index 07402cf5019..bc436ec3e60 100644
--- a/chromium/chrome/browser/spellchecker/spelling_service_client_unittest.cc
+++ b/chromium/chrome/browser/spellchecker/spelling_service_client_unittest.cc
@@ -66,10 +66,10 @@ class TestingSpellingServiceClient : public SpellingServiceClient {
}
void VerifyResponse(bool success,
- const base::string16& request_text,
+ const std::u16string& request_text,
const std::vector<SpellCheckResult>& results) {
EXPECT_EQ(success_, success);
- base::string16 text(base::UTF8ToUTF16(sanitized_request_text_));
+ std::u16string text(base::UTF8ToUTF16(sanitized_request_text_));
for (auto it = results.begin(); it != results.end(); ++it) {
text.replace(it->location, it->length, it->replacements[0]);
}
@@ -88,7 +88,7 @@ class TestingSpellingServiceClient : public SpellingServiceClient {
private:
bool success_;
std::string sanitized_request_text_;
- base::string16 corrected_text_;
+ std::u16string corrected_text_;
network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
};
@@ -101,7 +101,7 @@ class SpellingServiceClientTest
public:
void OnTextCheckComplete(int tag,
bool success,
- const base::string16& text,
+ const std::u16string& text,
const std::vector<SpellCheckResult>& results) {
client_.VerifyResponse(success, text, results);
}
diff --git a/chromium/chrome/browser/subresource_filter/BUILD.gn b/chromium/chrome/browser/subresource_filter/BUILD.gn
index 5004114cf6e..4ecc72b79de 100644
--- a/chromium/chrome/browser/subresource_filter/BUILD.gn
+++ b/chromium/chrome/browser/subresource_filter/BUILD.gn
@@ -48,6 +48,7 @@ if (is_android) {
deps = [
":jni_headers",
"//base",
+ "//chrome/browser",
"//chrome/browser:browser_process",
"//components/subresource_filter/content/browser",
"//components/subresource_filter/core/common:test_support",
diff --git a/chromium/chrome/browser/sync/test/integration/sync_integration_tests_sources.gni b/chromium/chrome/browser/sync/test/integration/sync_integration_tests_sources.gni
new file mode 100644
index 00000000000..132252cf25b
--- /dev/null
+++ b/chromium/chrome/browser/sync/test/integration/sync_integration_tests_sources.gni
@@ -0,0 +1,68 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+sync_integration_tests_sources = [
+ "../browser/sync/test/integration/single_client_autofill_profile_sync_test.cc",
+ "../browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc",
+ "../browser/sync/test/integration/single_client_device_info_sync_test.cc",
+ "../browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc",
+ "../browser/sync/test/integration/single_client_offer_sync_test.cc",
+ "../browser/sync/test/integration/single_client_typed_urls_sync_test.cc",
+ "../browser/sync/test/integration/sync_exponential_backoff_test.cc",
+]
+
+if (!is_android) {
+ sync_integration_tests_sources += [
+ "../browser/sync/test/integration/enable_disable_test.cc",
+ "../browser/sync/test/integration/local_sync_test.cc",
+ "../browser/sync/test/integration/migration_test.cc",
+ "../browser/sync/test/integration/password_manager_sync_test.cc",
+ "../browser/sync/test/integration/single_client_app_settings_sync_test.cc",
+ "../browser/sync/test/integration/single_client_bookmarks_sync_test.cc",
+ "../browser/sync/test/integration/single_client_dictionary_sync_test.cc",
+ "../browser/sync/test/integration/single_client_extension_apps_sync_test.cc",
+ "../browser/sync/test/integration/single_client_extensions_sync_test.cc",
+ "../browser/sync/test/integration/single_client_nigori_sync_test.cc",
+ "../browser/sync/test/integration/single_client_passwords_sync_test.cc",
+ "../browser/sync/test/integration/single_client_polling_sync_test.cc",
+ "../browser/sync/test/integration/single_client_preferences_sync_test.cc",
+ "../browser/sync/test/integration/single_client_search_engines_sync_test.cc",
+ "../browser/sync/test/integration/single_client_secondary_account_sync_test.cc",
+ "../browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc",
+ "../browser/sync/test/integration/single_client_sessions_sync_test.cc",
+ "../browser/sync/test/integration/single_client_sharing_message_sync_test.cc",
+ "../browser/sync/test/integration/single_client_standalone_transport_sync_test.cc",
+ "../browser/sync/test/integration/single_client_sync_invalidations_test.cc",
+ "../browser/sync/test/integration/single_client_themes_sync_test.cc",
+ "../browser/sync/test/integration/single_client_user_consents_sync_test.cc",
+ "../browser/sync/test/integration/single_client_user_events_sync_test.cc",
+ "../browser/sync/test/integration/single_client_wallet_sync_test.cc",
+ "../browser/sync/test/integration/single_client_web_apps_sync_test.cc",
+ "../browser/sync/test/integration/sync_auth_test.cc",
+ "../browser/sync/test/integration/sync_errors_test.cc",
+
+ # Tests with two clients can't run on Android.
+ "../browser/sync/test/integration/two_client_autocomplete_sync_test.cc",
+ "../browser/sync/test/integration/two_client_autofill_sync_test.cc",
+ "../browser/sync/test/integration/two_client_bookmarks_sync_test.cc",
+ "../browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc",
+ "../browser/sync/test/integration/two_client_dictionary_sync_test.cc",
+ "../browser/sync/test/integration/two_client_extension_apps_sync_test.cc",
+ "../browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc",
+ "../browser/sync/test/integration/two_client_extensions_sync_test.cc",
+ "../browser/sync/test/integration/two_client_passwords_sync_test.cc",
+ "../browser/sync/test/integration/two_client_polling_sync_test.cc",
+ "../browser/sync/test/integration/two_client_preferences_sync_test.cc",
+ "../browser/sync/test/integration/two_client_search_engines_sync_test.cc",
+ "../browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc",
+ "../browser/sync/test/integration/two_client_sessions_sync_test.cc",
+ "../browser/sync/test/integration/two_client_themes_sync_test.cc",
+ "../browser/sync/test/integration/two_client_typed_urls_sync_test.cc",
+ "../browser/sync/test/integration/two_client_user_events_sync_test.cc",
+ "../browser/sync/test/integration/two_client_wallet_sync_test.cc",
+ "../browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc",
+ "../browser/sync/test/integration/two_client_web_apps_integration_sync_test.cc",
+ "../browser/sync/test/integration/two_client_web_apps_sync_test.cc",
+ ]
+}
diff --git a/chromium/chrome/browser/tab/BUILD.gn b/chromium/chrome/browser/tab/BUILD.gn
index c169fc8c71c..f25f93e30e4 100644
--- a/chromium/chrome/browser/tab/BUILD.gn
+++ b/chromium/chrome/browser/tab/BUILD.gn
@@ -10,6 +10,8 @@ android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/tab/CurrentTabObserver.java",
"java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java",
+ "java/src/org/chromium/chrome/browser/tab/SadTab.java",
+ "java/src/org/chromium/chrome/browser/tab/SadTabView.java",
"java/src/org/chromium/chrome/browser/tab/Tab.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributes.java",
@@ -43,16 +45,22 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java",
"java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorageFactory.java",
"java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java",
+ "java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java",
]
- # TabSelectionType, TabLaunchType
- srcjar_deps = [ "//chrome/browser/ui:tab_model_enums_java" ]
+ srcjar_deps = [
+ # TabSelectionType, TabLaunchType
+ "//chrome/browser/ui:tab_model_enums_java",
+
+ # SadTabEvent
+ "//components/ui_metrics:ui_metrics_enums_java",
+ ]
deps = [
":critical_persisted_tab_data_proto_java",
+ ":java_resources",
+ ":optimization_guide_protos_java",
"//base:base_java",
- "//base:base_java",
- "//base:jni_java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/contextmenu:java",
"//chrome/browser/endpoint_fetcher:java",
@@ -61,6 +69,7 @@ android_library("java") {
"//chrome/browser/page_annotations/android:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/ui/android/native_page:java",
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
"//components/browser_ui/util/android:java",
"//components/embedder_support/android:browser_context_java",
"//components/embedder_support/android:content_view_java",
@@ -73,6 +82,7 @@ android_library("java") {
"//components/payments/content/android:java",
"//components/security_state/content/android:java",
"//components/security_state/core:security_state_enums_java",
+ "//components/strings:components_strings_grd",
"//content/public/android:content_java",
"//net/android:net_java",
"//third_party/android_deps:protobuf_lite_runtime_java",
@@ -84,6 +94,19 @@ android_library("java") {
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+ resources_package = "org.chromium.chrome.browser.tab"
+}
+
+android_resources("java_resources") {
+ sources = [
+ "java/res/drawable-hdpi/sad_tab.png",
+ "java/res/drawable-mdpi/sad_tab.png",
+ "java/res/drawable-xhdpi/sad_tab.png",
+ "java/res/drawable-xxhdpi/sad_tab.png",
+ "java/res/drawable-xxxhdpi/sad_tab.png",
+ "java/res/layout/sad_tab.xml",
+ ]
+ deps = [ "//ui/android:ui_java_resources" ]
}
generate_jni("jni_headers") {
@@ -102,6 +125,11 @@ proto_java_library("critical_persisted_tab_data_proto_java") {
]
}
+proto_java_library("optimization_guide_protos_java") {
+ proto_path = "java/src/org/chromium/chrome/browser/tab/state/proto"
+ sources = [ "$proto_path/price_tracking.proto" ]
+}
+
android_library("junit") {
bypass_platform_checks = true
testonly = true
diff --git a/chromium/chrome/browser/tab_contents/tab_util.cc b/chromium/chrome/browser/tab_contents/tab_util.cc
index 93356ea9685..5a18281e785 100644
--- a/chromium/chrome/browser/tab_contents/tab_util.cc
+++ b/chromium/chrome/browser/tab_contents/tab_util.cc
@@ -37,7 +37,7 @@ scoped_refptr<SiteInstance> GetSiteInstanceForNewTab(Profile* profile,
// Rewrite the |url| if necessary, to ensure that the SiteInstance is
// associated with a |url| that will actually be loaded. For example,
// |url| set to chrome://newtab/ might actually result in a navigation to a
- // different URL like chrome-search://local-ntp/local-ntp.html
+ // different URL like chrome://new-tab-page.
content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(&url,
profile);
diff --git a/chromium/chrome/browser/tab_contents/view_source_browsertest.cc b/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
index 3f89025c8e6..ac605043f73 100644
--- a/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
+++ b/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -61,9 +61,9 @@ class ViewSourceTest : public InProcessBrowserTest {
DISALLOW_COPY_AND_ASSIGN(ViewSourceTest);
};
-class ViewSourceFeaturePolicyTest : public ViewSourceTest {
+class ViewSourcePermissionsPolicyTest : public ViewSourceTest {
public:
- ViewSourceFeaturePolicyTest() : ViewSourceTest() {}
+ ViewSourcePermissionsPolicyTest() : ViewSourceTest() {}
protected:
void SetUpOnMainThread() override {
@@ -77,7 +77,7 @@ class ViewSourceFeaturePolicyTest : public ViewSourceTest {
}
private:
- DISALLOW_COPY_AND_ASSIGN(ViewSourceFeaturePolicyTest);
+ DISALLOW_COPY_AND_ASSIGN(ViewSourcePermissionsPolicyTest);
};
// This test renders a page in view-source and then checks to see if the title
@@ -94,7 +94,7 @@ IN_PROC_BROWSER_TEST_F(ViewSourceTest, DoesBrowserRenderInViewSource) {
// Check that the title didn't get set. It should not be there (because we
// are in view-source mode).
- EXPECT_NE(base::ASCIIToUTF16("foo"),
+ EXPECT_NE(u"foo",
browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
}
@@ -736,7 +736,7 @@ IN_PROC_BROWSER_TEST_F(ViewSourceTest, JavaScriptURISanitized) {
// This test verifies that 'view-source' documents are not affected by vertical
// scroll (see https://crbug.com/898688).
-IN_PROC_BROWSER_TEST_F(ViewSourceFeaturePolicyTest,
+IN_PROC_BROWSER_TEST_F(ViewSourcePermissionsPolicyTest,
ViewSourceNotAffectedByHeaderPolicy) {
ASSERT_TRUE(embedded_test_server()->Start());
const std::string k_verify_feature = R"(
diff --git a/chromium/chrome/browser/tab_contents/web_contents_collection.h b/chromium/chrome/browser/tab_contents/web_contents_collection.h
index e9c5cf4fbcb..122193135cc 100644
--- a/chromium/chrome/browser/tab_contents/web_contents_collection.h
+++ b/chromium/chrome/browser/tab_contents/web_contents_collection.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_TAB_CONTENTS_WEB_CONTENTS_COLLECTION_H_
#define CHROME_BROWSER_TAB_CONTENTS_WEB_CONTENTS_COLLECTION_H_
+#include <memory>
+
#include "base/containers/flat_map.h"
#include "content/public/browser/web_contents_observer.h"
@@ -28,6 +30,9 @@ class WebContentsCollection {
virtual void NavigationEntryCommitted(
content::WebContents* web_contents,
const content::LoadCommittedDetails& load_details) {}
+
+ protected:
+ virtual ~Observer() = default;
};
// `observer` must outlive `this`.
@@ -48,7 +53,7 @@ class WebContentsCollection {
// Observer which will receive callbacks from any of the `WebContentsObserver`
// in `web_contents_observers_`.
- Observer* observer_;
+ Observer* const observer_;
// Map of observers for the WebContents part of this collection.
base::flat_map<content::WebContents*,
diff --git a/chromium/chrome/browser/thumbnail/generator/BUILD.gn b/chromium/chrome/browser/thumbnail/generator/BUILD.gn
index c42d28fd6b3..4ae1ae2835b 100644
--- a/chromium/chrome/browser/thumbnail/generator/BUILD.gn
+++ b/chromium/chrome/browser/thumbnail/generator/BUILD.gn
@@ -72,7 +72,6 @@ if (is_android) {
":jni_headers",
":proto_java",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/util:java",
"//components/browser_ui/util/android:java",
"//content/public/android:content_java",
@@ -160,7 +159,6 @@ if (is_android) {
deps = [
":test_support_jni_headers",
"//base:base_java",
- "//base:jni_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/chromium/chrome/browser/touch_to_fill/android/internal/BUILD.gn b/chromium/chrome/browser/touch_to_fill/android/internal/BUILD.gn
index 1dd6f4f37c5..d1b6f0bf88a 100644
--- a/chromium/chrome/browser/touch_to_fill/android/internal/BUILD.gn
+++ b/chromium/chrome/browser/touch_to_fill/android/internal/BUILD.gn
@@ -11,7 +11,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/android:chrome_java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
diff --git a/chromium/chrome/browser/ui/BUILD.gn b/chromium/chrome/browser/ui/BUILD.gn
index 4dbdfc0c32c..5c150b1b020 100644
--- a/chromium/chrome/browser/ui/BUILD.gn
+++ b/chromium/chrome/browser/ui/BUILD.gn
@@ -191,7 +191,8 @@ static_library("ui") {
"webauthn/authenticator_request_dialog.h",
"webid/identity_dialog_controller.cc",
"webid/identity_dialog_controller.h",
- "webid/identity_dialogs.h",
+ "webid/webid_dialog.cc",
+ "webid/webid_dialog.h",
"webui/about_ui.cc",
"webui/about_ui.h",
"webui/autofill_and_password_manager_internals/autofill_internals_ui.cc",
@@ -341,7 +342,6 @@ static_library("ui") {
# browser, then we can clean up these dependencies.
public_deps = [
"//components/dom_distiller/core",
- "//components/optimization_guide:machine_learning_tflite_buildflags",
"//components/paint_preview/buildflags",
"//components/safe_browsing:buildflags",
"//components/sync",
@@ -373,9 +373,12 @@ static_library("ui") {
"//chrome/browser/devtools",
"//chrome/browser/image_decoder",
"//chrome/browser/media:mojo_bindings",
- "//chrome/browser/media/feeds:mojo_bindings",
+ "//chrome/browser/media/router:media_router_feature",
+ "//chrome/browser/profiles",
"//chrome/browser/profiles:profile",
"//chrome/browser/profiling_host",
+ "//chrome/browser/resources/download_internals:resources",
+ "//chrome/browser/resources/internals:resources",
"//chrome/browser/resources/invalidations:resources",
"//chrome/browser/resources/media:webrtc_logs_resources",
"//chrome/browser/resources/net_internals:resources",
@@ -384,9 +387,11 @@ static_library("ui") {
"//chrome/browser/resources/usb_internals:resources",
"//chrome/browser/safe_browsing",
"//chrome/browser/ui/webui/bluetooth_internals",
+ "//chrome/browser/ui/webui/download_shelf:mojo_bindings",
"//chrome/browser/ui/webui/downloads:mojo_bindings",
"//chrome/browser/ui/webui/memories:mojo_bindings",
"//chrome/browser/ui/webui/new_tab_page:mojo_bindings",
+ "//chrome/browser/ui/webui/new_tab_page_third_party:mojo_bindings",
"//chrome/browser/ui/webui/omnibox:mojo_bindings",
"//chrome/browser/ui/webui/read_later:mojo_bindings",
"//chrome/browser/ui/webui/realbox:mojo_bindings",
@@ -437,6 +442,7 @@ static_library("ui") {
"//components/feed:buildflags",
"//components/feed:feature_list",
"//components/feedback",
+ "//components/feedback/content",
"//components/find_in_page",
"//components/flags_ui",
"//components/gcm_driver",
@@ -445,6 +451,7 @@ static_library("ui") {
"//components/history/content/browser",
"//components/history/core/browser",
"//components/history/core/common",
+ "//components/history_clusters/core",
"//components/image_fetcher/core",
"//components/infobars/core",
"//components/invalidation/impl",
@@ -455,7 +462,6 @@ static_library("ui") {
"//components/language/core/common",
"//components/lens",
"//components/lookalikes/core",
- "//components/memories/core",
"//components/metrics_services_manager",
"//components/navigation_metrics",
"//components/net_log",
@@ -465,6 +471,7 @@ static_library("ui") {
"//components/omnibox/browser",
"//components/omnibox/browser:vector_icons",
"//components/onc",
+ "//components/optimization_guide/content/browser",
"//components/optimization_guide/core",
"//components/password_manager/content/browser",
"//components/password_manager/core/browser",
@@ -478,8 +485,7 @@ static_library("ui") {
"//components/permissions",
"//components/policy/core/browser",
"//components/pref_registry",
- "//components/previews/content",
- "//components/previews/core",
+ "//components/privacy_sandbox:privacy_sandbox_prefs",
"//components/proxy_config",
"//components/query_parser",
"//components/reading_list/core",
@@ -519,7 +525,7 @@ static_library("ui") {
"//components/subresource_filter/content/browser",
"//components/subresource_filter/core/browser",
"//components/sync",
- "//components/sync/driver:resources",
+ "//components/sync/driver/resources",
"//components/sync_preferences",
"//components/sync_sessions",
"//components/tab_groups",
@@ -684,6 +690,8 @@ static_library("ui") {
"android/autofill/card_unmask_prompt_view_android.h",
"android/autofill/credit_card_scanner_view_android.cc",
"android/autofill/credit_card_scanner_view_android.h",
+ "android/autofill/save_address_profile_prompt_view_android.cc",
+ "android/autofill/save_address_profile_prompt_view_android.h",
"android/autofill_assistant/autofill_assistant_tab_helper.cc",
"android/autofill_assistant/autofill_assistant_tab_helper.h",
"android/chrome_http_auth_handler.cc",
@@ -727,8 +735,6 @@ static_library("ui") {
"android/infobars/near_oom_infobar.h",
"android/infobars/near_oom_reduction_infobar.cc",
"android/infobars/near_oom_reduction_infobar.h",
- "android/infobars/previews_lite_page_infobar.cc",
- "android/infobars/previews_lite_page_infobar.h",
"android/infobars/reader_mode_infobar.cc",
"android/infobars/reader_mode_infobar.h",
"android/infobars/save_password_infobar.cc",
@@ -782,7 +788,7 @@ static_library("ui") {
"android/tab_model/tab_model_observer_jni_bridge.h",
"android/toolbar/location_bar_model_android.cc",
"android/toolbar/location_bar_model_android.h",
- "android/webid/identity_dialogs_android.cc",
+ "android/webid/webid_dialog_android.cc",
"browser_otr_state_android.cc",
"javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_android.cc",
"javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_android.h",
@@ -822,6 +828,7 @@ static_library("ui") {
deps += [
"//chrome/android:jni_headers",
"//chrome/android/features/dev_ui:buildflags",
+ "//chrome/browser/flags:flags_android",
"//chrome/browser/image_decoder",
"//chrome/browser/resources/webapks:resources",
"//components/autofill_assistant/browser",
@@ -1005,8 +1012,8 @@ static_library("ui") {
"global_error/global_error_service_factory.h",
"global_media_controls/cast_media_notification_item.cc",
"global_media_controls/cast_media_notification_item.h",
- "global_media_controls/cast_media_notification_provider.cc",
- "global_media_controls/cast_media_notification_provider.h",
+ "global_media_controls/cast_media_notification_producer.cc",
+ "global_media_controls/cast_media_notification_producer.h",
"global_media_controls/cast_media_session_controller.cc",
"global_media_controls/cast_media_session_controller.h",
"global_media_controls/media_dialog_delegate.cc",
@@ -1039,8 +1046,8 @@ static_library("ui") {
"global_media_controls/overlay_media_notifications_manager_impl.h",
"global_media_controls/presentation_request_notification_item.cc",
"global_media_controls/presentation_request_notification_item.h",
- "global_media_controls/presentation_request_notification_provider.cc",
- "global_media_controls/presentation_request_notification_provider.h",
+ "global_media_controls/presentation_request_notification_producer.cc",
+ "global_media_controls/presentation_request_notification_producer.h",
"hats/hats_helper.cc",
"hats/hats_helper.h",
"hats/hats_service.cc",
@@ -1309,7 +1316,6 @@ static_library("ui") {
"toolbar/toolbar_actions_bar.h",
"toolbar/toolbar_actions_bar_bubble_delegate.h",
"toolbar/toolbar_actions_bar_delegate.h",
- "toolbar/toolbar_actions_bar_observer.h",
"toolbar/toolbar_actions_model.cc",
"toolbar/toolbar_actions_model.h",
"toolbar/toolbar_actions_model_factory.cc",
@@ -1360,6 +1366,11 @@ static_library("ui") {
"webui/devtools_ui.h",
"webui/devtools_ui_data_source.cc",
"webui/devtools_ui_data_source.h",
+ "webui/download_shelf/download_shelf_page_handler.cc",
+ "webui/download_shelf/download_shelf_page_handler.h",
+ "webui/download_shelf/download_shelf_ui.cc",
+ "webui/download_shelf/download_shelf_ui.h",
+ "webui/download_shelf/download_shelf_ui_embedder.h",
"webui/downloads/downloads_dom_handler.cc",
"webui/downloads/downloads_dom_handler.h",
"webui/downloads/downloads_list_tracker.cc",
@@ -1372,6 +1383,10 @@ static_library("ui") {
"webui/extensions/extensions_ui.h",
"webui/favicon_source.cc",
"webui/favicon_source.h",
+ "webui/feedback/feedback_dialog.cc",
+ "webui/feedback/feedback_dialog.h",
+ "webui/feedback/feedback_handler.cc",
+ "webui/feedback/feedback_handler.h",
"webui/feedback/feedback_ui.cc",
"webui/feedback/feedback_ui.h",
"webui/help/version_updater.h",
@@ -1389,6 +1404,8 @@ static_library("ui") {
"webui/identity_internals_ui.h",
"webui/inspect_ui.cc",
"webui/inspect_ui.h",
+ "webui/internals/user_education/user_education_internals_page_handler_impl.cc",
+ "webui/internals/user_education/user_education_internals_page_handler_impl.h",
"webui/internals/web_app/web_app_internals_page_handler_impl.cc",
"webui/internals/web_app/web_app_internals_page_handler_impl.h",
"webui/managed_ui_handler.cc",
@@ -1397,8 +1414,6 @@ static_library("ui") {
"webui/management/management_ui.h",
"webui/management/management_ui_handler.cc",
"webui/management/management_ui_handler.h",
- "webui/media/media_feeds_ui.cc",
- "webui/media/media_feeds_ui.h",
"webui/media_router/media_router_internals_ui.cc",
"webui/media_router/media_router_internals_ui.h",
"webui/media_router/media_router_internals_webui_message_handler.cc",
@@ -1416,6 +1431,10 @@ static_library("ui") {
"webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h",
"webui/new_tab_page/untrusted_source.cc",
"webui/new_tab_page/untrusted_source.h",
+ "webui/new_tab_page_third_party/new_tab_page_third_party_handler.cc",
+ "webui/new_tab_page_third_party/new_tab_page_third_party_handler.h",
+ "webui/new_tab_page_third_party/new_tab_page_third_party_ui.cc",
+ "webui/new_tab_page_third_party/new_tab_page_third_party_ui.h",
"webui/ntp/app_icon_webui_handler.cc",
"webui/ntp/app_icon_webui_handler.h",
"webui/ntp/app_launcher_handler.cc",
@@ -1576,6 +1595,7 @@ static_library("ui") {
"//chrome/browser/ui/color:mixers",
"//chrome/browser/ui/commander:fuzzy_finder",
"//chrome/browser/ui/webui/app_management:mojo_bindings",
+ "//chrome/browser/ui/webui/internals/user_education:mojo_bindings",
"//chrome/browser/ui/webui/internals/web_app:mojo_bindings",
"//chrome/browser/web_applications/components",
"//chrome/common:buildflags",
@@ -1596,6 +1616,7 @@ static_library("ui") {
"//components/search_provider_logos",
"//components/services/app_service/public/cpp:app_update",
"//components/services/app_service/public/mojom",
+ "//components/soda:constants",
"//components/ui_metrics",
"//components/url_formatter",
"//components/vector_icons",
@@ -1612,10 +1633,16 @@ static_library("ui") {
"//third_party/blink/public/common:headers",
"//third_party/libaddressinput",
"//third_party/libaddressinput:strings",
+ "//ui/base/dragdrop:types",
"//ui/base/dragdrop/mojom",
"//ui/events",
]
- public_deps += [ "//ui/base/dragdrop/mojom:mojom_headers" ]
+ public_deps += [
+ "//build:branding_buildflags",
+ "//ui/base/dragdrop/mojom:mojom_headers",
+ ]
+
+ allow_circular_includes_from += [ "//chrome/browser/media/router" ]
if (use_ozone && !is_chromeos_ash) {
deps += [
@@ -1703,6 +1730,7 @@ static_library("ui") {
"app_list/app_sync_ui_state.h",
"app_list/app_sync_ui_state_factory.cc",
"app_list/app_sync_ui_state_factory.h",
+ "app_list/app_sync_ui_state_observer.cc",
"app_list/app_sync_ui_state_observer.h",
"app_list/app_sync_ui_state_watcher.cc",
"app_list/app_sync_ui_state_watcher.h",
@@ -1782,6 +1810,13 @@ static_library("ui") {
"app_list/search/arc/arc_playstore_search_provider.h",
"app_list/search/arc/arc_playstore_search_result.cc",
"app_list/search/arc/arc_playstore_search_result.h",
+ "app_list/search/arc/fake_recommend_apps_fetcher_delegate.cc",
+ "app_list/search/arc/fake_recommend_apps_fetcher_delegate.h",
+ "app_list/search/arc/recommend_apps_fetcher.cc",
+ "app_list/search/arc/recommend_apps_fetcher.h",
+ "app_list/search/arc/recommend_apps_fetcher_delegate.h",
+ "app_list/search/arc/recommend_apps_fetcher_impl.cc",
+ "app_list/search/arc/recommend_apps_fetcher_impl.h",
"app_list/search/assistant_search_provider.cc",
"app_list/search/assistant_search_provider.h",
"app_list/search/assistant_text_search_provider.cc",
@@ -1794,14 +1829,18 @@ static_library("ui") {
"app_list/search/cros_action_history/cros_action_recorder.h",
"app_list/search/cros_action_history/cros_action_recorder_tab_tracker.cc",
"app_list/search/cros_action_history/cros_action_recorder_tab_tracker.h",
- "app_list/search/file_chip_result.cc",
- "app_list/search/file_chip_result.h",
- "app_list/search/files/drive_zero_state_provider.cc",
- "app_list/search/files/drive_zero_state_provider.h",
+ "app_list/search/files/drive_search_provider.cc",
+ "app_list/search/files/drive_search_provider.h",
"app_list/search/files/file_result.cc",
"app_list/search/files/file_result.h",
+ "app_list/search/files/file_search_provider.cc",
+ "app_list/search/files/file_search_provider.h",
"app_list/search/files/item_suggest_cache.cc",
"app_list/search/files/item_suggest_cache.h",
+ "app_list/search/files/zero_state_drive_provider.cc",
+ "app_list/search/files/zero_state_drive_provider.h",
+ "app_list/search/files/zero_state_file_provider.cc",
+ "app_list/search/files/zero_state_file_provider.h",
"app_list/search/help_app_provider.cc",
"app_list/search/help_app_provider.h",
"app_list/search/launcher_search/launcher_search_icon_image_loader.cc",
@@ -1840,12 +1879,6 @@ static_library("ui") {
"app_list/search/search_result_ranker/app_launch_event_logger_helper.h",
"app_list/search/search_result_ranker/app_launch_predictor.cc",
"app_list/search/search_result_ranker/app_launch_predictor.h",
- "app_list/search/search_result_ranker/app_list_launch_metrics_provider.cc",
- "app_list/search/search_result_ranker/app_list_launch_metrics_provider.h",
- "app_list/search/search_result_ranker/app_list_launch_recorder.cc",
- "app_list/search/search_result_ranker/app_list_launch_recorder.h",
- "app_list/search/search_result_ranker/app_list_launch_recorder_util.cc",
- "app_list/search/search_result_ranker/app_list_launch_recorder_util.h",
"app_list/search/search_result_ranker/app_search_result_ranker.cc",
"app_list/search/search_result_ranker/app_search_result_ranker.h",
"app_list/search/search_result_ranker/chip_ranker.cc",
@@ -1862,20 +1895,8 @@ static_library("ui") {
"app_list/search/search_result_ranker/recurrence_ranker.h",
"app_list/search/search_result_ranker/recurrence_ranker_util.cc",
"app_list/search/search_result_ranker/recurrence_ranker_util.h",
- "app_list/search/search_result_ranker/search_ranking_event_logger.cc",
- "app_list/search/search_result_ranker/search_ranking_event_logger.h",
"app_list/search/search_result_ranker/search_result_ranker.cc",
"app_list/search/search_result_ranker/search_result_ranker.h",
- "app_list/search/settings_shortcut/settings_shortcut_metadata.cc",
- "app_list/search/settings_shortcut/settings_shortcut_metadata.h",
- "app_list/search/settings_shortcut/settings_shortcut_provider.cc",
- "app_list/search/settings_shortcut/settings_shortcut_provider.h",
- "app_list/search/settings_shortcut/settings_shortcut_result.cc",
- "app_list/search/settings_shortcut/settings_shortcut_result.h",
- "app_list/search/zero_state_file_provider.cc",
- "app_list/search/zero_state_file_provider.h",
- "app_list/search/zero_state_file_result.cc",
- "app_list/search/zero_state_file_result.h",
"ash/accessibility/accessibility_controller_client.cc",
"ash/accessibility/accessibility_controller_client.h",
"ash/ambient/ambient_client_impl.cc",
@@ -1923,6 +1944,8 @@ static_library("ui") {
"ash/chrome_launcher_prefs.h",
"ash/chrome_new_window_client.cc",
"ash/chrome_new_window_client.h",
+ "ash/chrome_new_window_delegate_provider.cc",
+ "ash/chrome_new_window_delegate_provider.h",
"ash/chrome_screenshot_grabber.cc",
"ash/chrome_screenshot_grabber.h",
"ash/chrome_screenshot_grabber_test_observer.h",
@@ -1934,6 +1957,10 @@ static_library("ui") {
"ash/clipboard_image_model_request.h",
"ash/clipboard_util.cc",
"ash/clipboard_util.h",
+ "ash/crosapi_new_window_delegate.cc",
+ "ash/crosapi_new_window_delegate.h",
+ "ash/default_pinned_apps.cc",
+ "ash/default_pinned_apps.h",
"ash/holding_space/holding_space_client_impl.cc",
"ash/holding_space/holding_space_client_impl.h",
"ash/holding_space/holding_space_downloads_delegate.cc",
@@ -2066,6 +2093,8 @@ static_library("ui") {
"ash/network/network_state_notifier.h",
"ash/network/tether_notification_presenter.cc",
"ash/network/tether_notification_presenter.h",
+ "ash/notification_badge_color_cache.cc",
+ "ash/notification_badge_color_cache.h",
"ash/projector/projector_client_impl.cc",
"ash/projector/projector_client_impl.h",
"ash/quick_answers/quick_answers_browser_client_impl.cc",
@@ -2086,8 +2115,8 @@ static_library("ui") {
"ash/sharesheet/sharesheet_content_previews.h",
"ash/sharesheet/sharesheet_expand_button.cc",
"ash/sharesheet/sharesheet_expand_button.h",
- "ash/sharesheet/sharesheet_image_decode.cc",
- "ash/sharesheet/sharesheet_image_decode.h",
+ "ash/sharesheet/sharesheet_image_decoder.cc",
+ "ash/sharesheet/sharesheet_image_decoder.h",
"ash/sharesheet/sharesheet_target_button.cc",
"ash/sharesheet/sharesheet_target_button.h",
"ash/system_tray_client.cc",
@@ -2100,8 +2129,8 @@ static_library("ui") {
"ash/test_ime_controller.h",
"ash/vpn_list_forwarder.cc",
"ash/vpn_list_forwarder.h",
- "ash/wallpaper_controller_client.cc",
- "ash/wallpaper_controller_client.h",
+ "ash/wallpaper_controller_client_impl.cc",
+ "ash/wallpaper_controller_client_impl.h",
"ash/window_properties.cc",
"ash/window_properties.h",
"browser_commands_chromeos.cc",
@@ -2166,8 +2195,6 @@ static_library("ui") {
"views/profiles/profile_indicator_icon.h",
"views/relaunch_notification/relaunch_notification_controller_platform_impl_chromeos.cc",
"views/relaunch_notification/relaunch_notification_controller_platform_impl_chromeos.h",
- "views/relaunch_notification/relaunch_notification_metrics.cc",
- "views/relaunch_notification/relaunch_notification_metrics.h",
# On chromeos, file manager extension handles the file open/save dialog.
"views/select_file_dialog_extension.cc",
@@ -2261,16 +2288,20 @@ static_library("ui") {
"webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h",
"webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc",
"webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h",
- "webui/chromeos/emoji/emoji_dialog.cc",
- "webui/chromeos/emoji/emoji_dialog.h",
- "webui/chromeos/emoji/emoji_handler.cc",
- "webui/chromeos/emoji/emoji_handler.h",
- "webui/chromeos/emoji/emoji_picker.cc",
- "webui/chromeos/emoji/emoji_picker.h",
+ "webui/chromeos/emoji/emoji_page_handler.cc",
+ "webui/chromeos/emoji/emoji_page_handler.h",
+ "webui/chromeos/emoji/emoji_ui.cc",
+ "webui/chromeos/emoji/emoji_ui.h",
"webui/chromeos/image_source.cc",
"webui/chromeos/image_source.h",
+ "webui/chromeos/in_session_password_change/base_lock_dialog.cc",
+ "webui/chromeos/in_session_password_change/base_lock_dialog.h",
"webui/chromeos/in_session_password_change/confirm_password_change_handler.cc",
"webui/chromeos/in_session_password_change/confirm_password_change_handler.h",
+ "webui/chromeos/in_session_password_change/lock_screen_network_dialog.cc",
+ "webui/chromeos/in_session_password_change/lock_screen_network_dialog.h",
+ "webui/chromeos/in_session_password_change/lock_screen_network_ui.cc",
+ "webui/chromeos/in_session_password_change/lock_screen_network_ui.h",
"webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc",
"webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h",
"webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc",
@@ -2387,6 +2418,8 @@ static_library("ui") {
"webui/chromeos/login/signin_fatal_error_screen_handler.h",
"webui/chromeos/login/signin_screen_handler.cc",
"webui/chromeos/login/signin_screen_handler.h",
+ "webui/chromeos/login/ssh_configured_handler.cc",
+ "webui/chromeos/login/ssh_configured_handler.h",
"webui/chromeos/login/supervision_transition_screen_handler.cc",
"webui/chromeos/login/supervision_transition_screen_handler.h",
"webui/chromeos/login/sync_consent_screen_handler.cc",
@@ -2459,6 +2492,8 @@ static_library("ui") {
"webui/chromeos/user_image_source.h",
"webui/chromeos/video_source.cc",
"webui/chromeos/video_source.h",
+ "webui/chromeos/vm/vm_ui.cc",
+ "webui/chromeos/vm/vm_ui.h",
"webui/extensions/chromeos/kiosk_apps_handler.cc",
"webui/extensions/chromeos/kiosk_apps_handler.h",
"webui/help/help_utils_chromeos.cc",
@@ -2473,6 +2508,8 @@ static_library("ui") {
"webui/nearby_internals/nearby_internals_http_handler.h",
"webui/nearby_internals/nearby_internals_logs_handler.cc",
"webui/nearby_internals/nearby_internals_logs_handler.h",
+ "webui/nearby_internals/nearby_internals_prefs_handler.cc",
+ "webui/nearby_internals/nearby_internals_prefs_handler.h",
"webui/nearby_internals/nearby_internals_ui.cc",
"webui/nearby_internals/nearby_internals_ui.h",
"webui/nearby_internals/nearby_internals_ui_trigger_handler.cc",
@@ -2638,6 +2675,7 @@ static_library("ui") {
"//ash/components/audio",
"//ash/components/pcie_peripheral",
"//ash/constants",
+ "//ash/content/scanning",
"//ash/keyboard/ui",
"//ash/public/cpp",
"//ash/public/cpp/app_list/vector_icons",
@@ -2665,14 +2703,14 @@ static_library("ui") {
"//chrome/browser/ui/app_list/search/cros_action_history:cros_action_proto",
"//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_event_logger_proto",
"//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_predictor_proto",
- "//chrome/browser/ui/app_list/search/search_result_ranker:app_list_launch_recorder_proto",
"//chrome/browser/ui/app_list/search/search_result_ranker:recurrence_ranker_proto",
- "//chrome/browser/ui/app_list/search/search_result_ranker:search_ranking_event_proto",
"//chrome/browser/ui/webui/app_management:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
+ "//chrome/browser/ui/webui/chromeos/emoji:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
+ "//chrome/browser/ui/webui/chromeos/vm:mojo_bindings",
"//chrome/browser/ui/webui/nearby_share:mojom",
"//chrome/browser/ui/webui/nearby_share/public/mojom",
"//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
@@ -2695,12 +2733,12 @@ static_library("ui") {
"//chromeos/components/multidevice/logging",
"//chromeos/components/network_ui:network_diagnostics_resource_provider",
"//chromeos/components/network_ui:network_health_resource_provider",
+ "//chromeos/components/personalization_app",
"//chromeos/components/phonehub",
"//chromeos/components/phonehub:debug",
"//chromeos/components/print_management",
"//chromeos/components/proximity_auth",
"//chromeos/components/quick_answers",
- "//chromeos/components/scanning",
"//chromeos/components/string_matching",
"//chromeos/components/tether",
"//chromeos/components/web_applications",
@@ -2718,6 +2756,8 @@ static_library("ui") {
"//chromeos/dbus/tpm_manager",
"//chromeos/dbus/tpm_manager:tpm_manager_proto",
"//chromeos/dbus/upstart",
+ "//chromeos/dbus/userdataauth",
+ "//chromeos/dbus/userdataauth:userdataauth_proto",
"//chromeos/disks",
"//chromeos/login/auth",
"//chromeos/login/login_state",
@@ -2750,6 +2790,7 @@ static_library("ui") {
"//components/assist_ranker/proto",
"//components/captive_portal/core",
"//components/consent_auditor:consent_auditor",
+ "//components/digital_asset_links",
"//components/exo",
"//components/full_restore",
"//components/login",
@@ -2851,9 +2892,6 @@ static_library("ui") {
"autofill/payments/webauthn_dialog_model_observer.h",
"autofill/payments/webauthn_dialog_state.h",
"autofill/payments/webauthn_dialog_view.h",
- "avatar_button_error_controller.cc",
- "avatar_button_error_controller.h",
- "avatar_button_error_controller_delegate.h",
"frame/window_frame_util.cc",
"frame/window_frame_util.h",
"passwords/account_storage_auth_helper.cc",
@@ -2941,6 +2979,10 @@ static_library("ui") {
"webui/settings/settings_manage_profile_handler.h",
"webui/settings/system_handler.cc",
"webui/settings/system_handler.h",
+ "webui/signin/enterprise_profile_welcome_handler.cc",
+ "webui/signin/enterprise_profile_welcome_handler.h",
+ "webui/signin/enterprise_profile_welcome_ui.cc",
+ "webui/signin/enterprise_profile_welcome_ui.h",
"webui/signin/inline_login_handler_impl.cc",
"webui/signin/inline_login_handler_impl.h",
"webui/signin/profile_creation_customize_themes_handler.cc",
@@ -3123,12 +3165,21 @@ static_library("ui") {
"cocoa/renderer_context_menu/render_view_context_menu_mac.mm",
"cocoa/renderer_context_menu/render_view_context_menu_mac_cocoa.h",
"cocoa/renderer_context_menu/render_view_context_menu_mac_cocoa.mm",
- "cocoa/rosetta_required_infobar_delegate.h",
- "cocoa/rosetta_required_infobar_delegate.mm",
"cocoa/scoped_menu_bar_lock.h",
"cocoa/scoped_menu_bar_lock.mm",
"cocoa/screentime/fake_webpage_controller.h",
"cocoa/screentime/fake_webpage_controller.mm",
+ "cocoa/screentime/history_bridge.h",
+ "cocoa/screentime/history_bridge.mm",
+ "cocoa/screentime/history_bridge_factory.h",
+ "cocoa/screentime/history_bridge_factory.mm",
+ "cocoa/screentime/history_deleter.h",
+ "cocoa/screentime/history_deleter_impl.h",
+ "cocoa/screentime/history_deleter_impl.mm",
+ "cocoa/screentime/screentime_features.cc",
+ "cocoa/screentime/screentime_features.h",
+ "cocoa/screentime/screentime_policy.cc",
+ "cocoa/screentime/screentime_policy.h",
"cocoa/screentime/tab_helper.h",
"cocoa/screentime/tab_helper.mm",
"cocoa/screentime/webpage_controller.h",
@@ -3191,7 +3242,6 @@ static_library("ui") {
"//extensions/components/native_app_window",
"//third_party/google_toolbox_for_mac",
"//third_party/mozilla",
- "//third_party/widevine/cdm:buildflags",
"//ui/accelerated_widget_mac:accelerated_widget_mac",
]
include_dirs = [ "$target_gen_dir" ]
@@ -3288,6 +3338,7 @@ static_library("ui") {
"webui/version/version_util_win.h",
]
public_deps += [
+ "//build:branding_buildflags",
"//ui/views",
"//ui/views/controls/webview",
]
@@ -3385,14 +3436,6 @@ static_library("ui") {
deps += [ "//ui/gfx/x" ]
}
- if (use_x11) {
- sources += [ "views/frame/native_browser_frame_factory_aurax11.cc" ]
- deps += [
- "//ui/events/devices",
- "//ui/events/devices/x11",
- "//ui/events/platform/x11",
- ]
- }
if (use_ozone) {
if (!is_linux && !is_chromeos_lacros) {
sources += [
@@ -3400,7 +3443,6 @@ static_library("ui") {
"views/frame/browser_desktop_window_tree_host_platform.h",
]
}
- sources += [ "views/frame/native_browser_frame_factory_ozone.cc" ]
}
if (is_linux || is_chromeos_lacros) {
sources += [
@@ -3439,9 +3481,14 @@ static_library("ui") {
if (toolkit_views) {
sources += [
+ "autofill/address_editor_controller.cc",
+ "autofill/address_editor_controller.h",
"autofill/autofill_bubble_base.h",
"autofill/autofill_bubble_controller_base.cc",
"autofill/autofill_bubble_controller_base.h",
+ "autofill/edit_address_profile_dialog_controller.h",
+ "autofill/edit_address_profile_dialog_controller_impl.cc",
+ "autofill/edit_address_profile_dialog_controller_impl.h",
"autofill/payments/local_card_migration_bubble_controller_impl.cc",
"autofill/payments/local_card_migration_bubble_controller_impl.h",
"autofill/payments/local_card_migration_controller_observer.h",
@@ -3517,6 +3564,8 @@ static_library("ui") {
"views/apps/app_info_dialog/app_info_summary_panel.h",
"views/apps/chrome_native_app_window_views.cc",
"views/apps/chrome_native_app_window_views.h",
+ "views/autofill/address_editor_view.cc",
+ "views/autofill/address_editor_view.h",
"views/autofill/autofill_bubble_handler_impl.cc",
"views/autofill/autofill_bubble_handler_impl.h",
"views/autofill/autofill_popup_base_view.cc",
@@ -3525,6 +3574,8 @@ static_library("ui") {
"views/autofill/autofill_popup_view_native_views.h",
"views/autofill/autofill_popup_view_utils.cc",
"views/autofill/autofill_popup_view_utils.h",
+ "views/autofill/edit_address_profile_view.cc",
+ "views/autofill/edit_address_profile_view.h",
"views/autofill/payments/card_unmask_prompt_views.cc",
"views/autofill/payments/card_unmask_prompt_views.h",
"views/autofill/payments/dialog_view_ids.h",
@@ -3649,6 +3700,8 @@ static_library("ui") {
"views/download/download_shelf_context_menu_view.h",
"views/download/download_shelf_view.cc",
"views/download/download_shelf_view.h",
+ "views/download/download_shelf_web_view.cc",
+ "views/download/download_shelf_web_view.h",
"views/download/download_started_animation_views.cc",
"views/dropdown_bar_host.cc",
"views/dropdown_bar_host.h",
@@ -3668,6 +3721,8 @@ static_library("ui") {
"views/extensions/extension_install_blocked_dialog_view.h",
"views/extensions/extension_install_dialog_view.cc",
"views/extensions/extension_install_dialog_view.h",
+ "views/extensions/extension_install_friction_dialog_view.cc",
+ "views/extensions/extension_install_friction_dialog_view.h",
"views/extensions/extension_installed_bubble_view.cc",
"views/extensions/extension_keybinding_registry_views.cc",
"views/extensions/extension_keybinding_registry_views.h",
@@ -3756,6 +3811,7 @@ static_library("ui") {
"views/fullscreen_control/fullscreen_control_view.h",
"views/global_error_bubble_view.cc",
"views/global_error_bubble_view.h",
+ "views/global_media_controls/global_media_controls_types.h",
"views/global_media_controls/media_dialog_view.cc",
"views/global_media_controls/media_dialog_view.h",
"views/global_media_controls/media_dialog_view_observer.h",
@@ -3794,8 +3850,6 @@ static_library("ui") {
"views/javascript_tab_modal_dialog_view_views.h",
"views/layout/interpolating_layout_manager.cc",
"views/layout/interpolating_layout_manager.h",
- "views/load_complete_listener.cc",
- "views/load_complete_listener.h",
"views/location_bar/content_setting_image_view.cc",
"views/location_bar/content_setting_image_view.h",
"views/location_bar/cookie_controls_bubble_view.cc",
@@ -3849,8 +3903,6 @@ static_library("ui") {
"views/media_router/cast_dialog_view.h",
"views/media_router/cast_toolbar_button.cc",
"views/media_router/cast_toolbar_button.h",
- "views/media_router/cloud_services_dialog_view.cc",
- "views/media_router/cloud_services_dialog_view.h",
"views/media_router/media_remoting_dialog_view.cc",
"views/media_router/media_remoting_dialog_view.h",
"views/media_router/media_router_dialog_controller_views.cc",
@@ -3890,8 +3942,13 @@ static_library("ui") {
"views/omnibox/webui_omnibox_popup_view.h",
"views/overlay/back_to_tab_image_button.cc",
"views/overlay/back_to_tab_image_button.h",
+ "views/overlay/back_to_tab_label_button.cc",
+ "views/overlay/back_to_tab_label_button.h",
"views/overlay/close_image_button.cc",
"views/overlay/close_image_button.h",
+ "views/overlay/constants.h",
+ "views/overlay/hang_up_button.cc",
+ "views/overlay/hang_up_button.h",
"views/overlay/overlay_window_views.cc",
"views/overlay/overlay_window_views.h",
"views/overlay/playback_image_button.cc",
@@ -3900,6 +3957,10 @@ static_library("ui") {
"views/overlay/resize_handle_button.h",
"views/overlay/skip_ad_label_button.cc",
"views/overlay/skip_ad_label_button.h",
+ "views/overlay/toggle_camera_button.cc",
+ "views/overlay/toggle_camera_button.h",
+ "views/overlay/toggle_microphone_button.cc",
+ "views/overlay/toggle_microphone_button.h",
"views/overlay/track_image_button.cc",
"views/overlay/track_image_button.h",
"views/page_action/page_action_icon_container.cc",
@@ -3925,6 +3986,10 @@ static_library("ui") {
"views/page_info/page_info_bubble_view_base.h",
"views/page_info/page_info_hover_button.cc",
"views/page_info/page_info_hover_button.h",
+ "views/page_info/page_info_main_view.cc",
+ "views/page_info/page_info_main_view.h",
+ "views/page_info/page_info_new_bubble_view.cc",
+ "views/page_info/page_info_new_bubble_view.h",
"views/page_info/permission_icon.cc",
"views/page_info/permission_icon.h",
"views/page_info/permission_selector_row.cc",
@@ -3932,6 +3997,8 @@ static_library("ui") {
"views/page_info/permission_selector_row_observer.h",
"views/page_info/safety_tip_page_info_bubble_view.cc",
"views/page_info/safety_tip_page_info_bubble_view.h",
+ "views/page_info/security_information_view.cc",
+ "views/page_info/security_information_view.h",
"views/passwords/account_chooser_dialog_view.cc",
"views/passwords/account_chooser_dialog_view.h",
"views/passwords/auto_signin_first_run_dialog_view.cc",
@@ -4117,6 +4184,12 @@ static_library("ui") {
"views/tabs/tab_group_views.h",
"views/tabs/tab_hover_card_bubble_view.cc",
"views/tabs/tab_hover_card_bubble_view.h",
+ "views/tabs/tab_hover_card_controller.cc",
+ "views/tabs/tab_hover_card_controller.h",
+ "views/tabs/tab_hover_card_metrics.cc",
+ "views/tabs/tab_hover_card_metrics.h",
+ "views/tabs/tab_hover_card_thumbnail_observer.cc",
+ "views/tabs/tab_hover_card_thumbnail_observer.h",
"views/tabs/tab_icon.cc",
"views/tabs/tab_icon.h",
"views/tabs/tab_search_button.cc",
@@ -4149,8 +4222,6 @@ static_library("ui") {
"views/toolbar/app_menu.h",
"views/toolbar/back_forward_button.cc",
"views/toolbar/back_forward_button.h",
- "views/toolbar/browser_actions_container.cc",
- "views/toolbar/browser_actions_container.h",
"views/toolbar/browser_app_menu_button.cc",
"views/toolbar/browser_app_menu_button.h",
"views/toolbar/chrome_labs_bubble_view.cc",
@@ -4161,10 +4232,10 @@ static_library("ui") {
"views/toolbar/chrome_labs_button.h",
"views/toolbar/chrome_labs_item_view.cc",
"views/toolbar/chrome_labs_item_view.h",
- "views/toolbar/extension_toolbar_menu_view.cc",
- "views/toolbar/extension_toolbar_menu_view.h",
"views/toolbar/home_button.cc",
"views/toolbar/home_button.h",
+ "views/toolbar/read_later_toolbar_button.cc",
+ "views/toolbar/read_later_toolbar_button.h",
"views/toolbar/reload_button.cc",
"views/toolbar/reload_button.h",
"views/toolbar/toolbar_account_icon_container_view.cc",
@@ -4258,10 +4329,12 @@ static_library("ui") {
"views/webauthn/webauthn_hover_button.h",
"views/webauthn/webauthn_icon_view.cc",
"views/webauthn/webauthn_icon_view.h",
- "views/webid/webid_permission_dialog.cc",
- "views/webid/webid_permission_dialog.h",
- "views/webid/webid_signin_window.cc",
- "views/webid/webid_signin_window.h",
+ "views/webid/webid_dialog_views.cc",
+ "views/webid/webid_dialog_views.h",
+ "views/webid/webid_permission_view.cc",
+ "views/webid/webid_permission_view.h",
+ "views/webid/webid_signin_page_view.cc",
+ "views/webid/webid_signin_page_view.h",
"views/window_name_prompt.cc",
"webauthn/account_hover_list_model.cc",
"webauthn/account_hover_list_model.h",
@@ -4297,6 +4370,7 @@ static_library("ui") {
"//components/ui_devtools/views",
"//device/vr/buildflags:buildflags",
"//services/media_session/public/mojom",
+ "//ui/base/dragdrop:types",
"//ui/gfx/geometry",
"//ui/views:buildflags",
]
@@ -4567,6 +4641,8 @@ static_library("ui") {
"views/extensions/settings_overridden_dialog_view.h",
"web_applications/app_browser_controller.cc",
"web_applications/app_browser_controller.h",
+ "web_applications/draggable_region_host_impl.cc",
+ "web_applications/draggable_region_host_impl.h",
"web_applications/share_target_utils.cc",
"web_applications/share_target_utils.h",
"web_applications/system_web_app_ui_utils.cc",
@@ -4783,6 +4859,8 @@ static_library("test_support") {
"passwords/settings/password_ui_view_mock.h",
"toolbar/test_toolbar_action_view_controller.cc",
"toolbar/test_toolbar_action_view_controller.h",
+ "toolbar/test_toolbar_actions_bar_bubble_delegate.cc",
+ "toolbar/test_toolbar_actions_bar_bubble_delegate.h",
]
public_deps = [ ":ui" ]
deps = [
@@ -4827,8 +4905,6 @@ static_library("test_support") {
]
sources += [
"extensions/extension_action_test_helper.h",
- "views/extensions/extension_action_test_helper_views.cc",
- "views/extensions/extension_action_test_helper_views.h",
"views/extensions/extensions_menu_test_util.cc",
"views/extensions/extensions_menu_test_util.h",
"views/find_bar_host_unittest_util_views.cc",
@@ -4857,6 +4933,8 @@ static_library("test_support") {
"exclusive_access/fullscreen_controller_state_tests.h",
"global_error/global_error_waiter.cc",
"global_error/global_error_waiter.h",
+ "global_media_controls/test_helper.cc",
+ "global_media_controls/test_helper.h",
"hats/mock_hats_service.cc",
"hats/mock_hats_service.h",
"passwords/credential_manager_dialog_controller_mock.cc",
@@ -4876,6 +4954,7 @@ static_library("test_support") {
]
deps += [
"//chrome/test:test_support_ui",
+ "//components/media_message_center:media_message_center",
"//components/signin/core/browser",
"//components/signin/public/identity_manager",
"//components/ukm:test_support",
diff --git a/chromium/chrome/browser/ui/android/default_browser_promo/BUILD.gn b/chromium/chrome/browser/ui/android/default_browser_promo/BUILD.gn
index 50f19bbd013..6f28d07724e 100644
--- a/chromium/chrome/browser/ui/android/default_browser_promo/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/default_browser_promo/BUILD.gn
@@ -8,7 +8,6 @@ android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDeps.java",
"java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java",
- "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java",
"java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java",
]
deps = [
diff --git a/chromium/chrome/browser/ui/android/favicon/BUILD.gn b/chromium/chrome/browser/ui/android/favicon/BUILD.gn
index 443859bcdb2..00c79c5eed0 100644
--- a/chromium/chrome/browser/ui/android/favicon/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/favicon/BUILD.gn
@@ -13,7 +13,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/util:java",
"//components/browser_ui/util/android:java",
diff --git a/chromium/chrome/browser/ui/android/layouts/BUILD.gn b/chromium/chrome/browser/ui/android/layouts/BUILD.gn
index de0417084a3..47ffb177d1f 100644
--- a/chromium/chrome/browser/ui/android/layouts/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/layouts/BUILD.gn
@@ -8,6 +8,7 @@ android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessor.java",
"java/src/org/chromium/chrome/browser/layouts/EventFilter.java",
+ "java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserver.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutManager.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java",
"java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java",
@@ -25,7 +26,6 @@ android_library("java") {
deps = [
"third_party/float_property:java",
"//base:base_java",
- "//base:jni_java",
"//components/browser_ui/widget/android:java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//ui/android:ui_java",
@@ -57,6 +57,7 @@ java_library("junit") {
sources = [
"java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessorUnitTest.java",
+ "java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserverTest.java",
"java/src/org/chromium/chrome/browser/layouts/animation/CompositorAnimationHandlerTest.java",
"java/src/org/chromium/chrome/browser/layouts/animation/CompositorAnimatorTest.java",
]
diff --git a/chromium/chrome/browser/ui/android/night_mode/BUILD.gn b/chromium/chrome/browser/ui/android/night_mode/BUILD.gn
new file mode 100644
index 00000000000..ddb258ca5a4
--- /dev/null
+++ b/chromium/chrome/browser/ui/android/night_mode/BUILD.gn
@@ -0,0 +1,87 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+import("//chrome/browser/buildflags.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java",
+ "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java",
+ "java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java",
+ "java/src/org/chromium/chrome/browser/night_mode/NightModeStateProvider.java",
+ "java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java",
+ "java/src/org/chromium/chrome/browser/night_mode/PowerSavingModeMonitor.java",
+ "java/src/org/chromium/chrome/browser/night_mode/RemoteViewsWithNightModeInflater.java",
+ "java/src/org/chromium/chrome/browser/night_mode/SystemNightModeMonitor.java",
+ "java/src/org/chromium/chrome/browser/night_mode/ThemeType.java",
+ "java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java",
+ "java/src/org/chromium/chrome/browser/night_mode/settings/RadioButtonGroupThemePreference.java",
+ "java/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragment.java",
+ ]
+
+ deps = [
+ ":java_resources",
+ "//base:base_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/preferences:java",
+ "//chrome/browser/profiles/android:java",
+ "//components/browser_ui/settings/android:java",
+ "//components/browser_ui/widget/android:java",
+ "//components/prefs/android:java",
+ "//components/user_prefs/android:java",
+ "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/androidx:androidx_annotation_annotation_java",
+ "//third_party/androidx:androidx_preference_preference_java",
+ "//ui/android:ui_utils_java",
+ ]
+ resources_package = "org.chromium.chrome.browser.night_mode"
+}
+
+android_resources("java_resources") {
+ sources = [
+ "java/res/layout/radio_button_group_theme_preference.xml",
+ "java/res/xml/theme_preferences.xml",
+ ]
+
+ deps = [
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//components/browser_ui/styles/android:java_resources",
+ ]
+}
+
+android_library("night_mode_java_test_support") {
+ testonly = true
+ sources = [ "java/src/org/chromium/chrome/browser/night_mode/ChromeNightModeTestUtils.java" ]
+ deps = [
+ ":java",
+ "//chrome/browser/preferences:java",
+ ]
+}
+
+android_library("javatests") {
+ testonly = true
+ sources = [ "java/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragmentTest.java" ]
+
+ deps = [
+ ":java",
+ ":java_resources",
+ ":night_mode_java_test_support",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/preferences:java",
+ "//chrome/browser/settings:java",
+ "//chrome/browser/settings:test_support_java",
+ "//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/widget/android:java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/androidx:androidx_test_runner_java",
+ "//third_party/junit",
+ "//ui/android:ui_java_test_support",
+ ]
+
+ resources_package = "org.chromium.chrome.browser.night_mode"
+}
diff --git a/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 0ec96780992..e577eb6a135 100644
--- a/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -570,6 +570,9 @@ CHAR-LIMIT guidelines:
<message name="IDS_PASSWORD_ENTRY_EDIT_DELETION_DIALOG_BODY" desc="Text explaining the user that deleting the credential that they are viewing will not remove their account on the reaspective website.">
Deleting this password will not delete your account on <ph name="SITE">%1$s<ex>example.com</ex></ph>
</message>
+ <message name="IDS_PASSWORD_CHECK_DELETE_CREDENTIAL_DIALOG_BODY" desc="The body of a prompt to confirm that the user intends to delete the stored password.">
+ Deleting this password will not delete your account on <ph name="SITE">%1$s<ex>example.com</ex></ph>. Change your password or delete your account on <ph name="SITE">%1$s<ex>example.com</ex></ph> to keep it safe from others.
+ </message>
<message name="IDS_PASSWORD_ENTRY_EDIT_DELETE_CREDENTIAL_DIALOG_TITLE" desc="The title of a prompt to confirm that the user intends to delete the stored password.">
Delete password?
</message>
@@ -588,6 +591,9 @@ CHAR-LIMIT guidelines:
<message name="IDS_PASSWORD_ENTRY_VIEWER_PASSWORD" desc='Title preceding password on password entry viewer.'>
Password
</message>
+ <message name="IDS_PASSWORD_VIA_FEDERATION" desc="Text for federated credential's value.">
+ with <ph name="PROVIDER">%1$s<ex>example.com</ex></ph>
+ </message>
<message name="IDS_PASSWORD_ENTRY_VIEWER_COPY_STORED_SITE" desc='Content description for the button that copies the stored site.'>
Copy URL
</message>
@@ -743,25 +749,10 @@ CHAR-LIMIT guidelines:
Darken websites
</message>
- <!-- Privacy preferences -->
- <message name="IDS_PREFS_PRIVACY" desc="Title for the Privacy preferences. [CHAR-LIMIT=32]">
- Privacy
- </message>
+ <!-- Privacy and security preferences -->
<message name="IDS_PREFS_PRIVACY_SECURITY" desc="Title for the Privacy and Security preferences. [CHAR-LIMIT=32]">
Privacy and security
</message>
- <message name="IDS_SAFE_BROWSING_SCOUT_REPORTING_TITLE" desc="Title for checkbox that controls reporting data to detect bad apps/sites. Please ensure ‘Safe Browsing’ in this message matches the ‘Safe Browsing’ settings title.">
- Help improve Chrome security
- </message>
- <message name="IDS_SAFE_BROWSING_SCOUT_REPORTING_SUMMARY" desc="Body text for Chrome setting under 'Help Improve Safe Browsing'. This feature sends small amounts of data to Google about potentially-dangerous pages to help Safe Browsing improve Chrome's protection against malware and phishing.">
- To detect dangerous apps and sites, Chrome sends URLs of some pages you visit, limited system information, and some page content to Google
- </message>
- <message name="IDS_SAFE_BROWSING_TITLE" desc="Title for safe browsing.">
- Safe Browsing (protects you and your device from dangerous sites)
- </message>
- <message name="IDS_SAFE_BROWSING_SUMMARY" desc="Summary for safe browsing.">
- Sends URLs of some pages you visit to Google, when your security is at risk
- </message>
<message name="IDS_CONTEXTUAL_SEARCH_TITLE" desc="Name for the Contextual Search feature, which allows users to search for a term in a web page by tapping on it.">
Touch to Search
</message>
@@ -914,12 +905,18 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY" desc="A text for the basic tab explaining browsing history.">
Clears history and autocompletions in the address bar.
</message>
+ <message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY_SYNCED_NO_LINK" desc="A text for the basic tab explaining browsing history for users with history sync. This version is shown when the link to MyActivity is displayed separately.">
+ Clears history from all signed-in devices.
+ </message>
<message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY_SIGNED_IN" desc="A text explaining other forms of activity for signed in users.">
Clears history and autocompletions in the address bar. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK">&lt;link&gt;</ph>myactivity.google.com<ph name="END_LINK">&lt;/link&gt;</ph>.
</message>
<message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY_SYNCED" desc="A text for the basic tab explaining browsing history for users with history sync.">
Clears history from all signed-in devices. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK">&lt;link&gt;</ph>myactivity.google.com<ph name="END_LINK">&lt;/link&gt;</ph>.
</message>
+ <message name="IDS_CLEAR_SEARCH_HISTORY_LINK" desc="Text informing the user that they can clear search history and other data using MyActivity.">
+ To clear <ph name="BEGIN_LINK1">&lt;link1&gt;</ph>search<ph name="END_LINK1">&lt;/link1&gt;</ph> or other forms of history, visit <ph name="BEGIN_LINK2">&lt;link2&gt;</ph>My Google Activity<ph name="END_LINK2">&lt;/link2&gt;</ph>
+ </message>
<message name="IDS_CLEAR_PASSWORDS_TITLE" desc="Title for Clear Passwords in Clear Browsing Data preference">
Saved passwords
</message>
@@ -1236,8 +1233,23 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_LANGUAGES_EXPLICIT_ASK_TITLE" desc="Title of the dialog that explicitly asks the user which languages they can read.">
What languages do you read?
</message>
+ <message name="IDS_LANGUAGES_SRP_TITLE" desc="Title of the dialog that explicitly asks the user what language they want Chrome on Android to be in.">
+ Pick Chrome’s language
+ </message>
+ <message name="IDS_LANGUAGES_SRP_SUBTITLE" desc="Subtitle warning a user that the language of their keyboard will not change if they change the application language of Chrome on Android.">
+ Your keyboard won’t change
+ </message>
+ <message name="IDS_LANGUAGES_SRP_CANCEL_TITLE" desc="Text on button to cancel the language picker dialog and not change the application language of Chrome on Android.">
+ No thanks
+ </message>
+ <message name="IDS_LANGUAGES_SRP_ACCEPT_TITLE" desc="Text on button to confirm changing the application language of Chrome on Android.">
+ Change language
+ </message>
+ <message name="IDS_LANGUAGES_SRP_LOADING_TEXT" desc="Text to display while a language pack is being downloaded.">
+ Loading <ph name="LANG">%1$s<ex>Hindi</ex></ph>
+ </message>
<message name="IDS_LANGUAGES_SPLIT_DOWNLOADING" desc="Text to display next to a language when it is being downloaded to use as Chrome's UI. [CHAR-LIMIT=32]">
- Downloading <ph name="LANG">%1$s<ex>Hindi</ex></ph>…
+ Downloading…
</message>
<message name="IDS_LANGUAGES_SPLIT_READY" desc="Text to display when a language pack has been downloaded. The user needs to restart Chrome to use the new language as Chrome's UI.">
Language ready, restart <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph>
@@ -1399,7 +1411,7 @@ Your Google account may have other forms of browsing history like searches and a
<!-- Download later -->
<message name="IDS_DOWNLOAD_LATER_DIALOG_TITLE" desc="Title of the download later dialog that let the user to choose the time to download.">
- Choose when to download
+ Download later instead?
</message>
<message name="IDS_DOWNLOAD_LATER_DIALOG_SUBTITLE" desc="Subtitle of the download later dialog that let the user to choose the time to download.">
You'll see a notification when this file is ready
@@ -1422,6 +1434,24 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_DOWNLOAD_LATER_PROMPT_ENABLED_TITLE" desc="A setting text to ask whether to show a dialog about when to download.">
Ask when to save files
</message>
+ <message name="IDS_DOWNLOAD_LATER_SLOW_NETWORK_SUBTITLE" desc="A subtitle in the download later dialog to inform the user about slow network connection.">
+ Your <ph name="CONNECTION_TYPE">%1$s<ex>2G</ex></ph> connection might slow down your download
+ </message>
+ <message name="IDS_DOWNLOAD_LATER_2G_CONNECTION" desc="2G connection type.">
+ 2G
+ </message>
+ <message name="IDS_DOWNLOAD_LATER_BLUETOOTH_CONNECTION" desc="Bluetooth connection type.">
+ Bluetooth
+ </message>
+ <message name="IDS_DOWNLOAD_LATER_WIFI_CONNECTION" desc="WIFI connection type.">
+ Wi-Fi
+ </message>
+ <message name="IDS_DOWNLOAD_LATER_LARGE_FILE_SUBTITLE" desc="A subtitle in the download later dialog to inform the user about large download file size.">
+ This file is large (<ph name="FILE_SIZE">%1$s<ex>300MB</ex></ph>)
+ </message>
+ <message name="IDS_DOWNLOAD_LATER_DIALOG_POSITIVE_BUTTON_TEXT" desc="The text of positive button on the download later dialog.">
+ Done
+ </message>
<!-- Downloads location -->
<message name="IDS_DOWNLOADS_LOCATION_SELECTOR_TITLE" desc="Title of the preference that allows the user to select which of the folders they would like to make the default location to save their downloads.">
@@ -1674,9 +1704,6 @@ Your Google account may have other forms of browsing history like searches and a
Tabs that you've opened in Chrome on your other devices will appear here.
</message>
- <message name="IDS_SIGN_IN_SYNC" desc="Sync preference title in signed-in prefs and prefix for notification related to sync [CHAR-LIMIT=32]">
- Sync
- </message>
<message name="IDS_SEARCH_AND_BROWSE_CATEGORY" desc="Category to show the search and browse improvement toggle. [CHAR-LIMT=32]">
Search and browse
</message>
@@ -1687,7 +1714,7 @@ Your Google account may have other forms of browsing history like searches and a
Sync everything
</message>
<message name="IDS_SYNC_AUTOFILL" desc="Title for preference which enables sync'ing of autofill. [CHAR-LIMT=32]">
- Autofill
+ Addresses and more
</message>
<message name="IDS_SYNC_BOOKMARKS" desc="Title for preference which enables sync'ing of bookmarks. [CHAR-LIMT=32]">
Bookmarks
@@ -1705,7 +1732,7 @@ Your Google account may have other forms of browsing history like searches and a
Settings
</message>
<message name="IDS_SYNC_PAYMENTS_INTEGRATION" desc="Title for preference which enables import of Google Pay data for Autofill. 'Google Pay' should not be translated as it is the product name.">
- Credit cards and addresses using Google Pay
+ Payment methods and addresses using Google Pay
</message>
<message name="IDS_SYNC_ENCRYPTION" desc="Preference category name for sync encryption. [CHAR-LIMT=32]">
Encryption
@@ -1717,7 +1744,7 @@ Your Google account may have other forms of browsing history like searches and a
Encryption
</message>
<message name="IDS_SYNC_PASSPHRASE_TYPE_KEYSTORE" desc="Option to encrypt only passwords, using your Google credentials.">
- Encrypt passwords with Google credentials
+ Encrypt synced passwords with your Google Account
</message>
<message name="IDS_SYNC_PASSPHRASE_TYPE_FROZEN" desc="Option to encrypt sync data, using your Google password frozen on the substituted date.">
Encrypt synced data with Google password as of <ph name="TIME">%1$s<ex>Oct 3, 2014</ex></ph>
@@ -1837,7 +1864,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Sync isn't working
</message>
<message name="IDS_PASSWORD_SYNC_ERROR_SUMMARY" desc="Short message shown in various UIs (e.g. Sync Error Card body) to inform that passwords can't be synced (due to missing trusted vault keys). [CHAR-LIMIT=32]">
- Error syncing passwords
+ Password sync isn't working
</message>
<message name="IDS_SYNC_SETTINGS_NOT_CONFIRMED_TITLE" desc="Title of the error message shown when sync setup was not complete. [CHAR-LIMIT=60]">
Initial sync setup not finished
@@ -1848,11 +1875,14 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_HINT_SYNC_AUTH_ERROR" desc="Hint message to resolve sync auth error.">
Sign in again to start sync
</message>
- <message name="IDS_HINT_SYNC_RETRIEVE_KEYS" desc="Hint message to resolve sync encryption error.">
- Fix now
+ <message name="IDS_HINT_SYNC_RETRIEVE_KEYS_FOR_EVERYTHING" desc="Hint message to resolve sync encryption error, required to resume sync.">
+ To start sync, verify it's you
+ </message>
+ <message name="IDS_HINT_SYNC_RETRIEVE_KEYS_FOR_PASSWORDS" desc="Hint message to resolve sync encryption error, required to resume syncing passwords.">
+ To sync your passwords, verify it's you
</message>
<message name="IDS_HINT_PASSPHRASE_REQUIRED" desc="Hint message to resolve passphrase required error.">
- Enter your passphrase to start sync
+ To start sync, enter your passphrase
</message>
<message name="IDS_HINT_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION" desc="The error message to display when sign-in was interrupted and the user didn't review the sync settings.">
Choose what to sync below
@@ -1880,6 +1910,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_AUTH_ERROR_CARD_BUTTON" desc="Button text for auth error in sync error cards.">
Sign in again
</message>
+ <message name="IDS_TRUSTED_VAULT_ERROR_CARD_BUTTON" desc="Button text for trusted vault error in sync error cards.">
+ Verify it's you
+ </message>
<!-- Sync error strings -->
<message name="IDS_SYNC_ERROR_GENERIC" desc="Sync error string for generic error. [CHAR-LIMIT=80]">
@@ -1946,9 +1979,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_TOP_BAR_SCREEN_POSITION" desc="Accessibility label to inform users about the InfoBar location">
Options available near top of the screen
</message>
- <message name="IDS_PREVIEWS_INFOBAR_ACCESSIBILITY_TITLE" desc="Accessibility label to inform users about the InfoBar notifying the user that mobile data usage was reduced and the page was shown faster by showing a preview version of the web page instead of the full page.">
- Simplified page to save data and load faster.
- </message>
<!-- DuplicateDownloadInfoBar -->
<message name="IDS_DUPLICATE_DOWNLOAD_INFOBAR_TEXT" desc="Prompt text for the confirmation dialog asking whether the user really wants to download a file when there already exists a file with the same name">
@@ -2003,13 +2033,13 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<ph name="MESSAGE">%1$s<ex>Downloading file (200 MB)</ex></ph> <ph name="LINK_NAME">%2$s<ex>Details</ex></ph> button
</message>
<message name="IDS_DOWNLOAD_SCHEDULED_ON_WIFI" desc="Label describing that the download was scheduled to start on Wi-Fi.">
- Download will start on Wi-Fi.
+ You’ll see a notification when this download starts on Wi-Fi.
</message>
<message name="IDS_DOWNLOAD_SCHEDULED_ON_DATE" desc="Label describing that the download was scheduled to start at a later date.">
- Download will start on <ph name="date">%1$s<ex>Feb 28 2020</ex></ph>.
+ You’ll see a notification when this download starts on <ph name="date">%1$s<ex>Feb 28 2020</ex></ph>.
</message>
<message name="IDS_DOWNLOAD_SCHEDULED_ON_TIME" desc="Label describing that the download was scheduled to start at a later time.">
- Download will start at <ph name="time">%1$s<ex>8:30PM</ex></ph>.
+ You’ll see a notification when this download starts at <ph name="time">%1$s<ex>8:30PM</ex></ph>.
</message>
<!-- Inline Update Infobar -->
@@ -2241,20 +2271,20 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_IPH_PWA_INSTALL_AVAILABLE_TEXT" desc="The in-product-help message for PWAs that can be installed to the device.">
Install this app
</message>
- <message name="IDS_IPH_BUBBLE_ADD_TO_HOME_SCREEN" desc="The in-product-help message encouraging users to add a commonly visited webpage to the home screen.">
+ <message name="IDS_IPH_BUBBLE_ADD_TO_HOME_SCREEN" desc="The in-product-help text bubble message encouraging users to add a commonly visited webpage to the home screen.">
To get here quicker, add this page to your Home screen
</message>
- <message name="IDS_IPH_BUBBLE_ADD_TO_HOME_SCREEN_ACCESSIBILITY" desc="The in-product-help message encouraging users to add a commonly visited webpage to the home screen. Used when a screen reader is turned. 'More options' should match TC ID 8110367050267853536.">
+ <message name="IDS_IPH_BUBBLE_ADD_TO_HOME_SCREEN_ACCESSIBILITY" desc="The in-product-help text bubble message encouraging users to add a commonly visited webpage to the home screen. Used when a screen reader is turned. 'More options' should match TC ID 8110367050267853536.">
To get here quicker, add this page to your Home screen from the More options button
</message>
- <message name="IDS_IPH_INFOBAR_ADD_TO_HOME_SCREEN_TITLE" desc="The title of in-product-help infobar encouraging users to add a commonly visited webpage to the home screen.">
- Get to this site quicker
+ <message name="IDS_IPH_MESSAGE_ADD_TO_HOME_SCREEN_TITLE" desc="The title of in-product-help message encouraging users to add a commonly visited webpage to the home screen.">
+ Add to Home screen
</message>
- <message name="IDS_IPH_INFOBAR_ADD_TO_HOME_SCREEN_DESCRIPTION" desc="The description of in-product-help infobar encouraging users to add a commonly visited webpage to the home screen. Shown on phones.">
- Add this site to your phone’s Home screen so you can get here more easily
+ <message name="IDS_IPH_MESSAGE_ADD_TO_HOME_SCREEN_DESCRIPTION" desc="The description of in-product-help message encouraging users to add a commonly visited webpage to the home screen.">
+ Get to this site quicker next time
</message>
- <message name="IDS_IPH_INFOBAR_ADD_TO_HOME_SCREEN_DESCRIPTION_TABLET" desc="The description of in-product-help infobar encouraging users to add a commonly visited webpage to the home screen. Shown on tablets.">
- Add this site to your tablet’s Home screen so you can get here more easily
+ <message name="IDS_IPH_MESSAGE_ADD_TO_HOME_SCREEN_ACTION" desc="The Add button in the in-product help message encouraging users to add a commonly visited webpage to the home screen.">
+ Add
</message>
<message name="IDS_PWA_INSTALL_BOTTOM_SHEET_ACCESSIBILITY" desc="The content description for the bottom sheet install UI.">
Install this app
@@ -2276,9 +2306,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_PAGE_INFO_OFFLINE_PAGE_NOT_TRUSTED_WITHOUT_DATE" desc="Additional message to be shown in the page info bubble, when the offline page shown is not trusted. The offline page creation date will not be displayed.">
This page may differ from the online version.
</message>
- <message name="IDS_PAGE_INFO_PREVIEW_LOAD_ORIGINAL" desc="This text, when clicked, loads the original page from its origin without any treatments. This text is shown in the page info bubble when the currently viewed page has been modified to be a lighter and faster version of the original page.">
- <ph name="BEGIN_LINK">&lt;link&gt;</ph>Load original page<ph name="END_LINK">&lt;/link&gt;</ph> from <ph name="DOMAIN_NAME">%1$s<ex>google.com</ex></ph>
- </message>
<message name="IDS_PAGE_INFO_CONNECTION_PAINT_PREVIEW" desc="Message to display in the page info bubble when viewing a preview of a page.">
You are viewing a preview of this page
</message>
@@ -2307,9 +2334,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
</message>
<!-- Download UI -->
- <message name="IDS_DOWNLOAD_NOTIFICATION_COMPLETED" desc="Download notification to be displayed when a download completes.">
- Download complete
- </message>
<message name="IDS_DOWNLOAD_NOTIFICATION_PENDING" desc="Download notification to be displayed when a download has been scheduled but has not started being fetched from the network.">
Download pending…
</message>
@@ -2765,6 +2789,36 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_NTP_MANAGE_REACTIONS" desc="Content description to manage feed reactions from the feed header overflow menu.">
Manage reactions
</message>
+ <message name="IDS_NTP_MANAGE_AUTOPLAY" desc="Content description to manage feed autoplay from the feed header overflow menu.">
+ Manage autoplay
+ </message>
+ <message name="IDS_NTP_MANAGE_FEED" desc="Menu item to manage feed settings from the feed header overflow menu.">
+ Manage
+ </message>
+ <message name="IDS_FEED_MANAGE_ACTIVITY" desc="Menu item to manage my activity from the feed header overflow menu.">
+ Activity
+ </message>
+ <message name="IDS_FEED_MANAGE_ACTIVITY_DESCRIPTION" desc="Content description to manage my activity from the feed header overflow menu.">
+ Control your Google accounts data
+ </message>
+ <message name="IDS_FEED_MANAGE_INTERESTS" desc="Menu item to manage settings from the feed header overflow menu.">
+ Interests
+ </message>
+ <message name="IDS_FEED_MANAGE_INTERESTS_DESCRIPTION" desc="Content description to manage settings from the feed header overflow menu.">
+ Manage the topics that you're interested in
+ </message>
+ <message name="IDS_FEED_MANAGE_HIDDEN" desc="Menu item to manage hiding and unhiding topics.">
+ Hidden
+ </message>
+ <message name="IDS_FEED_MANAGE_HIDDEN_DESCRIPTION" desc="Content description to manage hiding and unhiding topics.">
+ Hide and unhide topics
+ </message>
+ <message name="IDS_FEED_MANAGE_FOLLOWING" desc="Menu item to manage followed sites.">
+ Following
+ </message>
+ <message name="IDS_FEED_MANAGE_FOLLOWING_DESCRIPTION" desc="Content description to manage followed sites.">
+ Manage the sites that you're following
+ </message>
<message name="IDS_NTP_TURN_OFF_FEED" desc="Content description to turn off the feed from the feed header overflow menu.">
Turn off
</message>
@@ -2783,6 +2837,8 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Discover by Google - off
</message>
+ <message name="IDS_NTP_FOR_YOU" desc="Title in the feed header for interest-based feed.">For you</message>
+ <message name="IDS_NTP_FOLLOWING" desc="Title in the feed header for user-customized following feed.">Following</message>
<message name="IDS_NTP_FEED_MENU_IPH" desc="In-product help that points at the menu icon for the news feed on Chrome's new tab page. This string instructs the user to open the menu for settings that let them control the content that appears on the feed.">
Control your stories and activity here
</message>
@@ -2978,6 +3034,12 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_MENU_FOLLOWING" desc="Menu item indicating the current website is followed, allowing users to unfollow the current website. [CHAR-LIMIT=27]">
Following
</message>
+ <message name="IDS_MENU_ITEM_REQUEST_DESKTOP_SITE" desc="Menu item allowing users to change the website from the mobile site to desktop site. [CHAR-LIMIT=27]">
+ Request desktop site
+ </message>
+ <message name="IDS_MENU_ITEM_REQUEST_MOBILE_SITE" desc="Menu item allowing users to change the website from the desktop site to mobile site. [CHAR-LIMIT=27]">
+ Request mobile site
+ </message>
<message name="IDS_MENU_PAINT_PREVIEW_SHOW" desc="Menu item allowing users to capture and show a paint preview of a page. [CHAR-LIMIT=27]" translateable="false">
Show Paint Preview
</message>
@@ -3014,15 +3076,6 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_MENU_STOP_IMAGE_DESCRIPTIONS" desc="Menu item to stop getting alt text accessibility image labels/descriptions [CHAR-LIMIT=27]">
Stop image descriptions
</message>
- <message name="IDS_MENU_ADD_TO" desc="Menu item for opening the 'Add to' dialog which can add the page to bookmarks, downloads, home screen, etc. [CHAR-LIMIT=27]">
- Add to…
- </message>
- <message name="IDS_MENU_ADD_TO_DIALOG_TITLE" desc="Menu item for opening the 'Add to' dialog which can add the page to bookmarks, downloads, home screen, etc.">
- Add to
- </message>
- <message name="IDS_MENU_HOMESCREEN" desc="Menu item for adding a shortcut to the Home screen (default title). [CHAR-LIMIT=27]">
- Home screen
- </message>
<!-- Bookmarks strings -->
<message name="IDS_BOOKMARKS" desc="Title of the bookmarks page, which shows a list of the user's bookmarks. [CHAR-LIMIT=18]">
@@ -3134,9 +3187,6 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
</message>
<!-- Read later strings -->
- <message name="IDS_READING_LIST_TITLE" desc="The title for the reading list page in main bookmark UI.">
- Reading list
- </message>
<message name="IDS_READING_LIST_TITLE_NEW" desc="The title for the reading list with a new text.">
Reading list <ph name="BEGIN_NEW">&lt;new&gt;</ph>New<ph name="END_NEW">&lt;/new&gt;</ph>
</message>
@@ -3239,9 +3289,6 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_LOCATION_BAR_VERBOSE_STATUS_OFFLINE" desc="Verbose indication of offline status in the location bar. [CHAR-LIMIT=20]">
Offline
</message>
- <message name="IDS_LOCATION_BAR_PREVIEW_LITE_PAGE_STATUS" desc="An indication in the location bar that the page the user is viewing has been modified in order to speed up the page load or decrease the amount of data used to load the page. [CHAR-LIMIT=10]">
- Lite
- </message>
<message name="IDS_LOCATION_BAR_PAINT_PREVIEW_PAGE_STATUS" desc="An indication in the location bar that the page the user is viewing is a paint preview of the original page. [CHAR-LIMIT=10]">
Preview
</message>
@@ -3356,6 +3403,18 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_ACCESSIBILITY_OMNIBOX_BTN_REFINE" desc="Content description for the omnibox refine button followed with the text or URL that will be shown in the Omnibox if the user clicks the refine button, eg. User input 'The' may offer a suggestion 'The meaning of life' or 'thewirecutter.com'.">
Refine: <ph name="REFINE_TEXT">%1$s<ex>The meaning of life</ex></ph>
</message>
+ <message name="IDS_ACCESSIBILITY_OMNIBOX_CONCEAL_CLIPBOARD_CONTENTS" desc="Content description for the omnibox clipboard conceal button.">
+ Hide clipboard contents
+ </message>
+ <message name="IDS_ACCESSIBILITY_OMNIBOX_REVEAL_CLIPBOARD_CONTENTS" desc="Content description for the omnibox clipboard reveal button.">
+ Show clipboard contents
+ </message>
+ <message name="IDS_ACCESSIBILITY_OMNIBOX_CONCEAL_BUTTON_ANNOUNCEMENT" desc="Accessibility announcement when the omnibox clipboard conceal button is clicked.">
+ Clipboard contents hidden
+ </message>
+ <message name="IDS_ACCESSIBILITY_OMNIBOX_REVEAL_BUTTON_ANNOUNCEMENT" desc="Accessibility announcement when the omnibox clipboard reveal button is clicked.">
+ Clipboard contents shown
+ </message>
<message name="IDS_ACCESSIBILITY_OMNIBOX_SWITCH_TO_TAB" desc="Content description for the omnibox switch to tab button.">
Switch To Tab
</message>
@@ -3541,6 +3600,52 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
Feed card menu is closed
</message>
+ <!-- Feed Autoplay Preferences -->
+ <message name="IDS_FEED_AUTOPLAY_TITLE" desc="Title for feed autoplay preference.">
+ Autoplay
+ </message>
+ <message name="IDS_VIDEO_PREVIEWS_TITLE" desc="Title for setting video previews preference.">
+ Video previews
+ </message>
+ <message name="IDS_VIDEO_PREVIEWS_SUMMARY" desc="Summary for setting video previews preference.">
+ Choose how video previews will automatically play on the Chrome homepage.
+ </message>
+ <message name="IDS_VIDEO_PREVIEWS_OPTION_NEVER" desc="Option in video previews preference. Users can click this option to disable video previews.">
+ Never
+ </message>
+ <message name="IDS_VIDEO_PREVIEWS_OPTION_WIFI" desc="Option in video previews preference. Users can click this option to allow video previews on Wi-Fi only.">
+ Only on Wi-Fi
+ </message>
+ <message name="IDS_VIDEO_PREVIEWS_OPTION_WIFI_AND_MOBILE_DATA" desc="Option in video previews preference. Users can click this option to allow video previews on both Wi-Fi and mobile data.">
+ On Wi-Fi &amp; mobile data
+ </message>
+
+ <!-- WebFeed -->
+ <message name="IDS_WEB_FEED_FOLLOW_LOADING_DESCRIPTION" desc="The content description of the loading spinner after the user presses Follow and is waiting for a response.">
+ Following...
+ </message>
+ <message name="IDS_WEB_FEED_FOLLOW_SUCCESS_SNACKBAR_MESSAGE" desc="The snackbar message after a successful Web Feed follow.">
+ Followed <ph name="SITE_NAME">%1$s<ex>Google</ex></ph>
+ </message>
+ <message name="IDS_WEB_FEED_FOLLOW_SUCCESS_SNACKBAR_ACTION" desc="The snackbar action after a successful Web Feed follow.">
+ Go to feed
+ </message>
+ <message name="IDS_WEB_FEED_FOLLOW_GENERIC_FAILURE_SNACKBAR_MESSAGE" desc="The generic snackbar message after an unsuccessful Web Feed follow.">
+ Can’t follow. Something went wrong.
+ </message>
+ <message name="IDS_WEB_FEED_UNFOLLOW_GENERIC_FAILURE_SNACKBAR_MESSAGE" desc="The generic snackbar message after an unsuccessful Web Feed unfollow.">
+ Can’t unfollow. Something went wrong.
+ </message>
+ <message name="IDS_WEB_FEED_GENERIC_FAILURE_SNACKBAR_ACTION" desc="The snackbar action after an unsuccessful Web Feed follow/unfollow.">
+ Try again
+ </message>
+ <message name="IDS_WEB_FEED_UNFOLLOW_SUCCESS_SNACKBAR_MESSAGE" desc="The snackbar message after a successful Web Feed unfollow.">
+ Unfollowed <ph name="SITE_NAME">%1$s<ex>Google</ex></ph>
+ </message>
+ <message name="IDS_WEB_FEED_UNFOLLOW_SUCCESS_SNACKBAR_ACTION" desc="The snackbar action after a successful Web Feed unfollow.">
+ Refollow
+ </message>
+
<!-- Storage Preference UI strings for clearing storage. -->
<message name="IDS_STORAGE_MANAGEMENT_ACTIVITY_LABEL" desc="Title for Chrome's Manage Space Activity.">
Google <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> storage
@@ -3674,6 +3779,9 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_WEBAPK_NETWORK_ERROR_MESSAGE_TUNNEL_CONNECTION_FAILED" desc="The error message for ERROR_TUNNEL_CONNECTION_FAILED.">
Establishing a tunnel via proxy server failed
</message>
+ <message name="IDS_LAUNCHPAD_TITLE" desc="Title of WebAPKs launchpad page">
+ Apps
+ </message>
<!-- Keyboard shortcuts in Android N-->
<message name="IDS_KEYBOARD_SHORTCUT_OPEN_NEW_TAB" desc="A text label that appears next to the keyboard shortcut to open a new tab in Chrome. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR-LIMIT=55]">
@@ -3814,6 +3922,18 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_IPH_IDENTITY_DISC_ACCESSIBILITY_TEXT" desc="The in-product-help accessibility text prompting the user that tapping identity disc will navigate to 'Sync and Google services' settings page.">
To manage your Google account, tap the "Manage account" button
</message>
+ <message name="IDS_IPH_MIC_TOOLBAR_GENERIC_MESSAGE_TEXT" desc="The in-product-help message encouraging to execute a voice search.">
+ Search with your voice
+ </message>
+ <message name="IDS_IPH_MIC_TOOLBAR_GENERIC_MESSAGE_ACCESSIBILITY_TEXT" desc="The in-product-help message encouraging to execute a voice search.">
+ Tap the mic to search with your voice
+ </message>
+ <message name="IDS_IPH_MIC_TOOLBAR_EXAMPLE_QUERY_TEXT" desc="The in-product-help message encouraging to execute a voice search by giving an example command to try.">
+ Try “What’s the weather today?”
+ </message>
+ <message name="IDS_IPH_MIC_TOOLBAR_EXAMPLE_QUERY_ACCESSIBILITY_TEXT" desc="The in-product-help message encouraging to execute a voice search by giving an example command to try.">
+ To check the weather, tap the mic and say “What’s the weather today?”
+ </message>
<message name="IDS_IPH_NTP_WITHOUT_FEED_TEXT" desc="The in-product-help message to open the new tab page with personalized top sites.">
See your top sites
</message>
@@ -3826,12 +3946,6 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
<message name="IDS_IPH_NTP_WITH_FEED_ACCESSIBILITY_TEXT" desc="The in-product-help accessibility text to open the new tab page with personalized top sites and stories. The 'Home' button name should match TC ID 2821179408673282599.">
To see top sites and stories for you, tap the Home button
</message>
- <message name="IDS_IPH_PREVIEWS_OMNIBOX_UI_TEXT" desc="The in-product-help text informing the user that the displayed page was modified to make it load faster or use less data. Prompts the user to tap the message and load the original, unaltered, page if they would like. The 'Lite page provided by Google.' sentence should match TC ID 373879247902731825">
- Lite page provided by Google. Tap to load the original.
- </message>
- <message name="IDS_IPH_PREVIEWS_OMNIBOX_UI_ACCESSIBILITY_TEXT" desc="The in-product-help text informing the user that the displayed page was modified to make it load faster or use less data. Prompts the user to tap the message and load the original, unaltered, page if they would like. The 'Lite page provided by Google.' sentence should match TC ID 373879247902731825">
- Lite page provided by Google. Tap the load original button to load the original page.
- </message>
<message name="IDS_IPH_TAB_SWITCHER_TEXT" desc="The in-product-help message to open the tab switcher.">
Open tabs to visit different pages at the same time
</message>
@@ -4007,6 +4121,14 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
Send text to Your Devices
</message>
+ <!-- Sms Fetcher -->
+ <message name="IDS_SMS_FETCHER_NOTIFICATION_TITLE" translateable="false" desc="Title text shown when the browser has received an SMS on the user's behalf.">
+ Tap to verify your phone number on desktop
+ </message>
+ <message name="IDS_SMS_FETCHER_NOTIFICATION_TEXT" translateable="false" desc="Content text shown when the browser has received an SMS on the user's behalf.">
+ <ph name="ONE_TIME_CODE">%1$s<ex>123</ex></ph> is your code for <ph name="ORIGIN">%2$s<ex>example.com</ex></ph>
+ </message>
+
<!-- Interventions -->
<message name="IDS_REDIRECT_BLOCKED_MESSAGE" desc="The message stating that a redirect (noun) was blocked on this page. This will be followed on a separate line with the address the user was being redirected to.">
Redirect blocked:
@@ -4176,6 +4298,26 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
Processing request
</message>
+ <message name="IDS_CABLEV2_ERROR_TITLE" desc="The title of an error screen shown when the user is trying to use their phone to sign into a website on a laptop, but something (probably out of their control) went wrong">
+ Something went wrong
+ </message>
+
+ <message name="IDS_CABLEV2_ERROR_TIMEOUT" desc="The description of an error shown when the user is trying to use their phone to sign into a website on a laptop, but the phone was until to contact the laptop within a reasonable amount of time.">
+ Can’t connect to your computer. Try another verification option.
+ </message>
+
+ <message name="IDS_CABLEV2_ERROR_GENERIC" desc="The description of an error shown when the user is trying to use their phone to sign into a website on a laptop, but some generic error occured.">
+ Try another verification option
+ </message>
+
+ <message name="IDS_CABLEV2_ERROR_CODE" desc="A line of text on an error screen that is shown with lower contrast in order to include a numeric error code to aid in debugging.">
+ (Error <ph name="error_code">%1$d<ex>104</ex></ph>)
+ </message>
+
+ <message name="IDS_CABLEV2_ERROR_CLOSE" desc="A button at the bottom on an error screen to dismiss it">
+ Close
+ </message>
+
<!-- QR Code -->
<message name="IDS_QR_CODE_SHARE_ICON_LABEL" desc="Icon label for sharing with QR Code activity.">
QR Code
diff --git a/chromium/chrome/browser/ui/android/toolbar/BUILD.gn b/chromium/chrome/browser/ui/android/toolbar/BUILD.gn
index 55c37bed113..627a6bdef28 100644
--- a/chromium/chrome/browser/ui/android/toolbar/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -64,7 +64,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/browser_controls/android:java",
"//chrome/browser/device:java",
@@ -152,7 +151,6 @@ java_library("junit") {
"java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonControllerTest.java",
"java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java",
"java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java",
- "java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonTest.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java",
]
diff --git a/chromium/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn b/chromium/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
index cdbb313f9b1..1e847479a71 100644
--- a/chromium/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
+++ b/chromium/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
@@ -12,10 +12,6 @@ proto_library("app_launch_predictor_proto") {
sources = [ "app_launch_predictor.proto" ]
}
-proto_library("app_list_launch_recorder_proto") {
- sources = [ "app_list_launch_recorder_state.proto" ]
-}
-
proto_library("recurrence_ranker_proto") {
sources = [
"frecency_store.proto",
@@ -24,7 +20,3 @@ proto_library("recurrence_ranker_proto") {
"recurrence_ranker_config.proto",
]
}
-
-proto_library("search_ranking_event_proto") {
- sources = [ "search_ranking_event.proto" ]
-}
diff --git a/chromium/chrome/browser/ui/ash/holding_space/BUILD.gn b/chromium/chrome/browser/ui/ash/holding_space/BUILD.gn
index 806ebebf443..4a8f6fe1ea0 100644
--- a/chromium/chrome/browser/ui/ash/holding_space/BUILD.gn
+++ b/chromium/chrome/browser/ui/ash/holding_space/BUILD.gn
@@ -29,6 +29,7 @@ source_set("browser_tests") {
"//content/test:test_support",
"//ui/aura",
"//ui/base",
+ "//ui/base/dragdrop:types",
"//ui/base/dragdrop/mojom",
"//ui/events:test_support",
"//ui/gfx:test_support",
diff --git a/chromium/chrome/browser/ui/messages/android/BUILD.gn b/chromium/chrome/browser/ui/messages/android/BUILD.gn
index c9c8ade2f35..e98fe415aaa 100644
--- a/chromium/chrome/browser/ui/messages/android/BUILD.gn
+++ b/chromium/chrome/browser/ui/messages/android/BUILD.gn
@@ -32,7 +32,6 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/util:java",
"//components/browser_ui/styles/android:java_resources",
"//components/browser_ui/widget/android:java",
diff --git a/chromium/chrome/browser/ui/webui/DEPS b/chromium/chrome/browser/ui/webui/DEPS
index 424b07072f2..dbc34f2badd 100644
--- a/chromium/chrome/browser/ui/webui/DEPS
+++ b/chromium/chrome/browser/ui/webui/DEPS
@@ -13,3 +13,9 @@ include_rules = [
"+third_party/brotli", # For compressed resources.
"+third_party/zlib/zlib.h", # For compression level constants.
]
+
+specific_include_rules = {
+ "inspect_ui\.cc": [
+ "+chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h",
+ ],
+}
diff --git a/chromium/chrome/browser/ui/webui/about_ui.cc b/chromium/chrome/browser/ui/webui/about_ui.cc
index 3d0d6375ec1..ea75f9808fc 100644
--- a/chromium/chrome/browser/ui/webui/about_ui.cc
+++ b/chromium/chrome/browser/ui/webui/about_ui.cc
@@ -85,9 +85,9 @@
#include "base/stl_util.h"
#include "base/strings/strcat.h"
#include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/browser_process_platform_part_chromeos.h"
#include "chrome/browser/chromeos/customization/customization_document.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/component_updater/cros_component_manager.h"
#include "chromeos/system/statistics_provider.h"
#include "components/language/core/common/locale_util.h"
diff --git a/chromium/chrome/browser/ui/webui/about_ui_unittest.cc b/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
index a9e8f5cc9f7..b7dbdfb0220 100644
--- a/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
@@ -20,8 +20,8 @@
#include "base/strings/string_util.h"
#include "base/task/post_task.h"
#include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
-#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/ash/login/ui/fake_login_display_host.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
diff --git a/chromium/chrome/browser/ui/webui/app_launcher_login_handler.cc b/chromium/chrome/browser/ui/webui/app_launcher_login_handler.cc
index 6f06af7b287..6678f2ea386 100644
--- a/chromium/chrome/browser/ui/webui/app_launcher_login_handler.cc
+++ b/chromium/chrome/browser/ui/webui/app_launcher_login_handler.cc
@@ -65,13 +65,13 @@ SkBitmap GetGAIAPictureForNTP(const gfx::Image& image) {
}
// Puts the |content| into an element with the given CSS class.
-base::string16 CreateElementWithClass(const base::string16& content,
+std::u16string CreateElementWithClass(const std::u16string& content,
const std::string& tag_name,
const std::string& css_class,
const std::string& extends_tag) {
- base::string16 start_tag = base::ASCIIToUTF16("<" + tag_name +
- " class='" + css_class + "' is='" + extends_tag + "'>");
- base::string16 end_tag = base::ASCIIToUTF16("</" + tag_name + ">");
+ std::u16string start_tag = base::ASCIIToUTF16(
+ "<" + tag_name + " class='" + css_class + "' is='" + extends_tag + "'>");
+ std::u16string end_tag = base::ASCIIToUTF16("</" + tag_name + ">");
return start_tag + net::EscapeForHTML(content) + end_tag;
}
@@ -142,7 +142,7 @@ void AppLauncherLoginHandler::RecordInHistogram(NTPSignInPromoBuckets type) {
void AppLauncherLoginHandler::UpdateLogin() {
std::string username = profile_info_watcher_->GetAuthenticatedUsername();
- base::string16 header, sub_header;
+ std::u16string header, sub_header;
std::string icon_url;
Profile* profile = Profile::FromWebUI(web_ui());
if (!username.empty()) {
@@ -155,7 +155,7 @@ void AppLauncherLoginHandler::UpdateLogin() {
// case. In the multi-profile case the profile picture is visible in the
// title bar and the full name can be ambiguous.
if (storage.GetNumberOfProfiles() == 1) {
- base::string16 name = entry->GetGAIAName();
+ std::u16string name = entry->GetGAIAName();
if (!name.empty())
header = CreateElementWithClass(name, "span", "profile-name", "");
const gfx::Image* image = entry->GetGAIAPicture();
@@ -174,8 +174,8 @@ void AppLauncherLoginHandler::UpdateLogin() {
profile->GetOriginalProfile()->GetPrefs()->GetBoolean(
prefs::kSigninAllowed);
if (is_signin_allowed) {
- base::string16 signed_in_link = l10n_util::GetStringUTF16(
- IDS_SYNC_PROMO_NOT_SIGNED_IN_STATUS_LINK);
+ std::u16string signed_in_link =
+ l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NOT_SIGNED_IN_STATUS_LINK);
signed_in_link =
CreateElementWithClass(signed_in_link, "a", "", "action-link");
header = l10n_util::GetStringFUTF16(
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management.mojom b/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
index c8b279f43f6..0ff17630ee3 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
@@ -78,10 +78,10 @@ enum ArcPermissionType {
// This enum takes the important permission values from the
// contents_settings_type.h ContentSettingsType enum.
enum PwaPermissionType {
- GEOLOCATION = 5,
- NOTIFICATIONS = 6,
- MEDIASTREAM_MIC = 9,
- MEDIASTREAM_CAMERA = 10,
+ GEOLOCATION = 4,
+ NOTIFICATIONS = 5,
+ MEDIASTREAM_MIC = 8,
+ MEDIASTREAM_CAMERA = 9,
};
// The Plugin VM app publisher uses this enum directly.
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
index 7ba1410e85b..7ef8c7ce0a6 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -29,7 +29,7 @@
#include "mojo/public/cpp/bindings/remote.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "components/arc/arc_prefs.h"
#endif
@@ -93,11 +93,14 @@ AppManagementPageHandler::AppManagementPageHandler(
Profile* profile)
: receiver_(this, std::move(receiver)),
page_(std::move(page)),
- profile_(profile) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
- Observe(&proxy->AppRegistryCache());
+ profile_(profile)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ ,
+ shelf_delegate_(this, profile)
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+{
+ Observe(&apps::AppServiceProxyFactory::GetForProfile(profile_)
+ ->AppRegistryCache());
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (arc::IsArcAllowedForProfile(profile_)) {
@@ -110,13 +113,11 @@ AppManagementPageHandler::~AppManagementPageHandler() {}
void AppManagementPageHandler::OnPinnedChanged(const std::string& app_id,
bool pinned) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
app_management::mojom::AppPtr app;
- proxy->AppRegistryCache().ForOneApp(
- app_id, [this, &app](const apps::AppUpdate& update) {
+ apps::AppServiceProxyFactory::GetForProfile(profile_)
+ ->AppRegistryCache()
+ .ForOneApp(app_id, [this, &app](const apps::AppUpdate& update) {
if (update.Readiness() == apps::mojom::Readiness::kReady)
app = CreateUIAppPtr(update);
});
@@ -131,12 +132,10 @@ void AppManagementPageHandler::OnPinnedChanged(const std::string& app_id,
}
void AppManagementPageHandler::GetApps(GetAppsCallback callback) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
std::vector<app_management::mojom::AppPtr> apps;
- proxy->AppRegistryCache().ForEachApp(
- [this, &apps](const apps::AppUpdate& update) {
+ apps::AppServiceProxyFactory::GetForProfile(profile_)
+ ->AppRegistryCache()
+ .ForEachApp([this, &apps](const apps::AppUpdate& update) {
if (update.ShowInManagement() == apps::mojom::OptionalBool::kTrue &&
update.Readiness() != apps::mojom::Readiness::kUninstalledByUser) {
apps.push_back(CreateUIAppPtr(update));
@@ -177,24 +176,18 @@ void AppManagementPageHandler::SetPinned(const std::string& app_id,
void AppManagementPageHandler::SetPermission(
const std::string& app_id,
apps::mojom::PermissionPtr permission) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
- proxy->SetPermission(app_id, std::move(permission));
+ apps::AppServiceProxyFactory::GetForProfile(profile_)->SetPermission(
+ app_id, std::move(permission));
}
void AppManagementPageHandler::Uninstall(const std::string& app_id) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
- proxy->Uninstall(app_id, nullptr /* parent_window */);
+ apps::AppServiceProxyFactory::GetForProfile(profile_)->Uninstall(
+ app_id, nullptr /* parent_window */);
}
void AppManagementPageHandler::OpenNativeSettings(const std::string& app_id) {
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile_);
-
- proxy->OpenNativeSettings(app_id);
+ apps::AppServiceProxyFactory::GetForProfile(profile_)->OpenNativeSettings(
+ app_id);
}
app_management::mojom::AppPtr AppManagementPageHandler::CreateUIAppPtr(
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.h b/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.h
index 144d0ad3d0c..832d683afb6 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management_page_handler.h
@@ -80,7 +80,7 @@ class AppManagementPageHandler : public app_management::mojom::PageHandler,
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::ScopedObservation<ArcAppListPrefs, ArcAppListPrefs::Observer>
arc_app_list_prefs_observation_{this};
- AppManagementShelfDelegate shelf_delegate_{this};
+ AppManagementShelfDelegate shelf_delegate_;
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
DISALLOW_COPY_AND_ASSIGN(AppManagementPageHandler);
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.cc b/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.cc
index 7df9ca2b444..7471f5ca0b3 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.cc
@@ -4,18 +4,24 @@
#include "chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h"
+#include <algorithm>
+
#include "ash/public/cpp/shelf_item.h"
#include "ash/public/cpp/shelf_model.h"
#include "ash/public/cpp/shelf_types.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
#include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
#include "components/services/app_service/public/mojom/types.mojom.h"
using apps::mojom::OptionalBool;
AppManagementShelfDelegate::AppManagementShelfDelegate(
- AppManagementPageHandler* page_handler)
+ AppManagementPageHandler* page_handler,
+ Profile* profile)
: page_handler_(page_handler) {
auto* launcher_controller = ChromeLauncherController::instance();
if (!launcher_controller) {
@@ -26,6 +32,7 @@ AppManagementShelfDelegate::AppManagementShelfDelegate(
if (!shelf_model) {
return;
}
+ launcher_controller_helper_ = new LauncherControllerHelper(profile);
shelf_model->AddObserver(this);
}
@@ -61,10 +68,14 @@ bool AppManagementShelfDelegate::IsPolicyPinned(
}
auto* shelf_item = launcher_controller->GetItem(ash::ShelfID(app_id));
-
- // If the app does not exist on the launcher, it has not been pinned by
- // policy.
- return shelf_item && shelf_item->pinned_by_policy;
+ if (shelf_item) {
+ return shelf_item->pinned_by_policy;
+ }
+ // The app doesn't exist on the shelf - check launcher prefs instead.
+ std::vector<std::string> policy_pinned_apps =
+ GetAppsPinnedByPolicy(launcher_controller_helper_);
+ return std::any_of(policy_pinned_apps.begin(), policy_pinned_apps.end(),
+ [app_id](std::string app) { return app_id == app; });
}
void AppManagementShelfDelegate::SetPinned(const std::string& app_id,
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h b/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h
index 6471cccb454..f6b05520bb3 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h
@@ -10,6 +10,8 @@
#include "chrome/browser/ui/webui/app_management/app_management.mojom.h"
class AppManagementPageHandler;
+class LauncherControllerHelper;
+class Profile;
// This is a helper class used by the AppManagementPageHandler to manage
// shelf-related functionality, which is only meaningful when running Chrome OS.
@@ -17,7 +19,8 @@ class AppManagementPageHandler;
// apps are pinned or unpinned.
class AppManagementShelfDelegate : public ash::ShelfModelObserver {
public:
- explicit AppManagementShelfDelegate(AppManagementPageHandler* page_handler);
+ explicit AppManagementShelfDelegate(AppManagementPageHandler* page_handler,
+ Profile* profile);
~AppManagementShelfDelegate() override;
bool IsPinned(const std::string& app_id);
@@ -32,6 +35,7 @@ class AppManagementShelfDelegate : public ash::ShelfModelObserver {
void ShelfItemChanged(int index, const ash::ShelfItem& old_item) override;
AppManagementPageHandler* page_handler_;
+ LauncherControllerHelper* launcher_controller_helper_;
DISALLOW_COPY_AND_ASSIGN(AppManagementShelfDelegate);
};
diff --git a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc
index a6231ff0fc2..c22d1d6980f 100644
--- a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc
@@ -19,7 +19,7 @@ AutofillInternalsUI::AutofillInternalsUI(content::WebUI* web_ui)
autofill::CreateInternalsHTMLSource(
chrome::kChromeUIAutofillInternalsHost));
web_ui->AddMessageHandler(std::make_unique<autofill::InternalsUIHandler>(
- "setUpAutofillInternals",
+ "setup-autofill-internals",
base::BindRepeating(
&autofill::AutofillLogRouterFactory::GetForBrowserContext)));
}
diff --git a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc
index e617165337f..98d2e319d07 100644
--- a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc
@@ -39,7 +39,8 @@ content::WebUIDataSource* CreateInternalsHTMLSource(
source->AddString(version_ui::kOfficial, version_info::IsOfficialBuild()
? "official"
: "Developer build");
- source->AddString(version_ui::kVersionModifier, chrome::GetChannelName());
+ source->AddString(version_ui::kVersionModifier,
+ chrome::GetChannelName(chrome::WithExtendedStable(true)));
source->AddString(version_ui::kCL, version_info::GetLastChange());
source->AddString(version_ui::kUserAgent, embedder_support::GetUserAgent());
source->AddString("app_locale", g_browser_process->GetApplicationLocale());
@@ -111,16 +112,16 @@ void InternalsUIHandler::OnJavascriptDisallowed() {
void InternalsUIHandler::OnLoaded(const base::ListValue* args) {
AllowJavascript();
- CallJavascriptFunction(call_on_load_);
+ FireWebUIListener(call_on_load_, base::Value());
// This is only available in contents, because the iOS BrowsingDataRemover
// does not allow selectively deleting data per origin and we don't want to
// wipe the entire cache.
- CallJavascriptFunction("enableResetCacheButton");
- CallJavascriptFunction(
- "notifyAboutIncognito",
+ FireWebUIListener("enable-reset-cache-button", base::Value());
+ FireWebUIListener(
+ "notify-about-incognito",
base::Value(Profile::FromWebUI(web_ui())->IsIncognitoProfile()));
- CallJavascriptFunction("notifyAboutVariations",
- *version_ui::GetVariationsList());
+ FireWebUIListener("notify-about-variations",
+ *version_ui::GetVariationsList());
}
void InternalsUIHandler::OnResetCache(const base::ListValue* args) {
@@ -133,7 +134,7 @@ void InternalsUIHandler::OnResetCache(const base::ListValue* args) {
}
void InternalsUIHandler::OnResetCacheDone(const std::string& message) {
- CallJavascriptFunction("notifyResetDone", base::Value(message));
+ FireWebUIListener("notify-reset-done", base::Value(message));
}
void InternalsUIHandler::StartSubscription() {
@@ -162,7 +163,7 @@ void InternalsUIHandler::EndSubscription() {
void InternalsUIHandler::LogEntry(const base::Value& entry) {
if (!registered_with_log_router_ || entry.is_none())
return;
- CallJavascriptFunction("addRawLog", entry);
+ FireWebUIListener("add-raw-log", entry);
}
} // namespace autofill
diff --git a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc
index a43a8d42ef4..5cabfd95cf1 100644
--- a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc
@@ -19,7 +19,7 @@ PasswordManagerInternalsUI::PasswordManagerInternalsUI(content::WebUI* web_ui)
profile, autofill::CreateInternalsHTMLSource(
chrome::kChromeUIPasswordManagerInternalsHost));
web_ui->AddMessageHandler(std::make_unique<autofill::InternalsUIHandler>(
- "setUpPasswordManagerInternals",
+ "setup-password-manager-internals",
base::BindRepeating(&password_manager::PasswordManagerLogRouterFactory::
GetForBrowserContext)));
}
diff --git a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
index 66a8d8507fe..18a24bc688f 100644
--- a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
+++ b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
@@ -4,13 +4,13 @@
#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h"
+#include <string>
+
#include "base/bind.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
-#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
#include "device/bluetooth/adapter.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
@@ -18,7 +18,7 @@
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
+#include "chrome/browser/ash/bluetooth/debug_logs_manager.h"
#endif
BluetoothInternalsHandler::BluetoothInternalsHandler(
@@ -43,7 +43,7 @@ void BluetoothInternalsHandler::GetDebugLogsChangeHandler(
bool initial_toggle_value = false;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- using chromeos::bluetooth::DebugLogsManager;
+ using ash::bluetooth::DebugLogsManager;
// If no logs manager exists for this user, debug logs are not supported.
DebugLogsManager::DebugLogsState state =
diff --git a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
index 769d962f8e3..8f51f96315d 100644
--- a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
+++ b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
@@ -13,11 +13,11 @@
#include "mojo/public/cpp/bindings/receiver.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-namespace chromeos {
+namespace ash {
namespace bluetooth {
class DebugLogsManager;
} // namespace bluetooth
-} // namespace chromeos
+} // namespace ash
#endif
// Handles API requests from chrome://bluetooth-internals page by implementing
@@ -30,7 +30,7 @@ class BluetoothInternalsHandler : public mojom::BluetoothInternalsHandler {
#if BUILDFLAG(IS_CHROMEOS_ASH)
void set_debug_logs_manager(
- chromeos::bluetooth::DebugLogsManager* debug_logs_manager) {
+ ash::bluetooth::DebugLogsManager* debug_logs_manager) {
debug_logs_manager_ = debug_logs_manager;
}
#endif
@@ -47,7 +47,7 @@ class BluetoothInternalsHandler : public mojom::BluetoothInternalsHandler {
mojo::Receiver<mojom::BluetoothInternalsHandler> receiver_;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::bluetooth::DebugLogsManager* debug_logs_manager_ = nullptr;
+ ash::bluetooth::DebugLogsManager* debug_logs_manager_ = nullptr;
#endif
base::WeakPtrFactory<BluetoothInternalsHandler> weak_ptr_factory_{this};
diff --git a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
index 5f0efbbb89c..6b85e2d9879 100644
--- a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
@@ -17,7 +17,7 @@
#include "ui/resources/grit/webui_generated_resources.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h"
+#include "chrome/browser/ash/bluetooth/debug_logs_manager_factory.h"
#endif
BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
@@ -52,7 +52,7 @@ void BluetoothInternalsUI::BindInterface(
std::make_unique<BluetoothInternalsHandler>(std::move(receiver));
#if BUILDFLAG(IS_CHROMEOS_ASH)
page_handler_->set_debug_logs_manager(
- chromeos::bluetooth::DebugLogsManagerFactory::GetForProfile(
+ ash::bluetooth::DebugLogsManagerFactory::GetForProfile(
Profile::FromWebUI(web_ui())));
#endif
}
diff --git a/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.cc b/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.cc
index 06b32fe9bb1..b36e965e04b 100644
--- a/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.cc
@@ -55,12 +55,9 @@ void BookmarksBrowserTest::SetupExtensionAPIEditDisabledTest() {
BookmarkModelFactory::GetForBrowserContext(profile);
bookmarks::test::WaitForBookmarkModelToLoad(model);
const bookmarks::BookmarkNode* bar = model->bookmark_bar_node();
- const bookmarks::BookmarkNode* folder =
- model->AddFolder(bar, 0, base::ASCIIToUTF16("Folder"));
- model->AddURL(bar, 1, base::ASCIIToUTF16("AAA"),
- GURL("http://aaa.example.com"));
- model->AddURL(folder, 0, base::ASCIIToUTF16("BBB"),
- GURL("http://bbb.example.com"));
+ const bookmarks::BookmarkNode* folder = model->AddFolder(bar, 0, u"Folder");
+ model->AddURL(bar, 1, u"AAA", GURL("http://aaa.example.com"));
+ model->AddURL(folder, 0, u"BBB", GURL("http://bbb.example.com"));
PrefService* prefs = user_prefs::UserPrefs::Get(profile);
prefs->SetBoolean(bookmarks::prefs::kEditBookmarksEnabled, false);
diff --git a/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc b/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc
index 155e3aa532d..629b2ad6acd 100644
--- a/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc
+++ b/chromium/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc
@@ -10,7 +10,6 @@
#include <utility>
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h"
#include "chrome/browser/ui/webui/favicon_source.h"
@@ -38,7 +37,7 @@ namespace {
void AddLocalizedString(content::WebUIDataSource* source,
const std::string& message,
int id) {
- base::string16 str = l10n_util::GetStringUTF16(id);
+ std::u16string str = l10n_util::GetStringUTF16(id);
base::Erase(str, '&');
source->AddString(message, str);
}
diff --git a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
index 7817c30c431..f00cef2015e 100644
--- a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
@@ -8,15 +8,14 @@
#include "base/bind.h"
#include "base/containers/span.h"
-#include "base/strings/string16.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_common.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler_user_service.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_worker.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_common.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_scheduler_user_service.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_worker.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/common/net/x509_certificate_model_nss.h"
#include "chrome/grit/generated_resources.h"
@@ -33,10 +32,11 @@ namespace {
// Returns the per-user CertProvisioningScheduler for |user_profile|, if it has
// any.
-CertProvisioningScheduler* GetCertProvisioningSchedulerForUser(
- Profile* user_profile) {
- CertProvisioningSchedulerUserService* user_service =
- CertProvisioningSchedulerUserServiceFactory::GetForProfile(user_profile);
+ash::cert_provisioning::CertProvisioningScheduler*
+GetCertProvisioningSchedulerForUser(Profile* user_profile) {
+ ash::cert_provisioning::CertProvisioningSchedulerUserService* user_service =
+ ash::cert_provisioning::CertProvisioningSchedulerUserServiceFactory::
+ GetForProfile(user_profile);
if (!user_service)
return nullptr;
return user_service->scheduler();
@@ -44,7 +44,8 @@ CertProvisioningScheduler* GetCertProvisioningSchedulerForUser(
// Returns the per-device CertProvisioningScheduler, if it exists. No
// affiliation check is done here.
-CertProvisioningScheduler* GetCertProvisioningSchedulerForDevice() {
+ash::cert_provisioning::CertProvisioningScheduler*
+GetCertProvisioningSchedulerForDevice() {
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
return connector->GetDeviceCertProvisioningScheduler();
@@ -52,8 +53,10 @@ CertProvisioningScheduler* GetCertProvisioningSchedulerForDevice() {
// Returns localized representation for the state of a certificate provisioning
// process.
-base::string16 GetProvisioningProcessStatus(CertProvisioningWorkerState state) {
- using CertProvisioningWorkerState = CertProvisioningWorkerState;
+std::u16string GetProvisioningProcessStatus(
+ ash::cert_provisioning::CertProvisioningWorkerState state) {
+ using CertProvisioningWorkerState =
+ ash::cert_provisioning::CertProvisioningWorkerState;
switch (state) {
case CertProvisioningWorkerState ::kInitState:
return l10n_util::GetStringUTF16(
@@ -94,10 +97,10 @@ base::string16 GetProvisioningProcessStatus(CertProvisioningWorkerState state) {
// Returns a localized representation of the last update time as a delay (e.g.
// "5 minutes ago".
-base::string16 GetTimeSinceLastUpdate(base::Time last_update_time) {
+std::u16string GetTimeSinceLastUpdate(base::Time last_update_time) {
const base::Time now = base::Time::NowFromSystemTime();
if (last_update_time.is_null() || last_update_time > now)
- return base::string16();
+ return std::u16string();
const base::TimeDelta elapsed_time = now - last_update_time;
return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED,
ui::TimeFormat::LENGTH_SHORT, elapsed_time);
@@ -107,7 +110,7 @@ base::Value CreateProvisioningProcessEntry(
const std::string& cert_profile_id,
const std::string& cert_profile_name,
bool is_device_wide,
- CertProvisioningWorkerState state,
+ ash::cert_provisioning::CertProvisioningWorkerState state,
base::Time time_since_last_update,
const std::string& public_key_spki_der) {
base::Value entry(base::Value::Type::DICTIONARY);
@@ -131,10 +134,12 @@ base::Value CreateProvisioningProcessEntry(
// |cert_provisioning_scheduler| and appends them to |list_to_append_to|.
void CollectProvisioningProcesses(
base::Value* list_to_append_to,
- CertProvisioningScheduler* cert_provisioning_scheduler,
+ ash::cert_provisioning::CertProvisioningScheduler*
+ cert_provisioning_scheduler,
bool is_device_wide) {
for (const auto& worker_entry : cert_provisioning_scheduler->GetWorkers()) {
- CertProvisioningWorker* worker = worker_entry.second.get();
+ ash::cert_provisioning::CertProvisioningWorker* worker =
+ worker_entry.second.get();
list_to_append_to->Append(CreateProvisioningProcessEntry(
worker_entry.first, worker->GetCertProfile().name, is_device_wide,
worker->GetState(), worker->GetLastUpdateTime(),
@@ -142,11 +147,12 @@ void CollectProvisioningProcesses(
}
for (const auto& failed_worker_entry :
cert_provisioning_scheduler->GetFailedCertProfileIds()) {
- const FailedWorkerInfo& worker = failed_worker_entry.second;
+ const ash::cert_provisioning::FailedWorkerInfo& worker =
+ failed_worker_entry.second;
list_to_append_to->Append(CreateProvisioningProcessEntry(
failed_worker_entry.first, worker.cert_profile_name, is_device_wide,
- CertProvisioningWorkerState::kFailed, worker.last_update_time,
- worker.public_key));
+ ash::cert_provisioning::CertProvisioningWorkerState::kFailed,
+ worker.last_update_time, worker.public_key));
}
}
@@ -162,8 +168,8 @@ CertificateProvisioningUiHandler::CreateForProfile(Profile* user_profile) {
CertificateProvisioningUiHandler::CertificateProvisioningUiHandler(
Profile* user_profile,
- CertProvisioningScheduler* scheduler_for_user,
- CertProvisioningScheduler* scheduler_for_device)
+ ash::cert_provisioning::CertProvisioningScheduler* scheduler_for_user,
+ ash::cert_provisioning::CertProvisioningScheduler* scheduler_for_device)
: scheduler_for_user_(scheduler_for_user),
scheduler_for_device_(ShouldUseDeviceWideProcesses(user_profile)
? scheduler_for_device
@@ -243,7 +249,7 @@ void CertificateProvisioningUiHandler::
if (device_wide.GetBool() && !scheduler_for_device_)
return;
- CertProvisioningScheduler* scheduler =
+ ash::cert_provisioning::CertProvisioningScheduler* scheduler =
device_wide.GetBool() ? scheduler_for_device_ : scheduler_for_user_;
if (!scheduler)
return;
diff --git a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h
index a71ce112181..a703d9802cd 100644
--- a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h
@@ -11,7 +11,7 @@
#include "base/scoped_multi_source_observation.h"
#include "base/timer/timer.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_scheduler.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.h"
#include "content/public/browser/web_ui_message_handler.h"
class Profile;
@@ -21,7 +21,7 @@ namespace cert_provisioning {
class CertificateProvisioningUiHandler
: public content::WebUIMessageHandler,
- public CertProvisioningSchedulerObserver {
+ public ash::cert_provisioning::CertProvisioningSchedulerObserver {
public:
// Creates a CertificateProvisioningUiHandler for |user_profile|, which uses:
// (*) The CertProvisioningScheduler associated with |user_profile|, if any.
@@ -41,8 +41,8 @@ class CertificateProvisioningUiHandler
// is useful for unit-testing the affiliation detection logic.
CertificateProvisioningUiHandler(
Profile* user_profile,
- CertProvisioningScheduler* scheduler_for_user,
- CertProvisioningScheduler* scheduler_for_device);
+ ash::cert_provisioning::CertProvisioningScheduler* scheduler_for_user,
+ ash::cert_provisioning::CertProvisioningScheduler* scheduler_for_device);
CertificateProvisioningUiHandler(
const CertificateProvisioningUiHandler& other) = delete;
@@ -89,11 +89,12 @@ class CertificateProvisioningUiHandler
// The user-specific CertProvisioningScheduler. Can be nullptr.
// Unowned.
- CertProvisioningScheduler* const scheduler_for_user_;
+ ash::cert_provisioning::CertProvisioningScheduler* const scheduler_for_user_;
// The device-wide CertProvisioningScheduler. Can be nullptr.
// Unowned.
- CertProvisioningScheduler* const scheduler_for_device_;
+ ash::cert_provisioning::CertProvisioningScheduler* const
+ scheduler_for_device_;
// When this timer is running, updates provided by the schedulers should not
// be forwarded to the UI until it fires. Used to prevent spamming the UI if
@@ -109,8 +110,9 @@ class CertificateProvisioningUiHandler
// Keeps track of the CertProvisioningSchedulers that this UI handler
// observes.
- base::ScopedMultiSourceObservation<CertProvisioningScheduler,
- CertProvisioningSchedulerObserver>
+ base::ScopedMultiSourceObservation<
+ ash::cert_provisioning::CertProvisioningScheduler,
+ ash::cert_provisioning::CertProvisioningSchedulerObserver>
observed_schedulers_{this};
base::WeakPtrFactory<CertificateProvisioningUiHandler> weak_ptr_factory_{
diff --git a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
index ef18fbda19e..5da06cc0824 100644
--- a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
@@ -13,12 +13,12 @@
#include "base/bind.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/values_test_util.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_common.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_scheduler.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_test_helpers.h"
-#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_worker.h"
-#include "chrome/browser/chromeos/cert_provisioning/mock_cert_provisioning_scheduler.h"
-#include "chrome/browser/chromeos/cert_provisioning/mock_cert_provisioning_worker.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_common.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_test_helpers.h"
+#include "chrome/browser/ash/cert_provisioning/cert_provisioning_worker.h"
+#include "chrome/browser/ash/cert_provisioning/mock_cert_provisioning_scheduler.h"
+#include "chrome/browser/ash/cert_provisioning/mock_cert_provisioning_worker.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_task_environment.h"
@@ -85,10 +85,11 @@ constexpr char kDeviceCertProfileName[] = "Device Certificate Profile 1";
constexpr char kUserCertProfileId[] = "user_cert_profile_1";
constexpr char kUserCertProfileName[] = "User Certificate Profile 1";
-void SetupMockCertProvisioningWorker(MockCertProvisioningWorker* worker,
- CertProvisioningWorkerState state,
- const std::string* public_key,
- CertProfile& cert_profile) {
+void SetupMockCertProvisioningWorker(
+ ash::cert_provisioning::MockCertProvisioningWorker* worker,
+ ash::cert_provisioning::CertProvisioningWorkerState state,
+ const std::string* public_key,
+ ash::cert_provisioning::CertProfile& cert_profile) {
EXPECT_CALL(*worker, GetState).WillRepeatedly(Return(state));
EXPECT_CALL(*worker, GetLastUpdateTime).WillRepeatedly(Return(base::Time()));
EXPECT_CALL(*worker, GetPublicKey).WillRepeatedly(ReturnPointee(public_key));
@@ -231,17 +232,25 @@ class CertificateProvisioningUiHandlerTestBase : public ::testing::Test {
content::BrowserTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
- ProfileHelperForTesting profile_helper_for_testing_;
-
- WorkerMap user_workers_;
- base::flat_map<CertProfileId, FailedWorkerInfo> user_failed_workers_;
- StrictMock<MockCertProvisioningScheduler> scheduler_for_user_;
- CertProvisioningSchedulerObserver* scheduler_observer_for_user_ = nullptr;
-
- WorkerMap device_workers_;
- base::flat_map<CertProfileId, FailedWorkerInfo> device_failed_workers_;
- StrictMock<MockCertProvisioningScheduler> scheduler_for_device_;
- CertProvisioningSchedulerObserver* scheduler_observer_for_device_ = nullptr;
+ ash::cert_provisioning::ProfileHelperForTesting profile_helper_for_testing_;
+
+ ash::cert_provisioning::WorkerMap user_workers_;
+ base::flat_map<ash::cert_provisioning::CertProfileId,
+ ash::cert_provisioning::FailedWorkerInfo>
+ user_failed_workers_;
+ StrictMock<ash::cert_provisioning::MockCertProvisioningScheduler>
+ scheduler_for_user_;
+ ash::cert_provisioning::CertProvisioningSchedulerObserver*
+ scheduler_observer_for_user_ = nullptr;
+
+ ash::cert_provisioning::WorkerMap device_workers_;
+ base::flat_map<ash::cert_provisioning::CertProfileId,
+ ash::cert_provisioning::FailedWorkerInfo>
+ device_failed_workers_;
+ StrictMock<ash::cert_provisioning::MockCertProvisioningScheduler>
+ scheduler_for_device_;
+ ash::cert_provisioning::CertProvisioningSchedulerObserver*
+ scheduler_observer_for_device_ = nullptr;
content::TestWebUI web_ui_;
std::unique_ptr<content::WebContents> web_contents_;
@@ -275,21 +284,25 @@ TEST_F(CertificateProvisioningUiHandlerTest, NoProcesses) {
}
TEST_F(CertificateProvisioningUiHandlerTest, HasProcesses) {
- CertProfile user_cert_profile(
+ ash::cert_provisioning::CertProfile user_cert_profile(
kUserCertProfileId, kUserCertProfileName, kCertProfileVersion,
/*is_va_enabled=*/true, kCertProfileRenewalPeriod);
- auto user_cert_worker = std::make_unique<MockCertProvisioningWorker>();
+ auto user_cert_worker =
+ std::make_unique<ash::cert_provisioning::MockCertProvisioningWorker>();
SetupMockCertProvisioningWorker(
- user_cert_worker.get(), CertProvisioningWorkerState::kKeypairGenerated,
+ user_cert_worker.get(),
+ ash::cert_provisioning::CertProvisioningWorkerState::kKeypairGenerated,
&der_encoded_spki_, user_cert_profile);
user_workers_[kUserCertProfileId] = std::move(user_cert_worker);
- CertProfile device_cert_profile(
+ ash::cert_provisioning::CertProfile device_cert_profile(
kDeviceCertProfileId, kDeviceCertProfileName, kCertProfileVersion,
/*is_va_enabled=*/true, kCertProfileRenewalPeriod);
- auto device_cert_worker = std::make_unique<MockCertProvisioningWorker>();
+ auto device_cert_worker =
+ std::make_unique<ash::cert_provisioning::MockCertProvisioningWorker>();
SetupMockCertProvisioningWorker(
- device_cert_worker.get(), CertProvisioningWorkerState::kKeypairGenerated,
+ device_cert_worker.get(),
+ ash::cert_provisioning::CertProvisioningWorkerState::kKeypairGenerated,
&der_encoded_spki_, device_cert_profile);
device_workers_[kDeviceCertProfileId] = std::move(device_cert_worker);
@@ -318,22 +331,26 @@ TEST_F(CertificateProvisioningUiHandlerTest, HasProcesses) {
}
TEST_F(CertificateProvisioningUiHandlerAffiliatedTest, HasProcessesAffiliated) {
- CertProfile user_cert_profile(
+ ash::cert_provisioning::CertProfile user_cert_profile(
kUserCertProfileId, kUserCertProfileName, kCertProfileVersion,
/*is_va_enabled=*/true, kCertProfileRenewalPeriod);
- auto user_cert_worker = std::make_unique<MockCertProvisioningWorker>();
+ auto user_cert_worker =
+ std::make_unique<ash::cert_provisioning::MockCertProvisioningWorker>();
SetupMockCertProvisioningWorker(
- user_cert_worker.get(), CertProvisioningWorkerState::kKeypairGenerated,
+ user_cert_worker.get(),
+ ash::cert_provisioning::CertProvisioningWorkerState::kKeypairGenerated,
&der_encoded_spki_, user_cert_profile);
user_workers_[kUserCertProfileId] = std::move(user_cert_worker);
- CertProfile device_cert_profile(
+ ash::cert_provisioning::CertProfile device_cert_profile(
kDeviceCertProfileId, kDeviceCertProfileName, kCertProfileVersion,
/*is_va_enabled=*/true, kCertProfileRenewalPeriod);
- auto device_cert_worker = std::make_unique<MockCertProvisioningWorker>();
- SetupMockCertProvisioningWorker(device_cert_worker.get(),
- CertProvisioningWorkerState::kFailed,
- &der_encoded_spki_, device_cert_profile);
+ auto device_cert_worker =
+ std::make_unique<ash::cert_provisioning::MockCertProvisioningWorker>();
+ SetupMockCertProvisioningWorker(
+ device_cert_worker.get(),
+ ash::cert_provisioning::CertProvisioningWorkerState::kFailed,
+ &der_encoded_spki_, device_cert_profile);
device_workers_[kDeviceCertProfileId] = std::move(device_cert_worker);
// Both user and device-wide workers are expected to be displayed in the UI,
@@ -388,12 +405,14 @@ TEST_F(CertificateProvisioningUiHandlerTest, Updates) {
ASSERT_THAT(profile_ids, UnorderedElementsAre());
EXPECT_EQ(1U, handler_->ReadAndResetUiRefreshCountForTesting());
- CertProfile user_cert_profile(
+ ash::cert_provisioning::CertProfile user_cert_profile(
kUserCertProfileId, kUserCertProfileName, kCertProfileVersion,
/*is_va_enabled=*/true, kCertProfileRenewalPeriod);
- auto user_cert_worker = std::make_unique<MockCertProvisioningWorker>();
+ auto user_cert_worker =
+ std::make_unique<ash::cert_provisioning::MockCertProvisioningWorker>();
SetupMockCertProvisioningWorker(
- user_cert_worker.get(), CertProvisioningWorkerState::kKeypairGenerated,
+ user_cert_worker.get(),
+ ash::cert_provisioning::CertProvisioningWorkerState::kKeypairGenerated,
&der_encoded_spki_, user_cert_profile);
user_workers_[kUserCertProfileId] = std::move(user_cert_worker);
diff --git a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
index 8467d955405..ff88cf14371 100644
--- a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
+++ b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
@@ -174,7 +174,7 @@ ui::ModalType CertificateViewerDialog::GetDialogModalType() const {
return ui::MODAL_TYPE_NONE;
}
-base::string16 CertificateViewerDialog::GetDialogTitle() const {
+std::u16string CertificateViewerDialog::GetDialogTitle() const {
return title_;
}
diff --git a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
index 6aa0969aa7a..d5cdb430d61 100644
--- a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
+++ b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
@@ -48,7 +48,7 @@ class CertificateViewerDialog : public ui::WebDialogDelegate {
// ui::WebDialogDelegate:
ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
+ std::u16string GetDialogTitle() const override;
GURL GetDialogContentURL() const override;
void GetWebUIMessageHandlers(
std::vector<content::WebUIMessageHandler*>* handlers) const override;
@@ -64,7 +64,7 @@ class CertificateViewerDialog : public ui::WebDialogDelegate {
net::ScopedCERTCertificateList nss_certs_;
// The title of the certificate viewer dialog, Certificate Viewer: CN.
- base::string16 title_;
+ std::u16string title_;
content::WebUI* webui_ = nullptr;
ConstrainedWebDialogDelegate* delegate_ = nullptr;
diff --git a/chromium/chrome/browser/ui/webui/certificates_handler.cc b/chromium/chrome/browser/ui/webui/certificates_handler.cc
index 285bf4168d0..059b698af0c 100644
--- a/chromium/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chromium/chrome/browser/ui/webui/certificates_handler.cc
@@ -98,8 +98,8 @@ struct DictionaryIdComparator {
const base::DictionaryValue* b_dict;
bool b_is_dictionary = b.GetAsDictionary(&b_dict);
DCHECK(b_is_dictionary);
- base::string16 a_str;
- base::string16 b_str;
+ std::u16string a_str;
+ std::u16string b_str;
a_dict->GetString(kCertificatesHandlerNameField, &a_str);
b_dict->GetString(kCertificatesHandlerNameField, &b_str);
if (collator_ == nullptr)
@@ -507,7 +507,7 @@ void CertificatesHandler::HandleExportPersonal(const base::ListValue* args) {
this,
std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents()));
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(),
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(),
base::FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"),
GetParentWindow(),
reinterpret_cast<void*>(EXPORT_PERSONAL_FILE_SELECTED));
@@ -601,7 +601,7 @@ void CertificatesHandler::HandleImportPersonal(const base::ListValue* args) {
this,
std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents()));
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(),
+ ui::SelectFileDialog::SELECT_OPEN_FILE, std::u16string(),
base::FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"),
GetParentWindow(),
reinterpret_cast<void*>(IMPORT_PERSONAL_FILE_SELECTED));
diff --git a/chromium/chrome/browser/ui/webui/certificates_handler.h b/chromium/chrome/browser/ui/webui/certificates_handler.h
index ec6dda4dcd2..09081cf49d1 100644
--- a/chromium/chrome/browser/ui/webui/certificates_handler.h
+++ b/chromium/chrome/browser/ui/webui/certificates_handler.h
@@ -228,7 +228,7 @@ class CertificatesHandler : public content::WebUIMessageHandler,
// password, etc the user chose while we wait for them to enter a password,
// wait for file to be read, etc.
base::FilePath file_path_;
- base::string16 password_;
+ std::u16string password_;
// The WebUI callback ID of the last in-flight async request. There is always
// only one in-flight such request.
std::string webui_callback_id_;
diff --git a/chromium/chrome/browser/ui/webui/chrome_untrusted_web_ui_controller_factory.cc b/chromium/chrome/browser/ui/webui/chrome_untrusted_web_ui_controller_factory.cc
index 6be318681f9..924c7b83a17 100644
--- a/chromium/chrome/browser/ui/webui/chrome_untrusted_web_ui_controller_factory.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_untrusted_web_ui_controller_factory.cc
@@ -19,7 +19,7 @@
#endif // defined(OS_ANDROID)
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/web_applications/terminal_ui.h"
+#include "chrome/browser/ash/web_applications/terminal_ui.h"
#if !defined(OFFICIAL_BUILD)
#include "chromeos/components/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.h"
#endif // !defined(OFFICIAL_BUILD)
diff --git a/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc b/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
index d784a95efe4..a23843a4c58 100644
--- a/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
@@ -2,14 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
+
#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/browser/ui/webui/welcome/helpers.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
@@ -20,13 +24,14 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/notification_types.h"
+#include "content/public/browser/url_data_source.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
namespace {
class NavigationObserver : public content::WebContentsObserver {
-public:
+ public:
enum NavigationResult {
NOT_FINISHED,
ERROR_PAGE,
@@ -72,7 +77,14 @@ public:
} // namespace
-typedef InProcessBrowserTest ChromeURLDataManagerTest;
+class ChromeURLDataManagerTest : public InProcessBrowserTest {
+ protected:
+ void SetUpOnMainThread() override {
+ content::URLDataSource::Add(
+ browser()->profile(),
+ std::make_unique<ThemeSource>(browser()->profile()));
+ }
+};
// Makes sure navigating to the new tab page results in a http status code
// of 200.
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
index 868c0254910..813cbbe544c 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
@@ -6,6 +6,7 @@
#include <utility>
+#include "chrome/browser/file_select_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
@@ -13,6 +14,7 @@
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "content/public/browser/file_select_listener.h"
#include "content/public/browser/web_contents.h"
using content::BrowserContext;
@@ -114,3 +116,11 @@ void ChromeWebContentsHandler::AddNewContents(
if (browser_created && (browser != params.browser))
browser->window()->Close();
}
+
+void ChromeWebContentsHandler::RunFileChooser(
+ content::RenderFrameHost* render_frame_host,
+ scoped_refptr<content::FileSelectListener> listener,
+ const blink::mojom::FileChooserParams& params) {
+ FileSelectHelper::RunFileChooser(render_frame_host, std::move(listener),
+ params);
+}
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
index fefd9a407de..1aa083aba2d 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
+++ b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
@@ -27,6 +27,9 @@ class ChromeWebContentsHandler
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture) override;
+ void RunFileChooser(content::RenderFrameHost* render_frame_host,
+ scoped_refptr<content::FileSelectListener> listener,
+ const blink::mojom::FileChooserParams& params) override;
private:
DISALLOW_COPY_AND_ASSIGN(ChromeWebContentsHandler);
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 96a009f80e1..a42d0369f38 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -43,7 +43,6 @@
#include "chrome/browser/ui/webui/local_state/local_state_ui.h"
#include "chrome/browser/ui/webui/log_web_ui_url.h"
#include "chrome/browser/ui/webui/media/media_engagement_ui.h"
-#include "chrome/browser/ui/webui/media/media_feeds_ui.h"
#include "chrome/browser/ui/webui/media/media_history_ui.h"
#include "chrome/browser/ui/webui/media/webrtc_logs_ui.h"
#include "chrome/browser/ui/webui/memory_internals_ui.h"
@@ -60,7 +59,7 @@
#include "chrome/browser/ui/webui/usb_internals/usb_internals_ui.h"
#include "chrome/browser/ui/webui/user_actions/user_actions_ui.h"
#include "chrome/browser/ui/webui/version/version_ui.h"
-#include "chrome/browser/web_applications/system_web_app_manager.h"
+#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
@@ -71,7 +70,7 @@
#include "components/favicon_base/select_favicon_frames.h"
#include "components/grit/components_scaled_resources.h"
#include "components/history/core/browser/history_types.h"
-#include "components/memories/core/memories_features.h"
+#include "components/history_clusters/core/memories_features.h"
#include "components/nacl/common/buildflags.h"
#include "components/prefs/pref_service.h"
#include "components/reading_list/features/reading_list_switches.h"
@@ -117,12 +116,12 @@
#include "components/feed/buildflags.h"
#include "components/feed/feed_feature_list.h"
#else // defined(OS_ANDROID)
-#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h"
#include "chrome/browser/ui/webui/commander/commander_ui.h"
#include "chrome/browser/ui/webui/devtools_ui.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_ui.h"
#include "chrome/browser/ui/webui/downloads/downloads_ui.h"
#include "chrome/browser/ui/webui/feedback/feedback_ui.h"
#include "chrome/browser/ui/webui/history/history_ui.h"
@@ -132,6 +131,7 @@
#include "chrome/browser/ui/webui/media_router/media_router_internals_ui.h"
#include "chrome/browser/ui/webui/memories/memories_ui.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h"
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
#include "chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.h"
#include "chrome/browser/ui/webui/read_later/read_later_ui.h"
@@ -149,25 +149,27 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_switches.h"
+#include "ash/content/scanning/scanning_ui.h"
+#include "ash/content/scanning/url_constants.h"
#include "base/system/sys_info.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h"
#include "chrome/browser/ash/login/easy_unlock/easy_unlock_service_factory.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/login/login_pref_names.h"
+#include "chrome/browser/ash/scanning/chrome_scanning_app_delegate.h"
+#include "chrome/browser/ash/scanning/scan_service.h"
+#include "chrome/browser/ash/scanning/scan_service_factory.h"
+#include "chrome/browser/ash/web_applications/chrome_camera_app_ui_delegate.h"
+#include "chrome/browser/ash/web_applications/chrome_help_app_ui_delegate.h"
+#include "chrome/browser/ash/web_applications/chrome_media_app_ui_delegate.h"
+#include "chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.h"
#include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h"
-#include "chrome/browser/chromeos/file_manager/path_util.h"
-#include "chrome/browser/chromeos/login/login_pref_names.h"
+#include "chrome/browser/chromeos/eche_app/eche_app_manager_factory.h"
#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_service_factory.h"
#include "chrome/browser/chromeos/net/network_health/network_health_service.h"
#include "chrome/browser/chromeos/printing/print_management/printing_manager.h"
#include "chrome/browser/chromeos/printing/print_management/printing_manager_factory.h"
-#include "chrome/browser/chromeos/scanning/scan_service.h"
-#include "chrome/browser/chromeos/scanning/scan_service_factory.h"
-#include "chrome/browser/chromeos/scanning/scanning_paths_provider_impl.h"
-#include "chrome/browser/chromeos/scanning/scanning_util.h"
#include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
-#include "chrome/browser/chromeos/web_applications/chrome_camera_app_ui_delegate.h"
-#include "chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.h"
-#include "chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.h"
#include "chrome/browser/feedback/feedback_dialog_utils.h"
#include "chrome/browser/nearby_sharing/nearby_sharing_service_factory.h"
#include "chrome/browser/ui/webui/chromeos/account_manager/account_manager_error_ui.h"
@@ -185,7 +187,8 @@
#include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h"
#include "chrome/browser/ui/webui/chromeos/cryptohome_ui.h"
#include "chrome/browser/ui/webui/chromeos/drive_internals_ui.h"
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h"
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h"
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h"
#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_start_reauth_ui.h"
#include "chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h"
#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
@@ -202,6 +205,7 @@
#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.h"
#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.h"
#include "chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_ui.h"
+#include "chrome/browser/ui/webui/chromeos/vm/vm_ui.h"
#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.h"
#include "chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h"
@@ -211,6 +215,7 @@
#include "chromeos/components/connectivity_diagnostics/url_constants.h"
#include "chromeos/components/diagnostics_ui/diagnostics_ui.h"
#include "chromeos/components/diagnostics_ui/url_constants.h"
+#include "chromeos/components/eche_app_ui/eche_app_manager.h"
#include "chromeos/components/eche_app_ui/eche_app_ui.h"
#include "chromeos/components/eche_app_ui/url_constants.h"
#include "chromeos/components/help_app_ui/help_app_ui.h"
@@ -220,10 +225,10 @@
#include "chromeos/components/media_app_ui/url_constants.h"
#include "chromeos/components/multidevice/debug_webui/proximity_auth_ui.h"
#include "chromeos/components/multidevice/debug_webui/url_constants.h"
+#include "chromeos/components/personalization_app/personalization_app_ui.h"
+#include "chromeos/components/personalization_app/personalization_app_url_constants.h"
#include "chromeos/components/print_management/print_management_ui.h"
#include "chromeos/components/print_management/url_constants.h"
-#include "chromeos/components/scanning/scanning_ui.h"
-#include "chromeos/components/scanning/url_constants.h"
#include "chromeos/services/multidevice_setup/multidevice_setup_service.h"
#include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
#include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom.h"
@@ -232,7 +237,7 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH) && !defined(OFFICIAL_BUILD)
-#include "chrome/browser/chromeos/web_applications/chrome_file_manager_ui_delegate.h"
+#include "chrome/browser/ash/web_applications/chrome_file_manager_ui_delegate.h"
#include "chrome/browser/ui/webui/chromeos/emulator/device_emulator_ui.h"
#include "chromeos/components/file_manager/file_manager_ui.h"
#include "chromeos/components/file_manager/url_constants.h"
@@ -253,6 +258,7 @@
#if !BUILDFLAG(IS_CHROMEOS_ASH) && !defined(OS_ANDROID)
#include "chrome/browser/ui/sync/sync_promo_ui.h"
#include "chrome/browser/ui/webui/browser_switch/browser_switch_ui.h"
+#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
#include "chrome/browser/ui/webui/signin/profile_customization_ui.h"
#include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
#include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
@@ -375,12 +381,30 @@ NewWebUI<chromeos::printing::printing_manager::PrintManagementUI>(
base::BindRepeating(&BindPrintManagement, Profile::FromWebUI(web_ui)));
}
+void BindEcheSignalingMessageExchanger(
+ Profile* profile,
+ mojo::PendingReceiver<chromeos::eche_app::mojom::SignalingMessageExchanger>
+ receiver) {
+ chromeos::eche_app::EcheAppManager* manager =
+ chromeos::eche_app::EcheAppManagerFactory::GetForProfile(profile);
+ if (manager) {
+ manager->BindInterface(std::move(receiver));
+ }
+}
+
+template <>
+WebUIController* NewWebUI<chromeos::eche_app::EcheAppUI>(WebUI* web_ui,
+ const GURL& url) {
+ return new chromeos::eche_app::EcheAppUI(
+ web_ui, base::BindRepeating(&BindEcheSignalingMessageExchanger,
+ Profile::FromWebUI(web_ui)));
+}
+
void BindScanService(
Profile* profile,
- mojo::PendingReceiver<chromeos::scanning::mojom::ScanService>
- pending_receiver) {
- chromeos::ScanService* service =
- chromeos::ScanServiceFactory::GetForBrowserContext(profile);
+ mojo::PendingReceiver<ash::scanning::mojom::ScanService> pending_receiver) {
+ ash::ScanService* service =
+ ash::ScanServiceFactory::GetForBrowserContext(profile);
if (service)
service->BindInterface(std::move(pending_receiver));
}
@@ -391,17 +415,11 @@ std::unique_ptr<ui::SelectFilePolicy> CreateChromeSelectFilePolicy(
}
template <>
-WebUIController* NewWebUI<chromeos::ScanningUI>(WebUI* web_ui,
- const GURL& url) {
+WebUIController* NewWebUI<ash::ScanningUI>(WebUI* web_ui, const GURL& url) {
Profile* profile = Profile::FromWebUI(web_ui);
- return new chromeos::ScanningUI(
+ return new ash::ScanningUI(
web_ui, base::BindRepeating(&BindScanService, profile),
- base::BindRepeating(&CreateChromeSelectFilePolicy),
- std::make_unique<chromeos::ScanningPathsProviderImpl>(),
- base::BindRepeating(
- &chromeos::scanning::ShowFileInFilesApp,
- chromeos::scanning::GetDrivePath(profile),
- file_manager::util::GetMyFilesFolderForProfile(profile)));
+ std::make_unique<ash::ChromeScanningAppDelegate>(web_ui));
}
template <>
@@ -603,13 +621,15 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
url.host_piece() == chrome::kChromeUIBookmarksHost ||
url.host_piece() == chrome::kChromeUIHistoryHost ||
url.host_piece() == chrome::kChromeUIExtensionsHost ||
- url.host_piece() == chrome::kChromeUINewTabPageHost)) {
+ url.host_piece() == chrome::kChromeUINewTabPageHost ||
+ url.host_piece() == chrome::kChromeUINewTabPageThirdPartyHost)) {
return &NewWebUI<PageNotAvailableForGuestUI>;
}
if (profile->IsEphemeralGuestProfile() &&
(url.host_piece() == chrome::kChromeUIBookmarksHost ||
url.host_piece() == chrome::kChromeUIExtensionsHost ||
- url.host_piece() == chrome::kChromeUINewTabPageHost)) {
+ url.host_piece() == chrome::kChromeUINewTabPageHost ||
+ url.host_piece() == chrome::kChromeUINewTabPageThirdPartyHost)) {
return &NewWebUI<PageNotAvailableForGuestUI>;
}
// Bookmarks are part of NTP on Android.
@@ -617,6 +637,10 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<BookmarksUI>;
if (url.host_piece() == chrome::kChromeUICommanderHost)
return &NewWebUI<CommanderUI>;
+ if (url.host_piece() == chrome::kChromeUIDownloadShelfHost &&
+ base::FeatureList::IsEnabled(features::kWebUIDownloadShelf)) {
+ return &NewWebUI<DownloadShelfUI>;
+ }
// Downloads list on Android uses the built-in download manager.
if (url.host_piece() == chrome::kChromeUIDownloadsHost)
return &NewWebUI<DownloadsUI>;
@@ -627,6 +651,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<NewTabUI>;
if (url.host_piece() == chrome::kChromeUINewTabPageHost)
return &NewWebUI<NewTabPageUI>;
+ if (url.host_piece() == chrome::kChromeUINewTabPageThirdPartyHost)
+ return &NewWebUI<NewTabPageThirdPartyUI>;
if (base::FeatureList::IsEnabled(features::kWebUIFeedback)) {
if (url.host_piece() == chrome::kChromeUIFeedbackHost)
return &NewWebUI<FeedbackUI>;
@@ -642,10 +668,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
// Settings are implemented with native UI elements on Android.
if (url.host_piece() == chrome::kChromeUISettingsHost)
return &NewWebUI<settings::SettingsUI>;
- if (url.host_piece() == chrome::kChromeUITabSearchHost &&
- base::FeatureList::IsEnabled(features::kTabSearch)) {
+ if (url.host_piece() == chrome::kChromeUITabSearchHost)
return &NewWebUI<TabSearchUI>;
- }
if (url.host_piece() == chrome::kChromeUIExtensionsHost)
return &NewWebUI<extensions::ExtensionsUI>;
if (url.host_piece() == chrome::kChromeUIHistoryHost)
@@ -693,6 +717,12 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
}
return &NewWebUI<chromeos::LockScreenStartReauthUI>;
}
+ if (url.host_piece() == chrome::kChromeUILockScreenNetworkHost) {
+ if (!ash::features::IsSamlReauthenticationOnLockscreenEnabled()) {
+ return nullptr;
+ }
+ return &NewWebUI<chromeos::LockScreenNetworkUI>;
+ }
if (url.host_piece() == chrome::kChromeUIAccountManagerErrorHost)
return &NewWebUI<chromeos::AccountManagerErrorUI>;
if (url.host_piece() == chrome::kChromeUIAccountManagerWelcomeHost)
@@ -709,15 +739,11 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
if (url.host_piece() == chrome::kChromeUICertificateManagerHost)
return &NewWebUI<chromeos::CertificateManagerDialogUI>;
#endif // !BUILDFLAG(IS_CHROMEOS_LACROS)
- if (base::FeatureList::IsEnabled(
- chromeos::features::kConnectivityDiagnosticsWebUi) &&
- url.host_piece() == chromeos::kChromeUIConnectivityDiagnosticsHost) {
+ if (url.host_piece() == chromeos::kChromeUIConnectivityDiagnosticsHost)
return &NewWebUI<chromeos::ConnectivityDiagnosticsUI>;
- }
if (url.host_piece() == chrome::kChromeUICrostiniInstallerHost)
return &NewWebUI<chromeos::CrostiniInstallerUI>;
- if (chromeos::CrostiniUpgraderUI::IsEnabled() &&
- url.host_piece() == chrome::kChromeUICrostiniUpgraderHost)
+ if (url.host_piece() == chrome::kChromeUICrostiniUpgraderHost)
return &NewWebUI<chromeos::CrostiniUpgraderUI>;
if (url.host_piece() == chrome::kChromeUICryptohomeHost)
return &NewWebUI<chromeos::CryptohomeUI>;
@@ -747,10 +773,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
}
if (url.host_piece() == chromeos::kChromeUIPrintManagementHost)
return &NewWebUI<chromeos::printing::printing_manager::PrintManagementUI>;
- if (base::FeatureList::IsEnabled(chromeos::features::kScanningUI) &&
- url.host_piece() == chromeos::kChromeUIScanningAppHost) {
- return &NewWebUI<chromeos::ScanningUI>;
- }
+ if (url.host_piece() == ash::kChromeUIScanningAppHost)
+ return &NewWebUI<ash::ScanningUI>;
if (base::FeatureList::IsEnabled(chromeos::features::kMediaApp)) {
if (url.host_piece() == chromeos::kChromeUIMediaAppHost)
return &NewComponentUI<chromeos::MediaAppUI, ChromeMediaAppUIDelegate>;
@@ -805,12 +829,21 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
}
if (url.host_piece() == chrome::kChromeUIEmojiPickerHost &&
base::FeatureList::IsEnabled(chromeos::features::kImeSystemEmojiPicker)) {
- return &NewWebUI<chromeos::EmojiPicker>;
+ return &NewWebUI<chromeos::EmojiUI>;
}
if (url.host_piece() == chromeos::eche_app::kChromeUIEcheAppHost &&
base::FeatureList::IsEnabled(chromeos::features::kEcheSWA)) {
return &NewWebUI<chromeos::eche_app::EcheAppUI>;
}
+ if (url.host_piece() == chrome::kChromeUIVmHost &&
+ base::FeatureList::IsEnabled(chromeos::features::kVmStatusPage)) {
+ return &NewWebUI<chromeos::VmUI>;
+ }
+ if (url.host_piece() == chromeos::kChromeUIPersonalizationAppHost &&
+ chromeos::features::IsWallpaperWebUIEnabled()) {
+ return &NewComponentUI<chromeos::PersonalizationAppUI,
+ ChromePersonalizationAppUiDelegate>;
+ }
#if !defined(OFFICIAL_BUILD)
#if !defined(USE_REAL_DBUS_CLIENTS)
@@ -869,6 +902,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
}
#endif // defined(OS_ANDROID)
#if !BUILDFLAG(IS_CHROMEOS_ASH) && !defined(OS_ANDROID)
+ if (url.host_piece() == chrome::kChromeUIEnterpriseProfileWelcomeHost)
+ return &NewWebUI<EnterpriseProfileWelcomeUI>;
if (url.host_piece() == chrome::kChromeUIProfileCustomizationHost)
return &NewWebUI<ProfileCustomizationUI>;
if (url.host_piece() == chrome::kChromeUIProfilePickerHost)
@@ -971,13 +1006,6 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<MediaEngagementUI>;
}
-#if !defined(OS_ANDROID)
- if (media_feeds::MediaFeedsService::IsEnabled() &&
- url.host_piece() == chrome::kChromeUIMediaFeedsHost) {
- return &NewWebUI<MediaFeedsUI>;
- }
-#endif
-
if (media_history::MediaHistoryKeyedService::IsEnabled() &&
url.host_piece() == chrome::kChromeUIMediaHistoryHost) {
return &NewWebUI<MediaHistoryUI>;
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory_browsertest.cc b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory_browsertest.cc
index 85cebc43a5f..d368635465e 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory_browsertest.cc
@@ -29,8 +29,7 @@ IN_PROC_BROWSER_TEST_F(ChromeWebUIControllerFactoryBrowserTest,
GURL(base::StrCat({"chrome-untrusted://", chrome::kChromeUIVersionHost,
"/title2.html"}))));
auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
- EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"),
- web_contents->GetTitle());
+ EXPECT_EQ(u"Title Of Awesomeness", web_contents->GetTitle());
EXPECT_FALSE(web_contents->GetWebUI());
// Check that we can navigate to chrome://version and that it serves the right
@@ -38,6 +37,6 @@ IN_PROC_BROWSER_TEST_F(ChromeWebUIControllerFactoryBrowserTest,
EXPECT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL(base::StrCat({"chrome://", chrome::kChromeUIVersionHost,
"/title2.html"}))));
- EXPECT_EQ(base::ASCIIToUTF16("About Version"), web_contents->GetTitle());
+ EXPECT_EQ(u"About Version", web_contents->GetTitle());
EXPECT_TRUE(web_contents->GetWebUI());
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.cc
index bc5579c8ee1..6023611982b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.cc
@@ -36,7 +36,7 @@ constexpr int kMaxNumTimesShown = 1;
AccountManagerWelcomeDialog::AccountManagerWelcomeDialog()
: SystemWebDialogDelegate(GURL(chrome::kChromeUIAccountManagerWelcomeURL),
- base::string16() /* title */) {}
+ std::u16string() /* title */) {}
AccountManagerWelcomeDialog::~AccountManagerWelcomeDialog() {
DCHECK_EQ(this, g_dialog);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_dialog.cc
index 31504a89ca1..858532914e4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_dialog.cc
@@ -30,7 +30,7 @@ constexpr int kSigninDialogHeight = 640;
AccountMigrationWelcomeDialog::AccountMigrationWelcomeDialog(
const GURL gurl,
const std::string& email)
- : SystemWebDialogDelegate(gurl, base::string16() /* title */),
+ : SystemWebDialogDelegate(gurl, std::u16string() /* title */),
email_(email),
id_(gurl.spec()) {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
index 021040da4f5..35a43a4a5fa 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
@@ -11,7 +11,7 @@
#include "base/stl_util.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
@@ -61,9 +61,6 @@ void AddSupervisionHandler::GetInstalledArcApps(
return;
}
- apps::AppServiceProxy* proxy =
- apps::AppServiceProxyFactory::GetForProfile(profile);
-
if (!arc::ArcSessionManager::Get()) {
DLOG(WARNING) << "No ArcSessionManager available";
std::move(callback).Run({});
@@ -77,8 +74,10 @@ void AddSupervisionHandler::GetInstalledArcApps(
}
std::vector<std::string> installed_arc_apps;
- proxy->AppRegistryCache().ForEachApp(
- [&installed_arc_apps, profile](const apps::AppUpdate& update) {
+ apps::AppServiceProxyFactory::GetForProfile(profile)
+ ->AppRegistryCache()
+ .ForEachApp([&installed_arc_apps,
+ profile](const apps::AppUpdate& update) {
if (ShouldIncludeAppUpdate(update)) {
std::string package_name =
arc::AppIdToArcPackageName(update.AppId(), profile);
@@ -100,8 +99,7 @@ void AddSupervisionHandler::GetOAuthToken(GetOAuthTokenCallback callback) {
oauth2_access_token_fetcher_ =
identity_manager_->CreateAccessTokenFetcherForAccount(
- identity_manager_->GetPrimaryAccountId(
- signin::ConsentLevel::kNotRequired),
+ identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
"add_supervision", scopes,
base::BindOnce(&AddSupervisionHandler::OnAccessTokenFetchComplete,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
index f841a255d89..b6b05e91d8a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
@@ -26,6 +26,7 @@ class AddSupervisionMetricsRecorderTest : public InProcessBrowserTest {
~AddSupervisionMetricsRecorderTest() override = default;
void SetUpOnMainThread() override {
+ identity_test_env_ = std::make_unique<signin::IdentityTestEnvironment>();
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
test_web_ui_.set_web_contents(web_contents);
@@ -43,20 +44,17 @@ class AddSupervisionMetricsRecorderTest : public InProcessBrowserTest {
}
void CloseAddSupervisionDialog() {
- bool out_close_dialog =
- AddSupervisionDialog::GetInstance()->DeprecatedOnDialogCloseRequested();
- EXPECT_TRUE(out_close_dialog);
+ AddSupervisionDialog::GetInstance()->OnDialogWillClose();
CloseNowForTesting();
}
void NotifySupervisionEnabled() {
- signin::IdentityTestEnvironment identity_test_env;
mojo::PendingReceiver<add_supervision::mojom::AddSupervisionHandler>
receiver;
AddSupervisionUI add_supervision_ui(&test_web_ui_);
AddSupervisionHandler add_supervision_handler(
std::move(receiver), &test_web_ui_,
- identity_test_env.identity_manager(), &add_supervision_ui);
+ identity_test_env_->identity_manager(), &add_supervision_ui);
add_supervision_handler.NotifySupervisionEnabled();
}
@@ -68,6 +66,7 @@ class AddSupervisionMetricsRecorderTest : public InProcessBrowserTest {
private:
DISALLOW_COPY_AND_ASSIGN(AddSupervisionMetricsRecorderTest);
+ std::unique_ptr<signin::IdentityTestEnvironment> identity_test_env_;
content::TestWebUI test_web_ui_;
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
index a8c7890bbfa..644ccb0e3f2 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
@@ -126,11 +126,10 @@ bool AddSupervisionDialog::OnDialogCloseRequested() {
return !showing_confirm_dialog;
}
-bool AddSupervisionDialog::DeprecatedOnDialogCloseRequested() {
+void AddSupervisionDialog::OnDialogWillClose() {
// Record UMA metric that user has closed the Add Supervision dialog.
AddSupervisionMetricsRecorder::GetInstance()->RecordAddSupervisionEnrollment(
AddSupervisionMetricsRecorder::EnrollmentState::kClosed);
- return true;
}
bool AddSupervisionDialog::ShouldCloseDialogOnEscape() const {
@@ -139,7 +138,7 @@ bool AddSupervisionDialog::ShouldCloseDialogOnEscape() const {
AddSupervisionDialog::AddSupervisionDialog()
: SystemWebDialogDelegate(GURL(chrome::kChromeUIAddSupervisionURL),
- base::string16()) {}
+ std::u16string()) {}
AddSupervisionDialog::~AddSupervisionDialog() = default;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
index 9677c3839d8..9238359f6e4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
@@ -49,7 +49,7 @@ class AddSupervisionDialog : public SystemWebDialogDelegate {
ui::ModalType GetDialogModalType() const override;
void GetDialogSize(gfx::Size* size) const override;
bool OnDialogCloseRequested() override;
- bool DeprecatedOnDialogCloseRequested() override;
+ void OnDialogWillClose() override;
bool ShouldCloseDialogOnEscape() const override;
protected:
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
index 8308b73841a..53c8f7edb2c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
@@ -61,7 +61,7 @@ ui::ModalType ConfirmSignoutDialog::GetModalType() const {
return ui::ModalType::MODAL_TYPE_SYSTEM;
}
-base::string16 ConfirmSignoutDialog::GetWindowTitle() const {
+std::u16string ConfirmSignoutDialog::GetWindowTitle() const {
return l10n_util::GetStringUTF16(IDS_ADD_SUPERVISION_EXIT_DIALOG_TITLE);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
index 4e0bab6f69d..8e969c4322b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
@@ -28,7 +28,7 @@ class ConfirmSignoutDialog : public views::DialogDelegateView {
// views::WidgetDelegate:
ui::ModalType GetModalType() const override;
- base::string16 GetWindowTitle() const override;
+ std::u16string GetWindowTitle() const override;
// views::DialogDelegate:
bool Accept() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
index ddd95d7bf85..35e2c978270 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -24,11 +24,11 @@
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_graphics_jank_detector.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_system_model.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_tracing_model.h"
+#include "chrome/browser/ash/arc/tracing/arc_graphics_jank_detector.h"
+#include "chrome/browser/ash/arc/tracing/arc_system_model.h"
+#include "chrome/browser/ash/arc/tracing/arc_system_stat_collector.h"
+#include "chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.h"
+#include "chrome/browser/ash/arc/tracing/arc_tracing_model.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/profiles/profile.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
index dde1522879a..c1cb27450b8 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
@@ -11,11 +11,11 @@
#include "base/task/thread_pool.h"
#include "base/trace_event/trace_event.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_tracing_model.h"
-#include "chrome/browser/chromeos/arc/tracing/arc_value_event_trimmer.h"
+#include "chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.h"
+#include "chrome/browser/ash/arc/tracing/arc_system_stat_collector.h"
+#include "chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.h"
+#include "chrome/browser/ash/arc/tracing/arc_tracing_model.h"
+#include "chrome/browser/ash/arc/tracing/arc_value_event_trimmer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "components/arc/arc_service_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
index 58397c1546e..e6aeb54be14 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
@@ -15,7 +15,7 @@
#include "base/strings/string_number_conversions.h"
#include "build/buildflag.h"
#include "chrome/browser/ash/assistant/assistant_util.h"
-#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h"
+#include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/ash_util.h"
@@ -169,7 +169,7 @@ bool AssistantOptInDialog::BounceIfActive() {
AssistantOptInDialog::AssistantOptInDialog(
ash::FlowType type,
ash::AssistantSetup::StartAssistantOptInFlowCallback callback)
- : SystemWebDialogDelegate(CreateAssistantOptInURL(type), base::string16()),
+ : SystemWebDialogDelegate(CreateAssistantOptInURL(type), std::u16string()),
callback_(std::move(callback)) {}
AssistantOptInDialog::~AssistantOptInDialog() {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
index c689f9a421c..236e14a9e9d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -203,11 +203,6 @@ base::Value GetSettingsUiStrings(const assistant::SettingsUi& settings_ui,
dictionary.SetKey(
"valuePropIntro",
base::Value(activity_control_ui.intro_text_paragraph(0)));
- if (activity_control_ui.intro_text_paragraph_size() > 1) {
- dictionary.SetKey(
- "valuePropIntroTitle",
- base::Value(activity_control_ui.intro_text_paragraph(1)));
- }
}
if (activity_control_ui.footer_paragraph_size()) {
dictionary.SetKey("valuePropFooter",
@@ -234,10 +229,9 @@ void RecordActivityControlConsent(Profile* profile,
bool opted_in) {
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
// This function doesn't care about browser sync consent.
- DCHECK(
- identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+ DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
const CoreAccountId account_id =
- identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+ identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
using sync_pb::UserConsentTypes;
UserConsentTypes::AssistantActivityControlConsent consent;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
index f60dcee986f..a97d5a36582 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
@@ -45,7 +45,7 @@ void AddBluetoothStrings(content::WebUIDataSource* html_source) {
// static
SystemWebDialogDelegate* BluetoothPairingDialog::ShowDialog(
const std::string& address,
- const base::string16& name_for_display,
+ const std::u16string& name_for_display,
bool paired,
bool connected) {
std::string cannonical_address =
@@ -68,11 +68,11 @@ SystemWebDialogDelegate* BluetoothPairingDialog::ShowDialog(
BluetoothPairingDialog::BluetoothPairingDialog(
const std::string& address,
- const base::string16& name_for_display,
+ const std::u16string& name_for_display,
bool paired,
bool connected)
: SystemWebDialogDelegate(GURL(chrome::kChromeUIBluetoothPairingURL),
- base::string16() /* title */),
+ std::u16string() /* title */),
address_(address) {
device_data_.SetString("address", address);
device_data_.SetString("name", name_for_display);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h
index 6bd87d9596b..dff7efb7607 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h
@@ -5,8 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_BLUETOOTH_PAIRING_DIALOG_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_BLUETOOTH_PAIRING_DIALOG_H_
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "ui/web_dialogs/web_dialog_ui.h"
@@ -17,13 +18,13 @@ class BluetoothPairingDialog : public SystemWebDialogDelegate {
// Shows a bluetooth pairing dialog. The dialog is returned for testing.
static SystemWebDialogDelegate* ShowDialog(
const std::string& address,
- const base::string16& name_for_display,
+ const std::u16string& name_for_display,
bool paired,
bool connected);
protected:
BluetoothPairingDialog(const std::string& address,
- const base::string16& name_for_display,
+ const std::u16string& name_for_display,
bool paired,
bool connected);
~BluetoothPairingDialog() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc
index a7a3a2b0b98..fb11b2529c9 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc
@@ -27,9 +27,6 @@ constexpr webui::LocalizedString kLocalizedStringsWithoutPlaceholders[] = {
{"cancel", IDS_CANCEL},
{"back", IDS_CELLULAR_SETUP_BACK_LABEL},
{"done", IDS_CELLULAR_SETUP_DONE_LABEL},
- {"eSimFlowSetup", IDS_CELLULAR_SETUP_CELLULAR_SETUP_PAGE_ESIM_LABEL},
- {"eSimFlowSetupMessage",
- IDS_CELLULAR_SETUP_CELLULAR_SETUP_PAGE_ESIM_MESSAGE},
{"establishNetworkConnectionMessage",
IDS_CELLULAR_SETUP_ESTABLISH_NETWORK_CONNECTION},
{"next", IDS_CELLULAR_SETUP_NEXT_LABEL},
@@ -40,6 +37,8 @@ constexpr webui::LocalizedString kLocalizedStringsWithoutPlaceholders[] = {
{"simDetectPageErrorTitle", IDS_CELLULAR_SETUP_SIM_DETECT_PAGE_ERROR_TITLE},
{"simDetectPageErrorMessage",
IDS_CELLULAR_SETUP_SIM_DETECT_PAGE_ERROR_MESSAGE},
+ {"simDetectPageFinalErrorMessage",
+ IDS_CELLULAR_SETUP_SIM_DETECT_PAGE_FINAL_ERROR_MESSAGE},
{"provisioningPageLoadingTitle",
IDS_CELLULAR_SETUP_PROVISIONING_PAGE_LOADING_TITLE},
{"provisioningPageActiveTitle",
@@ -48,11 +47,8 @@ constexpr webui::LocalizedString kLocalizedStringsWithoutPlaceholders[] = {
IDS_CELLULAR_SETUP_PROVISIONING_PAGE_ERROR_TITLE},
{"provisioningPageErrorMessage",
IDS_CELLULAR_SETUP_PROVISIONING_PAGE_ERROR_MESSAGE},
- {"pSimFlowSetup", IDS_CELLULAR_SETUP_CELLULAR_SETUP_PAGE_PSIM_LABEL},
- {"pSimFlowSetupMessage",
- IDS_CELLULAR_SETUP_CELLULAR_SETUP_PAGE_PSIM_MESSAGE},
{"finalPageTitle", IDS_CELLULAR_SETUP_FINAL_PAGE_TITLE},
- {"finalPageMessage", IDS_CELLULAR_SETUP_FINAL_PAGE_MESSAGE},
+ {"pSimfinalPageMessage", IDS_CELLULAR_SETUP_PSIM_FINAL_PAGE_MESSAGE},
{"finalPageErrorTitle", IDS_CELLULAR_SETUP_FINAL_PAGE_ERROR_TITLE},
{"finalPageErrorMessage", IDS_CELLULAR_SETUP_FINAL_PAGE_ERROR_MESSAGE},
{"eSimFinalPageMessage", IDS_CELLULAR_SETUP_ESIM_FINAL_PAGE_MESSAGE},
@@ -74,6 +70,7 @@ constexpr webui::LocalizedString kLocalizedStringsWithoutPlaceholders[] = {
{"scanQrCodeError", IDS_CELLULAR_SETUP_ESIM_PAGE_SCAN_QR_CODE_ERROR},
{"qrCodeRetry", IDS_CELLULAR_SETUP_ESIM_PAGE_SCAN_QR_CODE_RETRY},
{"scanQrCodeLoading", IDS_CELLULAR_SETUP_ESIM_PAGE_SCAN_QR_CODE_LOADING},
+ {"scanQrCodeInvalid", IDS_CELLULAR_SETUP_ESIM_PAGE_SCAN_QR_CODE_INVALID},
{"profileListPageMessage", IDS_CELLULAR_SETUP_PROFILE_LIST_PAGE_MESSAGE},
{"eidPopupTitle", IDS_CELLULAR_SETUP_EID_POPUP_TITLE},
{"eidPopupDescription", IDS_CELLULAR_SETUP_EID_POPUP_DESCRIPTION},
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_dialog.h
index 8365de5ea97..93dafde22c6 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_dialog.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_dialog.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_CELLULAR_SETUP_MOBILE_SETUP_DIALOG_H_
#include "base/macros.h"
+#include "chrome/browser/ui/ash/network/network_connect_delegate_chromeos.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
namespace chromeos {
@@ -30,6 +31,8 @@ class MobileSetupDialog : public SystemWebDialogDelegate {
private:
friend void OpenCellularSetupDialog(const std::string& cellular_network_guid);
+ friend void NetworkConnectDelegateChromeOS::ShowCarrierAccountDetail(
+ const std::string& network_id);
static void ShowByNetworkId(const std::string& network_id);
DISALLOW_COPY_AND_ASSIGN(MobileSetupDialog);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
index c4480451beb..6d701527450 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
@@ -7,6 +7,7 @@
#include <stddef.h>
#include <memory>
+#include <string>
#include <string>
#include <vector>
@@ -15,7 +16,6 @@
#include "base/logging.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -78,7 +78,7 @@ bool ActivationErrorRequiresCarrier(
return error == ash::MobileActivator::ActivationError::kActivationFailed;
}
-base::string16 GetActivationErrorMessage(
+std::u16string GetActivationErrorMessage(
ash::MobileActivator::ActivationError error,
const std::string& carrier) {
// If the activation error message requires the carrier name, and none was
@@ -92,11 +92,11 @@ base::string16 GetActivationErrorMessage(
switch (error) {
case ash::MobileActivator::ActivationError::kNone:
- return base::string16();
+ return std::u16string();
case ash::MobileActivator::ActivationError::kActivationFailed: {
return base::ReplaceStringPlaceholders(
base::UTF8ToUTF16(kDefaultActivationError),
- std::vector<base::string16>(
+ std::vector<std::u16string>(
{ui::GetChromeOSDeviceName(), base::UTF8ToUTF16(carrier)}),
nullptr);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS
index df5ff9b1e09..27e329e9e1b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS
@@ -1,4 +1,4 @@
-file://chrome/browser/chromeos/guest_os/OWNERS
+file://chrome/browser/ash/guest_os/OWNERS
per-file *.mojom=set noparent
per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
index ac58362e360..0714164be8e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -4,12 +4,12 @@
#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h"
+#include <string>
#include <utility>
#include "ash/constants/ash_features.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
#include "chrome/browser/chromeos/crostini/crostini_disk.h"
@@ -42,6 +42,7 @@ void AddStringResources(content::WebUIDataSource* source) {
{"back", IDS_CROSTINI_INSTALLER_BACK_BUTTON},
{"install", IDS_CROSTINI_INSTALLER_INSTALL_BUTTON},
{"retry", IDS_CROSTINI_INSTALLER_RETRY_BUTTON},
+ {"settings", IDS_CROSTINI_INSTALLER_SETTINGS_BUTTON},
{"close", IDS_APP_CLOSE},
{"cancel", IDS_APP_CANCEL},
{"learnMore", IDS_LEARN_MORE},
@@ -50,8 +51,10 @@ void AddStringResources(content::WebUIDataSource* source) {
{"installingTitle", IDS_CROSTINI_INSTALLER_INSTALLING},
{"cancelingTitle", IDS_CROSTINI_INSTALLER_CANCELING_TITLE},
{"errorTitle", IDS_CROSTINI_INSTALLER_ERROR_TITLE},
+ {"needUpdateTitle", IDS_CROSTINI_INSTALLER_NEED_UPDATE_TITLE},
{"loadTerminaError", IDS_CROSTINI_INSTALLER_LOAD_TERMINA_ERROR},
+ {"needUpdateError", IDS_CROSTINI_INSTALLER_NEED_UPDATE_ERROR},
{"createDiskImageError", IDS_CROSTINI_INSTALLER_CREATE_DISK_IMAGE_ERROR},
{"startTerminaVmError", IDS_CROSTINI_INSTALLER_START_TERMINA_VM_ERROR},
{"startLxdError", IDS_CROSTINI_INSTALLER_START_LXD_ERROR},
@@ -81,6 +84,7 @@ void AddStringResources(content::WebUIDataSource* source) {
{"diskSizeSubtitle", IDS_CROSTINI_INSTALLER_DISK_SIZE_SUBTITLE},
{"diskSizeHint", IDS_CROSTINI_INSTALLER_DISK_SIZE_HINT},
{"insufficientDiskError", IDS_CROSTINI_INSTALLER_INSUFFICIENT_DISK_ERROR},
+ {"usernameLabel", IDS_CROSTINI_INSTALLER_USERNAME_LABEL},
{"usernameMessage", IDS_CROSTINI_INSTALLER_USERNAME_MESSAGE},
{"usernameInvalidFirstCharacterError",
IDS_CROSTINI_INSTALLER_USERNAME_INVALID_FIRST_CHARACTER_ERROR},
@@ -92,7 +96,7 @@ void AddStringResources(content::WebUIDataSource* source) {
};
source->AddLocalizedStrings(kStrings);
- base::string16 device_name = ui::GetChromeOSDeviceName();
+ std::u16string device_name = ui::GetChromeOSDeviceName();
source->AddString("promptMessage",
l10n_util::GetStringFUTF8(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/OWNERS b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/OWNERS
index df5ff9b1e09..27e329e9e1b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/OWNERS
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/OWNERS
@@ -1,4 +1,4 @@
-file://chrome/browser/chromeos/guest_os/OWNERS
+file://chrome/browser/ash/guest_os/OWNERS
per-file *.mojom=set noparent
per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc
index 5875f7a0ac5..81da54f42ab 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc
@@ -4,15 +4,16 @@
#include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h"
+#include "base/callback_helpers.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_base.h"
#include "base/run_loop.h"
#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
+#include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/crostini/crostini_test_helper.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/views/crostini/crostini_dialogue_browser_test_util.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
index 836be9a4768..b1dcb410fe1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -4,11 +4,11 @@
#include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h"
+#include <string>
#include <utility>
#include "ash/constants/ash_features.h"
#include "base/bind.h"
-#include "base/strings/string16.h"
#include "base/system/sys_info.h"
#include "chrome/browser/chromeos/crostini/crostini_upgrader.h"
#include "chrome/browser/profiles/profile.h"
@@ -34,11 +34,6 @@
namespace chromeos {
-bool CrostiniUpgraderUI::IsEnabled() {
- return base::FeatureList::IsEnabled(
- chromeos::features::kCrostiniWebUIUpgrader);
-}
-
void AddStringResources(content::WebUIDataSource* source) {
static constexpr webui::LocalizedString kStrings[] = {
{"upgrade", IDS_CROSTINI_UPGRADER_UPGRADE_BUTTON},
@@ -84,7 +79,7 @@ void AddStringResources(content::WebUIDataSource* source) {
std::string{chrome::kLinuxAppsLearnMoreURL} +
"&b=" + base::SysInfo::GetLsbReleaseBoard());
- base::string16 device_name = ui::GetChromeOSDeviceName();
+ std::u16string device_name = ui::GetChromeOSDeviceName();
source->AddString("offlineError",
l10n_util::GetStringFUTF8(
IDS_CROSTINI_INSTALLER_OFFLINE_ERROR, device_name));
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h
index 13c5605c215..db89c451a2d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.h
@@ -22,8 +22,6 @@ class CrostiniUpgraderUI
: public ui::MojoWebDialogUI,
public chromeos::crostini_upgrader::mojom::PageHandlerFactory {
public:
- static bool IsEnabled();
-
explicit CrostiniUpgraderUI(content::WebUI* web_ui);
~CrostiniUpgraderUI() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc
index ee577d9eeab..28920a09501 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc
@@ -6,10 +6,11 @@
#include "base/bind.h"
#include "base/values.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
#include "chromeos/dbus/cryptohome/rpc.pb.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
+#include "chromeos/dbus/userdataauth/cryptohome_pkcs11_client.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui.h"
@@ -30,15 +31,22 @@ void CryptohomeWebUIHandler::RegisterMessages() {
}
void CryptohomeWebUIHandler::OnPageLoaded(const base::ListValue* args) {
- CryptohomeClient* cryptohome_client = CryptohomeClient::Get();
+ UserDataAuthClient* userdataauth_client = UserDataAuthClient::Get();
+ CryptohomePkcs11Client* cryptohome_pkcs11_client =
+ CryptohomePkcs11Client::Get();
- cryptohome_client->IsMounted(GetCryptohomeBoolCallback("is-mounted"));
+ userdataauth_client->IsMounted(
+ user_data_auth::IsMountedRequest(),
+ base::BindOnce(&CryptohomeWebUIHandler::OnIsMounted,
+ weak_ptr_factory_.GetWeakPtr()));
TpmManagerClient::Get()->GetTpmNonsensitiveStatus(
::tpm_manager::GetTpmNonsensitiveStatusRequest(),
base::BindOnce(&CryptohomeWebUIHandler::OnGetTpmStatus,
weak_ptr_factory_.GetWeakPtr()));
- cryptohome_client->Pkcs11IsTpmTokenReady(
- GetCryptohomeBoolCallback("pkcs11-is-tpm-token-ready"));
+ cryptohome_pkcs11_client->Pkcs11IsTpmTokenReady(
+ user_data_auth::Pkcs11IsTpmTokenReadyRequest(),
+ base::BindOnce(&CryptohomeWebUIHandler::OnPkcs11IsTpmTokenReady,
+ weak_ptr_factory_.GetWeakPtr()));
content::GetIOThreadTaskRunner({})->PostTaskAndReplyWithResult(
FROM_HERE, base::BindOnce(&crypto::IsTPMTokenReady, base::OnceClosure()),
@@ -54,12 +62,6 @@ void CryptohomeWebUIHandler::DidGetNSSUtilInfoOnUIThread(
SetCryptohomeProperty("is-tpm-token-ready", is_tpm_token_ready_value);
}
-DBusMethodCallback<bool> CryptohomeWebUIHandler::GetCryptohomeBoolCallback(
- const std::string& destination_id) {
- return base::BindOnce(&CryptohomeWebUIHandler::OnCryptohomeBoolProperty,
- weak_ptr_factory_.GetWeakPtr(), destination_id);
-}
-
void CryptohomeWebUIHandler::OnGetTpmStatus(
const ::tpm_manager::GetTpmNonsensitiveStatusReply& reply) {
if (reply.status() != ::tpm_manager::STATUS_SUCCESS) {
@@ -74,10 +76,22 @@ void CryptohomeWebUIHandler::OnGetTpmStatus(
base::Value(reply.has_reset_lock_permissions()));
}
-void CryptohomeWebUIHandler::OnCryptohomeBoolProperty(
- const std::string& destination_id,
- base::Optional<bool> result) {
- SetCryptohomeProperty(destination_id, base::Value(result.value_or(false)));
+void CryptohomeWebUIHandler::OnIsMounted(
+ base::Optional<user_data_auth::IsMountedReply> reply) {
+ bool mounted = false;
+ if (reply.has_value()) {
+ mounted = reply->is_mounted();
+ }
+ SetCryptohomeProperty("is-mounted", base::Value(mounted));
+}
+
+void CryptohomeWebUIHandler::OnPkcs11IsTpmTokenReady(
+ base::Optional<user_data_auth::Pkcs11IsTpmTokenReadyReply> reply) {
+ bool ready = false;
+ if (reply.has_value()) {
+ ready = reply->ready();
+ }
+ SetCryptohomeProperty("pkcs11-is-tpm-token-ready", base::Value(ready));
}
void CryptohomeWebUIHandler::SetCryptohomeProperty(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.h b/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.h
index cab32c5275f..cff2779279f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/cryptohome_web_ui_handler.h
@@ -10,9 +10,9 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
#include "chromeos/dbus/dbus_method_call_status.h"
#include "chromeos/dbus/tpm_manager/tpm_manager.pb.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace base {
@@ -39,13 +39,9 @@ class CryptohomeWebUIHandler : public content::WebUIMessageHandler {
void DidGetNSSUtilInfoOnUIThread(bool is_tpm_token_ready);
- // Returns a callback to handle Cryptohome property values.
- DBusMethodCallback<bool> GetCryptohomeBoolCallback(
- const std::string& destination_id);
-
- // This method is called when Cryptohome D-Bus method call completes.
- void OnCryptohomeBoolProperty(const std::string& destination_id,
- base::Optional<bool> result);
+ void OnIsMounted(base::Optional<user_data_auth::IsMountedReply> reply);
+ void OnPkcs11IsTpmTokenReady(
+ base::Optional<user_data_auth::Pkcs11IsTpmTokenReadyReply> reply);
// This method is called when TpmManager D-Bus GetTpmNonsensitiveStatus call
// completes.
diff --git a/chromium/chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc
index 7978728f56a..2790c3a705c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc
@@ -23,7 +23,7 @@ void DiagnosticsDialog::ShowDialog() {
DiagnosticsDialog::DiagnosticsDialog()
: SystemWebDialogDelegate(GURL(kChromeUIDiagnosticsAppUrl),
- /*title=*/base::string16()) {}
+ /*title=*/std::u16string()) {}
DiagnosticsDialog::~DiagnosticsDialog() = default;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
index 0d8b3dee177..4066730884e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -31,8 +31,8 @@
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "base/threading/sequenced_task_runner_handle.h"
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/file_system_util.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/drive/drive_notification_manager_factory.h"
#include "chrome/browser/file_util_service.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
index c88265b63d8..1cac10a85a1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
@@ -20,7 +20,6 @@
#include "chrome/browser/profiles/profile_key.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h"
#include "components/image_fetcher/core/image_fetcher_service.h"
#include "components/image_fetcher/core/request_metadata.h"
#include "components/signin/public/base/avatar_icon_util.h"
@@ -55,12 +54,8 @@ constexpr net::NetworkTrafficAnnotationTag traffic_annotation =
setting: "This feature cannot be disabled by settings."
policy_exception_justification: "Not implemented."
})");
-constexpr char kFetchParentsListResultHistogram[] =
- "AccountManager.EduCoexistence.FetchParentsListResult";
constexpr char kFetchAccessTokenResultHistogram[] =
"AccountManager.EduCoexistence.FetchAccessTokenResult";
-constexpr char kCreateRaptResultHistogram[] =
- "AccountManager.EduCoexistence.CreateRaptResult";
} // namespace
EduAccountLoginHandler::EduAccountLoginHandler(
@@ -136,11 +131,6 @@ void EduAccountLoginHandler::RegisterMessages() {
"parentSignin",
base::BindRepeating(&EduAccountLoginHandler::HandleParentSignin,
base::Unretained(this)));
- web_ui()->RegisterMessageCallback(
- "updateEduCoexistenceFlowResult",
- base::BindRepeating(
- &EduAccountLoginHandler::HandleUpdateEduCoexistenceFlowResult,
- base::Unretained(this)));
}
void EduAccountLoginHandler::OnJavascriptDisallowed() {
@@ -201,20 +191,6 @@ void EduAccountLoginHandler::HandleParentSignin(const base::ListValue* args) {
FetchAccessToken(obfuscated_gaia_id, password);
}
-void EduAccountLoginHandler::HandleUpdateEduCoexistenceFlowResult(
- const base::ListValue* args) {
- AllowJavascript();
-
- const base::Value::ConstListView& args_list = args->GetList();
- CHECK_EQ(args_list.size(), 1u);
- int result = args_list[0].GetInt();
- DCHECK(result <=
- static_cast<int>(
- InlineLoginDialogChromeOS::EduCoexistenceFlowResult::kMaxValue));
- InlineLoginDialogChromeOS::UpdateEduCoexistenceFlowResult(
- static_cast<InlineLoginDialogChromeOS::EduCoexistenceFlowResult>(result));
-}
-
void EduAccountLoginHandler::FetchFamilyMembers() {
DCHECK(!family_fetcher_);
Profile* profile = Profile::FromWebUI(web_ui());
@@ -261,7 +237,7 @@ void EduAccountLoginHandler::FetchAccessToken(
base::Unretained(this), std::move(obfuscated_gaia_id),
std::move(password)),
signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
- signin::ConsentLevel::kNotRequired);
+ signin::ConsentLevel::kSignin);
}
void EduAccountLoginHandler::FetchReAuthProofTokenForParent(
@@ -283,8 +259,6 @@ void EduAccountLoginHandler::FetchReAuthProofTokenForParent(
void EduAccountLoginHandler::OnGetFamilyMembersSuccess(
const std::vector<FamilyInfoFetcher::FamilyMember>& members) {
- base::UmaHistogramEnumeration(kFetchParentsListResultHistogram,
- FamilyInfoFetcher::ErrorCode::kSuccess);
family_fetcher_.reset();
base::ListValue parents;
std::map<std::string, GURL> profile_image_urls;
@@ -309,7 +283,6 @@ void EduAccountLoginHandler::OnGetFamilyMembersSuccess(
}
void EduAccountLoginHandler::OnFailure(FamilyInfoFetcher::ErrorCode error) {
- base::UmaHistogramEnumeration(kFetchParentsListResultHistogram, error);
family_fetcher_.reset();
RejectJavascriptCallback(base::Value(get_parents_callback_id_),
base::ListValue());
@@ -369,9 +342,6 @@ void EduAccountLoginHandler::CreateReAuthProofTokenForParent(
void EduAccountLoginHandler::OnReAuthProofTokenSuccess(
const std::string& reauth_proof_token) {
- base::UmaHistogramEnumeration(
- kCreateRaptResultHistogram,
- GaiaAuthConsumer::ReAuthProofTokenStatus::kSuccess);
gaia_auth_fetcher_.reset();
ResolveJavascriptCallback(base::Value(parent_signin_callback_id_),
base::Value(reauth_proof_token));
@@ -380,7 +350,6 @@ void EduAccountLoginHandler::OnReAuthProofTokenSuccess(
void EduAccountLoginHandler::OnReAuthProofTokenFailure(
const GaiaAuthConsumer::ReAuthProofTokenStatus error) {
- base::UmaHistogramEnumeration(kCreateRaptResultHistogram, error);
LOG(ERROR) << "Failed to fetch ReAuthProofToken for the parent, error="
<< static_cast<int>(error);
gaia_auth_fetcher_.reset();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
index d22a1d5eb22..45e6ecf3aa3 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
@@ -101,7 +101,6 @@ class EduAccountLoginHandler : public content::WebUIMessageHandler,
void HandleGetParents(const base::ListValue* args);
void HandleCloseDialog(const base::ListValue* args);
void HandleParentSignin(const base::ListValue* args);
- void HandleUpdateEduCoexistenceFlowResult(const base::ListValue* args);
virtual void FetchFamilyMembers();
virtual void FetchParentImages(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc
index b9fef64e6c6..b4261aeabfd 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc
@@ -12,9 +12,9 @@
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/test/fake_gaia_mixin.h"
+#include "chrome/browser/ash/login/test/logged_in_user_mixin.h"
#include "chrome/browser/chromeos/child_accounts/edu_coexistence_tos_store_utils.h"
-#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
-#include "chrome/browser/chromeos/login/test/logged_in_user_mixin.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/supervised_user/supervised_user_features.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
index 6e7dffd1bff..fb9123822f7 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -7,6 +7,7 @@
#include <memory>
#include <utility>
+#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "base/bind.h"
#include "base/callback.h"
@@ -18,10 +19,10 @@
#include "base/system/sys_info.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/login_pref_names.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chromeos/child_accounts/edu_coexistence_tos_store_utils.h"
-#include "chrome/browser/chromeos/login/login_pref_names.h"
#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -159,7 +160,7 @@ EduCoexistenceLoginHandler::EduCoexistenceLoginHandler(
&EduCoexistenceLoginHandler::OnOAuthAccessTokensFetched,
base::Unretained(this)),
signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
- signin::ConsentLevel::kNotRequired);
+ signin::ConsentLevel::kSignin);
}
EduCoexistenceLoginHandler::~EduCoexistenceLoginHandler() {
@@ -272,7 +273,7 @@ void EduCoexistenceLoginHandler::SendInitializeEduArgs() {
base::Value params(base::Value::Type::DICTIONARY);
const std::string& app_locale = g_browser_process->GetApplicationLocale();
- params.SetStringKey("h1", app_locale);
+ params.SetStringKey("hl", app_locale);
params.SetStringKey("url", GetEduCoexistenceURL());
@@ -285,10 +286,13 @@ void EduCoexistenceLoginHandler::SendInitializeEduArgs() {
params.SetStringKey("eduCoexistenceId", GetOrCreateEduCoexistenceUserId());
params.SetStringKey("platformVersion",
base::SysInfo::OperatingSystemVersion());
- params.SetStringKey("releaseChannel", chrome::GetChannelName());
+ // Extended stable channel is not supported on Chrome OS Ash.
+ params.SetStringKey("releaseChannel", chrome::GetChannelName(
+ chrome::WithExtendedStable(false)));
params.SetStringKey("deviceId", GetDeviceIdForActiveUserProfile());
params.SetDoubleKey("signinTime", GetSigninTime().ToJsTimeIgnoringNull());
+ params.SetBoolKey("newOobeLayoutEnabled", features::IsNewOobeLayoutEnabled());
// If the secondary edu account is being reauthenticated, the email address
// will be provided via the url of the webcontent. Example
@@ -333,11 +337,9 @@ void EduCoexistenceLoginHandler::ConsentLogged(const base::ListValue* args) {
edu_account_email_ = arguments[0].GetString();
terms_of_service_version_number_ = arguments[1].GetString();
+ // Notify EduCoexistenceStateTracker that consent has been logged.
EduCoexistenceStateTracker::Get()->OnConsentLogged(web_ui(),
edu_account_email_);
-
- EduCoexistenceStateTracker::Get()->OnWebUiStateChanged(
- web_ui(), EduCoexistenceStateTracker::FlowResult::kConsentLogged);
}
void EduCoexistenceLoginHandler::OnError(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc
index 29a00662940..188d1da6ff8 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc
@@ -89,6 +89,9 @@ void EduCoexistenceStateTracker::OnConsentLogged(
const std::string& account_email) {
DCHECK(base::Contains(state_tracker_, web_ui));
+ // Update the webui state that consent was logged.
+ OnWebUiStateChanged(web_ui, FlowResult::kConsentLogged);
+
if (state_tracker_[web_ui].consent_logged_callback) {
DCHECK_EQ(state_tracker_[web_ui].email, account_email);
std::move(state_tracker_[web_ui].consent_logged_callback)
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/BUILD.gn b/chromium/chrome/browser/ui/webui/chromeos/emoji/BUILD.gn
new file mode 100644
index 00000000000..882968d6600
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+ sources = [ "emoji_picker.mojom" ]
+ public_deps = [ "//mojo/public/mojom/base" ]
+ webui_module_path = "/"
+}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/OWNERS b/chromium/chrome/browser/ui/webui/chromeos/emoji/OWNERS
index 4e1c393dfcd..e38bf158b24 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/OWNERS
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/OWNERS
@@ -1,2 +1,5 @@
jopalmer@chromium.org
keithlee@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS \ No newline at end of file
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc
deleted file mode 100644
index 8cc74fd57ea..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h"
-
-#include "base/strings/utf_string_conversions.h"
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
-#include "chrome/common/url_constants.h"
-
-#include "ui/aura/window.h"
-#include "ui/base/ime/chromeos/ime_bridge.h"
-
-namespace chromeos {
-
-constexpr gfx::Size kDefaultWindowSize(340, 390);
-
-gfx::NativeWindow EmojiPickerDialog::window = nullptr;
-
-EmojiPickerDialog::EmojiPickerDialog() {
- set_can_resize(false);
-}
-
-void EmojiPickerDialog::Show() {
- if (window) {
- window->Focus();
- return;
- }
- ui::InputMethod* input_method =
- ui::IMEBridge::Get()->GetInputContextHandler()->GetInputMethod();
- const ui::TextInputClient* input_client =
- input_method ? input_method->GetTextInputClient() : nullptr;
- const gfx::Rect caret_bounds =
- input_client ? input_client->GetCaretBounds() : gfx::Rect();
- window = chrome::ShowWebDialog(
- nullptr, ProfileManager::GetActiveUserProfile(), new EmojiPickerDialog());
- // For now, this can overflow the screen.
- if (input_client) {
- window->SetBounds(gfx::Rect(caret_bounds.x(), caret_bounds.bottom(),
- kDefaultWindowSize.width(),
- kDefaultWindowSize.height()));
- }
-}
-
-ui::ModalType EmojiPickerDialog::GetDialogModalType() const {
- return ui::MODAL_TYPE_NONE;
-}
-
-base::string16 EmojiPickerDialog::GetDialogTitle() const {
- return base::UTF8ToUTF16("Emoji Picker");
-}
-
-GURL EmojiPickerDialog::GetDialogContentURL() const {
- return GURL(chrome::kChromeUIEmojiPickerURL);
-}
-
-void EmojiPickerDialog::GetWebUIMessageHandlers(
- std::vector<content::WebUIMessageHandler*>* handlers) const {}
-
-void EmojiPickerDialog::GetDialogSize(gfx::Size* size) const {
- *size = kDefaultWindowSize;
-}
-
-std::string EmojiPickerDialog::GetDialogArgs() const {
- return "";
-}
-
-void EmojiPickerDialog::OnDialogShown(content::WebUI* webui) {
- webui_ = webui;
-}
-
-void EmojiPickerDialog::OnDialogClosed(const std::string& json_retval) {
- window = nullptr;
- delete this;
-}
-
-void EmojiPickerDialog::OnCloseContents(content::WebContents* source,
- bool* out_close_dialog) {
- *out_close_dialog = true;
-}
-
-bool EmojiPickerDialog::ShouldShowDialogTitle() const {
- return true;
-}
-
-EmojiPickerDialog::~EmojiPickerDialog() = default;
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h
deleted file mode 100644
index 91096097947..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_DIALOG_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_DIALOG_H_
-
-#include "base/macros.h"
-#include "ui/base/ime/text_input_client.h"
-#include "ui/web_dialogs/web_dialog_delegate.h"
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h"
-
-namespace chromeos {
-
-class EmojiPickerDialog : public ui::WebDialogDelegate {
- public:
- static void Show();
- ~EmojiPickerDialog() override;
-
- private:
- EmojiPickerDialog();
- // ui::WebDialogDelegate:
- ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
- GURL GetDialogContentURL() const override;
- void GetWebUIMessageHandlers(
- std::vector<content::WebUIMessageHandler*>* handlers) const override;
- void GetDialogSize(gfx::Size* size) const override;
- std::string GetDialogArgs() const override;
- void OnDialogShown(content::WebUI* webui) override;
- void OnDialogClosed(const std::string& json_retval) override;
- void OnCloseContents(content::WebContents* source,
- bool* out_close_dialog) override;
- bool ShouldShowDialogTitle() const override;
-
- content::WebUI* webui_ = nullptr;
-
- // Window for the emoji picker. Used by the handler to close the window.
- static gfx::NativeWindow window;
- friend class EmojiHandler;
-
- DISALLOW_COPY_AND_ASSIGN(EmojiPickerDialog);
-};
-
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_DIALOG_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.cc
deleted file mode 100644
index d8f935b7c91..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h"
-
-#include "base/logging.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/strings/utf_string_conversions.h"
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h"
-#include "ui/aura/window.h"
-#include "ui/base/ime/chromeos/ime_bridge.h"
-
-namespace chromeos {
-
-EmojiHandler::EmojiHandler() {}
-EmojiHandler::~EmojiHandler() = default;
-
-// Keep in sync with entry in enums.xml.
-enum class EmojiVariantType {
- // smaller entries only used by Chrome OS VK
- kEmojiPickerBase = 4,
- kEmojiPickerVariant = 5,
- kMaxValue = kEmojiPickerVariant,
-};
-
-void LogInsertEmoji(bool isVariant) {
- EmojiVariantType insertValue = isVariant
- ? EmojiVariantType::kEmojiPickerVariant
- : EmojiVariantType::kEmojiPickerBase;
- base::UmaHistogramEnumeration("InputMethod.VirtualKeyboard.Emoji.TriggerType",
- insertValue);
-}
-
-void EmojiHandler::RegisterMessages() {
- web_ui()->RegisterMessageCallback(
- "insertEmoji", base::BindRepeating(&EmojiHandler::HandleInsertEmoji,
- base::Unretained(this)));
-}
-
-void EmojiHandler::HandleInsertEmoji(const base::ListValue* args) {
- if (args->GetSize() != 2) {
- DLOG(WARNING)
- << "insertEmoji called with incorrect number of arguments (expected 2)";
- return;
- }
-
- const std::string& emoji = args->GetList()[0].GetString();
- LogInsertEmoji(args->GetList()[1].GetBool());
-
- // Hide emoji picker window to restore focus to original text field
- if (EmojiPickerDialog::window) {
- EmojiPickerDialog::window->Hide();
- EmojiPickerDialog::window = nullptr;
- }
-
- ui::InputMethod* input_method =
- ui::IMEBridge::Get()->GetInputContextHandler()->GetInputMethod();
- if (!input_method) {
- LOG(WARNING) << "no input_method found";
- return;
- }
-
- ui::TextInputClient* input_client = input_method->GetTextInputClient();
-
- if (!input_client) {
- LOG(WARNING) << "no input_client found";
- return;
- }
-
- if (input_client->GetTextInputType() ==
- ui::TextInputType::TEXT_INPUT_TYPE_NONE) {
- LOG(WARNING) << "attempt to insert into input_client with type none";
- return;
- }
-
- input_client->InsertText(
- base::UTF8ToUTF16(emoji),
- ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
-}
-
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h
deleted file mode 100644
index 26f74ca74ed..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_HANDLER_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_HANDLER_H_
-
-#include "base/macros.h"
-#include "content/public/browser/web_ui_message_handler.h"
-
-namespace chromeos {
-
-// The WebUI message handler for chrome://emoji-picker
-class EmojiHandler : public content::WebUIMessageHandler {
- public:
- EmojiHandler();
- ~EmojiHandler() override;
-
- private:
- // content::WebUIMessageHandler:
- void RegisterMessages() override;
-
- void HandleInsertEmoji(const base::ListValue* args);
-
- DISALLOW_COPY_AND_ASSIGN(EmojiHandler);
-};
-
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc
new file mode 100644
index 00000000000..5121251dfb1
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc
@@ -0,0 +1,98 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h"
+
+#include "base/metrics/histogram_functions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "base/trace_event/trace_event.h"
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h"
+#include "ui/base/ime/chromeos/ime_bridge.h"
+
+namespace chromeos {
+
+// Keep in sync with entry in enums.xml.
+enum class EmojiVariantType {
+ // smaller entries only used by Chrome OS VK
+ kEmojiPickerBase = 4,
+ kEmojiPickerVariant = 5,
+ kMaxValue = kEmojiPickerVariant,
+};
+
+void LogInsertEmoji(bool is_variant) {
+ EmojiVariantType insert_value = is_variant
+ ? EmojiVariantType::kEmojiPickerVariant
+ : EmojiVariantType::kEmojiPickerBase;
+ base::UmaHistogramEnumeration("InputMethod.SystemEmojiPicker.TriggerType",
+ insert_value);
+}
+
+EmojiPageHandler::EmojiPageHandler(
+ mojo::PendingReceiver<emoji_picker::mojom::PageHandler> receiver,
+ content::WebUI* web_ui,
+ EmojiUI* webui_controller,
+ bool incognito_mode)
+ : receiver_(this, std::move(receiver)),
+ webui_controller_(webui_controller),
+ incognito_mode_(incognito_mode) {}
+
+EmojiPageHandler::~EmojiPageHandler() {}
+
+void EmojiPageHandler::ShowUI() {
+ auto embedder = webui_controller_->embedder();
+ // Embedder may not exist in some cases (e.g. user browses to
+ // chrome://emoji-picker directly rather than using right click on
+ // text field -> emoji).
+ if (embedder) {
+ embedder->ShowUI();
+ }
+}
+
+void EmojiPageHandler::IsIncognitoTextField(
+ IsIncognitoTextFieldCallback callback) {
+ std::move(callback).Run(incognito_mode_);
+}
+
+void EmojiPageHandler::InsertEmoji(const std::string& emoji_to_insert,
+ bool is_variant) {
+ // By hiding the emoji picker, we restore focus to the original text field so
+ // we can insert the text.
+ auto embedder = webui_controller_->embedder();
+ if (embedder) {
+ embedder->CloseUI();
+ }
+ LogInsertEmoji(is_variant);
+
+ // In theory, we are returning focus to the input field where the user
+ // originally selected emoji. However, the input field may not exist anymore
+ // e.g. JS has mutated the web page while emoji picker was open, so check that
+ // a valid input client is available as part of inserting the emoji.
+ ui::InputMethod* input_method =
+ ui::IMEBridge::Get()->GetInputContextHandler()->GetInputMethod();
+ if (!input_method) {
+ DLOG(WARNING) << "no input_method found";
+ return;
+ }
+
+ ui::TextInputClient* input_client = input_method->GetTextInputClient();
+
+ if (!input_client) {
+ DLOG(WARNING) << "no input_client found";
+ return;
+ }
+
+ if (input_client->GetTextInputType() ==
+ ui::TextInputType::TEXT_INPUT_TYPE_NONE) {
+ DLOG(WARNING) << "attempt to insert into input_client with type none";
+ return;
+ }
+
+ input_client->InsertText(
+ base::UTF8ToUTF16(emoji_to_insert),
+ ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h
new file mode 100644
index 00000000000..5eda8b4ac98
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PAGE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PAGE_HANDLER_H_
+
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/webui/mojo_bubble_web_ui_controller.h"
+
+namespace chromeos {
+class EmojiUI;
+
+class EmojiPageHandler : public emoji_picker::mojom::PageHandler {
+ public:
+ EmojiPageHandler(
+ mojo::PendingReceiver<emoji_picker::mojom::PageHandler> receiver,
+ content::WebUI* web_ui,
+ EmojiUI* webui_controller,
+ bool incognito_mode);
+ EmojiPageHandler(const EmojiPageHandler&) = delete;
+ EmojiPageHandler& operator=(const EmojiPageHandler&) = delete;
+ ~EmojiPageHandler() override;
+
+ // emoji_picker::mojom::PageHandler:
+ void ShowUI() override;
+ void InsertEmoji(const std::string& emoji_to_insert,
+ bool is_variant) override;
+ void IsIncognitoTextField(IsIncognitoTextFieldCallback callback) override;
+
+ private:
+ mojo::Receiver<emoji_picker::mojom::PageHandler> receiver_;
+
+ EmojiUI* const webui_controller_;
+ bool incognito_mode_;
+};
+} // namespace chromeos
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PAGE_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc
deleted file mode 100644
index 227a86315fc..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h"
-
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/webui/webui_util.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/emoji_picker_resources.h"
-#include "chrome/grit/emoji_picker_resources_map.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "ui/resources/grit/webui_generated_resources.h"
-
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.h"
-#include "chrome/browser/ui/webui/chromeos/emoji/emoji_handler.h"
-
-namespace chromeos {
-
-EmojiPicker::EmojiPicker(content::WebUI* web_ui)
- : content::WebUIController(web_ui) {
- // Set up the chrome://emoji-picker source.
- std::unique_ptr<content::WebUIDataSource> html_source(
- content::WebUIDataSource::Create(chrome::kChromeUIEmojiPickerHost));
-
- // As a demonstration of passing a variable for JS to use we pass in some
- // emoji.
- html_source->AddString("emoji",
- "😀,😃,😄,😁,😆,😅,😂,🤣,😭");
- html_source->UseStringsJs();
-
- // Add required resources.
- webui::SetupWebUIDataSource(
- html_source.get(),
- base::make_span(kEmojiPickerResources, kEmojiPickerResourcesSize),
- IDR_EMOJI_PICKER_INDEX_HTML);
-
- // Attach message handler to handle emoji click events.
- web_ui->AddMessageHandler(std::make_unique<EmojiHandler>());
-
- content::BrowserContext* browser_context =
- web_ui->GetWebContents()->GetBrowserContext();
- content::WebUIDataSource::Add(browser_context, html_source.release());
-}
-
-EmojiPicker::~EmojiPicker() {}
-
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h
deleted file mode 100644
index 1b462812644..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PICKER_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PICKER_H_
-
-#include "base/macros.h"
-#include "content/public/browser/web_ui_controller.h"
-#include "ui/web_dialogs/web_dialog_delegate.h"
-
-namespace chromeos {
-
-// The WebUI for chrome://emoji-picker
-class EmojiPicker : public content::WebUIController {
- public:
- explicit EmojiPicker(content::WebUI* web_ui);
- ~EmojiPicker() override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(EmojiPicker);
-};
-
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_PICKER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom
new file mode 100644
index 00000000000..f0870cc0c45
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module emoji_picker.mojom;
+
+
+// Used by the WebUI page to bootstrap bidirectional communication.
+interface PageHandlerFactory {
+ // The WebUI calls this method when the page is first initialized.
+ CreatePageHandler(pending_receiver<PageHandler> handler);
+};
+
+// Browser-side handler for requests from WebUI page.
+interface PageHandler {
+
+ // Request the UI to be shown. Using this interface, dialog can be invisible
+ // while rendering to avoid UI showing in incomplete state.
+ ShowUI();
+
+ // Request backend to insert emoji (will close the picker).
+ // emoji: The emoji to insert in string form e.g. "😂".
+ // is_variant: If the emoji is a variant / base emoji, used for metrics.
+ InsertEmoji(string emoji, bool is_variant);
+
+ // Allows the emoji picker to identify if it was initialized in a incognito
+ // text field (so it will disable storing preference etc.)
+ IsIncognitoTextField() => (bool incognito);
+};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.cc
new file mode 100644
index 00000000000..1b5267dfeb6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.cc
@@ -0,0 +1,116 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h"
+
+#include "ash/public/cpp/tablet_mode.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper.h"
+#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper_service.h"
+#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper_service_factory.h"
+#include "chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/emoji_picker_resources.h"
+#include "chrome/grit/emoji_picker_resources_map.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/url_data_source.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/emoji/emoji_panel_helper.h"
+#include "ui/base/ime/chromeos/ime_bridge.h"
+#include "ui/resources/grit/webui_generated_resources.h"
+
+#include <iostream>
+
+namespace {
+constexpr gfx::Size kDefaultWindowSize(340, 390);
+
+class EmojiiBubbleDialogView : public WebUIBubbleDialogView {
+ public:
+ EmojiiBubbleDialogView(
+ std::unique_ptr<BubbleContentsWrapper> contents_wrapper)
+ : WebUIBubbleDialogView(nullptr, contents_wrapper.get()),
+ contents_wrapper_(std::move(contents_wrapper)) {}
+
+ private:
+ std::unique_ptr<BubbleContentsWrapper> contents_wrapper_;
+};
+
+} // namespace
+
+namespace chromeos {
+
+EmojiUI::EmojiUI(content::WebUI* web_ui)
+ : ui::MojoBubbleWebUIController(web_ui,
+ true /* Needed for webui browser tests */) {
+ content::WebUIDataSource* source =
+ content::WebUIDataSource::Create(chrome::kChromeUIEmojiPickerHost);
+ source->UseStringsJs();
+
+ // Add required resources.
+ webui::SetupWebUIDataSource(
+ source, base::make_span(kEmojiPickerResources, kEmojiPickerResourcesSize),
+ IDR_EMOJI_PICKER_INDEX_HTML);
+
+ content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
+ source);
+}
+
+EmojiUI::~EmojiUI() = default;
+
+void EmojiUI::Show(Profile* profile) {
+ if (ash::TabletMode::Get()->InTabletMode()) {
+ ui::ShowTabletModeEmojiPanel();
+ return;
+ }
+ ui::InputMethod* input_method =
+ ui::IMEBridge::Get()->GetInputContextHandler()->GetInputMethod();
+ ui::TextInputClient* input_client =
+ input_method ? input_method->GetTextInputClient() : nullptr;
+ const bool incognito_mode =
+ input_client ? !input_client->ShouldDoLearning() : false;
+ const gfx::Rect caret_bounds =
+ input_client ? input_client->GetCaretBounds() : gfx::Rect();
+
+ // This rect is used for positioning the emoji picker. All that really
+ // matters is a position, so it has 0 height/width
+ auto anchor_rect = gfx::Rect(caret_bounds.x() + kDefaultWindowSize.width(),
+ caret_bounds.bottom(), 0, 0);
+
+ // TODO(b/181703133): Refactor so that the webui_bubble_manager can be used
+ // here to reduce code duplication.
+
+ auto contents_wrapper = std::make_unique<BubbleContentsWrapperT<EmojiUI>>(
+ GURL(chrome::kChromeUIEmojiPickerURL), profile, IDS_ACCNAME_EMOJI_PICKER,
+ false /*enable_extension_apis*/);
+ // Need to reload the web contents here because the view isn't visible unless
+ // ShowUI is called from the JS side. By reloading, we trigger the JS to
+ // eventually call ShowUI().
+ contents_wrapper->ReloadWebContents();
+ contents_wrapper->GetWebUIController()->incognito_mode_ = incognito_mode;
+
+ auto bubble_view =
+ std::make_unique<EmojiiBubbleDialogView>(std::move(contents_wrapper));
+ auto weak_ptr = bubble_view->GetWeakPtr();
+ views::BubbleDialogDelegateView::CreateBubble(std::move(bubble_view));
+ weak_ptr->SetAnchorRect(anchor_rect);
+ weak_ptr->set_adjust_if_offscreen(true);
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(EmojiUI)
+
+void EmojiUI::BindInterface(
+ mojo::PendingReceiver<emoji_picker::mojom::PageHandlerFactory> receiver) {
+ page_factory_receiver_.reset();
+ page_factory_receiver_.Bind(std::move(receiver));
+}
+
+void EmojiUI::CreatePageHandler(
+ mojo::PendingReceiver<emoji_picker::mojom::PageHandler> receiver) {
+ page_handler_ = std::make_unique<EmojiPageHandler>(
+ std::move(receiver), web_ui(), this, incognito_mode_);
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h
new file mode 100644
index 00000000000..2b929e7d2ec
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h
@@ -0,0 +1,53 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_UI_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/timer/elapsed_timer.h"
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h"
+#include "chrome/browser/ui/webui/chromeos/emoji/emoji_picker.mojom.h"
+#include "chrome/browser/ui/webui/webui_load_timer.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/webui/mojo_bubble_web_ui_controller.h"
+
+class Profile;
+
+namespace chromeos {
+
+class EmojiUI : public ui::MojoBubbleWebUIController,
+ public emoji_picker::mojom::PageHandlerFactory {
+ public:
+ explicit EmojiUI(content::WebUI* web_ui);
+ EmojiUI(const EmojiUI&) = delete;
+ EmojiUI& operator=(const EmojiUI&) = delete;
+ ~EmojiUI() override;
+
+ static void Show(Profile* profile);
+
+ // Instantiates the implementor of the mojom::PageHandlerFactory mojo
+ // interface passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<emoji_picker::mojom::PageHandlerFactory> receiver);
+
+ // emoji_picker::mojom::PageHandlerFactory
+ void CreatePageHandler(mojo::PendingReceiver<emoji_picker::mojom::PageHandler>
+ receiver) override;
+
+ private:
+ std::unique_ptr<EmojiPageHandler> page_handler_;
+
+ mojo::Receiver<emoji_picker::mojom::PageHandlerFactory>
+ page_factory_receiver_{this};
+ bool incognito_mode_;
+
+ WEB_UI_CONTROLLER_TYPE_DECL();
+};
+} // namespace chromeos
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EMOJI_EMOJI_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/image_source.cc b/chromium/chrome/browser/ui/webui/chromeos/image_source.cc
index f37a52dca2f..eb5828cbb9d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/image_source.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/image_source.cc
@@ -19,7 +19,7 @@
#include "base/task/thread_pool.h"
#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/login/users/avatar/user_image_loader.h"
+#include "chrome/browser/ash/login/users/avatar/user_image_loader.h"
#include "chrome/common/url_constants.h"
#include "components/user_manager/user_image/user_image.h"
#include "net/base/mime_util.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.cc
new file mode 100644
index 00000000000..3e45364d453
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.cc
@@ -0,0 +1,46 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h"
+
+#include "chrome/common/webui_url_constants.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+
+namespace chromeos {
+
+namespace {
+
+gfx::Size FitSizeToDisplay(const gfx::Size& desired) {
+ const display::Display display =
+ display::Screen::GetScreen()->GetPrimaryDisplay();
+
+ gfx::Size display_size = display.size();
+ display_size.SetToMin(desired);
+ return display_size;
+}
+
+} // namespace
+
+constexpr gfx::Size BaseLockDialog::kBaseLockDialogSize;
+
+BaseLockDialog::BaseLockDialog(const GURL& url, const gfx::Size& desired_size)
+ : SystemWebDialogDelegate(url, /*title=*/std::u16string()),
+ desired_size_(desired_size) {}
+
+BaseLockDialog::~BaseLockDialog() = default;
+
+void BaseLockDialog::GetDialogSize(gfx::Size* size) const {
+ *size = FitSizeToDisplay(desired_size_);
+}
+
+void BaseLockDialog::AdjustWidgetInitParams(views::Widget::InitParams* params) {
+ params->type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+}
+
+ui::ModalType BaseLockDialog::GetDialogModalType() const {
+ return ui::ModalType::MODAL_TYPE_SYSTEM;
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h
new file mode 100644
index 00000000000..28d7863b68f
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h
@@ -0,0 +1,33 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_BASE_LOCK_DIALOG_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_BASE_LOCK_DIALOG_H_
+
+#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
+
+namespace chromeos {
+
+// A modal system dialog without any frame decorating it.
+class BaseLockDialog : public SystemWebDialogDelegate {
+ protected:
+ BaseLockDialog(const GURL& url, const gfx::Size& desired_size);
+ BaseLockDialog(BaseLockDialog const&) = delete;
+ BaseLockDialog& operator=(const BaseLockDialog&) = delete;
+ ~BaseLockDialog() override;
+
+ // ui::WebDialogDelegate:
+ void GetDialogSize(gfx::Size* size) const override;
+ void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
+ ui::ModalType GetDialogModalType() const override;
+
+ static constexpr gfx::Size kBaseLockDialogSize = gfx::Size(768, 640);
+
+ private:
+ gfx::Size desired_size_;
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_BASE_LOCK_DIALOG_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.cc
new file mode 100644
index 00000000000..6e255fa1aed
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.cc
@@ -0,0 +1,49 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h"
+#include "chrome/browser/ash/login/saml/in_session_password_sync_manager_factory.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/strings/grit/ui_strings.h"
+
+namespace chromeos {
+
+LockScreenNetworkDialog::LockScreenNetworkDialog(
+ NetworkDialogCleanupCallback callback)
+ : BaseLockDialog(GURL(chrome::kChromeUILockScreenNetworkURL),
+ kBaseLockDialogSize) {
+ callback_ = std::move(callback);
+}
+
+LockScreenNetworkDialog::~LockScreenNetworkDialog() = default;
+
+void LockScreenNetworkDialog::OnDialogClosed(const std::string& json_retval) {
+ base::PostTask(FROM_HERE, {content::BrowserThread::UI}, std::move(callback_));
+}
+
+void LockScreenNetworkDialog::Show(Profile* profile) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ ShowSystemDialogForBrowserContext(profile->GetPrimaryOTRProfile());
+}
+
+void LockScreenNetworkDialog::Dismiss() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ Close();
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h
new file mode 100644
index 00000000000..1d8aa9efc66
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h
@@ -0,0 +1,31 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_DIALOG_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_DIALOG_H_
+
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h"
+
+namespace chromeos {
+
+class LockScreenNetworkDialog : public BaseLockDialog {
+ public:
+ using NetworkDialogCleanupCallback = base::OnceCallback<void()>;
+
+ explicit LockScreenNetworkDialog(NetworkDialogCleanupCallback callback);
+ LockScreenNetworkDialog(LockScreenNetworkDialog const&) = delete;
+ LockScreenNetworkDialog& operator=(const LockScreenNetworkDialog&) = delete;
+ ~LockScreenNetworkDialog() override;
+
+ void OnDialogClosed(const std::string& json_retval) override;
+ void Show(Profile* profile);
+ void Dismiss();
+
+ private:
+ NetworkDialogCleanupCallback callback_;
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_DIALOG_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.cc
new file mode 100644
index 00000000000..6ea56d6db97
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.cc
@@ -0,0 +1,151 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "ash/public/cpp/network_config_service.h"
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/strings/stringprintf.h"
+#include "base/values.h"
+#include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h"
+#include "chrome/browser/ash/login/saml/in_session_password_sync_manager_factory.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/extensions/tab_helper.h"
+#include "chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_dialog_launcher.h"
+#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
+#include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
+#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "content/public/browser/web_ui_message_handler.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+
+namespace {
+
+constexpr char kAddNetwork[] = "addNetwork";
+constexpr char kShowNetworkDetails[] = "showNetworkDetails";
+constexpr char kShowNetworkConfig[] = "showNetworkConfig";
+
+class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
+ public:
+ NetworkConfigMessageHandler() {}
+ NetworkConfigMessageHandler(NetworkConfigMessageHandler const&) = delete;
+ NetworkConfigMessageHandler& operator=(const NetworkConfigMessageHandler&) =
+ delete;
+ ~NetworkConfigMessageHandler() override {}
+
+ // WebUIMessageHandler implementation.
+ void RegisterMessages() override {
+ web_ui()->RegisterMessageCallback(
+ kAddNetwork,
+ base::BindRepeating(&NetworkConfigMessageHandler::AddNetwork,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ kShowNetworkDetails,
+ base::BindRepeating(&NetworkConfigMessageHandler::ShowNetworkDetails,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ kShowNetworkConfig,
+ base::BindRepeating(&NetworkConfigMessageHandler::ShowNetworkConfig,
+ base::Unretained(this)));
+ }
+
+ private:
+ void ShowNetworkDetails(const base::ListValue* arg_list) {
+ CHECK_EQ(1u, arg_list->GetSize());
+ std::string guid;
+ CHECK(arg_list->GetString(0, &guid));
+
+ InternetDetailDialog::ShowDialog(guid);
+ }
+
+ void ShowNetworkConfig(const base::ListValue* arg_list) {
+ CHECK_EQ(1u, arg_list->GetSize());
+ std::string guid;
+ CHECK(arg_list->GetString(0, &guid));
+
+ InternetConfigDialog::ShowDialogForNetworkId(guid);
+ }
+
+ void AddNetwork(const base::ListValue* args) {
+ std::string onc_type;
+ args->GetString(0, &onc_type);
+ InternetConfigDialog::ShowDialogForNetworkType(onc_type);
+ }
+
+ base::WeakPtrFactory<NetworkConfigMessageHandler> weak_ptr_factory_{this};
+};
+
+} // namespace
+
+// static
+void LockScreenNetworkUI::GetLocalizedStrings(
+ base::DictionaryValue* localized_strings) {
+ localized_strings->SetString(
+ "titleText", l10n_util::GetStringUTF16(IDS_LOCK_SCREEN_NETWORK_TITLE));
+ localized_strings->SetString(
+ "lockScreenNetworkTitle",
+ l10n_util::GetStringUTF16(IDS_LOCK_SCREEN_NETWORK_TITLE));
+ localized_strings->SetString(
+ "lockScreenNetworkSubtitle",
+ l10n_util::GetStringFUTF16(IDS_LOCK_SCREEN_NETWORK_SUBTITLE,
+ ui::GetChromeOSDeviceName()));
+ localized_strings->SetString(
+ "lockScreenCancelButton",
+ l10n_util::GetStringUTF16(IDS_LOCK_SCREEN_CANCEL_BUTTON));
+}
+
+LockScreenNetworkUI::LockScreenNetworkUI(content::WebUI* web_ui)
+ : ui::MojoWebDialogUI(web_ui) {
+ web_ui->AddMessageHandler(std::make_unique<NetworkConfigMessageHandler>());
+
+ base::DictionaryValue localized_strings;
+ GetLocalizedStrings(&localized_strings);
+
+ content::WebUIDataSource* html =
+ content::WebUIDataSource::Create(chrome::kChromeUILockScreenNetworkHost);
+
+ // TODO(crbug.com/1098690): Trusted Type Polymer.
+ html->DisableTrustedTypesCSP();
+
+ html->AddLocalizedStrings(localized_strings);
+
+ network_element::AddLocalizedStrings(html);
+ network_element::AddOncLocalizedStrings(html);
+ html->UseStringsJs();
+
+ html->AddResourcePath("lock_screen_network.js", IDR_LOCK_SCREEN_NETWORK_JS);
+ html->SetDefaultResource(IDR_LOCK_SCREEN_NETWORK_HTML);
+
+ content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
+ html);
+}
+
+LockScreenNetworkUI::~LockScreenNetworkUI() {}
+
+void LockScreenNetworkUI::BindInterface(
+ mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver) {
+ ash::GetNetworkConfigService(std::move(receiver));
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(LockScreenNetworkUI)
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h
new file mode 100644
index 00000000000..90aac88506a
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_ui.h
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_UI_H_
+
+#include "base/macros.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "ui/web_dialogs/web_dialog_ui.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace chromeos {
+
+// WebUI controller for chrome://lock-network dialog.
+class LockScreenNetworkUI : public ui::MojoWebDialogUI {
+ public:
+ explicit LockScreenNetworkUI(content::WebUI* web_ui);
+ LockScreenNetworkUI(LockScreenNetworkUI const&) = delete;
+ LockScreenNetworkUI& operator=(const LockScreenNetworkUI&) = delete;
+ ~LockScreenNetworkUI() override;
+
+ void GetLocalizedStrings(base::DictionaryValue* localized_strings);
+
+ // Instantiates implementation of the mojom::CrosNetworkConfig mojo interface
+ // passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver);
+
+ private:
+ WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_NETWORK_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc
index 06da296109e..1c2beb7074f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.cc
@@ -5,68 +5,35 @@
#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h"
#include <memory>
+#include <string>
#include "base/bind.h"
#include "base/json/json_writer.h"
+#include "chrome/browser/ash/login/helper.h"
#include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h"
#include "chrome/browser/ash/login/saml/in_session_password_sync_manager_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h"
#include "chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.h"
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_network_dialog.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
+#include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_state_handler.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui_data_source.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
#include "ui/strings/grit/ui_strings.h"
namespace chromeos {
namespace {
-
LockScreenStartReauthDialog* g_dialog = nullptr;
-
-constexpr gfx::Size kLockScreenReauthSize(768, 640);
-
-gfx::Size FitSizeToDisplay(const gfx::Size& desired) {
- const display::Display display =
- display::Screen::GetScreen()->GetPrimaryDisplay();
-
- gfx::Size display_size = display.size();
-
- if (display.rotation() == display::Display::ROTATE_90 ||
- display.rotation() == display::Display::ROTATE_270) {
- display_size = gfx::Size(display_size.height(), display_size.width());
- }
-
- display_size.SetToMin(desired);
- return display_size;
-}
-
} // namespace
-BaseLockDialog::BaseLockDialog(GURL url, gfx::Size desired_size)
- : SystemWebDialogDelegate(url, /*title=*/base::string16()),
- desired_size_(desired_size) {}
-
-BaseLockDialog::~BaseLockDialog() {}
-
-void BaseLockDialog::GetDialogSize(gfx::Size* size) const {
- *size = FitSizeToDisplay(desired_size_);
-}
-
-void BaseLockDialog::AdjustWidgetInitParams(views::Widget::InitParams* params) {
- params->type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
-}
-
-ui::ModalType BaseLockDialog::GetDialogModalType() const {
- return ui::ModalType::MODAL_TYPE_SYSTEM;
-}
-
void LockScreenStartReauthDialog::Show() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (g_dialog) {
@@ -77,16 +44,20 @@ void LockScreenStartReauthDialog::Show() {
g_browser_process->profile_manager()->CreateProfileAsync(
ProfileHelper::GetLockScreenProfileDir(),
base::BindRepeating(&LockScreenStartReauthDialog::OnProfileCreated,
- weak_factory_.GetWeakPtr()),
- base::string16(), std::string());
+ weak_factory_.GetWeakPtr()));
}
void LockScreenStartReauthDialog::OnProfileCreated(
Profile* profile,
Profile::CreateStatus status) {
if (status == Profile::CREATE_STATUS_INITIALIZED) {
+ profile_ = profile;
g_dialog->ShowSystemDialogForBrowserContext(
profile->GetPrimaryOTRProfile());
+ // Show network screen if needed.
+ if (!network_state_helper_->IsConnected()) {
+ ShowLockScreenNetworkDialog();
+ }
} else if (status != Profile::CREATE_STATUS_CREATED) {
// TODO(mohammedabdon): Create some generic way to show an error on the lock
// screen.
@@ -114,13 +85,52 @@ bool LockScreenStartReauthDialog::IsRunning() {
return g_dialog;
}
+void LockScreenStartReauthDialog::CloseLockScreenNetworkDialog() {
+ if (!lock_screen_network_dialog_)
+ return;
+ lock_screen_network_dialog_.reset();
+}
+
+void LockScreenStartReauthDialog::ShowLockScreenNetworkDialog() {
+ if (lock_screen_network_dialog_)
+ return;
+ DCHECK(profile_);
+ lock_screen_network_dialog_ =
+ std::make_unique<chromeos::LockScreenNetworkDialog>(base::BindOnce(
+ &LockScreenStartReauthDialog::CloseLockScreenNetworkDialog,
+ base::Unretained(this)));
+ lock_screen_network_dialog_->Show(profile_);
+}
+
LockScreenStartReauthDialog::LockScreenStartReauthDialog()
: BaseLockDialog(GURL(chrome::kChromeUILockScreenStartReauthURL),
- kLockScreenReauthSize) {}
+ kBaseLockDialogSize),
+ network_state_helper_(std::make_unique<login::NetworkStateHelper>()) {
+ NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
+}
LockScreenStartReauthDialog::~LockScreenStartReauthDialog() {
DCHECK_EQ(this, g_dialog);
+ NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
+ FROM_HERE);
+ CloseLockScreenNetworkDialog();
g_dialog = nullptr;
}
+void LockScreenStartReauthDialog::NetworkConnectionStateChanged(
+ const NetworkState* network) {
+ if (network_state_helper_->IsConnected()) {
+ if (lock_screen_network_dialog_) {
+ lock_screen_network_dialog_->Close();
+ }
+ return;
+ }
+ ShowLockScreenNetworkDialog();
+}
+
+void LockScreenStartReauthDialog::DefaultNetworkChanged(
+ const NetworkState* network) {
+ NOTIMPLEMENTED();
+}
+
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h
index fccd35b3ffd..b419a09910d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_dialogs.h
@@ -6,29 +6,20 @@
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_LOCK_SCREEN_REAUTH_DIALOGS_H_
#include "base/macros.h"
+#include "base/scoped_observation.h"
+#include "chrome/browser/ash/login/helper.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
+#include "chrome/browser/ui/webui/chromeos/in_session_password_change/base_lock_dialog.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_state_handler_observer.h"
#include "ui/web_dialogs/web_dialog_ui.h"
namespace chromeos {
-// A modal system dialog without any frame decorating it.
-class BaseLockDialog : public SystemWebDialogDelegate {
- protected:
- BaseLockDialog(GURL url, gfx::Size desired_size);
- BaseLockDialog(BaseLockDialog const&) = delete;
- ~BaseLockDialog() override;
+class LockScreenNetworkDialog;
- // ui::WebDialogDelegate:
- void GetDialogSize(gfx::Size* size) const override;
- void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
- ui::ModalType GetDialogModalType() const override;
-
- private:
- gfx::Size desired_size_;
-};
-
-class LockScreenStartReauthDialog : public BaseLockDialog {
+class LockScreenStartReauthDialog : public BaseLockDialog,
+ public NetworkStateHandlerObserver {
public:
LockScreenStartReauthDialog();
LockScreenStartReauthDialog(LockScreenStartReauthDialog const&) = delete;
@@ -38,10 +29,22 @@ class LockScreenStartReauthDialog : public BaseLockDialog {
void Dismiss();
bool IsRunning();
+ void CloseLockScreenNetworkDialog();
+ void ShowLockScreenNetworkDialog();
+
private:
void OnProfileCreated(Profile* profile, Profile::CreateStatus status);
void OnDialogClosed(const std::string& json_retval) override;
+ // NetworkStateHandlerObserver:
+ void NetworkConnectionStateChanged(const NetworkState* network) override;
+ void DefaultNetworkChanged(const NetworkState* network) override;
+
+ std::unique_ptr<login::NetworkStateHelper> network_state_helper_;
+
+ std::unique_ptr<LockScreenNetworkDialog> lock_screen_network_dialog_;
+ Profile* profile_;
+
base::WeakPtrFactory<LockScreenStartReauthDialog> weak_factory_{this};
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc
index bf4915d9809..d0a0cc9d892 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc
@@ -7,10 +7,10 @@
#include "base/notreached.h"
#include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h"
#include "chrome/browser/ash/login/saml/in_session_password_sync_manager_factory.h"
+#include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/ui/login_display_host_webui.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/signin_partition_manager.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/generated_resources.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.cc
index bba646a609d..3fb74e8b088 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.cc
@@ -59,7 +59,7 @@ gfx::Size FitSizeToDisplay(const gfx::Size& desired) {
} // namespace
BasePasswordDialog::BasePasswordDialog(GURL url, gfx::Size desired_size)
- : SystemWebDialogDelegate(url, /*title=*/base::string16()),
+ : SystemWebDialogDelegate(url, /*title=*/std::u16string()),
desired_size_(desired_size) {}
BasePasswordDialog::~BasePasswordDialog() {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h
index d8c2b144e2c..7ff461744f6 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h
@@ -5,8 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_PASSWORD_CHANGE_DIALOGS_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_PASSWORD_CHANGE_DIALOGS_H_
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "ui/web_dialogs/web_dialog_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
index 5541f632965..8bfb5480c24 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
@@ -10,9 +10,9 @@
#include "base/macros.h"
#include "base/values.h"
#include "chrome/browser/ash/login/auth/chrome_cryptohome_authenticator.h"
+#include "chrome/browser/ash/login/login_pref_names.h"
#include "chrome/browser/ash/login/saml/in_session_password_change_manager.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/login/login_pref_names.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/login/auth/saml_password_attributes.h"
#include "components/prefs/pref_service.h"
@@ -41,7 +41,7 @@ void PasswordChangeHandler::HandleInitialize(const base::ListValue* value) {
ProfileHelper::Get()->GetUserByProfile(profile);
if (user)
params.SetKey("userName", base::Value(user->GetDisplayEmail()));
- CallJavascriptFunction("insession.password.change.loadAuthExtension", params);
+ CallJavascriptFunction("$(\'main-element\').loadAuthExtension", params);
}
void PasswordChangeHandler::HandleChangePassword(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
index 214b036b2e6..09f7ff83694 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
@@ -11,8 +11,8 @@
#include "base/command_line.h"
#include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ash/login/login_pref_names.h"
#include "chrome/browser/ash/login/saml/password_expiry_notification.h"
-#include "chrome/browser/chromeos/login/login_pref_names.h"
#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_dialogs.h"
@@ -60,8 +60,8 @@ std::string GetPasswordChangeUrl(Profile* profile) {
.password_change_url();
}
-base::string16 GetHostedHeaderText(const std::string& password_change_url) {
- base::string16 host =
+std::u16string GetHostedHeaderText(const std::string& password_change_url) {
+ std::u16string host =
base::UTF8ToUTF16(net::GetHostAndOptionalPort(GURL(password_change_url)));
DCHECK(!host.empty());
return l10n_util::GetStringFUTF16(IDS_LOGIN_SAML_PASSWORD_CHANGE_NOTICE,
@@ -96,7 +96,6 @@ PasswordChangeUI::PasswordChangeUI(content::WebUI* web_ui)
source->SetDefaultResource(IDR_PASSWORD_CHANGE_HTML);
- source->AddResourcePath("password_change.css", IDR_PASSWORD_CHANGE_CSS);
source->AddResourcePath("authenticator.js",
IDR_PASSWORD_CHANGE_AUTHENTICATOR_JS);
source->AddResourcePath("webview_saml_injected.js",
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
index b8d19af17e1..84eb8fdd852 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
@@ -5,8 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_PASSWORD_CHANGE_UI_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_IN_SESSION_PASSWORD_CHANGE_PASSWORD_CHANGE_UI_H_
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "ui/web_dialogs/web_dialog_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
index c5c9edc4f00..30c32964b7b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
@@ -34,7 +34,7 @@ void UrgentPasswordExpiryNotificationHandler::HandleGetTitleText(
const std::string callback_id = params->GetList()[0].GetString();
const int ms_until_expiry = params->GetList()[1].GetInt();
- const base::string16 title = PasswordExpiryNotification::GetTitleText(
+ const std::u16string title = PasswordExpiryNotification::GetTitleText(
base::TimeDelta::FromMilliseconds(ms_until_expiry));
AllowJavascript();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
index 0acd7b44797..84d1665860c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
@@ -107,7 +107,7 @@ InternetConfigDialog::InternetConfigDialog(const std::string& dialog_id,
const std::string& network_type,
const std::string& network_id)
: SystemWebDialogDelegate(GURL(chrome::kChromeUIIntenetConfigDialogURL),
- base::string16() /* title */),
+ std::u16string() /* title */),
dialog_id_(dialog_id),
network_type_(network_type),
network_id_(network_id) {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
index 5a75fe002e7..0da3b698156 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
@@ -9,6 +9,7 @@
#include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.h"
#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
@@ -101,7 +102,7 @@ void InternetDetailDialog::ShowDialog(const std::string& network_id) {
InternetDetailDialog::InternetDetailDialog(const NetworkState& network)
: SystemWebDialogDelegate(GURL(chrome::kChromeUIIntenetDetailDialogURL),
- /* title= */ base::string16()),
+ /* title= */ std::u16string()),
network_id_(network.guid()),
network_type_(network_util::TranslateShillTypeToONC(network.type())),
network_name_(GetNetworkName8(network)) {
@@ -140,6 +141,7 @@ InternetDetailDialogUI::InternetDetailDialogUI(content::WebUI* web_ui)
source->DisableTrustedTypesCSP();
source->AddBoolean("showTechnologyBadge",
!ash::features::IsSeparateNetworkIconsEnabled());
+ cellular_setup::AddNonStringLoadTimeData(source);
AddInternetStrings(source);
source->AddLocalizedString("title", IDS_SETTINGS_INTERNET_DETAIL);
source->UseStringsJs();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.cc
index bd17bdb9049..35770eef030 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.cc
@@ -4,10 +4,10 @@
#include "chrome/browser/ui/webui/chromeos/login/active_directory_login_screen_handler.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/active_directory_login_screen.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "chrome/grit/chromium_strings.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
index 8b1c2ff84e7..d965ceaaa0c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
@@ -10,8 +10,8 @@
#include "ash/public/cpp/login_screen.h"
#include "base/values.h"
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/network_error.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/grit/chrome_unscaled_resources.h"
@@ -63,7 +63,7 @@ void AppLaunchSplashScreenHandler::DeclareLocalizedValues(
builder->Add("appStartMessage", IDS_APP_START_NETWORK_WAIT_MESSAGE);
builder->Add("configureNetwork", IDS_APP_START_CONFIGURE_NETWORK);
- const base::string16 product_os_name =
+ const std::u16string product_os_name =
l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME);
builder->Add("shortcutInfo",
l10n_util::GetStringFUTF16(IDS_APP_START_BAILOUT_SHORTCUT_FORMAT,
@@ -241,24 +241,23 @@ void AppLaunchSplashScreenHandler::SetLaunchText(const std::string& text) {
int AppLaunchSplashScreenHandler::GetProgressMessageFromState(
AppLaunchState state) {
switch (state) {
- case APP_LAUNCH_STATE_PREPARING_PROFILE:
+ case AppLaunchState::kPreparingProfile:
return IDS_APP_START_PREPARING_PROFILE_MESSAGE;
- case APP_LAUNCH_STATE_PREPARING_NETWORK:
+ case AppLaunchState::kPreparingNetwork:
return IDS_APP_START_NETWORK_WAIT_MESSAGE;
- case APP_LAUNCH_STATE_INSTALLING_APPLICATION:
+ case AppLaunchState::kInstallingApplication:
return IDS_APP_START_APP_WAIT_MESSAGE;
- case APP_LAUNCH_STATE_INSTALLING_EXTENSION:
+ case AppLaunchState::kInstallingExtension:
return IDS_APP_START_EXTENSION_WAIT_MESSAGE;
- case APP_LAUNCH_STATE_WAITING_APP_WINDOW:
+ case AppLaunchState::kWaitingAppWindow:
return IDS_APP_START_WAIT_FOR_APP_WINDOW_MESSAGE;
- case APP_LAUNCH_STATE_WAITING_APP_WINDOW_INSTALL_FAILED:
+ case AppLaunchState::kWaitingAppWindowInstallFailed:
return IDS_APP_START_WAIT_FOR_APP_WINDOW_INSTALL_FAILED_MESSAGE;
- case APP_LAUNCH_STATE_NETWORK_WAIT_TIMEOUT:
+ case AppLaunchState::kNetworkWaitTimeout:
return IDS_APP_START_NETWORK_WAIT_TIMEOUT_MESSAGE;
- case APP_LAUNCH_STATE_SHOWING_NETWORK_CONFIGURE_UI:
+ case AppLaunchState::kShowingNetworkConfigureUI:
return IDS_APP_START_SHOWING_NETWORK_CONFIGURE_UI_MESSAGE;
}
- return IDS_APP_START_NETWORK_WAIT_MESSAGE;
}
void AppLaunchSplashScreenHandler::HandleConfigureNetwork() {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
index da4a8dfc829..d33cc0c9563 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
@@ -48,15 +48,15 @@ class AppLaunchSplashScreenView {
virtual bool IsNetworkRequired() = 0;
};
- enum AppLaunchState {
- APP_LAUNCH_STATE_PREPARING_PROFILE,
- APP_LAUNCH_STATE_PREPARING_NETWORK,
- APP_LAUNCH_STATE_INSTALLING_APPLICATION,
- APP_LAUNCH_STATE_INSTALLING_EXTENSION,
- APP_LAUNCH_STATE_WAITING_APP_WINDOW,
- APP_LAUNCH_STATE_WAITING_APP_WINDOW_INSTALL_FAILED,
- APP_LAUNCH_STATE_NETWORK_WAIT_TIMEOUT,
- APP_LAUNCH_STATE_SHOWING_NETWORK_CONFIGURE_UI,
+ enum class AppLaunchState {
+ kPreparingProfile,
+ kPreparingNetwork,
+ kInstallingApplication,
+ kInstallingExtension,
+ kWaitingAppWindow,
+ kWaitingAppWindowInstallFailed,
+ kNetworkWaitTimeout,
+ kShowingNetworkConfigureUI,
};
constexpr static StaticOobeScreenId kScreenId{"app-launch-splash"};
@@ -135,7 +135,7 @@ class AppLaunchSplashScreenHandler
Delegate* delegate_ = nullptr;
bool show_on_init_ = false;
- AppLaunchState state_ = APP_LAUNCH_STATE_PREPARING_PROFILE;
+ AppLaunchState state_ = AppLaunchState::kPreparingProfile;
scoped_refptr<NetworkStateInformer> network_state_informer_;
ErrorScreen* error_screen_;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index c0da934dd28..cd4763a964e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -8,13 +8,13 @@
#include "base/command_line.h"
#include "base/hash/sha1.h"
#include "base/i18n/timezone.h"
+#include "chrome/browser/ash/arc/arc_support_host.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/arc/optin/arc_optin_preference_handler.h"
#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/arc/arc_support_host.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/arc/optin/arc_optin_preference_handler.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/consent_auditor/consent_auditor_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -381,10 +381,9 @@ void ArcTermsOfServiceScreenHandler::RecordConsents(
ConsentAuditorFactory::GetForProfile(profile);
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
// The account may or may not have consented to browser sync.
- DCHECK(
- identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+ DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
const CoreAccountId account_id =
- identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+ identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
ArcPlayTermsOfServiceConsent play_consent;
play_consent.set_status(tos_accepted ? UserConsentTypes::GIVEN
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
index 8b753db8c8a..05e5f2c746d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
@@ -10,7 +10,7 @@
#include "base/macros.h"
#include "base/observer_list.h"
-#include "chrome/browser/chromeos/arc/optin/arc_optin_preference_handler_observer.h"
+#include "chrome/browser/ash/arc/optin/arc_optin_preference_handler_observer.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chromeos/network/network_state_handler_observer.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
index d01b62f004d..ce70d89e4be 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -9,10 +9,10 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/assistant_optin_flow_screen.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h"
@@ -491,7 +491,7 @@ void AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse(
if (ui_result.consent_flow_update_result().update_status() !=
assistant::ConsentFlowUiUpdateResult::SUCCESS) {
// TODO(updowndta): Handle consent update failure.
- LOG(ERROR) << "Consent udpate error.";
+ LOG(ERROR) << "Consent update error.";
} else if (activity_control_needed_) {
activity_control_needed_ = false;
PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
@@ -505,7 +505,7 @@ void AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse(
if (ui_result.email_opt_in_update_result().update_status() !=
assistant::EmailOptInUpdateResult::SUCCESS) {
// TODO(updowndta): Handle email optin update failure.
- LOG(ERROR) << "Email OptIn udpate error.";
+ LOG(ERROR) << "Email OptIn update error.";
}
return;
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
index 2d2b8c62fb3..5886c84992c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
index 3476168e1ee..998bf1147d4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
@@ -6,7 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_BASE_SCREEN_HANDLER_H_
#include "base/macros.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
index e9207e8d772..1c52f349b0d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
@@ -12,7 +12,7 @@
#include "base/callback.h"
#include "base/callback_helpers.h"
#include "base/macros.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/js_calls_container.h"
#include "components/login/base_screen_handler_utils.h"
#include "content/public/browser/web_ui_message_handler.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index ce6f701e5c2..dccefb5dcb1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -8,7 +8,6 @@
#include "ash/constants/ash_features.h"
#include "ash/public/ash_interfaces.h"
-#include "ash/public/cpp/ash_features.h"
#include "ash/public/cpp/event_rewriter_controller.h"
#include "ash/public/cpp/shelf_config.h"
#include "ash/public/cpp/tablet_mode.h"
@@ -18,18 +17,19 @@
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/branding_buildflags.h"
+#include "chrome/browser/ash/login/configuration_keys.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
#include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
+#include "chrome/browser/ash/login/helper.h"
#include "chrome/browser/ash/login/lock/screen_locker.h"
#include "chrome/browser/ash/login/screens/reset_screen.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/ash/system/input_device_settings.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/configuration_keys.h"
-#include "chrome/browser/chromeos/login/helper.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
#include "chrome/browser/ui/ash/ash_util.h"
#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
#include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
@@ -91,22 +91,6 @@ void CoreOobeHandler::DeclareLocalizedValues(
builder->Add("productName", IDS_SHORT_PRODUCT_NAME);
builder->Add("learnMore", IDS_LEARN_MORE);
- // Strings for the device requisition prompt.
- builder->Add("deviceRequisitionPromptCancel",
- IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_CANCEL);
- builder->Add("deviceRequisitionPromptOk",
- IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_OK);
- builder->Add("deviceRequisitionPromptText",
- IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_TEXT);
- builder->Add("deviceRequisitionRemoraPromptCancel",
- IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
- builder->Add("deviceRequisitionRemoraPromptOk",
- IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
- builder->Add("deviceRequisitionRemoraPromptText",
- IDS_ENTERPRISE_DEVICE_REQUISITION_REMORA_PROMPT_TEXT);
- builder->Add("deviceRequisitionSharkPromptText",
- IDS_ENTERPRISE_DEVICE_REQUISITION_SHARK_PROMPT_TEXT);
-
// Strings for Asset Identifier shown in version string.
builder->Add("assetIdLabel", IDS_OOBE_ASSET_ID_LABEL);
@@ -132,10 +116,11 @@ void CoreOobeHandler::GetAdditionalParameters(base::DictionaryValue* dict) {
base::Value(ash::TabletMode::Get()->InTabletMode()));
dict->SetKey("isDemoModeEnabled",
base::Value(DemoSetupController::IsDemoModeAllowed()));
- dict->SetKey("showTechnologyBadge",
- base::Value(!ash::features::IsSeparateNetworkIconsEnabled()));
dict->SetKey("newLayoutEnabled",
base::Value(features::IsNewOobeLayoutEnabled()));
+ if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
+ dict->SetKey("flowType", base::Value("meet"));
+ }
}
void CoreOobeHandler::RegisterMessages() {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
index 922310b6bc9..41612f09112 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
@@ -16,9 +16,9 @@
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/login/oobe_configuration.h"
-#include "chrome/browser/chromeos/login/version_info_updater.h"
+#include "chrome/browser/ash/login/help_app_launcher.h"
+#include "chrome/browser/ash/login/oobe_configuration.h"
+#include "chrome/browser/ash/login/version_info_updater.h"
#include "chrome/browser/chromeos/tpm_firmware_update.h"
#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
#include "mojo/public/cpp/bindings/remote.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
index fe6bb67ab93..f4d5c71f0ef 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/demo_preferences_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
index 191e9e3edae..fe798b55c8f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
@@ -4,11 +4,12 @@
#include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
-#include "base/strings/string16.h"
+#include <string>
+
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/demo_setup_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
@@ -46,7 +47,7 @@ void DemoSetupScreenHandler::OnSetupFailed(
CallJS("login.DemoSetupScreen.onSetupFailed",
base::JoinString({error.GetLocalizedErrorMessage(),
error.GetLocalizedRecoveryMessage()},
- base::UTF8ToUTF16(" ")),
+ u" "),
error.recovery_method() ==
DemoSetupController::DemoSetupError::RecoveryMethod::kPowerwash);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
index 4c411120c43..d98e0ee1b4e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/device_disabled_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enable_adb_sideloading_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/enable_adb_sideloading_screen_handler.cc
index e03cabd8733..3525f9cecc4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enable_adb_sideloading_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enable_adb_sideloading_screen_handler.cc
@@ -6,8 +6,8 @@
#include <string>
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/enable_adb_sideloading_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
index 6b628be7f05..ee72ac703ab 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
@@ -6,9 +6,9 @@
#include <string>
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/enable_debugging_screen.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index 46cb7912bd1..90c0fa43a8d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -16,16 +16,16 @@
#include "base/metrics/histogram_functions.h"
#include "base/values.h"
#include "build/build_config.h"
+#include "chrome/browser/ash/authpolicy/authpolicy_helper.h"
+#include "chrome/browser/ash/login/error_screens_histogram_helper.h"
+#include "chrome/browser/ash/login/help_app_launcher.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/network_error.h"
+#include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/authpolicy/authpolicy_helper.h"
-#include "chrome/browser/chromeos/login/error_screens_histogram_helper.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/signin_partition_manager.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
#include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
@@ -341,7 +341,7 @@ void EnrollmentScreenHandler::ShowEnrollmentSpinnerScreen() {
void EnrollmentScreenHandler::SetEnterpriseDomainInfo(
const std::string& manager,
- const base::string16& device_type) {
+ const std::u16string& device_type) {
CallJS("login.OAuthEnrollmentScreen.setEnterpriseDomainInfo", manager,
device_type);
}
@@ -403,10 +403,19 @@ void EnrollmentScreenHandler::ShowEnrollmentStatus(
// Some special cases for generating a nicer message that's more helpful.
switch (status.client_status()) {
case policy::DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED:
- ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR, true);
+ if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR_MEETS, true);
+ } else {
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR, true);
+ }
break;
case policy::DM_STATUS_SERVICE_MISSING_LICENSES:
- ShowError(IDS_ENTERPRISE_ENROLLMENT_MISSING_LICENSES_ERROR, true);
+ if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_MISSING_LICENSES_ERROR_MEETS,
+ true);
+ } else {
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_MISSING_LICENSES_ERROR, true);
+ }
break;
case policy::DM_STATUS_SERVICE_DEPROVISIONED:
ShowError(IDS_ENTERPRISE_ENROLLMENT_DEPROVISIONED_ERROR, true);
@@ -426,9 +435,15 @@ void EnrollmentScreenHandler::ShowEnrollmentStatus(
true);
break;
case policy::DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED:
- ShowError(
- IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED,
- true);
+ if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
+ ShowError(
+ IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED_MEETS,
+ true);
+ } else {
+ ShowError(
+ IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED,
+ true);
+ }
break;
case policy::DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE:
ShowError(
@@ -549,7 +564,12 @@ void EnrollmentScreenHandler::DeclareLocalizedValues(
IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE);
builder->Add("oauthEnrollNextBtn", IDS_OFFLINE_LOGIN_NEXT_BUTTON_TEXT);
builder->Add("oauthEnrollSkip", IDS_ENTERPRISE_ENROLLMENT_SKIP);
- builder->Add("oauthEnrollDone", IDS_ENTERPRISE_ENROLLMENT_DONE);
+ if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
+ // Use Next text since the setup is not finished.
+ builder->Add("oauthEnrollDone", IDS_EULA_NEXT_BUTTON);
+ } else {
+ builder->Add("oauthEnrollDone", IDS_ENTERPRISE_ENROLLMENT_DONE);
+ }
builder->Add("oauthEnrollRetry", IDS_ENTERPRISE_ENROLLMENT_RETRY);
builder->Add("oauthEnrollManualEnrollment",
IDS_ENTERPRISE_ENROLLMENT_ENROLL_MANUALLY);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
index 69af212b686..7c24c0fd3c0 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
@@ -72,7 +72,7 @@ class EnrollmentScreenHandler
const policy::EnrollmentConfig& config) override;
void SetEnterpriseDomainInfo(const std::string& manager,
- const base::string16& device_type) override;
+ const std::u16string& device_type) override;
void Show() override;
void Hide() override;
void ShowSigninScreen() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
index 979f1f969a6..9d79b68c8c8 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
@@ -12,12 +12,12 @@
#include "base/command_line.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
+#include "chrome/browser/ash/login/help_app_launcher.h"
+#include "chrome/browser/ash/login/helper.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/eula_screen.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/login/helper.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc
index 25a1556c826..f34fe2a0db1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h>
+#include "chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h
index b2f6a14b7a7..3e23e0dced5 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h
@@ -29,7 +29,7 @@ class FakeAppLaunchSplashScreenHandler : public AppLaunchSplashScreenView {
KioskAppLaunchError::Error error_message_type_ =
KioskAppLaunchError::Error::kNone;
bool network_ready_ = false;
- AppLaunchState state_ = APP_LAUNCH_STATE_PREPARING_PROFILE;
+ AppLaunchState state_ = AppLaunchState::kPreparingProfile;
};
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h
index 448f04f509e..cf9ef6ec8ca 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h
@@ -33,12 +33,12 @@ class FakeUpdateRequiredScreenHandler : public UpdateRequiredView {
void SetIsConnected(bool connected) override {}
void SetUpdateProgressUnavailable(bool unavailable) override {}
void SetUpdateProgressValue(int progress) override {}
- void SetUpdateProgressMessage(const base::string16& message) override {}
+ void SetUpdateProgressMessage(const std::u16string& message) override {}
void SetEstimatedTimeLeftVisible(bool visible) override {}
void SetEstimatedTimeLeft(int seconds_left) override {}
void SetUIState(UpdateRequiredView::UIState ui_state) override;
void SetEnterpriseAndDeviceName(const std::string& enterpriseDomain,
- const base::string16& deviceName) override {}
+ const std::u16string& deviceName) override {}
void SetEolMessage(const std::string& eolMessage) override {}
void SetIsUserDataPresent(bool data_present) override {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
index 647ebf4081b..7c520e3029d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/family_link_notice_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
index 91b49aa5d50..198ee612b8d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
@@ -45,6 +45,7 @@ void FingerprintSetupScreenHandler::DeclareLocalizedValues(
IDS_OOBE_FINGERPINT_SETUP_SCREEN_INSTRUCTION_TRY_AGAIN);
int description_id, aria_label_id;
+ bool aria_label_includes_device = false;
switch (quick_unlock::GetFingerprintLocation()) {
case quick_unlock::FingerprintLocation::TABLET_POWER_BUTTON:
description_id =
@@ -70,10 +71,36 @@ void FingerprintSetupScreenHandler::DeclareLocalizedValues(
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
break;
+ case quick_unlock::FingerprintLocation::RIGHT_SIDE:
+ description_id =
+ IDS_OOBE_FINGERPINT_SETUP_SCREEN_SENSOR_GENERAL_DESCRIPTION;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_RIGHT_SIDE_ARIA_LABEL;
+ aria_label_includes_device = true;
+ break;
+ case quick_unlock::FingerprintLocation::LEFT_SIDE:
+ description_id =
+ IDS_OOBE_FINGERPINT_SETUP_SCREEN_SENSOR_GENERAL_DESCRIPTION;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_LEFT_SIDE_ARIA_LABEL;
+ aria_label_includes_device = true;
+ break;
+ case quick_unlock::FingerprintLocation::UNKNOWN:
+ description_id =
+ IDS_OOBE_FINGERPINT_SETUP_SCREEN_SENSOR_GENERAL_DESCRIPTION;
+ aria_label_id =
+ IDS_OOBE_FINGERPINT_SETUP_SCREEN_SENSOR_GENERAL_DESCRIPTION;
+ aria_label_includes_device = true;
+ break;
}
builder->AddF("setupFingerprintScreenDescription", description_id,
ui::GetChromeOSDeviceName());
- builder->Add("setupFingerprintScreenAriaLabel", aria_label_id);
+ if (aria_label_includes_device) {
+ builder->AddF("setupFingerprintScreenAriaLabel", aria_label_id,
+ ui::GetChromeOSDeviceName());
+ } else {
+ builder->Add("setupFingerprintScreenAriaLabel", aria_label_id);
+ }
}
void FingerprintSetupScreenHandler::RegisterMessages() {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc
index 625118e5ca0..707bf7f601c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc
@@ -5,9 +5,9 @@
#include "chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/gaia_password_changed_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 44a7a713f63..efd5771b634 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -33,25 +33,26 @@
#include "base/task/thread_pool.h"
#include "base/timer/timer.h"
#include "base/values.h"
+#include "chrome/browser/ash/authpolicy/authpolicy_helper.h"
#include "chrome/browser/ash/certificate_provider/certificate_provider_service.h"
#include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h"
#include "chrome/browser/ash/certificate_provider/pin_dialog_manager.h"
+#include "chrome/browser/ash/login/reauth_stats.h"
#include "chrome/browser/ash/login/saml/public_saml_url_fetcher.h"
#include "chrome/browser/ash/login/saml/saml_metric_utils.h"
#include "chrome/browser/ash/login/screens/network_error.h"
#include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
+#include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/ui/login_display_host_webui.h"
+#include "chrome/browser/ash/login/ui/user_adding_screen.h"
+#include "chrome/browser/ash/login/users/chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/chrome_user_manager_util.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/authpolicy/authpolicy_helper.h"
-#include "chrome/browser/chromeos/login/reauth_stats.h"
-#include "chrome/browser/chromeos/login/signin_partition_manager.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
-#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager_util.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
@@ -288,7 +289,7 @@ base::Value MakeSecurityTokenPinDialogParameters(
"formattedError",
GenerateErrorMessage(error_label, attempts_left, enable_user_input));
if (attempts_left == -1) {
- params.SetStringKey("formattedAttemptsLeft", base::string16());
+ params.SetStringKey("formattedAttemptsLeft", std::u16string());
} else {
params.SetStringKey(
"formattedAttemptsLeft",
@@ -454,7 +455,9 @@ void GaiaScreenHandler::LoadGaiaWithPartitionAndVersionAndConsent(
params.SetString("clientVersion", version_info::GetVersionNumber());
if (!platform_version->empty())
params.SetString("platformVersion", *platform_version);
- params.SetString("releaseChannel", chrome::GetChannelName());
+ // Extended stable channel is not supported on Chrome OS Ash.
+ params.SetString("releaseChannel",
+ chrome::GetChannelName(chrome::WithExtendedStable(false)));
params.SetString("endpointGen", kEndpointGen);
std::string email_domain;
@@ -766,6 +769,17 @@ void GaiaScreenHandler::HandleCompleteAuthentication(
return;
}
+ // Record amount of time from the moment screen was shown till
+ // completeAuthentication signal come. Only for no SAML flow and only during
+ // first run in OOBE.
+ if (elapsed_timer_ && !using_saml &&
+ session_manager::SessionManager::Get()->session_state() ==
+ session_manager::SessionState::OOBE) {
+ base::UmaHistogramMediumTimes("OOBE.GaiaLoginTime",
+ elapsed_timer_->Elapsed());
+ elapsed_timer_.reset();
+ }
+
const std::string sanitized_email = gaia::SanitizeEmail(email);
LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
@@ -1051,9 +1065,8 @@ void GaiaScreenHandler::StartClearingCookies(
LOG_ASSERT(Profile::FromWebUI(web_ui()) ==
profile_helper->GetSigninProfile());
profile_helper->ClearSigninProfile(
- base::AdaptCallbackForRepeating(base::BindOnce(
- &GaiaScreenHandler::OnCookiesCleared, weak_factory_.GetWeakPtr(),
- std::move(on_clear_callback))));
+ base::BindOnce(&GaiaScreenHandler::OnCookiesCleared,
+ weak_factory_.GetWeakPtr(), std::move(on_clear_callback)));
}
void GaiaScreenHandler::OnCookiesCleared(base::OnceClosure on_clear_callback) {
@@ -1110,6 +1123,7 @@ void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool is_third_party_idp,
void GaiaScreenHandler::Show() {
ShowScreen(GaiaView::kScreenId);
+ elapsed_timer_ = std::make_unique<base::ElapsedTimer>();
hidden_ = false;
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index 2b7c92e63d0..f5174d10a10 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -12,7 +12,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/ash/certificate_provider/security_token_pin_dialog_host.h"
-#include "chrome/browser/chromeos/login/login_client_cert_usage_observer.h"
+#include "chrome/browser/ash/login/login_client_cert_usage_observer.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
@@ -28,6 +28,7 @@ class AccountId;
namespace base {
class DictionaryValue;
+class ElapsedTimer;
} // namespace base
namespace network {
@@ -399,6 +400,9 @@ class GaiaScreenHandler : public BaseScreenHandler,
bool hidden_ = true;
+ // Used to record amount of time user needed for successful online login.
+ std::unique_ptr<base::ElapsedTimer> elapsed_timer_;
+
std::string signin_partition_name_;
// Handler for `samlChallengeMachineKey` request.
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
index 714d27d2775..ff93d32f10f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
@@ -4,19 +4,21 @@
#include "chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h"
+#include <string>
+
#include "base/bind.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/hid_detection_screen.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
#include "components/prefs/pref_service.h"
+#include "services/device/public/mojom/input_service.mojom.h"
namespace chromeos {
@@ -144,6 +146,28 @@ void HIDDetectionScreenHandler::DeclareLocalizedValues(
IDS_HID_DETECTION_DETECTED_TOUCHSCREEN);
}
+void HIDDetectionScreenHandler::DeclareJSCallbacks() {
+ AddCallback(
+ "HIDDetectionScreen.emulateDevicesConnectedForTesting",
+ &HIDDetectionScreenHandler::HandleEmulateDevicesConnectedForTesting);
+}
+
+void HIDDetectionScreenHandler::HandleEmulateDevicesConnectedForTesting() {
+ auto mouse = device::mojom::InputDeviceInfo::New();
+ mouse->id = "fake_mouse";
+ mouse->subsystem = device::mojom::InputDeviceSubsystem::SUBSYSTEM_INPUT;
+ mouse->type = device::mojom::InputDeviceType::TYPE_USB;
+ mouse->is_mouse = true;
+ screen_->InputDeviceAddedForTesting(std::move(mouse));
+
+ auto keyboard = device::mojom::InputDeviceInfo::New();
+ keyboard->id = "fake_keyboard";
+ keyboard->subsystem = device::mojom::InputDeviceSubsystem::SUBSYSTEM_INPUT;
+ keyboard->type = device::mojom::InputDeviceType::TYPE_USB;
+ keyboard->is_keyboard = true;
+ screen_->InputDeviceAddedForTesting(std::move(keyboard));
+}
+
void HIDDetectionScreenHandler::Initialize() {
if (show_on_init_) {
Show();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
index 60364ab09b3..f9e875b9588 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
@@ -69,11 +69,15 @@ class HIDDetectionScreenHandler
// BaseScreenHandler implementation:
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
+ void DeclareJSCallbacks() override;
void Initialize() override;
// Registers the preference for derelict state.
static void RegisterPrefs(PrefRegistrySimple* registry);
+ // Emulate that a USB Mouse and a USB Keyboard are connected for testing.
+ void HandleEmulateDevicesConnectedForTesting();
+
// State that has been exported to JS. Used by tests.
std::string keyboard_state_for_test() const { return keyboard_state_; }
std::string mouse_state_for_test() const { return mouse_state_; }
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
index e42af035f6a..82b02086004 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
@@ -9,9 +9,9 @@
#include "base/command_line.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/kiosk_autolaunch_screen.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
index a1b5c955982..c7e0667874e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
@@ -10,6 +10,7 @@
#include <map>
#include <memory>
#include <set>
+#include <string>
#include <utility>
#include "base/bind.h"
@@ -20,7 +21,6 @@
#include "base/memory/ref_counted.h"
#include "base/notreached.h"
#include "base/sequenced_task_runner.h"
-#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
@@ -79,9 +79,9 @@ void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) {
std::unique_ptr<base::DictionaryValue> CreateLanguageEntry(
const std::string& language_code,
- const base::string16& language_display_name,
- const base::string16& language_native_display_name) {
- base::string16 display_name = language_display_name;
+ const std::u16string& language_display_name,
+ const std::u16string& language_native_display_name) {
+ std::u16string display_name = language_display_name;
const bool markup_removal =
base::i18n::UnadjustStringForLocaleDirection(&display_name);
DCHECK(markup_removal);
@@ -128,15 +128,15 @@ std::unique_ptr<base::ListValue> GetLanguageList(
// In theory, we should be able to create a map that is sorted by
// display names using ICU comparator, but doing it is hard, thus we'll
// use an auxiliary vector to achieve the same result.
- typedef std::pair<std::string, base::string16> LanguagePair;
- typedef std::map<base::string16, LanguagePair> LanguageMap;
+ typedef std::pair<std::string, std::u16string> LanguagePair;
+ typedef std::map<std::u16string, LanguagePair> LanguageMap;
LanguageMap language_map;
// The auxiliary vector mentioned above (except the most relevant locales).
- std::vector<base::string16> display_names;
+ std::vector<std::u16string> display_names;
// Separate vector of the most relevant locales.
- std::vector<base::string16> most_relevant_locales_display_names(
+ std::vector<std::u16string> most_relevant_locales_display_names(
most_relevant_language_codes.size());
size_t most_relevant_locales_count = 0;
@@ -170,11 +170,10 @@ std::unique_ptr<base::ListValue> GetLanguageList(
continue;
}
- const base::string16 display_name =
+ const std::u16string display_name =
l10n_util::GetDisplayNameForLocale(language_id, app_locale, true);
- const base::string16 native_display_name =
- l10n_util::GetDisplayNameForLocale(
- language_id, language_id, true);
+ const std::u16string native_display_name =
+ l10n_util::GetDisplayNameForLocale(language_id, language_id, true);
language_map[display_name] =
std::make_pair(language_id, native_display_name);
@@ -191,9 +190,9 @@ std::unique_ptr<base::ListValue> GetLanguageList(
if (!base::Contains(base_language_codes, *it))
continue;
- const base::string16 display_name =
+ const std::u16string display_name =
l10n_util::GetDisplayNameForLocale(*it, app_locale, true);
- const base::string16 native_display_name =
+ const std::u16string native_display_name =
l10n_util::GetDisplayNameForLocale(*it, *it, true);
language_map[display_name] = std::make_pair(*it, native_display_name);
@@ -201,7 +200,7 @@ std::unique_ptr<base::ListValue> GetLanguageList(
const std::map<std::string, int>::const_iterator index_pos =
language_index.find(*it);
if (index_pos != language_index.end()) {
- base::string16& stored_display_name =
+ std::u16string& stored_display_name =
most_relevant_locales_display_names[index_pos->second];
if (stored_display_name.empty()) {
stored_display_name = display_name;
@@ -220,12 +219,10 @@ std::unique_ptr<base::ListValue> GetLanguageList(
if (language_codes.find(base_language_codes[i]) != language_codes.end())
continue;
- base::string16 display_name =
- l10n_util::GetDisplayNameForLocale(
- base_language_codes[i], app_locale, false);
- base::string16 native_display_name =
- l10n_util::GetDisplayNameForLocale(
- base_language_codes[i], base_language_codes[i], false);
+ std::u16string display_name = l10n_util::GetDisplayNameForLocale(
+ base_language_codes[i], app_locale, false);
+ std::u16string native_display_name = l10n_util::GetDisplayNameForLocale(
+ base_language_codes[i], base_language_codes[i], false);
language_map[display_name] =
std::make_pair(base_language_codes[i], native_display_name);
@@ -243,14 +240,14 @@ std::unique_ptr<base::ListValue> GetLanguageList(
l10n_util::SortStrings16(app_locale, &display_names);
// Concatenate most_relevant_locales_display_names and display_names.
// Insert special divider in between.
- std::vector<base::string16> out_display_names;
+ std::vector<std::u16string> out_display_names;
for (size_t i = 0; i < most_relevant_locales_display_names.size(); ++i) {
if (most_relevant_locales_display_names[i].size() == 0)
continue;
out_display_names.push_back(most_relevant_locales_display_names[i]);
}
- base::string16 divider16;
+ std::u16string divider16;
if (insert_divider && !out_display_names.empty()) {
// Insert a divider if requested, but only if
// `most_relevant_locales_display_names` is not empty.
@@ -266,7 +263,7 @@ std::unique_ptr<base::ListValue> GetLanguageList(
std::unique_ptr<base::ListValue> language_list(new base::ListValue());
for (size_t i = 0; i < out_display_names.size(); ++i) {
// Sets the directionality of the display language name.
- base::string16 display_name(out_display_names[i]);
+ std::u16string display_name(out_display_names[i]);
if (insert_divider && display_name == divider16) {
// Insert divider.
auto dictionary = std::make_unique<base::DictionaryValue>();
@@ -442,9 +439,9 @@ void ResolveUILanguageList(
std::unique_ptr<base::ListValue> GetMinimalUILanguageList() {
const std::string application_locale =
g_browser_process->GetApplicationLocale();
- base::string16 language_native_display_name =
- l10n_util::GetDisplayNameForLocale(
- application_locale, application_locale, true);
+ std::u16string language_native_display_name =
+ l10n_util::GetDisplayNameForLocale(application_locale, application_locale,
+ true);
std::unique_ptr<base::ListValue> language_list(new base::ListValue());
language_list->Append(CreateLanguageEntry(application_locale,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.h b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.h
index f85f931e96f..8a309d4fdea 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.h
@@ -10,8 +10,7 @@
#include <vector>
#include "base/callback.h"
-#include "base/strings/string16.h"
-#include "chrome/browser/chromeos/base/locale_util.h"
+#include "chrome/browser/ash/base/locale_util.h"
namespace base {
class ListValue;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
index 16b7d10372d..7d874c2277b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
@@ -9,7 +9,7 @@
#include "base/values.h"
#include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/ash/login/screens/network_screen.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/ash/login/startup_utils.h"
#include "chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
@@ -72,7 +72,7 @@ void NetworkScreenHandler::Unbind() {
BaseScreenHandler::SetBaseScreen(nullptr);
}
-void NetworkScreenHandler::ShowError(const base::string16& message) {
+void NetworkScreenHandler::ShowError(const std::u16string& message) {
CallJS("login.NetworkScreen.showError", message);
}
@@ -83,7 +83,7 @@ void NetworkScreenHandler::ClearErrors() {
void NetworkScreenHandler::ShowConnectingStatus(
bool connecting,
- const base::string16& network_id) {}
+ const std::u16string& network_id) {}
void NetworkScreenHandler::SetOfflineDemoModeEnabled(bool enabled) {
CallJS("login.NetworkScreen.setOfflineDemoModeEnabled", enabled);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
index 0ece2cd776e..7820432b868 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
@@ -5,8 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_NETWORK_SCREEN_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_NETWORK_SCREEN_HANDLER_H_
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
namespace chromeos {
@@ -34,14 +35,14 @@ class NetworkScreenView {
virtual void Unbind() = 0;
// Shows error message in a bubble.
- virtual void ShowError(const base::string16& message) = 0;
+ virtual void ShowError(const std::u16string& message) = 0;
// Hides error messages showing no error state.
virtual void ClearErrors() = 0;
// Shows network connecting status or network selection otherwise.
virtual void ShowConnectingStatus(bool connecting,
- const base::string16& network_id) = 0;
+ const std::u16string& network_id) = 0;
// Enables or disables offline Demo Mode during Demo Mode network selection.
virtual void SetOfflineDemoModeEnabled(bool enabled) = 0;
@@ -64,10 +65,10 @@ class NetworkScreenHandler : public NetworkScreenView,
void Hide() override;
void Bind(NetworkScreen* screen) override;
void Unbind() override;
- void ShowError(const base::string16& message) override;
+ void ShowError(const std::u16string& message) override;
void ClearErrors() override;
void ShowConnectingStatus(bool connecting,
- const base::string16& network_id) override;
+ const std::u16string& network_id) override;
void SetOfflineDemoModeEnabled(bool enabled) override;
// BaseScreenHandler:
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.h b/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.h
index 7eff618a214..61e2a0efb62 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.h
@@ -15,7 +15,7 @@
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/ash/login/screens/network_error.h"
-#include "chrome/browser/chromeos/login/ui/captive_portal_window_proxy.h"
+#include "chrome/browser/ash/login/ui/captive_portal_window_proxy.h"
#include "chromeos/network/network_state_handler_observer.h"
#include "chromeos/network/portal_detector/network_portal_detector.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc b/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc
index 7402f822d68..032344632d7 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc
@@ -4,10 +4,10 @@
#include "chrome/browser/ui/webui/chromeos/login/online_login_helper.h"
+#include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/ui/login_display_host_webui.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/signin_partition_manager.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/generated_resources.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.h b/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.h
index 4e00635cf93..f62f6139423 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/online_login_helper.h
@@ -8,9 +8,9 @@
#include <string>
#include "base/optional.h"
-#include "chrome/browser/chromeos/login/login_client_cert_usage_observer.h"
-#include "chrome/browser/chromeos/login/signin_partition_manager.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/login_client_cert_usage_observer.h"
+#include "chrome/browser/ash/login/signin_partition_manager.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
#include "chrome/browser/extensions/api/cookies/cookies_api.h"
#include "chromeos/login/auth/cryptohome_authenticator.h"
#include "components/login/base_screen_handler_utils.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
index 191064c03c7..09c39f1f812 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
@@ -7,7 +7,7 @@
#include "ash/constants/ash_switches.h"
#include "ash/shell.h"
#include "base/run_loop.h"
-#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
+#include "chrome/browser/ash/login/test/oobe_base_test.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "content/public/test/browser_test.h"
#include "ui/display/display.h"
@@ -47,8 +47,9 @@ int64_t GetPrimaryDisplayId() {
// Test that display removal does not trigger CHECK in
// WindowTreeHostManager::GetPrimaryDisplayId().
+// TODO(crbug.com/1183020): Align with RWHI::GetVisualProperties and re-enable.
IN_PROC_BROWSER_TEST_F(OobeDisplayChooserTest,
- RemovingPrimaryDisplaySanityCheck) {
+ DISABLED_RemovingPrimaryDisplaySanityCheck) {
display::ManagedDisplayInfo info1(1, "x-1", false);
info1.SetBounds(gfx::Rect(0, 0, 1280, 800));
display::ManagedDisplayInfo info2(2, "x-2", false);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 66f1bac3cd9..118201037a6 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -12,6 +12,7 @@
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_switches.h"
+#include "ash/public/cpp/esim_manager.h"
#include "ash/public/cpp/network_config_service.h"
#include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
#include "base/bind.h"
@@ -27,11 +28,11 @@
#include "chrome/browser/ash/login/enrollment/enrollment_screen_view.h"
#include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h"
#include "chrome/browser/ash/login/screens/error_screen.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/ash/system/input_device_settings.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_service_factory.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
@@ -80,6 +81,7 @@
#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
@@ -103,6 +105,8 @@
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/chrome_unscaled_resources.h"
#include "chrome/grit/component_extension_resources.h"
+#include "chrome/grit/oobe_resources.h"
+#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h"
#include "chromeos/services/multidevice_setup/multidevice_setup_service.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" // nogncheck
#include "components/policy/core/common/cloud/cloud_policy_constants.h"
@@ -143,11 +147,16 @@ constexpr char kKeyboardUtilsJSPath[] = "keyboard_utils.js";
constexpr char kLoginJSPath[] = "login.js";
constexpr char kOobeJSPath[] = "oobe.js";
constexpr char kProductLogoPath[] = "product-logo.png";
-constexpr char kRecommendAppListViewHTMLPath[] = "recommend_app_list_view.html";
constexpr char kRecommendAppListViewJSPath[] = "recommend_app_list_view.js";
constexpr char kTestAPIJSPath[] = "test_api.js";
constexpr char kWebviewSamlInjectedJSPath[] = "webview_saml_injected.js";
+// Public
+constexpr char kLoginScreenBehaviorHTML[] = "components/login_screen_behavior.html";
+constexpr char kLoginScreenBehaviorJS[] = "components/login_screen_behavior.js";
+constexpr char kMultiStepBehaviorHTML[] = "components/multi_step_behavior.html";
+constexpr char kMultiStepBehaviorJS[] = "components/multi_step_behavior.js";
+
// Components
constexpr char kOobeSharedVarsCssHTML[] =
"components/oobe_shared_vars_css.html";
@@ -228,8 +237,6 @@ void AddArcScreensResources(content::WebUIDataSource* source) {
source->AddResourcePath(kRecommendAppListViewJSPath,
IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_JS);
- source->AddResourcePath(kRecommendAppListViewHTMLPath,
- IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML);
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
source->AddResourcePath(kArcAppDownloadingVideoPath,
IDR_OOBE_ARC_APPS_DOWNLOADING_VIDEO);
@@ -265,43 +272,6 @@ void AddMarketingOptInResources(content::WebUIDataSource* source) {
network::mojom::CSPDirectiveName::WorkerSrc, "worker-src blob: 'self';");
}
-void AddFingerprintResources(content::WebUIDataSource* source) {
- int animation_id;
- bool is_lottie_animation = false;
- switch (quick_unlock::GetFingerprintLocation()) {
- case quick_unlock::FingerprintLocation::TABLET_POWER_BUTTON:
- is_lottie_animation = true;
- animation_id = IDR_LOGIN_FINGER_PRINT_TABLET_ANIMATION;
- break;
- case quick_unlock::FingerprintLocation::KEYBOARD_BOTTOM_LEFT:
- animation_id = IDR_LOGIN_FINGERPRINT_SCANNER_LAPTOP_BOTTOM_LEFT_ANIMATION;
- break;
- case quick_unlock::FingerprintLocation::KEYBOARD_BOTTOM_RIGHT:
- animation_id =
- IDR_LOGIN_FINGERPRINT_SCANNER_LAPTOP_BOTTOM_RIGHT_ANIMATION;
- break;
- case quick_unlock::FingerprintLocation::KEYBOARD_TOP_RIGHT:
- animation_id = IDR_LOGIN_FINGERPRINT_SCANNER_LAPTOP_TOP_RIGHT_ANIMATION;
- break;
- }
- if (is_lottie_animation) {
- source->AddResourcePath("fingerprint_scanner_animation.json", animation_id);
-
- // To use lottie, the worker-src CSP needs to be updated for the web ui that
- // is using it. Since as of now there are only a couple of webuis using
- // lottie animations, this update has to be performed manually. As the usage
- // increases, set this as the default so manual override is no longer
- // required.
- source->OverrideContentSecurityPolicy(
- network::mojom::CSPDirectiveName::WorkerSrc,
- "worker-src blob: 'self';");
- } else {
- source->AddResourcePath("fingerprint_scanner_animation.png", animation_id);
- }
-
- source->AddBoolean("useLottieAnimationForFingerprint", is_lottie_animation);
-}
-
void AddMultiDeviceSetupResources(content::WebUIDataSource* source) {
source->AddResourcePath("multidevice_setup.json",
IDR_MULTIDEVICE_SETUP_ANIMATION);
@@ -387,7 +357,7 @@ content::WebUIDataSource* CreateOobeUIDataSource(
// Configure shared resources
AddProductLogoResources(source);
- AddFingerprintResources(source);
+ chromeos::quick_unlock::AddFingerprintResources(source);
AddSyncConsentResources(source);
AddArcScreensResources(source);
AddAssistantScreensResources(source);
@@ -552,6 +522,9 @@ void OobeUI::ConfigureOobeDisplay() {
signin_screen_handler_ = signin_screen_handler.get();
AddWebUIHandler(std::move(signin_screen_handler));
+ AddWebUIHandler(
+ std::make_unique<SshConfiguredHandler>(js_calls_container_.get()));
+
AddScreenHandler(std::make_unique<AppLaunchSplashScreenHandler>(
js_calls_container_.get(), network_state_informer_, error_screen));
@@ -635,6 +608,11 @@ void OobeUI::BindInterface(
ash::GetNetworkConfigService(std::move(receiver));
}
+void OobeUI::BindInterface(
+ mojo::PendingReceiver<cellular_setup::mojom::ESimManager> receiver) {
+ ash::GetESimManager(std::move(receiver));
+}
+
OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
: ui::MojoWebUIController(web_ui, true /* enable_chrome_send */) {
display_type_ = GetDisplayType(url);
@@ -691,6 +669,15 @@ OobeUI::~OobeUI() {
void OobeUI::AddOobeComponents(content::WebUIDataSource* source,
const base::DictionaryValue& localized_strings) {
+ source->AddResourcePath(kLoginScreenBehaviorHTML,
+ IDR_OOBE_COMPONENTS_LOGIN_SCREEN_BEHAVIOR_HTML);
+ source->AddResourcePath(kLoginScreenBehaviorJS,
+ IDR_OOBE_COMPONENTS_LOGIN_SCREEN_BEHAVIOR_JS);
+ source->AddResourcePath(kMultiStepBehaviorHTML,
+ IDR_OOBE_COMPONENTS_MULTI_STEP_BEHAVIOR_HTML);
+ source->AddResourcePath(kMultiStepBehaviorJS,
+ IDR_OOBE_COMPONENTS_MULTI_STEP_BEHAVIOR_JS);
+
source->AddResourcePath(kI18nBehaviorHTML,
IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_HTML);
source->AddResourcePath(kI18nBehaviorJS,
@@ -752,6 +739,7 @@ void OobeUI::AddOobeComponents(content::WebUIDataSource* source,
source->AddResourcePath("welcome_screen_animation.json",
IDR_LOGIN_WELCOME_SCREEN_ANIMATION);
+ source->AddResourcePath("spinner.json", IDR_LOGIN_SPINNER_ANIMATION);
source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::WorkerSrc,
"worker-src blob: 'self';");
@@ -872,16 +860,6 @@ void OobeUI::ShowOobeUI(bool show) {
}
void OobeUI::ShowSigninScreen(SigninScreenHandlerDelegate* delegate) {
- // Check our device mode.
- policy::BrowserPolicyConnectorChromeOS* connector =
- g_browser_process->platform_part()->browser_policy_connector_chromeos();
- if (connector->GetDeviceMode() == policy::DEVICE_MODE_LEGACY_RETAIL_MODE) {
- // If we're in legacy retail mode, the best thing we can do is launch the
- // new offline demo mode.
- LoginDisplayHost::default_host()->StartDemoAppLaunch();
- return;
- }
-
signin_screen_handler_->SetDelegate(delegate);
signin_screen_handler_->Show(core_handler_->show_oobe_ui());
@@ -920,6 +898,11 @@ void OobeUI::SetLoginUserCount(int user_count) {
core_handler_->SetLoginUserCount(user_count);
}
+void OobeUI::OnSystemTrayBubbleShown() {
+ if (current_screen_ == WelcomeView::kScreenId)
+ GetHandler<WelcomeScreenHandler>()->CancelChromeVoxHintIdleDetection();
+}
+
WEB_UI_CONTROLLER_TYPE_IMPL(OobeUI)
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
index 79ef6ec761b..6fe9eac2c9a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -14,9 +14,10 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
+#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h"
#include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom-forward.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h" // nogncheck
#include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -123,6 +124,8 @@ class OobeUI : public ui::MojoWebUIController {
// Notify WebUI of the user count on the views login screen.
void SetLoginUserCount(int user_count);
+ void OnSystemTrayBubbleShown();
+
// Find a *View instance provided by a given *Handler type.
//
// This is the same as GetHandler() except the return type is limited to the
@@ -161,6 +164,11 @@ class OobeUI : public ui::MojoWebUIController {
mojo::PendingReceiver<chromeos::network_config::mojom::CrosNetworkConfig>
receiver);
+ // Instantiates implementor of the mojom::ESimManager mojo interface
+ // passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<cellular_setup::mojom::ESimManager> receiver);
+
static void AddOobeComponents(content::WebUIDataSource* source,
const base::DictionaryValue& localized_strings);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.cc
index 190aa4ce0a6..f9fbd73fe5b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.cc
@@ -45,7 +45,7 @@ void ParentalHandoffScreenHandler::DeclareLocalizedValues(
void ParentalHandoffScreenHandler::Initialize() {}
-void ParentalHandoffScreenHandler::Show(const base::string16& username) {
+void ParentalHandoffScreenHandler::Show(const std::u16string& username) {
base::DictionaryValue data;
data.SetString(kUsername, username);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.h
index 498ea0f493e..9761ff9fbfc 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/parental_handoff_screen_handler.h
@@ -5,7 +5,8 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_PARENTAL_HANDOFF_SCREEN_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_PARENTAL_HANDOFF_SCREEN_HANDLER_H_
-#include "base/strings/string16.h"
+#include <string>
+
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
namespace login {
@@ -26,7 +27,7 @@ class ParentalHandoffScreenView {
virtual ~ParentalHandoffScreenView() = default;
// Shows the contents of the screen.
- virtual void Show(const base::string16& username) = 0;
+ virtual void Show(const std::u16string& username) = 0;
// Binds |screen| to the view.
virtual void Bind(ParentalHandoffScreen* screen) = 0;
@@ -53,7 +54,7 @@ class ParentalHandoffScreenHandler : public BaseScreenHandler,
void Initialize() override;
// Shows the contents of the screen.
- void Show(const base::string16& username) override;
+ void Show(const std::u16string& username) override;
void Bind(ParentalHandoffScreen* screen) override;
void Unbind() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.cc
index 3ea3bd0afe5..031a009ef5a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.cc
@@ -85,6 +85,13 @@ void PinSetupScreenHandler::Show(const std::string& token) {
}
void PinSetupScreenHandler::SetLoginSupportAvailable(bool available) {
+ // TODO(crbug.com/1180291) - Remove once OOBE JS calls are fixed.
+ if (!IsSafeToCallJavascript()) {
+ LOG(ERROR)
+ << "Silently dropping login.PinSetupScreen.setHasLoginSupport request.";
+ return;
+ }
+
CallJS("login.PinSetupScreen.setHasLoginSupport", available);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index 66401258fc4..170ff758545 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -4,9 +4,10 @@
#include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
+#include "ash/constants/ash_features.h"
#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/ash/login/screens/recommend_apps_screen.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/app_list/arc/arc_fast_app_reinstall_starter.h"
@@ -84,13 +85,23 @@ RecommendAppsScreenHandler::~RecommendAppsScreenHandler() {
void RecommendAppsScreenHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {
- builder->Add("recommendAppsScreenTitle",
- IDS_LOGIN_RECOMMEND_APPS_SCREEN_TITLE);
- builder->Add("recommendAppsScreenDescription",
- IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION);
- builder->Add("recommendAppsSkip", IDS_LOGIN_RECOMMEND_APPS_SKIP);
- builder->Add("recommendAppsInstall", IDS_LOGIN_RECOMMEND_APPS_INSTALL);
+ if (features::IsNewOobeLayoutEnabled()) {
+ builder->Add("recommendAppsScreenTitle",
+ IDS_LOGIN_RECOMMEND_APPS_SCREEN_TITLE_NEW);
+ builder->Add("recommendAppsScreenDescription",
+ IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_NEW);
+ builder->Add("recommendAppsSkip", IDS_LOGIN_RECOMMEND_APPS_DO_IT_LATER);
+ builder->Add("recommendAppsInstall", IDS_LOGIN_RECOMMEND_APPS_DONE);
+ } else {
+ builder->Add("recommendAppsScreenTitle",
+ IDS_LOGIN_RECOMMEND_APPS_SCREEN_TITLE);
+ builder->Add("recommendAppsScreenDescription",
+ IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION);
+ builder->Add("recommendAppsSkip", IDS_LOGIN_RECOMMEND_APPS_SKIP);
+ builder->Add("recommendAppsInstall", IDS_LOGIN_RECOMMEND_APPS_INSTALL);
+ }
builder->Add("recommendAppsLoading", IDS_LOGIN_RECOMMEND_APPS_SCREEN_LOADING);
+ builder->Add("recommendAppsSelectAll", IDS_LOGIN_RECOMMEND_APPS_SELECT_ALL);
}
void RecommendAppsScreenHandler::RegisterMessages() {
@@ -139,8 +150,12 @@ void RecommendAppsScreenHandler::LoadAppListInUI(const base::Value& app_list) {
RecordUmaScreenState(RecommendAppsScreenState::SHOW);
const ui::ResourceBundle& resource_bundle =
ui::ResourceBundle::GetSharedInstance();
- std::string app_list_webview = resource_bundle.LoadDataResourceString(
- IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML);
+ std::string app_list_webview =
+ features::IsNewOobeLayoutEnabled()
+ ? resource_bundle.LoadDataResourceString(
+ IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_NEW_HTML)
+ : resource_bundle.LoadDataResourceString(
+ IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML);
CallJS("login.RecommendAppsScreen.setWebview", app_list_webview);
CallJS("login.RecommendAppsScreen.loadAppList", app_list);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
index 7e5f63d76f6..7560b08d699 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
@@ -7,10 +7,10 @@
#include <string>
#include "base/values.h"
+#include "chrome/browser/ash/login/help_app_launcher.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/reset_screen.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/session_manager/session_manager_client.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
index b44ce664bdd..6d11883f6b4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
@@ -9,8 +9,8 @@
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/values.h"
+#include "chrome/browser/ash/attestation/tpm_challenge_key_result.h"
#include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/chromeos/attestation/tpm_challenge_key_result.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/login/login_state/login_state.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.h
index 6e5b6c5bcd2..cb52b6418fd 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.h
@@ -12,7 +12,7 @@
#include "base/callback_helpers.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
-#include "chrome/browser/chromeos/attestation/tpm_challenge_key_with_timeout.h"
+#include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.cc
deleted file mode 100644
index 5f9d5b20dad..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h"
-
-namespace chromeos {
-
-ScreenlockIconProvider::ScreenlockIconProvider() {}
-
-ScreenlockIconProvider::~ScreenlockIconProvider() {}
-
-void ScreenlockIconProvider::AddIcon(const std::string& username,
- const gfx::Image& icon) {
- user_icon_map_[username] = icon;
-}
-
-void ScreenlockIconProvider::RemoveIcon(const std::string& username) {
- if (user_icon_map_.find(username) != user_icon_map_.end())
- user_icon_map_.erase(username);
-}
-
-gfx::Image ScreenlockIconProvider::GetIcon(const std::string& username) {
- if (user_icon_map_.find(username) == user_icon_map_.end())
- return gfx::Image();
- return user_icon_map_[username];
-}
-
-void ScreenlockIconProvider::Clear() {
- user_icon_map_.clear();
-}
-
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h b/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h
deleted file mode 100644
index d72da3088dc..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_PROVIDER_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_PROVIDER_H_
-
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "ui/gfx/image/image.h"
-
-namespace chromeos {
-
-// Stores icon images used by the screenlockPrivate API. This class is
-// separate from ScreenlockIconSource for finer memory management.
-class ScreenlockIconProvider
- : public base::SupportsWeakPtr<ScreenlockIconProvider> {
- public:
- ScreenlockIconProvider();
- ~ScreenlockIconProvider();
-
- // Adds an icon image for `username` to be stored.
- void AddIcon(const std::string& username, const gfx::Image& icon);
-
- // Removes icon image for `username`.
- void RemoveIcon(const std::string& username);
-
- // Returns the icon image set for `username`. If no icon is found, then
- // this function returns an empty image.
- gfx::Image GetIcon(const std::string& username);
-
- // Removes all stored icon images.
- void Clear();
-
- private:
- // Map of icons for the user pod buttons set by screenlockPrivate.showButton.
- std::map<std::string, gfx::Image> user_icon_map_;
-
- DISALLOW_COPY_AND_ASSIGN(ScreenlockIconProvider);
-};
-
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_PROVIDER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.cc b/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.cc
deleted file mode 100644
index cd60f58de95..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.h"
-
-#include "chrome/browser/ash/login/lock/screen_locker.h"
-#include "chrome/browser/ui/webui/chromeos/login/screenlock_icon_provider.h"
-#include "chrome/common/url_constants.h"
-#include "net/base/escape.h"
-
-namespace {
-
-gfx::Image GetDefaultIcon() {
- return gfx::Image();
-}
-
-} // namespace
-
-namespace chromeos {
-
-////////////////////////////////////////////////////////////////////////////////
-// ScreenlockIconSource
-
-ScreenlockIconSource::ScreenlockIconSource(
- base::WeakPtr<ScreenlockIconProvider> icon_provider)
- : icon_provider_(icon_provider) {
-}
-
-ScreenlockIconSource::~ScreenlockIconSource() {}
-
-std::string ScreenlockIconSource::GetSource() const {
- return std::string(chrome::kChromeUIScreenlockIconHost);
-}
-
-void ScreenlockIconSource::StartDataRequest(
- const GURL& url,
- const content::WebContents::Getter& wc_getter,
- content::URLDataSource::GotDataCallback callback) {
- if (!icon_provider_) {
- std::move(callback).Run(GetDefaultIcon().As1xPNGBytes().get());
- return;
- }
-
- // TODO(crbug/1009127): Make sure `url` matches
- // `chrome::kChromeUIScreenlockIconURL` now that `url` is available.
- std::string username =
- net::UnescapeBinaryURLComponent(url.path_piece().substr(1));
-
- gfx::Image image = icon_provider_->GetIcon(username);
- if (image.IsEmpty()) {
- std::move(callback).Run(GetDefaultIcon().As1xPNGBytes().get());
- return;
- }
-
- std::move(callback).Run(image.As1xPNGBytes().get());
-}
-
-std::string ScreenlockIconSource::GetMimeType(const std::string&) const {
- return "image/png";
-}
-
-// static.
-std::string ScreenlockIconSource::GetIconURLForUser(
- const std::string& username) {
- return std::string(chrome::kChromeUIScreenlockIconURL) +
- net::EscapePath(username);
-}
-
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.h b/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.h
deleted file mode 100644
index b0a8d437f91..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/screenlock_icon_source.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_SOURCE_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_SOURCE_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "content/public/browser/url_data_source.h"
-
-namespace chromeos {
-
-class ScreenlockIconProvider;
-
-// A URL data source that serves icon images for the screenlockPrivate API.
-class ScreenlockIconSource : public content::URLDataSource {
- public:
- explicit ScreenlockIconSource(
- base::WeakPtr<ScreenlockIconProvider> icon_provider);
- ~ScreenlockIconSource() override;
-
- // content::URLDataSource implementation.
- std::string GetSource() const override;
- void StartDataRequest(
- const GURL& url,
- const content::WebContents::Getter& wc_getter,
- content::URLDataSource::GotDataCallback callback) override;
-
- std::string GetMimeType(const std::string& path) const override;
-
- // Constructs and returns the icon URL for a given user.
- static std::string GetIconURLForUser(const std::string& username);
-
- private:
- base::WeakPtr<ScreenlockIconProvider> icon_provider_;
-
- DISALLOW_COPY_AND_ASSIGN(ScreenlockIconSource);
-};
-
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SCREENLOCK_ICON_SOURCE_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.cc
index 06fdba60f0d..698b17b83ec 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.cc
@@ -7,8 +7,8 @@
#include <string>
#include "base/values.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index d0b9880c1f7..1738336d8d5 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -7,6 +7,7 @@
#include <stddef.h>
#include <algorithm>
+#include <string>
#include <utility>
#include <vector>
@@ -19,7 +20,6 @@
#include "base/macros.h"
#include "base/metrics/histogram_macros.h"
#include "base/single_thread_task_runner.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -30,27 +30,27 @@
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
#include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h"
+#include "chrome/browser/ash/login/error_screens_histogram_helper.h"
+#include "chrome/browser/ash/login/help_app_launcher.h"
+#include "chrome/browser/ash/login/hwid_checker.h"
#include "chrome/browser/ash/login/lock/screen_locker.h"
+#include "chrome/browser/ash/login/lock_screen_utils.h"
+#include "chrome/browser/ash/login/reauth_stats.h"
#include "chrome/browser/ash/login/screens/gaia_screen.h"
#include "chrome/browser/ash/login/screens/network_error.h"
+#include "chrome/browser/ash/login/startup_utils.h"
+#include "chrome/browser/ash/login/ui/login_display_host.h"
+#include "chrome/browser/ash/login/ui/login_display_host_webui.h"
+#include "chrome/browser/ash/login/ui/login_display_webui.h"
+#include "chrome/browser/ash/login/users/chrome_user_manager_util.h"
+#include "chrome/browser/ash/login/users/multi_profile_user_controller.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/ash/system/system_clock.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part_chromeos.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/language_preferences.h"
-#include "chrome/browser/chromeos/login/error_screens_histogram_helper.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/login/hwid_checker.h"
-#include "chrome/browser/chromeos/login/lock_screen_utils.h"
-#include "chrome/browser/chromeos/login/reauth_stats.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
-#include "chrome/browser/chromeos/login/ui/login_display_webui.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager_util.h"
-#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/policy/device_local_account.h"
#include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
@@ -304,15 +304,15 @@ void SigninScreenHandler::DeclareLocalizedValues(
IDS_LOGIN_PUBLIC_ACCOUNT_MONITORING_INFO_ITEM_4);
builder->Add("publicSessionSelectLanguage", IDS_LANGUAGE_SELECTION_SELECT);
builder->Add("publicSessionSelectKeyboard", IDS_KEYBOARD_SELECTION_SELECT);
- builder->Add("removeUserWarningTextNonSyncNoStats", base::string16());
- builder->Add("removeUserWarningTextNonSyncCalculating", base::string16());
- builder->Add("removeUserWarningTextHistory", base::string16());
- builder->Add("removeUserWarningTextPasswords", base::string16());
- builder->Add("removeUserWarningTextBookmarks", base::string16());
- builder->Add("removeUserWarningTextAutofill", base::string16());
- builder->Add("removeUserWarningTextCalculating", base::string16());
- builder->Add("removeUserWarningTextSyncNoStats", base::string16());
- builder->Add("removeUserWarningTextSyncCalculating", base::string16());
+ builder->Add("removeUserWarningTextNonSyncNoStats", std::u16string());
+ builder->Add("removeUserWarningTextNonSyncCalculating", std::u16string());
+ builder->Add("removeUserWarningTextHistory", std::u16string());
+ builder->Add("removeUserWarningTextPasswords", std::u16string());
+ builder->Add("removeUserWarningTextBookmarks", std::u16string());
+ builder->Add("removeUserWarningTextAutofill", std::u16string());
+ builder->Add("removeUserWarningTextCalculating", std::u16string());
+ builder->Add("removeUserWarningTextSyncNoStats", std::u16string());
+ builder->Add("removeUserWarningTextSyncCalculating", std::u16string());
builder->Add("removeNonOwnerUserWarningText",
IDS_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING);
builder->Add("removeUserWarningButtonTitle",
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index f61d4fb49d5..f42750225c7 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -16,8 +16,8 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/login/screens/error_screen.h"
-#include "chrome/browser/chromeos/login/signin_specifics.h"
-#include "chrome/browser/chromeos/login/ui/login_display.h"
+#include "chrome/browser/ash/login/signin_specifics.h"
+#include "chrome/browser/ash/login/ui/login_display.h"
#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc b/chromium/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
index 57d2d696a51..5899c04c056 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
@@ -9,10 +9,10 @@
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/ash/login/screens/user_selection_screen.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/multi_profile_user_controller.h"
+#include "chrome/browser/ash/login/users/multi_profile_user_controller_delegate.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
-#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
-#include "chrome/browser/chromeos/login/users/multi_profile_user_controller_delegate.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "chromeos/components/proximity_auth/screenlock_bridge.h"
@@ -22,8 +22,13 @@
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
+namespace chromeos {
namespace {
+// TODO(https://crbug.com/1164001): remove once this file is migrated.
+using ::ash::MultiProfileUserController;
+using ::ash::MultiProfileUserControllerDelegate;
+
const size_t kMaxUsers = 50; // same as in user_selection_screen.cc
const char* kOwner = "owner@gmail.com";
const char* kUsersPublic[] = {"public0@gmail.com", "public1@gmail.com"};
@@ -34,8 +39,6 @@ std::string GenerateUserEmail(int number) {
} // namespace
-namespace chromeos {
-
class SigninPrepareUserListTest : public testing::Test,
public MultiProfileUserControllerDelegate {
public:
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.cc
new file mode 100644
index 00000000000..7d702da5ad1
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.cc
@@ -0,0 +1,100 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h"
+
+#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/js_calls_container.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
+#include "components/login/localized_values_builder.h"
+#include "third_party/cros_system_api/dbus/debugd/dbus-constants.h"
+
+namespace chromeos {
+
+namespace {
+
+void OnDebugServiceAvailable(
+ DebugDaemonClient::QueryDevFeaturesCallback callback,
+ bool service_is_available) {
+ if (!service_is_available) {
+ std::move(callback).Run(/*succeeded=*/false,
+ debugd::DevFeatureFlag::DEV_FEATURES_DISABLED);
+ return;
+ }
+ chromeos::DebugDaemonClient* client =
+ chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
+ client->QueryDebuggingFeatures(std::move(callback));
+}
+
+void QueryDebuggingFeatures(
+ DebugDaemonClient::QueryDevFeaturesCallback callback) {
+ chromeos::DebugDaemonClient* client =
+ chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
+ client->WaitForServiceToBeAvailable(
+ base::BindOnce(&OnDebugServiceAvailable, std::move(callback)));
+}
+
+} // namespace
+
+SshConfiguredHandler::SshConfiguredHandler(JSCallsContainer* js_calls_container)
+ : BaseWebUIHandler(js_calls_container) {}
+
+SshConfiguredHandler::~SshConfiguredHandler() = default;
+
+void SshConfiguredHandler::DeclareJSCallbacks() {
+ AddCallback("getIsSshConfigured",
+ &SshConfiguredHandler::HandleGetIsSshConfigured);
+}
+
+void SshConfiguredHandler::DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) {
+ builder->Add("sshWarningLogin", IDS_LOGIN_SSH_WARNING);
+}
+
+void SshConfiguredHandler::Initialize() {}
+
+void SshConfiguredHandler::HandleGetIsSshConfigured(
+ const std::string& callback_id) {
+ AllowJavascript();
+ callback_ids_.push_back(callback_id);
+
+ if (is_ssh_configured_.has_value()) {
+ ResolveCallbacks();
+ return;
+ }
+
+ if (weak_factory_.HasWeakPtrs()) {
+ // Pending request.
+ return;
+ }
+
+ // Query for the debugging features.
+ QueryDebuggingFeatures(
+ base::BindOnce(&SshConfiguredHandler::OnGetDebuggingFeatures,
+ weak_factory_.GetWeakPtr()));
+}
+
+void SshConfiguredHandler::OnGetDebuggingFeatures(bool succeeded,
+ int feature_mask) {
+ is_ssh_configured_ =
+ succeeded && (feature_mask &
+ debugd::DevFeatureFlag::DEV_FEATURE_SSH_SERVER_CONFIGURED);
+ if (!IsJavascriptAllowed())
+ return;
+
+ ResolveCallbacks();
+}
+
+void SshConfiguredHandler::ResolveCallbacks() {
+ DCHECK(is_ssh_configured_.has_value());
+ for (const std::string& callback_id : callback_ids_) {
+ ResolveJavascriptCallback(base::Value(callback_id),
+ base::Value(is_ssh_configured_.value()));
+ }
+ callback_ids_.clear();
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h
new file mode 100644
index 00000000000..cc63d3dbc11
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/ssh_configured_handler.h
@@ -0,0 +1,47 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SSH_CONFIGURED_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SSH_CONFIGURED_HANDLER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
+
+namespace chromeos {
+
+class JSCallsContainer;
+
+// A class that handles getIsSshConfigured requests.
+class SshConfiguredHandler : public BaseWebUIHandler {
+ public:
+ explicit SshConfiguredHandler(JSCallsContainer* js_calls_container);
+ SshConfiguredHandler(const SshConfiguredHandler&) = delete;
+ SshConfiguredHandler& operator=(const SshConfiguredHandler&) = delete;
+
+ ~SshConfiguredHandler() override;
+
+ // BaseWebUIHandler:
+ void DeclareJSCallbacks() override;
+ void DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) override;
+ void Initialize() override;
+
+ private:
+ void HandleGetIsSshConfigured(const std::string& callback_id);
+ void OnGetDebuggingFeatures(bool succeeded, int feature_mask);
+ void ResolveCallbacks();
+
+ base::Optional<bool> is_ssh_configured_;
+ std::vector<std::string> callback_ids_;
+
+ base::WeakPtrFactory<SshConfiguredHandler> weak_factory_{this};
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SSH_CONFIGURED_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
index a8db5d3b4c8..f416604a6d1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
@@ -8,12 +8,12 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/supervision_transition_screen.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/login_screen_client.h"
#include "chrome/browser/ui/ash/system_tray_client.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
index def45bc8a6f..ec1e0a9f855 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -33,7 +33,7 @@ void GetConsentIDs(const std::unordered_set<int>& known_ids,
// characters, so we must use base::ReplaceSubstrings* rather than
// base::ReplaceChars.
// TODO(alemate): Find a more elegant solution.
- base::string16 raw_string = l10n_util::GetStringUTF16(id);
+ std::u16string raw_string = l10n_util::GetStringUTF16(id);
std::string sanitized_string = base::UTF16ToUTF8(raw_string);
base::ReplaceSubstringsAfterOffset(&sanitized_string, 0,
"\u00A0" /* NBSP */, "&nbsp;");
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
index 82a2e7bff86..2206972ec60 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
@@ -11,10 +11,10 @@
#include "base/callback_helpers.h"
#include "base/strings/string_split.h"
#include "base/values.h"
+#include "chrome/browser/ash/base/locale_util.h"
#include "chrome/browser/ash/login/screens/terms_of_service_screen.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/base/locale_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
index 900ef753bf8..10d263d70cb 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
@@ -9,7 +9,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "chrome/browser/chromeos/base/locale_util.h"
+#include "chrome/browser/ash/base/locale_util.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_browsertest.cc
index a359b4e0c8e..866a9ef55f3 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_browsertest.cc
@@ -4,8 +4,9 @@
#include "ash/constants/ash_switches.h"
#include "build/branding_buildflags.h"
-#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
-#include "chrome/browser/chromeos/login/test/test_condition_waiter.h"
+#include "chrome/browser/ash/login/test/hid_controller_mixin.h"
+#include "chrome/browser/ash/login/test/oobe_base_test.h"
+#include "chrome/browser/ash/login/test/test_condition_waiter.h"
#include "content/public/test/browser_test.h"
namespace chromeos {
@@ -41,6 +42,31 @@ IN_PROC_BROWSER_TEST_F(OobeTestApiTest, OobeAPI) {
#endif
}
+class OobeTestApiTestChromebox : public OobeTestApiTest {
+ public:
+ OobeTestApiTestChromebox() {
+ base::SysInfo::SetChromeOSVersionInfoForTest("DEVICETYPE=CHROMEBASE",
+ base::Time::Now());
+ }
+ ~OobeTestApiTestChromebox() override {}
+
+ protected:
+ test::HIDControllerMixin hid_controller_{&mixin_host_};
+};
+
+IN_PROC_BROWSER_TEST_F(OobeTestApiTestChromebox, HIDDetectionScreen) {
+ test::OobeJS().CreateWaiter("window.OobeAPI")->Wait();
+ test::OobeJS()
+ .CreateWaiter("OobeAPI.screens.HIDDetectionScreen.isVisible()")
+ ->Wait();
+ test::OobeJS().Evaluate(
+ "OobeAPI.screens.HIDDetectionScreen.emulateDevicesConnected()");
+ test::OobeJS()
+ .CreateWaiter("OobeAPI.screens.HIDDetectionScreen.isEnabled()")
+ ->Wait();
+ test::OobeJS().Evaluate("OobeAPI.screens.HIDDetectionScreen.clickNext()");
+}
+
class NoOobeTestApiTest : public OobeBaseTest {
public:
NoOobeTestApiTest() {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.cc
index 59ed5d33950..b98482fdf2f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.cc
@@ -5,8 +5,8 @@
#include "chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/tpm_error_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
index baa15c2bba7..7b11ac85c49 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
@@ -7,8 +7,8 @@
#include <memory>
#include "base/values.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/update_required_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
@@ -91,7 +91,7 @@ void UpdateRequiredScreenHandler::Initialize() {
void UpdateRequiredScreenHandler::SetEnterpriseAndDeviceName(
const std::string& enterpriseDomain,
- const base::string16& deviceName) {
+ const std::u16string& deviceName) {
CallJS("login.UpdateRequiredScreen.setEnterpriseAndDeviceName",
enterpriseDomain, deviceName);
}
@@ -135,7 +135,7 @@ void UpdateRequiredScreenHandler::SetUpdateProgressValue(int progress) {
}
void UpdateRequiredScreenHandler::SetUpdateProgressMessage(
- const base::string16& message) {
+ const std::u16string& message) {
CallJS("login.UpdateRequiredScreen.setUpdateProgressMessage", message);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
index 4876181939a..ece0e44e177 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
@@ -55,7 +55,7 @@ class UpdateRequiredView {
// Set progress percentage.
virtual void SetUpdateProgressValue(int progress) = 0;
// Set progress message (like "Verifying").
- virtual void SetUpdateProgressMessage(const base::string16& message) = 0;
+ virtual void SetUpdateProgressMessage(const std::u16string& message) = 0;
// Set the visibility of the estimated time left.
virtual void SetEstimatedTimeLeftVisible(bool visible) = 0;
// Set the estimated time left, in seconds.
@@ -64,7 +64,7 @@ class UpdateRequiredView {
virtual void SetUIState(UpdateRequiredView::UIState ui_state) = 0;
// Set enterprise and device name to be used in strings in the UI.
virtual void SetEnterpriseAndDeviceName(const std::string& enterpriseDomain,
- const base::string16& deviceName) = 0;
+ const std::u16string& deviceName) = 0;
virtual void SetEolMessage(const std::string& eolMessage) = 0;
virtual void SetIsUserDataPresent(bool deleted) = 0;
};
@@ -86,12 +86,12 @@ class UpdateRequiredScreenHandler : public UpdateRequiredView,
void SetIsConnected(bool connected) override;
void SetUpdateProgressUnavailable(bool unavailable) override;
void SetUpdateProgressValue(int progress) override;
- void SetUpdateProgressMessage(const base::string16& message) override;
+ void SetUpdateProgressMessage(const std::u16string& message) override;
void SetEstimatedTimeLeftVisible(bool visible) override;
void SetEstimatedTimeLeft(int seconds_left) override;
void SetUIState(UpdateRequiredView::UIState ui_state) override;
void SetEnterpriseAndDeviceName(const std::string& enterpriseDomain,
- const base::string16& deviceName) override;
+ const std::u16string& deviceName) override;
void SetEolMessage(const std::string& eolMessage) override;
void SetIsUserDataPresent(bool data_present) override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
index 1a37036cf4f..6f988ad8a79 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
@@ -9,8 +9,8 @@
#include "ash/constants/ash_features.h"
#include "base/values.h"
#include "build/branding_buildflags.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/update_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
@@ -93,8 +93,8 @@ void UpdateScreenHandler::SetUpdateState(UpdateView::UIState value) {
void UpdateScreenHandler::SetUpdateStatus(
int percent,
- const base::string16& percent_message,
- const base::string16& timeleft_message) {
+ const std::u16string& percent_message,
+ const std::u16string& timeleft_message) {
CallJS("login.UpdateScreen.setUpdateStatus", percent, percent_message,
timeleft_message);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
index 75e035d0d7e..8c9f5f03c46 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
@@ -50,8 +50,8 @@ class UpdateView {
virtual void SetUpdateState(UIState value) = 0;
virtual void SetUpdateStatus(int percent,
- const base::string16& percent_message,
- const base::string16& timeleft_message) = 0;
+ const std::u16string& percent_message,
+ const std::u16string& timeleft_message) = 0;
virtual void ShowLowBatteryWarningMessage(bool value) = 0;
virtual void SetAutoTransition(bool value) = 0;
virtual void SetCancelUpdateShortcutEnabled(bool value) = 0;
@@ -73,8 +73,8 @@ class UpdateScreenHandler : public UpdateView, public BaseScreenHandler {
void SetUpdateState(UpdateView::UIState value) override;
void SetUpdateStatus(int percent,
- const base::string16& percent_message,
- const base::string16& timeleft_message) override;
+ const std::u16string& percent_message,
+ const std::u16string& timeleft_message) override;
void ShowLowBatteryWarningMessage(bool value) override;
void SetAutoTransition(bool value) override;
void SetCancelUpdateShortcutEnabled(bool value) override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.cc
index 6e7c725553a..dfc7a61d59d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.cc
@@ -5,9 +5,9 @@
#include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h"
#include "base/values.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/user_creation_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/ash/login/startup_utils.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
@@ -47,9 +47,8 @@ void UserCreationScreenHandler::DeclareLocalizedValues(
IDS_OOBE_USER_CREATION_CHILD_BUTTON_DESCRIPTION);
builder->AddF("childSignInTitle", IDS_OOBE_USER_CREATION_CHILD_SIGNIN_TITLE,
ui::GetChromeOSDeviceName());
- builder->AddF("childSignInSubtitle",
- IDS_OOBE_USER_CREATION_CHILD_SIGNIN_SUBTITLE,
- ui::GetChromeOSDeviceNameInPlural());
+ builder->Add("childSignInSubtitle",
+ IDS_OOBE_USER_CREATION_CHILD_SIGNIN_SUBTITLE);
builder->Add("createAccountForChildLabel",
IDS_OOBE_USER_CREATION_CHILD_ACCOUNT_CREATION_BUTTON_LABEL);
builder->Add("signInForChildLabel",
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
index ce8f3aa1d20..c3344d9bd18 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
@@ -19,10 +19,10 @@
#include "chrome/browser/ash/accessibility/magnification_manager.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
#include "chrome/browser/ash/login/screens/welcome_screen.h"
+#include "chrome/browser/ash/login/ui/input_events_blocker.h"
#include "chrome/browser/ash/system/input_device_settings.h"
#include "chrome/browser/ash/system/timezone_util.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/ui/input_events_blocker.h"
#include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
@@ -208,6 +208,22 @@ void WelcomeScreenHandler::DeclareLocalizedValues(
IDS_OOBE_CHROMEVOX_HINT_ANNOUNCEMENT_TEXT_LAPTOP);
builder->Add("chromeVoxHintAnnouncementTextTablet",
IDS_OOBE_CHROMEVOX_HINT_ANNOUNCEMENT_TEXT_TABLET);
+
+ // Strings for the device requisition prompt.
+ builder->Add("deviceRequisitionPromptCancel",
+ IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_CANCEL);
+ builder->Add("deviceRequisitionPromptOk",
+ IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_OK);
+ builder->Add("deviceRequisitionPromptText",
+ IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_TEXT);
+ builder->Add("deviceRequisitionRemoraPromptCancel",
+ IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
+ builder->Add("deviceRequisitionRemoraPromptOk",
+ IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
+ builder->Add("deviceRequisitionRemoraPromptText",
+ IDS_ENTERPRISE_DEVICE_REQUISITION_REMORA_PROMPT_TEXT);
+ builder->Add("deviceRequisitionSharkPromptText",
+ IDS_ENTERPRISE_DEVICE_REQUISITION_SHARK_PROMPT_TEXT);
}
void WelcomeScreenHandler::DeclareJSCallbacks() {
@@ -318,6 +334,10 @@ void WelcomeScreenHandler::GiveChromeVoxHint() {
CallJS("login.WelcomeScreen.maybeGiveChromeVoxHint");
}
+void WelcomeScreenHandler::CancelChromeVoxHintIdleDetection() {
+ screen_->CancelChromeVoxHintIdleDetection();
+}
+
void WelcomeScreenHandler::HandleRecordChromeVoxHintSpokenSuccess() {
base::UmaHistogramBoolean("OOBE.WelcomeScreen.ChromeVoxHintSpokenSuccess",
true);
@@ -351,7 +371,7 @@ void WelcomeScreenHandler::UpdateA11yState() {
a11y_info.SetBoolean("virtualKeyboardEnabled",
AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
if (screen_ && AccessibilityManager::Get()->IsSpokenFeedbackEnabled())
- screen_->CancelChromeVoxHintTimer();
+ CancelChromeVoxHintIdleDetection();
CallJS("login.WelcomeScreen.refreshA11yInfo", a11y_info);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
index 6c2279ba45a..8f14c942eb4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
@@ -53,6 +53,7 @@ class WelcomeView {
// ChromeVox hint.
virtual void GiveChromeVoxHint() = 0;
+ virtual void CancelChromeVoxHintIdleDetection() = 0;
};
// WebUI implementation of WelcomeScreenView. It is used to interact with
@@ -76,6 +77,7 @@ class WelcomeScreenHandler : public WelcomeView, public BaseScreenHandler {
void ShowEditRequisitionDialog(const std::string& requisition) override;
void ShowRemoraRequisitionDialog() override;
void GiveChromeVoxHint() override;
+ void CancelChromeVoxHintIdleDetection() override;
// BaseScreenHandler:
void DeclareLocalizedValues(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
index 1689f7afcb3..af1e38f7365 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h"
+#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/wrong_hwid_screen.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_ui.cc
index fe60a5c19dd..8ed56d684ef 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_ui.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/dev_ui_browser_resources.h"
#include "content/public/browser/web_ui_data_source.h"
namespace chromeos {
@@ -57,6 +58,13 @@ MachineLearningInternalsUI::MachineLearningInternalsUI(
{IDR_MACHINE_LEARNING_INTERNALS_UTILS_JS,
"machine_learning_internals_utils.js"},
+
+ {IDR_MACHINE_LEARNING_INTERNALS_WEB_PLATFORM_HANDWRITING_MOJO_JS,
+ "chromeos/services/machine_learning/public/mojom/"
+ "web_platform_handwriting.mojom-lite.js"},
+
+ {IDR_UI_GEOMETRY_MOJOM_LITE_JS,
+ "ui/gfx/geometry/mojom/geometry.mojom-lite.js"},
};
for (const auto& path : resource_paths) {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
index f26c58b1330..992b7029945 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
@@ -61,7 +61,7 @@ const SkBitmap ImageTypeToBitmap(ImageType image_type_num, int size) {
phonehub::Notification::AppMetadata DictToAppMetadata(
const base::DictionaryValue* app_metadata_dict) {
- base::string16 visible_app_name;
+ std::u16string visible_app_name;
CHECK(app_metadata_dict->GetString("visibleAppName", &visible_app_name));
std::string package_name;
@@ -90,7 +90,7 @@ void TryAddingMetadata(
if (!browser_tab_metadata->GetString("url", &url) || url.empty())
return;
- base::string16 title;
+ std::u16string title;
if (!browser_tab_metadata->GetString("title", &title) || title.empty())
return;
@@ -352,7 +352,7 @@ void MultidevicePhoneHubHandler::HandleSetShowOnboardingFlow(
void MultidevicePhoneHubHandler::HandleSetFakePhoneName(
const base::ListValue* args) {
- base::string16 phone_name;
+ std::u16string phone_name;
CHECK(args->GetString(0, &phone_name));
fake_phone_hub_manager_->mutable_phone_model()->SetPhoneName(phone_name);
PA_LOG(VERBOSE) << "Set phone name to " << phone_name;
@@ -375,7 +375,7 @@ void MultidevicePhoneHubHandler::HandleSetFakePhoneStatus(
static_cast<phonehub::PhoneStatusModel::SignalStrength>(
signal_strength_as_int);
- base::string16 mobile_provider;
+ std::u16string mobile_provider;
CHECK(phones_status_dict->GetString("mobileProvider", &mobile_provider));
int charging_state_as_int;
@@ -476,14 +476,14 @@ void MultidevicePhoneHubHandler::HandleSetNotification(
int inline_reply_id;
CHECK(notification_data_dict->GetInteger("inlineReplyId", &inline_reply_id));
- base::Optional<base::string16> opt_title;
- base::string16 title;
+ base::Optional<std::u16string> opt_title;
+ std::u16string title;
if (notification_data_dict->GetString("title", &title) && !title.empty()) {
opt_title = title;
}
- base::Optional<base::string16> opt_text_content;
- base::string16 text_content;
+ base::Optional<std::u16string> opt_text_content;
+ std::u16string text_content;
if (notification_data_dict->GetString("textContent", &text_content) &&
!text_content.empty()) {
opt_text_content = text_content;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
index 98b2ab7eca7..12875a7b200 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
@@ -11,7 +11,7 @@
#include "base/bind.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
-#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h"
+#include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h"
#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -92,7 +92,7 @@ void MultiDeviceSetupDialog::AddOnCloseCallback(base::OnceClosure callback) {
}
MultiDeviceSetupDialog::MultiDeviceSetupDialog()
- : SystemWebDialogDelegate(CreateMultiDeviceSetupURL(), base::string16()) {}
+ : SystemWebDialogDelegate(CreateMultiDeviceSetupURL(), std::u16string()) {}
MultiDeviceSetupDialog::~MultiDeviceSetupDialog() {
for (auto& callback : on_close_callbacks_)
diff --git a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
index f0f69009431..e34fa34986e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
@@ -18,6 +18,7 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/multidevice_setup_resources.h"
#include "chrome/grit/multidevice_setup_resources_map.h"
+#include "chrome/grit/oobe_resources.h"
#include "chromeos/grit/chromeos_resources.h"
#include "chromeos/services/multidevice_setup/public/cpp/url_provider.h"
#include "components/login/localized_values_builder.h"
@@ -72,11 +73,11 @@ constexpr webui::LocalizedString kLocalizedStringsWithoutPlaceholders[] = {
struct LocalizedStringWithName {
LocalizedStringWithName(const char* name,
- const base::string16& localized_string)
+ const std::u16string& localized_string)
: name(name), localized_string(localized_string) {}
const char* name;
- base::string16 localized_string;
+ std::u16string localized_string;
};
const std::vector<LocalizedStringWithName>&
diff --git a/chromium/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
index a247bb838f0..7c8e11d5a6e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
+#include "ash/constants/ash_features.h"
#include "base/feature_list.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
@@ -91,9 +92,21 @@ constexpr webui::LocalizedString kElementLocalizedStrings[] = {
{"networkListItemNotAvailable", IDS_NETWORK_LIST_NOT_AVAILABLE},
{"networkListItemScanning", IDS_SETTINGS_INTERNET_MOBILE_SEARCH},
{"networkListItemSimCardLocked", IDS_NETWORK_LIST_SIM_CARD_LOCKED},
+ {"networkListItemUpdatedCellularSimCardLocked",
+ IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_LOCKED},
{"networkListItemNotConnected", IDS_NETWORK_LIST_NOT_CONNECTED},
{"networkListItemNoNetwork", IDS_NETWORK_LIST_NO_NETWORK},
+ {"networkListItemActivate", IDS_NETWORK_LIST_ITEM_ACTIVATE},
+ {"networkListItemActivateA11yLabel",
+ IDS_NETWORK_LIST_ITEM_ACTIVATE_A11Y_LABEL},
+ {"networkListItemActivating", IDS_NETWORK_LIST_ITEM_ACTIVATING},
+ {"networkListItemUnavailableSimNetwork",
+ IDS_NETWORK_LIST_ITEM_UNAVAILABLE_SIM_NETWORK},
{"networkListItemDownload", IDS_NETWORK_LIST_ITEM_DOWNLOAD},
+ {"networkListItemDownloadA11yLabel",
+ IDS_NETWORK_LIST_ITEM_DOWNLOAD_A11Y_LABEL},
+ {"networkListItemUnlock", IDS_NETWORK_LIST_ITEM_UNLOCK},
+ {"networkListItemUnlockA11YLabel", IDS_NETWORK_LIST_ITEM_UNLOCK_A11Y_LABEL},
{"networkListItemAddingProfile", IDS_NETWORK_LIST_ITEM_ADDING_PROFILE},
{"vpnNameTemplate", IDS_NETWORK_LIST_THIRD_PARTY_VPN_NAME_TEMPLATE},
{"networkIconLabelEthernet", IDS_NETWORK_ICON_LABEL_ETHERNET},
@@ -128,6 +141,9 @@ void AddOncLocalizedStrings(content::WebUIDataSource* html_source) {
{"OncCellular-APN-Authentication", IDS_ONC_CELLULAR_APN_AUTHENTICATION},
{"OncCellular-APN-Password", IDS_ONC_CELLULAR_APN_PASSWORD},
{"OncCellular-APN-Username", IDS_ONC_CELLULAR_APN_USERNAME},
+ {"OncCellular-APN-Attach", IDS_ONC_CELLULAR_APN_ATTACH},
+ {"OncCellular-APN-Attach_TooltipText",
+ IDS_ONC_CELLULAR_APN_ATTACH_TOOLTIP_TEXT},
{"OncCellular-ActivationState", IDS_ONC_CELLULAR_ACTIVATION_STATE},
{"OncCellular-ActivationState_Activated",
IDS_ONC_CELLULAR_ACTIVATION_STATE_ACTIVATED},
@@ -284,7 +300,11 @@ void AddDetailsLocalizedStrings(content::WebUIDataSource* html_source) {
{"networkSimChangePin", IDS_SETTINGS_INTERNET_NETWORK_SIM_CHANGE_PIN},
{"networkSimChangePinTitle",
IDS_SETTINGS_INTERNET_NETWORK_SIM_CHANGE_PIN_TITLE},
+ {"networkSimLockedTooltip",
+ IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCKED_TOOLTIP},
{"networkSimEnter", IDS_SETTINGS_INTERNET_NETWORK_SIM_BUTTON_ENTER},
+ {"networkSimLockedSubtitle",
+ IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCKED_SUBTITLE},
{"networkSimEnterNewPin",
IDS_SETTINGS_INTERNET_NETWORK_SIM_ENTER_NEW_PIN},
{"networkSimEnterOldPin",
@@ -295,6 +315,8 @@ void AddDetailsLocalizedStrings(content::WebUIDataSource* html_source) {
{"networkSimEnterPuk", IDS_SETTINGS_INTERNET_NETWORK_SIM_ENTER_PUK},
{"networkSimLockEnable", IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCK_ENABLE},
{"networkSimLockedTitle", IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCKED_TITLE},
+ {"networkSimPukDialogSubtitle",
+ IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCKED_PUK_SUBTITLE},
{"networkSimLockedWarning",
IDS_SETTINGS_INTERNET_NETWORK_SIM_LOCKED_WARNING},
{"networkSimReEnterNewPin",
@@ -345,6 +367,10 @@ void AddDetailsLocalizedStrings(content::WebUIDataSource* html_source) {
{"remove", IDS_REMOVE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
+
+ html_source->AddBoolean(
+ "useAttachApn",
+ base::FeatureList::IsEnabled(chromeos::features::kCellularUseAttachApn));
}
void AddConfigLocalizedStrings(content::WebUIDataSource* html_source) {
@@ -370,7 +396,7 @@ void AddConfigLocalizedStrings(content::WebUIDataSource* html_source) {
html_source->AddBoolean(
"showHiddenNetworkWarning",
- base::FeatureList::IsEnabled(features::kHiddenNetworkWarning));
+ base::FeatureList::IsEnabled(::features::kHiddenNetworkWarning));
// Login screen and public account users can only create shared network
// configurations. Other users default to unshared network configurations.
@@ -392,8 +418,8 @@ void AddErrorLocalizedStrings(content::WebUIDataSource* html_source) {
{NetworkConnectionHandler::kErrorPassphraseRequired,
IDS_NETWORK_ERROR_PASSPHRASE_REQUIRED},
{"networkErrorUnknown", IDS_NETWORK_ERROR_UNKNOWN},
- {"networkErrorNotHardwareBacked",
- IDS_SETTINGS_INTERNET_NETWORK_REQUIRE_HARDWARE_BACKED},
+ {"networkErrorNotAvailableForNetworkAuth",
+ IDS_SETTINGS_INTERNET_NETWORK_NOT_AVAILABLE_FOR_NETWORK_AUTH},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
index c6dc9aa87f1..9e45a96f7eb 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -8,6 +8,7 @@
#include <string>
#include <utility>
+#include "ash/public/cpp/esim_manager.h"
#include "ash/public/cpp/network_config_service.h"
#include "base/bind.h"
#include "base/macros.h"
@@ -38,6 +39,7 @@
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "chromeos/network/onc/onc_utils.h"
+#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom.h"
#include "chromeos/services/network_health/public/mojom/network_health.mojom.h"
@@ -574,6 +576,11 @@ void NetworkUI::BindInterface(
std::move(receiver));
}
+void NetworkUI::BindInterface(
+ mojo::PendingReceiver<cellular_setup::mojom::ESimManager> receiver) {
+ ash::GetESimManager(std::move(receiver));
+}
+
WEB_UI_CONTROLLER_TYPE_IMPL(NetworkUI)
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/network_ui.h b/chromium/chrome/browser/ui/webui/chromeos/network_ui.h
index 1b26204255d..b650d21ae11 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/network_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/network_ui.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_NETWORK_UI_H_
#include "base/macros.h"
+#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
#include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom-forward.h"
#include "chromeos/services/network_health/public/mojom/network_health.mojom-forward.h"
@@ -43,6 +44,11 @@ class NetworkUI : public ui::MojoWebUIController {
mojo::PendingReceiver<
network_diagnostics::mojom::NetworkDiagnosticsRoutines> receiver);
+ // Instantiates implementor of the mojom::ESimManager mojo interface
+ // passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<cellular_setup::mojom::ESimManager> receiver);
+
private:
WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/set_time_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/set_time_ui.cc
index 7425e78b754..631973ed774 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/set_time_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/set_time_ui.cc
@@ -16,9 +16,9 @@
#include "base/macros.h"
#include "base/scoped_observation.h"
#include "base/values.h"
+#include "chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/ash/system/timezone_util.h"
-#include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/chromeos/set_time_dialog.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/webui_util.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/slow_trace_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/slow_trace_ui.cc
index 96c237d88e3..ff4e1388cdd 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/slow_trace_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/slow_trace_ui.cc
@@ -13,7 +13,7 @@
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/url_constants.h"
-#include "components/feedback/tracing_manager.h"
+#include "components/feedback/content/content_tracing_manager.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_ui.h"
@@ -40,7 +40,7 @@ void SlowTraceSource::StartDataRequest(
// TODO(crbug/1009127): Simplify usages of |path| since |url| is available.
const std::string path = content::URLDataSource::URLToRequestPath(url);
size_t pos = path.find('#');
- TracingManager* manager = TracingManager::Get();
+ ContentTracingManager* manager = ContentTracingManager::Get();
if (!manager ||
pos == std::string::npos ||
!base::StringToInt(path.substr(pos + 1), &trace_id)) {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.cc
index e6ff93f2774..863eee58735 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog.cc
@@ -72,7 +72,7 @@ SmbCredentialsDialog::SmbCredentialsDialog(const std::string& mount_id,
const std::string& share_path,
RequestCallback callback)
: SystemWebDialogDelegate(GURL(GetDialogId(mount_id)),
- base::string16() /* title */),
+ std::u16string() /* title */),
mount_id_(mount_id),
share_path_(share_path),
callback_(std::move(callback)) {}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.cc
index cbc178fc35e..9e2aef67d4d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.h"
+#include "base/callback_helpers.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/chromeos/smb_client/smb_service.h"
#include "chrome/browser/chromeos/smb_client/smb_service_factory.h"
@@ -14,6 +15,7 @@
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h"
+#include "components/user_manager/user_manager.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -51,7 +53,7 @@ void SmbShareDialog::Show() {
SmbShareDialog::SmbShareDialog()
: SystemWebDialogDelegate(GURL(chrome::kChromeUISmbShareURL),
- base::string16() /* title */) {}
+ std::u16string() /* title */) {}
SmbShareDialog::~SmbShareDialog() = default;
@@ -86,6 +88,10 @@ SmbShareDialogUI::SmbShareDialogUI(content::WebUI* web_ui)
smb_service && smb_service->IsKerberosEnabledViaPolicy();
source->AddBoolean("isKerberosEnabled", is_kerberos_enabled);
+ bool is_guest = user_manager::UserManager::Get()->IsLoggedInAsGuest() ||
+ user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
+ source->AddBoolean("isGuest", is_guest);
+
source->UseStringsJs();
source->SetDefaultResource(IDR_SMB_SHARES_DIALOG_CONTAINER_HTML);
source->AddResourcePath("smb_share_dialog.js", IDR_SMB_SHARES_DIALOG_JS);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.cc
index 272f46ffe08..efefecae145 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.cc
@@ -46,6 +46,8 @@ void AddLocalizedStrings(content::WebUIDataSource* html_source) {
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_URL_MESSAGE},
{"smbShareAddedInvalidSSOURLMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_SSO_URL_MESSAGE},
+ {"smbShareAddedInvalidUsernameMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_USERNAME_MESSAGE},
{"smbShareDiscoveryMessage",
IDS_SETTINGS_DOWNLOADS_ADD_SHARE_DISCOVERY_MESSAGE},
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
index 7eee3fbbb14..89cce2debae 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
@@ -5,9 +5,9 @@
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "ash/public/cpp/test/shell_test_api.h"
-#include "chrome/browser/chromeos/login/login_manager_test.h"
-#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
-#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
+#include "chrome/browser/ash/login/login_manager_test.h"
+#include "chrome/browser/ash/login/test/login_manager_mixin.h"
+#include "chrome/browser/ash/login/test/oobe_base_test.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
@@ -32,7 +32,7 @@ class MockSystemWebDialog : public SystemWebDialogDelegate {
public:
explicit MockSystemWebDialog(const char* id = nullptr)
: SystemWebDialogDelegate(GURL(chrome::kChromeUIIntenetConfigDialogURL),
- base::string16()) {
+ std::u16string()) {
if (id)
id_ = std::string(id);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc
index 0a3e56fbc52..82636e7d9a5 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc
@@ -104,7 +104,7 @@ gfx::Size SystemWebDialogDelegate::ComputeDialogSizeForInternalScreen(
}
SystemWebDialogDelegate::SystemWebDialogDelegate(const GURL& gurl,
- const base::string16& title)
+ const std::u16string& title)
: gurl_(gurl), title_(title), modal_type_(ui::MODAL_TYPE_NONE) {
set_can_resize(false);
switch (session_manager::SessionManager::Get()->session_state()) {
@@ -151,7 +151,7 @@ ui::ModalType SystemWebDialogDelegate::GetDialogModalType() const {
return modal_type_;
}
-base::string16 SystemWebDialogDelegate::GetDialogTitle() const {
+std::u16string SystemWebDialogDelegate::GetDialogTitle() const {
return title_;
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h
index e455eb94b3b..3e005442940 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h
@@ -10,7 +10,6 @@
#include "base/macros.h"
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "ui/gfx/geometry/size.h"
#include "ui/views/widget/widget.h"
#include "ui/web_dialogs/web_dialog_delegate.h"
@@ -48,7 +47,7 @@ class SystemWebDialogDelegate : public ui::WebDialogDelegate {
// |gurl| is the HTML file path for the dialog content and must be set.
// |title| may be empty in which case ShouldShowDialogTitle() returns false.
- SystemWebDialogDelegate(const GURL& gurl, const base::string16& title);
+ SystemWebDialogDelegate(const GURL& gurl, const std::u16string& title);
~SystemWebDialogDelegate() override;
// Returns an identifier used for matching an instance in FindInstance.
@@ -68,7 +67,7 @@ class SystemWebDialogDelegate : public ui::WebDialogDelegate {
// ui::WebDialogDelegate
ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
+ std::u16string GetDialogTitle() const override;
GURL GetDialogContentURL() const override;
void GetWebUIMessageHandlers(
std::vector<content::WebUIMessageHandler*>* handlers) const override;
@@ -111,7 +110,7 @@ class SystemWebDialogDelegate : public ui::WebDialogDelegate {
private:
GURL gurl_;
- base::string16 title_;
+ std::u16string title_;
content::WebUI* webui_ = nullptr;
ui::ModalType modal_type_;
gfx::NativeWindow dialog_window_ = nullptr;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/user_image_source.cc b/chromium/chrome/browser/ui/webui/chromeos/user_image_source.cc
index 18aaf98521c..083728795d5 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/user_image_source.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/user_image_source.cc
@@ -7,7 +7,7 @@
#include "base/memory/ref_counted_memory.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
-#include "chrome/browser/chromeos/login/users/default_user_image/default_user_images.h"
+#include "chrome/browser/ash/login/users/default_user_image/default_user_images.h"
#include "chrome/common/url_constants.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/known_user.h"
@@ -20,6 +20,7 @@
#include "ui/gfx/codec/png_codec.h"
#include "url/third_party/mozilla/url_parse.h"
+namespace chromeos {
namespace {
// URL parameter specifying frame index.
@@ -147,8 +148,7 @@ scoped_refptr<base::RefCountedMemory> GetUserImageInternal(
}
if (user->HasDefaultImage()) {
return LoadUserImageFrameForScaleFactor(
- chromeos::default_user_image::kDefaultImageResourceIDs
- [user->image_index()],
+ default_user_image::kDefaultImageResourceIDs[user->image_index()],
frame, scale_factor);
}
NOTREACHED() << "User with custom image missing data bytes";
@@ -161,8 +161,6 @@ scoped_refptr<base::RefCountedMemory> GetUserImageInternal(
} // namespace
-namespace chromeos {
-
// Static.
scoped_refptr<base::RefCountedMemory> UserImageSource::GetUserImage(
const AccountId& account_id) {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/vm/BUILD.gn b/chromium/chrome/browser/ui/webui/chromeos/vm/BUILD.gn
new file mode 100644
index 00000000000..26b1cfabfd6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/vm/BUILD.gn
@@ -0,0 +1,12 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+ sources = [ "vm.mojom" ]
+
+ public_deps = [ "//chrome/browser/ash/guest_os:guest_os_diagnostics_mojom" ]
+ webui_module_path = "/"
+}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/vm/OWNERS b/chromium/chrome/browser/ui/webui/chromeos/vm/OWNERS
new file mode 100644
index 00000000000..27e329e9e1b
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/vm/OWNERS
@@ -0,0 +1,4 @@
+file://chrome/browser/ash/guest_os/OWNERS
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/chromeos/vm/vm.mojom b/chromium/chrome/browser/ui/webui/chromeos/vm/vm.mojom
new file mode 100644
index 00000000000..840438d43ea
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/vm/vm.mojom
@@ -0,0 +1,14 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.vm.mojom;
+
+import "chrome/browser/ash/guest_os/guest_os_diagnostics.mojom";
+
+// An interface for the web page to get diagnostics from the browser.
+interface VmDiagnosticsProvider {
+ // When this is called, the backend in the browser will gather Plugin VM
+ // diagnostics and send it back.
+ GetPluginVmDiagnostics() => (guest_os.mojom.Diagnostics diagnostics);
+};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.cc
new file mode 100644
index 00000000000..8a6325d1d32
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.cc
@@ -0,0 +1,84 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/vm/vm_ui.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_diagnostics.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/vm/vm.mojom.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "content/public/browser/url_data_source.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+// TODO(b/173653141) We need to port this to lacros eventually.
+
+namespace chromeos {
+
+namespace {
+
+class VmUIImpl : public vm::mojom::VmDiagnosticsProvider {
+ public:
+ explicit VmUIImpl(
+ mojo::PendingReceiver<vm::mojom::VmDiagnosticsProvider> receiver)
+ : receiver_(this, std::move(receiver)) {}
+
+ private:
+ // chromeos::vm::mojom::VmDiagnosticsProvider:
+ void GetPluginVmDiagnostics(
+ GetPluginVmDiagnosticsCallback callback) override {
+ plugin_vm::GetDiagnostics(std::move(callback));
+ }
+
+ mojo::Receiver<vm::mojom::VmDiagnosticsProvider> receiver_;
+};
+
+void AddStringResources(content::WebUIDataSource* source) {
+ source->AddString("contentsPageTitle", "VM debugging page");
+ source->AddString("pluginVmTitle", "Parallels Desktop status");
+ source->AddString("passLabel", "Pass");
+ source->AddString("failLabel", "Fail");
+ source->AddString("notApplicableLabel", "N/A");
+ source->AddString("notEnabledLabel", "Not Enabled");
+ source->AddString("learnMoreLabel", "Learn more");
+
+ source->AddString("requirementLabel", "Requirement");
+ source->AddString("statusLabel", "Status");
+ source->AddString("explanationLabel", "Explanation");
+}
+
+} // namespace
+
+VmUI::VmUI(content::WebUI* web_ui) : ui::MojoWebUIController(web_ui) {
+ auto* profile = Profile::FromWebUI(web_ui);
+ auto source = base::WrapUnique(
+ content::WebUIDataSource::Create(chrome::kChromeUIVmHost));
+ webui::SetJSModuleDefaults(source.get());
+
+ AddStringResources(source.get());
+
+ source->SetDefaultResource(IDR_VM_INDEX_HTML);
+ source->AddResourcePath("app.js", IDR_VM_APP_JS);
+ source->AddResourcePath("vm.mojom-webui.js", IDR_VM_MOJOM_WEBUI_JS);
+ source->AddResourcePath("guest_os_diagnostics.mojom-webui.js",
+ IDR_GUEST_OS_DIAGNOSTICS_MOJOM_WEBUI_JS);
+
+ content::WebUIDataSource::Add(profile, source.release());
+}
+
+VmUI::~VmUI() = default;
+
+void VmUI::BindInterface(
+ mojo::PendingReceiver<vm::mojom::VmDiagnosticsProvider> receiver) {
+ ui_handler_ = std::make_unique<VmUIImpl>(std::move(receiver));
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(VmUI)
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.h b/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.h
new file mode 100644
index 00000000000..306a1e450a7
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/vm/vm_ui.h
@@ -0,0 +1,35 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_VM_VM_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_VM_VM_UI_H_
+
+#include <memory>
+
+#include "chrome/browser/ui/webui/chromeos/vm/vm.mojom-forward.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace chromeos {
+
+// The WebUI for chrome://vm
+class VmUI : public ui::MojoWebUIController {
+ public:
+ explicit VmUI(content::WebUI* web_ui);
+ VmUI(const VmUI&) = delete;
+ VmUI& operator=(const VmUI&) = delete;
+ ~VmUI() override;
+
+ void BindInterface(
+ mojo::PendingReceiver<vm::mojom::VmDiagnosticsProvider> receiver);
+
+ private:
+ std::unique_ptr<vm::mojom::VmDiagnosticsProvider> ui_handler_;
+
+ WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_VM_VM_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/commander/commander_handler.h b/chromium/chrome/browser/ui/webui/commander/commander_handler.h
index f08216cdc75..609914b6340 100644
--- a/chromium/chrome/browser/ui/webui/commander/commander_handler.h
+++ b/chromium/chrome/browser/ui/webui/commander/commander_handler.h
@@ -18,7 +18,7 @@ class CommanderHandler : public content::WebUIMessageHandler {
class Delegate {
public:
// Called when the text is changed in the WebUI interface.
- virtual void OnTextChanged(const base::string16& text) = 0;
+ virtual void OnTextChanged(const std::u16string& text) = 0;
// Called when an option is selected (clicked or enter pressed) in the WebUI
// interface.
virtual void OnOptionSelected(size_t option_index, int result_set_id) = 0;
diff --git a/chromium/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
index e87cc662a72..ef96a8feb18 100644
--- a/chromium/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
@@ -58,7 +58,7 @@ class CommanderUITest : public InProcessBrowserTest,
ASSERT_TRUE(content::ExecuteScript(contents_.get(), js));
}
// CommanderHandler::Delegate implementation.
- void OnTextChanged(const base::string16& text) override {
+ void OnTextChanged(const std::u16string& text) override {
text_changed_invocations_.push_back(text);
}
void OnOptionSelected(size_t option_index, int result_set_id) override {
@@ -76,7 +76,7 @@ class CommanderUITest : public InProcessBrowserTest,
}
void OnHandlerEnabled(bool enabled) override {}
- const std::vector<base::string16> text_changed_invocations() {
+ const std::vector<std::u16string> text_changed_invocations() {
return text_changed_invocations_;
}
const std::vector<std::pair<size_t, int>> option_selected_invocations() {
@@ -95,7 +95,7 @@ class CommanderUITest : public InProcessBrowserTest,
std::unique_ptr<content::WebContents> contents_;
int dismiss_invocation_count_ = 0;
int composite_command_cancelled_invocation_count_ = 0;
- std::vector<base::string16> text_changed_invocations_;
+ std::vector<std::u16string> text_changed_invocations_;
std::vector<std::pair<size_t, int>> option_selected_invocations_;
std::vector<int> height_changed_invocations_;
};
@@ -117,7 +117,7 @@ IN_PROC_BROWSER_TEST_F(CommanderUITest, TextChanged) {
EXPECT_EQ(text_changed_invocations().size(), 0u);
ExecuteJS("chrome.send('textChanged', ['orange'])");
ASSERT_EQ(text_changed_invocations().size(), 1u);
- ASSERT_EQ(text_changed_invocations().back(), base::ASCIIToUTF16("orange"));
+ ASSERT_EQ(text_changed_invocations().back(), u"orange");
}
IN_PROC_BROWSER_TEST_F(CommanderUITest, OptionSelected) {
@@ -140,7 +140,7 @@ TEST(CommanderHandlerTest, DisplayResultsViewModelPassed) {
commander::CommanderViewModel vm;
vm.action = commander::CommanderViewModel::Action::kDisplayResults;
- base::string16 item_title = base::ASCIIToUTF16("Test item");
+ std::u16string item_title = u"Test item";
std::vector<gfx::Range> item_ranges = {gfx::Range(0, 4)};
vm.items.emplace_back(item_title, item_ranges);
vm.result_set_id = 42;
@@ -178,7 +178,7 @@ TEST(CommanderHandlerTest, PromptViewModelPassed) {
commander::CommanderViewModel vm;
vm.action = commander::CommanderViewModel::Action::kPrompt;
vm.result_set_id = 42;
- vm.prompt_text = base::ASCIIToUTF16("Select fruit");
+ vm.prompt_text = u"Select fruit";
handler->AllowJavascriptForTesting();
handler->ViewModelUpdated(std::move(vm));
diff --git a/chromium/chrome/browser/ui/webui/components/components_handler.cc b/chromium/chrome/browser/ui/webui/components/components_handler.cc
index 1f9014bcda6..f5c4ecf35bf 100644
--- a/chromium/chrome/browser/ui/webui/components/components_handler.cc
+++ b/chromium/chrome/browser/ui/webui/components/components_handler.cc
@@ -84,7 +84,7 @@ void ComponentsHandler::OnEvent(Events event, const std::string& id) {
FireWebUIListener("component-event", parameters);
}
-base::string16 ComponentsHandler::ComponentEventToString(Events event) {
+std::u16string ComponentsHandler::ComponentEventToString(Events event) {
switch (event) {
case Events::COMPONENT_CHECKING_FOR_UPDATES:
return l10n_util::GetStringUTF16(IDS_COMPONENTS_EVT_STATUS_STARTED);
@@ -108,7 +108,7 @@ base::string16 ComponentsHandler::ComponentEventToString(Events event) {
return l10n_util::GetStringUTF16(IDS_COMPONENTS_UNKNOWN);
}
-base::string16 ComponentsHandler::ServiceStatusToString(
+std::u16string ComponentsHandler::ServiceStatusToString(
update_client::ComponentState state) {
switch (state) {
case update_client::ComponentState::kNew:
diff --git a/chromium/chrome/browser/ui/webui/components/components_handler.h b/chromium/chrome/browser/ui/webui/components/components_handler.h
index 4f2f38fb192..9caf8b78936 100644
--- a/chromium/chrome/browser/ui/webui/components/components_handler.h
+++ b/chromium/chrome/browser/ui/webui/components/components_handler.h
@@ -9,7 +9,6 @@
#include <string>
#include "base/scoped_observation.h"
-#include "base/strings/string16.h"
#include "components/component_updater/component_updater_service.h"
#include "components/update_client/update_client.h"
#include "content/public/browser/web_ui_message_handler.h"
@@ -43,8 +42,8 @@ class ComponentsHandler : public content::WebUIMessageHandler,
void OnEvent(Events event, const std::string& id) override;
private:
- static base::string16 ComponentEventToString(Events event);
- static base::string16 ServiceStatusToString(
+ static std::u16string ComponentEventToString(Events event);
+ static std::u16string ServiceStatusToString(
update_client::ComponentState state);
std::unique_ptr<base::ListValue> LoadComponents();
diff --git a/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc b/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
index cce00377ec9..9ca70e5509d 100644
--- a/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
+++ b/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
@@ -10,11 +10,12 @@
#include "base/strings/string_util.h"
#include "base/values.h"
#include "base/win/windows_version.h"
+#include "build/branding_buildflags.h"
#include "chrome/browser/win/conflicts/module_database.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
#include "base/win/win_util.h"
#include "chrome/browser/win/conflicts/incompatible_applications_updater.h"
#include "chrome/browser/win/conflicts/module_blocklist_cache_updater.h"
@@ -42,7 +43,7 @@ std::string GetProcessTypesString(const ModuleInfoData& module_data) {
return result;
}
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Strings used twice.
constexpr char kNotLoaded[] = "Not loaded";
@@ -216,7 +217,7 @@ std::string GetModuleStatusString(
return status;
}
-#endif // defined(GOOGLE_CHROME_BUILD)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
enum ThirdPartyFeaturesStatus {
// The third-party features are not available in non-Google Chrome builds.
@@ -241,7 +242,7 @@ enum ThirdPartyFeaturesStatus {
kWarningAndBlockingInitialized,
};
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
ThirdPartyFeaturesStatus GetThirdPartyFeaturesStatus(
base::Optional<ThirdPartyConflictsManager::State>
third_party_conflicts_manager_state) {
@@ -340,7 +341,7 @@ void OnConflictsDataFetched(
std::move(on_conflicts_data_fetched_callback).Run(std::move(results));
}
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
void OnModuleDataFetched(ConflictsDataFetcher::OnConflictsDataFetchedCallback
on_conflicts_data_fetched_callback,
base::DictionaryValue results,
@@ -350,7 +351,7 @@ void OnModuleDataFetched(ConflictsDataFetcher::OnConflictsDataFetchedCallback
std::move(on_conflicts_data_fetched_callback), std::move(results),
GetThirdPartyFeaturesStatus(third_party_conflicts_manager_state));
}
-#endif // defined(GOOGLE_CHROME_BUILD)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
} // namespace
@@ -373,7 +374,7 @@ ConflictsDataFetcher::ConflictsDataFetcher(
OnConflictsDataFetchedCallback on_conflicts_data_fetched_callback)
: on_conflicts_data_fetched_callback_(
std::move(on_conflicts_data_fetched_callback))
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
,
weak_ptr_factory_(this)
#endif
@@ -388,7 +389,7 @@ ConflictsDataFetcher::ConflictsDataFetcher(
}
void ConflictsDataFetcher::InitializeOnModuleDatabaseTaskRunner() {
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// If the ThirdPartyConflictsManager instance exists, wait until it is fully
// initialized before retrieving the list of modules.
auto* third_party_conflicts_manager =
@@ -404,7 +405,7 @@ void ConflictsDataFetcher::InitializeOnModuleDatabaseTaskRunner() {
GetListOfModules();
}
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
void ConflictsDataFetcher::OnManagerInitializationComplete(
ThirdPartyConflictsManager::State state) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -413,7 +414,7 @@ void ConflictsDataFetcher::OnManagerInitializationComplete(
GetListOfModules();
}
-#endif // defined(GOOGLE_CHROME_BUILD)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
void ConflictsDataFetcher::GetListOfModules() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -435,7 +436,7 @@ void ConflictsDataFetcher::OnNewModuleFound(const ModuleInfoKey& module_key,
auto data = std::make_unique<base::DictionaryValue>();
data->SetString("third_party_module_status", std::string());
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
if (ModuleDatabase::GetInstance()->third_party_conflicts_manager()) {
auto* incompatible_applications_updater =
ModuleDatabase::GetInstance()
@@ -451,7 +452,7 @@ void ConflictsDataFetcher::OnNewModuleFound(const ModuleInfoKey& module_key,
GetModuleStatusString(module_key, incompatible_applications_updater,
module_blocklist_cache_updater));
}
-#endif // defined(GOOGLE_CHROME_BUILD)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
std::string type_string;
if (module_data.module_properties & ModuleInfoData::kPropertyShellExtension)
@@ -481,7 +482,7 @@ void ConflictsDataFetcher::OnModuleDatabaseIdle() {
results.SetInteger("moduleCount", module_list_->GetSize());
results.Set("moduleList", std::move(module_list_));
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// The state of third-party features must be determined on the UI thread.
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE,
diff --git a/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h b/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
index 3064922d205..66e610451c1 100644
--- a/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
+++ b/chromium/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
@@ -11,10 +11,11 @@
#include "base/optional.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
+#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "chrome/browser/win/conflicts/module_database_observer.h"
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
#include "chrome/browser/win/conflicts/third_party_conflicts_manager.h"
#endif
@@ -48,7 +49,7 @@ class ConflictsDataFetcher : public ModuleDatabaseObserver {
void InitializeOnModuleDatabaseTaskRunner();
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Invoked when the ThirdPartyConflictsManager initialization state is
// available.
void OnManagerInitializationComplete(ThirdPartyConflictsManager::State state);
@@ -71,7 +72,7 @@ class ConflictsDataFetcher : public ModuleDatabaseObserver {
SEQUENCE_CHECKER(sequence_checker_);
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
base::Optional<ThirdPartyConflictsManager::State>
third_party_conflicts_manager_state_;
diff --git a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
index 6e2f1df27f4..cc60f3e12f0 100644
--- a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
+++ b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
@@ -352,7 +352,7 @@ const CookieTreeNode* CookiesTreeModelUtil::GetTreeNodeFromPath(
const CookieTreeNode* CookiesTreeModelUtil::GetTreeNodeFromTitle(
const CookieTreeNode* root,
- const base::string16& title) {
+ const std::u16string& title) {
// TODO(dschuyler): This is an O(n) lookup for O(1) space, but it could be
// improved to O(1) lookup if desired (by using O(n) space).
const auto i = std::find_if(
diff --git a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.h b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.h
index 9573508bca4..73411461e72 100644
--- a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.h
+++ b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.h
@@ -12,7 +12,6 @@
#include "base/containers/id_map.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
class CookieTreeNode;
@@ -50,7 +49,7 @@ class CookiesTreeModelUtil {
// Gets tree node from |title| under |root|. |title| is a node title. Return
// NULL if |title| is not found.
const CookieTreeNode* GetTreeNodeFromTitle(const CookieTreeNode* root,
- const base::string16& title);
+ const std::u16string& title);
private:
using CookiesTreeNodeIdMap = base::IDMap<const CookieTreeNode*>;
diff --git a/chromium/chrome/browser/ui/webui/crashes_ui.cc b/chromium/chrome/browser/ui/webui/crashes_ui.cc
index 060e272a99c..7b13ef38edd 100644
--- a/chromium/chrome/browser/ui/webui/crashes_ui.cc
+++ b/chromium/chrome/browser/ui/webui/crashes_ui.cc
@@ -67,6 +67,10 @@ content::WebUIDataSource* CreateCrashesUIHTMLSource() {
source->UseStringsJs();
source->AddResourcePath(crash_reporter::kCrashesUICrashesJS,
IDR_CRASH_CRASHES_JS);
+ source->AddResourcePath(crash_reporter::kCrashesUICrashesCSS,
+ IDR_CRASH_CRASHES_CSS);
+ source->AddResourcePath(crash_reporter::kCrashesUISadTabSVG,
+ IDR_CRASH_SADTAB_SVG);
source->SetDefaultResource(IDR_CRASH_CRASHES_HTML);
return source;
}
@@ -141,6 +145,7 @@ void CrashesDOMHandler::RegisterMessages() {
}
void CrashesDOMHandler::HandleRequestCrashes(const base::ListValue* args) {
+ AllowJavascript();
if (first_load_) {
first_load_ = false;
if (list_available_)
@@ -216,24 +221,16 @@ void CrashesDOMHandler::UpdateUI() {
if (upload_list)
crash_reporter::UploadListToValue(upload_list_.get(), &crash_list);
- base::Value enabled(crash_reporting_enabled);
- base::Value dynamic_backend(system_crash_reporter);
- base::Value manual_uploads(support_manual_uploads);
- base::Value version(version_info::GetVersionNumber());
- base::Value os_string(base::SysInfo::OperatingSystemName() + " " +
- base::SysInfo::OperatingSystemVersion());
- base::Value is_google_account(is_internal);
-
- std::vector<const base::Value*> args;
- args.push_back(&enabled);
- args.push_back(&dynamic_backend);
- args.push_back(&manual_uploads);
- args.push_back(&crash_list);
- args.push_back(&version);
- args.push_back(&os_string);
- args.push_back(&is_google_account);
- web_ui()->CallJavascriptFunctionUnsafe(
- crash_reporter::kCrashesUIUpdateCrashList, args);
+ base::Value result(base::Value::Type::DICTIONARY);
+ result.SetBoolPath("enabled", crash_reporting_enabled);
+ result.SetBoolPath("dynamicBackend", system_crash_reporter);
+ result.SetBoolPath("manualUploads", support_manual_uploads);
+ result.SetPath("crashes", std::move(crash_list));
+ result.SetStringPath("version", version_info::GetVersionNumber());
+ result.SetStringPath("os", base::SysInfo::OperatingSystemName() + " " +
+ base::SysInfo::OperatingSystemVersion());
+ result.SetBoolPath("isGoogleAccount", is_internal);
+ FireWebUIListener(crash_reporter::kCrashesUIUpdateCrashList, result);
}
void CrashesDOMHandler::HandleRequestSingleCrashUpload(
diff --git a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.cc b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.cc
index d226af395ce..f248dc82770 100644
--- a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.cc
+++ b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/chrome_colors/chrome_colors_factory.h"
#include "chrome/browser/search/chrome_colors/chrome_colors_service.h"
@@ -13,8 +12,6 @@
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/common/search/generated_colors_info.h"
#include "chrome/common/themes/autogenerated_theme_util.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
@@ -39,13 +36,13 @@ ChromeCustomizeThemesHandler::ChromeCustomizeThemesHandler(
CHECK(profile_);
CHECK(chrome_colors_service_);
CHECK(theme_service_);
- notification_registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
- content::NotificationService::AllSources());
+ theme_service_->AddObserver(this);
}
ChromeCustomizeThemesHandler::~ChromeCustomizeThemesHandler() {
// Revert any unconfirmed theme changes.
chrome_colors_service_->RevertThemeChangesForTab(web_contents_);
+ theme_service_->RemoveObserver(this);
}
void ChromeCustomizeThemesHandler::ApplyAutogeneratedTheme(
@@ -104,11 +101,7 @@ void ChromeCustomizeThemesHandler::RevertThemeChanges() {
chrome_colors_service_->RevertThemeChanges();
}
-void ChromeCustomizeThemesHandler::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(type, chrome::NOTIFICATION_BROWSER_THEME_CHANGED);
+void ChromeCustomizeThemesHandler::OnThemeChanged() {
UpdateTheme();
}
@@ -117,12 +110,12 @@ void ChromeCustomizeThemesHandler::UpdateTheme() {
const ui::ThemeProvider& theme_provider =
ThemeService::GetThemeProviderForProfile(profile_);
-
if (theme_service_->UsingDefaultTheme() ||
theme_service_->UsingSystemTheme()) {
theme->type = customize_themes::mojom::ThemeType::kDefault;
theme->info = customize_themes::mojom::ThemeInfo::NewChromeThemeId(
chrome_colors::kDefaultColorId);
+ theme->is_forced = false;
} else if (theme_service_->UsingExtensionTheme()) {
theme->type = customize_themes::mojom::ThemeType::kThirdParty;
auto info = customize_themes::mojom::ThirdPartyThemeInfo::New();
@@ -136,10 +129,13 @@ void ChromeCustomizeThemesHandler::UpdateTheme() {
}
theme->info = customize_themes::mojom::ThemeInfo::NewThirdPartyThemeInfo(
std::move(info));
+ theme->is_forced = false;
} else {
DCHECK(theme_service_->UsingAutogeneratedTheme());
+ theme->is_forced = theme_service_->UsingPolicyTheme();
int color_id = chrome_colors::ChromeColorsService::GetColorId(
- theme_service_->GetAutogeneratedThemeColor());
+ theme->is_forced ? theme_service_->GetPolicyThemeColor()
+ : theme_service_->GetAutogeneratedThemeColor());
if (color_id != chrome_colors::kOtherColorId) {
theme->type = customize_themes::mojom::ThemeType::kChrome;
theme->info =
diff --git a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h
index 5fe27432b85..beaa2f7b722 100644
--- a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h
+++ b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h
@@ -5,8 +5,7 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CUSTOMIZE_THEMES_CHROME_CUSTOMIZE_THEMES_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_CUSTOMIZE_THEMES_CHROME_CUSTOMIZE_THEMES_HANDLER_H_
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "chrome/browser/themes/theme_service_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
@@ -32,7 +31,7 @@ class ThemeService;
// receiver about all theme updates in the current profile.
class ChromeCustomizeThemesHandler
: public customize_themes::mojom::CustomizeThemesHandler,
- public content::NotificationObserver {
+ public ThemeServiceObserver {
public:
explicit ChromeCustomizeThemesHandler(
mojo::PendingRemote<customize_themes::mojom::CustomizeThemesClient>
@@ -52,10 +51,8 @@ class ChromeCustomizeThemesHandler
void ConfirmThemeChanges() override;
void RevertThemeChanges() override;
- // content::NotificationObserver:
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override;
+ // ThemeServiceObserver:
+ void OnThemeChanged() override;
private:
void UpdateTheme();
@@ -67,8 +64,6 @@ class ChromeCustomizeThemesHandler
Profile* const profile_;
chrome_colors::ChromeColorsService* const chrome_colors_service_;
ThemeService* const theme_service_;
-
- content::NotificationRegistrar notification_registrar_;
};
#endif // CHROME_BROWSER_UI_WEBUI_CUSTOMIZE_THEMES_CHROME_CUSTOMIZE_THEMES_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler_unittest.cc b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler_unittest.cc
index 15cbf20c014..246f6a4aa48 100644
--- a/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler_unittest.cc
@@ -15,8 +15,8 @@
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/test_extension_environment.h"
+#include "chrome/browser/themes/test/theme_service_changed_waiter.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/common/chrome_paths.h"
@@ -224,6 +224,10 @@ TEST_F(ChromeCustomizeThemesHandlerTest, ObserveThemeChanges) {
}
TEST_F(ChromeCustomizeThemesHandlerTest, InstallThirdPartyTheme) {
+ // Prevent "Cached Theme.pak" from being created in the current directory by
+ // this test.
+ ThemeService::DisableThemePackForTesting();
+
// Read and parse an extension theme manifest from a test file.
base::FilePath test_data_dir;
ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
@@ -235,13 +239,11 @@ TEST_F(ChromeCustomizeThemesHandlerTest, InstallThirdPartyTheme) {
base::JSONReader::Read(config_contents);
ASSERT_TRUE(manifest.has_value());
- content::WindowedNotificationObserver theme_change_observer(
- chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
- content::Source<ThemeService>(theme_service()));
+ test::ThemeServiceChangedWaiter waiter(theme_service());
EXPECT_CALL(*mock_client(), SetTheme(MatchesThirdPartyTheme(
kThemeExtensionId, kThemeExtensionName)));
env()->MakeExtension(manifest.value(), kThemeExtensionId);
- theme_change_observer.Wait();
+ waiter.WaitForThemeChanged();
}
TEST_F(ChromeCustomizeThemesHandlerTest, RevertThemeChanges) {
diff --git a/chromium/chrome/browser/ui/webui/download_internals/download_internals_ui.cc b/chromium/chrome/browser/ui/webui/download_internals/download_internals_ui.cc
index ec6d63aa468..c7c656d85c2 100644
--- a/chromium/chrome/browser/ui/webui/download_internals/download_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/download_internals/download_internals_ui.cc
@@ -9,7 +9,8 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.h"
#include "chrome/common/url_constants.h"
-#include "chrome/grit/dev_ui_browser_resources.h"
+#include "chrome/grit/download_internals_resources.h"
+#include "chrome/grit/download_internals_resources_map.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -29,15 +30,10 @@ DownloadInternalsUI::DownloadInternalsUI(content::WebUI* web_ui)
// Required resources.
html_source->UseStringsJs();
- html_source->AddResourcePath("download_internals.css",
- IDR_DOWNLOAD_INTERNALS_CSS);
- html_source->AddResourcePath("download_internals.js",
- IDR_DOWNLOAD_INTERNALS_JS);
- html_source->AddResourcePath("download_internals_browser_proxy.js",
- IDR_DOWNLOAD_INTERNALS_BROWSER_PROXY_JS);
- html_source->AddResourcePath("download_internals_visuals.js",
- IDR_DOWNLOAD_INTERNALS_VISUALS_JS);
- html_source->SetDefaultResource(IDR_DOWNLOAD_INTERNALS_HTML);
+ html_source->AddResourcePaths(base::make_span(
+ kDownloadInternalsResources, kDownloadInternalsResourcesSize));
+ html_source->AddResourcePath("",
+ IDR_DOWNLOAD_INTERNALS_DOWNLOAD_INTERNALS_HTML);
Profile* profile = Profile::FromWebUI(web_ui);
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/BUILD.gn b/chromium/chrome/browser/ui/webui/download_shelf/BUILD.gn
new file mode 100644
index 00000000000..22c2d928c0c
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/BUILD.gn
@@ -0,0 +1,36 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+ sources = [ "download_shelf.mojom" ]
+ public_deps = [
+ "//mojo/public/mojom/base",
+ "//url/mojom:url_mojom_gurl",
+ ]
+ webui_module_path = "/"
+
+ # TODO(crbug.com/1195085): Remove the typemaps and use the mojo types in other
+ # code parts.
+ cpp_typemaps = [
+ {
+ types = [
+ {
+ mojom = "download_shelf.mojom.DangerType"
+ cpp = "::download::DownloadDangerType"
+ },
+ {
+ mojom = "download_shelf.mojom.DownloadState"
+ cpp = "::download::DownloadItem::DownloadState"
+ },
+ {
+ mojom = "download_shelf.mojom.MixedContentStatus"
+ cpp = "::download::DownloadItem::MixedContentStatus"
+ },
+ ]
+ traits_headers = [ "download_mojom_traits.h" ]
+ },
+ ]
+}
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/DIR_METADATA b/chromium/chrome/browser/ui/webui/download_shelf/DIR_METADATA
new file mode 100644
index 00000000000..6bf7cbfb89f
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+ component: "UI>Browser>Downloads"
+}
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/OWNERS b/chromium/chrome/browser/ui/webui/download_shelf/OWNERS
new file mode 100644
index 00000000000..15d364a37d6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/OWNERS
@@ -0,0 +1,9 @@
+robliao@chromium.org
+yuhengh@chromium.org
+romanarora@chromium.org
+kerenzhu@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_mojom_traits.h b/chromium/chrome/browser/ui/webui/download_shelf/download_mojom_traits.h
new file mode 100644
index 00000000000..fa37adf3a4a
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_mojom_traits.h
@@ -0,0 +1,236 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_MOJOM_TRAITS_H_
+#define CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_MOJOM_TRAITS_H_
+
+#include "chrome/browser/ui/webui/download_shelf/download_shelf.mojom.h"
+#include "components/download/public/common/download_danger_type.h"
+#include "components/download/public/common/download_item.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<download_shelf::mojom::DangerType,
+ download::DownloadDangerType> {
+ using DownloadDangerType = download::DownloadDangerType;
+ using MojoDangerType = download_shelf::mojom::DangerType;
+
+ static MojoDangerType ToMojom(DownloadDangerType input) {
+ switch (input) {
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS:
+ return MojoDangerType::kNotDangerous;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
+ return MojoDangerType::kDangerousFile;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
+ return MojoDangerType::kDangerousUrl;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
+ return MojoDangerType::kDangerousContent;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT:
+ return MojoDangerType::kMaybeDangerousContent;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
+ return MojoDangerType::kUncommonContent;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_USER_VALIDATED:
+ return MojoDangerType::kUserValidated;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
+ return MojoDangerType::kDangerousHost;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
+ return MojoDangerType::kPotentiallyUnwanted;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_ALLOWLISTED_BY_POLICY:
+ return MojoDangerType::kAllowListedByPolicy;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING:
+ return MojoDangerType::kAsyncScanning;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED:
+ return MojoDangerType::kBlockedPasswordProtected;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE:
+ return MojoDangerType::kBlockedTooLarge;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
+ return MojoDangerType::kSensitiveContentWarning;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK:
+ return MojoDangerType::kSensitiveContentBlock;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE:
+ return MojoDangerType::kDeepScannedSafe;
+ case DownloadDangerType::
+ DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS:
+ return MojoDangerType::kDeepScannedOpenedDangerous;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING:
+ return MojoDangerType::kPromptForScanning;
+ case DownloadDangerType::
+ DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE:
+ return MojoDangerType::kBlockedUnsupportedFileType;
+ case DownloadDangerType::DOWNLOAD_DANGER_TYPE_MAX:
+ break;
+ }
+ NOTREACHED();
+ return MojoDangerType::kNotDangerous;
+ }
+
+ static bool FromMojom(MojoDangerType input, DownloadDangerType* out) {
+ switch (input) {
+ case MojoDangerType::kNotDangerous:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS;
+ return true;
+ case MojoDangerType::kDangerousFile:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
+ return true;
+ case MojoDangerType::kDangerousUrl:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL;
+ return true;
+ case MojoDangerType::kDangerousContent:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT;
+ return true;
+ case MojoDangerType::kMaybeDangerousContent:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT;
+ return true;
+ case MojoDangerType::kUncommonContent:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT;
+ return true;
+ case MojoDangerType::kUserValidated:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_USER_VALIDATED;
+ return true;
+ case MojoDangerType::kDangerousHost:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST;
+ return true;
+ case MojoDangerType::kPotentiallyUnwanted:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED;
+ return true;
+ case MojoDangerType::kAllowListedByPolicy:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_ALLOWLISTED_BY_POLICY;
+ return true;
+ case MojoDangerType::kAsyncScanning:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING;
+ return true;
+ case MojoDangerType::kBlockedPasswordProtected:
+ *out =
+ DownloadDangerType::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED;
+ return true;
+ case MojoDangerType::kBlockedTooLarge:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE;
+ return true;
+ case MojoDangerType::kSensitiveContentWarning:
+ *out =
+ DownloadDangerType::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING;
+ return true;
+ case MojoDangerType::kSensitiveContentBlock:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK;
+ return true;
+ case MojoDangerType::kDeepScannedSafe:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE;
+ return true;
+ case MojoDangerType::kDeepScannedOpenedDangerous:
+ *out = DownloadDangerType::
+ DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS;
+ return true;
+ case MojoDangerType::kPromptForScanning:
+ *out = DownloadDangerType::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING;
+ return true;
+ case MojoDangerType::kBlockedUnsupportedFileType:
+ *out = DownloadDangerType::
+ DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE;
+ return true;
+ }
+ NOTREACHED();
+ return false;
+ }
+};
+
+template <>
+struct EnumTraits<download_shelf::mojom::DownloadState,
+ download::DownloadItem::DownloadState> {
+ using DownloadState = download::DownloadItem::DownloadState;
+ using MojoDownloadState = download_shelf::mojom::DownloadState;
+
+ static MojoDownloadState ToMojom(DownloadState input) {
+ switch (input) {
+ case DownloadState::IN_PROGRESS:
+ return MojoDownloadState::kInProgress;
+ case DownloadState::COMPLETE:
+ return MojoDownloadState::kComplete;
+ case DownloadState::CANCELLED:
+ return MojoDownloadState::kCancelled;
+ case DownloadState::INTERRUPTED:
+ return MojoDownloadState::kInterrupted;
+ case DownloadState::MAX_DOWNLOAD_STATE:
+ break;
+ }
+ NOTREACHED();
+ return MojoDownloadState::kInProgress;
+ }
+
+ static bool FromMojom(MojoDownloadState input, DownloadState* out) {
+ switch (input) {
+ case MojoDownloadState::kInProgress:
+ *out = DownloadState::IN_PROGRESS;
+ return true;
+ case MojoDownloadState::kComplete:
+ *out = DownloadState::COMPLETE;
+ return true;
+ case MojoDownloadState::kCancelled:
+ *out = DownloadState::CANCELLED;
+ return true;
+ case MojoDownloadState::kInterrupted:
+ *out = DownloadState::INTERRUPTED;
+ return true;
+ }
+ NOTREACHED();
+ return false;
+ }
+};
+
+template <>
+struct EnumTraits<download_shelf::mojom::MixedContentStatus,
+ download::DownloadItem::MixedContentStatus> {
+ using DownloadItemMixedContentStatus =
+ download::DownloadItem::MixedContentStatus;
+ using MojoMixedContentStatus = download_shelf::mojom::MixedContentStatus;
+
+ static MojoMixedContentStatus ToMojom(DownloadItemMixedContentStatus input) {
+ switch (input) {
+ case DownloadItemMixedContentStatus::UNKNOWN:
+ return MojoMixedContentStatus::kUnknown;
+ case DownloadItemMixedContentStatus::SAFE:
+ return MojoMixedContentStatus::kSafe;
+ case DownloadItemMixedContentStatus::VALIDATED:
+ return MojoMixedContentStatus::kValidated;
+ case DownloadItemMixedContentStatus::WARN:
+ return MojoMixedContentStatus::kWarn;
+ case DownloadItemMixedContentStatus::BLOCK:
+ return MojoMixedContentStatus::kBlock;
+ case DownloadItemMixedContentStatus::SILENT_BLOCK:
+ return MojoMixedContentStatus::kSilentBlock;
+ }
+ NOTREACHED();
+ return MojoMixedContentStatus::kUnknown;
+ }
+
+ static bool FromMojom(MojoMixedContentStatus input,
+ DownloadItemMixedContentStatus* out) {
+ switch (input) {
+ case MojoMixedContentStatus::kUnknown:
+ *out = DownloadItemMixedContentStatus::UNKNOWN;
+ return true;
+ case MojoMixedContentStatus::kSafe:
+ *out = DownloadItemMixedContentStatus::SAFE;
+ return true;
+ case MojoMixedContentStatus::kValidated:
+ *out = DownloadItemMixedContentStatus::VALIDATED;
+ return true;
+ case MojoMixedContentStatus::kWarn:
+ *out = DownloadItemMixedContentStatus::WARN;
+ return true;
+ case MojoMixedContentStatus::kBlock:
+ *out = DownloadItemMixedContentStatus::BLOCK;
+ return true;
+ case MojoMixedContentStatus::kSilentBlock:
+ *out = DownloadItemMixedContentStatus::SILENT_BLOCK;
+ return true;
+ }
+ NOTREACHED();
+ return false;
+ }
+};
+
+} // namespace mojo
+
+#endif // CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_MOJOM_TRAITS_H_
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf.mojom b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf.mojom
new file mode 100644
index 00000000000..533b3f16f25
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf.mojom
@@ -0,0 +1,179 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module download_shelf.mojom;
+
+import "mojo/public/mojom/base/file_path.mojom";
+import "url/mojom/url.mojom";
+
+// The danger type associated with a given download item. Maps to
+// download::DownloadDangerType in components/download/public/common/download_danger_type.h.
+enum DangerType {
+ // The download is safe.
+ kNotDangerous = 0,
+ // A dangerous file to the system.
+ kDangerousFile = 1,
+ // Safebrowsing download service shows this URL leads to malicious file
+ // download.
+ kDangerousUrl = 2,
+ // SafeBrowsing download service shows this file content as being malicious.
+ kDangerousContent = 3,
+ // The content of this download may be malicious (e.g., extension is exe but
+ // SafeBrowsing has not finished checking the content).
+ kMaybeDangerousContent = 4,
+ // SafeBrowsing download service checked the contents of the download, but
+ // didn't have enough data to determine whether it was malicious.
+ kUncommonContent = 5,
+ // The download was evaluated to be one of the other types of danger,
+ // but the user told us to go ahead anyway.
+ kUserValidated = 6,
+ // SafeBrowsing download service checked the contents of the download and
+ // didn't have data on this specific file, but the file was served from a host
+ // known to serve mostly malicious content.
+ kDangerousHost = 7,
+ // Applications and extensions that modify browser and/or computer settings
+ kPotentiallyUnwanted = 8,
+ // Download URL allowed by enterprise policy.
+ kAllowListedByPolicy = 9,
+ // Download is pending a more detailed verdict.
+ kAsyncScanning = 10,
+ // Download is password protected, and should be blocked according to policy.
+ kBlockedPasswordProtected = 11,
+ // Download is too large, and should be blocked according to policy. See the
+ // BlockLargeFileTransfer policy for details.
+ kBlockedTooLarge = 12,
+ // Download deep scanning identified sensitive content, and recommended
+ // warning the user.
+ kSensitiveContentWarning = 13,
+ // Download deep scanning identified sensitive content, and recommended
+ // blocking the file.
+ kSensitiveContentBlock = 14,
+ // Download deep scanning identified no problems.
+ kDeepScannedSafe = 15,
+ // Download deep scanning identified a problem, but the file has already been
+ // opened by the user.
+ kDeepScannedOpenedDangerous = 16,
+ // The user is enrolled in the Advanced Protection Program, and the server has
+ // recommended this file be deep scanned.
+ kPromptForScanning = 17,
+ // The download has a file type that is unsupported for deep scanning, and
+ // should be blocked according to policy. See the BlockUnsupportedFiletypes
+ // policy for details.
+ kBlockedUnsupportedFileType = 18,
+};
+
+// The download state associated with a given download item. Maps to
+// download::DownloadItem::DownloadState in components/download/public/common/download_item.h.
+enum DownloadState {
+ // Download is completely finished.
+ kComplete,
+ // Download has been cancelled.
+ kCancelled,
+ // Download is in progress.
+ kInProgress,
+ // This state indicates that the download has been interrupted.
+ kInterrupted,
+};
+
+// Mixed content details associated with a given download item. Maps to
+// download::DownloadItem::MixedContentStatus in components/download/public/common/download_item.h.
+enum MixedContentStatus {
+ // Target not yet determined, so status not yet available.
+ kUnknown = 0,
+ // Download is not mixed content.
+ kSafe = 1,
+ // Download has been explicitly OK'd by the user. Only used on Desktop.
+ kValidated = 2,
+ // Download is mixed content, and the user should be warned.
+ kWarn = 3,
+ // Download is mixed content, and the user should see an error.
+ kBlock = 4,
+ // Download is mixed content, and it should be silently dropped.
+ kSilentBlock = 5,
+};
+
+// Encapsulates all the details required in order to display a download in a
+// user interface. Based on DownloadUIModel in chrome/browser/download/download_ui_model.h
+// and download::DownloadItem in components/download/public/common/download_item.h.
+struct DownloadItem {
+ // Whether the safe browsing download feedback feature is available for this
+ // download.
+ bool allow_download_feedback;
+
+ // Danger type associated with this download.
+ DangerType danger_type;
+
+ // Filename that should be reported to the user.
+ mojo_base.mojom.FilePath file_name_to_report_user;
+
+ // Download identifier.
+ uint32 id;
+
+ // Whether it is considered a dangerous download.
+ bool is_dangerous;
+
+ // Whether it is currently paused explicitly by the user.
+ bool is_paused;
+
+ // Whether it is a malicious download.
+ bool is_malicious;
+
+ // The mixed content status determined during download target determination.
+ MixedContentStatus mixed_content_status;
+
+ // The URL of the originating request.
+ url.mojom.Url original_url;
+
+ // Total number of bytes that have been received and written to the download
+ // file.
+ int64 received_bytes;
+
+ // Whether the download will be auto-opened when complete.
+ bool should_open_when_complete;
+
+ // Whether the Origin should be clearly displayed in the notification for
+ // security reasons.
+ bool should_promote_origin;
+
+ // State of this download.
+ DownloadState state;
+
+ // A short one-line status string for the download.
+ string status_text;
+
+ // Target path of an in-progress download. May be empty if the target path
+ // hasn't yet been determined.
+ mojo_base.mojom.FilePath? target_file_path;
+
+ // A string suitable for use as a tooltip.
+ string tooltip_text;
+
+ // Total number of expected bytes or -1 if the size is unknown.
+ int64 total_bytes;
+
+ // Caption text for a button for confirming a dangerous download warning.
+ string warning_confirm_button_text;
+};
+
+// Used by the WebUI page to bootstrap bidirectional communication.
+interface PageHandlerFactory {
+ // The WebUI calls this method when the page is first initialized.
+ CreatePageHandler(pending_remote<Page> page,
+ pending_receiver<PageHandler> handler);
+};
+
+// Browser-side handler for requests from WebUI page.
+interface PageHandler {
+ // Show the context menu for a download item at a given position.
+ // TODO(kerenzhu): Use gfx::Point from geometry.mojom. It's not
+ // supported in WebUI yet.
+ ShowContextMenu(uint32 download_id, int32 client_x, int32 client_y);
+};
+
+// WebUI-side handler for requests from the browser.
+interface Page {
+ // Called when a download has triggered and thus a new DownloadItem has been
+ // created.
+ OnNewDownload(DownloadItem download_item);
+};
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc
new file mode 100644
index 00000000000..3d34c8c05c9
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc
@@ -0,0 +1,77 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/download/download_item_model.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_ui.h"
+#include "components/download/public/common/download_item.h"
+#include "content/public/browser/browser_context.h"
+#include "ui/base/ui_base_types.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace {
+
+download_shelf::mojom::DownloadItemPtr GetDownloadItemFromUIModel(
+ DownloadUIModel* download_model) {
+ download::DownloadItem* download = download_model->download();
+ auto download_item = download_shelf::mojom::DownloadItem::New();
+ download_item->allow_download_feedback =
+ download_model->ShouldAllowDownloadFeedback();
+ download_item->danger_type = download_model->GetDangerType();
+ download_item->file_name_to_report_user =
+ download_model->GetFileNameToReportUser();
+ download_item->id = download->GetId();
+ download_item->is_dangerous = download_model->IsDangerous();
+ download_item->is_paused = download->IsPaused();
+ download_item->is_malicious = download_model->IsMalicious();
+ download_item->mixed_content_status = download_model->GetMixedContentStatus();
+ download_item->original_url = download_model->GetOriginalURL();
+ download_item->received_bytes = download->GetReceivedBytes();
+ download_item->should_open_when_complete =
+ download_model->GetOpenWhenComplete();
+ download_item->should_promote_origin = download_model->ShouldPromoteOrigin();
+ download_item->state = download->GetState();
+ download_item->status_text =
+ base::UTF16ToUTF8(download_model->GetStatusText());
+ download_item->target_file_path = download_model->GetTargetFilePath();
+ download_item->tooltip_text =
+ base::UTF16ToUTF8(download_model->GetTooltipText());
+ download_item->total_bytes = download->GetTotalBytes();
+ download_item->warning_confirm_button_text =
+ base::UTF16ToUTF8(download_model->GetWarningConfirmButtonText());
+
+ return download_item;
+}
+
+} // namespace
+
+namespace download {
+class DownloadItem;
+}
+
+DownloadShelfPageHandler::DownloadShelfPageHandler(
+ mojo::PendingReceiver<download_shelf::mojom::PageHandler> receiver,
+ mojo::PendingRemote<download_shelf::mojom::Page> page,
+ content::WebUI* web_ui,
+ DownloadShelfUI* download_shelf_ui)
+ : receiver_(this, std::move(receiver)),
+ page_(std::move(page)),
+ download_shelf_ui_(download_shelf_ui) {}
+
+DownloadShelfPageHandler::~DownloadShelfPageHandler() = default;
+
+void DownloadShelfPageHandler::ShowContextMenu(uint32_t download_id,
+ int32_t client_x,
+ int32_t client_y) {
+ download_shelf_ui_->ShowContextMenu(download_id, client_x, client_y);
+}
+
+void DownloadShelfPageHandler::DoShowDownload(DownloadUIModel* download_model) {
+ page_->OnNewDownload(GetDownloadItemFromUIModel(download_model));
+}
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h
new file mode 100644
index 00000000000..01d5a26bf87
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h
@@ -0,0 +1,45 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_PAGE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_PAGE_HANDLER_H_
+
+#include "chrome/browser/download/download_ui_model.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf.mojom.h"
+#include "content/public/browser/download_manager.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+class DownloadShelfUI;
+
+class DownloadShelfPageHandler : public download_shelf::mojom::PageHandler {
+ public:
+ DownloadShelfPageHandler(
+ mojo::PendingReceiver<download_shelf::mojom::PageHandler> receiver,
+ mojo::PendingRemote<download_shelf::mojom::Page> page,
+ content::WebUI* web_ui,
+ DownloadShelfUI* download_shelf_ui);
+ DownloadShelfPageHandler(const DownloadShelfPageHandler&) = delete;
+ DownloadShelfPageHandler& operator=(const DownloadShelfPageHandler&) = delete;
+ ~DownloadShelfPageHandler() override;
+
+ // download_shelf::mojom::PageHandler:
+ void ShowContextMenu(uint32_t download_id,
+ int32_t client_x,
+ int32_t client_y) override;
+
+ // Notify the view to show a new download.
+ void DoShowDownload(DownloadUIModel* download_model);
+
+ private:
+ mojo::Receiver<download_shelf::mojom::PageHandler> receiver_;
+ mojo::Remote<download_shelf::mojom::Page> page_;
+
+ DownloadShelfUI* const download_shelf_ui_;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_PAGE_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc
new file mode 100644
index 00000000000..5763cf556cb
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc
@@ -0,0 +1,86 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_ui.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/download_shelf_resources.h"
+#include "chrome/grit/download_shelf_resources_map.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+DownloadShelfUI::DownloadShelfUI(content::WebUI* web_ui)
+ : ui::MojoWebUIController(web_ui, true),
+ download_manager_(content::BrowserContext::GetDownloadManager(
+ Profile::FromWebUI(web_ui))) {
+ content::WebUIDataSource* source =
+ content::WebUIDataSource::Create(chrome::kChromeUIDownloadShelfHost);
+
+ webui::SetupWebUIDataSource(
+ source,
+ base::make_span(kDownloadShelfResources, kDownloadShelfResourcesSize),
+ IDR_DOWNLOAD_SHELF_DOWNLOAD_SHELF_HTML);
+ content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
+ source);
+}
+
+DownloadShelfUI::~DownloadShelfUI() = default;
+
+WEB_UI_CONTROLLER_TYPE_IMPL(DownloadShelfUI)
+
+void DownloadShelfUI::BindInterface(
+ mojo::PendingReceiver<download_shelf::mojom::PageHandlerFactory> receiver) {
+ page_factory_receiver_.reset();
+ page_factory_receiver_.Bind(std::move(receiver));
+}
+
+void DownloadShelfUI::CreatePageHandler(
+ mojo::PendingRemote<download_shelf::mojom::Page> page,
+ mojo::PendingReceiver<download_shelf::mojom::PageHandler> receiver) {
+ page_handler_ = std::make_unique<DownloadShelfPageHandler>(
+ std::move(receiver), std::move(page), web_ui(), this);
+}
+
+void DownloadShelfUI::ShowContextMenu(uint32_t download_id,
+ int32_t client_x,
+ int32_t client_y) {
+ DownloadUIModel* download_ui_model = FindDownloadById(download_id);
+ if (!download_ui_model) {
+ // TODO: Remove this block. After we implement
+ // DownloadShelf::DoShowDownload(), FindDownloadById() should always find a
+ // DownloadUIMdodel.
+ download::DownloadItem* download =
+ download_manager_->GetDownload(download_id);
+ DCHECK(download);
+ download_ui_model = AddDownload(DownloadItemModel::Wrap(download));
+ DCHECK(download_ui_model);
+ }
+
+ if (embedder()) {
+ embedder()->ShowDownloadContextMenu(download_ui_model,
+ gfx::Point(client_x, client_y));
+ }
+}
+
+void DownloadShelfUI::DoShowDownload(
+ DownloadUIModel::DownloadUIModelPtr download_model) {
+ DownloadUIModel* download = AddDownload(std::move(download_model));
+
+ if (page_handler_)
+ page_handler_->DoShowDownload(download);
+}
+
+DownloadUIModel* DownloadShelfUI::AddDownload(
+ DownloadUIModel::DownloadUIModelPtr download) {
+ DownloadUIModel* pointer = download.get();
+ items_.insert_or_assign(download->download()->GetId(), std::move(download));
+ return pointer;
+}
+
+DownloadUIModel* DownloadShelfUI::FindDownloadById(uint32_t download_id) const {
+ return items_.count(download_id) ? items_.at(download_id).get() : nullptr;
+}
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h
new file mode 100644
index 00000000000..ab6a5dda069
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h
@@ -0,0 +1,68 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_H_
+
+#include <memory>
+
+#include "base/containers/flat_map.h"
+#include "chrome/browser/download/download_item_model.h"
+#include "chrome/browser/download/download_ui_model.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf.mojom.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h"
+#include "chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+class DownloadShelfUI : public ui::MojoWebUIController,
+ public download_shelf::mojom::PageHandlerFactory {
+ public:
+ explicit DownloadShelfUI(content::WebUI* web_ui);
+ DownloadShelfUI(const DownloadShelfUI&) = delete;
+ DownloadShelfUI& operator=(const DownloadShelfUI&) = delete;
+ ~DownloadShelfUI() override;
+
+ // Instantiates the implementor of the mojom::PageHandlerFactory mojo
+ // interface passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<download_shelf::mojom::PageHandlerFactory>
+ receiver);
+
+ void set_embedder(DownloadShelfUIEmbedder* embedder) { embedder_ = embedder; }
+ DownloadShelfUIEmbedder* embedder() const { return embedder_; }
+
+ void ShowContextMenu(uint32_t download_id,
+ int32_t client_x,
+ int32_t client_y);
+
+ void DoShowDownload(DownloadUIModel::DownloadUIModelPtr download_model);
+
+ private:
+ // download_shelf::mojom::PageHandlerFactory
+ void CreatePageHandler(
+ mojo::PendingRemote<download_shelf::mojom::Page> page,
+ mojo::PendingReceiver<download_shelf::mojom::PageHandler> receiver)
+ override;
+
+ DownloadUIModel* AddDownload(DownloadUIModel::DownloadUIModelPtr download);
+
+ DownloadUIModel* FindDownloadById(uint32_t download_id) const;
+
+ std::unique_ptr<DownloadShelfPageHandler> page_handler_;
+
+ mojo::Receiver<download_shelf::mojom::PageHandlerFactory>
+ page_factory_receiver_{this};
+
+ content::DownloadManager* const download_manager_;
+ DownloadShelfUIEmbedder* embedder_ = nullptr;
+
+ base::flat_map<uint32_t, DownloadUIModel::DownloadUIModelPtr> items_;
+
+ WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h
new file mode 100644
index 00000000000..c917cc0ad6b
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h
@@ -0,0 +1,23 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_EMBEDDER_H_
+#define CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_EMBEDDER_H_
+
+#include "ui/gfx/geometry/point.h"
+
+class DownloadUIModel;
+
+class DownloadShelfUIEmbedder {
+ public:
+ DownloadShelfUIEmbedder() = default;
+ virtual ~DownloadShelfUIEmbedder() = default;
+
+ // Show the context menu for |download| at |position| in container's
+ // coordinate.
+ virtual void ShowDownloadContextMenu(DownloadUIModel* download,
+ const gfx::Point& position) = 0;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_DOWNLOAD_SHELF_DOWNLOAD_SHELF_UI_EMBEDDER_H_
diff --git a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
index bc04a96c341..4fa929c24b4 100644
--- a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
+++ b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/downloads/downloads_list_tracker.h"
#include <iterator>
+#include <string>
#include <utility>
#include <vector>
@@ -12,7 +13,6 @@
#include "base/callback_helpers.h"
#include "base/i18n/rtl.h"
#include "base/i18n/unicodestring.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
@@ -123,7 +123,7 @@ void DownloadsListTracker::Reset() {
bool DownloadsListTracker::SetSearchTerms(
const std::vector<std::string>& search_terms) {
- std::vector<base::string16> new_terms;
+ std::vector<std::u16string> new_terms;
new_terms.resize(search_terms.size());
for (const auto& t : search_terms)
@@ -253,7 +253,7 @@ downloads::mojom::DataPtr DownloadsListTracker::CreateDownloadData(
file_value->by_ext_name = by_ext_name;
// Keep file names as LTR. TODO(dbeam): why?
- base::string16 file_name =
+ std::u16string file_name =
download_item->GetFileNameToReportUser().LossyDisplayName();
file_name = base::i18n::GetDisplayStringInLTRDirectionality(file_name);
@@ -269,10 +269,10 @@ downloads::mojom::DataPtr DownloadsListTracker::CreateDownloadData(
file_value->otr = IsIncognito(*download_item);
const char* danger_type = GetDangerTypeString(download_item->GetDangerType());
- base::string16 last_reason_text;
+ std::u16string last_reason_text;
// -2 is invalid, -1 means indeterminate, and 0-100 are in-progress.
int percent = -2;
- base::string16 progress_status_text;
+ std::u16string progress_status_text;
bool retry = false;
const char* state = nullptr;
diff --git a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.h b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.h
index 13d045b8db5..f4ba687cc79 100644
--- a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.h
+++ b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.h
@@ -9,10 +9,10 @@
#include <memory>
#include <set>
+#include <string>
#include "base/callback_forward.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/downloads/downloads.mojom.h"
@@ -130,7 +130,7 @@ class DownloadsListTracker
size_t chunk_size_ = 20u;
// Current search terms.
- std::vector<base::string16> search_terms_;
+ std::vector<std::u16string> search_terms_;
DISALLOW_COPY_AND_ASSIGN(DownloadsListTracker);
};
diff --git a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker_unittest.cc b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker_unittest.cc
index d7e35feb888..dbc391aaa7d 100644
--- a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker_unittest.cc
@@ -100,8 +100,8 @@ class DownloadsListTrackerTest : public testing::Test {
}
void CreateTracker() {
- tracker_.reset(
- new TestDownloadsListTracker(manager(), page_.BindAndGetRemote()));
+ tracker_ = std::make_unique<TestDownloadsListTracker>(
+ manager(), page_.BindAndGetRemote());
}
TestingProfile* profile() { return &profile_; }
diff --git a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
index 12275a0fad2..5c489b524d5 100644
--- a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
@@ -18,9 +18,9 @@
#include "base/strings/string_util.h"
#include "base/system/sys_info.h"
#include "base/values.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/settings/cros_settings_names.h"
#include "components/crx_file/id_util.h"
@@ -102,7 +102,7 @@ bool ExtractsAppIdFromInput(const std::string& input,
} // namespace
-KioskAppsHandler::KioskAppsHandler(OwnerSettingsServiceChromeOS* service)
+KioskAppsHandler::KioskAppsHandler(OwnerSettingsServiceAsh* service)
: kiosk_app_manager_(KioskAppManager::Get()),
initialized_(false),
is_kiosk_enabled_(false),
diff --git a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h
index 9e87133e5c6..3cced8e592e 100644
--- a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h
+++ b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h
@@ -12,6 +12,9 @@
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
#include "chrome/browser/ash/app_mode/kiosk_app_manager_observer.h"
+// TODO(https://crbug.com/1164001): move OwnerSettingsServiceAsh to forward
+// declaration when moved to chrome/browser/ash/.
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace base {
@@ -20,12 +23,10 @@ class ListValue;
namespace chromeos {
-class OwnerSettingsServiceChromeOS;
-
class KioskAppsHandler : public content::WebUIMessageHandler,
public KioskAppManagerObserver {
public:
- explicit KioskAppsHandler(OwnerSettingsServiceChromeOS* service);
+ explicit KioskAppsHandler(OwnerSettingsServiceAsh* service);
~KioskAppsHandler() override;
// content::WebUIMessageHandler overrides:
@@ -66,7 +67,7 @@ class KioskAppsHandler : public content::WebUIMessageHandler,
bool initialized_;
bool is_kiosk_enabled_;
bool is_auto_launch_enabled_;
- OwnerSettingsServiceChromeOS* const owner_settings_service_; // not owned
+ OwnerSettingsServiceAsh* const owner_settings_service_; // not owned
base::WeakPtrFactory<KioskAppsHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(KioskAppsHandler);
diff --git a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_source.cc b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
index 78a389f94e6..057b2e90408 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
@@ -31,6 +31,8 @@
#include "extensions/common/permissions/permission_set.h"
#include "extensions/common/permissions/permissions_data.h"
+using extensions::mojom::ManifestLocation;
+
namespace {
const char* TypeToString(extensions::Manifest::Type type) {
@@ -60,32 +62,30 @@ const char* TypeToString(extensions::Manifest::Type type) {
return "";
}
-const char* LocationToString(extensions::Manifest::Location loc) {
+const char* LocationToString(ManifestLocation loc) {
switch (loc) {
- case extensions::Manifest::INVALID_LOCATION:
+ case ManifestLocation::kInvalidLocation:
return "INVALID_LOCATION";
- case extensions::Manifest::INTERNAL:
+ case ManifestLocation::kInternal:
return "INTERNAL";
- case extensions::Manifest::EXTERNAL_PREF:
+ case ManifestLocation::kExternalPref:
return "EXTERNAL_PREF";
- case extensions::Manifest::EXTERNAL_REGISTRY:
+ case ManifestLocation::kExternalRegistry:
return "EXTERNAL_REGISTRY";
- case extensions::Manifest::UNPACKED:
+ case ManifestLocation::kUnpacked:
return "UNPACKED";
- case extensions::Manifest::COMPONENT:
+ case ManifestLocation::kComponent:
return "COMPONENT";
- case extensions::Manifest::EXTERNAL_PREF_DOWNLOAD:
+ case ManifestLocation::kExternalPrefDownload:
return "EXTERNAL_PREF_DOWNLOAD";
- case extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD:
+ case ManifestLocation::kExternalPolicyDownload:
return "EXTERNAL_POLICY_DOWNLOAD";
- case extensions::Manifest::COMMAND_LINE:
+ case ManifestLocation::kCommandLine:
return "COMMAND_LINE";
- case extensions::Manifest::EXTERNAL_POLICY:
+ case ManifestLocation::kExternalPolicy:
return "EXTERNAL_POLICY";
- case extensions::Manifest::EXTERNAL_COMPONENT:
+ case ManifestLocation::kExternalComponent:
return "EXTERNAL_COMPONENT";
- case extensions::Manifest::NUM_LOCATIONS:
- break;
}
NOTREACHED();
return "";
diff --git a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
index 842d00c2763..0b7ae5f3dea 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
@@ -117,7 +117,7 @@ TEST_F(ExtensionsInternalsUnitTest, WriteToStringTabSpecificPermissions) {
// Grant a tab specific permission to the extension.
extensions::APIPermissionSet tab_api_permissions;
- tab_api_permissions.insert(extensions::APIPermission::kTab);
+ tab_api_permissions.insert(extensions::mojom::APIPermissionID::kTab);
extensions::URLPatternSet tab_hosts;
tab_hosts.AddOrigin(extensions::UserScript::ValidUserScriptSchemes(),
GURL("https://google.com/*"));
diff --git a/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 043c4dd6325..b49605c0c63 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -48,7 +48,7 @@
#include "ui/base/webui/web_ui_util.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h"
#endif
@@ -201,6 +201,8 @@ content::WebUIDataSource* CreateMdExtensionsSource(Profile* profile,
{"itemAllowOnFollowingSites", IDS_EXTENSIONS_ALLOW_ON_FOLLOWING_SITES},
{"itemCollectErrors", IDS_EXTENSIONS_ENABLE_ERROR_COLLECTION},
{"itemCorruptInstall", IDS_EXTENSIONS_CORRUPTED_EXTENSION},
+ {"itemAllowlistWarning",
+ IDS_EXTENSIONS_SAFE_BROWSING_CRX_ALLOWLIST_WARNING},
{"itemRepair", IDS_EXTENSIONS_REPAIR_CORRUPTED},
{"itemReload", IDS_EXTENSIONS_RELOAD_TERMINATED},
{"loadErrorCouldNotLoadManifest",
@@ -241,6 +243,7 @@ content::WebUIDataSource* CreateMdExtensionsSource(Profile* profile,
{"subpageArrowRoleDescription", IDS_EXTENSIONS_SUBPAGE_BUTTON},
{"toolbarDevMode", IDS_EXTENSIONS_DEVELOPER_MODE},
{"toolbarLoadUnpacked", IDS_EXTENSIONS_TOOLBAR_LOAD_UNPACKED},
+ {"toolbarLoadUnpackedDone", IDS_EXTENSIONS_TOOLBAR_LOAD_UNPACKED_DONE},
{"toolbarPack", IDS_EXTENSIONS_TOOLBAR_PACK},
{"toolbarUpdateNow", IDS_EXTENSIONS_TOOLBAR_UPDATE_NOW},
{"toolbarUpdateNowTooltip", IDS_EXTENSIONS_TOOLBAR_UPDATE_NOW_TOOLTIP},
@@ -288,6 +291,9 @@ content::WebUIDataSource* CreateMdExtensionsSource(Profile* profile,
GURL(chrome::kRemoveNonCWSExtensionURL),
g_browser_process->GetApplicationLocale())
.spec()));
+ source->AddString(
+ "enhancedSafeBrowsingWarningHelpUrl",
+ base::ASCIIToUTF16(chrome::kCwsEnhancedSafeBrowsingLearnMoreURL));
#if BUILDFLAG(IS_CHROMEOS_ASH)
source->AddString(
"kioskDisableBailoutWarningBody",
@@ -366,8 +372,7 @@ ExtensionsUI::ExtensionsUI(content::WebUI* web_ui)
#if BUILDFLAG(IS_CHROMEOS_ASH)
auto kiosk_app_handler = std::make_unique<chromeos::KioskAppsHandler>(
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
- profile));
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile));
web_ui->AddMessageHandler(std::move(kiosk_app_handler));
#endif
diff --git a/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc b/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
index 2f71cd828c4..1d1619e87d9 100644
--- a/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
@@ -199,7 +199,7 @@ void FamilyLinkUserInternalsMessageHandler::HandleTryURL(
web_contents->GetOutermostWebContents());
}
- std::map<std::string, base::string16> allowlists =
+ std::map<std::string, std::u16string> allowlists =
filter->GetMatchingAllowlistTitles(url);
filter->GetFilteringBehaviorForURLWithAsyncChecks(
url,
@@ -273,7 +273,7 @@ void FamilyLinkUserInternalsMessageHandler::SendFamilyLinkUserSettings(
}
void FamilyLinkUserInternalsMessageHandler::OnTryURLResult(
- const std::map<std::string, base::string16>& allowlists,
+ const std::map<std::string, std::u16string>& allowlists,
const std::string& callback_id,
SupervisedUserURLFilter::FilteringBehavior behavior,
supervised_user_error_page::FilteringBehaviorReason reason,
diff --git a/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.h b/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.h
index b21f6c8173c..a54fd31caff 100644
--- a/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.h
+++ b/chromium/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.h
@@ -46,7 +46,7 @@ class FamilyLinkUserInternalsMessageHandler
void SendFamilyLinkUserSettings(const base::DictionaryValue* settings);
void OnTryURLResult(
- const std::map<std::string, base::string16>& allowlists,
+ const std::map<std::string, std::u16string>& allowlists,
const std::string& callback_id,
SupervisedUserURLFilter::FilteringBehavior behavior,
supervised_user_error_page::FilteringBehaviorReason reason,
diff --git a/chromium/chrome/browser/ui/webui/favicon_source.cc b/chromium/chrome/browser/ui/webui/favicon_source.cc
index 1b4c8da060f..bbd28692085 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source.cc
+++ b/chromium/chrome/browser/ui/webui/favicon_source.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/history/top_sites_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/instant_service.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
#include "components/favicon/core/history_ui_favicon_request_handler.h"
@@ -90,21 +91,21 @@ void FaviconSource::StartDataRequest(
FaviconServiceFactory::GetForProfile(profile_,
ServiceAccessType::EXPLICIT_ACCESS);
if (!favicon_service) {
- SendDefaultResponse(std::move(callback));
+ SendDefaultResponse(std::move(callback), wc_getter);
return;
}
chrome::ParsedFaviconPath parsed;
bool success = chrome::ParseFaviconPath(path, url_format_, &parsed);
if (!success) {
- SendDefaultResponse(std::move(callback));
+ SendDefaultResponse(std::move(callback), wc_getter);
return;
}
GURL page_url(parsed.page_url);
GURL icon_url(parsed.icon_url);
if (!page_url.is_valid() && !icon_url.is_valid()) {
- SendDefaultResponse(std::move(callback));
+ SendDefaultResponse(std::move(callback), wc_getter);
return;
}
@@ -131,7 +132,8 @@ void FaviconSource::StartDataRequest(
favicon_service->GetRawFavicon(
icon_url, favicon_base::IconType::kFavicon, desired_size_in_pixel,
base::BindOnce(&FaviconSource::OnFaviconDataAvailable,
- base::Unretained(this), std::move(callback), parsed),
+ base::Unretained(this), std::move(callback), parsed,
+ wc_getter),
&cancelable_task_tracker_);
} else {
// Intercept requests for prepopulated pages if TopSites exists.
@@ -163,7 +165,8 @@ void FaviconSource::StartDataRequest(
page_url, {favicon_base::IconType::kFavicon}, desired_size_in_pixel,
fallback_to_host,
base::BindOnce(&FaviconSource::OnFaviconDataAvailable,
- base::Unretained(this), std::move(callback), parsed),
+ base::Unretained(this), std::move(callback), parsed,
+ wc_getter),
&cancelable_task_tracker_);
return;
}
@@ -175,14 +178,14 @@ void FaviconSource::StartDataRequest(
HistoryUiFaviconRequestHandlerFactory::GetForBrowserContext(
profile_);
if (!history_ui_favicon_request_handler) {
- SendDefaultResponse(std::move(callback), parsed);
+ SendDefaultResponse(std::move(callback), parsed, wc_getter);
return;
}
history_ui_favicon_request_handler->GetRawFaviconForPageURL(
page_url, desired_size_in_pixel,
base::BindOnce(&FaviconSource::OnFaviconDataAvailable,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
- parsed),
+ parsed, wc_getter),
parsed_history_ui_origin);
}
}
@@ -215,28 +218,32 @@ bool FaviconSource::ShouldServiceRequest(
render_process_id);
}
-ui::NativeTheme* FaviconSource::GetNativeTheme() {
- return ui::NativeTheme::GetInstanceForNativeUi();
+ui::NativeTheme* FaviconSource::GetNativeTheme(
+ const content::WebContents::Getter& wc_getter) {
+ return webui::GetNativeTheme(wc_getter.Run());
}
void FaviconSource::OnFaviconDataAvailable(
content::URLDataSource::GotDataCallback callback,
const chrome::ParsedFaviconPath& parsed,
+ const content::WebContents::Getter& wc_getter,
const favicon_base::FaviconRawBitmapResult& bitmap_result) {
if (bitmap_result.is_valid()) {
// Forward the data along to the networking system.
std::move(callback).Run(bitmap_result.bitmap_data.get());
} else {
- SendDefaultResponse(std::move(callback), parsed);
+ SendDefaultResponse(std::move(callback), parsed, wc_getter);
}
}
void FaviconSource::SendDefaultResponse(
content::URLDataSource::GotDataCallback callback,
- const chrome::ParsedFaviconPath& parsed) {
+ const chrome::ParsedFaviconPath& parsed,
+ const content::WebContents::Getter& wc_getter) {
if (!parsed.show_fallback_monogram) {
SendDefaultResponse(std::move(callback), parsed.size_in_dip,
- parsed.device_scale_factor);
+ parsed.device_scale_factor,
+ GetNativeTheme(wc_getter)->ShouldUseDarkColors());
return;
}
int icon_size = std::ceil(parsed.size_in_dip * parsed.device_scale_factor);
@@ -249,25 +256,29 @@ void FaviconSource::SendDefaultResponse(
}
void FaviconSource::SendDefaultResponse(
- content::URLDataSource::GotDataCallback callback) {
- SendDefaultResponse(std::move(callback), 16, 1.0f);
+ content::URLDataSource::GotDataCallback callback,
+ const content::WebContents::Getter& wc_getter) {
+ SendDefaultResponse(std::move(callback), 16, 1.0f,
+ GetNativeTheme(wc_getter)->ShouldUseDarkColors());
}
void FaviconSource::SendDefaultResponse(
content::URLDataSource::GotDataCallback callback,
int size_in_dip,
- float scale_factor) {
- const bool dark = GetNativeTheme()->ShouldUseDarkColors();
+ float scale_factor,
+ bool dark_mode) {
int resource_id;
switch (size_in_dip) {
case 64:
- resource_id = dark ? IDR_DEFAULT_FAVICON_DARK_64 : IDR_DEFAULT_FAVICON_64;
+ resource_id =
+ dark_mode ? IDR_DEFAULT_FAVICON_DARK_64 : IDR_DEFAULT_FAVICON_64;
break;
case 32:
- resource_id = dark ? IDR_DEFAULT_FAVICON_DARK_32 : IDR_DEFAULT_FAVICON_32;
+ resource_id =
+ dark_mode ? IDR_DEFAULT_FAVICON_DARK_32 : IDR_DEFAULT_FAVICON_32;
break;
default:
- resource_id = dark ? IDR_DEFAULT_FAVICON_DARK : IDR_DEFAULT_FAVICON;
+ resource_id = dark_mode ? IDR_DEFAULT_FAVICON_DARK : IDR_DEFAULT_FAVICON;
break;
}
std::move(callback).Run(LoadIconBytes(scale_factor, resource_id));
diff --git a/chromium/chrome/browser/ui/webui/favicon_source.h b/chromium/chrome/browser/ui/webui/favicon_source.h
index 8c395527cd7..42bb4675e83 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source.h
+++ b/chromium/chrome/browser/ui/webui/favicon_source.h
@@ -58,7 +58,8 @@ class FaviconSource : public content::URLDataSource {
protected:
// Exposed for testing.
- virtual ui::NativeTheme* GetNativeTheme();
+ virtual ui::NativeTheme* GetNativeTheme(
+ const content::WebContents::Getter& wc_getter);
virtual base::RefCountedMemory* LoadIconBytes(float scale_factor,
int resource_id);
@@ -79,19 +80,23 @@ class FaviconSource : public content::URLDataSource {
void OnFaviconDataAvailable(
content::URLDataSource::GotDataCallback callback,
const chrome::ParsedFaviconPath& parsed,
+ const content::WebContents::Getter& wc_getter,
const favicon_base::FaviconRawBitmapResult& bitmap_result);
// Sends the 16x16 DIP 1x default favicon.
- void SendDefaultResponse(content::URLDataSource::GotDataCallback callback);
+ void SendDefaultResponse(content::URLDataSource::GotDataCallback callback,
+ const content::WebContents::Getter& wc_getter);
// Sends back default favicon or fallback monogram.
void SendDefaultResponse(content::URLDataSource::GotDataCallback callback,
- const chrome::ParsedFaviconPath& parsed);
+ const chrome::ParsedFaviconPath& parsed,
+ const content::WebContents::Getter& wc_getter);
// Sends the default favicon.
void SendDefaultResponse(content::URLDataSource::GotDataCallback callback,
int size_in_dip,
- float scale_factor);
+ float scale_factor,
+ bool dark_mode);
chrome::FaviconUrlFormat url_format_;
diff --git a/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc b/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
index ab13c0b5938..cb904893224 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
@@ -80,7 +80,11 @@ class TestFaviconSource : public FaviconSource {
MOCK_METHOD2(LoadIconBytes, base::RefCountedMemory*(float, int));
protected:
- ui::NativeTheme* GetNativeTheme() override { return theme_; }
+ // FaviconSource:
+ ui::NativeTheme* GetNativeTheme(
+ const content::WebContents::Getter& wc_getter) override {
+ return theme_;
+ }
private:
ui::NativeTheme* const theme_;
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
index f9d9312ec64..0be9e616acc 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
@@ -21,6 +21,9 @@ struct Properties {
// Whether prefetching for offline availability is enabled.
bool is_prefetching_enabled;
+ // Whether the WebFeed UI is enabled.
+ bool is_web_feed_ui_enabled;
+
// Last load stream status, human readable.
string load_stream_status;
@@ -132,4 +135,7 @@ interface PageHandler {
// Overrides the feed stream data with the payload inside a feedui::Slice for
// testing purpose. See go/feed-stream-data-testing for more details.
OverrideFeedStreamData(array<uint8> data);
+
+ // Sets whether the WebFeed UI is enabled.
+ SetWebFeedUIEnabled(bool enabled);
};
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
index b80adb787c8..14d881fcf27 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
@@ -13,8 +13,8 @@
#include "components/feed/core/common/pref_names.h"
#include "components/feed/core/proto/v2/ui.pb.h"
#include "components/feed/core/shared_prefs/pref_names.h"
+#include "components/feed/core/v2/public/feed_api.h"
#include "components/feed/core/v2/public/feed_service.h"
-#include "components/feed/core/v2/public/feed_stream_api.h"
#include "components/feed/core/v2/public/types.h"
#include "components/feed/feed_feature_list.h"
#include "components/offline_pages/core/prefetch/prefetch_prefs.h"
@@ -58,6 +58,7 @@ void FeedV2InternalsPageHandler::GetGeneralProperties(
properties->is_feed_allowed = IsFeedAllowed();
properties->is_prefetching_enabled =
offline_pages::prefetch_prefs::IsEnabled(pref_service_);
+ properties->is_web_feed_ui_enabled = IsWebFeedUIEnabled();
if (debug_data.fetch_info)
properties->feed_fetch_url = debug_data.fetch_info->base_request_url;
if (debug_data.upload_info)
@@ -157,3 +158,11 @@ void FeedV2InternalsPageHandler::OverrideFeedStreamData(
slice->mutable_xsurface_slice()->set_xsurface_frame(data.data(), data.size());
feed_stream_->SetForcedStreamUpdateForDebugging(stream_update);
}
+
+bool FeedV2InternalsPageHandler::IsWebFeedUIEnabled() {
+ return pref_service_->GetBoolean(feed::prefs::kEnableWebFeedUI);
+}
+
+void FeedV2InternalsPageHandler::SetWebFeedUIEnabled(const bool enabled) {
+ pref_service_->SetBoolean(feed::prefs::kEnableWebFeedUI, enabled);
+}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h
index 57acac7ded1..7de929e73a8 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h
@@ -17,7 +17,7 @@
class PrefService;
namespace feed {
class FeedService;
-class FeedStreamApi;
+class FeedApi;
} // namespace feed
// Concrete implementation of feed_internals::mojom::PageHandler.
@@ -47,14 +47,16 @@ class FeedV2InternalsPageHandler : public feed_internals::mojom::PageHandler {
void OverrideFeedHost(const GURL& host) override;
void OverrideDiscoverApiEndpoint(const GURL& endpoint_url) override;
void OverrideFeedStreamData(const std::vector<uint8_t>& data) override;
+ void SetWebFeedUIEnabled(const bool enabled) override;
private:
bool IsFeedAllowed();
+ bool IsWebFeedUIEnabled();
mojo::Receiver<feed_internals::mojom::PageHandler> receiver_;
// Services that provide the data and functionality.
- feed::FeedStreamApi* feed_stream_;
+ feed::FeedApi* feed_stream_;
PrefService* pref_service_;
base::WeakPtrFactory<FeedV2InternalsPageHandler> weak_ptr_factory_{this};
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.cc b/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.cc
new file mode 100644
index 00000000000..8f443e59c03
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.cc
@@ -0,0 +1,144 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/feedback/feedback_dialog.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/json/json_writer.h"
+#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/webui/feedback/feedback_handler.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/browser_thread.h"
+#include "extensions/common/api/feedback_private.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/widget/widget.h"
+#include "url/gurl.h"
+
+using content::WebContents;
+using content::WebUIMessageHandler;
+
+namespace {
+
+// Default width/height of the Feedback Window.
+const int kDefaultWidth = 500;
+const int kDefaultHeight = 628;
+
+} // namespace
+
+using extensions::api::feedback_private::FEEDBACK_FLOW_LOGIN;
+using extensions::api::feedback_private::FEEDBACK_FLOW_SADTABCRASH;
+using extensions::api::feedback_private::FeedbackInfo;
+
+// static
+FeedbackDialog* FeedbackDialog::current_instance_ = nullptr;
+
+// static
+void FeedbackDialog::CreateOrShow(
+ const extensions::api::feedback_private::FeedbackInfo& info) {
+ // Focus the window hosting the dialog that has already been created.
+ if (current_instance_) {
+ DCHECK(current_instance_->widget_);
+ current_instance_->widget_->Show();
+ return;
+ }
+
+ current_instance_ = new FeedbackDialog(info);
+ gfx::NativeWindow window =
+ chrome::ShowWebDialog(nullptr, ProfileManager::GetActiveUserProfile(),
+ current_instance_, /*show=*/false);
+ current_instance_->widget_ = views::Widget::GetWidgetForNativeWindow(window);
+}
+
+FeedbackDialog::FeedbackDialog(
+ const extensions::api::feedback_private::FeedbackInfo& info)
+ : feedback_info_(info.ToValue()),
+ feedback_flow_(info.flow),
+ widget_(nullptr) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ set_can_resize(false);
+ set_can_minimize(true);
+}
+
+FeedbackDialog::~FeedbackDialog() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ current_instance_ = nullptr;
+}
+
+ui::ModalType FeedbackDialog::GetDialogModalType() const {
+ // On the login screen, set to Modal mode. Otherwise, this is not visible.
+ // For other cases, set to none Modal mode so the user can navigate to
+ // other windows.
+ return (feedback_flow_ == FEEDBACK_FLOW_LOGIN) ? ui::MODAL_TYPE_SYSTEM
+ : ui::MODAL_TYPE_NONE;
+}
+
+std::u16string FeedbackDialog::GetDialogTitle() const {
+ return l10n_util::GetStringUTF16(
+ (feedback_flow_ == FEEDBACK_FLOW_SADTABCRASH)
+ ? IDS_FEEDBACK_REPORT_PAGE_TITLE_SAD_TAB_FLOW
+ : IDS_FEEDBACK_REPORT_PAGE_TITLE);
+}
+
+GURL FeedbackDialog::GetDialogContentURL() const {
+ return GURL(chrome::kChromeUIFeedbackURL);
+}
+
+void FeedbackDialog::GetDialogSize(gfx::Size* size) const {
+ size->SetSize(kDefaultWidth, kDefaultHeight);
+}
+
+void FeedbackDialog::GetWebUIMessageHandlers(
+ std::vector<WebUIMessageHandler*>* handlers) const {
+ handlers->push_back(new FeedbackHandler(this));
+}
+
+// The feedbackInfo will be available to JS via
+// chrome.getVariableValue('dialogArguments')
+std::string FeedbackDialog::GetDialogArgs() const {
+ std::string data;
+ base::JSONWriter::Write(*feedback_info_, &data);
+ return data;
+}
+
+void FeedbackDialog::Show() const {
+ // The widget_ is set to null when the FeedbackDialog is constructed.
+ // After the following two function calls, it is finally initialized.
+ // Therefore, it is safer to check whether the widget_ is null
+ if (this->widget_)
+ this->widget_->Show();
+}
+
+void FeedbackDialog::RequestMediaAccessPermission(
+ content::WebContents* web_contents,
+ const content::MediaStreamRequest& request,
+ content::MediaResponseCallback callback) {
+ MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
+ web_contents, request, std::move(callback), nullptr /* extension */);
+}
+
+bool FeedbackDialog::CheckMediaAccessPermission(
+ content::RenderFrameHost* render_frame_host,
+ const GURL& security_origin,
+ blink::mojom::MediaStreamType type) {
+ return true;
+}
+
+void FeedbackDialog::OnDialogClosed(const std::string& json_retval) {
+ DCHECK(this == current_instance_);
+ delete this;
+}
+
+void FeedbackDialog::OnCloseContents(WebContents* source,
+ bool* out_close_dialog) {
+ *out_close_dialog = true;
+}
+
+bool FeedbackDialog::ShouldShowDialogTitle() const {
+ return true;
+}
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.h b/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.h
new file mode 100644
index 00000000000..d1e78352ca4
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_dialog.h
@@ -0,0 +1,62 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_DIALOG_H_
+#define CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_DIALOG_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "extensions/common/api/feedback_private.h"
+#include "ui/web_dialogs/web_dialog_delegate.h"
+
+namespace views {
+class Widget;
+}
+
+class FeedbackDialog : public ui::WebDialogDelegate {
+ public:
+ static void CreateOrShow(
+ const extensions::api::feedback_private::FeedbackInfo& info);
+
+ FeedbackDialog(const FeedbackDialog&) = delete;
+ FeedbackDialog& operator=(const FeedbackDialog&) = delete;
+ ~FeedbackDialog() override;
+
+ // Show this web dialog
+ void Show() const;
+
+ private:
+ explicit FeedbackDialog(
+ const extensions::api::feedback_private::FeedbackInfo& info);
+
+ // Overrides from ui::WebDialogDelegate
+ ui::ModalType GetDialogModalType() const override;
+ std::u16string GetDialogTitle() const override;
+ GURL GetDialogContentURL() const override;
+ void GetDialogSize(gfx::Size* size) const override;
+ std::string GetDialogArgs() const override;
+ void GetWebUIMessageHandlers(
+ std::vector<content::WebUIMessageHandler*>* handlers) const override;
+ void OnDialogClosed(const std::string& json_retval) override;
+ void OnCloseContents(content::WebContents* source,
+ bool* out_close_dialog) override;
+ bool ShouldShowDialogTitle() const override;
+ void RequestMediaAccessPermission(
+ content::WebContents* web_contents,
+ const content::MediaStreamRequest& request,
+ content::MediaResponseCallback callback) override;
+ bool CheckMediaAccessPermission(content::RenderFrameHost* render_frame_host,
+ const GURL& security_origin,
+ blink::mojom::MediaStreamType type) override;
+
+ std::unique_ptr<base::DictionaryValue> feedback_info_;
+ extensions::api::feedback_private::FeedbackFlow feedback_flow_;
+ // Widget for the Feedback WebUI.
+ views::Widget* widget_;
+ static FeedbackDialog* current_instance_;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_DIALOG_H_
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_handler.cc b/chromium/chrome/browser/ui/webui/feedback/feedback_handler.cc
new file mode 100644
index 00000000000..42614147fff
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_handler.cc
@@ -0,0 +1,27 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/feedback/feedback_handler.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/values.h"
+#include "chrome/browser/ui/webui/feedback/feedback_dialog.h"
+#include "extensions/common/api/feedback_private.h"
+
+FeedbackHandler::FeedbackHandler(const FeedbackDialog* dialog)
+ : dialog_(dialog) {}
+
+FeedbackHandler::~FeedbackHandler() = default;
+
+void FeedbackHandler::HandleShowDialog(const base::ListValue* args) {
+ dialog_->Show();
+}
+
+void FeedbackHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "showDialog", base::BindRepeating(&FeedbackHandler::HandleShowDialog,
+ base::Unretained(this)));
+}
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_handler.h b/chromium/chrome/browser/ui/webui/feedback/feedback_handler.h
new file mode 100644
index 00000000000..7fec9295288
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_handler.h
@@ -0,0 +1,34 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_HANDLER_H_
+
+#include <memory>
+
+#include "chrome/browser/ui/webui/feedback/feedback_dialog.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+namespace base {
+class ListValue;
+} // namespace base
+
+class FeedbackHandler : public content::WebUIMessageHandler {
+ public:
+ explicit FeedbackHandler(const FeedbackDialog* dialog);
+ FeedbackHandler(const FeedbackHandler&) = delete;
+ FeedbackHandler& operator=(const FeedbackHandler&) = delete;
+ ~FeedbackHandler() override;
+
+ // Overrides from content::WebUIMessageHandler
+ void RegisterMessages() override;
+
+ private:
+ // JS message handler for chrome.send("showDialog")
+ void HandleShowDialog(const base::ListValue* args);
+
+ const FeedbackDialog* dialog_;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_ui.cc b/chromium/chrome/browser/ui/webui/feedback/feedback_ui.cc
index 1cf72910228..44a6e04789c 100644
--- a/chromium/chrome/browser/ui/webui/feedback/feedback_ui.cc
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_ui.cc
@@ -13,7 +13,12 @@
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
-void AddStringResources(content::WebUIDataSource* source) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/arc/arc_util.h"
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+void AddStringResources(content::WebUIDataSource* source,
+ const Profile* profile) {
static constexpr webui::LocalizedString kStrings[] = {
{"additionalInfo", IDS_FEEDBACK_ADDITIONAL_INFO_LABEL},
{"anonymousUser", IDS_FEEDBACK_ANONYMOUS_EMAIL_OPTION},
@@ -37,11 +42,6 @@ void AddStringResources(content::WebUIDataSource* source) {
{"screenshot", IDS_FEEDBACK_SCREENSHOT_LABEL},
{"screenshotA11y", IDS_FEEDBACK_SCREENSHOT_A11Y_TEXT},
{"sendReport", IDS_FEEDBACK_SEND_REPORT},
-#if BUILDFLAG(IS_CHROMEOS_ASH)
- {"sysInfo", IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_AND_METRICS_CHKBOX},
-#else
- {"sysInfo", IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_CHKBOX},
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
{"sysinfoPageCollapseAllBtn", IDS_ABOUT_SYS_COLLAPSE_ALL},
{"sysinfoPageCollapseBtn", IDS_ABOUT_SYS_COLLAPSE},
{"sysinfoPageDescription", IDS_ABOUT_SYS_DESC},
@@ -54,9 +54,19 @@ void AddStringResources(content::WebUIDataSource* source) {
};
source->AddLocalizedStrings(kStrings);
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ source->AddLocalizedString(
+ "sysInfo",
+ arc::IsArcPlayStoreEnabledForProfile(profile)
+ ? IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_AND_METRICS_CHKBOX_ARC
+ : IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_AND_METRICS_CHKBOX);
+#else
+ source->AddLocalizedString("sysInfo",
+ IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_CHKBOX);
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
-content::WebUIDataSource* CreateFeedbackHTMLSource() {
+content::WebUIDataSource* CreateFeedbackHTMLSource(const Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIFeedbackHost);
source->AddResourcePaths(
@@ -64,14 +74,14 @@ content::WebUIDataSource* CreateFeedbackHTMLSource() {
source->AddResourcePath("", IDR_FEEDBACK_DEFAULT_HTML);
source->UseStringsJs();
- AddStringResources(source);
+ AddStringResources(source, profile);
return source;
}
-FeedbackUI::FeedbackUI(content::WebUI* web_ui) : WebUIController(web_ui) {
+FeedbackUI::FeedbackUI(content::WebUI* web_ui) : WebDialogUI(web_ui) {
Profile* profile = Profile::FromWebUI(web_ui);
- content::WebUIDataSource::Add(profile, CreateFeedbackHTMLSource());
+ content::WebUIDataSource::Add(profile, CreateFeedbackHTMLSource(profile));
}
FeedbackUI::~FeedbackUI() = default;
diff --git a/chromium/chrome/browser/ui/webui/feedback/feedback_ui.h b/chromium/chrome/browser/ui/webui/feedback/feedback_ui.h
index 550c150717d..ee29315d0e1 100644
--- a/chromium/chrome/browser/ui/webui/feedback/feedback_ui.h
+++ b/chromium/chrome/browser/ui/webui/feedback/feedback_ui.h
@@ -5,17 +5,15 @@
#ifndef CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
#define CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
-#include "base/macros.h"
-#include "content/public/browser/web_ui_controller.h"
+#include "ui/web_dialogs/web_dialog_ui.h"
// The implementation for the chrome://feedback page.
-class FeedbackUI : public content::WebUIController {
+class FeedbackUI : public ui::WebDialogUI {
public:
explicit FeedbackUI(content::WebUI* web_ui);
+ FeedbackUI(const FeedbackUI&) = delete;
+ FeedbackUI& operator=(const FeedbackUI&) = delete;
~FeedbackUI() override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FeedbackUI);
};
#endif // CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/flags/flags_ui.cc b/chromium/chrome/browser/ui/webui/flags/flags_ui.cc
index 671020a5b84..612a3e73762 100644
--- a/chromium/chrome/browser/ui/webui/flags/flags_ui.cc
+++ b/chromium/chrome/browser/ui/webui/flags/flags_ui.cc
@@ -42,12 +42,12 @@
#include "ash/constants/ash_switches.h"
#include "base/command_line.h"
#include "base/system/sys_info.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/ash/settings/owner_flags_storage.h"
-#include "chrome/browser/chromeos/login/session/user_session_manager.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/grit/generated_resources.h"
#include "components/account_id/account_id.h"
@@ -78,12 +78,12 @@ content::WebUIDataSource* CreateFlagsUIHTMLSource() {
base::SysInfo::IsRunningOnChromeOS()) {
// Set the string to show which user can actually change the flags.
std::string owner;
- chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
+ ash::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
source->AddString("owner-warning",
l10n_util::GetStringFUTF16(IDS_FLAGS_UI_OWNER_WARNING,
base::UTF8ToUTF16(owner)));
} else {
- source->AddString("owner-warning", base::string16());
+ source->AddString("owner-warning", std::u16string());
}
#endif
@@ -114,9 +114,8 @@ void FinishInitialization(base::WeakPtr<T> flags_ui,
// Note that |dom_handler| is owned by the web ui that owns |flags_ui|, so
// it is still alive if |flags_ui| is.
if (current_user_is_owner) {
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
- profile);
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile);
dom_handler->Init(new chromeos::about_flags::OwnerFlagsStorage(
profile->GetPrefs(), service),
flags_ui::kOwnerAccessToFlags);
@@ -233,10 +232,10 @@ FlagsUIHandler* InitializeHandler(content::WebUI* web_ui,
// Bypass possible incognito profile.
Profile* original_profile = profile->GetOriginalProfile();
if (base::SysInfo::IsRunningOnChromeOS() &&
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(
original_profile)) {
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(
original_profile);
service->IsOwnerAsync(base::BindOnce(&FinishInitialization<T>,
weak_factory.GetWeakPtr(),
diff --git a/chromium/chrome/browser/ui/webui/flags/flags_ui_handler.cc b/chromium/chrome/browser/ui/webui/flags/flags_ui_handler.cc
index 0549859b043..bc332ed5155 100644
--- a/chromium/chrome/browser/ui/webui/flags/flags_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/flags/flags_ui_handler.cc
@@ -14,10 +14,10 @@
#include "components/version_info/channel.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "base/system/sys_info.h"
-#include "chrome/browser/chromeos/login/session/user_session_manager.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
+#include "chromeos/cryptohome/cryptohome_parameters.h"
+#include "chromeos/dbus/session_manager/session_manager_client.h"
#include "components/account_id/account_id.h"
-#include "components/pref_registry/pref_registry_syncable.h"
#include "components/user_manager/user_manager.h"
#endif
@@ -149,28 +149,21 @@ void FlagsUIHandler::HandleSetOriginListFlagMessage(
void FlagsUIHandler::HandleRestartBrowser(const base::ListValue* args) {
DCHECK(flags_storage_);
#if BUILDFLAG(IS_CHROMEOS_ASH)
- // On ChromeOS be less intrusive and restart inside the user session after
+ // On Chrome OS be less intrusive and restart inside the user session after
// we apply the newly selected flags.
- base::CommandLine user_flags(base::CommandLine::NO_PROGRAM);
- about_flags::ConvertFlagsToSwitches(flags_storage_.get(), &user_flags,
- flags_ui::kAddSentinels);
-
- // Adhere to policy-enforced command-line switch handling when
- // applying modified flags..
- chromeos::UserSessionManager::ApplyUserPolicyToSwitches(
- Profile::FromWebUI(web_ui())->GetPrefs(), &user_flags);
-
- base::CommandLine::StringVector flags;
- // argv[0] is the program name |base::CommandLine::NO_PROGRAM|.
- flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end());
VLOG(1) << "Restarting to apply per-session flags...";
+
+ // Adhere to policy-enforced command-line switch handling when applying
+ // modified flags.
+ auto flags = flags_storage_->GetFlags();
+ chromeos::UserSessionManager::ApplyUserPolicyToFlags(
+ Profile::FromWebUI(web_ui())->GetPrefs(), &flags);
+
AccountId account_id =
user_manager::UserManager::Get()->GetActiveUser()->GetAccountId();
- chromeos::UserSessionManager::GetInstance()->SetSwitchesForUser(
- account_id,
- chromeos::UserSessionManager::CommandLineSwitchesType::
- kPolicyAndFlagsAndKioskControl,
- flags);
+ chromeos::SessionManagerClient::Get()->SetFeatureFlagsForUser(
+ cryptohome::CreateAccountIdentifierFromAccountId(account_id),
+ {flags.begin(), flags.end()});
#endif
chrome::AttemptRestart();
}
diff --git a/chromium/chrome/browser/ui/webui/help/help_utils_chromeos.cc b/chromium/chrome/browser/ui/webui/help/help_utils_chromeos.cc
index cfddc576e74..b2a4f3ca5e4 100644
--- a/chromium/chrome/browser/ui/webui/help/help_utils_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/help/help_utils_chromeos.cc
@@ -23,7 +23,7 @@ bool IsUpdateOverCellularAllowed(bool interactive) {
interactive ? true : chromeos::switches::IsCellularFirstDevice();
// Device Policy overrides the defaults.
- chromeos::CrosSettings* settings = chromeos::CrosSettings::Get();
+ ash::CrosSettings* settings = ash::CrosSettings::Get();
if (!settings)
return default_update_over_cellular_allowed;
diff --git a/chromium/chrome/browser/ui/webui/help/test_version_updater.h b/chromium/chrome/browser/ui/webui/help/test_version_updater.h
index f413068100b..3714e4409dc 100644
--- a/chromium/chrome/browser/ui/webui/help/test_version_updater.h
+++ b/chromium/chrome/browser/ui/webui/help/test_version_updater.h
@@ -45,7 +45,7 @@ class TestVersionUpdater : public VersionUpdater {
bool powerwash_ = false;
std::string version_;
int64_t update_size_ = 0;
- base::string16 message_;
+ std::u16string message_;
DISALLOW_COPY_AND_ASSIGN(TestVersionUpdater);
};
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater.h b/chromium/chrome/browser/ui/webui/help/version_updater.h
index d98449dd899..e62eeaeb40a 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater.h
+++ b/chromium/chrome/browser/ui/webui/help/version_updater.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/callback.h"
-#include "base/strings/string16.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
@@ -71,7 +70,7 @@ class VersionUpdater {
bool powerwash,
const std::string& version,
int64_t update_size,
- const base::string16& message)>
+ const std::u16string& message)>
StatusCallback;
// Used to show or hide the promote UI elements. Mac-only.
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_basic.cc b/chromium/chrome/browser/ui/webui/help/version_updater_basic.cc
index dd5eae782f6..3545b63afb7 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_basic.cc
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_basic.cc
@@ -4,7 +4,8 @@
#include "chrome/browser/ui/webui/help/version_updater_basic.h"
-#include "base/strings/string16.h"
+#include <string>
+
#include "chrome/browser/upgrade_detector/upgrade_detector.h"
void VersionUpdaterBasic::CheckForUpdate(StatusCallback status_callback,
@@ -13,7 +14,7 @@ void VersionUpdaterBasic::CheckForUpdate(StatusCallback status_callback,
? NEARLY_UPDATED
: DISABLED;
status_callback.Run(status, 0, false, false, std::string(), 0,
- base::string16());
+ std::u16string());
}
VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) {
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
index 20164bc2360..2655cf5c7d6 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
@@ -5,17 +5,17 @@
#include "chrome/browser/ui/webui/help/version_updater_chromeos.h"
#include <cmath>
+#include <string>
#include "base/bind.h"
#include "base/callback_helpers.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/ash/login/startup_utils.h"
+#include "chrome/browser/ash/login/wizard_controller.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
#include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/dbus_thread_manager.h"
@@ -32,8 +32,8 @@
using chromeos::CrosSettings;
using chromeos::DBusThreadManager;
-using chromeos::OwnerSettingsServiceChromeOS;
-using chromeos::OwnerSettingsServiceChromeOSFactory;
+using chromeos::OwnerSettingsServiceAsh;
+using chromeos::OwnerSettingsServiceAshFactory;
using chromeos::UpdateEngineClient;
using chromeos::WizardController;
@@ -67,7 +67,7 @@ NetworkStatus GetNetworkStatus(bool interactive,
// Returns true if auto-update is disabled by the system administrator.
bool IsAutoUpdateDisabled() {
bool update_disabled = kDefaultAutoUpdateDisabled;
- chromeos::CrosSettings* settings = chromeos::CrosSettings::Get();
+ ash::CrosSettings* settings = ash::CrosSettings::Get();
if (!settings)
return update_disabled;
const base::Value* update_disabled_value =
@@ -77,7 +77,7 @@ bool IsAutoUpdateDisabled() {
return update_disabled;
}
-base::string16 GetConnectionTypeAsUTF16(const chromeos::NetworkState* network,
+std::u16string GetConnectionTypeAsUTF16(const chromeos::NetworkState* network,
bool metered) {
const std::string type = network->type();
if (chromeos::NetworkTypePattern::WiFi().MatchesType(type)) {
@@ -92,7 +92,7 @@ base::string16 GetConnectionTypeAsUTF16(const chromeos::NetworkState* network,
if (chromeos::NetworkTypePattern::VPN().MatchesType(type))
return l10n_util::GetStringUTF16(IDS_NETWORK_TYPE_VPN);
NOTREACHED();
- return base::string16();
+ return std::u16string();
}
// Returns whether an update is allowed. If not, it calls the callback with
@@ -120,7 +120,7 @@ bool EnsureCanUpdate(bool interactive,
0, l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE));
return false;
} else if (status == NETWORK_STATUS_DISALLOWED) {
- base::string16 message = l10n_util::GetStringFUTF16(
+ std::u16string message = l10n_util::GetStringFUTF16(
IDS_UPGRADE_DISALLOWED, GetConnectionTypeAsUTF16(network, metered));
callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0, false,
false, std::string(), 0, message);
@@ -182,10 +182,10 @@ void VersionUpdaterCros::CheckForUpdate(StatusCallback callback,
void VersionUpdaterCros::SetChannel(const std::string& channel,
bool is_powerwash_allowed) {
- OwnerSettingsServiceChromeOS* service =
+ OwnerSettingsServiceAsh* service =
context_
- ? OwnerSettingsServiceChromeOSFactory::GetInstance()
- ->GetForBrowserContext(context_)
+ ? OwnerSettingsServiceAshFactory::GetInstance()->GetForBrowserContext(
+ context_)
: nullptr;
// For local owner set the field in the policy blob.
if (service)
@@ -218,7 +218,7 @@ void VersionUpdaterCros::OnSetUpdateOverCellularOneTimePermission(
// show appropriate error message.
LOG(ERROR) << "Error setting update over cellular one time permission.";
callback_.Run(VersionUpdater::FAILED, 0, false, false, std::string(), 0,
- base::string16());
+ std::u16string());
}
}
@@ -274,7 +274,12 @@ void VersionUpdaterCros::UpdateStatusChanged(
int progress = 0;
std::string version = status.new_version();
int64_t size = status.new_size();
- base::string16 message;
+ std::u16string message;
+
+ // If the status change is for an installation, this means that DLCs are being
+ // installed and has nothing to with the OS. Ignore this status change.
+ if (status.is_install())
+ return;
// If the updater is currently idle, just show the last operation (unless it
// was previously checking for an update -- in that case, the system is
@@ -337,5 +342,5 @@ void VersionUpdaterCros::OnUpdateCheck(
// If version updating is not implemented, this binary is the most up-to-date
// possible with respect to automatic updating.
if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED)
- callback_.Run(UPDATED, 0, false, false, std::string(), 0, base::string16());
+ callback_.Run(UPDATED, 0, false, false, std::string(), 0, std::u16string());
}
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
index 5cfa1b71f6c..9a2737b7635 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
@@ -11,8 +11,9 @@
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
+#include "base/test/mock_callback.h"
+#include "chrome/browser/ash/login/users/mock_user_manager.h"
#include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_update_engine_client.h"
#include "chromeos/dbus/shill/shill_service_client.h"
@@ -23,8 +24,10 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
+using ::testing::_;
using ::testing::AtLeast;
using ::testing::Return;
+using ::testing::StrictMock;
namespace chromeos {
@@ -36,7 +39,7 @@ void CheckNotification(VersionUpdater::Status /* status */,
bool /* powerwash */,
const std::string& /* version */,
int64_t /* size */,
- const base::string16& /* message */) {}
+ const std::u16string& /* message */) {}
} // namespace
@@ -44,6 +47,8 @@ class VersionUpdaterCrosTest : public ::testing::Test {
protected:
VersionUpdaterCrosTest()
: version_updater_(VersionUpdater::Create(nullptr)),
+ version_updater_cros_ptr_(
+ reinterpret_cast<VersionUpdaterCros*>(version_updater_.get())),
fake_update_engine_client_(NULL),
mock_user_manager_(new MockUserManager()),
user_manager_enabler_(base::WrapUnique(mock_user_manager_)) {}
@@ -93,6 +98,7 @@ class VersionUpdaterCrosTest : public ::testing::Test {
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<VersionUpdater> version_updater_;
+ VersionUpdaterCros* version_updater_cros_ptr_;
FakeUpdateEngineClient* fake_update_engine_client_; // Not owned.
MockUserManager* mock_user_manager_; // Not owned.
@@ -189,4 +195,26 @@ TEST_F(VersionUpdaterCrosTest, CellularUpdateOneTimePermission) {
EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count());
}
+TEST_F(VersionUpdaterCrosTest, GetUpdateStatus_NoCallbackDuringInstallations) {
+ SetEthernetService();
+ update_engine::StatusResult status;
+ status.set_is_install(true);
+ fake_update_engine_client_->set_default_status(status);
+
+ // Expect the callback not to be called as it's an installation (not update).
+ StrictMock<base::MockCallback<VersionUpdater::StatusCallback>> mock_callback;
+ version_updater_cros_ptr_->GetUpdateStatus(mock_callback.Get());
+}
+
+TEST_F(VersionUpdaterCrosTest, GetUpdateStatus_CallbackDuringUpdates) {
+ SetEthernetService();
+ update_engine::StatusResult status;
+ fake_update_engine_client_->set_default_status(status);
+
+ // Expect the callbac kto be called as it's an update status change.
+ StrictMock<base::MockCallback<VersionUpdater::StatusCallback>> mock_callback;
+ EXPECT_CALL(mock_callback, Run(_, _, _, _, _, _, _)).Times(1);
+ version_updater_cros_ptr_->GetUpdateStatus(mock_callback.Get());
+}
+
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_mac.mm b/chromium/chrome/browser/ui/webui/help/version_updater_mac.mm
index cd5af02d88a..ba104fb06a4 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_mac.mm
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_mac.mm
@@ -179,7 +179,7 @@ void VersionUpdaterMac::CheckForUpdate(StatusCallback status_callback,
// There is no glue, or the application is on a read-only filesystem.
// Updates and promotions are impossible.
status_callback_.Run(DISABLED, 0, false, false, std::string(), 0,
- base::string16());
+ std::u16string());
}
#endif // BUILDFLAG(ENABLE_CHROMIUM_UPDATER)
}
@@ -209,7 +209,7 @@ void VersionUpdaterMac::UpdateStatus(NSDictionary* dictionary) {
[dictionary objectForKey:kAutoupdateStatusErrorMessages]));
bool enable_promote_button = true;
- base::string16 message;
+ std::u16string message;
Status status;
switch (keystone_status) {
@@ -269,7 +269,7 @@ void VersionUpdaterMac::UpdateStatus(NSDictionary* dictionary) {
case kAutoupdateNeedsPromotion: {
status = FAILED;
- base::string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
+ std::u16string product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
message =
l10n_util::GetStringFUTF16(IDS_PROMOTE_INFOBAR_TEXT, product_name);
} break;
@@ -288,13 +288,13 @@ void VersionUpdaterMac::UpdateStatus(NSDictionary* dictionary) {
if (status == FAILED) {
if (!message.empty()) {
- message += base::UTF8ToUTF16("<br/><br/>");
+ message += u"<br/><br/>";
}
message += l10n_util::GetStringUTF16(IDS_UPGRADE_ERROR_DETAILS);
- message += base::UTF8ToUTF16("<br/><pre>");
+ message += u"<br/><pre>";
message += base::UTF8ToUTF16(net::EscapeForHTML(error_messages));
- message += base::UTF8ToUTF16("</pre>");
+ message += u"</pre>";
}
}
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_win.cc b/chromium/chrome/browser/ui/webui/help/version_updater_win.cc
index 3bf62c5821c..58dd538a21f 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_win.cc
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_win.cc
@@ -31,12 +31,12 @@ void VersionUpdaterWin::CheckForUpdate(StatusCallback callback,
// There is no supported integration with Google Update for Chromium.
callback_ = std::move(callback);
- callback_.Run(CHECKING, 0, false, false, std::string(), 0, base::string16());
+ callback_.Run(CHECKING, 0, false, false, std::string(), 0, std::u16string());
DoBeginUpdateCheck(false /* !install_update_if_possible */);
}
void VersionUpdaterWin::OnUpdateCheckComplete(
- const base::string16& new_version) {
+ const std::u16string& new_version) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (new_version.empty()) {
// Google Update says that no new version is available. Check to see if a
@@ -52,27 +52,27 @@ void VersionUpdaterWin::OnUpdateCheckComplete(
// Notify the caller that the update is now beginning and initiate it.
DoBeginUpdateCheck(true /* install_update_if_possible */);
- callback_.Run(UPDATING, 0, false, false, std::string(), 0, base::string16());
+ callback_.Run(UPDATING, 0, false, false, std::string(), 0, std::u16string());
}
void VersionUpdaterWin::OnUpgradeProgress(int progress,
- const base::string16& new_version) {
+ const std::u16string& new_version) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
callback_.Run(UPDATING, progress, false, false, std::string(), 0,
- base::string16());
+ std::u16string());
}
-void VersionUpdaterWin::OnUpgradeComplete(const base::string16& new_version) {
+void VersionUpdaterWin::OnUpgradeComplete(const std::u16string& new_version) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
callback_.Run(NEARLY_UPDATED, 0, false, false, std::string(), 0,
- base::string16());
+ std::u16string());
}
void VersionUpdaterWin::OnError(GoogleUpdateErrorCode error_code,
- const base::string16& html_error_message,
- const base::string16& new_version) {
+ const std::u16string& html_error_message,
+ const std::u16string& new_version) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- base::string16 message;
+ std::u16string message;
Status status = FAILED;
switch (error_code) {
@@ -109,7 +109,7 @@ void VersionUpdaterWin::DoBeginUpdateCheck(bool install_update_if_possible) {
void VersionUpdaterWin::OnPendingRestartCheck(bool is_update_pending_restart) {
callback_.Run(is_update_pending_restart ? NEARLY_UPDATED : UPDATED, 0, false,
- false, std::string(), 0, base::string16());
+ false, std::string(), 0, std::u16string());
}
VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) {
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_win.h b/chromium/chrome/browser/ui/webui/help/version_updater_win.h
index c0207fc97ff..52b38cab205 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_win.h
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_win.h
@@ -8,9 +8,10 @@
#ifndef CHROME_BROWSER_UI_WEBUI_HELP_VERSION_UPDATER_WIN_H_
#define CHROME_BROWSER_UI_WEBUI_HELP_VERSION_UPDATER_WIN_H_
+#include <string>
+
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/google/google_update_win.h"
#include "chrome/browser/ui/webui/help/version_updater.h"
@@ -28,13 +29,13 @@ class VersionUpdaterWin : public VersionUpdater,
void CheckForUpdate(StatusCallback callback, PromoteCallback) override;
// UpdateCheckDelegate:
- void OnUpdateCheckComplete(const base::string16& new_version) override;
+ void OnUpdateCheckComplete(const std::u16string& new_version) override;
void OnUpgradeProgress(int progress,
- const base::string16& new_version) override;
- void OnUpgradeComplete(const base::string16& new_version) override;
+ const std::u16string& new_version) override;
+ void OnUpgradeComplete(const std::u16string& new_version) override;
void OnError(GoogleUpdateErrorCode error_code,
- const base::string16& html_error_message,
- const base::string16& new_version) override;
+ const std::u16string& html_error_message,
+ const std::u16string& new_version) override;
private:
void DoBeginUpdateCheck(bool install_update_if_possible);
diff --git a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
index 82a7b826eab..a02d986d94a 100644
--- a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
+++ b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -37,8 +37,8 @@
#include "components/favicon/core/fallback_url_util.h"
#include "components/favicon/core/large_icon_service.h"
#include "components/favicon_base/favicon_url_parser.h"
+#include "components/history_clusters/core/memories_features.h"
#include "components/keyed_service/core/service_access_type.h"
-#include "components/memories/core/memories_features.h"
#include "components/prefs/pref_service.h"
#include "components/query_parser/snippet.h"
#include "components/strings/grit/components_strings.h"
@@ -110,7 +110,7 @@ void SetHistoryEntryUrlAndTitle(
result->SetStringKey("url", entry.url.spec());
bool using_url_as_the_title = false;
- base::string16 title_to_set(entry.title);
+ std::u16string title_to_set(entry.title);
if (entry.title.empty()) {
using_url_as_the_title = true;
title_to_set = base::UTF8ToUTF16(entry.url.spec());
@@ -176,7 +176,7 @@ base::Value HistoryEntryToValue(
base::Value result(base::Value::Type::DICTIONARY);
SetHistoryEntryUrlAndTitle(entry, &result);
- base::string16 domain = url_formatter::IDNToUnicode(entry.url.host());
+ std::u16string domain = url_formatter::IDNToUnicode(entry.url.host());
// When the domain is empty, use the scheme instead. This allows for a
// sensible treatment of e.g. file: URLs when group by domain is on.
if (domain.empty())
@@ -205,9 +205,9 @@ base::Value HistoryEntryToValue(
// the monthly view.
result.SetStringKey("dateShort", base::TimeFormatShortDate(entry.time));
- base::string16 snippet_string;
- base::string16 date_relative_day;
- base::string16 date_time_of_day;
+ std::u16string snippet_string;
+ std::u16string date_relative_day;
+ std::u16string date_time_of_day;
bool is_blocked_visit = false;
int host_filtering_behavior = -1;
@@ -218,7 +218,7 @@ base::Value HistoryEntryToValue(
snippet_string = entry.snippet;
} else {
base::Time midnight = clock->Now().LocalMidnight();
- base::string16 date_str =
+ std::u16string date_str =
ui::TimeFormat::RelativeDate(entry.time, &midnight);
if (date_str.empty()) {
date_str = base::TimeFormatFriendlyDate(entry.time);
@@ -346,7 +346,7 @@ void BrowsingHistoryHandler::StartQueryHistory() {
this, local_history, sync_service);
// 150 = RESULTS_PER_PAGE from chrome/browser/resources/history/constants.js
- SendHistoryQuery(150, base::string16());
+ SendHistoryQuery(150, std::u16string());
}
void BrowsingHistoryHandler::HandleQueryHistory(const base::ListValue* args) {
@@ -386,7 +386,7 @@ void BrowsingHistoryHandler::HandleQueryHistory(const base::ListValue* args) {
}
void BrowsingHistoryHandler::SendHistoryQuery(int max_count,
- const base::string16& query) {
+ const std::u16string& query) {
history::QueryOptions options;
options.max_count = max_count;
options.duplicate_policy = history::QueryOptions::REMOVE_DUPLICATES_PER_DAY;
@@ -464,7 +464,7 @@ void BrowsingHistoryHandler::HandleClearBrowsingData(
}
void BrowsingHistoryHandler::HandleRemoveBookmark(const base::ListValue* args) {
- base::string16 url = ExtractStringValue(args);
+ std::u16string url = ExtractStringValue(args);
Profile* profile = GetProfile();
BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile);
bookmarks::RemoveAllBookmarks(model, GURL(url));
diff --git a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.h b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.h
index c473c8429a8..a1e7505aa74 100644
--- a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.h
+++ b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.h
@@ -69,7 +69,7 @@ class BrowsingHistoryHandler : public content::WebUIMessageHandler,
void set_clock(base::Clock* clock) { clock_ = clock; }
protected:
- virtual void SendHistoryQuery(int count, const base::string16& query);
+ virtual void SendHistoryQuery(int count, const std::u16string& query);
private:
FRIEND_TEST_ALL_PREFIXES(BrowsingHistoryHandlerTest,
diff --git a/chromium/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc b/chromium/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
index 80ad31e385f..939968a0428 100644
--- a/chromium/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
@@ -60,7 +60,7 @@ class BrowsingHistoryHandlerWithWebUIForTesting
test_clock_.SetNow(PretendNow());
}
- void SendHistoryQuery(int count, const base::string16& query) override {
+ void SendHistoryQuery(int count, const std::u16string& query) override {
if (postpone_query_results_) {
return;
}
diff --git a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
index 22615e8f91f..b9742ede3b8 100644
--- a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
+++ b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
@@ -270,7 +270,7 @@ void ForeignSessionHandler::InitializeForeignSessions() {
initial_session_list_ = GetForeignSessions();
}
-base::string16 ForeignSessionHandler::FormatSessionTime(
+std::u16string ForeignSessionHandler::FormatSessionTime(
const base::Time& time) {
// Return a time like "1 hour ago", "2 days ago", etc.
base::Time now = base::Time::Now();
diff --git a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
index 0766177760b..cb5ba68366b 100644
--- a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
+++ b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
@@ -79,7 +79,7 @@ class ForeignSessionHandler : public content::WebUIMessageHandler {
base::Value GetForeignSessions();
// Returns a string used to show the user when a session was last modified.
- base::string16 FormatSessionTime(const base::Time& time);
+ std::u16string FormatSessionTime(const base::Time& time);
// Determines which session is to be opened, and then calls
// OpenForeignSession, to begin the process of opening a new browser window.
diff --git a/chromium/chrome/browser/ui/webui/identity_internals_ui.cc b/chromium/chrome/browser/ui/webui/identity_internals_ui.cc
index 0d6ab3cdc3a..e253194506c 100644
--- a/chromium/chrome/browser/ui/webui/identity_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/identity_internals_ui.cc
@@ -11,7 +11,6 @@
#include "base/bind.h"
#include "base/i18n/time_formatting.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/identity/identity_api.h"
@@ -67,7 +66,7 @@ class IdentityInternalsUIMessageHandler : public content::WebUIMessageHandler {
// Gets a string representation of an expiration time of the access token in
// |token_cache_value|.
- base::string16 GetExpirationTime(
+ std::u16string GetExpirationTime(
const extensions::IdentityTokenCacheValue& token_cache_value);
// Converts a pair of |access_tokens_key| and |token_cache_value| to a
@@ -201,7 +200,7 @@ std::string IdentityInternalsUIMessageHandler::GetStatus(
return std::string();
}
-base::string16 IdentityInternalsUIMessageHandler::GetExpirationTime(
+std::u16string IdentityInternalsUIMessageHandler::GetExpirationTime(
const extensions::IdentityTokenCacheValue& token_cache_value) {
return base::TimeFormatFriendlyDateAndTime(
token_cache_value.expiration_time());
diff --git a/chromium/chrome/browser/ui/webui/inspect_ui.cc b/chromium/chrome/browser/ui/webui/inspect_ui.cc
index 4f6ab10cab3..469853c321b 100644
--- a/chromium/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chromium/chrome/browser/ui/webui/inspect_ui.cc
@@ -4,23 +4,29 @@
#include "chrome/browser/ui/webui/inspect_ui.h"
+#include <memory>
#include <utility>
#include "base/bind.h"
+#include "base/callback_forward.h"
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
#include "base/metrics/user_metrics.h"
+#include "base/values.h"
#include "chrome/browser/devtools/devtools_targets_ui.h"
#include "chrome/browser/devtools/devtools_ui_bindings.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/singleton_tabs.h"
+#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h"
#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "components/prefs/pref_service.h"
#include "components/ui_devtools/devtools_server.h"
+#include "components/ui_devtools/switches.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h"
@@ -29,6 +35,7 @@
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
+#include "ui/base/ui_base_features.h"
using content::DevToolsAgentHost;
using content::WebContents;
@@ -39,7 +46,6 @@ namespace {
const char kInspectUiInitUICommand[] = "init-ui";
const char kInspectUiInspectCommand[] = "inspect";
const char kInspectUiInspectFallbackCommand[] = "inspect-fallback";
-const char kInspectUiInspectAdditionalCommand[] = "inspect-additional";
const char kInspectUiActivateCommand[] = "activate";
const char kInspectUiCloseCommand[] = "close";
const char kInspectUiReloadCommand[] = "reload";
@@ -58,13 +64,14 @@ const char kInspectUiDiscoverTCPTargetsEnabledCommand[] =
"set-discover-tcp-targets-enabled";
const char kInspectUiTCPDiscoveryConfigCommand[] = "set-tcp-discovery-config";
const char kInspectUiOpenNodeFrontendCommand[] = "open-node-frontend";
+const char kInspectUiLaunchUIDevToolsCommand[] = "launch-ui-devtools";
const char kInspectUiPortForwardingDefaultPort[] = "8080";
const char kInspectUiPortForwardingDefaultLocation[] = "localhost:8080";
const char kInspectUiNameField[] = "name";
const char kInspectUiUrlField[] = "url";
-const char kInspectUiIsAdditionalField[] = "isAdditional";
+const char kInspectUiIsNativeField[] = "isNative";
base::Value GetUiDevToolsTargets() {
base::Value targets(base::Value::Type::LIST);
@@ -73,19 +80,95 @@ base::Value GetUiDevToolsTargets() {
base::Value target_data(base::Value::Type::DICTIONARY);
target_data.SetStringKey(kInspectUiNameField, client_pair.first);
target_data.SetStringKey(kInspectUiUrlField, client_pair.second);
- target_data.SetBoolKey(kInspectUiIsAdditionalField, true);
+ target_data.SetBoolKey(kInspectUiIsNativeField, true);
targets.Append(std::move(target_data));
}
return targets;
}
+// DevToolsFrontEndObserver ----------------------------------------
+
+class DevToolsFrontEndObserver : public content::WebContentsObserver {
+ public:
+ DevToolsFrontEndObserver(WebContents* web_contents, const GURL& url);
+ DevToolsFrontEndObserver(const DevToolsFrontEndObserver&) = delete;
+ DevToolsFrontEndObserver& operator=(const DevToolsFrontEndObserver&) = delete;
+ ~DevToolsFrontEndObserver() override = default;
+
+ void SetOnFrontEndFinished(base::OnceClosure callback);
+
+ protected:
+ // contents::WebContentsObserver
+ void WebContentsDestroyed() override;
+ void DidFinishNavigation(
+ content::NavigationHandle* navigation_handle) override;
+
+ private:
+ GURL url_;
+ // Callback function executed when the front end is finished.
+ base::OnceClosure on_front_end_finished_;
+};
+
+DevToolsFrontEndObserver::DevToolsFrontEndObserver(WebContents* web_contents,
+ const GURL& url)
+ : WebContentsObserver(web_contents), url_(url) {}
+
+void DevToolsFrontEndObserver::SetOnFrontEndFinished(
+ base::OnceClosure callback) {
+ on_front_end_finished_ = std::move(callback);
+}
+
+void DevToolsFrontEndObserver::WebContentsDestroyed() {
+ if (on_front_end_finished_)
+ std::move(on_front_end_finished_).Run();
+ delete this;
+}
+
+void DevToolsFrontEndObserver::DidFinishNavigation(
+ content::NavigationHandle* navigation_handle) {
+ if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted())
+ return;
+
+ if (url_ != navigation_handle->GetURL()) {
+ if (on_front_end_finished_)
+ std::move(on_front_end_finished_).Run();
+ delete this;
+ }
+}
+
+// DevToolsUIBindingsEnabler ----------------------------------------
+
+class DevToolsUIBindingsEnabler : public DevToolsFrontEndObserver {
+ public:
+ DevToolsUIBindingsEnabler(WebContents* web_contents, const GURL& url);
+ DevToolsUIBindingsEnabler(const DevToolsUIBindingsEnabler&) = delete;
+ DevToolsUIBindingsEnabler& operator=(const DevToolsUIBindingsEnabler&) =
+ delete;
+ ~DevToolsUIBindingsEnabler() override = default;
+
+ DevToolsUIBindings* GetBindings();
+
+ private:
+ DevToolsUIBindings bindings_;
+};
+
+DevToolsUIBindingsEnabler::DevToolsUIBindingsEnabler(WebContents* web_contents,
+ const GURL& url)
+ : DevToolsFrontEndObserver(web_contents, url), bindings_(web_contents) {}
+
+DevToolsUIBindings* DevToolsUIBindingsEnabler::GetBindings() {
+ return &bindings_;
+}
+
// InspectMessageHandler --------------------------------------------
class InspectMessageHandler : public WebUIMessageHandler {
public:
explicit InspectMessageHandler(InspectUI* inspect_ui)
: inspect_ui_(inspect_ui) {}
- ~InspectMessageHandler() override {}
+ InspectMessageHandler(const InspectMessageHandler&) = delete;
+ InspectMessageHandler& operator=(const InspectMessageHandler&) = delete;
+ ~InspectMessageHandler() override = default;
private:
// WebUIMessageHandler implementation.
@@ -94,7 +177,6 @@ class InspectMessageHandler : public WebUIMessageHandler {
void HandleInitUICommand(const base::ListValue* args);
void HandleInspectCommand(const base::ListValue* args);
void HandleInspectFallbackCommand(const base::ListValue* args);
- void HandleInspectAdditionalCommand(const base::ListValue* args);
void HandleActivateCommand(const base::ListValue* args);
void HandleCloseCommand(const base::ListValue* args);
void HandleReloadCommand(const base::ListValue* args);
@@ -106,10 +188,14 @@ class InspectMessageHandler : public WebUIMessageHandler {
void HandlePortForwardingConfigCommand(const base::ListValue* args);
void HandleTCPDiscoveryConfigCommand(const base::ListValue* args);
void HandleOpenNodeFrontendCommand(const base::ListValue* args);
+ void HandleLaunchUIDevToolsCommand(const base::ListValue* args);
+
+ void CreateNativeUIInspectionSession(const std::string& url);
+ void OnFrontEndFinished();
InspectUI* const inspect_ui_;
- DISALLOW_COPY_AND_ASSIGN(InspectMessageHandler);
+ base::WeakPtrFactory<InspectMessageHandler> weak_factory_{this};
};
void InspectMessageHandler::RegisterMessages() {
@@ -126,11 +212,6 @@ void InspectMessageHandler::RegisterMessages() {
base::BindRepeating(&InspectMessageHandler::HandleInspectFallbackCommand,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
- kInspectUiInspectAdditionalCommand,
- base::BindRepeating(
- &InspectMessageHandler::HandleInspectAdditionalCommand,
- base::Unretained(this)));
- web_ui()->RegisterMessageCallback(
kInspectUiActivateCommand,
base::BindRepeating(&InspectMessageHandler::HandleActivateCommand,
base::Unretained(this)));
@@ -163,6 +244,10 @@ void InspectMessageHandler::RegisterMessages() {
base::Unretained(this),
&prefs::kDevToolsDiscoverTCPTargetsEnabled[0]));
web_ui()->RegisterMessageCallback(
+ kInspectUiLaunchUIDevToolsCommand,
+ base::BindRepeating(&InspectMessageHandler::HandleLaunchUIDevToolsCommand,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
kInspectUiTCPDiscoveryConfigCommand,
base::BindRepeating(
&InspectMessageHandler::HandleTCPDiscoveryConfigCommand,
@@ -214,19 +299,6 @@ void InspectMessageHandler::HandleInspectFallbackCommand(
inspect_ui_->InspectFallback(source, id);
}
-void InspectMessageHandler::HandleInspectAdditionalCommand(
- const base::ListValue* args) {
- std::string url;
- if (ParseStringArgs(args, &url, nullptr)) {
- WebContents* inspect_ui = web_ui()->GetWebContents();
- web_ui()->GetWebContents()->GetDelegate()->OpenURLFromTab(
- inspect_ui,
- content::OpenURLParams(GURL(url), content::Referrer(),
- WindowOpenDisposition::NEW_FOREGROUND_TAB,
- ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false));
- }
-}
-
void InspectMessageHandler::HandleActivateCommand(const base::ListValue* args) {
std::string source;
std::string id;
@@ -316,51 +388,53 @@ void InspectMessageHandler::HandleOpenNodeFrontendCommand(
DevToolsWindow::OpenNodeFrontendWindow(profile);
}
-// DevToolsUIBindingsEnabler ----------------------------------------
-
-class DevToolsUIBindingsEnabler
- : public content::WebContentsObserver {
- public:
- DevToolsUIBindingsEnabler(WebContents* web_contents,
- const GURL& url);
- ~DevToolsUIBindingsEnabler() override {}
-
- DevToolsUIBindings* GetBindings();
-
- private:
- // contents::WebContentsObserver overrides.
- void WebContentsDestroyed() override;
- void DidFinishNavigation(
- content::NavigationHandle* navigation_handle) override;
-
- DevToolsUIBindings bindings_;
- GURL url_;
- DISALLOW_COPY_AND_ASSIGN(DevToolsUIBindingsEnabler);
-};
+void InspectMessageHandler::HandleLaunchUIDevToolsCommand(
+ const base::ListValue* args) {
+ // Start the UI DevTools server if needed and launch the front-end.
+ if (!ChromeBrowserMainExtraPartsViews::Get()->GetUiDevToolsServerInstance()) {
+ ChromeBrowserMainExtraPartsViews::Get()->CreateUiDevTools();
+
+ // Make the server only lasts for a session.
+ const ui_devtools::UiDevToolsServer* server =
+ ChromeBrowserMainExtraPartsViews::Get()->GetUiDevToolsServerInstance();
+ server->SetOnSessionEnded(base::BindOnce([]() {
+ if (ChromeBrowserMainExtraPartsViews::Get()
+ ->GetUiDevToolsServerInstance())
+ ChromeBrowserMainExtraPartsViews::Get()->DestroyUiDevTools();
+ }));
+ }
+ inspect_ui_->PopulateNativeUITargets(GetUiDevToolsTargets());
-DevToolsUIBindingsEnabler::DevToolsUIBindingsEnabler(
- WebContents* web_contents,
- const GURL& url)
- : WebContentsObserver(web_contents),
- bindings_(web_contents),
- url_(url) {
+ std::vector<ui_devtools::UiDevToolsServer::NameUrlPair> pairs =
+ ui_devtools::UiDevToolsServer::GetClientNamesAndUrls();
+ if (!pairs.empty())
+ CreateNativeUIInspectionSession(pairs[0].second);
}
-DevToolsUIBindings* DevToolsUIBindingsEnabler::GetBindings() {
- return &bindings_;
-}
+void InspectMessageHandler::CreateNativeUIInspectionSession(
+ const std::string& url) {
+ WebContents* inspect_ui = web_ui()->GetWebContents();
+ const GURL gurl(url);
+ content::WebContents* front_end = inspect_ui->GetDelegate()->OpenURLFromTab(
+ inspect_ui,
+ content::OpenURLParams(gurl, content::Referrer(),
+ WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false));
+ // When the front-end is started, disable the launch button.
+ inspect_ui_->ShowNativeUILaunchButton(/* enabled = */ false);
-void DevToolsUIBindingsEnabler::WebContentsDestroyed() {
- delete this;
+ // The observer will delete itself when the front-end finishes.
+ DevToolsFrontEndObserver* front_end_observer =
+ new DevToolsFrontEndObserver(front_end, gurl);
+ front_end_observer->SetOnFrontEndFinished(base::BindOnce(
+ &InspectMessageHandler::OnFrontEndFinished, weak_factory_.GetWeakPtr()));
}
-void DevToolsUIBindingsEnabler::DidFinishNavigation(
- content::NavigationHandle* navigation_handle) {
- if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted())
- return;
-
- if (url_ != navigation_handle->GetURL())
- delete this;
+void InspectMessageHandler::OnFrontEndFinished() {
+ // Clear the client list and re-enable the launch button when the front-end is
+ // gone.
+ inspect_ui_->PopulateNativeUITargets(base::ListValue());
+ inspect_ui_->ShowNativeUILaunchButton(/* enabled = */ true);
}
} // namespace
@@ -507,7 +581,12 @@ void InspectUI::StartListeningNotifications() {
DevToolsTargetsUIHandler::Callback callback =
base::BindRepeating(&InspectUI::PopulateTargets, base::Unretained(this));
- PopulateAdditionalTargets(GetUiDevToolsTargets());
+ // Show native UI launch button according to the command line or feature flag.
+ if (ui_devtools::UiDevToolsServer::IsUiDevToolsEnabled(
+ ui_devtools::switches::kEnableUiDevTools) ||
+ base::FeatureList::IsEnabled(features::kUIDebugTools)) {
+ ShowNativeUILaunchButton(/* enabled = */ true);
+ }
AddTargetUIHandler(
DevToolsTargetsUIHandler::CreateForLocal(callback, profile));
@@ -659,8 +738,8 @@ void InspectUI::PopulateTargets(const std::string& source,
targets);
}
-void InspectUI::PopulateAdditionalTargets(const base::Value& targets) {
- web_ui()->CallJavascriptFunctionUnsafe("populateAdditionalTargets", targets);
+void InspectUI::PopulateNativeUITargets(const base::Value& targets) {
+ web_ui()->CallJavascriptFunctionUnsafe("populateNativeUITargets", targets);
}
void InspectUI::PopulatePortStatus(base::Value status) {
@@ -671,3 +750,8 @@ void InspectUI::PopulatePortStatus(base::Value status) {
void InspectUI::ShowIncognitoWarning() {
web_ui()->CallJavascriptFunctionUnsafe("showIncognitoWarning");
}
+
+void InspectUI::ShowNativeUILaunchButton(bool enabled) {
+ web_ui()->CallJavascriptFunctionUnsafe("showNativeUILaunchButton",
+ base::Value(enabled));
+}
diff --git a/chromium/chrome/browser/ui/webui/inspect_ui.h b/chromium/chrome/browser/ui/webui/inspect_ui.h
index 2537c923c42..0a89ad8e944 100644
--- a/chromium/chrome/browser/ui/webui/inspect_ui.h
+++ b/chromium/chrome/browser/ui/webui/inspect_ui.h
@@ -34,6 +34,8 @@ class InspectUI : public content::WebUIController,
public content::WebContentsObserver {
public:
explicit InspectUI(content::WebUI* web_ui);
+ InspectUI(const InspectUI&) = delete;
+ InspectUI& operator=(const InspectUI&) = delete;
~InspectUI() override;
void InitUI();
@@ -52,6 +54,9 @@ class InspectUI : public content::WebUIController,
const std::string& browser_id,
const GURL& frontend_url);
+ void PopulateNativeUITargets(const base::Value& targets);
+ void ShowNativeUILaunchButton(bool enabled);
+
static void InspectDevices(Browser* browser);
private:
@@ -84,8 +89,6 @@ class InspectUI : public content::WebUIController,
void PopulateTargets(const std::string& source_id,
const base::ListValue& targets);
- void PopulateAdditionalTargets(const base::Value& targets);
-
void PopulatePortStatus(base::Value status);
void ShowIncognitoWarning();
@@ -97,8 +100,6 @@ class InspectUI : public content::WebUIController,
target_handlers_;
std::unique_ptr<PortForwardingStatusSerializer> port_status_serializer_;
-
- DISALLOW_COPY_AND_ASSIGN(InspectUI);
};
#endif // CHROME_BROWSER_UI_WEBUI_INSPECT_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/internals/internals_ui.cc b/chromium/chrome/browser/ui/webui/internals/internals_ui.cc
index eea2d029d97..66e8bbd9791 100644
--- a/chromium/chrome/browser/ui/webui/internals/internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/internals/internals_ui.cc
@@ -6,6 +6,8 @@
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
+#include "chrome/grit/internals_resources.h"
+#include "chrome/grit/internals_resources_map.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -14,6 +16,7 @@
#include "chrome/browser/ui/webui/internals/notifications/notifications_internals_ui_message_handler.h"
#include "chrome/browser/ui/webui/internals/query_tiles/query_tiles_internals_ui_message_handler.h"
#else
+#include "chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h"
#include "chrome/browser/ui/webui/internals/web_app/web_app_internals_page_handler_impl.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#endif // defined(OS_ANDROID)
@@ -22,18 +25,28 @@ InternalsUI::InternalsUI(content::WebUI* web_ui)
: ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/true) {
profile_ = Profile::FromWebUI(web_ui);
source_ = content::WebUIDataSource::Create(chrome::kChromeUIInternalsHost);
+ source_->AddResourcePaths(
+ base::make_span(kInternalsResources, kInternalsResourcesSize));
// Add your sub-URL internals WebUI here.
// Keep this set of sub-URLs in sync with |kChromeInternalsPathURLs|.
#if defined(OS_ANDROID)
// chrome://internals/notifications
- AddNotificationsInternals(web_ui);
+ source_->AddResourcePath(
+ "notifications",
+ IDR_NOTIFICATIONS_INTERNALS_NOTIFICATIONS_INTERNALS_HTML);
+ web_ui->AddMessageHandler(
+ std::make_unique<NotificationsInternalsUIMessageHandler>(profile_));
+
// chrome://internals/query-tiles
if (!profile_->IsOffTheRecord())
AddQueryTilesInternals(web_ui);
#else
+ source_->AddResourcePath("hello-ts", IDR_HELLO_TS_HELLO_TS_HTML);
+
// chrome://internals/web-app
WebAppInternalsPageHandlerImpl::AddPageResources(source_);
+ UserEducationInternalsPageHandlerImpl::AddPageResources(source_);
#endif // defined(OS_ANDROID)
content::WebUIDataSource::Add(profile_, source_);
@@ -42,17 +55,6 @@ InternalsUI::InternalsUI(content::WebUI* web_ui)
InternalsUI::~InternalsUI() = default;
#if defined(OS_ANDROID)
-void InternalsUI::AddNotificationsInternals(content::WebUI* web_ui) {
- source_->AddResourcePath("notifications_internals.js",
- IDR_NOTIFICATIONS_INTERNALS_JS);
- source_->AddResourcePath("notifications_internals_browser_proxy.js",
- IDR_NOTIFICATIONS_INTERNALS_BROWSER_PROXY_JS);
- source_->AddResourcePath("notifications", IDR_NOTIFICATIONS_INTERNALS_HTML);
-
- web_ui->AddMessageHandler(
- std::make_unique<NotificationsInternalsUIMessageHandler>(profile_));
-}
-
void InternalsUI::AddQueryTilesInternals(content::WebUI* web_ui) {
source_->AddResourcePath("query_tiles_internals.js",
IDR_QUERY_TILES_INTERNALS_JS);
@@ -70,6 +72,15 @@ void InternalsUI::BindInterface(
std::make_unique<WebAppInternalsPageHandlerImpl>(profile_),
std::move(receiver));
}
+
+void InternalsUI::BindInterface(
+ mojo::PendingReceiver<
+ mojom::user_education_internals::UserEducationInternalsPageHandler>
+ receiver) {
+ mojo::MakeSelfOwnedReceiver(
+ std::make_unique<UserEducationInternalsPageHandlerImpl>(profile_),
+ std::move(receiver));
+}
#endif // defined(OS_ANDROID)
WEB_UI_CONTROLLER_TYPE_IMPL(InternalsUI)
diff --git a/chromium/chrome/browser/ui/webui/internals/internals_ui.h b/chromium/chrome/browser/ui/webui/internals/internals_ui.h
index 642d2b94773..22bc3b14be8 100644
--- a/chromium/chrome/browser/ui/webui/internals/internals_ui.h
+++ b/chromium/chrome/browser/ui/webui/internals/internals_ui.h
@@ -13,6 +13,7 @@
#if !defined(OS_ANDROID)
// gn check doesn't understand "#if !defined(OS_ANDROID)" and fails this
// non-Android include on Android.
+#include "chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom.h" // nogncheck
#include "chrome/browser/ui/webui/internals/web_app/web_app_internals.mojom.h" // nogncheck
#endif
@@ -31,6 +32,10 @@ class InternalsUI : public ui::MojoWebUIController {
void BindInterface(
mojo::PendingReceiver<
mojom::web_app_internals::WebAppInternalsPageHandler> receiver);
+ void BindInterface(
+ mojo::PendingReceiver<
+ mojom::user_education_internals::UserEducationInternalsPageHandler>
+ receiver);
#endif // !defined(OS_ANDROID)
private:
@@ -39,9 +44,6 @@ class InternalsUI : public ui::MojoWebUIController {
#if defined(OS_ANDROID)
// Add resources and message handler for chrome://internals/query-tiles.
void AddQueryTilesInternals(content::WebUI* web_ui);
-
- // Add resources and message handler for chrome://internals/notifications.
- void AddNotificationsInternals(content::WebUI* web_ui);
#endif // defined(OS_ANDROID)
Profile* profile_;
diff --git a/chromium/chrome/browser/ui/webui/internals/user_education/BUILD.gn b/chromium/chrome/browser/ui/webui/internals/user_education/BUILD.gn
new file mode 100644
index 00000000000..4d169e7dfb7
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/internals/user_education/BUILD.gn
@@ -0,0 +1,10 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+ sources = [ "user_education_internals.mojom" ]
+ webui_module_path = "/chrome/browser/ui/webui/internals/user_education"
+}
diff --git a/chromium/chrome/browser/ui/webui/internals/user_education/OWNERS b/chromium/chrome/browser/ui/webui/internals/user_education/OWNERS
new file mode 100644
index 00000000000..e9722c4ce2e
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/internals/user_education/OWNERS
@@ -0,0 +1,4 @@
+file://chrome/browser/ui/user_education/OWNERS
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom
new file mode 100644
index 00000000000..bbca5549d9c
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom
@@ -0,0 +1,12 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module mojom.user_education_internals;
+
+// Provides access to browser-side user education data (including IPH) for
+// chrome://internals/user-education
+interface UserEducationInternalsPageHandler {
+ // TODO(crbug.com/1194751): add methods for getting list of tutorials
+ // and starting a tutorial.
+};
diff --git a/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.cc b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.cc
new file mode 100644
index 00000000000..84e2507ebd7
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.cc
@@ -0,0 +1,33 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h"
+
+#include "chrome/grit/dev_ui_browser_resources.h"
+#include "ui/base/webui/resource_path.h"
+
+UserEducationInternalsPageHandlerImpl::UserEducationInternalsPageHandlerImpl(
+ Profile* profile)
+/* : profile_(profile) */ {
+ // TODO(crbug.com/1194751): get reference to tutorial registry (once
+ // implemented).
+}
+
+UserEducationInternalsPageHandlerImpl::
+ ~UserEducationInternalsPageHandlerImpl() = default;
+
+// static
+void UserEducationInternalsPageHandlerImpl::AddPageResources(
+ content::WebUIDataSource* source) {
+ static const webui::ResourcePath kResources[] = {
+ {"user-education", IDR_USER_EDUCATION_INTERNALS_HTML},
+ {"user_education_internals.js", IDR_USER_EDUCATION_INTERNALS_JS},
+ {"chrome/browser/ui/webui/internals/user_education/"
+ "user_education_internals.mojom-webui.js",
+ IDR_USER_EDUCATION_INTERNALS_MOJOM_WEBUI_JS},
+ };
+
+ source->DisableTrustedTypesCSP();
+ source->AddResourcePaths(kResources);
+}
diff --git a/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h
new file mode 100644
index 00000000000..9bb72d6c278
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/internals/user_education/user_education_internals_page_handler_impl.h
@@ -0,0 +1,32 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_INTERNALS_USER_EDUCATION_USER_EDUCATION_INTERNALS_PAGE_HANDLER_IMPL_H_
+#define CHROME_BROWSER_UI_WEBUI_INTERNALS_USER_EDUCATION_USER_EDUCATION_INTERNALS_PAGE_HANDLER_IMPL_H_
+
+#include <string>
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/internals/user_education/user_education_internals.mojom.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+class UserEducationInternalsPageHandlerImpl
+ : public mojom::user_education_internals::
+ UserEducationInternalsPageHandler {
+ public:
+ explicit UserEducationInternalsPageHandlerImpl(Profile* profile);
+ ~UserEducationInternalsPageHandlerImpl() override;
+
+ UserEducationInternalsPageHandlerImpl(
+ const UserEducationInternalsPageHandlerImpl&) = delete;
+ UserEducationInternalsPageHandlerImpl& operator=(
+ const UserEducationInternalsPageHandlerImpl&) = delete;
+
+ static void AddPageResources(content::WebUIDataSource* source);
+
+ private:
+ // Profile* profile_ = nullptr;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_INTERNALS_USER_EDUCATION_USER_EDUCATION_INTERNALS_PAGE_HANDLER_IMPL_H_
diff --git a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
index 5d253117976..61e783625fe 100644
--- a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -273,7 +273,7 @@ std::unique_ptr<LookalikeUrlBlockingPage> CreateLookalikeInterstitialPage(
}
return std::make_unique<LookalikeUrlBlockingPage>(
web_contents, safe_url, request_url, ukm::kInvalidSourceId,
- LookalikeUrlMatchType::kNone, false,
+ LookalikeUrlMatchType::kNone, false, /*triggered_by_initial_url=*/false,
std::make_unique<LookalikeUrlControllerClient>(web_contents, request_url,
safe_url));
}
diff --git a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
index a473e4c6acb..8b5de78a39a 100644
--- a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
@@ -32,7 +32,7 @@ class InterstitialUITest : public InProcessBrowserTest {
// in the rendered page. Thus an empty body_text never fails.
void TestInterstitial(GURL url,
const std::string& page_title,
- const base::string16& body_text) {
+ const std::u16string& body_text) {
ui_test_utils::NavigateToURL(browser(), url);
EXPECT_EQ(
base::ASCIIToUTF16(page_title),
@@ -58,7 +58,7 @@ class InterstitialUITest : public InProcessBrowserTest {
// Convenience function to test interstitial pages without provided body_text.
void TestInterstitial(GURL url,
const std::string& page_title) {
- TestInterstitial(url, page_title, base::string16());
+ TestInterstitial(url, page_title, std::u16string());
}
// Convenience function to test interstitial pages with l10n message_ids as
@@ -102,17 +102,15 @@ IN_PROC_BROWSER_TEST_F(InterstitialUITest, MITMSoftwareInterstitial) {
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, PinnedCertInterstitial) {
- TestInterstitial(
- GURL("chrome://interstitials/ssl?type=hpkp_failure"),
- "Privacy error",
- base::ASCIIToUTF16("NET::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN"));
+ TestInterstitial(GURL("chrome://interstitials/ssl?type=hpkp_failure"),
+ "Privacy error",
+ u"NET::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, CTInterstitial) {
- TestInterstitial(
- GURL("chrome://interstitials/ssl?type=ct_failure"),
- "Privacy error",
- base::ASCIIToUTF16("NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED"));
+ TestInterstitial(GURL("chrome://interstitials/ssl?type=ct_failure"),
+ "Privacy error",
+ u"NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, MalwareInterstitial) {
@@ -184,18 +182,18 @@ IN_PROC_BROWSER_TEST_F(InterstitialUITest, CaptivePortalInterstitialWifi) {
IN_PROC_BROWSER_TEST_F(InterstitialUITest, OriginPolicyErrorInterstitial) {
TestInterstitial(GURL("chrome://interstitials/origin_policy"),
"Origin Policy Error",
- base::ASCIIToUTF16("has requested that an origin policy"));
+ u"has requested that an origin policy");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, BlockedInterceptionInterstitial) {
TestInterstitial(GURL("chrome://interstitials/blocked-interception"),
"Your activity on example.com is being monitored",
- base::ASCIIToUTF16("Anything you type"));
+ u"Anything you type");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, LegacyTLSInterstitial) {
TestInterstitial(GURL("chrome://interstitials/legacy-tls"), "Privacy error",
- base::ASCIIToUTF16("outdated security configuration"));
+ u"outdated security configuration");
}
// Tests that back button works after opening an interstitial from
@@ -208,9 +206,9 @@ IN_PROC_BROWSER_TEST_F(InterstitialUITest, InterstitialBackButton) {
content::TestNavigationObserver navigation_observer(web_contents);
chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
navigation_observer.Wait();
- base::string16 title;
+ std::u16string title;
ui_test_utils::GetCurrentTabTitle(browser(), &title);
- EXPECT_EQ(title, base::ASCIIToUTF16("Interstitials"));
+ EXPECT_EQ(title, u"Interstitials");
}
// Tests that view-source: works correctly on chrome://interstitials.
@@ -218,8 +216,7 @@ IN_PROC_BROWSER_TEST_F(InterstitialUITest, InterstitialViewSource) {
ui_test_utils::NavigateToURL(browser(),
GURL("view-source:chrome://interstitials/"));
int found;
- base::string16 expected_title =
- base::ASCIIToUTF16("<title>Interstitials</title>");
+ std::u16string expected_title = u"<title>Interstitials</title>";
found = ui_test_utils::FindInPage(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title,
true, /* Forward */
@@ -244,8 +241,7 @@ IN_PROC_BROWSER_TEST_F(InterstitialUITest,
ui_test_utils::NavigateToURL(browser(),
GURL("view-source:chrome://interstitials/ssl"));
int found;
- base::string16 expected_title =
- base::ASCIIToUTF16("<title>Privacy error</title");
+ std::u16string expected_title = u"<title>Privacy error</title";
found = ui_test_utils::FindInPage(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title,
true, /* Forward */
diff --git a/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc b/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
index 592aa41140e..b86400fd2a8 100644
--- a/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
@@ -38,7 +38,7 @@ class LogWebUIUrlTest : public InProcessBrowserTest {
void RunTest(int title_ids, const GURL& url) {
auto* tab = browser()->tab_strip_model()->GetActiveWebContents();
- base::string16 title = l10n_util::GetStringUTF16(title_ids);
+ std::u16string title = l10n_util::GetStringUTF16(title_ids);
content::TitleWatcher title_watcher(tab, title);
ui_test_utils::NavigateToURL(browser(), url);
ASSERT_EQ(title, title_watcher.WaitAndGetTitle());
diff --git a/chromium/chrome/browser/ui/webui/management/management_a11y_browsertest.cc b/chromium/chrome/browser/ui/webui/management/management_a11y_browsertest.cc
index 2a5415deffe..4fe063c185e 100644
--- a/chromium/chrome/browser/ui/webui/management/management_a11y_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/management/management_a11y_browsertest.cc
@@ -20,6 +20,7 @@ void ManagementA11yUIBrowserTest::InstallPowerfulPolicyEnforcedExtension() {
extensions::ChromeTestExtensionLoader loader(browser()->profile());
loader.set_ignore_manifest_warnings(true);
loader.set_grant_permissions(true);
- loader.set_location(extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD);
+ loader.set_location(
+ extensions::mojom::ManifestLocation::kExternalPolicyDownload);
loader.LoadExtension(test_data_dir_.AppendASCII("good.crx"));
}
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui.cc b/chromium/chrome/browser/ui/webui/management/management_ui.cc
index 946dfdf4454..90dbd7d950d 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui.cc
+++ b/chromium/chrome/browser/ui/webui/management/management_ui.cc
@@ -66,6 +66,7 @@ content::WebUIDataSource* CreateManagementUIHtmlSource(Profile* profile) {
{kManagementReportAppInfoAndActivity,
IDS_MANAGEMENT_REPORT_APP_INFO_AND_ACTIVITY},
{kManagementPrinting, IDS_MANAGEMENT_REPORT_PRINTING},
+ {kManagementReportPrintJobs, IDS_MANAGEMENT_REPORT_PRINT_JOBS},
{kManagementCrostini, IDS_MANAGEMENT_CROSTINI},
{kManagementCrostiniContainerConfiguration,
IDS_MANAGEMENT_CROSTINI_CONTAINER_CONFIGURATION},
@@ -87,6 +88,8 @@ content::WebUIDataSource* CreateManagementUIHtmlSource(Profile* profile) {
{"searchPrompt", IDS_SETTINGS_SEARCH_PROMPT},
{"clearSearch", IDS_CLEAR_SEARCH},
{"backButton", IDS_ACCNAME_BACK},
+ {"managedWebsites", IDS_MANAGEMENT_MANAGED_WEBSITES},
+ {"managedWebsitesSubtitle", IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION},
{kManagementExtensionReportMachineName,
IDS_MANAGEMENT_EXTENSION_REPORT_MACHINE_NAME},
{kManagementExtensionReportMachineNameAddress,
@@ -156,7 +159,7 @@ base::RefCountedMemory* ManagementUI::GetFaviconResourceBytes(
}
// static
-base::string16 ManagementUI::GetManagementPageSubtitle(Profile* profile) {
+std::u16string ManagementUI::GetManagementPageSubtitle(Profile* profile) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui.h b/chromium/chrome/browser/ui/webui/management/management_ui.h
index a0ebd2e2d12..0136e7d3990 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui.h
+++ b/chromium/chrome/browser/ui/webui/management/management_ui.h
@@ -27,7 +27,7 @@ class ManagementUI : public content::WebUIController {
static base::RefCountedMemory* GetFaviconResourceBytes(
ui::ScaleFactor scale_factor);
- static base::string16 GetManagementPageSubtitle(Profile* profile);
+ static std::u16string GetManagementPageSubtitle(Profile* profile);
private:
DISALLOW_COPY_AND_ASSIGN(ManagementUI);
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/management/management_ui_browsertest.cc
index 403dff1816a..128e265eeed 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/management/management_ui_browsertest.cc
@@ -35,11 +35,11 @@ class ManagementUITest : public InProcessBrowserTest {
}
void VerifyTexts(base::Value* actual_values,
- std::map<std::string, base::string16>& expected_values) {
+ std::map<std::string, std::u16string>& expected_values) {
base::DictionaryValue* values_as_dict = NULL;
actual_values->GetAsDictionary(&values_as_dict);
for (const auto& val : expected_values) {
- base::string16 actual_value;
+ std::u16string actual_value;
values_as_dict->GetString(val.first, &actual_value);
ASSERT_EQ(actual_value, val.second);
}
@@ -76,7 +76,7 @@ IN_PROC_BROWSER_TEST_F(ManagementUITest, ManagementStateChange) {
std::unique_ptr<base::Value> unmanaged_value_ptr =
base::JSONReader::ReadDeprecated(unmanaged_json);
- std::map<std::string, base::string16> expected_unmanaged_values{
+ std::map<std::string, std::u16string> expected_unmanaged_values{
{"browserManagementNotice",
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
@@ -85,6 +85,8 @@ IN_PROC_BROWSER_TEST_F(ManagementUITest, ManagementStateChange) {
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED)},
{"pageSubtitle",
l10n_util::GetStringUTF16(IDS_MANAGEMENT_NOT_MANAGED_SUBTITLE)},
+ {"managedWebsitesSubtitle",
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION)},
};
VerifyTexts(unmanaged_value_ptr.get(), expected_unmanaged_values);
@@ -107,7 +109,7 @@ IN_PROC_BROWSER_TEST_F(ManagementUITest, ManagementStateChange) {
std::unique_ptr<base::Value> managed_value_ptr =
base::JSONReader::ReadDeprecated(managed_json);
- std::map<std::string, base::string16> expected_managed_values{
+ std::map<std::string, std::u16string> expected_managed_values{
{"browserManagementNotice",
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_BROWSER_NOTICE,
@@ -115,7 +117,8 @@ IN_PROC_BROWSER_TEST_F(ManagementUITest, ManagementStateChange) {
{"extensionReportingTitle",
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED)},
{"pageSubtitle", l10n_util::GetStringUTF16(IDS_MANAGEMENT_SUBTITLE)},
- };
+ {"managedWebsitesSubtitle",
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION)}};
VerifyTexts(managed_value_ptr.get(), expected_managed_values);
}
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui_handler.cc b/chromium/chrome/browser/ui/webui/management/management_ui_handler.cc
index f812f8e304f..fb6f853726a 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -21,9 +21,12 @@
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/device_api/managed_configuration_api.h"
+#include "chrome/browser/device_api/managed_configuration_api_factory.h"
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/managed_ui.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
@@ -31,7 +34,6 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "extensions/buildflags/buildflags.h"
-#include "google_apis/gaia/gaia_auth_util.h"
#include "net/base/load_flags.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/referrer_policy.h"
@@ -39,11 +41,11 @@
#include "ui/base/webui/web_ui_util.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
#include "chrome/browser/chromeos/crostini/crostini_features.h"
#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
#include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h"
@@ -167,6 +169,7 @@ const char kManagementReportAppInfoAndActivity[] =
const char kManagementReportExtensions[] = "managementReportExtensions";
const char kManagementReportAndroidApplications[] =
"managementReportAndroidApplications";
+const char kManagementReportPrintJobs[] = "managementReportPrintJobs";
const char kManagementPrinting[] = "managementPrinting";
const char kManagementCrostini[] = "managementCrostini";
const char kManagementCrostiniContainerConfiguration[] =
@@ -210,6 +213,7 @@ enum class DeviceReportingType {
kAppInfoAndActivity,
kLogs,
kPrint,
+ kPrintJobs,
kCrostini,
kUsername,
kExtensions,
@@ -235,6 +239,8 @@ std::string ToJSDeviceReportingType(const DeviceReportingType& type) {
return "logs";
case DeviceReportingType::kPrint:
return "print";
+ case DeviceReportingType::kPrintJobs:
+ return "print jobs";
case DeviceReportingType::kCrostini:
return "crostini";
case DeviceReportingType::kUsername:
@@ -322,44 +328,10 @@ const char* GetReportingTypeValue(ReportingType reportingType) {
} // namespace
-std::string GetAccountDomain(Profile* profile) {
- if (!IsProfileManaged(profile))
- return std::string();
- auto username = profile->GetProfileUserName();
- size_t email_separator_pos = username.find('@');
- bool is_email = email_separator_pos != std::string::npos &&
- email_separator_pos < username.length() - 1;
-
- if (!is_email)
- return std::string();
-
- const std::string domain = gaia::ExtractDomainName(std::move(username));
-
- return (domain == "gmail.com" || domain == "googlemail.com") ? std::string()
- : domain;
-}
-
std::string ManagementUIHandler::GetAccountManager(Profile* profile) {
- if (!IsProfileManaged(profile))
- return std::string();
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
- const policy::UserCloudPolicyManagerChromeOS* user_cloud_policy_manager =
- profile->GetUserCloudPolicyManagerChromeOS();
-#else
- const policy::UserCloudPolicyManager* user_cloud_policy_manager =
- profile->GetUserCloudPolicyManager();
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
-
- if (user_cloud_policy_manager) {
- const enterprise_management::PolicyData* policy =
- user_cloud_policy_manager->core()->store()->policy();
- if (policy && policy->has_managed_by()) {
- return policy->managed_by();
- }
- }
-
- return GetAccountDomain(profile);
+ base::Optional<std::string> account_manager =
+ chrome::GetAccountManagerIdentity(profile);
+ return account_manager ? *account_manager : std::string();
}
ManagementUIHandler::ManagementUIHandler() {
@@ -420,6 +392,10 @@ void ManagementUIHandler::RegisterMessages() {
base::BindRepeating(&ManagementUIHandler::HandleGetThreatProtectionInfo,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
+ "getManagedWebsites",
+ base::BindRepeating(&ManagementUIHandler::HandleGetManagedWebsites,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
"initBrowserReportingInfo",
base::BindRepeating(&ManagementUIHandler::HandleInitBrowserReportingInfo,
base::Unretained(this)));
@@ -583,8 +559,17 @@ void ManagementUIHandler::AddDeviceReportingInfo(
DeviceReportingType::kLogs);
}
- if (profile->GetPrefs()->GetBoolean(
- prefs::kPrintingSendUsernameAndFilenameEnabled)) {
+ bool report_print_jobs = false;
+ chromeos::CrosSettings::Get()->GetBoolean(chromeos::kReportDevicePrintJobs,
+ &report_print_jobs);
+ if (report_print_jobs) {
+ AddDeviceReportingElement(report_sources, kManagementReportPrintJobs,
+ DeviceReportingType::kPrintJobs);
+ }
+
+ bool report_print_username = profile->GetPrefs()->GetBoolean(
+ prefs::kPrintingSendUsernameAndFilenameEnabled);
+ if (report_print_username && !report_print_jobs) {
AddDeviceReportingElement(report_sources, kManagementPrinting,
DeviceReportingType::kPrint);
}
@@ -638,8 +623,8 @@ void ManagementUIHandler::AddUpdateRequiredEolInfo(
base::UTF8ToUTF16(GetDeviceManager()),
ui::GetChromeOSDeviceName()));
std::string eol_admin_message;
- chromeos::CrosSettings::Get()->GetString(
- chromeos::kDeviceMinimumVersionAueMessage, &eol_admin_message);
+ ash::CrosSettings::Get()->GetString(chromeos::kDeviceMinimumVersionAueMessage,
+ &eol_admin_message);
response->SetStringPath("eolAdminMessage", eol_admin_message);
}
@@ -697,6 +682,9 @@ base::Value ManagementUIHandler::GetContextualManagedData(Profile* profile) {
response.SetStringPath(
"extensionReportingTitle",
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ response.SetStringPath(
+ "managedWebsitesSubtitle",
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
#if !BUILDFLAG(IS_CHROMEOS_ASH)
response.SetStringPath(
@@ -720,6 +708,10 @@ base::Value ManagementUIHandler::GetContextualManagedData(Profile* profile) {
"extensionReportingTitle",
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
base::UTF8ToUTF16(enterprise_manager)));
+ response.SetStringPath("managedWebsitesSubtitle",
+ l10n_util::GetStringFUTF16(
+ IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ base::UTF8ToUTF16(enterprise_manager)));
#if !BUILDFLAG(IS_CHROMEOS_ASH)
response.SetStringPath(
@@ -827,6 +819,22 @@ base::Value ManagementUIHandler::GetThreatProtectionInfo(
return result;
}
+base::Value ManagementUIHandler::GetManagedWebsitesInfo(
+ Profile* profile) const {
+ base::Value managed_websites(base::Value::Type::LIST);
+ auto* managed_configuration =
+ ManagedConfigurationAPIFactory::GetForProfile(profile);
+
+ if (!managed_configuration)
+ return managed_websites;
+
+ for (const auto& entry : managed_configuration->GetManagedOrigins()) {
+ managed_websites.Append(entry.Serialize());
+ }
+
+ return managed_websites;
+}
+
policy::PolicyService* ManagementUIHandler::GetPolicyService() const {
return Profile::FromWebUI(web_ui())
->GetProfilePolicyConnector()
@@ -1025,6 +1033,15 @@ void ManagementUIHandler::HandleGetThreatProtectionInfo(
GetThreatProtectionInfo(Profile::FromWebUI(web_ui())));
}
+void ManagementUIHandler::HandleGetManagedWebsites(
+ const base::ListValue* args) {
+ AllowJavascript();
+
+ ResolveJavascriptCallback(
+ args->GetList()[0] /* callback_id */,
+ GetManagedWebsitesInfo(Profile::FromWebUI(web_ui())));
+}
+
void ManagementUIHandler::HandleInitBrowserReportingInfo(
const base::ListValue* args) {
base::Value report_sources(base::Value::Type::LIST);
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui_handler.h b/chromium/chrome/browser/ui/webui/management/management_ui_handler.h
index c1507025850..027b9f01002 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/management/management_ui_handler.h
@@ -11,7 +11,6 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
#include "chrome/common/url_constants.h"
@@ -35,6 +34,7 @@ extern const char kManagementReportNetworkInterfaces[];
extern const char kManagementReportUsers[];
extern const char kManagementReportCrashReports[];
extern const char kManagementReportAppInfoAndActivity[];
+extern const char kManagementReportPrintJobs[];
extern const char kManagementPrinting[];
extern const char kManagementCrostini[];
extern const char kManagementCrostiniContainerConfiguration[];
@@ -123,8 +123,8 @@ class ManagementUIHandler : public content::WebUIMessageHandler,
// be the email address of the admin of the FlexOrg (ie user@foo.com). If
// DMServer does not provide this information, this method defaults to
// |GetAccountDomain|. If unmanaged, an empty string is returned.
- // TODO(crbug.com/1081272): refactor localization hints for all strings that
- // depend on this method
+ // TODO(crbug.com/1188594): Remove this function and replace all call sites
+ // with chrome::GetAccountManagerIdentity().
static std::string GetAccountManager(Profile* profile);
void OnJavascriptAllowed() override;
@@ -139,6 +139,7 @@ class ManagementUIHandler : public content::WebUIMessageHandler,
base::Value GetContextualManagedData(Profile* profile);
base::Value GetThreatProtectionInfo(Profile* profile) const;
+ base::Value GetManagedWebsitesInfo(Profile* profile) const;
virtual policy::PolicyService* GetPolicyService() const;
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -174,6 +175,7 @@ class ManagementUIHandler : public content::WebUIMessageHandler,
void HandleGetExtensions(const base::ListValue* args);
void HandleGetContextualManagedData(const base::ListValue* args);
void HandleGetThreatProtectionInfo(const base::ListValue* args);
+ void HandleGetManagedWebsites(const base::ListValue* args);
void HandleInitBrowserReportingInfo(const base::ListValue* args);
void AsyncUpdateLogo();
diff --git a/chromium/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chromium/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index dc2f507f36a..9e93570a0cf 100644
--- a/chromium/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -1,4 +1,3 @@
-
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -14,6 +13,7 @@
#include "build/chromeos_buildflags.h"
#include "chrome/browser/ui/webui/management/management_ui_handler.h"
+#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/policy/core/browser/browser_policy_connector.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
@@ -22,6 +22,7 @@
#include "components/policy/core/common/policy_namespace.h"
#include "components/policy/core/common/policy_service.h"
#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_service.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/test/browser_task_environment.h"
#include "extensions/common/extension.h"
@@ -95,14 +96,15 @@ using testing::Return;
using testing::ReturnRef;
struct ContextualManagementSourceUpdate {
- base::string16 extension_reporting_title;
- base::string16 subtitle;
+ std::u16string extension_reporting_title;
+ std::u16string managed_websites_title;
+ std::u16string subtitle;
#if BUILDFLAG(IS_CHROMEOS_ASH)
- base::string16 management_overview;
- base::string16 update_required_eol;
+ std::u16string management_overview;
+ std::u16string update_required_eol;
bool show_proxy_server_privacy_disclosure;
#else
- base::string16 browser_management_notice;
+ std::u16string browser_management_notice;
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
bool managed;
};
@@ -202,6 +204,10 @@ class TestManagementUIHandler : public ManagementUIHandler {
return report_sources;
}
+ base::Value GetManagedWebsitesInfo(Profile* profile) {
+ return ManagementUIHandler::GetManagedWebsitesInfo(profile);
+ }
+
base::Value GetThreatProtectionInfo(Profile* profile) {
return ManagementUIHandler::GetThreatProtectionInfo(profile);
}
@@ -251,7 +257,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
ManagementUIHandlerTests()
: TestingBaseClass(),
handler_(&policy_service_),
- device_domain_(base::UTF8ToUTF16("devicedomain.com")),
+ device_domain_(u"devicedomain.com"),
task_runner_(base::MakeRefCounted<base::TestSimpleTaskRunner>()),
state_keys_broker_(&session_manager_client_) {
ON_CALL(policy_service_, GetPolicies(_))
@@ -266,7 +272,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
~ManagementUIHandlerTests() override = default;
- base::string16 device_domain() { return device_domain_; }
+ std::u16string device_domain() { return device_domain_; }
void EnablePolicy(const char* policy_key, policy::PolicyMap& policies) {
policies.Set(policy_key, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_CLOUD,
@@ -296,17 +302,19 @@ class ManagementUIHandlerTests : public TestingBaseClass {
std::move(policy_value.value()), nullptr);
}
- base::string16 ExtractPathFromDict(const base::Value& data,
+ std::u16string ExtractPathFromDict(const base::Value& data,
const std::string path) {
const std::string* buf = data.FindStringPath(path);
if (!buf)
- return base::string16();
+ return std::u16string();
return base::UTF8ToUTF16(*buf);
}
void ExtractContextualSourceUpdate(const base::Value& data) {
extracted_.extension_reporting_title =
ExtractPathFromDict(data, "extensionReportingTitle");
+ extracted_.managed_websites_title =
+ ExtractPathFromDict(data, "managedWebsitesSubtitle");
extracted_.subtitle = ExtractPathFromDict(data, "pageSubtitle");
#if BUILDFLAG(IS_CHROMEOS_ASH)
extracted_.management_overview = ExtractPathFromDict(data, "overview");
@@ -462,7 +470,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
bool GetManaged() const { return extracted_.managed; }
#if BUILDFLAG(IS_CHROMEOS_ASH)
- base::string16 GetManagementOverview() const {
+ std::u16string GetManagementOverview() const {
return extracted_.management_overview;
}
base::test::ScopedFeatureList* scoped_feature_list() {
@@ -473,7 +481,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
return crostini_features_.get();
}
- base::string16 GetUpdateRequiredEolMessage() const {
+ std::u16string GetUpdateRequiredEolMessage() const {
return extracted_.update_required_eol;
}
@@ -482,17 +490,21 @@ class ManagementUIHandlerTests : public TestingBaseClass {
}
#else
- base::string16 GetBrowserManagementNotice() const {
+ std::u16string GetBrowserManagementNotice() const {
return extracted_.browser_management_notice;
}
#endif
- base::string16 GetExtensionReportingTitle() const {
+ std::u16string GetExtensionReportingTitle() const {
return extracted_.extension_reporting_title;
}
- base::string16 GetPageSubtitle() const { return extracted_.subtitle; }
+ std::u16string GetManagedWebsitesTitle() const {
+ return extracted_.managed_websites_title;
+ }
+
+ std::u16string GetPageSubtitle() const { return extracted_.subtitle; }
TestingProfile* GetProfile() const { return profile_.get(); }
@@ -545,7 +557,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
TestManagementUIHandler handler_;
policy::MockPolicyService policy_service_;
policy::PolicyMap empty_policy_map_;
- base::string16 device_domain_;
+ std::u16string device_domain_;
ContextualManagementSourceUpdate extracted_;
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::unique_ptr<chromeos::ScopedStubInstallAttributes> install_attributes_;
@@ -556,7 +568,7 @@ class ManagementUIHandlerTests : public TestingBaseClass {
std::unique_ptr<TestDeviceCloudPolicyManagerChromeOS> manager_;
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
policy::ServerBackedStateKeysBroker state_keys_broker_;
- chromeos::ScopedTestingCrosSettings settings_;
+ ash::ScopedTestingCrosSettings settings_;
chromeos::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
#else
content::BrowserTaskEnvironment task_environment_;
@@ -653,6 +665,9 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
@@ -668,6 +683,9 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_BROWSER_NOTICE,
@@ -685,6 +703,9 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_BROWSER_NOTICE,
@@ -706,6 +727,10 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
base::UTF8ToUTF16(domain)));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ base::UTF8ToUTF16(domain)));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
@@ -723,6 +748,9 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
@@ -743,6 +771,10 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
base::UTF8ToUTF16(domain)));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ base::UTF8ToUTF16(domain)));
EXPECT_EQ(GetBrowserManagementNotice(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_BROWSER_NOTICE,
@@ -769,6 +801,10 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
base::UTF8ToUTF16(domain)));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ base::UTF8ToUTF16(domain)));
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_SUBTITLE_MANAGED_BY,
l10n_util::GetStringUTF16(device_type),
@@ -776,7 +812,7 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetManagementOverview(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_ACCOUNT_MANAGED_BY,
base::UTF8ToUTF16(domain)));
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_TRUE(GetManaged());
}
@@ -789,11 +825,14 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_SUBTITLE_MANAGED,
l10n_util::GetStringUTF16(device_type)));
- EXPECT_EQ(GetManagementOverview(), base::string16());
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(GetManagementOverview(), std::u16string());
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_TRUE(GetManaged());
}
@@ -812,8 +851,12 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
device_domain()));
- EXPECT_EQ(GetManagementOverview(), base::string16());
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ device_domain()));
+ EXPECT_EQ(GetManagementOverview(), std::u16string());
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_TRUE(GetManaged());
}
@@ -835,7 +878,11 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetManagementOverview(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_DEVICE_AND_ACCOUNT_MANAGED_BY, device_domain()));
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ device_domain()));
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_TRUE(GetManaged());
}
@@ -856,11 +903,15 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
device_domain()));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ device_domain()));
EXPECT_EQ(GetManagementOverview(),
l10n_util::GetStringFUTF16(
IDS_MANAGEMENT_DEVICE_MANAGED_BY_ACCOUNT_MANAGED_BY,
device_domain(), base::UTF8ToUTF16(domain)));
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_TRUE(GetManaged());
}
@@ -877,9 +928,12 @@ TEST_F(ManagementUIHandlerTests, ManagementContextualSourceUpdateUnmanaged) {
l10n_util::GetStringUTF16(device_type)));
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_EXPLANATION));
EXPECT_EQ(GetManagementOverview(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_DEVICE_NOT_MANAGED));
- EXPECT_EQ(GetUpdateRequiredEolMessage(), base::string16());
+ EXPECT_EQ(GetUpdateRequiredEolMessage(), std::u16string());
EXPECT_FALSE(GetManaged());
}
@@ -903,6 +957,10 @@ TEST_F(ManagementUIHandlerTests,
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
device_domain()));
+ EXPECT_EQ(
+ GetManagedWebsitesTitle(),
+ l10n_util::GetStringFUTF16(IDS_MANAGEMENT_MANAGED_WEBSITES_BY_EXPLANATION,
+ device_domain()));
EXPECT_TRUE(GetManaged());
}
@@ -1059,7 +1117,6 @@ TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoNoPolicySetNoMessage) {
}
TEST_F(ManagementUIHandlerTests, CloudReportingPolicy) {
-
policy::PolicyMap chrome_policies;
const policy::PolicyNamespace chrome_policies_namespace =
policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, std::string());
@@ -1132,6 +1189,27 @@ TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoPoliciesMerge) {
expected_messages);
}
+TEST_F(ManagementUIHandlerTests, ManagedWebsitiesInfoNoPolicySet) {
+ TestingProfile::Builder builder_no_domain;
+ auto profile = builder_no_domain.Build();
+ auto info = handler_.GetManagedWebsitesInfo(profile.get());
+ EXPECT_EQ(info.GetList().size(), 0u);
+}
+
+TEST_F(ManagementUIHandlerTests, ManagedWebsitiesInfoWebsites) {
+ TestingProfile::Builder builder_no_domain;
+ auto profile = builder_no_domain.Build();
+ base::Value managed_websites(base::Value::Type::LIST);
+ base::Value entry(base::Value::Type::DICTIONARY);
+ entry.SetStringKey("origin", "https://example.com");
+ managed_websites.Append(std::move(entry));
+ profile->GetPrefs()->Set(prefs::kManagedConfigurationPerOrigin,
+ managed_websites);
+ auto info = handler_.GetManagedWebsitesInfo(profile.get());
+ EXPECT_EQ(info.GetList().size(), 1u);
+ EXPECT_EQ(info.GetList().begin()->GetString(), "https://example.com");
+}
+
TEST_F(ManagementUIHandlerTests, ThreatReportingInfo) {
policy::PolicyMap chrome_policies;
const policy::PolicyNamespace chrome_policies_namespace =
diff --git a/chromium/chrome/browser/ui/webui/media/OWNERS b/chromium/chrome/browser/ui/webui/media/OWNERS
deleted file mode 100644
index 8e63383c5ab..00000000000
--- a/chromium/chrome/browser/ui/webui/media/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# For Media Engagement
-mlamouri@chromium.org
-
-# For WebRTC
-per-file webrtc_*=file://third_party/webrtc_overrides/OWNERS
diff --git a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc
deleted file mode 100644
index 96be7482240..00000000000
--- a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/media/media_feeds_ui.h"
-
-#include "base/bind.h"
-
-#include "base/macros.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/media/feeds/media_feeds_converter.h"
-#include "chrome/browser/media/feeds/media_feeds_fetcher.h"
-#include "chrome/browser/media/feeds/media_feeds_service.h"
-#include "chrome/browser/media/feeds/media_feeds_store.mojom-shared.h"
-#include "chrome/browser/media/history/media_history_keyed_service.h"
-#include "chrome/browser/media/history/media_history_keyed_service_factory.h"
-#include "chrome/browser/media/history/media_history_store.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/dev_ui_browser_resources.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/storage_partition.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "media/base/media_switches.h"
-
-MediaFeedsUI::MediaFeedsUI(content::WebUI* web_ui)
- : ui::MojoWebUIController(web_ui) {
- // Setup the data source behind chrome://media-feeds.
- std::unique_ptr<content::WebUIDataSource> source(
- content::WebUIDataSource::Create(chrome::kChromeUIMediaFeedsHost));
- source->AddResourcePath("media_data_table.js", IDR_MEDIA_DATA_TABLE_JS);
- source->AddResourcePath("media_feeds.js", IDR_MEDIA_FEEDS_JS);
- source->AddResourcePath("media_session.mojom-lite.js",
- IDR_MEDIA_SESSION_MOJOM_LITE_JS);
- source->AddResourcePath("ui/gfx/geometry/mojom/geometry.mojom-lite.js",
- IDR_UI_GEOMETRY_MOJOM_LITE_JS);
- source->AddResourcePath("media_feeds_store.mojom-lite.js",
- IDR_MEDIA_FEEDS_STORE_MOJOM_LITE_JS);
- source->SetDefaultResource(IDR_MEDIA_FEEDS_HTML);
- content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source.release());
-}
-
-WEB_UI_CONTROLLER_TYPE_IMPL(MediaFeedsUI)
-
-MediaFeedsUI::~MediaFeedsUI() = default;
-
-void MediaFeedsUI::BindInterface(
- mojo::PendingReceiver<media_feeds::mojom::MediaFeedsStore> pending) {
- receiver_.Add(this, std::move(pending));
-}
-
-void MediaFeedsUI::GetMediaFeeds(GetMediaFeedsCallback callback) {
- GetMediaHistoryService()->GetMediaFeeds(
- media_history::MediaHistoryKeyedService::GetMediaFeedsRequest(),
- std::move(callback));
-}
-
-void MediaFeedsUI::GetItemsForMediaFeed(int64_t feed_id,
- GetItemsForMediaFeedCallback callback) {
- GetMediaHistoryService()->GetMediaFeedItems(
- media_history::MediaHistoryKeyedService::GetMediaFeedItemsRequest::
- CreateItemsForDebug(feed_id),
- std::move(callback));
-}
-
-void MediaFeedsUI::FetchMediaFeed(int64_t feed_id,
- FetchMediaFeedCallback callback) {
- GetMediaFeedsService()->FetchMediaFeed(feed_id, /*bypass_cache=*/false,
- nullptr, std::move(callback));
-}
-
-void MediaFeedsUI::GetDebugInformation(GetDebugInformationCallback callback) {
- auto info = media_feeds::mojom::DebugInformation::New();
-
- info->safe_search_feature_enabled =
- base::FeatureList::IsEnabled(media::kMediaFeedsSafeSearch);
- info->safe_search_pref_value =
- GetProfile()->GetPrefs()->GetBoolean(prefs::kMediaFeedsSafeSearchEnabled);
-
- info->background_fetching_feature_enabled =
- base::FeatureList::IsEnabled(media::kMediaFeedsBackgroundFetching);
- info->background_fetching_pref_value = GetProfile()->GetPrefs()->GetBoolean(
- prefs::kMediaFeedsBackgroundFetching);
-
- std::move(callback).Run(std::move(info));
-}
-
-void MediaFeedsUI::SetSafeSearchEnabledPref(
- bool value,
- SetSafeSearchEnabledPrefCallback callback) {
- GetProfile()->GetPrefs()->SetBoolean(prefs::kMediaFeedsSafeSearchEnabled,
- value);
-
- std::move(callback).Run();
-}
-
-void MediaFeedsUI::SetBackgroundFetchingPref(
- bool value,
- SetBackgroundFetchingPrefCallback callback) {
- GetProfile()->GetPrefs()->SetBoolean(prefs::kMediaFeedsBackgroundFetching,
- value);
-
- std::move(callback).Run();
-}
-
-media_history::MediaHistoryKeyedService*
-MediaFeedsUI::GetMediaHistoryService() {
- media_history::MediaHistoryKeyedService* service =
- media_history::MediaHistoryKeyedServiceFactory::GetForProfile(
- GetProfile());
- DCHECK(service);
- return service;
-}
-
-media_feeds::MediaFeedsService* MediaFeedsUI::GetMediaFeedsService() {
- media_feeds::MediaFeedsService* service =
- media_feeds::MediaFeedsService::Get(GetProfile());
- DCHECK(service);
- return service;
-}
-
-Profile* MediaFeedsUI::GetProfile() {
- Profile* profile = Profile::FromWebUI(web_ui());
- DCHECK(profile);
- return profile;
-}
diff --git a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h
deleted file mode 100644
index dc382578d43..00000000000
--- a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_MEDIA_FEEDS_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_MEDIA_FEEDS_UI_H_
-
-#include "chrome/browser/media/feeds/media_feeds_fetcher.h"
-#include "chrome/browser/media/feeds/media_feeds_service.h"
-#include "chrome/browser/media/feeds/media_feeds_store.mojom.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver_set.h"
-#include "ui/webui/mojo_web_ui_controller.h"
-
-namespace media_history {
-class MediaHistoryKeyedService;
-} // namespace media_history
-
-// The UI for chrome://media-feeds.
-class MediaFeedsUI : public ui::MojoWebUIController,
- public media_feeds::mojom::MediaFeedsStore {
- public:
- explicit MediaFeedsUI(content::WebUI* web_ui);
- MediaFeedsUI(const MediaFeedsUI&) = delete;
- MediaFeedsUI& operator=(const MediaFeedsUI&) = delete;
- ~MediaFeedsUI() override;
-
- // Instantiates the implementor of the MediaFeedsStore mojo interface passing
- // the pending receiver that will be internally bound.
- void BindInterface(
- mojo::PendingReceiver<media_feeds::mojom::MediaFeedsStore> pending);
-
- // media_history::mojom::MediaHistoryStore:
- void GetMediaFeeds(GetMediaFeedsCallback callback) override;
- void GetItemsForMediaFeed(int64_t feed_id,
- GetItemsForMediaFeedCallback callback) override;
- void FetchMediaFeed(int64_t feed_id,
- FetchMediaFeedCallback callback) override;
- void GetDebugInformation(GetDebugInformationCallback callback) override;
- void SetSafeSearchEnabledPref(
- bool value,
- SetSafeSearchEnabledPrefCallback callback) override;
- void SetBackgroundFetchingPref(
- bool value,
- SetBackgroundFetchingPrefCallback callback) override;
-
- private:
- media_history::MediaHistoryKeyedService* GetMediaHistoryService();
-
- media_feeds::MediaFeedsService* GetMediaFeedsService();
-
- Profile* GetProfile();
-
- mojo::ReceiverSet<media_feeds::mojom::MediaFeedsStore> receiver_;
-
- WEB_UI_CONTROLLER_TYPE_DECL();
-};
-
-#endif // CHROME_BROWSER_UI_WEBUI_MEDIA_MEDIA_FEEDS_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/media/webrtc_logs_ui.cc b/chromium/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
index 33b26103982..cbf5451e66c 100644
--- a/chromium/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
+++ b/chromium/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/media/webrtc_logs_ui.h"
#include <memory>
+#include <string>
#include <utility>
#include <vector>
@@ -14,7 +15,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
@@ -94,6 +94,7 @@ class WebRtcLogsDOMHandler final : public WebUIMessageHandler {
~WebRtcLogsDOMHandler() override;
// WebUIMessageHandler implementation.
+ void OnJavascriptDisallowed() override;
void RegisterMessages() override;
private:
@@ -103,41 +104,38 @@ class WebRtcLogsDOMHandler final : public WebUIMessageHandler {
void HandleRequestWebRtcLogs(const base::ListValue* args);
// Asynchronously load WebRTC text logs.
- void LoadWebRtcTextLogs();
+ void LoadWebRtcTextLogs(const std::string& callback_id);
// Callback for when WebRTC text logs have been asynchronously loaded.
- void OnWebRtcTextLogsLoaded();
+ void OnWebRtcTextLogsLoaded(const std::string& callback_id);
// Asynchronously load WebRTC event logs.
- void LoadWebRtcEventLogs();
+ void LoadWebRtcEventLogs(const std::string& callback_id);
// Callback for when WebRTC event logs have been asynchronously loaded.
void OnWebRtcEventLogsLoaded(
+ const std::string& callback_id,
const std::vector<UploadList::UploadInfo>& event_logs);
// Update the chrome://webrtc-logs/ page.
- void UpdateUI();
+ void UpdateUI(const std::string& callback_id);
// Update the text/event logs part of the forementioned page.
- void UpdateUIWithTextLogs(base::ListValue* text_logs_list) const;
- void UpdateUIWithEventLogs(base::ListValue* event_logs_list) const;
+ base::Value UpdateUIWithTextLogs() const;
+ base::Value UpdateUIWithEventLogs() const;
// Convert a history entry about a captured WebRTC event log into a
- // DictionaryValue of the type expected by updateWebRtcLogsList().
- std::unique_ptr<base::DictionaryValue> EventLogUploadInfoToDictionaryValue(
+ // Value of the type expected by updateWebRtcLogsList().
+ base::Value EventLogUploadInfoToValue(
const UploadList::UploadInfo& info) const;
// Helpers for EventLogUploadInfoToDictionaryValue().
- std::unique_ptr<base::DictionaryValue> FromPendingLog(
- const UploadList::UploadInfo& info) const;
- std::unique_ptr<base::DictionaryValue> FromActivelyUploadedLog(
- const UploadList::UploadInfo& info) const;
- std::unique_ptr<base::DictionaryValue> FromNotUploadedLog(
- const UploadList::UploadInfo& info) const;
- std::unique_ptr<base::DictionaryValue> FromUploadUnsuccessfulLog(
- const UploadList::UploadInfo& info) const;
- std::unique_ptr<base::DictionaryValue> FromUploadSuccessfulLog(
+ base::Value FromPendingLog(const UploadList::UploadInfo& info) const;
+ base::Value FromActivelyUploadedLog(const UploadList::UploadInfo& info) const;
+ base::Value FromNotUploadedLog(const UploadList::UploadInfo& info) const;
+ base::Value FromUploadUnsuccessfulLog(
const UploadList::UploadInfo& info) const;
+ base::Value FromUploadSuccessfulLog(const UploadList::UploadInfo& info) const;
bool SanityCheckOnUploadInfo(const UploadList::UploadInfo& info) const;
@@ -189,28 +187,35 @@ void WebRtcLogsDOMHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"requestWebRtcLogsList",
base::BindRepeating(&WebRtcLogsDOMHandler::HandleRequestWebRtcLogs,
- weak_ptr_factory_.GetWeakPtr()));
+ base::Unretained(this)));
}
void WebRtcLogsDOMHandler::HandleRequestWebRtcLogs(
const base::ListValue* args) {
+ std::string callback_id = args->GetList()[0].GetString();
+ AllowJavascript();
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- LoadWebRtcTextLogs();
+ LoadWebRtcTextLogs(callback_id);
}
-void WebRtcLogsDOMHandler::LoadWebRtcTextLogs() {
+void WebRtcLogsDOMHandler::OnJavascriptDisallowed() {
+ weak_ptr_factory_.InvalidateWeakPtrs();
+}
+
+void WebRtcLogsDOMHandler::LoadWebRtcTextLogs(const std::string& callback_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
text_log_upload_list_->Load(
base::BindOnce(&WebRtcLogsDOMHandler::OnWebRtcTextLogsLoaded,
- weak_ptr_factory_.GetWeakPtr()));
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
-void WebRtcLogsDOMHandler::OnWebRtcTextLogsLoaded() {
+void WebRtcLogsDOMHandler::OnWebRtcTextLogsLoaded(
+ const std::string& callback_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- LoadWebRtcEventLogs(); // Text logs loaded; on to the event logs.
+ LoadWebRtcEventLogs(callback_id); // Text logs loaded; on to the event logs.
}
-void WebRtcLogsDOMHandler::LoadWebRtcEventLogs() {
+void WebRtcLogsDOMHandler::LoadWebRtcEventLogs(const std::string& callback_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
WebRtcEventLogManager* manager = WebRtcEventLogManager::GetInstance();
@@ -218,59 +223,56 @@ void WebRtcLogsDOMHandler::LoadWebRtcEventLogs() {
manager->GetHistory(
original_browser_context_id_,
base::BindOnce(&WebRtcLogsDOMHandler::OnWebRtcEventLogsLoaded,
- weak_ptr_factory_.GetWeakPtr()));
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
} else {
- OnWebRtcEventLogsLoaded(std::vector<UploadList::UploadInfo>());
+ OnWebRtcEventLogsLoaded(callback_id, std::vector<UploadList::UploadInfo>());
}
}
void WebRtcLogsDOMHandler::OnWebRtcEventLogsLoaded(
+ const std::string& callback_id,
const std::vector<UploadList::UploadInfo>& event_logs) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
event_logs_ = event_logs;
- UpdateUI(); // All log histories loaded asynchronously; time to display.
+ // All log histories loaded asynchronously; time to display.
+ UpdateUI(callback_id);
}
-void WebRtcLogsDOMHandler::UpdateUI() {
+void WebRtcLogsDOMHandler::UpdateUI(const std::string& callback_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- base::ListValue text_logs_list;
- UpdateUIWithTextLogs(&text_logs_list);
-
- base::ListValue event_logs_list;
- UpdateUIWithEventLogs(&event_logs_list);
-
- base::Value version(version_info::GetVersionNumber());
-
- web_ui()->CallJavascriptFunctionUnsafe("updateWebRtcLogsList", text_logs_list,
- event_logs_list, version);
+ base::Value result(base::Value::Type::DICTIONARY);
+ result.SetKey("textLogs", UpdateUIWithTextLogs());
+ result.SetKey("eventLogs", UpdateUIWithEventLogs());
+ result.SetKey("version", base::Value(version_info::GetVersionNumber()));
+ ResolveJavascriptCallback(base::Value(callback_id), result);
}
-void WebRtcLogsDOMHandler::UpdateUIWithTextLogs(
- base::ListValue* upload_list) const {
+base::Value WebRtcLogsDOMHandler::UpdateUIWithTextLogs() const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ base::Value result(base::Value::Type::LIST);
std::vector<UploadList::UploadInfo> uploads;
text_log_upload_list_->GetUploads(50, &uploads);
- for (auto i = uploads.begin(); i != uploads.end(); ++i) {
- std::unique_ptr<base::DictionaryValue> upload(new base::DictionaryValue());
- upload->SetString("id", i->upload_id);
+ for (const auto& upload : uploads) {
+ base::Value upload_value(base::Value::Type::DICTIONARY);
+ upload_value.SetStringKey("id", upload.upload_id);
- base::string16 value_w;
- if (!i->upload_time.is_null())
- value_w = base::TimeFormatFriendlyDateAndTime(i->upload_time);
- upload->SetString("upload_time", value_w);
+ std::u16string value_w;
+ if (!upload.upload_time.is_null())
+ value_w = base::TimeFormatFriendlyDateAndTime(upload.upload_time);
+ upload_value.SetStringKey("upload_time", value_w);
std::string value;
- if (!i->local_id.empty()) {
- value = text_log_dir_.AppendASCII(i->local_id)
+ if (!upload.local_id.empty()) {
+ value = text_log_dir_.AppendASCII(upload.local_id)
.AddExtension(FILE_PATH_LITERAL(".gz"))
.AsUTF8Unsafe();
}
- upload->SetString("local_file", value);
+ upload_value.SetStringKey("local_file", value);
// In october 2015, capture time was added to the log list, previously the
// local ID was used as capture time. The local ID has however changed so
@@ -278,14 +280,14 @@ void WebRtcLogsDOMHandler::UpdateUIWithTextLogs(
// to a time within reasonable bounds, otherwise we fall back on the upload
// time.
// TODO(grunell): Use |capture_time| only.
- if (!i->capture_time.is_null()) {
- value_w = base::TimeFormatFriendlyDateAndTime(i->capture_time);
+ if (!upload.capture_time.is_null()) {
+ value_w = base::TimeFormatFriendlyDateAndTime(upload.capture_time);
} else {
// Fall back on local ID as time. We need to check that it's within
// resonable bounds, since the ID may not represent time. Check between
// 2012 when the feature was introduced and now.
double seconds_since_epoch;
- if (base::StringToDouble(i->local_id, &seconds_since_epoch)) {
+ if (base::StringToDouble(upload.local_id, &seconds_since_epoch)) {
base::Time capture_time = base::Time::FromDoubleT(seconds_since_epoch);
const base::Time::Exploded lower_limit = {2012, 1, 0, 1, 0, 0, 0, 0};
base::Time out_time;
@@ -301,23 +303,24 @@ void WebRtcLogsDOMHandler::UpdateUIWithTextLogs(
// was already in the variable. In case it's empty set the string to
// inform that the time is unknown.
if (value_w.empty())
- value_w = base::string16(base::ASCIIToUTF16("(unknown time)"));
- upload->SetString("capture_time", value_w);
+ value_w = std::u16string(u"(unknown time)");
+ upload_value.SetStringKey("capture_time", value_w);
- upload_list->Append(std::move(upload));
+ result.Append(std::move(upload_value));
}
+ return result;
}
-void WebRtcLogsDOMHandler::UpdateUIWithEventLogs(
- base::ListValue* event_logs_list) const {
+base::Value WebRtcLogsDOMHandler::UpdateUIWithEventLogs() const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- for (auto it = event_logs_.crbegin(); it != event_logs_.crend(); ++it) {
- event_logs_list->Append(EventLogUploadInfoToDictionaryValue(*it));
+ base::Value result(base::Value::Type::LIST);
+ for (const auto& log : event_logs_) {
+ result.Append(EventLogUploadInfoToValue(log));
}
+ return result;
}
-std::unique_ptr<base::DictionaryValue>
-WebRtcLogsDOMHandler::EventLogUploadInfoToDictionaryValue(
+base::Value WebRtcLogsDOMHandler::EventLogUploadInfoToValue(
const UploadList::UploadInfo& info) const {
switch (info.state) {
case UploadList::UploadInfo::State::Pending:
@@ -335,111 +338,108 @@ WebRtcLogsDOMHandler::EventLogUploadInfoToDictionaryValue(
}
LOG(ERROR) << "Unrecognized state (" << static_cast<int>(info.state) << ").";
- return nullptr;
+ return base::Value();
}
-std::unique_ptr<base::DictionaryValue> WebRtcLogsDOMHandler::FromPendingLog(
+base::Value WebRtcLogsDOMHandler::FromPendingLog(
const UploadList::UploadInfo& info) const {
DCHECK_EQ(info.state, UploadList::UploadInfo::State::Pending);
DCHECK(info.upload_time.is_null());
if (!SanityCheckOnUploadInfo(info)) {
- return nullptr;
+ return base::Value();
}
- std::unique_ptr<base::DictionaryValue> log(new base::DictionaryValue());
- log->SetString("state", "pending");
- log->SetString("capture_time",
- base::TimeFormatFriendlyDateAndTime(info.capture_time));
- log->SetString("local_file",
- event_log_dir_.AppendASCII(info.local_id).AsUTF8Unsafe());
+ base::Value log(base::Value::Type::DICTIONARY);
+ log.SetStringKey("state", "pending");
+ log.SetStringKey("capture_time",
+ base::TimeFormatFriendlyDateAndTime(info.capture_time));
+ log.SetStringKey("local_file",
+ event_log_dir_.AppendASCII(info.local_id).AsUTF8Unsafe());
return log;
}
-std::unique_ptr<base::DictionaryValue>
-WebRtcLogsDOMHandler::FromActivelyUploadedLog(
+base::Value WebRtcLogsDOMHandler::FromActivelyUploadedLog(
const UploadList::UploadInfo& info) const {
DCHECK_EQ(info.state, UploadList::UploadInfo::State::Pending);
DCHECK(!info.upload_time.is_null());
if (!SanityCheckOnUploadInfo(info)) {
- return nullptr;
+ return base::Value();
}
- std::unique_ptr<base::DictionaryValue> log(new base::DictionaryValue());
- log->SetString("state", "actively_uploaded");
- log->SetString("capture_time",
- base::TimeFormatFriendlyDateAndTime(info.capture_time));
- log->SetString("local_file",
- event_log_dir_.AppendASCII(info.local_id).AsUTF8Unsafe());
+ base::Value log(base::Value::Type::DICTIONARY);
+ log.SetStringKey("state", "actively_uploaded");
+ log.SetStringKey("capture_time",
+ base::TimeFormatFriendlyDateAndTime(info.capture_time));
+ log.SetStringKey("local_file",
+ event_log_dir_.AppendASCII(info.local_id).AsUTF8Unsafe());
return log;
}
-std::unique_ptr<base::DictionaryValue> WebRtcLogsDOMHandler::FromNotUploadedLog(
+base::Value WebRtcLogsDOMHandler::FromNotUploadedLog(
const UploadList::UploadInfo& info) const {
DCHECK_EQ(info.state, UploadList::UploadInfo::State::NotUploaded);
DCHECK(info.upload_time.is_null());
if (!SanityCheckOnUploadInfo(info)) {
- return nullptr;
+ return base::Value();
}
- std::unique_ptr<base::DictionaryValue> log(new base::DictionaryValue());
- log->SetString("state", "not_uploaded");
- log->SetString("capture_time",
- base::TimeFormatFriendlyDateAndTime(info.capture_time));
- log->SetString("local_id", info.local_id);
+ base::Value log(base::Value::Type::DICTIONARY);
+ log.SetStringKey("state", "not_uploaded");
+ log.SetStringKey("capture_time",
+ base::TimeFormatFriendlyDateAndTime(info.capture_time));
+ log.SetStringKey("local_id", info.local_id);
return log;
}
-std::unique_ptr<base::DictionaryValue>
-WebRtcLogsDOMHandler::FromUploadUnsuccessfulLog(
+base::Value WebRtcLogsDOMHandler::FromUploadUnsuccessfulLog(
const UploadList::UploadInfo& info) const {
DCHECK_EQ(info.state, UploadList::UploadInfo::State::NotUploaded);
DCHECK(!info.upload_time.is_null());
if (!SanityCheckOnUploadInfo(info)) {
- return nullptr;
+ return base::Value();
}
if (!info.upload_id.empty()) {
LOG(ERROR) << "Unexpected upload ID.";
- return nullptr;
+ return base::Value();
}
- std::unique_ptr<base::DictionaryValue> log(new base::DictionaryValue());
- log->SetString("state", "upload_unsuccessful");
- log->SetString("capture_time",
- base::TimeFormatFriendlyDateAndTime(info.capture_time));
- log->SetString("local_id", info.local_id);
- log->SetString("upload_time",
- base::TimeFormatFriendlyDateAndTime(info.upload_time));
+ base::Value log(base::Value::Type::DICTIONARY);
+ log.SetStringKey("state", "upload_unsuccessful");
+ log.SetStringKey("capture_time",
+ base::TimeFormatFriendlyDateAndTime(info.capture_time));
+ log.SetStringKey("local_id", info.local_id);
+ log.SetStringKey("upload_time",
+ base::TimeFormatFriendlyDateAndTime(info.upload_time));
return log;
}
-std::unique_ptr<base::DictionaryValue>
-WebRtcLogsDOMHandler::FromUploadSuccessfulLog(
+base::Value WebRtcLogsDOMHandler::FromUploadSuccessfulLog(
const UploadList::UploadInfo& info) const {
DCHECK_EQ(info.state, UploadList::UploadInfo::State::Uploaded);
DCHECK(!info.upload_time.is_null());
if (!SanityCheckOnUploadInfo(info)) {
- return nullptr;
+ return base::Value();
}
if (info.upload_id.empty()) {
LOG(ERROR) << "Unknown upload ID.";
- return nullptr;
+ return base::Value();
}
- std::unique_ptr<base::DictionaryValue> log(new base::DictionaryValue());
- log->SetString("state", "upload_successful");
- log->SetString("capture_time",
- base::TimeFormatFriendlyDateAndTime(info.capture_time));
- log->SetString("local_id", info.local_id);
- log->SetString("upload_id", info.upload_id);
- log->SetString("upload_time",
- base::TimeFormatFriendlyDateAndTime(info.upload_time));
+ base::Value log(base::Value::Type::DICTIONARY);
+ log.SetStringKey("state", "upload_successful");
+ log.SetStringKey("capture_time",
+ base::TimeFormatFriendlyDateAndTime(info.capture_time));
+ log.SetStringKey("local_id", info.local_id);
+ log.SetStringKey("upload_id", info.upload_id);
+ log.SetStringKey("upload_time",
+ base::TimeFormatFriendlyDateAndTime(info.upload_time));
return log;
}
diff --git a/chromium/chrome/browser/ui/webui/memories/BUILD.gn b/chromium/chrome/browser/ui/webui/memories/BUILD.gn
index 5546bb266a9..1f6bb7e66f6 100644
--- a/chromium/chrome/browser/ui/webui/memories/BUILD.gn
+++ b/chromium/chrome/browser/ui/webui/memories/BUILD.gn
@@ -7,5 +7,5 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojo_bindings") {
sources = [ "memories.mojom" ]
webui_module_path = "/chrome/browser/ui/webui/memories"
- public_deps = [ "//components/memories/core:mojo_bindings" ]
+ public_deps = [ "//components/history_clusters/core:mojo_bindings" ]
}
diff --git a/chromium/chrome/browser/ui/webui/memories/OWNERS b/chromium/chrome/browser/ui/webui/memories/OWNERS
index d9c10308fea..6e3769ae6ab 100644
--- a/chromium/chrome/browser/ui/webui/memories/OWNERS
+++ b/chromium/chrome/browser/ui/webui/memories/OWNERS
@@ -1,4 +1,4 @@
-file://components/memories/OWNERS
+file://components/history_clusters/OWNERS
per-file *.mojom=set noparent
per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/memories/memories.mojom b/chromium/chrome/browser/ui/webui/memories/memories.mojom
index e644c7a9978..7451d63bef3 100644
--- a/chromium/chrome/browser/ui/webui/memories/memories.mojom
+++ b/chromium/chrome/browser/ui/webui/memories/memories.mojom
@@ -4,7 +4,7 @@
module memories.mojom;
-import "components/memories/core/memories.mojom";
+import "components/history_clusters/core/memories.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "url/mojom/url.mojom";
@@ -30,6 +30,9 @@ interface PageHandler {
// Returns sample Memories related to |query| for experimentation with a POC.
// TODO(crbug.com/1179069): Remove this when real Memories are available.
GetSampleMemories(string query) => (MemoriesResult result);
+
+ // Return memories related to visit history.
+ GetMemories() => (MemoriesResult memories);
};
// WebUI-side handler for requests from the browser.
diff --git a/chromium/chrome/browser/ui/webui/memories/memories_handler.cc b/chromium/chrome/browser/ui/webui/memories/memories_handler.cc
index 92cb5dbb908..ca1e9e01f05 100644
--- a/chromium/chrome/browser/ui/webui/memories/memories_handler.cc
+++ b/chromium/chrome/browser/ui/webui/memories/memories_handler.cc
@@ -4,17 +4,24 @@
#include "chrome/browser/ui/webui/memories/memories_handler.h"
+#include <algorithm>
+#include <utility>
+#include <vector>
+
+#include "chrome/browser/history_clusters/memories_service_factory.h"
#include "chrome/browser/profiles/profile.h"
+#include "components/history_clusters/core/memories_features.h"
+#include "components/history_clusters/core/memories_service.h"
#include "content/public/browser/web_contents.h"
+#include "url/gurl.h"
#if !defined(OFFICIAL_BUILD)
#include "base/bind.h"
#include "base/containers/contains.h"
-#include "base/containers/flat_map.h"
#include "base/i18n/case_conversion.h"
#include "base/i18n/time_formatting.h"
-#include "base/stl_util.h"
#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
@@ -30,7 +37,18 @@
#include "components/history/core/browser/history_service.h"
#include "components/history/core/browser/history_types.h"
#include "components/search_engines/template_url_service.h"
-#include "components/tab_groups/tab_group_id.h"
+#include "ui/base/l10n/time_format.h"
+
+namespace {
+GURL GetRandomlySizedThumbnailUrl() {
+ const std::vector<int> dimensions = {150, 160, 170, 180, 190, 200};
+ auto random_dimension = [&dimensions]() {
+ return dimensions[rand() % dimensions.size()];
+ };
+ return GURL(base::StringPrintf("https://via.placeholder.com/%dX%d",
+ random_dimension(), random_dimension()));
+}
+} // namespace
#endif
MemoriesHandler::MemoriesHandler(
@@ -54,32 +72,45 @@ void MemoriesHandler::SetPage(
void MemoriesHandler::GetSampleMemories(const std::string& query,
MemoriesResultCallback callback) {
#if defined(OFFICIAL_BUILD)
- std::move(callback).Run({});
+ auto memories_result_mojom = memories::mojom::MemoriesResult::New();
+ std::move(callback).Run(std::move(memories_result_mojom));
return;
#else
- // Query HistoryService for URLs containing |query|.
- history::HistoryService* history_service =
- HistoryServiceFactory::GetForProfile(profile_,
- ServiceAccessType::EXPLICIT_ACCESS);
- history::QueryOptions query_options;
- query_options.duplicate_policy = history::QueryOptions::KEEP_ALL_DUPLICATES;
- query_options.SetRecentDayRange(90);
- history_service->QueryHistory(
- base::UTF8ToUTF16(query), query_options,
- base::BindOnce(&MemoriesHandler::OnHistoryQueryResults,
- weak_ptr_factory_.GetWeakPtr(), query,
- std::move(callback)),
- &history_task_tracker_);
+ // If the query is empty and a remote model endpoint is set, then ask the
+ // MemoriesService for memories. The MemoriesService doesn't yet support
+ // filtering memories by query or an on-client clustering, so if either the
+ // query is non-empty or the endpoint is not set, fallback to sample memories
+ // from history.
+ if (query.empty() && memories::RemoteModelEndpoint().is_valid()) {
+ GetMemories(std::move(callback));
+ } else {
+ // Query HistoryService for URLs containing |query|.
+ history::HistoryService* history_service =
+ HistoryServiceFactory::GetForProfile(
+ profile_, ServiceAccessType::EXPLICIT_ACCESS);
+ history::QueryOptions query_options;
+ query_options.duplicate_policy = history::QueryOptions::KEEP_ALL_DUPLICATES;
+ query_options.SetRecentDayRange(90);
+ history_service->QueryHistory(
+ base::UTF8ToUTF16(query), query_options,
+ base::BindOnce(&MemoriesHandler::OnHistoryQueryResults,
+ weak_ptr_factory_.GetWeakPtr(), query,
+ std::move(callback)),
+ &history_task_tracker_);
+ }
}
void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
MemoriesResultCallback callback,
history::QueryResults results) {
auto memories_result_mojom = memories::mojom::MemoriesResult::New();
- memories_result_mojom->title =
- base::UTF8ToUTF16("Related to \"" + query + "\"");
- memories_result_mojom->thumbnail_url =
- GURL("https://via.placeholder.com/200");
+ if (results.empty()) {
+ std::move(callback).Run(std::move(memories_result_mojom));
+ return;
+ }
+
+ memories_result_mojom->title = base::UTF8ToUTF16(query);
+ memories_result_mojom->thumbnail_url = GetRandomlySizedThumbnailUrl();
auto memory_mojom = memories::mojom::Memory::New();
memory_mojom->id = base::UnguessableToken::Create();
@@ -97,15 +128,8 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
memory_mojom->last_visit_time = result.visit_time();
}
- // Keep track of all the visited URLs.
- auto webpage = memories::mojom::WebPage::New();
- webpage->url = result.url();
- webpage->title = result.title();
- webpage->thumbnail_url = GURL("https://via.placeholder.com/200");
- memory_mojom->pages[result.url()] = std::move(webpage);
-
// Check if the URL is a valid search URL.
- base::string16 search_terms;
+ std::u16string search_terms;
bool is_valid_search_url =
default_search_provider &&
default_search_provider->ExtractSearchTermsFromURL(
@@ -113,7 +137,7 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
!search_terms.empty();
if (is_valid_search_url) {
// If the URL is a valid search URL, try to create a related search query.
- const base::string16& search_query =
+ const std::u16string& search_query =
base::i18n::ToLower(base::CollapseWhitespace(search_terms, false));
// Skip duplicate search queries.
@@ -137,7 +161,13 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
auto visit = memories::mojom::Visit::New();
// TOOD(mahmadi): URLResult does not contain visit_id.
visit->url = result.url();
+ visit->page_title = result.title();
+ visit->thumbnail_url = GetRandomlySizedThumbnailUrl();
visit->time = result.visit_time();
+ visit->relative_date = ui::TimeFormat::Simple(
+ ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT,
+ base::Time::Now() - visit->time);
+ visit->time_of_day = base::TimeFormatTimeOfDay(visit->time);
std::function<void(std::vector<memories::mojom::VisitPtr>&, bool)>
add_visit;
@@ -176,22 +206,34 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
const TabStripModel* tab_strip_model = browser->tab_strip_model();
const TabGroupModel* group_model = tab_strip_model->group_model();
for (const auto& group_id : group_model->ListTabGroups()) {
- std::vector<GURL> related_tab_group_urls;
const TabGroup* tab_group = group_model->GetTabGroup(group_id);
+ bool tab_group_has_url_in_memory = false;
gfx::Range tabs = tab_group->ListTabs();
for (uint32_t index = tabs.start(); index < tabs.end(); ++index) {
content::WebContents* web_contents =
tab_strip_model->GetWebContentsAt(index);
const GURL& url = web_contents->GetLastCommittedURL();
- if (base::Contains(memory_mojom->pages, url)) {
- related_tab_group_urls.push_back(url);
+ auto matching_result_it = std::find_if(
+ results.begin(), results.end(),
+ [&url](const auto& result) { return result.url() == url; });
+ if (matching_result_it != results.end()) {
+ tab_group_has_url_in_memory = true;
+ break;
}
}
- if (!related_tab_group_urls.empty()) {
+ if (tab_group_has_url_in_memory) {
auto tab_group_mojom = memories::mojom::TabGroup::New();
tab_group_mojom->id = tab_group->id().token();
tab_group_mojom->title = tab_group->visual_data()->title();
- tab_group_mojom->urls = related_tab_group_urls;
+ for (uint32_t index = tabs.start(); index < tabs.end(); ++index) {
+ content::WebContents* web_contents =
+ tab_strip_model->GetWebContentsAt(index);
+ auto webpage = memories::mojom::WebPage::New();
+ webpage->url = web_contents->GetLastCommittedURL();
+ webpage->title = web_contents->GetTitle();
+ webpage->thumbnail_url = GetRandomlySizedThumbnailUrl();
+ tab_group_mojom->pages.push_back(std::move(webpage));
+ }
memory_mojom->related_tab_groups.push_back(std::move(tab_group_mojom));
}
}
@@ -204,8 +246,16 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
std::vector<bookmarks::UrlAndTitle> bookmarks;
model->GetBookmarks(&bookmarks);
for (const auto& bookmark : bookmarks) {
- if (base::Contains(memory_mojom->pages, bookmark.url)) {
- memory_mojom->bookmarks.push_back(bookmark.url);
+ auto matching_result_it = std::find_if(
+ results.begin(), results.end(), [&bookmark](const auto& result) {
+ return result.url() == bookmark.url;
+ });
+ if (matching_result_it != results.end()) {
+ auto webpage = memories::mojom::WebPage::New();
+ webpage->url = matching_result_it->url();
+ webpage->title = matching_result_it->title();
+ webpage->thumbnail_url = GetRandomlySizedThumbnailUrl();
+ memory_mojom->bookmarks.push_back(std::move(webpage));
}
}
}
@@ -214,3 +264,13 @@ void MemoriesHandler::OnHistoryQueryResults(const std::string& query,
std::move(callback).Run(std::move(memories_result_mojom));
#endif
}
+
+void MemoriesHandler::GetMemories(MemoriesResultCallback callback) {
+ auto* memory_service = MemoriesServiceFactory::GetForBrowserContext(profile_);
+ memory_service->GetMemories(base::BindOnce([](memories::Memories memories) {
+ auto result =
+ memories::mojom::MemoriesResult::New();
+ result->memories = std::move(memories);
+ return result;
+ }).Then(std::move(callback)));
+}
diff --git a/chromium/chrome/browser/ui/webui/memories/memories_handler.h b/chromium/chrome/browser/ui/webui/memories/memories_handler.h
index f8079b32f8d..ed4cd8e2127 100644
--- a/chromium/chrome/browser/ui/webui/memories/memories_handler.h
+++ b/chromium/chrome/browser/ui/webui/memories/memories_handler.h
@@ -5,8 +5,12 @@
#ifndef CHROME_BROWSER_UI_WEBUI_MEMORIES_MEMORIES_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_MEMORIES_MEMORIES_HANDLER_H_
+#include <string>
+
+#include "base/callback.h"
#include "chrome/browser/ui/webui/memories/memories.mojom.h"
-#include "components/memories/core/memories.mojom.h"
+#include "components/history_clusters/core/memories.mojom.h"
+#include "components/history_clusters/core/memories_remote_model_helper.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
@@ -50,6 +54,8 @@ class MemoriesHandler : public memories::mojom::PageHandler {
void GetSampleMemories(const std::string& query,
MemoriesResultCallback callback) override;
+ void GetMemories(MemoriesResultCallback callback) override;
+
private:
#if !defined(OFFICIAL_BUILD)
void OnHistoryQueryResults(const std::string& query,
diff --git a/chromium/chrome/browser/ui/webui/memories/memories_ui.cc b/chromium/chrome/browser/ui/webui/memories/memories_ui.cc
index 2b355e73412..63d3b6a3952 100644
--- a/chromium/chrome/browser/ui/webui/memories/memories_ui.cc
+++ b/chromium/chrome/browser/ui/webui/memories/memories_ui.cc
@@ -5,12 +5,16 @@
#include "chrome/browser/ui/webui/memories/memories_ui.h"
#include "base/logging.h"
+#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/favicon_source.h"
#include "chrome/browser/ui/webui/memories/memories_handler.h"
+#include "chrome/browser/ui/webui/sanitized_image_source.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/memories_resources.h"
#include "chrome/grit/memories_resources_map.h"
+#include "components/favicon_base/favicon_url_parser.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_controller.h"
@@ -19,7 +23,7 @@
namespace {
-content::WebUIDataSource* CreateAndSetupWebUIDataSource() {
+content::WebUIDataSource* CreateAndSetupWebUIDataSource(Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIMemoriesHost);
@@ -28,10 +32,27 @@ content::WebUIDataSource* CreateAndSetupWebUIDataSource() {
};
source->AddLocalizedStrings(kStrings);
+ // TODO(crbug.com/1173908): Replace these with localized strings.
+ source->AddString("clearLabel", u"Clear search");
+ source->AddString("searchPrompt", u"Search memories");
+ source->AddString("memoryTitleDescription",
+ u"Based on previous web activity");
+ source->AddString("topVisitsSectionHeader", u"From Chrome History");
+ source->AddString("relatedTabGroupsAndBookmarksSectionHeader",
+ u"From tab groups and bookmarks");
+ source->AddString("tabGroupTileCaption", u"Recent tab group");
+ source->AddString("relatedSearchesSectionHeader", u"Try searching for");
+
webui::SetupWebUIDataSource(
source, base::make_span(kMemoriesResources, kMemoriesResourcesSize),
IDR_MEMORIES_MEMORIES_HTML);
+ content::URLDataSource::Add(profile,
+ std::make_unique<SanitizedImageSource>(profile));
+ content::URLDataSource::Add(
+ profile, std::make_unique<FaviconSource>(
+ profile, chrome::FaviconUrlFormat::kFavicon2));
+
return source;
}
@@ -44,7 +65,7 @@ MemoriesUI::MemoriesUI(content::WebUI* web_ui)
DCHECK(profile_);
DCHECK(web_contents_);
- auto* source = CreateAndSetupWebUIDataSource();
+ auto* source = CreateAndSetupWebUIDataSource(profile_);
content::WebUIDataSource::Add(profile_, source);
}
diff --git a/chromium/chrome/browser/ui/webui/memory_internals_ui.cc b/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
index d7564825f8e..e69663bace9 100644
--- a/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -36,6 +36,7 @@
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/process_type.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "ui/shell_dialogs/select_file_dialog.h"
@@ -208,7 +209,10 @@ void MemoryInternalsDOMHandler::HandleRequestProcessList(
// This is called on the UI thread, the child process iterator must run on
// the IO thread, while the render process iterator must run on the UI thread.
- content::GetIOThreadTaskRunner({})->PostTask(
+ auto task_runner = base::FeatureList::IsEnabled(features::kProcessHostOnUI)
+ ? content::GetUIThreadTaskRunner({})
+ : content::GetIOThreadTaskRunner({});
+ task_runner->PostTask(
FROM_HERE,
base::BindOnce(&MemoryInternalsDOMHandler::GetChildProcessesOnIOThread,
weak_factory_.GetWeakPtr(), std::move(callback_id)));
@@ -245,7 +249,7 @@ void MemoryInternalsDOMHandler::HandleSaveDump(const base::ListValue* args) {
std::make_unique<ChromeSelectFilePolicy>(web_ui_->GetWebContents()));
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(), default_file,
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(), default_file,
nullptr, 0, FILE_PATH_LITERAL(".json.gz"),
web_ui_->GetWebContents()->GetTopLevelNativeWindow(), nullptr);
#endif
diff --git a/chromium/chrome/browser/ui/webui/metrics_handler.cc b/chromium/chrome/browser/ui/webui/metrics_handler.cc
index 595b8f080b5..3567b6e055d 100644
--- a/chromium/chrome/browser/ui/webui/metrics_handler.cc
+++ b/chromium/chrome/browser/ui/webui/metrics_handler.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/notreached.h"
@@ -40,6 +41,10 @@ void MetricsHandler::RegisterMessages() {
"metricsHandler:recordTime",
base::BindRepeating(&MetricsHandler::HandleRecordTime,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "metricsHandler:recordMediumTime",
+ base::BindRepeating(&MetricsHandler::HandleRecordMediumTime,
+ base::Unretained(this)));
}
void MetricsHandler::HandleRecordAction(const base::ListValue* args) {
@@ -113,3 +118,17 @@ void MetricsHandler::HandleRecordTime(const base::ListValue* args) {
base::HistogramBase::kUmaTargetedHistogramFlag);
counter->AddTime(time_value);
}
+
+void MetricsHandler::HandleRecordMediumTime(const base::ListValue* args) {
+ std::string histogram_name;
+ double value;
+
+ if (!args->GetString(0, &histogram_name) || !args->GetDouble(1, &value) ||
+ value < 0) {
+ NOTREACHED();
+ return;
+ }
+
+ base::UmaHistogramMediumTimes(histogram_name,
+ base::TimeDelta::FromMilliseconds(value));
+}
diff --git a/chromium/chrome/browser/ui/webui/metrics_handler.h b/chromium/chrome/browser/ui/webui/metrics_handler.h
index 43b4a17574b..dd2d16f6e9b 100644
--- a/chromium/chrome/browser/ui/webui/metrics_handler.h
+++ b/chromium/chrome/browser/ui/webui/metrics_handler.h
@@ -49,11 +49,16 @@ class MetricsHandler : public content::WebUIMessageHandler {
// the value to record.
void HandleRecordBooleanHistogram(const base::ListValue* args);
- // Record a millisecond time value in a histogram, similar to
+ // Records a millisecond time value in a histogram, similar to
// UMA_HISTOGRAM_TIMES. Handles times between 1ms and 10sec. |args|
// contains the histogram name and a value in milliseconds.
void HandleRecordTime(const base::ListValue* args);
+ // Records a millisecond time value in a histogram, similar to
+ // UmaHistogramMedium. Handles times up to 3 minutes. |args| contains the
+ // histogram name and a value in milliseconds.
+ void HandleRecordMediumTime(const base::ListValue* args);
+
private:
DISALLOW_COPY_AND_ASSIGN(MetricsHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/nacl_ui.cc b/chromium/chrome/browser/ui/webui/nacl_ui.cc
index fb64c79f136..970f1d7b09a 100644
--- a/chromium/chrome/browser/ui/webui/nacl_ui.cc
+++ b/chromium/chrome/browser/ui/webui/nacl_ui.cc
@@ -20,7 +20,6 @@
#include "base/memory/weak_ptr.h"
#include "base/metrics/user_metrics.h"
#include "base/path_service.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
@@ -162,8 +161,8 @@ void NaClDomHandler::OnJavascriptDisallowed() {
}
void AddPair(base::ListValue* list,
- const base::string16& key,
- const base::string16& value) {
+ const std::u16string& key,
+ const std::u16string& value) {
std::unique_ptr<base::DictionaryValue> results(new base::DictionaryValue());
results->SetString("key", key);
results->SetString("value", value);
@@ -172,7 +171,7 @@ void AddPair(base::ListValue* list,
// Generate an empty data-pair which acts as a line break.
void AddLineBreak(base::ListValue* list) {
- AddPair(list, ASCIIToUTF16(""), ASCIIToUTF16(""));
+ AddPair(list, u"", u"");
}
bool NaClDomHandler::isPluginEnabled(size_t plugin_index) {
@@ -188,8 +187,9 @@ bool NaClDomHandler::isPluginEnabled(size_t plugin_index) {
void NaClDomHandler::AddOperatingSystemInfo(base::ListValue* list) {
// Obtain the Chrome version info.
AddPair(list, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME),
- ASCIIToUTF16(version_info::GetVersionNumber() + " (" +
- chrome::GetChannelName() + ")"));
+ ASCIIToUTF16(
+ version_info::GetVersionNumber() + " (" +
+ chrome::GetChannelName(chrome::WithExtendedStable(true)) + ")"));
// OS version information.
// TODO(jvoung): refactor this to share the extra windows labeling
@@ -231,27 +231,27 @@ void NaClDomHandler::AddPluginList(base::ListValue* list) {
std::vector<content::WebPluginInfo> info_array;
PluginService::GetInstance()->GetPluginInfoArray(
GURL(), "application/x-nacl", false, &info_array, NULL);
- base::string16 nacl_version;
- base::string16 nacl_key = ASCIIToUTF16("NaCl plugin");
+ std::u16string nacl_version;
+ std::u16string nacl_key = u"NaCl plugin";
if (info_array.empty()) {
- AddPair(list, nacl_key, ASCIIToUTF16("Disabled"));
+ AddPair(list, nacl_key, u"Disabled");
} else {
// Only the 0th plugin is used.
- nacl_version = info_array[0].version + ASCIIToUTF16(" ") +
- info_array[0].path.LossyDisplayName();
+ nacl_version =
+ info_array[0].version + u" " + info_array[0].path.LossyDisplayName();
if (!isPluginEnabled(0)) {
- nacl_version += ASCIIToUTF16(" (Disabled in profile prefs)");
+ nacl_version += u" (Disabled in profile prefs)";
}
AddPair(list, nacl_key, nacl_version);
// Mark the rest as not used.
for (size_t i = 1; i < info_array.size(); ++i) {
- nacl_version = info_array[i].version + ASCIIToUTF16(" ") +
- info_array[i].path.LossyDisplayName();
- nacl_version += ASCIIToUTF16(" (not used)");
+ nacl_version =
+ info_array[i].version + u" " + info_array[i].path.LossyDisplayName();
+ nacl_version += u" (not used)";
if (!isPluginEnabled(i)) {
- nacl_version += ASCIIToUTF16(" (Disabled in profile prefs)");
+ nacl_version += u" (Disabled in profile prefs)";
}
AddPair(list, nacl_key, nacl_version);
}
@@ -261,42 +261,34 @@ void NaClDomHandler::AddPluginList(base::ListValue* list) {
void NaClDomHandler::AddPnaclInfo(base::ListValue* list) {
// Display whether PNaCl is enabled.
- base::string16 pnacl_enabled_string = ASCIIToUTF16("Enabled");
+ std::u16string pnacl_enabled_string = u"Enabled";
if (!isPluginEnabled(0)) {
- pnacl_enabled_string = ASCIIToUTF16("Disabled in profile prefs");
+ pnacl_enabled_string = u"Disabled in profile prefs";
}
- AddPair(list,
- ASCIIToUTF16("Portable Native Client (PNaCl)"),
- pnacl_enabled_string);
+ AddPair(list, u"Portable Native Client (PNaCl)", pnacl_enabled_string);
// Obtain the version of the PNaCl translator.
base::FilePath pnacl_path;
bool got_path =
base::PathService::Get(chrome::DIR_PNACL_COMPONENT, &pnacl_path);
if (!got_path || pnacl_path.empty() || !pnacl_path_exists_) {
- AddPair(list,
- ASCIIToUTF16("PNaCl translator"),
- ASCIIToUTF16("Not installed"));
+ AddPair(list, u"PNaCl translator", u"Not installed");
} else {
- AddPair(list,
- ASCIIToUTF16("PNaCl translator path"),
- pnacl_path.LossyDisplayName());
- AddPair(list,
- ASCIIToUTF16("PNaCl translator version"),
+ AddPair(list, u"PNaCl translator path", pnacl_path.LossyDisplayName());
+ AddPair(list, u"PNaCl translator version",
ASCIIToUTF16(pnacl_version_string_));
}
AddLineBreak(list);
}
void NaClDomHandler::AddNaClInfo(base::ListValue* list) {
- base::string16 nacl_enabled_string = ASCIIToUTF16("Disabled");
+ std::u16string nacl_enabled_string = u"Disabled";
if (isPluginEnabled(0) &&
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableNaCl)) {
- nacl_enabled_string = ASCIIToUTF16("Enabled by flag '--enable-nacl'");
+ nacl_enabled_string = u"Enabled by flag '--enable-nacl'";
}
- AddPair(list,
- ASCIIToUTF16("Native Client (non-portable, outside web store)"),
+ AddPair(list, u"Native Client (non-portable, outside web store)",
nacl_enabled_string);
AddLineBreak(list);
}
diff --git a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.cc b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.cc
new file mode 100644
index 00000000000..23e35bbaae1
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.cc
@@ -0,0 +1,48 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h"
+#include "base/bind.h"
+#include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h"
+#include "chrome/browser/nearby_sharing/logging/logging.h"
+#include "chrome/browser/profiles/profile.h"
+
+namespace {
+
+const char kNearbySharingPrefPrefix[] = "nearby_sharing";
+
+} // namespace
+
+NearbyInternalsPrefsHandler::NearbyInternalsPrefsHandler(
+ content::BrowserContext* context) {
+ Profile* profile = Profile::FromBrowserContext(context);
+ pref_service_ = profile->GetPrefs();
+}
+
+NearbyInternalsPrefsHandler::~NearbyInternalsPrefsHandler() = default;
+
+void NearbyInternalsPrefsHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "clearNearbyPrefs",
+ base::BindRepeating(&NearbyInternalsPrefsHandler::HandleClearNearbyPrefs,
+ base::Unretained(this)));
+}
+
+void NearbyInternalsPrefsHandler::OnJavascriptAllowed() {}
+
+void NearbyInternalsPrefsHandler::OnJavascriptDisallowed() {}
+
+void NearbyInternalsPrefsHandler::HandleClearNearbyPrefs(
+ const base::ListValue* args) {
+ // Turn Nearby feature off.
+ pref_service_->SetBoolean(prefs::kNearbySharingEnabledPrefName, false);
+
+ // Clear all Nearby related prefs.
+ pref_service_->ClearPrefsWithPrefixSilently(kNearbySharingPrefPrefix);
+
+ // Add log message so users who trigger the Clear Pref button on
+ // chrome://nearby-internals know that the Nearby prefs have been cleared.
+ NS_LOG(INFO)
+ << "Nearby Share has been disabled and Nearby prefs have been cleared.";
+}
diff --git a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h
new file mode 100644
index 00000000000..3aae5e2a881
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#ifndef CHROME_BROWSER_UI_WEBUI_NEARBY_INTERNALS_NEARBY_INTERNALS_PREFS_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_NEARBY_INTERNALS_NEARBY_INTERNALS_PREFS_HANDLER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+namespace content {
+class BrowserContext;
+} // namespace content
+
+// WebUIMessageHandler for Nearby Prefs to allow users to Clear Prefs from the
+// chrome://nearby-internals logging tab.
+class NearbyInternalsPrefsHandler : public content::WebUIMessageHandler {
+ public:
+ explicit NearbyInternalsPrefsHandler(content::BrowserContext* context);
+ NearbyInternalsPrefsHandler(const NearbyInternalsPrefsHandler&) = delete;
+ NearbyInternalsPrefsHandler& operator=(const NearbyInternalsPrefsHandler&) =
+ delete;
+ ~NearbyInternalsPrefsHandler() override;
+
+ // content::WebUIMessageHandler
+ void RegisterMessages() override;
+ void OnJavascriptAllowed() override;
+ void OnJavascriptDisallowed() override;
+
+ private:
+ // Message handler callback that clears Nearby prefs in order to put the user
+ // back into a state of before they have touched the feature.
+ void HandleClearNearbyPrefs(const base::ListValue* args);
+
+ PrefService* pref_service_ = nullptr;
+
+ base::WeakPtrFactory<NearbyInternalsPrefsHandler> weak_ptr_factory_{this};
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_NEARBY_INTERNALS_NEARBY_INTERNALS_PREFS_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.cc b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.cc
index 5da4c4360bd..ad5ef685c14 100644
--- a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_contact_handler.h"
#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_http_handler.h"
#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_logs_handler.h"
+#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_prefs_handler.h"
#include "chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h"
@@ -49,6 +50,8 @@ NearbyInternalsUI::NearbyInternalsUI(content::WebUI* web_ui)
web_ui->AddMessageHandler(
std::make_unique<NearbyInternalsHttpHandler>(context));
web_ui->AddMessageHandler(
+ std::make_unique<NearbyInternalsPrefsHandler>(context));
+ web_ui->AddMessageHandler(
std::make_unique<NearbyInternalsUiTriggerHandler>(context));
}
diff --git a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
index 8ff79d7046e..edcde58e6d9 100644
--- a/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
+++ b/chromium/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
@@ -134,9 +134,33 @@ std::string TransferUpdateMetaDataToString(
case TransferMetadata::Status::kUnsupportedAttachmentType:
return "Transfer status: Unsupported Attachment Type";
case TransferMetadata::Status::kExternalProviderLaunched:
- return "'Transfer status: External Provider Launched";
+ return "Transfer status: External Provider Launched";
case TransferMetadata::Status::kConnecting:
- return "'Transfer status: Connecting";
+ return "Transfer status: Connecting";
+ case TransferMetadata::Status::kDecodeAdvertisementFailed:
+ return "Transfer status: Decode Advertistement Failed";
+ case TransferMetadata::Status::kMissingTransferUpdateCallback:
+ return "Transfer status: Missing Transfer Update Callback";
+ case TransferMetadata::Status::kMissingShareTarget:
+ return "Transfer status: Missing Share Target";
+ case TransferMetadata::Status::kMissingEndpointId:
+ return "Transfer status: Missing Endpoint Id";
+ case TransferMetadata::Status::kMissingPayloads:
+ return "Transfer status: Missing Payloads";
+ case TransferMetadata::Status::kPairedKeyVerificationFailed:
+ return "Transfer status: Paired Key Verification Failed";
+ case TransferMetadata::Status::kInvalidIntroductionFrame:
+ return "Transfer status: Invalid Introduction Frame";
+ case TransferMetadata::Status::kIncompletePayloads:
+ return "Transfer status: Incomplete Payloads";
+ case TransferMetadata::Status::kFailedToCreateShareTarget:
+ return "Transfer status: Failed To Create Share Target";
+ case TransferMetadata::Status::kFailedToInitiateOutgoingConnection:
+ return "Transfer status: Failed To Initiate Outgoing Connection";
+ case TransferMetadata::Status::kFailedToReadOutgoingConnectionResponse:
+ return "Transfer status: Failed To Read Outgoing Connection Response.";
+ case TransferMetadata::Status::kUnexpectedDisconnection:
+ return "Transfer status: Unexpected Disconnection";
}
}
diff --git a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share.mojom b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share.mojom
index 38fd1bd1844..2a9ad91c80e 100644
--- a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share.mojom
+++ b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share.mojom
@@ -93,6 +93,30 @@ enum TransferStatus {
kNotEnoughSpace,
// The file type is not supported for sharing.
kUnsupportedAttachmentType,
+ // The advertisement failed to decode.
+ kDecodeAdvertisementFailed,
+ // The share target doesn't have a transfer update callback.
+ kMissingTransferUpdateCallback,
+ // Could not find the appropriate share target.
+ kMissingShareTarget,
+ // Could not find the appropriate endpoint id.
+ kMissingEndpointId,
+ // The transfer doesn't have any payloads.
+ kMissingPayloads,
+ // The Paired Key Verification step failed.
+ kPairedKeyVerificationFailed,
+ // The introduction frame is invalid.
+ kInvalidIntroductionFrame,
+ // The completed transfer didn't complete all expected payloads.
+ kIncompletePayloads,
+ // Could not create a share target for transfer.
+ kFailedToCreateShareTarget,
+ // The outgoing connection failed to initiate.
+ kFailedToInitiateOutgoingConnection,
+ // The outgoing connection response couldn't be read.
+ kFailedToReadOutgoingConnectionResponse,
+ // The connection unexpectedly disconnected.
+ kUnexpectedDisconnection,
};
// Metadata associated with the current transfer.
@@ -165,9 +189,14 @@ interface DiscoveryManager {
// Starts discovering nearby devices. The passed |listener| will be called
// with any discovered devices. Returns before discovery has actually
// started; see |DiscoveryObserver.OnStartDiscoveryResult()|.
+ // Ensure StopDiscovery is called before invoking StartDiscovery again.
StartDiscovery(pending_remote<ShareTargetListener> listener)
=> (StartDiscoveryResult result);
+ // Stops the current discovery session. Call StartDiscovery to start
+ // the session again.
+ StopDiscovery() => ();
+
// Select a previously discovered |share_target_id| to send data to. On
// success this will return valid ConfirmationManager and
// TransferUpdateListener interfaces to be used to show an additional
@@ -209,6 +238,12 @@ interface ReceiveObserver {
// Called when the Nearby utility process stops.
OnNearbyProcessStopped();
+
+ // Called when advertising fails to start. If advertising fails, then high
+ // visibility will not be turned on.
+ // |ReceiveManager.RegisterForegroundReceiveSurface()| may be called again
+ // to reattempt.
+ OnStartAdvertisingFailure();
};
// Allows the caller to observe changes to or query high visibility, or
diff --git a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
index 960593faca1..27e483db4e6 100644
--- a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
+++ b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/nearby_sharing/nearby_sharing_service_impl.h"
#include "chrome/browser/nearby_sharing/text_attachment.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/metrics_handler.h"
#include "chrome/browser/ui/webui/nearby_share/shared_resources.h"
#include "chrome/browser/ui/webui/plural_string_handler.h"
#include "chrome/browser/ui/webui/webui_util.h"
@@ -71,6 +72,8 @@ NearbyShareDialogUI::NearbyShareDialogUI(content::WebUI* web_ui)
"nearbyShareContactVisibilityNumUnreachable",
IDS_NEARBY_CONTACT_VISIBILITY_NUM_UNREACHABLE);
web_ui->AddMessageHandler(std::move(plural_string_handler));
+ // Add the metrics handler to write uma stats.
+ web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
content::WebUIDataSource::Add(profile, html_source);
@@ -80,15 +83,6 @@ NearbyShareDialogUI::NearbyShareDialogUI(content::WebUI* web_ui)
NearbyShareDialogUI::~NearbyShareDialogUI() = default;
-void NearbyShareDialogUI::AddObserver(NearbyShareDialogUI::Observer* observer) {
- observers_.AddObserver(observer);
-}
-
-void NearbyShareDialogUI::RemoveObserver(
- NearbyShareDialogUI::Observer* observer) {
- observers_.RemoveObserver(observer);
-}
-
void NearbyShareDialogUI::SetAttachments(
std::vector<std::unique_ptr<Attachment>> attachments) {
attachments_ = std::move(attachments);
@@ -119,8 +113,12 @@ void NearbyShareDialogUI::BindInterface(
}
void NearbyShareDialogUI::HandleClose(const base::ListValue* args) {
- for (auto& observer : observers_) {
- observer.OnClose();
+ if (sharesheet_controller_) {
+ sharesheet_controller_->CloseSharesheet();
+
+ // We need to clear out the controller here to protect against calling
+ // CloseShareSheet() more than once, which will cause a crash.
+ sharesheet_controller_ = nullptr;
}
}
diff --git a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h
index 0b1f8122e3b..d8edeaed826 100644
--- a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h
+++ b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h
@@ -8,9 +8,8 @@
#include <memory>
#include <vector>
-#include "base/observer_list.h"
-#include "base/observer_list_types.h"
#include "chrome/browser/nearby_sharing/attachment.h"
+#include "chrome/browser/sharesheet/sharesheet_controller.h"
#include "chrome/browser/ui/webui/nearby_share/nearby_share.mojom.h"
#include "chrome/browser/ui/webui/nearby_share/public/mojom/nearby_share_settings.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -23,18 +22,14 @@ namespace nearby_share {
// The WebUI controller for chrome://nearby.
class NearbyShareDialogUI : public ui::MojoWebUIController {
public:
- class Observer : public base::CheckedObserver {
- public:
- virtual void OnClose() = 0;
- };
-
explicit NearbyShareDialogUI(content::WebUI* web_ui);
NearbyShareDialogUI(const NearbyShareDialogUI&) = delete;
NearbyShareDialogUI& operator=(const NearbyShareDialogUI&) = delete;
~NearbyShareDialogUI() override;
- void AddObserver(Observer* observer);
- void RemoveObserver(Observer* observer);
+ void SetSharesheetController(sharesheet::SharesheetController* controller) {
+ sharesheet_controller_ = controller;
+ }
void SetAttachments(std::vector<std::unique_ptr<Attachment>> attachments);
// Instantiates the implementor of the mojom::DiscoveryManager mojo
@@ -58,8 +53,12 @@ class NearbyShareDialogUI : public ui::MojoWebUIController {
// of file paths.
void SetAttachmentFromQueryParameter(const GURL& url);
+ // A pointer to the Sharesheet controller is provided by
+ // |NearbyShareAction::LaunchAction| when this WebUI controller is created. It
+ // is used to close the Sharesheet in |HandleClose|.
+ sharesheet::SharesheetController* sharesheet_controller_ = nullptr;
+
std::vector<std::unique_ptr<Attachment>> attachments_;
- base::ObserverList<Observer> observers_;
NearbySharingService* nearby_service_;
WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui_browsertest.cc
index 233c1b61681..3b0c8c6e14e 100644
--- a/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui_browsertest.cc
@@ -17,10 +17,12 @@
namespace {
-class TestObserver : public nearby_share::NearbyShareDialogUI::Observer {
+class TestSharesheetController : public sharesheet::SharesheetController {
public:
- // nearby_share::NearbyShareDialogUI::Observer:
- void OnClose() override { close_called = true; }
+ // sharesheet::SharesheetController
+ Profile* GetProfile() override { return nullptr; }
+ void SetSharesheetSize(const int& width, const int& height) override {}
+ void CloseSharesheet() override { close_called = true; }
bool close_called = false;
};
@@ -32,10 +34,9 @@ class NearbyShareDialogUITest : public InProcessBrowserTest {
}
~NearbyShareDialogUITest() override = default;
- TestObserver observer_;
-
- private:
+ protected:
base::test::ScopedFeatureList scoped_feature_list_;
+ TestSharesheetController sharesheet_controller_;
};
} // namespace
@@ -60,7 +61,8 @@ IN_PROC_BROWSER_TEST_F(NearbyShareDialogUITest, RendersComponent) {
EXPECT_EQ(1, num_nearby_share_app);
}
-IN_PROC_BROWSER_TEST_F(NearbyShareDialogUITest, ObserverGetsCalledOnClose) {
+IN_PROC_BROWSER_TEST_F(NearbyShareDialogUITest,
+ SharesheetControllerGetsCalledOnClose) {
// First, check that navigation succeeds.
GURL kUrl(content::GetWebUIURL(chrome::kChromeUINearbyShareHost));
ui_test_utils::NavigateToURL(browser(), kUrl);
@@ -78,12 +80,19 @@ IN_PROC_BROWSER_TEST_F(NearbyShareDialogUITest, ObserverGetsCalledOnClose) {
webui->GetController()->GetAs<nearby_share::NearbyShareDialogUI>();
ASSERT_TRUE(nearby_ui);
- nearby_ui->AddObserver(&observer_);
+ // Calling 'close' before a Sharesheet controller is registered via
+ // |SetSharesheetController| does not result in a crash.
+ EXPECT_TRUE(content::ExecuteScript(web_contents, "chrome.send('close');"));
+ EXPECT_FALSE(sharesheet_controller_.close_called);
+
+ // The Sharesheet controller gets called on 'close' if it's been registered.
+ nearby_ui->SetSharesheetController(&sharesheet_controller_);
EXPECT_TRUE(content::ExecuteScript(web_contents, "chrome.send('close');"));
- EXPECT_TRUE(observer_.close_called);
+ EXPECT_TRUE(sharesheet_controller_.close_called);
- nearby_ui->RemoveObserver(&observer_);
- observer_.close_called = false;
+ // Any subsequent calls to 'close' do not call the Sharesheet controller,
+ // since that would result in a crash.
+ sharesheet_controller_.close_called = false;
EXPECT_TRUE(content::ExecuteScript(web_contents, "chrome.send('close');"));
- EXPECT_FALSE(observer_.close_called);
+ EXPECT_FALSE(sharesheet_controller_.close_called);
}
diff --git a/chromium/chrome/browser/ui/webui/net_export_ui.cc b/chromium/chrome/browser/ui/webui/net_export_ui.cc
index a23323638a1..a12ad7b5e7e 100644
--- a/chromium/chrome/browser/ui/webui/net_export_ui.cc
+++ b/chromium/chrome/browser/ui/webui/net_export_ui.cc
@@ -319,7 +319,7 @@ void NetExportMessageHandler::StartNetLog(const base::FilePath& path) {
file_writer_->StartNetLog(
path, capture_mode_, max_log_file_size_,
base::CommandLine::ForCurrentProcess()->GetCommandLineString(),
- chrome::GetChannelName(),
+ chrome::GetChannelName(chrome::WithExtendedStable(true)),
content::BrowserContext::GetDefaultStoragePartition(
Profile::FromWebUI(web_ui()))
->GetNetworkContext());
@@ -368,7 +368,7 @@ void NetExportMessageHandler::ShowSelectFileDialog(
file_type_info.extensions = {{FILE_PATH_LITERAL("json")}};
gfx::NativeWindow owning_window = webcontents->GetTopLevelNativeWindow();
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(), default_path,
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(), default_path,
&file_type_info, 0, base::FilePath::StringType(), owning_window, nullptr);
}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
index 1783caf2084..2042361f49b 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -326,6 +326,8 @@ interface PageHandler {
SetModuleDisabled(string module_id, bool disabled);
// Triggers a call to |SetDisabledModules|.
UpdateDisabledModules();
+ // Called when at least one module has loaded with data.
+ OnModulesLoadedWithData();
// ======= METRICS =======
// Logs that |tiles| were displayed / updated at |time|. The first instance of
@@ -374,17 +376,6 @@ interface PageHandler {
OnVoiceSearchAction(VoiceSearchAction action);
// Logs an error occurred while using voice search.
OnVoiceSearchError(VoiceSearchError error);
- // Logs a module impression. Called when a module is loaded and can be seen by
- // the user (scrolled into view).
- OnModuleImpression(string module_id, double time);
- // Logs that a module loaded data for |duration| and finished successfully at
- // |time|.
- OnModuleLoaded(string module_id, mojo_base.mojom.TimeDelta duration,
- double time);
- // Logs when a user interacts with a module which will result in a navigation.
- OnModuleUsage(string module_id);
- // Logs that the modules have been shown at |time|.
- OnModulesRendered(double time);
// Logs that the <ntp-app> element's |ready| callback method was called.
OnAppRendered(double time);
};
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index a1c923bcf04..c8982ec659a 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -30,6 +30,8 @@
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/search_provider_logos/logo_service_factory.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
+#include "chrome/browser/ui/hats/hats_service.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
#include "chrome/browser/ui/webui/realbox/realbox.mojom.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/search/instant_types.h"
@@ -67,15 +69,7 @@ new_tab_page::mojom::ThemePtr MakeTheme(const NtpTheme& ntp_theme) {
}
auto background_image = new_tab_page::mojom::BackgroundImage::New();
if (!ntp_theme.custom_background_url.is_empty()) {
- base::StringPiece url = ntp_theme.custom_background_url.spec();
- // TODO(crbug.com/1041125): Clean up when chrome-search://local-ntp removed.
- if (base::StartsWith(url, "chrome-search://local-ntp/")) {
- background_image->url =
- GURL("chrome-untrusted://new-tab-page/" +
- url.substr(strlen("chrome-search://local-ntp/")).as_string());
- } else {
- background_image->url = ntp_theme.custom_background_url;
- }
+ background_image->url = ntp_theme.custom_background_url;
} else if (ntp_theme.has_theme_image) {
theme->shortcut_use_title_pill = true;
background_image->url =
@@ -357,8 +351,6 @@ NewTabPageHandler::NewTabPageHandler(
instant_service_->UpdateNtpTheme();
promo_service_observation_.Observe(promo_service_);
one_google_bar_service_observation_.Observe(one_google_bar_service_);
- logger_.SetModulesVisible(
- profile_->GetPrefs()->GetBoolean(prefs::kNtpModulesVisible));
}
NewTabPageHandler::~NewTabPageHandler() {
@@ -556,12 +548,12 @@ void NewTabPageHandler::ChooseLocalCustomBackground(
file_types.extensions[0].push_back(FILE_PATH_LITERAL("png"));
file_types.extension_description_overrides.push_back(
l10n_util::GetStringUTF16(IDS_UPLOAD_IMAGE_FORMAT));
+ choose_local_custom_background_callback_ = std::move(callback);
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(),
+ ui::SelectFileDialog::SELECT_OPEN_FILE, std::u16string(),
profile_->last_selected_directory(), &file_types, 0,
base::FilePath::StringType(), web_contents_->GetTopLevelNativeWindow(),
nullptr);
- choose_local_custom_background_callback_ = std::move(callback);
}
void NewTabPageHandler::GetOneGoogleBarParts(
@@ -661,6 +653,14 @@ void NewTabPageHandler::UpdateDisabledModules() {
std::move(module_ids));
}
+void NewTabPageHandler::OnModulesLoadedWithData() {
+ HatsService* hats_service =
+ HatsServiceFactory::GetForProfile(profile_, /*create_if_necessary=*/true);
+ CHECK(hats_service);
+ hats_service->LaunchDelayedSurveyForWebContents(kHatsSurveyTriggerNtpModules,
+ web_contents_, 0);
+}
+
void NewTabPageHandler::OnPromoDataUpdated() {
if (promo_load_start_time_.has_value()) {
base::TimeDelta duration = base::TimeTicks::Now() - *promo_load_start_time_;
@@ -966,29 +966,6 @@ void NewTabPageHandler::OnVoiceSearchError(
LogEvent(event);
}
-void NewTabPageHandler::OnModuleImpression(const std::string& module_id,
- double time) {
- logger_.LogModuleImpression(
- module_id, base::Time::FromJsTime(time) - ntp_navigation_start_time_);
-}
-
-void NewTabPageHandler::OnModuleLoaded(const std::string& module_id,
- base::TimeDelta duration,
- double time) {
- logger_.LogModuleLoaded(
- module_id, base::Time::FromJsTime(time) - ntp_navigation_start_time_,
- duration);
-}
-
-void NewTabPageHandler::OnModuleUsage(const std::string& module_id) {
- logger_.LogModuleUsage(module_id);
-}
-
-void NewTabPageHandler::OnModulesRendered(double time) {
- logger_.LogEvent(NTP_MODULES_SHOWN,
- base::Time::FromJsTime(time) - ntp_navigation_start_time_);
-}
-
void NewTabPageHandler::NtpThemeChanged(const NtpTheme& ntp_theme) {
page_->SetTheme(MakeTheme(ntp_theme));
}
@@ -1139,6 +1116,7 @@ void NewTabPageHandler::OnOneGoogleBarServiceShuttingDown() {
void NewTabPageHandler::FileSelected(const base::FilePath& path,
int index,
void* params) {
+ DCHECK(choose_local_custom_background_callback_);
if (instant_service_) {
profile_->set_last_selected_directory(path.DirName());
instant_service_->SelectLocalBackgroundImage(path);
@@ -1150,16 +1128,19 @@ void NewTabPageHandler::FileSelected(const base::FilePath& path,
LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_DONE);
LogEvent(NTP_BACKGROUND_UPLOAD_DONE);
- std::move(choose_local_custom_background_callback_).Run(true);
+ if (choose_local_custom_background_callback_)
+ std::move(choose_local_custom_background_callback_).Run(true);
}
void NewTabPageHandler::FileSelectionCanceled(void* params) {
+ DCHECK(choose_local_custom_background_callback_);
select_file_dialog_ = nullptr;
// File selection can happen at any time after NTP load, and is not logged
// with the event.
LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL);
LogEvent(NTP_BACKGROUND_UPLOAD_CANCEL);
- std::move(choose_local_custom_background_callback_).Run(false);
+ if (choose_local_custom_background_callback_)
+ std::move(choose_local_custom_background_callback_).Run(false);
}
void NewTabPageHandler::OnLogoAvailable(
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
index 865b53850a5..cd02ccc12a9 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
@@ -102,6 +102,7 @@ class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
void SetModulesVisible(bool visible) override;
void SetModuleDisabled(const std::string& module_id, bool disabled) override;
void UpdateDisabledModules() override;
+ void OnModulesLoadedWithData() override;
void OnAppRendered(double time) override;
void OnMostVisitedTilesRendered(
std::vector<new_tab_page::mojom::MostVisitedTilePtr> tiles,
@@ -131,12 +132,6 @@ class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
void OnVoiceSearchAction(
new_tab_page::mojom::VoiceSearchAction action) override;
void OnVoiceSearchError(new_tab_page::mojom::VoiceSearchError error) override;
- void OnModuleImpression(const std::string& module_id, double time) override;
- void OnModuleLoaded(const std::string& module_id,
- base::TimeDelta duration,
- double time) override;
- void OnModuleUsage(const std::string& module_id) override;
- void OnModulesRendered(double time) override;
private:
// InstantServiceObserver:
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 375fcec9f9e..d5980582614 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -28,6 +28,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/new_tab_page_resources.h"
#include "chrome/grit/new_tab_page_resources_map.h"
@@ -57,7 +58,9 @@ using content::WebContents;
namespace {
-content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
+content::WebUIDataSource* CreateNewTabPageUiHtmlSource(
+ Profile* profile,
+ const base::Time& navigation_start_time) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUINewTabPageHost);
@@ -70,6 +73,7 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
->search_terms_data()
.GoogleBaseURLValue())
.spec());
+ source->AddDouble("navigationStartTime", navigation_start_time.ToJsTime());
// Realbox.
source->AddBoolean(
@@ -104,6 +108,8 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
base::FeatureList::IsEnabled(ntp_features::kNtpMiddleSlotPromo));
source->AddBoolean("modulesEnabled",
base::FeatureList::IsEnabled(ntp_features::kModules));
+ source->AddBoolean("modulesLoadEnabled", base::FeatureList::IsEnabled(
+ ntp_features::kNtpModulesLoad));
source->AddInteger("modulesLoadTimeout",
ntp_features::GetModulesLoadTimeout().InMilliseconds());
@@ -198,6 +204,9 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
// Theme.
{"themeCreatedBy", IDS_NEW_TAB_ATTRIBUTION_INTRO},
+ {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE},
+ {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY},
+ {"ok", IDS_OK},
// Modules.
{"dismissModuleToastMessage", IDS_NTP_MODULES_DISMISS_TOAST_MESSAGE},
@@ -236,24 +245,39 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
IDS_NTP_MODULES_CART_CART_MENU_REMOVE_MERCHANT},
{"modulesCartCartMenuRemoveMerchantToastMessage",
IDS_NTP_MODULES_CART_CART_MENU_REMOVE_MERCHANT_TOAST_MESSAGE},
+ {"modulesCartDiscountChipAmount",
+ IDS_NTP_MODULES_CART_DISCOUNT_CHIP_AMOUNT},
+ {"modulesCartDiscountChipUpToAmount",
+ IDS_NTP_MODULES_CART_DISCOUNT_CHIP_UP_TO_AMOUNT},
+ {"modulesCartDiscountConsentContent",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_CONTENT},
+ {"modulesCartDiscountConsentAccept",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_ACCEPT},
+ {"modulesCartDiscountConsentAcceptConfirmation",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_ACCEPT_CONFIRMATION},
+ {"modulesCartDiscountConsentReject",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_REJECT},
+ {"modulesCartDiscountConsentRejectConfirmation",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_REJECT_CONFIRMATION},
+ {"modulesCartDiscountConsentConfirmationDismiss",
+ IDS_NTP_MODULES_CART_DISCOUNT_CONSENT_CONFIRMATION_DISMISS},
};
source->AddLocalizedStrings(kStrings);
- source->AddString("modulesTasksInfo1",
- l10n_util::GetStringFUTF16(
- IDS_NTP_MODULES_SHOPPING_TASKS_INFO_1,
- base::UTF8ToUTF16("https://myactivity.google.com/")));
- source->AddString("modulesTasksInfo2",
- l10n_util::GetStringFUTF16(
- IDS_NTP_MODULES_SHOPPING_TASKS_INFO_2,
- base::UTF8ToUTF16("https://policies.google.com/")));
+ source->AddString(
+ "modulesTasksInfo1",
+ l10n_util::GetStringFUTF16(IDS_NTP_MODULES_SHOPPING_TASKS_INFO_1,
+ u"https://myactivity.google.com/"));
+ source->AddString(
+ "modulesTasksInfo2",
+ l10n_util::GetStringFUTF16(IDS_NTP_MODULES_SHOPPING_TASKS_INFO_2,
+ u"https://policies.google.com/"));
// Register images that are purposefully not inlined in the HTML and instead
// are set in Javascript.
static constexpr webui::ResourcePath kImages[] = {
{omnibox::kGoogleGIconResourceName,
IDR_WEBUI_IMAGES_200_LOGO_GOOGLEG_PNG},
- {omnibox::kBookmarkIconResourceName, IDR_LOCAL_NTP_ICONS_BOOKMARK},
{omnibox::kCalculatorIconResourceName, IDR_LOCAL_NTP_ICONS_CALCULATOR},
{omnibox::kClockIconResourceName, IDR_LOCAL_NTP_ICONS_CLOCK},
{omnibox::kDriveDocsIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_DOCS},
@@ -283,6 +307,12 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
base::FeatureList::IsEnabled(ntp_features::kNtpChromeCartModule));
source->AddBoolean("driveModuleEnabled", base::FeatureList::IsEnabled(
ntp_features::kNtpDriveModule));
+ source->AddBoolean(
+ "ruleBasedDiscountEnabled",
+ base::GetFieldTrialParamValueByFeature(
+ ntp_features::kNtpChromeCartModule,
+ ntp_features::kNtpChromeCartModuleAbandonedCartDiscountParam) ==
+ "true");
webui::SetupWebUIDataSource(
source, base::make_span(kNewTabPageResources, kNewTabPageResourcesSize),
@@ -322,7 +352,7 @@ NewTabPageUI::NewTabPageUI(content::WebUI* web_ui)
// for the unlikely case where the NewTabPageHandler is created before we
// received the DidStartNavigation event.
navigation_start_time_(base::Time::Now()) {
- auto* source = CreateNewTabPageUiHtmlSource(profile_);
+ auto* source = CreateNewTabPageUiHtmlSource(profile_, navigation_start_time_);
source->AddBoolean("customBackgroundDisabledByPolicy",
instant_service_->IsCustomBackgroundDisabledByPolicy());
source->AddBoolean(
@@ -451,6 +481,10 @@ void NewTabPageUI::DidStartNavigation(
content::NavigationHandle* navigation_handle) {
if (navigation_handle->IsInMainFrame()) {
navigation_start_time_ = base::Time::Now();
+ std::unique_ptr<base::DictionaryValue> update(new base::DictionaryValue);
+ update->SetDouble("navigationStartTime", navigation_start_time_.ToJsTime());
+ content::WebUIDataSource::Update(profile_, chrome::kChromeUINewTabPageHost,
+ std::move(update));
}
}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
index b2b90542d67..22bb21731eb 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
@@ -167,7 +167,7 @@ void UntrustedSource::StartDataRequest(
url::DecodeURLMode::kUTF8OrIsomorphic, &output);
params.insert(
{url.query().substr(key.begin, key.len),
- base::UTF16ToUTF8(base::string16(output.data(), output.length()))});
+ base::UTF16ToUTF8(std::u16string(output.data(), output.length()))});
}
// Extract desired values.
ServeBackgroundImage(
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc b/chromium/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
index bf0b0316304..88faf925705 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
@@ -28,9 +28,7 @@ void ExpectIsWebUiNtp(content::WebContents* tab) {
class WebUiNtpBrowserTest : public InProcessBrowserTest {
public:
- WebUiNtpBrowserTest() {
- feature_list_.InitAndEnableFeature(ntp_features::kWebUI);
- }
+ WebUiNtpBrowserTest() = default;
~WebUiNtpBrowserTest() override = default;
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/BUILD.gn b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/BUILD.gn
new file mode 100644
index 00000000000..5a7815c8f54
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/BUILD.gn
@@ -0,0 +1,14 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+ sources = [ "new_tab_page_third_party.mojom" ]
+ public_deps = [
+ "//mojo/public/mojom/base",
+ "//skia/public/mojom",
+ "//url/mojom:url_mojom_gurl",
+ ]
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/DIR_METADATA b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/DIR_METADATA
new file mode 100644
index 00000000000..77ca58fb9b4
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+ component: "UI>Browser>NewTabPage"
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/OWNERS b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/OWNERS
new file mode 100644
index 00000000000..8bd6249e0b3
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/OWNERS
@@ -0,0 +1,6 @@
+aee@chromium.org
+mahmadi@chromium.org
+tiborg@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom
new file mode 100644
index 00000000000..c6841c8b024
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom
@@ -0,0 +1,96 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module new_tab_page_third_party.mojom;
+
+import "mojo/public/mojom/base/text_direction.mojom";
+import "mojo/public/mojom/base/time.mojom";
+import "skia/public/mojom/skcolor.mojom";
+import "url/mojom/url.mojom";
+
+struct MostVisitedTile {
+ string title;
+ mojo_base.mojom.TextDirection title_direction;
+ url.mojom.Url url;
+ bool is_query_tile;
+
+ // ======= METRICS =======
+ // Identifier of most visited entry source (e.g. top sites).
+ int32 source;
+ // Identifier of most visited entry title source (e.g. page's title tag).
+ int32 title_source;
+ // Time the most visited entry was generated (e.g. received by a suggestion
+ // server).
+ mojo_base.mojom.Time data_generation_time;
+};
+
+// A generic theme.
+struct Theme {
+ skia.mojom.SkColor shortcut_background_color;
+ skia.mojom.SkColor shortcut_text_color;
+ // True if |shortcut_background_color| is dark.
+ bool shortcut_use_white_tile_icon;
+ // True if the shortcuts titles should be wrapped in a pill.
+ bool shortcut_use_title_pill;
+ // True if the theme is dark (e.g. NTP background color is dark).
+ bool is_dark;
+ // Used to show the theme extension background if one is set.
+ string id;
+ // Theme color ready to be set in CSS.
+ string color_background;
+ // The theme extension can set image tiling. This is ready to be set in CSS.
+ string background_tiling;
+ // Position CSS of background image.
+ string background_position;
+ // True if custom background is set.
+ bool has_custom_background;
+};
+
+// Used by the WebUI page to bootstrap bidirectional communication.
+interface PageHandlerFactory {
+ // The WebUI page's |BrowserProxy| singleton calls this method when the page
+ // is first initialized.
+ CreatePageHandler(pending_remote<Page> page,
+ pending_receiver<PageHandler> handler);
+};
+
+// Browser-side handler for requests from WebUI page.
+interface PageHandler {
+ // Deletes tile by |url|.
+ DeleteMostVisitedTile(url.mojom.Url url);
+ // Logs that |tile| at position |index| was triggered to navigate to that
+ // most visited entry.
+ // |mouse_button| indicates which mouse button was pressed on the entry. See
+ // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
+ OnMostVisitedTileNavigation(MostVisitedTile tile,
+ uint32 index,
+ uint8 mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key);
+ // Replaces the custom and most-visited tiles with the default tile set.
+ RestoreMostVisitedDefaults();
+ // Undoes the last action done to the tiles (add, delete, reorder, restore or
+ // update). Note that only the last action can be undone.
+ UndoMostVisitedTileAction();
+ // Called to update the tiles.
+ UpdateMostVisitedTiles();
+ // Called to update the theme.
+ UpdateTheme();
+
+ // ======= METRICS =======
+ // Logs that |tiles| were displayed / updated at |time|. The first instance of
+ // this event is used as a proxy for when the NTP has finished loading.
+ OnMostVisitedTilesRendered(array<MostVisitedTile> tiles, double time);
+};
+
+// WebUI-side handler for requests from the browser.
+interface Page {
+ // Updates the page with most-visited info which includes whether the
+ // tiles should be shown, if links can be customized and the tiles.
+ SetMostVisitedTiles(array<MostVisitedTile> tiles);
+ // Sets the current theme.
+ SetTheme(Theme theme);
+};
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.cc b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.cc
new file mode 100644
index 00000000000..6fcb9e8a22d
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.cc
@@ -0,0 +1,208 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h"
+
+#include "base/feature_list.h"
+#include "base/strings/strcat.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/themes/theme_properties.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
+#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/theme_resources.h"
+#include "components/ntp_tiles/constants.h"
+#include "components/prefs/pref_service.h"
+#include "components/search/ntp_features.h"
+#include "components/search_engines/template_url_service.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/gfx/color_utils.h"
+
+NewTabPageThirdPartyHandler::NewTabPageThirdPartyHandler(
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandler>
+ pending_page_handler,
+ mojo::PendingRemote<new_tab_page_third_party::mojom::Page> pending_page,
+ Profile* profile,
+ content::WebContents* web_contents,
+ const base::Time& ntp_navigation_start_time)
+ : most_visited_sites_(
+ ChromeMostVisitedSitesFactory::NewForProfile(profile)),
+ profile_(profile),
+ web_contents_(web_contents),
+ logger_(profile, GURL(chrome::kChromeUINewTabPageThirdPartyURL)),
+ ntp_navigation_start_time_(ntp_navigation_start_time),
+ page_{std::move(pending_page)},
+ receiver_{this, std::move(pending_page_handler)} {
+ most_visited_sites_->SetMostVisitedURLsObserver(
+ this, ntp_tiles::kMaxNumMostVisited);
+ most_visited_sites_->EnableCustomLinks(false);
+ // Listen for theme installation.
+ ThemeServiceFactory::GetForProfile(profile_)->AddObserver(this);
+}
+
+NewTabPageThirdPartyHandler::~NewTabPageThirdPartyHandler() {
+ ThemeServiceFactory::GetForProfile(profile_)->RemoveObserver(this);
+}
+
+void NewTabPageThirdPartyHandler::DeleteMostVisitedTile(const GURL& url) {
+ most_visited_sites_->AddOrRemoveBlockedUrl(url, true);
+ last_blocklisted_ = url;
+}
+
+void NewTabPageThirdPartyHandler::RestoreMostVisitedDefaults() {
+ most_visited_sites_->ClearBlockedUrls();
+}
+
+void NewTabPageThirdPartyHandler::UndoMostVisitedTileAction() {
+ most_visited_sites_->AddOrRemoveBlockedUrl(last_blocklisted_, false);
+ last_blocklisted_ = GURL();
+}
+
+void NewTabPageThirdPartyHandler::UpdateMostVisitedTiles() {
+ NotifyAboutMostVisitedTiles();
+}
+
+void NewTabPageThirdPartyHandler::UpdateTheme() {
+ NotifyAboutTheme();
+}
+
+void NewTabPageThirdPartyHandler::OnMostVisitedTilesRendered(
+ std::vector<new_tab_page_third_party::mojom::MostVisitedTilePtr> tiles,
+ double time) {
+ for (size_t i = 0; i < tiles.size(); i++) {
+ logger_.LogMostVisitedImpression(ntp_tiles::NTPTileImpression(
+ /*index=*/i,
+ /*source=*/static_cast<ntp_tiles::TileSource>(tiles[i]->source),
+ /*title_source=*/
+ static_cast<ntp_tiles::TileTitleSource>(tiles[i]->title_source),
+ /*visual_type=*/
+ ntp_tiles::TileVisualType::ICON_REAL /* unused on desktop */,
+ /*icon_type=*/favicon_base::IconType::kInvalid /* unused on desktop */,
+ /*data_generation_time=*/tiles[i]->data_generation_time,
+ /*url_for_rappor=*/GURL() /* unused */));
+ }
+ // This call flushes all most visited impression logs to UMA histograms.
+ // Therefore, it must come last.
+ logger_.LogEvent(NTP_ALL_TILES_LOADED,
+ base::Time::FromJsTime(time) - ntp_navigation_start_time_);
+}
+
+void NewTabPageThirdPartyHandler::OnMostVisitedTileNavigation(
+ new_tab_page_third_party::mojom::MostVisitedTilePtr tile,
+ uint32_t index,
+ uint8_t mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key) {
+ logger_.LogMostVisitedNavigation(ntp_tiles::NTPTileImpression(
+ /*index=*/index,
+ /*source=*/static_cast<ntp_tiles::TileSource>(tile->source),
+ /*title_source=*/
+ static_cast<ntp_tiles::TileTitleSource>(tile->title_source),
+ /*visual_type=*/
+ ntp_tiles::TileVisualType::ICON_REAL /* unused on desktop */,
+ /*icon_type=*/favicon_base::IconType::kInvalid /* unused on desktop */,
+ /*data_generation_time=*/tile->data_generation_time,
+ /*url_for_rappor=*/GURL() /* unused */));
+
+ if (!base::FeatureList::IsEnabled(
+ ntp_features::kNtpHandleMostVisitedNavigationExplicitly))
+ return;
+
+ WindowOpenDisposition disposition = ui::DispositionFromClick(
+ /*middle_button=*/mouse_button == 1, alt_key, ctrl_key, meta_key,
+ shift_key);
+ // Clicks on the MV tiles should be treated as if the user clicked on a
+ // bookmark. This is consistent with Android's native implementation and
+ // ensures the visit count for the MV entry is updated.
+ // Use a link transition for query tiles, e.g., repeatable queries, so that
+ // their visit count is not updated by this navigation. Otherwise duplicate
+ // query tiles could also be offered as most visited.
+ // |is_query_tile| can be true only when ntp_features::kNtpRepeatableQueries
+ // is enabled.
+ web_contents_->OpenURL(content::OpenURLParams(
+ tile->url, content::Referrer(), disposition,
+ tile->is_query_tile ? ui::PAGE_TRANSITION_LINK
+ : ui::PAGE_TRANSITION_AUTO_BOOKMARK,
+ false));
+}
+
+void NewTabPageThirdPartyHandler::OnThemeChanged() {
+ NotifyAboutTheme();
+}
+
+void NewTabPageThirdPartyHandler::OnURLsAvailable(
+ const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
+ sections) {
+ most_visited_tiles_ = sections.at(ntp_tiles::SectionType::PERSONALIZED);
+ NotifyAboutMostVisitedTiles();
+}
+
+void NewTabPageThirdPartyHandler::OnIconMadeAvailable(const GURL& site_url) {}
+
+void NewTabPageThirdPartyHandler::OnNativeThemeUpdated(
+ ui::NativeTheme* observed_theme) {
+ NotifyAboutTheme();
+}
+
+void NewTabPageThirdPartyHandler::NotifyAboutMostVisitedTiles() {
+ auto* template_url_service =
+ TemplateURLServiceFactory::GetForProfile(profile_);
+ std::vector<new_tab_page_third_party::mojom::MostVisitedTilePtr> tiles;
+ for (auto& tile : most_visited_tiles_) {
+ auto value = new_tab_page_third_party::mojom::MostVisitedTile::New();
+ if (tile.title.empty()) {
+ value->title = tile.url.spec();
+ value->title_direction = base::i18n::LEFT_TO_RIGHT;
+ } else {
+ value->title = base::UTF16ToUTF8(tile.title);
+ value->title_direction =
+ base::i18n::GetFirstStrongCharacterDirection(tile.title);
+ }
+ value->url = tile.url;
+ value->source = static_cast<int32_t>(tile.source);
+ value->title_source = static_cast<int32_t>(tile.title_source);
+ value->data_generation_time = tile.data_generation_time;
+ value->is_query_tile =
+ base::FeatureList::IsEnabled(ntp_features::kNtpRepeatableQueries) &&
+ template_url_service &&
+ template_url_service->IsSearchResultsPageFromDefaultSearchProvider(
+ tile.url);
+ tiles.push_back(std::move(value));
+ }
+ page_->SetMostVisitedTiles(std::move(tiles));
+}
+
+void NewTabPageThirdPartyHandler::NotifyAboutTheme() {
+ auto theme = new_tab_page_third_party::mojom::Theme::New();
+ const ui::ThemeProvider& theme_provider =
+ ThemeService::GetThemeProviderForProfile(profile_);
+ theme->shortcut_background_color =
+ theme_provider.GetColor(ThemeProperties::COLOR_NTP_SHORTCUT);
+ theme->shortcut_text_color =
+ theme_provider.GetColor(ThemeProperties::COLOR_NTP_TEXT);
+ theme->is_dark = !color_utils::IsDark(theme->shortcut_text_color);
+ theme->shortcut_use_white_tile_icon =
+ color_utils::IsDark(theme->shortcut_background_color);
+ theme->shortcut_use_title_pill = false;
+ theme->color_background = color_utils::SkColorToRgbaString(
+ GetThemeColor(webui::GetNativeTheme(web_contents_), theme_provider,
+ ThemeProperties::COLOR_NTP_BACKGROUND));
+ if (theme_provider.HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
+ theme->background_tiling = GetNewTabBackgroundTilingCSS(theme_provider);
+ theme->background_position = GetNewTabBackgroundPositionCSS(theme_provider);
+ theme->has_custom_background =
+ theme_provider.HasCustomImage(IDR_THEME_NTP_BACKGROUND);
+ theme->id = profile_->GetPrefs()->GetString(prefs::kCurrentThemeID);
+ theme->shortcut_use_title_pill = true;
+ }
+ page_->SetTheme(std::move(theme));
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h
new file mode 100644
index 00000000000..08ffd6f7f76
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h
@@ -0,0 +1,103 @@
+// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_HANDLER_H_
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "base/time/time.h"
+#include "chrome/browser/themes/theme_service_observer.h"
+#include "chrome/browser/ui/search/ntp_user_data_logger.h"
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom.h"
+#include "chrome/common/search/ntp_logging_events.h"
+#include "components/ntp_tiles/most_visited_sites.h"
+#include "components/ntp_tiles/ntp_tile.h"
+#include "components/ntp_tiles/section_type.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/native_theme/native_theme_observer.h"
+
+class GURL;
+class Profile;
+
+namespace content {
+class WebContents;
+} // namespace content
+
+class NewTabPageThirdPartyHandler
+ : public new_tab_page_third_party::mojom::PageHandler,
+ public ntp_tiles::MostVisitedSites::Observer,
+ public ThemeServiceObserver,
+ public ui::NativeThemeObserver {
+ public:
+ NewTabPageThirdPartyHandler(
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandler>
+ pending_page_handler,
+ mojo::PendingRemote<new_tab_page_third_party::mojom::Page> pending_page,
+ Profile* profile,
+ content::WebContents* web_contents,
+ const base::Time& ntp_navigation_start_time);
+ ~NewTabPageThirdPartyHandler() override;
+
+ // new_tab_page_third_party::mojom::PageHandler:
+ void DeleteMostVisitedTile(const GURL& url) override;
+ void OnMostVisitedTilesRendered(
+ std::vector<new_tab_page_third_party::mojom::MostVisitedTilePtr> tiles,
+ double time) override;
+ void OnMostVisitedTileNavigation(
+ new_tab_page_third_party::mojom::MostVisitedTilePtr tile,
+ uint32_t index,
+ uint8_t mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key) override;
+ void RestoreMostVisitedDefaults() override;
+ void UndoMostVisitedTileAction() override;
+ void UpdateMostVisitedTiles() override;
+ void UpdateTheme() override;
+
+ private:
+ // ThemeServiceObserver:
+ void OnThemeChanged() override;
+
+ // ntp_tiles::MostVisitedSites::Observer implementation.
+ void OnURLsAvailable(
+ const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
+ sections) override;
+ void OnIconMadeAvailable(const GURL& site_url) override;
+
+ // ui::NativeThemeObserver:
+ void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
+
+ void NotifyAboutMostVisitedTiles();
+ void NotifyAboutTheme();
+
+ std::unique_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_;
+ Profile* profile_;
+ content::WebContents* web_contents_;
+ ntp_tiles::NTPTilesVector most_visited_tiles_;
+ NTPUserDataLogger logger_;
+ base::Time ntp_navigation_start_time_;
+ GURL last_blocklisted_;
+
+ // These are located at the end of the list of member variables to ensure the
+ // WebUI page is disconnected before other members are destroyed.
+ mojo::Remote<new_tab_page_third_party::mojom::Page> page_;
+ mojo::Receiver<new_tab_page_third_party::mojom::PageHandler> receiver_;
+
+ base::WeakPtrFactory<NewTabPageThirdPartyHandler> weak_ptr_factory_{this};
+
+ DISALLOW_COPY_AND_ASSIGN(NewTabPageThirdPartyHandler);
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.cc b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.cc
new file mode 100644
index 00000000000..0801d5f42be
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.cc
@@ -0,0 +1,137 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h"
+
+#include <memory>
+#include <utility>
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/themes/theme_properties.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h"
+#include "chrome/browser/ui/webui/favicon_source.h"
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_handler.h"
+#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
+#include "chrome/browser/ui/webui/theme_source.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/new_tab_page_third_party_resources.h"
+#include "chrome/grit/new_tab_page_third_party_resources_map.h"
+#include "chrome/grit/theme_resources.h"
+#include "components/favicon_base/favicon_url_parser.h"
+#include "components/prefs/pref_service.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/color_utils.h"
+#include "ui/resources/grit/webui_generated_resources.h"
+#include "url/url_util.h"
+
+using content::BrowserContext;
+using content::WebContents;
+
+namespace {
+
+content::WebUIDataSource* CreateNewTabPageThirdPartyUiHtmlSource(
+ Profile* profile,
+ WebContents* web_contents) {
+ content::WebUIDataSource* source = content::WebUIDataSource::Create(
+ chrome::kChromeUINewTabPageThirdPartyHost);
+ ui::Accelerator undo_accelerator(ui::VKEY_Z, ui::EF_PLATFORM_ACCELERATOR);
+ source->AddString("undoDescription", l10n_util::GetStringFUTF16(
+ IDS_UNDO_DESCRIPTION,
+ undo_accelerator.GetShortcutText()));
+ static constexpr webui::LocalizedString kStrings[] = {
+ {"linkRemove", IDS_NTP_CUSTOM_LINKS_REMOVE},
+ {"linkRemovedMsg", IDS_NTP_CONFIRM_MSG_SHORTCUT_REMOVED},
+ {"restoreThumbnailsShort", IDS_NEW_TAB_RESTORE_THUMBNAILS_SHORT_LINK},
+ {"title", IDS_NEW_TAB_TITLE},
+ {"undo", IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE},
+ };
+
+ source->AddLocalizedStrings(kStrings);
+
+ const ui::ThemeProvider& theme_provider =
+ ThemeService::GetThemeProviderForProfile(profile);
+ source->AddString("backgroundPosition",
+ GetNewTabBackgroundPositionCSS(theme_provider));
+ source->AddString("backgroundTiling",
+ GetNewTabBackgroundTilingCSS(theme_provider));
+ source->AddString("colorBackground",
+ color_utils::SkColorToRgbaString(GetThemeColor(
+ webui::GetNativeTheme(web_contents), theme_provider,
+ ThemeProperties::COLOR_NTP_BACKGROUND)));
+ source->AddString("themeId",
+ profile->GetPrefs()->GetString(prefs::kCurrentThemeID));
+ source->AddString("hascustombackground",
+ theme_provider.HasCustomImage(IDR_THEME_NTP_BACKGROUND)
+ ? "has-custom-background"
+ : "");
+ source->AddString("isdark", !color_utils::IsDark(theme_provider.GetColor(
+ ThemeProperties::COLOR_NTP_TEXT))
+ ? "dark"
+ : "");
+
+ webui::SetupWebUIDataSource(
+ source,
+ base::make_span(kNewTabPageThirdPartyResources,
+ kNewTabPageThirdPartyResourcesSize),
+ IDR_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_HTML);
+
+ return source;
+}
+} // namespace
+
+NewTabPageThirdPartyUI::NewTabPageThirdPartyUI(content::WebUI* web_ui)
+ : ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/false),
+ page_factory_receiver_(this),
+ profile_(Profile::FromWebUI(web_ui)),
+ web_contents_(web_ui->GetWebContents()),
+ navigation_start_time_(base::Time::Now()) {
+ auto* source =
+ CreateNewTabPageThirdPartyUiHtmlSource(profile_, web_contents_);
+ content::WebUIDataSource::Add(profile_, source);
+ content::URLDataSource::Add(
+ profile_, std::make_unique<FaviconSource>(
+ profile_, chrome::FaviconUrlFormat::kFavicon2));
+ content::URLDataSource::Add(profile_,
+ std::make_unique<ThemeSource>(profile_));
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(NewTabPageThirdPartyUI)
+
+NewTabPageThirdPartyUI::~NewTabPageThirdPartyUI() = default;
+
+// static
+bool NewTabPageThirdPartyUI::IsNewTabPageOrigin(const GURL& url) {
+ return url.GetOrigin() ==
+ GURL(chrome::kChromeUINewTabPageThirdPartyURL).GetOrigin();
+}
+
+void NewTabPageThirdPartyUI::BindInterface(
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandlerFactory>
+ pending_receiver) {
+ if (page_factory_receiver_.is_bound()) {
+ page_factory_receiver_.reset();
+ }
+
+ page_factory_receiver_.Bind(std::move(pending_receiver));
+}
+
+void NewTabPageThirdPartyUI::CreatePageHandler(
+ mojo::PendingRemote<new_tab_page_third_party::mojom::Page> pending_page,
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandler>
+ pending_page_handler) {
+ DCHECK(pending_page.is_valid());
+
+ page_handler_ = std::make_unique<NewTabPageThirdPartyHandler>(
+ std::move(pending_page_handler), std::move(pending_page), profile_,
+ web_contents_, navigation_start_time_);
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h
new file mode 100644
index 00000000000..1d84d8f917a
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h
@@ -0,0 +1,64 @@
+// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_UI_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party.mojom.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace content {
+class WebContents;
+class WebUI;
+} // namespace content
+
+class GURL;
+class NewTabPageThirdPartyHandler;
+class Profile;
+
+class NewTabPageThirdPartyUI
+ : public ui::MojoWebUIController,
+ public new_tab_page_third_party::mojom::PageHandlerFactory {
+ public:
+ explicit NewTabPageThirdPartyUI(content::WebUI* web_ui);
+ ~NewTabPageThirdPartyUI() override;
+
+ static bool IsNewTabPageOrigin(const GURL& url);
+
+ // Instantiates the implementor of the mojom::PageHandlerFactory mojo
+ // interface passing the pending receiver that will be internally bound.
+ void BindInterface(
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandlerFactory>
+ pending_receiver);
+
+ private:
+ // new_tab_page::mojom::PageHandlerFactory:
+ void CreatePageHandler(
+ mojo::PendingRemote<new_tab_page_third_party::mojom::Page> pending_page,
+ mojo::PendingReceiver<new_tab_page_third_party::mojom::PageHandler>
+ pending_page_handler) override;
+
+ std::unique_ptr<NewTabPageThirdPartyHandler> page_handler_;
+ mojo::Receiver<new_tab_page_third_party::mojom::PageHandlerFactory>
+ page_factory_receiver_;
+ Profile* profile_;
+ content::WebContents* web_contents_;
+ // Time the NTP started loading. Used for logging the WebUI NTP's load
+ // performance.
+ base::Time navigation_start_time_;
+
+ WEB_UI_CONTROLLER_TYPE_DECL();
+
+ DISALLOW_COPY_AND_ASSIGN(NewTabPageThirdPartyUI);
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_THIRD_PARTY_NEW_TAB_PAGE_THIRD_PARTY_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 1af2c59a4cd..46a3e6b3d37 100644
--- a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -205,7 +205,7 @@ void AppLauncherHandler::CreateWebAppInfo(const web_app::AppId& app_id,
auto& registrar = web_app_provider_->registrar();
- base::string16 name = base::UTF8ToUTF16(registrar.GetAppShortName(app_id));
+ std::u16string name = base::UTF8ToUTF16(registrar.GetAppShortName(app_id));
NewTabUI::SetUrlTitleAndDirection(value, name,
registrar.GetAppStartUrl(app_id));
NewTabUI::SetFullNameAndDirection(name, value);
@@ -314,14 +314,14 @@ void AppLauncherHandler::CreateExtensionInfo(const Extension* extension,
// The Extension class 'helpfully' wraps bidi control characters that
// impede our ability to determine directionality.
- base::string16 short_name = base::UTF8ToUTF16(extension->short_name());
+ std::u16string short_name = base::UTF8ToUTF16(extension->short_name());
base::i18n::UnadjustStringForLocaleDirection(&short_name);
NewTabUI::SetUrlTitleAndDirection(
value,
short_name,
extensions::AppLaunchInfo::GetFullLaunchURL(extension));
- base::string16 name = base::UTF8ToUTF16(extension->name());
+ std::u16string name = base::UTF8ToUTF16(extension->name());
base::i18n::UnadjustStringForLocaleDirection(&name);
NewTabUI::SetFullNameAndDirection(name, value);
@@ -373,8 +373,9 @@ void AppLauncherHandler::CreateExtensionInfo(const Extension* extension,
extensions::AppLaunchInfo::GetLaunchContainer(extension)));
ExtensionPrefs* prefs = ExtensionPrefs::Get(extension_service_->profile());
value->SetInteger("launch_type", extensions::GetLaunchType(prefs, extension));
- value->SetBoolean("is_component",
- extension->location() == extensions::Manifest::COMPONENT);
+ value->SetBoolean(
+ "is_component",
+ extension->location() == extensions::mojom::ManifestLocation::kComponent);
value->SetBoolean("is_webstore",
extension->id() == extensions::kWebStoreAppId);
@@ -1136,7 +1137,7 @@ void AppLauncherHandler::HandleGenerateAppForLink(const base::ListValue* args) {
if (attempting_web_app_install_page_ordinal_.has_value())
return;
- base::string16 title;
+ std::u16string title;
CHECK(args->GetString(1, &title));
double page_index;
@@ -1224,7 +1225,7 @@ void AppLauncherHandler::OnFaviconForAppInstallFromLink(
web_app->start_url = install_info->app_url;
if (!image_result.image.IsEmpty()) {
- web_app->icon_bitmaps_any[image_result.image.Width()] =
+ web_app->icon_bitmaps.any[image_result.image.Width()] =
image_result.image.AsBitmap();
}
@@ -1308,7 +1309,7 @@ void AppLauncherHandler::OnOsHooksInstalled(
void AppLauncherHandler::OnExtensionUninstallDialogClosed(
bool did_start_uninstall,
- const base::string16& error) {
+ const std::u16string& error) {
CleanupAfterUninstall();
}
diff --git a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
index 30aea059ff3..b1f38975e0d 100644
--- a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
+++ b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
@@ -175,7 +175,7 @@ class AppLauncherHandler
AppInstallInfo();
~AppInstallInfo();
- base::string16 title;
+ std::u16string title;
GURL app_url;
syncer::StringOrdinal page_ordinal;
};
@@ -192,7 +192,7 @@ class AppLauncherHandler
// ExtensionUninstallDialog::Delegate:
void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
- const base::string16& error) override;
+ const std::u16string& error) override;
// ExtensionEnableFlowDelegate:
void ExtensionEnableFlowFinished() override;
diff --git a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.cc
index 814e0063791..ce739abf13c 100644
--- a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.cc
@@ -21,8 +21,8 @@
#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
#include "chrome/browser/ui/webui/ntp/ntp_resource_cache_factory.h"
#include "chrome/browser/ui/webui/theme_handler.h"
+#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/common/url_constants.h"
-#include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/browser_thread.h"
@@ -42,7 +42,7 @@ namespace {
const char kRTLHtmlTextDirection[] = "rtl";
const char kLTRHtmlTextDirection[] = "ltr";
-const char* GetHtmlTextDirection(const base::string16& text) {
+const char* GetHtmlTextDirection(const std::u16string& text) {
if (base::i18n::IsRTL() && base::i18n::StringContainsStrongRTLChars(text))
return kRTLHtmlTextDirection;
return kLTRHtmlTextDirection;
@@ -72,25 +72,11 @@ NewTabUI::NewTabUI(content::WebUI* web_ui) : content::WebUIController(web_ui) {
// content::URLDataSource assumes the ownership of the html source.
content::URLDataSource::Add(profile, std::make_unique<NewTabHTMLSource>(
profile->GetOriginalProfile()));
-
- pref_change_registrar_.Init(profile->GetPrefs());
- pref_change_registrar_.Add(
- bookmarks::prefs::kShowBookmarkBar,
- base::BindRepeating(&NewTabUI::OnShowBookmarkBarChanged,
- base::Unretained(this)));
+ content::URLDataSource::Add(profile, std::make_unique<ThemeSource>(profile));
}
NewTabUI::~NewTabUI() {}
-void NewTabUI::OnShowBookmarkBarChanged() {
- base::Value attached(
- GetProfile()->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar)
- ? "true"
- : "false");
- web_ui()->CallJavascriptFunctionUnsafe("ntp.setBookmarkBarAttached",
- attached);
-}
-
// static
void NewTabUI::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
@@ -105,12 +91,12 @@ bool NewTabUI::IsNewTab(const GURL& url) {
// static
void NewTabUI::SetUrlTitleAndDirection(base::Value* dictionary,
- const base::string16& title,
+ const std::u16string& title,
const GURL& gurl) {
dictionary->SetStringKey("url", gurl.spec());
bool using_url_as_the_title = false;
- base::string16 title_to_set(title);
+ std::u16string title_to_set(title);
if (title_to_set.empty()) {
using_url_as_the_title = true;
title_to_set = base::UTF8ToUTF16(gurl.spec());
@@ -138,7 +124,7 @@ void NewTabUI::SetUrlTitleAndDirection(base::Value* dictionary,
}
// static
-void NewTabUI::SetFullNameAndDirection(const base::string16& full_name,
+void NewTabUI::SetFullNameAndDirection(const std::u16string& full_name,
base::DictionaryValue* dictionary) {
dictionary->SetString("full_name", full_name);
dictionary->SetString("full_name_direction", GetHtmlTextDirection(full_name));
diff --git a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.h b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.h
index fe04e036f11..d8595c4a49e 100644
--- a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.h
+++ b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui.h
@@ -5,9 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_
#define CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "components/prefs/pref_change_registrar.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_ui_controller.h"
@@ -41,11 +41,11 @@ class NewTabUI : public content::WebUIController {
// Adds "url", "title", and "direction" keys on incoming dictionary, setting
// title as the url as a fallback on empty title.
static void SetUrlTitleAndDirection(base::Value* dictionary,
- const base::string16& title,
+ const std::u16string& title,
const GURL& gurl);
// Adds "full_name" and "full_name_direction" keys on incoming dictionary.
- static void SetFullNameAndDirection(const base::string16& full_name,
+ static void SetFullNameAndDirection(const std::u16string& full_name,
base::DictionaryValue* dictionary);
private:
@@ -76,8 +76,6 @@ class NewTabUI : public content::WebUIController {
Profile* GetProfile() const;
- PrefChangeRegistrar pref_change_registrar_;
-
DISALLOW_COPY_AND_ASSIGN(NewTabUI);
};
diff --git a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index 54a952c6e50..4b149e161b7 100644
--- a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -10,7 +10,6 @@
#include "base/bind.h"
#include "base/no_destructor.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
@@ -18,7 +17,6 @@
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/signin_util.h"
@@ -31,6 +29,7 @@
#include "chrome/browser/ui/webui/app_launcher_login_handler.h"
#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
#include "chrome/browser/ui/webui/ntp/cookie_controls_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
@@ -38,7 +37,6 @@
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
-#include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/content_settings/core/common/cookie_controls_enforcement.h"
#include "components/content_settings/core/common/pref_names.h"
#include "components/policy/core/common/policy_service.h"
@@ -47,7 +45,6 @@
#include "components/reading_list/features/reading_list_switches.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_process_host.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
@@ -88,21 +85,32 @@ const char kLearnMoreGuestSessionUrl[] =
const char kLearnMoreEphemeralGuestSessionUrl[] =
"https://support.google.com/chrome/?p=ui_guest";
-SkColor GetThemeColor(const ui::ThemeProvider& tp, int id) {
+std::string ReplaceTemplateExpressions(
+ const scoped_refptr<base::RefCountedMemory>& bytes,
+ const ui::TemplateReplacements& replacements) {
+ return ui::ReplaceTemplateExpressions(
+ base::StringPiece(reinterpret_cast<const char*>(bytes->front()),
+ bytes->size()),
+ replacements);
+}
+
+} // namespace
+
+SkColor GetThemeColor(const ui::NativeTheme* native_theme,
+ const ui::ThemeProvider& tp,
+ int id) {
SkColor color = tp.GetColor(id);
// If web contents are being inverted because the system is in high-contrast
// mode, any system theme colors we use must be inverted too to cancel out.
- return ui::NativeTheme::GetInstanceForNativeUi()
- ->GetPlatformHighContrastColorScheme() ==
+ return native_theme->GetPlatformHighContrastColorScheme() ==
ui::NativeTheme::PlatformHighContrastColorScheme::kDark
? color_utils::InvertColor(color)
: color;
}
-// Get the CSS string for the background position on the new tab page for the
-// states when the bar is attached or detached.
-std::string GetNewTabBackgroundCSS(const ui::ThemeProvider& theme_provider,
- bool bar_attached) {
+// Get the CSS string for the background position on the new tab page.
+std::string GetNewTabBackgroundPositionCSS(
+ const ui::ThemeProvider& theme_provider) {
// TODO(glen): This is a quick workaround to hide the notused.png image when
// no image is provided - we don't have time right now to figure out why
// this is painting as white.
@@ -111,25 +119,8 @@ std::string GetNewTabBackgroundCSS(const ui::ThemeProvider& theme_provider,
return "-64px";
}
- int alignment = theme_provider.GetDisplayProperty(
- ThemeProperties::NTP_BACKGROUND_ALIGNMENT);
-
- if (bar_attached)
- return ThemeProperties::AlignmentToString(alignment);
-
- if (alignment & ThemeProperties::ALIGN_TOP) {
- // The bar is detached, so we must offset the background by the bar size
- // if it's a top-aligned bar.
- int offset = GetLayoutConstant(BOOKMARK_BAR_NTP_HEIGHT);
-
- if (alignment & ThemeProperties::ALIGN_LEFT)
- return "left " + base::NumberToString(-offset) + "px";
- else if (alignment & ThemeProperties::ALIGN_RIGHT)
- return "right " + base::NumberToString(-offset) + "px";
- return "center " + base::NumberToString(-offset) + "px";
- }
-
- return ThemeProperties::AlignmentToString(alignment);
+ return ThemeProperties::AlignmentToString(theme_provider.GetDisplayProperty(
+ ThemeProperties::NTP_BACKGROUND_ALIGNMENT));
}
// How the background image on the new tab page should be tiled (see tiling
@@ -141,33 +132,19 @@ std::string GetNewTabBackgroundTilingCSS(
return ThemeProperties::TilingToString(repeat_mode);
}
-std::string ReplaceTemplateExpressions(
- const scoped_refptr<base::RefCountedMemory>& bytes,
- const ui::TemplateReplacements& replacements) {
- return ui::ReplaceTemplateExpressions(
- base::StringPiece(reinterpret_cast<const char*>(bytes->front()),
- bytes->size()),
- replacements);
-}
-
-} // namespace
-
NTPResourceCache::NTPResourceCache(Profile* profile)
: profile_(profile), is_swipe_tracking_from_scroll_events_enabled_(false) {
- registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
- content::Source<ThemeService>(
- ThemeServiceFactory::GetForProfile(profile)));
+ ThemeServiceFactory::GetForProfile(profile_)->AddObserver(this);
base::RepeatingClosure callback = base::BindRepeating(
&NTPResourceCache::OnPreferenceChanged, base::Unretained(this));
// Watch for pref changes that cause us to need to invalidate the HTML cache.
profile_pref_change_registrar_.Init(profile_->GetPrefs());
- profile_pref_change_registrar_.Add(bookmarks::prefs::kShowBookmarkBar,
- callback);
profile_pref_change_registrar_.Add(prefs::kNtpShownPage, callback);
profile_pref_change_registrar_.Add(prefs::kCookieControlsMode, callback);
+ // TODO(crbug/1056916): Remove the global accessor to NativeTheme.
theme_observation_.Observe(ui::NativeTheme::GetInstanceForNativeUi());
policy_change_registrar_ = std::make_unique<policy::PolicyChangeRegistrar>(
@@ -240,34 +217,38 @@ base::RefCountedMemory* NTPResourceCache::GetNewTabHTML(WindowType win_type) {
}
}
-base::RefCountedMemory* NTPResourceCache::GetNewTabCSS(WindowType win_type) {
+base::RefCountedMemory* NTPResourceCache::GetNewTabCSS(
+ WindowType win_type,
+ content::WebContents::Getter wc_getter) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Guest mode doesn't have theme-related CSS.
if (win_type == GUEST)
return nullptr;
+ // Returns the cached CSS if it exists.
+ // The cache will be invalidated when the theme of |wc_getter| changes.
if (win_type == INCOGNITO) {
if (!new_tab_incognito_css_)
- CreateNewTabIncognitoCSS();
+ CreateNewTabIncognitoCSS(wc_getter);
return new_tab_incognito_css_.get();
}
if (!new_tab_css_)
- CreateNewTabCSS();
+ CreateNewTabCSS(wc_getter);
return new_tab_css_.get();
}
-void NTPResourceCache::Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
-
- // Invalidate the cache.
+void NTPResourceCache::OnThemeChanged() {
Invalidate();
}
+void NTPResourceCache::Shutdown() {
+ ThemeServiceFactory::GetForProfile(profile_)->RemoveObserver(this);
+}
+
void NTPResourceCache::OnNativeThemeUpdated(ui::NativeTheme* updated_theme) {
+ // TODO(crbug/1056916): Remove the global accessor to NativeTheme.
DCHECK_EQ(updated_theme, ui::NativeTheme::GetInstanceForNativeUi());
Invalidate();
}
@@ -290,21 +271,16 @@ void NTPResourceCache::Invalidate() {
void NTPResourceCache::CreateNewTabIncognitoHTML() {
ui::TemplateReplacements replacements;
- // Note: there's specific rules in CSS that look for this attribute's content
- // being equal to "true" as a string.
- replacements["bookmarkbarattached"] =
- profile_->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar)
- ? "true"
- : "false";
// Ensure passing off-the-record profile; |profile_| is not an OTR profile.
DCHECK(!profile_->IsOffTheRecord());
DCHECK(profile_->HasAnyOffTheRecordProfile());
+
// Cookie controls service returns the same result for all off-the-record
// profiles, so it doesn't matter which of them we use.
+ Profile* incognito_profile = profile_->GetAllOffTheRecordProfiles()[0];
CookieControlsService* cookie_controls_service =
- CookieControlsServiceFactory::GetForProfile(
- profile_->GetAllOffTheRecordProfiles()[0]);
+ CookieControlsServiceFactory::GetForProfile(incognito_profile);
replacements["incognitoTabDescription"] =
l10n_util::GetStringUTF8(reading_list::switches::IsReadingListEnabled()
@@ -334,8 +310,12 @@ void NTPResourceCache::CreateNewTabIncognitoHTML() {
replacements["cookieControlsTooltipText"] = l10n_util::GetStringUTF8(
IDS_NEW_TAB_OTR_COOKIE_CONTROLS_CONTROLLED_TOOLTIP_TEXT);
+ // The ThemeProvider can have different behavior depending on regular or
+ // Incognito profile. Therefore, making use of Incognito profile explicitly
+ // here.
const ui::ThemeProvider& tp =
- ThemeService::GetThemeProviderForProfile(profile_);
+ ThemeService::GetThemeProviderForProfile(incognito_profile);
+
replacements["hasCustomBackground"] =
tp.HasCustomImage(IDR_THEME_NTP_BACKGROUND) ? "true" : "false";
@@ -408,7 +388,7 @@ scoped_refptr<base::RefCountedString> NTPResourceCache::CreateNewTabGuestHTML(
l10n_util::GetStringUTF16(IDS_LEARN_MORE));
localized_strings.SetString("enterpriseInfoHintLink",
chrome::kLearnMoreEnterpriseURL);
- base::string16 enterprise_info;
+ std::u16string enterprise_info;
if (connector->IsCloudManaged()) {
const std::string enterprise_domain_manager =
connector->GetEnterpriseDomainManager();
@@ -469,7 +449,9 @@ scoped_refptr<base::RefCountedString> NTPResourceCache::CreateNewTabGuestHTML(
return base::RefCountedString::TakeString(&full_html);
}
-void NTPResourceCache::CreateNewTabIncognitoCSS() {
+void NTPResourceCache::CreateNewTabIncognitoCSS(
+ const content::WebContents::Getter wc_getter) {
+ const ui::NativeTheme* native_theme = webui::GetNativeTheme(wc_getter.Run());
const ui::ThemeProvider& tp = ThemeService::GetThemeProviderForProfile(
profile_->GetPrimaryOTRProfile());
@@ -482,9 +464,8 @@ void NTPResourceCache::CreateNewTabIncognitoCSS() {
// Colors.
substitutions["colorBackground"] = color_utils::SkColorToRgbaString(
- GetThemeColor(tp, ThemeProperties::COLOR_NTP_BACKGROUND));
- substitutions["backgroundBarDetached"] = GetNewTabBackgroundCSS(tp, false);
- substitutions["backgroundBarAttached"] = GetNewTabBackgroundCSS(tp, true);
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_BACKGROUND));
+ substitutions["backgroundPosition"] = GetNewTabBackgroundPositionCSS(tp);
substitutions["backgroundTiling"] = GetNewTabBackgroundTilingCSS(tp);
// Get our template.
@@ -501,19 +482,22 @@ void NTPResourceCache::CreateNewTabIncognitoCSS() {
new_tab_incognito_css_ = base::RefCountedString::TakeString(&full_css);
}
-void NTPResourceCache::CreateNewTabCSS() {
+void NTPResourceCache::CreateNewTabCSS(
+ const content::WebContents::Getter wc_getter) {
+ const ui::NativeTheme* native_theme = webui::GetNativeTheme(wc_getter.Run());
const ui::ThemeProvider& tp =
ThemeService::GetThemeProviderForProfile(profile_);
// Get our theme colors.
SkColor color_background =
- GetThemeColor(tp, ThemeProperties::COLOR_NTP_BACKGROUND);
- SkColor color_text = GetThemeColor(tp, ThemeProperties::COLOR_NTP_TEXT);
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_BACKGROUND);
+ SkColor color_text =
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_TEXT);
SkColor color_text_light =
- GetThemeColor(tp, ThemeProperties::COLOR_NTP_TEXT_LIGHT);
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_TEXT_LIGHT);
SkColor color_header =
- GetThemeColor(tp, ThemeProperties::COLOR_NTP_HEADER);
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_HEADER);
// Generate a lighter color for the header gradients.
color_utils::HSL header_lighter;
color_utils::SkColorToHSL(color_header, &header_lighter);
@@ -539,9 +523,8 @@ void NTPResourceCache::CreateNewTabCSS() {
substitutions["colorBackground"] =
color_utils::SkColorToRgbaString(color_background);
substitutions["colorLink"] = color_utils::SkColorToRgbString(
- GetThemeColor(tp, ThemeProperties::COLOR_NTP_LINK));
- substitutions["backgroundBarDetached"] = GetNewTabBackgroundCSS(tp, false);
- substitutions["backgroundBarAttached"] = GetNewTabBackgroundCSS(tp, true);
+ GetThemeColor(native_theme, tp, ThemeProperties::COLOR_NTP_LINK));
+ substitutions["backgroundPosition"] = GetNewTabBackgroundPositionCSS(tp);
substitutions["backgroundTiling"] = GetNewTabBackgroundTilingCSS(tp);
substitutions["colorTextRgba"] = color_utils::SkColorToRgbaString(color_text);
substitutions["colorTextLight"] =
diff --git a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.h b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.h
index 6a520553958..329247f7bc2 100644
--- a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.h
+++ b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.h
@@ -6,16 +6,17 @@
#define CHROME_BROWSER_UI_WEBUI_NTP_NTP_RESOURCE_CACHE_H_
#include <memory>
+#include <string>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
#include "base/scoped_observation.h"
+#include "chrome/browser/themes/theme_service_observer.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_change_registrar.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/web_contents.h"
#include "ui/native_theme/native_theme.h"
#include "ui/native_theme/native_theme_observer.h"
@@ -34,11 +35,23 @@ namespace policy {
class PolicyChangeRegistrar;
}
+namespace ui {
+class ThemeProvider;
+}
+
+SkColor GetThemeColor(const ui::NativeTheme* native_theme,
+ const ui::ThemeProvider& tp,
+ int id);
+std::string GetNewTabBackgroundPositionCSS(
+ const ui::ThemeProvider& theme_provider);
+std::string GetNewTabBackgroundTilingCSS(
+ const ui::ThemeProvider& theme_provider);
+
// This class keeps a cache of NTP resources (HTML and CSS) so we don't have to
// regenerate them all the time.
// Note: This is only used for incognito and guest mode NTPs (NewTabUI), as well
// as for (non-incognito) app launcher pages (AppLauncherPageUI).
-class NTPResourceCache : public content::NotificationObserver,
+class NTPResourceCache : public ThemeServiceObserver,
public KeyedService,
public ui::NativeThemeObserver {
public:
@@ -55,12 +68,12 @@ class NTPResourceCache : public content::NotificationObserver,
base::RefCountedMemory* GetNewTabGuestHTML();
base::RefCountedMemory* GetNewTabHTML(WindowType win_type);
- base::RefCountedMemory* GetNewTabCSS(WindowType win_type);
+ base::RefCountedMemory* GetNewTabCSS(
+ WindowType win_type,
+ const content::WebContents::Getter wc_getter);
- // content::NotificationObserver:
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override;
+ // ThemeServiceObserver:
+ void OnThemeChanged() override;
static WindowType GetWindowType(
Profile* profile, content::RenderProcessHost* render_host);
@@ -88,6 +101,9 @@ class NTPResourceCache : public content::NotificationObserver,
int warnings_ids;
};
+ // KeyedService:
+ void Shutdown() override;
+
// ui::NativeThemeObserver:
void OnNativeThemeUpdated(ui::NativeTheme* updated_theme) override;
@@ -105,10 +121,10 @@ class NTPResourceCache : public content::NotificationObserver,
bool NewTabHTMLNeedsRefresh();
void CreateNewTabHTML();
- void CreateNewTabCSS();
+ void CreateNewTabCSS(const content::WebContents::Getter wc_getter);
void CreateNewTabIncognitoHTML();
- void CreateNewTabIncognitoCSS();
+ void CreateNewTabIncognitoCSS(const content::WebContents::Getter wc_getter);
scoped_refptr<base::RefCountedString> CreateNewTabGuestHTML(
const GuestNTPInfo& guest_ntp_info);
@@ -129,7 +145,6 @@ class NTPResourceCache : public content::NotificationObserver,
scoped_refptr<base::RefCountedMemory> new_tab_incognito_html_;
scoped_refptr<base::RefCountedMemory> new_tab_incognito_css_;
scoped_refptr<base::RefCountedMemory> new_tab_non_primary_otr_html_;
- content::NotificationRegistrar registrar_;
PrefChangeRegistrar profile_pref_change_registrar_;
PrefChangeRegistrar local_state_pref_change_registrar_;
diff --git a/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
index 0b83168cf5f..3085758c4ff 100644
--- a/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -12,7 +12,6 @@
#include "base/auto_reset.h"
#include "base/base64.h"
#include "base/bind.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/values.h"
@@ -224,7 +223,7 @@ void OmniboxPageHandler::OnResultChanged(AutocompleteController* controller,
(base::Time::Now() - time_omnibox_started_).InMilliseconds();
response->done = controller->done();
response->type = AutocompleteInput::TypeToString(input_.type());
- const base::string16 host =
+ const std::u16string host =
input_.text().substr(input_.parts().host.begin, input_.parts().host.len);
response->host = base::UTF16ToUTF8(host);
bool is_typed_host;
@@ -301,7 +300,7 @@ void OmniboxPageHandler::OnBitmapFetched(const std::string& image_url,
page_->HandleAnswerImageData(image_url, data_url);
}
-bool OmniboxPageHandler::LookupIsTypedHost(const base::string16& host,
+bool OmniboxPageHandler::LookupIsTypedHost(const std::u16string& host,
bool* is_typed_host) const {
history::HistoryService* const history_service =
HistoryServiceFactory::GetForProfile(profile_,
diff --git a/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h b/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
index 3b529a26a0e..ff0766c26a9 100644
--- a/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
@@ -64,7 +64,7 @@ class OmniboxPageHandler : public AutocompleteController::Observer,
// Looks up whether the hostname is a typed host (i.e., has received
// typed visits). Return true if the lookup succeeded; if so, the
// value of |is_typed_host| is set appropriately.
- bool LookupIsTypedHost(const base::string16& host, bool* is_typed_host) const;
+ bool LookupIsTypedHost(const std::u16string& host, bool* is_typed_host) const;
// Re-initializes the AutocompleteController in preparation for the
// next query.
diff --git a/chromium/chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc b/chromium/chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc
index b33b6ad17af..e41b2f2bcde 100644
--- a/chromium/chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc
+++ b/chromium/chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc
@@ -21,7 +21,7 @@ content::WebUIDataSource* CreateHTMLSource(Profile* profile,
content::WebUIDataSource* source =
content::WebUIDataSource::Create(host_name);
- base::string16 page_title;
+ std::u16string page_title;
if (host_name == chrome::kChromeUIBookmarksHost)
page_title = l10n_util::GetStringUTF16(IDS_BOOKMARK_MANAGER_TITLE);
else if (host_name == chrome::kChromeUIHistoryHost)
@@ -32,7 +32,7 @@ content::WebUIDataSource* CreateHTMLSource(Profile* profile,
page_title = base::UTF8ToUTF16(host_name);
source->AddString("pageTitle", page_title);
- base::string16 page_heading = l10n_util::GetStringFUTF16(
+ std::u16string page_heading = l10n_util::GetStringFUTF16(
IDS_PAGE_NOT_AVAILABLE_FOR_GUEST_HEADING, page_title);
source->AddString("pageHeading", page_heading);
diff --git a/chromium/chrome/browser/ui/webui/plural_string_handler.cc b/chromium/chrome/browser/ui/webui/plural_string_handler.cc
index 3648fe02d9e..35dea641ee9 100644
--- a/chromium/chrome/browser/ui/webui/plural_string_handler.cc
+++ b/chromium/chrome/browser/ui/webui/plural_string_handler.cc
@@ -93,7 +93,7 @@ void PluralStringHandler::GetPluralStringTuple(const base::ListValue* args,
string1, string2)));
}
-base::string16 PluralStringHandler::GetPluralizedStringForMessageName(
+std::u16string PluralStringHandler::GetPluralizedStringForMessageName(
std::string message_name,
int count) {
auto message_id_it = name_to_id_.find(message_name);
diff --git a/chromium/chrome/browser/ui/webui/plural_string_handler.h b/chromium/chrome/browser/ui/webui/plural_string_handler.h
index c123a51c377..a4f079c61cd 100644
--- a/chromium/chrome/browser/ui/webui/plural_string_handler.h
+++ b/chromium/chrome/browser/ui/webui/plural_string_handler.h
@@ -37,7 +37,7 @@ class PluralStringHandler : public content::WebUIMessageHandler {
// |HandleGetPluralStringTuple*| methods above.
void GetPluralStringTuple(const base::ListValue* args, int string_tuple_id);
- base::string16 GetPluralizedStringForMessageName(std::string message_name,
+ std::u16string GetPluralizedStringForMessageName(std::string message_name,
int count);
std::map<std::string, int> name_to_id_;
diff --git a/chromium/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
index 3355f373e28..4809079b06c 100644
--- a/chromium/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
@@ -230,7 +230,7 @@ class TestSelectFileDialog : public ui::SelectFileDialog {
: ui::SelectFileDialog(listener, std::move(policy)) {}
void SelectFileImpl(Type type,
- const base::string16& title,
+ const std::u16string& title,
const base::FilePath& default_path,
const FileTypeInfo* file_types,
int file_type_index,
@@ -682,7 +682,8 @@ IN_PROC_BROWSER_TEST_P(ExtensionPolicyUITest,
extensions::ExtensionBuilder builder;
builder.SetPath(temp_dir_.GetPath());
builder.SetManifest(manifest.Build());
- builder.SetLocation(extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD);
+ builder.SetLocation(
+ extensions::mojom::ManifestLocation::kExternalPolicyDownload);
// Install extension.
extensions::ExtensionService* service =
diff --git a/chromium/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chromium/chrome/browser/ui/webui/policy/policy_ui_handler.cc
index 0c7732c6129..160edc51460 100644
--- a/chromium/chrome/browser/ui/webui/policy/policy_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -6,6 +6,7 @@
#include <stddef.h>
+#include <string>
#include <utility>
#include "base/bind.h"
@@ -18,7 +19,6 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/notreached.h"
-#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
@@ -30,6 +30,7 @@
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/enterprise/util/affiliation.h"
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/browser/policy/chrome_policy_conversions_client.h"
#include "chrome/browser/policy/profile_policy_connector.h"
@@ -126,7 +127,7 @@ namespace {
// Formats the association state indicated by |data|. If |data| is NULL, the
// state is considered to be UNMANAGED.
-base::string16 FormatAssociationState(const em::PolicyData* data) {
+std::u16string FormatAssociationState(const em::PolicyData* data) {
if (data) {
switch (data->state()) {
case em::PolicyData::ACTIVE:
@@ -148,10 +149,10 @@ base::string16 FormatAssociationState(const em::PolicyData* data) {
// CloudPolicyStore errors take precedence to show in the status message.
// Other errors (such as transient policy fetching problems) get displayed
// only if CloudPolicyStore is in STATUS_OK.
-base::string16 GetPolicyStatusFromStore(
+std::u16string GetPolicyStatusFromStore(
const policy::CloudPolicyStore* store,
const policy::CloudPolicyClient* client) {
- base::string16 status =
+ std::u16string status =
policy::FormatStoreStatus(store->status(), store->validation_status());
if (store->status() == policy::CloudPolicyStore::STATUS_OK) {
if (client && client->status() != policy::DM_STATUS_SUCCESS)
@@ -162,7 +163,7 @@ base::string16 GetPolicyStatusFromStore(
return status;
}
-base::string16 GetTimeSinceLastRefreshString(base::Time last_refresh_time) {
+std::u16string GetTimeSinceLastRefreshString(base::Time last_refresh_time) {
if (last_refresh_time.is_null())
return l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED);
base::Time now = base::Time::NowFromSystemTime();
@@ -180,7 +181,7 @@ void GetStatusFromCore(const policy::CloudPolicyCore* core,
const policy::CloudPolicyRefreshScheduler* refresh_scheduler =
core->refresh_scheduler();
- const base::string16 status = GetPolicyStatusFromStore(store, client);
+ const std::u16string status = GetPolicyStatusFromStore(store, client);
const em::PolicyData* policy = store->policy();
std::string client_id = policy ? policy->device_id() : std::string();
@@ -219,22 +220,31 @@ void GetStatusFromCore(const policy::CloudPolicyCore* core,
GetTimeSinceLastRefreshString(last_refresh_time));
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
// Adds a new entry to |dict| with the affiliation status of the user associated
// with |profile|. This method shouldn't be called for device scope status.
void GetUserAffiliationStatus(base::DictionaryValue* dict, Profile* profile) {
CHECK(profile);
+#if BUILDFLAG(IS_CHROMEOS_ASH)
const user_manager::User* user =
chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
if (!user)
return;
dict->SetBoolean("isAffiliated", user->IsAffiliated());
+#else // BUILDFLAG(IS_CHROMEOS_ASH)
+ // Don't show affiliation status if the browser isn't enrolled in CBCM.
+ if (!policy::BrowserDMTokenStorage::Get()->RetrieveDMToken().is_valid())
+ return;
+
+ dict->SetBoolean("isAffiliated",
+ chrome::enterprise_util::IsProfileAffiliated(profile));
+#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
+#if BUILDFLAG(IS_CHROMEOS_ASH)
void GetOffHoursStatus(base::DictionaryValue* dict) {
policy::off_hours::DeviceOffHoursController* off_hours_controller =
- chromeos::DeviceSettingsService::Get()->device_off_hours_controller();
+ ash::DeviceSettingsService::Get()->device_off_hours_controller();
if (off_hours_controller) {
dict->SetBoolean("isOffHoursActive",
off_hours_controller->is_off_hours_mode());
@@ -312,13 +322,15 @@ class CloudPolicyCoreStatusProvider
// A cloud policy status provider for user policy.
class UserCloudPolicyStatusProvider : public CloudPolicyCoreStatusProvider {
public:
- explicit UserCloudPolicyStatusProvider(policy::CloudPolicyCore* core);
+ explicit UserCloudPolicyStatusProvider(policy::CloudPolicyCore* core,
+ Profile* profile);
~UserCloudPolicyStatusProvider() override;
// CloudPolicyCoreStatusProvider implementation.
void GetStatus(base::DictionaryValue* dict) override;
private:
+ Profile* profile_;
DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyStatusProvider);
};
@@ -514,8 +526,9 @@ void CloudPolicyCoreStatusProvider::OnStoreError(
}
UserCloudPolicyStatusProvider::UserCloudPolicyStatusProvider(
- policy::CloudPolicyCore* core)
- : CloudPolicyCoreStatusProvider(core) {}
+ policy::CloudPolicyCore* core,
+ Profile* profile)
+ : CloudPolicyCoreStatusProvider(core), profile_(profile) {}
UserCloudPolicyStatusProvider::~UserCloudPolicyStatusProvider() {}
@@ -524,13 +537,14 @@ void UserCloudPolicyStatusProvider::GetStatus(base::DictionaryValue* dict) {
return;
GetStatusFromCore(core_, dict);
ExtractDomainFromUsername(dict);
+ GetUserAffiliationStatus(dict, profile_);
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
UserCloudPolicyStatusProviderChromeOS::UserCloudPolicyStatusProviderChromeOS(
policy::CloudPolicyCore* core,
Profile* profile)
- : UserCloudPolicyStatusProvider(core) {
+ : UserCloudPolicyStatusProvider(core, profile) {
profile_ = profile;
}
@@ -591,7 +605,7 @@ void MachineLevelUserCloudPolicyStatusProvider::GetStatus(
dict->SetString("deviceId", dmTokenStorage->RetrieveClientId());
}
if (store) {
- base::string16 status = GetPolicyStatusFromStore(store, client);
+ std::u16string status = GetPolicyStatusFromStore(store, client);
dict->SetString("status", status);
const em::PolicyData* policy = store->policy();
@@ -703,7 +717,7 @@ void UserActiveDirectoryPolicyStatusProvider::GetStatus(
(policy && policy->has_timestamp())
? base::Time::FromJavaTime(policy->timestamp())
: base::Time();
- const base::string16 status =
+ const std::u16string status =
policy::FormatStoreStatus(policy_manager_->store()->status(),
policy_manager_->store()->validation_status());
dict->SetString("status", status);
@@ -762,8 +776,7 @@ void DeviceActiveDirectoryPolicyStatusProvider::GetStatus(
UpdaterStatusProvider::UpdaterStatusProvider() {
base::ThreadPool::PostTaskAndReplyWithResult(
FROM_HERE,
- {base::ThreadPool(), base::MayBlock(),
- base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
base::BindOnce(&UpdaterStatusProvider::FetchActiveDirectoryDomain),
base::BindOnce(&UpdaterStatusProvider::OnDomainReceived,
weak_factory_.GetWeakPtr()));
@@ -781,7 +794,7 @@ void UpdaterStatusProvider::GetStatus(base::DictionaryValue* dict) {
if (!updater_status_)
return;
if (!updater_status_->version.empty())
- dict->SetStringKey("version", updater_status_->version);
+ dict->SetStringKey("version", base::WideToUTF8(updater_status_->version));
if (!updater_status_->last_checked_time.is_null()) {
dict->SetStringKey(
"timeSinceLastRefresh",
@@ -914,7 +927,7 @@ void PolicyUIHandler::RegisterMessages() {
profile->GetUserCloudPolicyManager();
if (user_cloud_policy_manager) {
user_status_provider_ = std::make_unique<UserCloudPolicyStatusProvider>(
- user_cloud_policy_manager->core());
+ user_cloud_policy_manager->core(), profile);
}
#if !defined(OS_ANDROID)
@@ -1181,7 +1194,7 @@ void PolicyUIHandler::HandleExportPoliciesJson(const base::ListValue* args) {
file_type_info.extensions = {{FILE_PATH_LITERAL("json")}};
gfx::NativeWindow owning_window = webcontents->GetTopLevelNativeWindow();
export_policies_select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(), initial_path,
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(), initial_path,
&file_type_info, 0, base::FilePath::StringType(), owning_window, nullptr);
}
@@ -1240,14 +1253,15 @@ std::string PolicyUIHandler::GetPoliciesAsJson() const {
"application", base::Value(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)));
std::string cohort_name;
#if defined(OS_WIN)
- base::string16 cohort_version_info =
+ std::u16string cohort_version_info =
version_utils::win::GetCohortVersionInfo();
if (!cohort_version_info.empty()) {
cohort_name = base::StringPrintf(
" %s", base::UTF16ToUTF8(cohort_version_info).c_str());
}
#endif
- std::string channel_name = chrome::GetChannelName();
+ std::string channel_name =
+ chrome::GetChannelName(chrome::WithExtendedStable(true));
std::string version = base::StringPrintf(
"%s (%s)%s %s%s", version_info::GetVersionNumber().c_str(),
l10n_util::GetStringUTF8(version_info::IsOfficialBuild()
diff --git a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index 38c8cd00de4..8fade561895 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -69,10 +69,10 @@ void UpdateJobFileInfo(std::unique_ptr<extensions::PrinterProviderPrintJob> job,
bool HasUsbPrinterProviderPermissions(const Extension* extension) {
return extension->permissions_data() &&
- extension->permissions_data()->HasAPIPermission(
- extensions::APIPermission::kPrinterProvider) &&
- extension->permissions_data()->HasAPIPermission(
- extensions::APIPermission::kUsb);
+ extension->permissions_data()->HasAPIPermission(
+ extensions::mojom::APIPermissionID::kPrinterProvider) &&
+ extension->permissions_data()->HasAPIPermission(
+ extensions::mojom::APIPermissionID::kUsb);
}
std::string GenerateProvisionalUsbPrinterId(
@@ -161,7 +161,7 @@ void ExtensionPrinterHandler::StartGetCapability(
}
void ExtensionPrinterHandler::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) {
@@ -340,7 +340,7 @@ void ExtensionPrinterHandler::OnUsbDevicesEnumerated(
extension.get(), *device);
if (device_permissions->FindUsbDeviceEntry(*device) ||
extension->permissions_data()->CheckAPIPermissionWithParam(
- extensions::APIPermission::kUsbDevice, param.get())) {
+ extensions::mojom::APIPermissionID::kUsbDevice, param.get())) {
// Skip devices the extension already has permission to access.
continue;
}
@@ -352,9 +352,9 @@ void ExtensionPrinterHandler::OnUsbDevicesEnumerated(
.Set("name",
DevicePermissionsManager::GetPermissionMessage(
device->vendor_id, device->product_id,
- device->manufacturer_name.value_or(base::string16()),
- device->product_name.value_or(base::string16()),
- base::string16(), false))
+ device->manufacturer_name.value_or(std::u16string()),
+ device->product_name.value_or(std::u16string()),
+ std::u16string(), false))
.Set("extensionId", extension->id())
.Set("extensionName", extension->name())
.Set("provisional", true)
diff --git a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
index 2f88ff82df4..9507d55db19 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
@@ -11,7 +11,6 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "extensions/browser/api/printer_provider/printer_provider_api.h"
@@ -52,7 +51,7 @@ class ExtensionPrinterHandler : public PrinterHandler {
GetPrintersDoneCallback done_callback) override;
void StartGetCapability(const std::string& destination_id,
GetCapabilityCallback callback) override;
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index 1eef8757773..d5b6fdf275a 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -18,7 +18,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
#include "base/run_loop.h"
-#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/values_test_util.h"
@@ -710,7 +709,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pdf) {
auto print_data = base::MakeRefCounted<base::RefCountedStaticMemory>(
kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kPdfSettings), print_data,
@@ -746,7 +745,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pdf_Reset) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kPdfSettings), print_data,
@@ -771,7 +770,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_All) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kAllTypesSettings), print_data,
@@ -808,7 +807,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pwg) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
@@ -861,7 +860,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pwg_NonDefaultSettings) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kDuplexSettings), print_data,
@@ -914,7 +913,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pwg_Reset) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
@@ -942,7 +941,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pwg_InvalidTicket) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kInvalidSettings), print_data,
@@ -963,7 +962,7 @@ TEST_F(ExtensionPrinterHandlerTest, Print_Pwg_FailedConversion) {
auto print_data =
base::MakeRefCounted<base::RefCountedBytes>(kPrintData, kPrintDataLength);
- base::string16 title = base::ASCIIToUTF16("Title");
+ std::u16string title = u"Title";
extension_printer_handler_->StartPrint(
title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index 41845b698b3..f7a26a6f6e5 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -375,7 +375,7 @@ void LocalPrinterHandlerChromeos::HandlePrinterSetup(
}
void LocalPrinterHandlerChromeos::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) {
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
index b729f5fd49a..9a973a34bf2 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
@@ -11,7 +11,6 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
#include "chrome/browser/chromeos/printing/printer_configurer.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
@@ -48,7 +47,7 @@ class LocalPrinterHandlerChromeos : public PrinterHandler {
GetPrintersDoneCallback done_callback) override;
void StartGetCapability(const std::string& printer_name,
GetCapabilityCallback cb) override;
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index be75cd7188a..0a5bbb5f03a 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -56,6 +56,19 @@ scoped_refptr<base::TaskRunner> CreatePrinterHandlerTaskRunner() {
#endif
}
+void OnDidGetDefaultPrinterName(
+ PrinterHandler::DefaultPrinterCallback callback,
+ const base::Optional<std::string>& printer_name) {
+ if (!printer_name.has_value()) {
+ LOG(WARNING) << "Failure getting default printer";
+ std::move(callback).Run(std::string());
+ return;
+ }
+
+ VLOG(1) << "Default Printer: " << printer_name.value();
+ std::move(callback).Run(printer_name.value());
+}
+
void OnDidEnumeratePrinters(
PrinterHandler::AddedPrintersCallback added_printers_callback,
PrinterHandler::GetPrintersDoneCallback done_callback,
@@ -174,11 +187,20 @@ void LocalPrinterHandlerDefault::Reset() {}
void LocalPrinterHandlerDefault::GetDefaultPrinter(DefaultPrinterCallback cb) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- base::PostTaskAndReplyWithResult(
- task_runner_.get(), FROM_HERE,
- base::BindOnce(&GetDefaultPrinterAsync,
- g_browser_process->GetApplicationLocale()),
- std::move(cb));
+ if (base::FeatureList::IsEnabled(features::kEnableOopPrintDrivers)) {
+ VLOG(1) << "Getting default printer via service";
+ GetPrintBackendService(g_browser_process->GetApplicationLocale(),
+ /*printer_name=*/std::string())
+ ->GetDefaultPrinterName(
+ base::BindOnce(&OnDidGetDefaultPrinterName, std::move(cb)));
+ } else {
+ VLOG(1) << "Getting default printer in-process";
+ base::PostTaskAndReplyWithResult(
+ task_runner_.get(), FROM_HERE,
+ base::BindOnce(&GetDefaultPrinterAsync,
+ g_browser_process->GetApplicationLocale()),
+ std::move(cb));
+ }
}
void LocalPrinterHandlerDefault::StartGetPrinters(
@@ -228,7 +250,7 @@ void LocalPrinterHandlerDefault::StartGetCapability(
}
void LocalPrinterHandlerDefault::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) {
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
index cb4a5775110..e577718f57d 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
@@ -11,7 +11,6 @@
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
-#include "base/strings/string16.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "printing/backend/print_backend.h"
@@ -39,7 +38,7 @@ class LocalPrinterHandlerDefault : public PrinterHandler {
GetPrintersDoneCallback done_callback) override;
void StartGetCapability(const std::string& destination_id,
GetCapabilityCallback callback) override;
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc
index 25549620856..721009dce8a 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc
@@ -27,6 +27,15 @@ namespace printing {
namespace {
+// Used as a callback to `GetDefaultPrinter` in tests.
+// Increases `call_count` and records value returned by `GetDefaultPrinter`.
+void RecordGetDefaultPrinter(bool& default_printer_set,
+ std::string& default_printer_out,
+ const std::string& default_printer) {
+ default_printer_out = default_printer;
+ default_printer_set = true;
+}
+
// Used as a callback to `StartGetPrinters` in tests.
// Increases `call_count` and records values returned by `StartGetPrinters`.
// TODO(crbug.com/1171579) Get rid of use of base::ListValue.
@@ -51,7 +60,7 @@ void RecordGetCapability(bool& capabilities_set,
}
// Converts JSON string to base::ListValue object.
-// On failure, returns NULL and fills `error` string.
+// On failure, returns nullptr and fills `error` string.
std::unique_ptr<base::ListValue> GetJSONAsListValue(
const base::StringPiece& json,
std::string& error) {
@@ -83,13 +92,12 @@ class LocalPrinterHandlerDefaultTest : public testing::TestWithParam<bool> {
TestingProfile::Builder builder;
profile_ = builder.Build();
- initiator_web_contents_ = content::WebContents::Create(
+ initiator_ = content::WebContents::Create(
content::WebContents::CreateParams(profile_.get()));
- content::WebContents* initiator = initiator_web_contents_.get();
test_backend_ = base::MakeRefCounted<TestPrintBackend>();
PrintBackend::SetPrintBackendForTesting(test_backend_.get());
local_printer_handler_ =
- std::make_unique<LocalPrinterHandlerDefault>(initiator);
+ std::make_unique<LocalPrinterHandlerDefault>(initiator_.get());
if (use_backend_service) {
print_backend_service_ = PrintBackendServiceTestImpl::LaunchForTesting(
@@ -112,10 +120,16 @@ class LocalPrinterHandlerDefaultTest : public testing::TestWithParam<bool> {
std::move(basic_info));
}
- protected:
+ void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+
+ LocalPrinterHandlerDefault* local_printer_handler() {
+ return local_printer_handler_.get();
+ }
+
+ private:
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<TestingProfile> profile_;
- std::unique_ptr<content::WebContents> initiator_web_contents_;
+ std::unique_ptr<content::WebContents> initiator_;
scoped_refptr<TestPrintBackend> test_backend_;
std::unique_ptr<LocalPrinterHandlerDefault> local_printer_handler_;
@@ -127,6 +141,39 @@ class LocalPrinterHandlerDefaultTest : public testing::TestWithParam<bool> {
INSTANTIATE_TEST_SUITE_P(All, LocalPrinterHandlerDefaultTest, testing::Bool());
+// Tests that getting default printer is successful.
+TEST_P(LocalPrinterHandlerDefaultTest, GetDefaultPrinter) {
+ AddPrinter("printer1", "default1", "description1", true);
+ AddPrinter("printer2", "non-default2", "description2", false);
+ AddPrinter("printer3", "non-default3", "description3", false);
+
+ bool did_get_default_printer = false;
+ std::string default_printer;
+ local_printer_handler()->GetDefaultPrinter(base::BindOnce(
+ &RecordGetDefaultPrinter, std::ref(did_get_default_printer),
+ std::ref(default_printer)));
+
+ RunUntilIdle();
+
+ ASSERT_TRUE(did_get_default_printer);
+ EXPECT_EQ(default_printer, "printer1");
+}
+
+// Tests that getting default printer gives empty string when no printers are
+// installed.
+TEST_P(LocalPrinterHandlerDefaultTest, GetDefaultPrinterNoneInstalled) {
+ bool did_get_default_printer = false;
+ std::string default_printer;
+ local_printer_handler()->GetDefaultPrinter(base::BindOnce(
+ &RecordGetDefaultPrinter, std::ref(did_get_default_printer),
+ std::ref(default_printer)));
+
+ RunUntilIdle();
+
+ ASSERT_TRUE(did_get_default_printer);
+ EXPECT_TRUE(default_printer.empty());
+}
+
TEST_P(LocalPrinterHandlerDefaultTest, GetPrinters) {
AddPrinter("printer1", "default1", "description1", true);
AddPrinter("printer2", "non-default2", "description2", false);
@@ -136,12 +183,12 @@ TEST_P(LocalPrinterHandlerDefaultTest, GetPrinters) {
std::unique_ptr<base::ListValue> printers;
bool is_done = false;
- local_printer_handler_->StartGetPrinters(
+ local_printer_handler()->StartGetPrinters(
base::BindRepeating(&RecordPrinterList, std::ref(call_count),
std::ref(printers)),
base::BindOnce(&RecordPrintersDone, std::ref(is_done)));
- task_environment_.RunUntilIdle();
+ RunUntilIdle();
EXPECT_EQ(call_count, 1u);
EXPECT_TRUE(is_done);
@@ -182,12 +229,12 @@ TEST_P(LocalPrinterHandlerDefaultTest, GetPrintersNoneRegistered) {
bool is_done = false;
// Do not add any printers before attempt to get printer list.
- local_printer_handler_->StartGetPrinters(
+ local_printer_handler()->StartGetPrinters(
base::BindRepeating(&RecordPrinterList, std::ref(call_count),
std::ref(printers)),
base::BindOnce(&RecordPrintersDone, std::ref(is_done)));
- task_environment_.RunUntilIdle();
+ RunUntilIdle();
EXPECT_EQ(call_count, 0u);
EXPECT_TRUE(is_done);
@@ -201,11 +248,11 @@ TEST_P(LocalPrinterHandlerDefaultTest, StartGetCapabilityValidPrinter) {
bool did_fetch_caps = false;
base::Value fetched_caps;
- local_printer_handler_->StartGetCapability(
+ local_printer_handler()->StartGetCapability(
"printer1", base::BindOnce(&RecordGetCapability, std::ref(did_fetch_caps),
std::ref(fetched_caps)));
- task_environment_.RunUntilIdle();
+ RunUntilIdle();
ASSERT_TRUE(did_fetch_caps);
ASSERT_TRUE(fetched_caps.is_dict());
@@ -218,12 +265,12 @@ TEST_P(LocalPrinterHandlerDefaultTest, StartGetCapabilityValidPrinter) {
TEST_P(LocalPrinterHandlerDefaultTest, StartGetCapabilityInvalidPrinter) {
bool did_fetch_caps = false;
base::Value fetched_caps;
- local_printer_handler_->StartGetCapability(
+ local_printer_handler()->StartGetCapability(
/*destination_id=*/"invalid printer",
base::BindOnce(&RecordGetCapability, std::ref(did_fetch_caps),
std::ref(fetched_caps)));
- task_environment_.RunUntilIdle();
+ RunUntilIdle();
ASSERT_TRUE(did_fetch_caps);
EXPECT_TRUE(fetched_caps.is_none());
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
index e64ac255c18..6c43d5381f7 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -52,7 +52,7 @@
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
#endif
namespace printing {
@@ -219,7 +219,7 @@ void PdfPrinterHandler::StartGetCapability(const std::string& destination_id,
}
void PdfPrinterHandler::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) {
@@ -286,7 +286,7 @@ void PdfPrinterHandler::SetPdfSavedClosureForTesting(
// static
base::FilePath PdfPrinterHandler::GetFileNameForPrintJobTitle(
- const base::string16& job_title) {
+ const std::u16string& job_title) {
DCHECK(!job_title.empty());
#if defined(OS_WIN)
base::FilePath::StringType print_job_title(base::AsWString(job_title));
@@ -333,7 +333,7 @@ base::FilePath PdfPrinterHandler::GetFileNameForURL(const GURL& url) {
// static
base::FilePath PdfPrinterHandler::GetFileName(const GURL& url,
- const base::string16& job_title,
+ const std::u16string& job_title,
bool is_savable) {
if (is_savable) {
bool title_is_url =
@@ -426,7 +426,7 @@ void PdfPrinterHandler::OnDirectorySelected(const base::FilePath& filename,
select_file_dialog_ =
ui::SelectFileDialog::Create(this, nullptr /*policy already checked*/);
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(), path,
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(), path,
&file_type_info, 0, base::FilePath::StringType(),
platform_util::GetTopLevel(preview_web_contents_->GetNativeView()), NULL);
}
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
index d796486f6b7..9730721279e 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
@@ -10,7 +10,6 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "ui/shell_dialogs/select_file_dialog.h"
@@ -47,7 +46,7 @@ class PdfPrinterHandler : public PrinterHandler,
GetPrintersDoneCallback done_callback) override;
void StartGetCapability(const std::string& destination_id,
GetCapabilityCallback callback) override;
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override;
@@ -63,10 +62,10 @@ class PdfPrinterHandler : public PrinterHandler,
// Exposed for testing.
static base::FilePath GetFileNameForPrintJobTitle(
- const base::string16& job_title);
+ const std::u16string& job_title);
static base::FilePath GetFileNameForURL(const GURL& url);
static base::FilePath GetFileName(const GURL& url,
- const base::string16& job_title,
+ const std::u16string& job_title,
bool is_savable);
protected:
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
index c5b9d0242be..a2b822470a3 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
@@ -254,7 +254,7 @@ TEST_F(PdfPrinterHandlerTest, GetFileName) {
for (const auto& data : kTestData) {
SCOPED_TRACE(std::string(data.url) + " | " + data.job_title);
GURL url(data.url);
- base::string16 job_title = base::ASCIIToUTF16(data.job_title);
+ std::u16string job_title = base::ASCIIToUTF16(data.job_title);
base::FilePath path =
PdfPrinterHandler::GetFileName(url, job_title, data.is_savable);
EXPECT_EQ(data.expected_output, path.value());
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc
index 1616bb22b6a..b25ec6b7343 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_win_unittest.cc
@@ -28,7 +28,7 @@ namespace {
void ExecuteCancelledSelectFileDialog(
ui::SelectFileDialog::Type type,
- const base::string16& title,
+ const std::u16string& title,
const base::FilePath& default_path,
const std::vector<ui::FileFilterSpec>& filter,
int file_type_index,
@@ -60,7 +60,7 @@ class FakePdfPrinterHandler : public PdfPrinterHandler {
run_loop_.Quit();
}
- void StartPrintToPdf(const base::string16& job_title) {
+ void StartPrintToPdf(const std::u16string& job_title) {
StartPrint(job_title, base::Value(), nullptr, base::DoNothing());
run_loop_.Run();
}
@@ -80,7 +80,7 @@ class FakePdfPrinterHandler : public PdfPrinterHandler {
this, nullptr /*policy already checked*/,
base::BindRepeating(&ExecuteCancelledSelectFileDialog));
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(),
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(),
default_filename, &file_type_info, 0, base::FilePath::StringType(),
platform_util::GetTopLevel(preview_web_contents_->GetNativeView()),
nullptr);
@@ -117,17 +117,17 @@ class PdfPrinterHandlerWinTest : public BrowserWithTestWindowTest {
};
TEST_F(PdfPrinterHandlerWinTest, TestSaveAsPdf) {
- pdf_printer_->StartPrintToPdf(STRING16_LITERAL("111111111111111111111.html"));
+ pdf_printer_->StartPrintToPdf(u"111111111111111111111.html");
EXPECT_TRUE(pdf_printer_->save_failed());
}
TEST_F(PdfPrinterHandlerWinTest, TestSaveAsPdfLongFileName) {
- pdf_printer_->StartPrintToPdf(STRING16_LITERAL(
- "111111111111111111111111111111111111111111111111111111111111111111111111"
- "111111111111111111111111111111111111111111111111111111111111111111111111"
- "111111111111111111111111111111111111111111111111111111111111111111111111"
- "111111111111111111111111111111111111111111111111111111111111111111111111"
- "111111111111111111111111111111111111111111111.html"));
+ pdf_printer_->StartPrintToPdf(
+ u"11111111111111111111111111111111111111111111111111111111111111111111111"
+ u"11111111111111111111111111111111111111111111111111111111111111111111111"
+ u"11111111111111111111111111111111111111111111111111111111111111111111111"
+ u"11111111111111111111111111111111111111111111111111111111111111111111111"
+ u"1111111111111111111111111111111111111111111111111.html");
EXPECT_TRUE(pdf_printer_->save_failed());
}
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 5beb6ac1f57..82a2ac9bc0e 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -16,7 +16,6 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/command_line.h"
-#include "base/feature_list.h"
#include "base/i18n/number_formatting.h"
#include "base/json/json_reader.h"
#include "base/lazy_instance.h"
@@ -37,8 +36,6 @@
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/printing/printer_manager_dialog.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/account_consistency_mode_manager.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/chrome_pages.h"
@@ -62,8 +59,6 @@
#include "components/cloud_devices/common/printer_description.h"
#include "components/prefs/pref_service.h"
#include "components/printing/common/cloud_print_cdd_conversion.h"
-#include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
-#include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
#include "components/url_formatter/url_formatter.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/render_frame_host.h"
@@ -81,9 +76,8 @@
#include "third_party/icu/source/i18n/unicode/ulocdata.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
#include "chrome/browser/ash/account_manager/account_manager_util.h"
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h"
@@ -190,12 +184,6 @@ const char kPdfPrinterDisabled[] = "pdfPrinterDisabled";
const char kDestinationsManaged[] = "destinationsManaged";
// Name of a dictionary field holding the cloud print URL.
const char kCloudPrintURL[] = "cloudPrintURL";
-// Name of a dictionary field holding the signed in user accounts.
-const char kUserAccounts[] = "userAccounts";
-// Name of a dictionary field indicating whether sync is available. If false,
-// Print Preview will always send a request to the Google Cloud Print server on
-// load, to check the user's sign in state.
-const char kSyncAvailable[] = "syncAvailable";
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Name of a dictionary field indicating whether the user's Drive directory is
// mounted.
@@ -226,8 +214,7 @@ UserActionBuckets DetermineUserAction(const base::Value& settings) {
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
- if (base::FeatureList::IsEnabled(chromeos::features::kPrintSaveToDrive) &&
- settings.FindBoolKey(kSettingPrintToGoogleDrive).value_or(false)) {
+ if (settings.FindBoolKey(kSettingPrintToGoogleDrive).value_or(false)) {
return UserActionBuckets::kPrintToGoogleDriveCros;
}
#endif
@@ -341,9 +328,7 @@ PrintPreviewHandler::PrintPreviewHandler() {
ReportUserActionHistogram(UserActionBuckets::kPreviewStarted);
}
-PrintPreviewHandler::~PrintPreviewHandler() {
- UnregisterForGaiaCookieChanges();
-}
+PrintPreviewHandler::~PrintPreviewHandler() = default;
void PrintPreviewHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
@@ -397,10 +382,7 @@ void PrintPreviewHandler::RegisterMessages() {
void PrintPreviewHandler::OnJavascriptAllowed() {
print_preview_ui()->SetPreviewUIId();
- // Now that the UI is initialized, any future account changes will require
- // a printer list refresh.
ReadPrinterTypeDenyListFromPrefs();
- RegisterForGaiaCookieChanges();
}
void PrintPreviewHandler::OnJavascriptDisallowed() {
@@ -411,7 +393,6 @@ void PrintPreviewHandler::OnJavascriptDisallowed() {
preview_callbacks_.clear();
preview_failures_.clear();
printer_type_deny_list_.clear();
- UnregisterForGaiaCookieChanges();
}
WebContents* PrintPreviewHandler::preview_web_contents() const {
@@ -732,11 +713,6 @@ void PrintPreviewHandler::HandleSignin(const base::ListValue* /*args*/) {
}
void PrintPreviewHandler::OnSignInTabClosed() {
- if (identity_manager_) {
- // Sign in state will be reported in OnAccountsInCookieJarUpdated, so no
- // need to do anything here.
- return;
- }
FireWebUIListener("check-for-account-update");
}
@@ -781,14 +757,14 @@ void PrintPreviewHandler::GetLocaleInformation(base::Value* settings) {
// Getting the number formatting based on the locale and writing to
// dictionary.
- base::string16 number_format = base::FormatDouble(123456.78, 2);
+ std::u16string number_format = base::FormatDouble(123456.78, 2);
size_t thousands_pos = number_format.find('3') + 1;
- base::string16 thousands_delimiter = number_format.substr(thousands_pos, 1);
+ std::u16string thousands_delimiter = number_format.substr(thousands_pos, 1);
if (number_format[thousands_pos] == '4')
thousands_delimiter.clear();
size_t decimal_pos = number_format.find('6') + 1;
DCHECK_NE(number_format[decimal_pos], '7');
- base::string16 decimal_delimiter = number_format.substr(decimal_pos, 1);
+ std::u16string decimal_delimiter = number_format.substr(decimal_pos, 1);
settings->SetStringKey(kDecimalDelimiter, decimal_delimiter);
settings->SetStringKey(kThousandsDelimiter, thousands_delimiter);
settings->SetIntKey(kUnitType, system);
@@ -808,21 +784,6 @@ void PrintPreviewHandler::HandleGetInitialSettings(
weak_factory_.GetWeakPtr(), callback_id));
}
-void PrintPreviewHandler::GetUserAccountList(base::Value* settings) {
- base::Value account_list(base::Value::Type::LIST);
- if (identity_manager_) {
- const std::vector<gaia::ListedAccount>& accounts =
- identity_manager_->GetAccountsInCookieJar().signed_in_accounts;
- for (const gaia::ListedAccount& account : accounts) {
- account_list.Append(account.email);
- }
- settings->SetKey(kSyncAvailable, base::Value(true));
- } else {
- settings->SetKey(kSyncAvailable, base::Value(false));
- }
- settings->SetKey(kUserAccounts, std::move(account_list));
-}
-
void PrintPreviewHandler::SendInitialSettings(
const std::string& callback_id,
const std::string& default_printer) {
@@ -883,18 +844,13 @@ void PrintPreviewHandler::SendInitialSettings(
}
GetLocaleInformation(&initial_settings);
- if (IsCloudPrintEnabled()) {
- GetUserAccountList(&initial_settings);
- }
#if BUILDFLAG(IS_CHROMEOS_ASH)
- if (base::FeatureList::IsEnabled(chromeos::features::kPrintSaveToDrive)) {
- drive::DriveIntegrationService* drive_service =
- drive::DriveIntegrationServiceFactory::GetForProfile(
- Profile::FromWebUI(web_ui()));
- initial_settings.SetBoolKey(kIsDriveMounted,
- drive_service && drive_service->IsMounted());
- }
+ drive::DriveIntegrationService* drive_service =
+ drive::DriveIntegrationServiceFactory::GetForProfile(
+ Profile::FromWebUI(web_ui()));
+ initial_settings.SetBoolKey(kIsDriveMounted,
+ drive_service && drive_service->IsMounted());
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
ResolveJavascriptCallback(base::Value(callback_id), initial_settings);
@@ -947,18 +903,6 @@ WebContents* PrintPreviewHandler::GetInitiator() const {
return dialog_controller->GetInitiator(preview_web_contents());
}
-void PrintPreviewHandler::OnAccountsInCookieUpdated(
- const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
- const GoogleServiceAuthError& error) {
- base::Value account_list(base::Value::Type::LIST);
- const std::vector<gaia::ListedAccount>& accounts =
- accounts_in_cookie_jar_info.signed_in_accounts;
- for (const auto& account : accounts) {
- account_list.Append(account.email);
- }
- FireWebUIListener("user-accounts-updated", std::move(account_list));
-}
-
void PrintPreviewHandler::OnPrintPreviewReady(int preview_uid, int request_id) {
std::string callback_id = GetCallbackId(request_id);
if (callback_id.empty())
@@ -1151,36 +1095,9 @@ void PrintPreviewHandler::OnPrintResult(const std::string& callback_id,
}
}
-void PrintPreviewHandler::RegisterForGaiaCookieChanges() {
- DCHECK(!identity_manager_);
- cloud_print_enabled_ =
- !base::Contains(printer_type_deny_list_, PrinterType::kCloud) &&
- GetPrefs()->GetBoolean(prefs::kCloudPrintSubmitEnabled);
-
- if (!cloud_print_enabled_)
- return;
-
- Profile* profile = Profile::FromWebUI(web_ui());
- if (!AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile) &&
- !AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) {
- return;
- }
-
- identity_manager_ = IdentityManagerFactory::GetForProfile(profile);
- identity_manager_->AddObserver(this);
-}
-
-void PrintPreviewHandler::UnregisterForGaiaCookieChanges() {
- if (!identity_manager_)
- return;
-
- identity_manager_->RemoveObserver(this);
- identity_manager_ = nullptr;
- cloud_print_enabled_ = false;
-}
-
bool PrintPreviewHandler::IsCloudPrintEnabled() {
- return cloud_print_enabled_;
+ return !base::Contains(printer_type_deny_list_, PrinterType::kCloud) &&
+ GetPrefs()->GetBoolean(prefs::kCloudPrintSubmitEnabled);
}
void PrintPreviewHandler::BadMessageReceived() {
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index 93d41f6e69b..3562d330d68 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -20,7 +20,6 @@
#include "chrome/common/buildflags.h"
#include "components/prefs/pref_service.h"
#include "components/printing/common/print.mojom.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "printing/backend/print_backend.h"
@@ -44,8 +43,7 @@ class PrinterHandler;
class PrintPreviewUI;
// The handler for Javascript messages related to the print preview dialog.
-class PrintPreviewHandler : public content::WebUIMessageHandler,
- public signin::IdentityManager::Observer {
+class PrintPreviewHandler : public content::WebUIMessageHandler {
public:
PrintPreviewHandler();
~PrintPreviewHandler() override;
@@ -55,11 +53,6 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
- // IdentityManager::Observer implementation.
- void OnAccountsInCookieUpdated(
- const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
- const GoogleServiceAuthError& error) override;
-
// Called when print preview failed. |request_id| identifies the request that
// failed.
void OnPrintPreviewFailed(int request_id);
@@ -126,11 +119,6 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// Gets the initiator for the print preview dialog.
virtual content::WebContents* GetInitiator() const;
- // Register/unregister from notifications of changes done to the GAIA
- // cookie. Protected so unit tests can override.
- virtual void RegisterForGaiaCookieChanges();
- virtual void UnregisterForGaiaCookieChanges();
-
private:
friend class PrintPreviewPdfGeneratedBrowserTest;
FRIEND_TEST_ALL_PREFIXES(PrintPreviewPdfGeneratedBrowserTest,
@@ -280,16 +268,9 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// Whether we have already logged the number of printers this session.
bool has_logged_printers_count_ = false;
- // Whether Google Cloud Print is enabled for the active profile.
- bool cloud_print_enabled_ = false;
-
// The settings used for the most recent preview request.
base::Value last_preview_settings_;
- // Pointer to the identity manager service so that print preview can listen
- // for GAIA cookie changes.
- signin::IdentityManager* identity_manager_ = nullptr;
-
// Handles requests for extension printers. Created lazily by calling
// GetPrinterHandler().
std::unique_ptr<PrinterHandler> extension_printer_handler_;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
index bdaa69da7be..14c65ca77e2 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
@@ -19,7 +19,7 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/ash/account_manager/account_manager_util.h"
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
#include "chrome/browser/device_identity/device_oauth2_token_service.h"
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 0b94314edab..0e00be0a6a1 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
#include <map>
+#include <string>
#include <utility>
#include <vector>
@@ -17,7 +18,6 @@
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/icu_test_util.h"
#include "base/test/metrics/histogram_tester.h"
@@ -204,7 +204,7 @@ class TestPrinterHandler : public PrinterHandler {
void StartGrantPrinterAccess(const std::string& printer_id,
GetPrinterInfoCallback callback) override {}
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override {
@@ -297,9 +297,6 @@ class TestPrintPreviewHandler : public PrintPreviewHandler {
bool IsCloudPrintEnabled() override { return true; }
- void RegisterForGaiaCookieChanges() override {}
- void UnregisterForGaiaCookieChanges() override {}
-
void BadMessageReceived() override { bad_messages_++; }
content::WebContents* GetInitiator() const override { return initiator_; }
@@ -484,10 +481,6 @@ class PrintPreviewHandlerTest : public testing::Test {
base::Value::Type::BOOLEAN));
ASSERT_TRUE(
settings->FindKeyOfType("cloudPrintURL", base::Value::Type::STRING));
- ASSERT_TRUE(
- settings->FindKeyOfType("userAccounts", base::Value::Type::LIST));
- ASSERT_TRUE(
- settings->FindKeyOfType("syncAvailable", base::Value::Type::BOOLEAN));
}
// Returns |policy_name| entry from initial settings policies.
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index 0351787fc0e..a6cd4b390fe 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -231,8 +231,6 @@ void HandleRequestCallback(const std::string& path,
void AddPrintPreviewStrings(content::WebUIDataSource* source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"accept", IDS_PRINT_PREVIEW_ACCEPT_INVITE},
- {"acceptForGroup", IDS_PRINT_PREVIEW_ACCEPT_GROUP_INVITE},
{"accountSelectTitle", IDS_PRINT_PREVIEW_ACCOUNT_SELECT_TITLE},
{"addAccountTitle", IDS_PRINT_PREVIEW_ADD_ACCOUNT_TITLE},
{"advancedSettingsDialogConfirm",
@@ -257,7 +255,6 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
{"extensionDestinationIconTooltip",
IDS_PRINT_PREVIEW_EXTENSION_DESTINATION_ICON_TOOLTIP},
{"goBackButton", IDS_PRINT_PREVIEW_BUTTON_GO_BACK},
- {"groupPrinterSharingInviteText", IDS_PRINT_PREVIEW_GROUP_INVITE_TEXT},
{"invalidPrinterSettings", IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS},
{"layoutLabel", IDS_PRINT_PREVIEW_LAYOUT_LABEL},
{"learnMore", IDS_LEARN_MORE},
@@ -316,14 +313,14 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
{"printButton", IDS_PRINT_PREVIEW_PRINT_BUTTON},
{"printDestinationsTitle", IDS_PRINT_PREVIEW_PRINT_DESTINATIONS_TITLE},
{"printPagesLabel", IDS_PRINT_PREVIEW_PRINT_PAGES_LABEL},
+#if BUILDFLAG(IS_CHROMEOS_ASH)
{"printToGoogleDrive", IDS_PRINT_PREVIEW_PRINT_TO_GOOGLE_DRIVE},
+#endif
{"printToPDF", IDS_PRINT_PREVIEW_PRINT_TO_PDF},
- {"printerSharingInviteText", IDS_PRINT_PREVIEW_INVITE_TEXT},
{"printing", IDS_PRINT_PREVIEW_PRINTING},
{"recentDestinationsTitle", IDS_PRINT_PREVIEW_RECENT_DESTINATIONS_TITLE},
{"registerPrinterInformationMessage",
IDS_CLOUD_PRINT_REGISTER_PRINTER_INFORMATION},
- {"reject", IDS_PRINT_PREVIEW_REJECT_INVITE},
{"resolveExtensionUSBDialogTitle",
IDS_PRINT_PREVIEW_RESOLVE_EXTENSION_USB_DIALOG_TITLE},
{"resolveExtensionUSBErrorMessage",
@@ -384,7 +381,7 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
chrome::kCloudPrintCertificateErrorLearnMoreURL);
#if !BUILDFLAG(IS_CHROMEOS_ASH)
- const base::string16 shortcut_text(base::UTF8ToUTF16(kBasicPrintShortcut));
+ const std::u16string shortcut_text(base::UTF8ToUTF16(kBasicPrintShortcut));
source->AddString("systemDialogOption",
l10n_util::GetStringFUTF16(
IDS_PRINT_PREVIEW_SYSTEM_DIALOG_OPTION, shortcut_text));
@@ -394,7 +391,8 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
base::Value pdf_strings(base::Value::Type::DICTIONARY);
pdf_extension_util::AddStrings(
pdf_extension_util::PdfViewerContext::kPrintPreview, &pdf_strings);
- pdf_extension_util::AddAdditionalData(&pdf_strings);
+ pdf_extension_util::AddAdditionalData(/*enable_annotations=*/false,
+ &pdf_strings);
source->AddLocalizedStrings(base::Value::AsDictionaryValue(pdf_strings));
}
@@ -412,8 +410,7 @@ void AddPrintPreviewFlags(content::WebUIDataSource* source, Profile* profile) {
#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
source->AddBoolean(
"forceEnablePrivetPrinting",
- profile->GetPrefs()->GetBoolean(prefs::kForceEnablePrivetPrinting) ||
- base::FeatureList::IsEnabled(features::kForceEnablePrivetPrinting));
+ profile->GetPrefs()->GetBoolean(prefs::kForceEnablePrivetPrinting));
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -424,9 +421,6 @@ void AddPrintPreviewFlags(content::WebUIDataSource* source, Profile* profile) {
"showPrinterStatusInDialog",
base::FeatureList::IsEnabled(chromeos::features::kPrinterStatusDialog));
source->AddBoolean(
- "printSaveToDrive",
- base::FeatureList::IsEnabled(chromeos::features::kPrintSaveToDrive));
- source->AddBoolean(
"printServerScaling",
base::FeatureList::IsEnabled(chromeos::features::kPrintServerScaling));
#endif
@@ -768,7 +762,7 @@ void PrintPreviewUI::OnNupPdfDocumentConvertDone(
base::RefCountedSharedMemoryMapping::CreateFromWholeRegion(region));
}
-void PrintPreviewUI::SetInitiatorTitle(const base::string16& job_title) {
+void PrintPreviewUI::SetInitiatorTitle(const std::u16string& job_title) {
initiator_title_ = job_title;
}
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
index a131d53bad6..712745ff97b 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -77,9 +77,9 @@ class PrintPreviewUI : public ConstrainedWebDialogUI,
bool IsBound() const;
// Setters
- void SetInitiatorTitle(const base::string16& initiator_title);
+ void SetInitiatorTitle(const std::u16string& initiator_title);
- const base::string16& initiator_title() const { return initiator_title_; }
+ const std::u16string& initiator_title() const { return initiator_title_; }
bool source_is_arc() const { return source_is_arc_; }
@@ -298,7 +298,7 @@ class PrintPreviewUI : public ConstrainedWebDialogUI,
// Store the initiator title, used for populating the print preview dialog
// title.
- base::string16 initiator_title_;
+ std::u16string initiator_title_;
// The list of 0-based page numbers that will be rendered.
std::vector<uint32_t> pages_to_render_;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
index f9a02da5d0e..fbe24d2f5ee 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
@@ -11,7 +11,6 @@
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
-#include "base/strings/string16.h"
#include "base/values.h"
#include "build/chromeos_buildflags.h"
#include "chrome/common/buildflags.h"
@@ -113,7 +112,7 @@ class PrinterHandler {
// |settings|: The print job settings.
// |print_data|: The document bytes to print.
// |callback| should be called in the response to the request.
- virtual void StartPrint(const base::string16& job_title,
+ virtual void StartPrint(const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) = 0;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
index d9f2085e753..5d6dd6c9ea2 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
@@ -13,7 +13,6 @@
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/timer/timer.h"
#include "chrome/browser/printing/cloud_print/privet_constants.h"
@@ -76,7 +75,7 @@ void PrivetPrinterHandler::StartGetCapability(const std::string& destination_id,
}
void PrivetPrinterHandler::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
base::Value settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) {
@@ -202,7 +201,7 @@ void PrivetPrinterHandler::OnGotCapabilities(
}
void PrivetPrinterHandler::PrintUpdateClient(
- const base::string16& job_title,
+ const std::u16string& job_title,
scoped_refptr<base::RefCountedMemory> print_data,
base::Value print_ticket,
const std::string& capabilities,
@@ -235,7 +234,7 @@ bool PrivetPrinterHandler::UpdateClient(
}
void PrivetPrinterHandler::StartPrint(
- const base::string16& job_title,
+ const std::u16string& job_title,
scoped_refptr<base::RefCountedMemory> print_data,
base::Value print_ticket,
const std::string& capabilities,
diff --git a/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
index 37b9f3d10ce..f26d75a7c9f 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
@@ -11,7 +11,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "chrome/browser/local_discovery/service_discovery_shared_client.h"
#include "chrome/browser/printing/cloud_print/privet_local_printer_lister.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
@@ -44,7 +43,7 @@ class PrivetPrinterHandler
GetPrintersDoneCallback done_callback) override;
void StartGetCapability(const std::string& destination_id,
GetCapabilityCallback calback) override;
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
base::Value ticket,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) override;
@@ -72,14 +71,14 @@ class PrivetPrinterHandler
std::unique_ptr<cloud_print::PrivetHTTPClient> http_client);
void OnGotCapabilities(const base::DictionaryValue* capabilities);
void PrintUpdateClient(
- const base::string16& job_title,
+ const std::u16string& job_title,
scoped_refptr<base::RefCountedMemory> print_data,
base::Value print_ticket,
const std::string& capabilities,
const gfx::Size& page_size,
std::unique_ptr<cloud_print::PrivetHTTPClient> http_client);
bool UpdateClient(std::unique_ptr<cloud_print::PrivetHTTPClient> http_client);
- void StartPrint(const base::string16& job_title,
+ void StartPrint(const std::u16string& job_title,
scoped_refptr<base::RefCountedMemory> print_data,
base::Value print_ticket,
const std::string& capabilities,
diff --git a/chromium/chrome/browser/ui/webui/profile_helper.cc b/chromium/chrome/browser/ui/webui/profile_helper.cc
index de437da559b..b8b82b51261 100644
--- a/chromium/chrome/browser/ui/webui/profile_helper.cc
+++ b/chromium/chrome/browser/ui/webui/profile_helper.cc
@@ -42,7 +42,7 @@ void OpenNewWindowForProfile(Profile* profile) {
g_browser_process->profile_manager()->CreateProfileAsync(
ProfileManager::GetSystemProfilePath(),
- ProfileManager::CreateCallback(), base::string16(), std::string());
+ ProfileManager::CreateCallback());
return;
}
diff --git a/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc b/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
index e009d9ffbde..b542f0737e4 100644
--- a/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
@@ -3,9 +3,12 @@
// found in the LICENSE file.
#include "base/bind.h"
+#include "base/files/file_util.h"
#include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/apps/platform_apps/shortcut_manager.h"
+#include "chrome/browser/browser_features.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile_attributes_storage.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -37,8 +40,7 @@ Profile* CreateProfile() {
base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath();
base::RunLoop run_loop;
profile_manager->CreateProfileAsync(
- new_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop),
- base::string16(), std::string());
+ new_path, base::BindRepeating(&UnblockOnProfileCreation, &run_loop));
run_loop.Run();
return profile_manager->GetProfileByPath(new_path);
}
@@ -96,6 +98,32 @@ class BrowserAddedObserver : public BrowserListObserver {
base::RunLoop run_loop_;
};
+class ProfileDeletionObserver : public ProfileAttributesStorage::Observer {
+ public:
+ ProfileDeletionObserver() {
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .AddObserver(this);
+ }
+
+ ~ProfileDeletionObserver() override {
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .RemoveObserver(this);
+ }
+
+ void Wait() { run_loop_.Run(); }
+
+ // ProfileAttributesStorage::Observer:
+ void OnProfileWasRemoved(const base::FilePath& profile_path,
+ const std::u16string& profile_name) override {
+ run_loop_.Quit();
+ }
+
+ private:
+ base::RunLoop run_loop_;
+};
+
} // namespace
class ProfileHelperTest : public InProcessBrowserTest {
@@ -174,6 +202,8 @@ IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteSoleProfile) {
ui_test_utils::WaitForBrowserToClose(original_browser);
Browser* new_browser = added_observer.Wait();
+ content::RunAllTasksUntilIdle();
+
EXPECT_EQ(1u, browser_list->size());
EXPECT_NE(original_browser_profile_path, new_browser->profile()->GetPath());
EXPECT_EQ(1u, storage.GetNumberOfProfiles());
@@ -198,12 +228,34 @@ IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteActiveProfile) {
ProfileMetrics::DELETE_PROFILE_SETTINGS);
ui_test_utils::WaitForBrowserToClose(original_browser);
+ base::RunLoop().RunUntilIdle();
+
EXPECT_EQ(1u, browser_list->size());
EXPECT_EQ(additional_profile, browser_list->get(0)->profile());
EXPECT_EQ(1u, storage.GetNumberOfProfiles());
}
-IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteInactiveProfile) {
+class ProfileHelperTestWithDestroyProfile
+ : public ProfileHelperTest,
+ public testing::WithParamInterface<bool> {
+ public:
+ ProfileHelperTestWithDestroyProfile() {
+ bool enable_destroy_profile = GetParam();
+ if (enable_destroy_profile) {
+ feature_list_.InitAndEnableFeature(
+ features::kDestroyProfileOnBrowserClose);
+ } else {
+ feature_list_.InitAndDisableFeature(
+ features::kDestroyProfileOnBrowserClose);
+ }
+ }
+
+ private:
+ base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(ProfileHelperTestWithDestroyProfile,
+ DeleteInactiveProfile) {
content::TestWebUI web_ui;
Browser* original_browser = browser();
ProfileAttributesStorage& storage =
@@ -217,14 +269,38 @@ IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteInactiveProfile) {
Profile* additional_profile = CreateProfile();
EXPECT_EQ(2u, storage.GetNumberOfProfiles());
- content::BrowsingDataRemoverCompletionInhibitor inhibitor(
- content::BrowserContext::GetBrowsingDataRemover(additional_profile));
- webui::DeleteProfileAtPath(additional_profile->GetPath(),
- ProfileMetrics::DELETE_PROFILE_SETTINGS);
- inhibitor.BlockUntilNearCompletion();
- inhibitor.ContinueToCompletion();
+ base::FilePath additional_profile_dir = additional_profile->GetPath();
+ bool destroy_profile =
+ base::FeatureList::IsEnabled(features::kDestroyProfileOnBrowserClose);
+
+ if (destroy_profile) {
+ ProfileDeletionObserver observer;
+ webui::DeleteProfileAtPath(additional_profile_dir,
+ ProfileMetrics::DELETE_PROFILE_SETTINGS);
+ observer.Wait();
+ } else {
+ content::BrowsingDataRemoverCompletionInhibitor inhibitor(
+ content::BrowserContext::GetBrowsingDataRemover(additional_profile));
+ webui::DeleteProfileAtPath(additional_profile_dir,
+ ProfileMetrics::DELETE_PROFILE_SETTINGS);
+ inhibitor.BlockUntilNearCompletion();
+ inhibitor.ContinueToCompletion();
+ }
EXPECT_EQ(1u, browser_list->size());
EXPECT_TRUE(base::Contains(*browser_list, original_browser));
EXPECT_EQ(1u, storage.GetNumberOfProfiles());
+
+ // TODO(crbug.com/1191455): Once RemoveProfile()/NukeProfileFromDisk() aren't
+ // flaky anymore, EXPECT_FALSE(PathExists(additional_profile_dir)).
}
+
+#if defined(OS_CHROMEOS)
+INSTANTIATE_TEST_SUITE_P(DestroyProfileOnBrowserClose,
+ ProfileHelperTestWithDestroyProfile,
+ testing::Values(false));
+#else
+INSTANTIATE_TEST_SUITE_P(DestroyProfileOnBrowserClose,
+ ProfileHelperTestWithDestroyProfile,
+ testing::Bool());
+#endif // defined(OS_CHROMEOS)
diff --git a/chromium/chrome/browser/ui/webui/read_later/read_later_page_handler.cc b/chromium/chrome/browser/ui/webui/read_later/read_later_page_handler.cc
index d082fa15b26..1461b3d8933 100644
--- a/chromium/chrome/browser/ui/webui/read_later/read_later_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/read_later/read_later_page_handler.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/read_later/reading_list_model_factory.h"
+#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/read_later/read_later_ui.h"
#include "chrome/common/webui_url_constants.h"
#include "components/reading_list/core/reading_list_entry.h"
@@ -87,8 +88,10 @@ void ReadLaterPageHandler::OpenSavedEntry(const GURL& url) {
// Open in active tab if the user is on the NTP.
WindowOpenDisposition open_location =
- IsActiveTabNTP(browser) ? WindowOpenDisposition::CURRENT_TAB
- : WindowOpenDisposition::NEW_FOREGROUND_TAB;
+ IsActiveTabNTP(browser) ||
+ base::FeatureList::IsEnabled(features::kSidePanel)
+ ? WindowOpenDisposition::CURRENT_TAB
+ : WindowOpenDisposition::NEW_FOREGROUND_TAB;
content::OpenURLParams params(url, content::Referrer(), open_location,
ui::PAGE_TRANSITION_AUTO_BOOKMARK, false);
diff --git a/chromium/chrome/browser/ui/webui/read_later/read_later_ui.cc b/chromium/chrome/browser/ui/webui/read_later/read_later_ui.cc
index 50b0c2e7b42..b737ef9ec34 100644
--- a/chromium/chrome/browser/ui/webui/read_later/read_later_ui.cc
+++ b/chromium/chrome/browser/ui/webui/read_later/read_later_ui.cc
@@ -29,7 +29,7 @@ namespace {
void AddLocalizedString(content::WebUIDataSource* source,
const std::string& message,
int id) {
- base::string16 str = l10n_util::GetStringUTF16(id);
+ std::u16string str = l10n_util::GetStringUTF16(id);
base::Erase(str, '&');
source->AddString(message, str);
}
@@ -63,11 +63,13 @@ ReadLaterUI::ReadLaterUI(content::WebUI* web_ui)
profile, std::make_unique<FaviconSource>(
profile, chrome::FaviconUrlFormat::kFavicon2));
+ const bool show_side_panel_prototype =
+ base::FeatureList::IsEnabled(features::kSidePanel) &&
+ base::FeatureList::IsEnabled(features::kSidePanelPrototype);
webui::SetupWebUIDataSource(
source, base::make_span(kReadLaterResources, kReadLaterResourcesSize),
- base::FeatureList::IsEnabled(features::kSidePanel)
- ? IDR_READ_LATER_SIDE_PANEL_SIDE_PANEL_HTML
- : IDR_READ_LATER_READ_LATER_HTML);
+ show_side_panel_prototype ? IDR_READ_LATER_SIDE_PANEL_SIDE_PANEL_HTML
+ : IDR_READ_LATER_READ_LATER_HTML);
content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
source);
}
diff --git a/chromium/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chromium/chrome/browser/ui/webui/realbox/realbox_handler.cc
index b5039b26c31..338308d2a69 100644
--- a/chromium/chrome/browser/ui/webui/realbox/realbox_handler.cc
+++ b/chromium/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -65,7 +65,7 @@ void RealboxHandler::SetPage(
page_.Bind(std::move(pending_page));
}
-void RealboxHandler::QueryAutocomplete(const base::string16& input,
+void RealboxHandler::QueryAutocomplete(const std::u16string& input,
bool prevent_inline_autocomplete) {
if (!autocomplete_controller_) {
autocomplete_controller_ = std::make_unique<AutocompleteController>(
@@ -204,7 +204,7 @@ void RealboxHandler::OpenAutocompleteMatch(
OmniboxLog log(
/*text=*/input.focus_type() != OmniboxFocusType::DEFAULT
- ? base::string16()
+ ? std::u16string()
: input.text(),
/*just_deleted_text=*/input.prevent_inline_autocomplete(),
/*input_type=*/input.type(),
@@ -220,7 +220,7 @@ void RealboxHandler::OpenAutocompleteMatch(
elapsed_time_since_first_autocomplete_query,
/*completed_length=*/match.allowed_to_be_default_match
? match.inline_autocompletion.length()
- : base::string16::npos,
+ : std::u16string::npos,
/*elapsed_time_since_last_change_to_default_match=*/
elapsed_time_since_last_change_to_default_match,
/*result=*/autocomplete_controller_->result());
diff --git a/chromium/chrome/browser/ui/webui/realbox/realbox_handler.h b/chromium/chrome/browser/ui/webui/realbox/realbox_handler.h
index 79d32838c2c..2c3c7864f9d 100644
--- a/chromium/chrome/browser/ui/webui/realbox/realbox_handler.h
+++ b/chromium/chrome/browser/ui/webui/realbox/realbox_handler.h
@@ -41,7 +41,7 @@ class RealboxHandler : public realbox::mojom::PageHandler,
// realbox::mojom::PageHandler:
void SetPage(mojo::PendingRemote<realbox::mojom::Page> pending_page) override;
- void QueryAutocomplete(const base::string16& input,
+ void QueryAutocomplete(const std::u16string& input,
bool prevent_inline_autocomplete) override;
void StopAutocomplete(bool clear_result) override;
void OpenAutocompleteMatch(uint8_t line,
diff --git a/chromium/chrome/browser/ui/webui/reset_password/reset_password_ui.cc b/chromium/chrome/browser/ui/webui/reset_password/reset_password_ui.cc
index 1f98e4ab441..a49ebbbc280 100644
--- a/chromium/chrome/browser/ui/webui/reset_password/reset_password_ui.cc
+++ b/chromium/chrome/browser/ui/webui/reset_password/reset_password_ui.cc
@@ -102,8 +102,8 @@ PasswordType GetPasswordType(content::WebContents* web_contents) {
}
// Properly format host name based on text direction.
-base::string16 GetFormattedHostName(const std::string host_name) {
- base::string16 host = url_formatter::IDNToUnicode(host_name);
+std::u16string GetFormattedHostName(const std::string host_name) {
+ std::u16string host = url_formatter::IDNToUnicode(host_name);
if (base::i18n::IsRTL())
base::i18n::WrapStringWithLTRFormatting(&host);
return host;
@@ -148,7 +148,7 @@ base::DictionaryValue ResetPasswordUI::PopulateStrings() const {
int heading_string_id = known_password_type
? IDS_RESET_PASSWORD_WARNING_HEADING
: IDS_RESET_PASSWORD_HEADING;
- base::string16 explanation_paragraph_string;
+ std::u16string explanation_paragraph_string;
if (org_name.empty()) {
explanation_paragraph_string = l10n_util::GetStringUTF16(
known_password_type ? IDS_RESET_PASSWORD_WARNING_EXPLANATION_PARAGRAPH
@@ -158,7 +158,7 @@ base::DictionaryValue ResetPasswordUI::PopulateStrings() const {
? StringType::WARNING_NO_ORG_NAME
: StringType::GENERIC_NO_ORG_NAME);
} else {
- base::string16 formatted_org_name = GetFormattedHostName(org_name);
+ std::u16string formatted_org_name = GetFormattedHostName(org_name);
explanation_paragraph_string = l10n_util::GetStringFUTF16(
known_password_type
? IDS_RESET_PASSWORD_WARNING_EXPLANATION_PARAGRAPH_WITH_ORG_NAME
diff --git a/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
index affd0f8db3e..bcc44401c97 100644
--- a/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -15,6 +15,7 @@
#include "content/public/browser/child_process_data.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_ui.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/process_type.h"
#include "sandbox/policy/win/sandbox_win.h"
@@ -27,7 +28,9 @@ namespace {
base::Value FetchBrowserChildProcesses() {
// The |BrowserChildProcessHostIterator| must only be used on the IO thread.
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ DCHECK_CURRENTLY_ON(base::FeatureList::IsEnabled(features::kProcessHostOnUI)
+ ? content::BrowserThread::UI
+ : content::BrowserThread::IO);
base::Value browser_processes(base::Value::Type::LIST);
for (BrowserChildProcessHostIterator itr; !itr.Done(); ++itr) {
@@ -97,7 +100,10 @@ void SandboxHandler::HandleRequestSandboxDiagnostics(
AllowJavascript();
- content::GetIOThreadTaskRunner({})->PostTaskAndReplyWithResult(
+ auto task_runner = base::FeatureList::IsEnabled(features::kProcessHostOnUI)
+ ? content::GetUIThreadTaskRunner({})
+ : content::GetIOThreadTaskRunner({});
+ task_runner->PostTaskAndReplyWithResult(
FROM_HERE, base::BindOnce(&FetchBrowserChildProcesses),
base::BindOnce(&SandboxHandler::FetchBrowserChildProcessesCompleted,
weak_ptr_factory_.GetWeakPtr()));
diff --git a/chromium/chrome/browser/ui/webui/sanitized_image_source.cc b/chromium/chrome/browser/ui/webui/sanitized_image_source.cc
index c3873e65f6c..d2e0f7dcf92 100644
--- a/chromium/chrome/browser/ui/webui/sanitized_image_source.cc
+++ b/chromium/chrome/browser/ui/webui/sanitized_image_source.cc
@@ -18,6 +18,7 @@
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image.h"
@@ -97,6 +98,12 @@ std::string SanitizedImageSource::GetMimeType(const std::string& path) {
return "image/png";
}
+bool SanitizedImageSource::ShouldReplaceExistingSource() {
+ // Leave the existing DataSource in place, otherwise we'll drop any pending
+ // requests on the floor.
+ return false;
+}
+
void SanitizedImageSource::OnImageLoaded(
network::SimpleURLLoader* loader,
content::URLDataSource::GotDataCallback callback,
diff --git a/chromium/chrome/browser/ui/webui/sanitized_image_source.h b/chromium/chrome/browser/ui/webui/sanitized_image_source.h
index 6a873accee7..e07120de24c 100644
--- a/chromium/chrome/browser/ui/webui/sanitized_image_source.h
+++ b/chromium/chrome/browser/ui/webui/sanitized_image_source.h
@@ -61,6 +61,7 @@ class SanitizedImageSource : public content::URLDataSource {
const content::WebContents::Getter& wc_getter,
content::URLDataSource::GotDataCallback callback) override;
std::string GetMimeType(const std::string& path) override;
+ bool ShouldReplaceExistingSource() override;
private:
void OnImageLoaded(network::SimpleURLLoader* loader,
diff --git a/chromium/chrome/browser/ui/webui/sanitized_image_source_unittest.cc b/chromium/chrome/browser/ui/webui/sanitized_image_source_unittest.cc
index a83b89513ed..572bf36af78 100644
--- a/chromium/chrome/browser/ui/webui/sanitized_image_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/sanitized_image_source_unittest.cc
@@ -15,6 +15,7 @@
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.cc b/chromium/chrome/browser/ui/webui/settings/about_handler.cc
index 09b82022336..8f73464b90f 100644
--- a/chromium/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/about_handler.cc
@@ -17,7 +17,6 @@
#include "base/macros.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -34,6 +33,7 @@
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/browser/upgrade_detector/upgrade_detector.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
@@ -53,11 +53,11 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/constants/ash_switches.h"
#include "base/i18n/time_formatting.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
#include "chrome/browser/chromeos/tpm_firmware_update.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -100,7 +100,7 @@ struct RegulatoryLabel {
// Returns message that informs user that for update it's better to
// connect to a network of one of the allowed types.
-base::string16 GetAllowedConnectionTypesMessage() {
+std::u16string GetAllowedConnectionTypesMessage() {
if (help_utils_chromeos::IsUpdateOverCellularAllowed(
/*interactive=*/true)) {
const bool metered = chromeos::NetworkHandler::Get()
@@ -123,8 +123,8 @@ bool CanChangeChannel(Profile* profile) {
bool value = false;
// On a managed machine we delegate this setting to the affiliated users
// only if the policy value is true.
- chromeos::CrosSettings::Get()->GetBoolean(
- chromeos::kReleaseChannelDelegated, &value);
+ ash::CrosSettings::Get()->GetBoolean(chromeos::kReleaseChannelDelegated,
+ &value);
if (!value)
return false;
@@ -136,9 +136,9 @@ bool CanChangeChannel(Profile* profile) {
}
// On non-managed machines, only the local owner can change the channel.
- chromeos::OwnerSettingsServiceChromeOS* service =
- chromeos::OwnerSettingsServiceChromeOSFactory::GetInstance()
- ->GetForBrowserContext(profile);
+ ash::OwnerSettingsServiceAsh* service =
+ ash::OwnerSettingsServiceAshFactory::GetInstance()->GetForBrowserContext(
+ profile);
return service && service->IsOwner();
}
@@ -338,6 +338,8 @@ void AboutHandler::RegisterMessages() {
content::URLDataSource::Add(profile_,
std::make_unique<chromeos::ImageSource>());
#endif
+ content::URLDataSource::Add(profile_,
+ std::make_unique<ThemeSource>(profile_));
}
void AboutHandler::OnJavascriptAllowed() {
@@ -466,7 +468,7 @@ void AboutHandler::HandleSetChannel(const base::ListValue* args) {
return;
}
- base::string16 channel;
+ std::u16string channel;
bool is_powerwash_allowed;
if (!args->GetString(0, &channel) ||
!args->GetBoolean(1, &is_powerwash_allowed)) {
@@ -551,8 +553,8 @@ void AboutHandler::OnGetTargetChannel(std::string callback_id,
// For the LTS pilot simply check whether the device policy is set and ignore
// its value.
std::string value;
- bool is_lts = chromeos::CrosSettings::Get()->GetString(
- chromeos::kReleaseLtsTag, &value);
+ bool is_lts =
+ ash::CrosSettings::Get()->GetString(chromeos::kReleaseLtsTag, &value);
channel_info->SetBoolean("isLts", is_lts);
ResolveJavascriptCallback(base::Value(callback_id), *channel_info);
@@ -654,7 +656,7 @@ void AboutHandler::SetUpdateStatus(VersionUpdater::Status status,
bool powerwash,
const std::string& version,
int64_t size,
- const base::string16& message) {
+ const std::u16string& message) {
// Only UPDATING state should have progress set.
DCHECK(status == VersionUpdater::UPDATING || progress == 0);
@@ -670,7 +672,7 @@ void AboutHandler::SetUpdateStatus(VersionUpdater::Status status,
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (status == VersionUpdater::FAILED_OFFLINE ||
status == VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED) {
- base::string16 types_msg = GetAllowedConnectionTypesMessage();
+ std::u16string types_msg = GetAllowedConnectionTypesMessage();
if (!types_msg.empty())
event->SetString("connectionTypes", types_msg);
else
@@ -694,7 +696,7 @@ void AboutHandler::SetPromotionState(VersionUpdater::PromotionState state) {
bool actionable = state == VersionUpdater::PROMOTE_DISABLED ||
state == VersionUpdater::PROMOTE_ENABLED;
- base::string16 text = base::string16();
+ std::u16string text = std::u16string();
if (actionable)
text = l10n_util::GetStringUTF16(IDS_ABOUT_CHROME_AUTOUPDATE_ALL);
else if (state == VersionUpdater::PROMOTED)
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.h b/chromium/chrome/browser/ui/webui/settings/about_handler.h
index 4b5aafa848d..eb45490feb4 100644
--- a/chromium/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/about_handler.h
@@ -11,7 +11,6 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/ui/webui/help/version_updater.h"
@@ -52,7 +51,7 @@ class AboutHandler : public settings::SettingsPageUIHandler,
void OnUpgradeRecommended() override;
// Returns the browser version as a string.
- static base::string16 BuildBrowserVersionString();
+ static std::u16string BuildBrowserVersionString();
protected:
// Used to test the EOL string displayed in the About details page.
@@ -146,7 +145,7 @@ class AboutHandler : public settings::SettingsPageUIHandler,
bool powerwash,
const std::string& version,
int64_t size,
- const base::string16& fail_message);
+ const std::u16string& fail_message);
#if defined(OS_MAC)
// Callback method which forwards promotion state to the page.
diff --git a/chromium/chrome/browser/ui/webui/settings/captions_handler.cc b/chromium/chrome/browser/ui/webui/settings/captions_handler.cc
index c67cf0a431f..1b9a64a66ad 100644
--- a/chromium/chrome/browser/ui/webui/settings/captions_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/captions_handler.cc
@@ -13,6 +13,7 @@
#include "chrome/grit/generated_resources.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_ui.h"
+#include "media/base/media_switches.h"
#include "ui/base/l10n/l10n_util.h"
#if defined(OS_WIN) || defined(OS_MAC)
@@ -33,8 +34,8 @@ void CaptionsHandler::RegisterMessages() {
base::BindRepeating(&CaptionsHandler::HandleOpenSystemCaptionsDialog,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
- "captionsSubpageReady",
- base::BindRepeating(&CaptionsHandler::HandleCaptionsSubpageReady,
+ "liveCaptionSectionReady",
+ base::BindRepeating(&CaptionsHandler::HandleLiveCaptionSectionReady,
base::Unretained(this)));
}
@@ -46,7 +47,8 @@ void CaptionsHandler::OnJavascriptDisallowed() {
speech::SodaInstaller::GetInstance()->RemoveObserver(this);
}
-void CaptionsHandler::HandleCaptionsSubpageReady(const base::ListValue* args) {
+void CaptionsHandler::HandleLiveCaptionSectionReady(
+ const base::ListValue* args) {
AllowJavascript();
}
@@ -59,21 +61,24 @@ void CaptionsHandler::HandleOpenSystemCaptionsDialog(
void CaptionsHandler::OnSodaInstalled() {
speech::SodaInstaller::GetInstance()->RemoveObserver(this);
- FireWebUIListener("enable-live-caption-subtitle-changed",
+ FireWebUIListener("soda-download-progress-changed",
base::Value(l10n_util::GetStringUTF16(
IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_COMPLETE)));
}
void CaptionsHandler::OnSodaError() {
- prefs_->SetBoolean(prefs::kLiveCaptionEnabled, false);
- FireWebUIListener("enable-live-caption-subtitle-changed",
+ if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
+ prefs_->SetBoolean(prefs::kLiveCaptionEnabled, false);
+ }
+
+ FireWebUIListener("soda-download-progress-changed",
base::Value(l10n_util::GetStringUTF16(
IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR)));
}
void CaptionsHandler::OnSodaProgress(int progress) {
FireWebUIListener(
- "enable-live-caption-subtitle-changed",
+ "soda-download-progress-changed",
base::Value(l10n_util::GetStringFUTF16Int(
IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS, progress)));
}
diff --git a/chromium/chrome/browser/ui/webui/settings/captions_handler.h b/chromium/chrome/browser/ui/webui/settings/captions_handler.h
index 9924dc6d2cb..53cd6a2d9e5 100644
--- a/chromium/chrome/browser/ui/webui/settings/captions_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/captions_handler.h
@@ -27,7 +27,7 @@ class CaptionsHandler : public SettingsPageUIHandler,
void OnJavascriptDisallowed() override;
private:
- void HandleCaptionsSubpageReady(const base::ListValue* args);
+ void HandleLiveCaptionSectionReady(const base::ListValue* args);
void HandleOpenSystemCaptionsDialog(const base::ListValue* args);
// SodaInstaller::Observer overrides:
diff --git a/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc b/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
index ca6c5e50300..c7aa55a9836 100644
--- a/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
@@ -15,7 +15,6 @@
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
-#include "base/strings/string16.h"
#include "base/strings/string_util.h"
#include "base/synchronization/lock.h"
#include "base/values.h"
@@ -296,9 +295,9 @@ void ChromeCleanupHandler::GetPluralString(int id,
int num_items = 0;
args->GetInteger(1, &num_items);
- const base::string16 plural_string =
+ const std::u16string plural_string =
num_items > 0 ? l10n_util::GetPluralStringFUTF16(id, num_items)
- : base::string16();
+ : std::u16string();
ResolveJavascriptCallback(base::Value(callback_id),
base::Value(plural_string));
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc
index 8a8384d6426..5533f8e22f0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc
@@ -12,7 +12,7 @@
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/obsolete_system/obsolete_system.h"
#include "chrome/browser/ui/webui/management/management_ui.h"
#include "chrome/browser/ui/webui/settings/about_handler.h"
@@ -279,6 +279,8 @@ void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
{"aboutOsProductTitle", IDS_PRODUCT_OS_NAME},
{"aboutReleaseNotesOffline", IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES},
{"aboutShowReleaseNotes", IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES},
+ {"aboutManagedEndOfLifeSubtitle",
+ IDS_SETTINGS_ABOUT_PAGE_MANAGED_END_OF_LIFE_SUBTITLE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
@@ -306,7 +308,9 @@ void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
? IDS_VERSION_UI_OFFICIAL
: IDS_VERSION_UI_UNOFFICIAL),
- base::UTF8ToUTF16(chrome::GetChannelName()),
+ // Extended stable channel is not supported on Chrome OS Ash.
+ base::UTF8ToUTF16(
+ chrome::GetChannelName(chrome::WithExtendedStable(false))),
l10n_util::GetStringUTF16(VersionUI::VersionProcessorVariation())));
html_source->AddString(
"aboutProductCopyright",
@@ -314,16 +318,16 @@ void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT),
base::Time::Now()));
- base::string16 license = l10n_util::GetStringFUTF16(
+ std::u16string license = l10n_util::GetStringFUTF16(
IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
html_source->AddString("aboutProductLicense", license);
- base::string16 os_license = l10n_util::GetStringFUTF16(
+ std::u16string os_license = l10n_util::GetStringFUTF16(
IDS_ABOUT_CROS_VERSION_LICENSE,
base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL));
html_source->AddString("aboutProductOsLicense", os_license);
- base::string16 os_with_linux_license = l10n_util::GetStringFUTF16(
+ std::u16string os_with_linux_license = l10n_util::GetStringFUTF16(
IDS_ABOUT_CROS_WITH_LINUX_VERSION_LICENSE,
base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL),
base::ASCIIToUTF16(chrome::kChromeUICrostiniCreditsURL));
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
index b35cc7976ac..7c721c3d528 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -41,6 +41,7 @@
#include "ui/accessibility/accessibility_switches.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/events/keyboard_layout_util.h"
namespace chromeos {
namespace settings {
@@ -345,6 +346,10 @@ bool IsSwitchAccessTextAllowed() {
::switches::kEnableExperimentalAccessibilitySwitchAccessText);
}
+bool IsSwitchAccessPointScanningEnabled() {
+ return features::IsSwitchAccessPointScanningEnabled();
+}
+
bool IsSwitchAccessSetupGuideAllowed() {
return base::CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kEnableExperimentalAccessibilitySwitchAccessSetupGuide);
@@ -440,6 +445,7 @@ void AccessibilitySection::AddLoadTimeData(
{"chromeVoxLabel", IDS_SETTINGS_CHROMEVOX_LABEL},
{"chromeVoxOptionsLabel", IDS_SETTINGS_CHROMEVOX_OPTIONS_LABEL},
{"screenMagnifierLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_LABEL},
+ {"screenMagnifierHintLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_HINT_LABEL},
{"screenMagnifierMouseFollowingModeContinuous",
IDS_SETTINGS_SCREEN_MANIFIER_MOUSE_FOLLOWING_MODE_CONTINUOUS},
{"screenMagnifierMouseFollowingModeCentered",
@@ -449,6 +455,8 @@ void AccessibilitySection::AddLoadTimeData(
{"screenMagnifierFocusFollowingLabel",
IDS_SETTINGS_SCREEN_MAGNIFIER_FOCUS_FOLLOWING_LABEL},
{"screenMagnifierZoomLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_LABEL},
+ {"screenMagnifierZoomHintLabel",
+ IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_HINT_LABEL},
{"dockedMagnifierLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_LABEL},
{"dockedMagnifierZoomLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_ZOOM_LABEL},
{"screenMagnifierZoom2x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_2_X},
@@ -584,6 +592,8 @@ void AccessibilitySection::AddLoadTimeData(
IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_SPEED_LABEL},
{"switchAccessAutoScanKeyboardSpeedLabel",
IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_KEYBOARD_SPEED_LABEL},
+ {"switchAccessPointScanSpeedLabel",
+ IDS_SETTINGS_SWITCH_ACCESS_POINT_SCAN_SPEED_LABEL},
{"durationInSeconds", IDS_SETTINGS_DURATION_IN_SECONDS},
{"manageAccessibilityFeatures",
IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
@@ -655,6 +665,11 @@ void AccessibilitySection::AddLoadTimeData(
};
html_source->AddLocalizedStrings(kLocalizedStrings);
+ html_source->AddLocalizedString("screenMagnifierHintSearchKey",
+ ui::DeviceUsesKeyboardLayout2()
+ ? IDS_SETTINGS_KEYBOARD_KEY_LAUNCHER
+ : IDS_SETTINGS_KEYBOARD_KEY_SEARCH);
+
html_source->AddString("a11yLearnMoreUrl",
chrome::kChromeAccessibilityHelpURL);
@@ -662,6 +677,9 @@ void AccessibilitySection::AddLoadTimeData(
"showExperimentalAccessibilitySwitchAccessImprovedTextInput",
IsSwitchAccessTextAllowed());
+ html_source->AddBoolean("isSwitchAccessPointScanningEnabled",
+ IsSwitchAccessPointScanningEnabled());
+
html_source->AddBoolean("showSwitchAccessSetupGuide",
IsSwitchAccessSetupGuideAllowed());
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
index 3d591a99b11..bf3c5b53ea0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -17,6 +17,7 @@
#include "base/values.h"
#include "chrome/browser/account_manager_facade_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/enterprise/util/managed_browser_utils.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/account_manager/account_manager_welcome_dialog.h"
@@ -46,17 +47,6 @@ constexpr int kToastDurationMs = 2500;
constexpr char kAccountRemovedToastId[] =
"settings_account_manager_account_removed";
-std::string GetEnterpriseDomainFromUsername(const std::string& username) {
- size_t email_separator_pos = username.find('@');
- bool is_email = email_separator_pos != std::string::npos &&
- email_separator_pos < username.length() - 1;
-
- if (!is_email)
- return std::string();
-
- return gaia::ExtractDomainName(username);
-}
-
::account_manager::AccountKey GetAccountKeyFromJsCallback(
const base::DictionaryValue* const dictionary) {
const base::Value* id_value = dictionary->FindKey("id");
@@ -89,7 +79,7 @@ bool IsSameAccount(const ::account_manager::AccountKey& account_key,
}
}
-void ShowToast(const std::string& id, const base::string16& message) {
+void ShowToast(const std::string& id, const std::u16string& message) {
ash::ToastManager::Get()->Show(ash::ToastData(
id, message, kToastDurationMs, /*dismiss_text=*/base::nullopt));
}
@@ -175,9 +165,13 @@ class AccountBuilder {
AccountManagerUIHandler::AccountManagerUIHandler(
AccountManager* account_manager,
+ account_manager::AccountManagerFacade* account_manager_facade,
signin::IdentityManager* identity_manager)
- : account_manager_(account_manager), identity_manager_(identity_manager) {
+ : account_manager_(account_manager),
+ account_manager_facade_(account_manager_facade),
+ identity_manager_(identity_manager) {
DCHECK(account_manager_);
+ DCHECK(account_manager_facade_);
DCHECK(identity_manager_);
}
@@ -273,12 +267,13 @@ void AccountManagerUIHandler::OnCheckDummyGaiaTokenForAllAccounts(
device_account.SetOrganization(organization);
} else if (user->IsActiveDirectoryUser()) {
device_account.SetOrganization(
- GetEnterpriseDomainFromUsername(user->GetDisplayEmail()));
+ chrome::enterprise_util::GetDomainFromEmail(user->GetDisplayEmail()));
} else if (profile_->GetProfilePolicyConnector()->IsManaged()) {
- device_account.SetOrganization(GetEnterpriseDomainFromUsername(
- identity_manager_
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
- .email));
+ device_account.SetOrganization(
+ chrome::enterprise_util::GetDomainFromEmail(
+ identity_manager_
+ ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+ .email));
}
// Device account must show up at the top.
@@ -307,7 +302,12 @@ base::ListValue AccountManagerUIHandler::GetSecondaryGaiaAccounts(
identity_manager_
->FindExtendedAccountInfoForAccountWithRefreshTokenByGaiaId(
account_key.id);
- DCHECK(maybe_account_info.has_value());
+ if (!maybe_account_info.has_value()) {
+ // This account hasn't propagated to IdentityManager yet. When this
+ // happens, `IdentityManager` will call `OnRefreshTokenUpdatedForAccount`
+ // which will trigger another UI update.
+ continue;
+ }
AccountBuilder account;
account.SetId(account_key.id)
@@ -408,20 +408,20 @@ void AccountManagerUIHandler::HandleShowWelcomeDialogIfRequired(
}
void AccountManagerUIHandler::OnJavascriptAllowed() {
- account_manager_observation_.Observe(account_manager_);
+ account_manager_facade_observation_.Observe(account_manager_facade_);
identity_manager_observation_.Observe(identity_manager_);
}
void AccountManagerUIHandler::OnJavascriptDisallowed() {
- account_manager_observation_.Reset();
+ account_manager_facade_observation_.Reset();
identity_manager_observation_.Reset();
}
-// |AccountManager::Observer| overrides. Note: We need to listen on
-// |AccountManager| in addition to |IdentityManager| because there is no
+// |AccountManagerFacade::Observer| overrides. Note: We need to listen on
+// |AccountManagerFacade| in addition to |IdentityManager| because there is no
// guarantee that |AccountManager| (our source of truth) will have a newly added
// account by the time |IdentityManager| has it.
-void AccountManagerUIHandler::OnTokenUpserted(
+void AccountManagerUIHandler::OnAccountUpserted(
const ::account_manager::Account& account) {
RefreshUI();
}
@@ -432,7 +432,14 @@ void AccountManagerUIHandler::OnAccountRemoved(
}
// |signin::IdentityManager::Observer| overrides.
-//
+// `GetSecondaryGaiaAccounts` skips all accounts that haven't been added to
+// `IdentityManager` yet. Thus, we should trigger an updated whenever a new
+// account is added into `IdentityManager`.
+void AccountManagerUIHandler::OnRefreshTokenUpdatedForAccount(
+ const CoreAccountInfo& info) {
+ RefreshUI();
+}
+
// For newly added accounts, |signin::IdentityManager| may take some time to
// fetch user's full name and account image. Whenever that is completed, we may
// need to update the UI with this new set of information. Note that we may be
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
index 90b45c38d5b..ade2cb2cbe0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "components/account_id/account_id.h"
#include "components/account_manager_core/account.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/signin/public/identity_manager/identity_manager.h"
class Profile;
@@ -22,14 +23,17 @@ class Profile;
namespace chromeos {
namespace settings {
-class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler,
- public AccountManager::Observer,
- public signin::IdentityManager::Observer {
+class AccountManagerUIHandler
+ : public ::settings::SettingsPageUIHandler,
+ public account_manager::AccountManagerFacade::Observer,
+ public signin::IdentityManager::Observer {
public:
- // Accepts non-owning pointers to |AccountManager|, |AccountTrackerService|
+ // Accepts non-owning pointers to |AccountManager|, |AccountManagerFacade|
// and |IdentityManager|. Both of these must outlive |this| instance.
- AccountManagerUIHandler(AccountManager* account_manager,
- signin::IdentityManager* identity_manager);
+ AccountManagerUIHandler(
+ AccountManager* account_manager,
+ account_manager::AccountManagerFacade* account_manager_facade,
+ signin::IdentityManager* identity_manager);
~AccountManagerUIHandler() override;
// WebUIMessageHandler implementation.
@@ -37,13 +41,14 @@ class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler,
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
- // |AccountManager::Observer| overrides.
+ // |AccountManagerFacade::Observer| overrides.
// |AccountManager| is considered to be the source of truth for account
// information.
- void OnTokenUpserted(const ::account_manager::Account& account) override;
+ void OnAccountUpserted(const ::account_manager::Account& account) override;
void OnAccountRemoved(const ::account_manager::Account& account) override;
// |signin::IdentityManager::Observer| overrides.
+ void OnRefreshTokenUpdatedForAccount(const CoreAccountInfo& info) override;
void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
void OnErrorStateOfRefreshTokenUpdatedForAccount(
const CoreAccountInfo& account_info,
@@ -99,13 +104,17 @@ class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler,
// A non-owning pointer to |AccountManager|.
AccountManager* const account_manager_;
+ // A non-owning pointer to |AccountManagerFacade|.
+ account_manager::AccountManagerFacade* const account_manager_facade_;
+
// A non-owning pointer to |IdentityManager|.
signin::IdentityManager* const identity_manager_;
- // An observer for |AccountManager|. Automatically deregisters when |this| is
- // destructed.
- base::ScopedObservation<AccountManager, AccountManager::Observer>
- account_manager_observation_{this};
+ // An observer for |AccountManagerFacade|. Automatically deregisters when
+ // |this| is destructed.
+ base::ScopedObservation<account_manager::AccountManagerFacade,
+ account_manager::AccountManagerFacade::Observer>
+ account_manager_facade_observation_{this};
// An observer for |signin::IdentityManager|. Automatically deregisters when
// |this| is destructed.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
index 37bf9bbfb66..0554e6e9199 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
@@ -10,14 +10,16 @@
#include "ash/components/account_manager/account_manager.h"
#include "ash/components/account_manager/account_manager_factory.h"
#include "base/test/bind.h"
+#include "chrome/browser/account_manager_facade_factory.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_profile.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/identity_test_utils.h"
#include "components/user_manager/scoped_user_manager.h"
@@ -105,10 +107,14 @@ namespace settings {
class TestingAccountManagerUIHandler : public AccountManagerUIHandler {
public:
- TestingAccountManagerUIHandler(AccountManager* account_manager,
- signin::IdentityManager* identity_manager,
- content::WebUI* web_ui)
- : AccountManagerUIHandler(account_manager, identity_manager) {
+ TestingAccountManagerUIHandler(
+ AccountManager* account_manager,
+ account_manager::AccountManagerFacade* account_manager_facade,
+ signin::IdentityManager* identity_manager,
+ content::WebUI* web_ui)
+ : AccountManagerUIHandler(account_manager,
+ account_manager_facade,
+ identity_manager) {
set_web_ui(web_ui);
}
@@ -136,7 +142,7 @@ class AccountManagerUIHandlerTest
}
profile_ = profile_builder.Build();
- auto user_manager = std::make_unique<chromeos::FakeChromeUserManager>();
+ auto user_manager = std::make_unique<FakeChromeUserManager>();
const user_manager::User* user;
if (GetDeviceAccountInfo().user_type ==
user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY) {
@@ -173,8 +179,11 @@ class AccountManagerUIHandlerTest
GetDeviceAccountInfo().account_type},
GetDeviceAccountInfo().email, GetDeviceAccountInfo().token);
+ auto* account_manager_facade =
+ ::GetAccountManagerFacade(profile_->GetPath().value());
+
handler_ = std::make_unique<TestingAccountManagerUIHandler>(
- account_manager_, identity_manager_, &web_ui_);
+ account_manager_, account_manager_facade, identity_manager_, &web_ui_);
handler_->SetProfileForTesting(profile_.get());
handler_->RegisterMessages();
handler_->AllowJavascriptForTesting();
@@ -235,8 +244,8 @@ class AccountManagerUIHandlerTest
AccountManager* account_manager() { return account_manager_; }
private:
- chromeos::FakeChromeUserManager* GetFakeUserManager() const {
- return static_cast<chromeos::FakeChromeUserManager*>(
+ FakeChromeUserManager* GetFakeUserManager() const {
+ return static_cast<FakeChromeUserManager*>(
user_manager::UserManager::Get());
}
@@ -302,6 +311,9 @@ IN_PROC_BROWSER_TEST_P(AccountManagerUIHandlerTest,
GetAccountsFromAccountManager();
ASSERT_EQ(3UL, account_manager_accounts.size());
+ // Wait for accounts to propagate to IdentityManager.
+ base::RunLoop().RunUntilIdle();
+
// Call "getAccounts".
base::ListValue args;
args.AppendString(kHandleFunctionName);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
index f4e541f277e..b83273b0738 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
@@ -21,7 +21,6 @@
#include "base/memory/ref_counted_memory.h"
#include "base/optional.h"
#include "base/stl_util.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/values.h"
@@ -107,7 +106,7 @@ void EncodeImage(const gfx::ImageSkia& image,
}
}
-base::string16 GetAlbumDescription(const ash::PersonalAlbum& album) {
+std::u16string GetAlbumDescription(const ash::PersonalAlbum& album) {
if (album.album_id == ash::kAmbientModeRecentHighlightsAlbumId) {
return l10n_util::GetStringUTF16(
IDS_OS_SETTINGS_AMBIENT_MODE_ALBUMS_SUBPAGE_RECENT_DESC);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
index 9ddec3c9294..864db882f6d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
@@ -9,7 +9,7 @@
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/apps/app_service/launch_utils.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" // kSettingsAppId
#include "components/services/app_service/public/cpp/intent_util.h"
@@ -21,8 +21,9 @@
namespace chromeos {
namespace settings {
-AndroidAppsHandler::AndroidAppsHandler(Profile* profile,
- apps::AppServiceProxy* app_service_proxy)
+AndroidAppsHandler::AndroidAppsHandler(
+ Profile* profile,
+ apps::AppServiceProxyChromeOs* app_service_proxy)
: profile_(profile), app_service_proxy_(app_service_proxy) {}
AndroidAppsHandler::~AndroidAppsHandler() {}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
index c1811b1d019..070e2800ce9 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
@@ -12,8 +12,8 @@
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager_observer.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager_observer.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
@@ -31,7 +31,7 @@ class AndroidAppsHandler : public ::settings::SettingsPageUIHandler,
public arc::ArcSessionManagerObserver {
public:
explicit AndroidAppsHandler(Profile* profile,
- apps::AppServiceProxy* app_service_proxy);
+ apps::AppServiceProxyChromeOs* app_service_proxy);
~AndroidAppsHandler() override;
// SettingsPageUIHandler
@@ -63,7 +63,7 @@ class AndroidAppsHandler : public ::settings::SettingsPageUIHandler,
arc::ArcSessionManagerObserver>
arc_session_manager_observation_{this};
Profile* profile_; // unowned
- apps::AppServiceProxy* app_service_proxy_;
+ apps::AppServiceProxyChromeOs* app_service_proxy_;
base::WeakPtrFactory<AndroidAppsHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(AndroidAppsHandler);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
index 13a569f6124..0fa80764681 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
@@ -8,10 +8,10 @@
#include "base/feature_list.h"
#include "base/no_destructor.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_features.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_features.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h"
@@ -178,7 +178,7 @@ AppsSection::AppsSection(Profile* profile,
SearchTagRegistry* search_tag_registry,
PrefService* pref_service,
ArcAppListPrefs* arc_app_list_prefs,
- apps::AppServiceProxy* app_service_proxy)
+ apps::AppServiceProxyChromeOs* app_service_proxy)
: OsSettingsSection(profile, search_tag_registry),
pref_service_(pref_service),
arc_app_list_prefs_(arc_app_list_prefs),
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h
index 042ac25ac87..ce3c0304f1f 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h
@@ -29,7 +29,7 @@ class AppsSection : public OsSettingsSection, public ArcAppListPrefs::Observer {
SearchTagRegistry* search_tag_registry,
PrefService* pref_service,
ArcAppListPrefs* arc_app_list_prefs,
- apps::AppServiceProxy* app_service_proxy);
+ apps::AppServiceProxyChromeOs* app_service_proxy);
~AppsSection() override;
private:
@@ -54,7 +54,7 @@ class AppsSection : public OsSettingsSection, public ArcAppListPrefs::Observer {
PrefService* pref_service_;
ArcAppListPrefs* arc_app_list_prefs_;
- apps::AppServiceProxy* app_service_proxy_;
+ apps::AppServiceProxyChromeOs* app_service_proxy_;
PrefChangeRegistrar pref_change_registrar_;
};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
index eef4fac6f63..f68d8ba2d75 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
@@ -6,6 +6,7 @@
#include <numeric>
+#include "base/callback_helpers.h"
#include "base/system/sys_info.h"
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
@@ -15,7 +16,8 @@
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/cryptohome/cryptohome_util.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
+#include "chromeos/cryptohome/userdataauth_util.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/session/arc_bridge_service.h"
#include "components/arc/storage_manager/arc_storage_manager.h"
@@ -363,10 +365,12 @@ void OtherUsersSizeCalculator::PerformCalculation() {
if (user->is_active())
continue;
other_users_.push_back(user);
- CryptohomeClient::Get()->GetAccountDiskUsage(
- cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId()),
- base::BindOnce(&OtherUsersSizeCalculator::OnGetOtherUserSize,
- weak_ptr_factory_.GetWeakPtr()));
+ user_data_auth::GetAccountDiskUsageRequest request;
+ *request.mutable_identifier() =
+ cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId());
+ UserDataAuthClient::Get()->GetAccountDiskUsage(
+ request, base::BindOnce(&OtherUsersSizeCalculator::OnGetOtherUserSize,
+ weak_ptr_factory_.GetWeakPtr()));
}
// We should show "0 B" if there is no other user.
if (other_users_.empty()) {
@@ -375,8 +379,9 @@ void OtherUsersSizeCalculator::PerformCalculation() {
}
void OtherUsersSizeCalculator::OnGetOtherUserSize(
- base::Optional<cryptohome::BaseReply> reply) {
- user_sizes_.push_back(cryptohome::AccountDiskUsageReplyToUsageSize(reply));
+ base::Optional<user_data_auth::GetAccountDiskUsageReply> reply) {
+ user_sizes_.push_back(
+ user_data_auth::AccountDiskUsageReplyToUsageSize(reply));
if (user_sizes_.size() != other_users_.size())
return;
int64_t other_users_total_bytes;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h
index 8f483f50b95..0dd5ae4ec56 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h
@@ -17,6 +17,7 @@
#include "base/values.h"
#include "chrome/browser/browsing_data/site_data_size_collector.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h"
+#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h"
#include "chromeos/dbus/cryptohome/rpc.pb.h"
#include "components/arc/mojom/storage_manager.mojom.h"
#include "components/arc/session/connection_observer.h"
@@ -277,7 +278,8 @@ class OtherUsersSizeCalculator : public SizeCalculator {
void PerformCalculation() override;
// Callback to update the sizes of the other users.
- void OnGetOtherUserSize(base::Optional<cryptohome::BaseReply> reply);
+ void OnGetOtherUserSize(
+ base::Optional<::user_data_auth::GetAccountDiskUsageReply> reply);
// The list of other users whose directory sizes will be accumulated as the
// size of "Other users".
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h
index 2e0850df244..59a6c340901 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h
@@ -141,7 +141,8 @@ class OtherUsersSizeTestAPI {
user_manager::UserList(user_count);
}
- void SimulateOnGetOtherUserSize(base::Optional<cryptohome::BaseReply> reply) {
+ void SimulateOnGetOtherUserSize(
+ base::Optional<user_data_auth::GetAccountDiskUsageReply> reply) {
other_users_size_calculator_->OnGetOtherUserSize(reply);
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
index 8f203997c01..f06a0d7df98 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
@@ -22,11 +22,11 @@
#include "base/task/thread_pool.h"
#include "base/values.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
+#include "chrome/browser/ash/login/users/avatar/user_image_manager.h"
+#include "chrome/browser/ash/login/users/chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/default_user_image/default_user_images.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/chromeos/camera_presence_notifier.h"
-#include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
-#include "chrome/browser/chromeos/login/users/default_user_image/default_user_images.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
@@ -273,7 +273,7 @@ void ChangePictureHandler::SendProfileImage(const gfx::ImageSkia& image,
}
void ChangePictureHandler::UpdateProfileImage() {
- UserImageManager* user_image_manager =
+ auto* user_image_manager =
ChromeUserManager::Get()->GetUserImageManager(GetUser()->GetAccountId());
// If we have a downloaded profile image and haven't sent it in
// |SendSelectedImage|, send it now (without selecting).
@@ -307,7 +307,7 @@ void ChangePictureHandler::HandleSelectImage(const base::ListValue* args) {
// |image_url| may be empty unless |image_type| is "default".
DCHECK(!image_type.empty());
- UserImageManager* user_image_manager =
+ auto* user_image_manager =
ChromeUserManager::Get()->GetUserImageManager(GetUser()->GetAccountId());
bool waiting_for_camera_photo = false;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
index 94db45d7cc1..fae1ea69d6f 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
@@ -80,7 +80,8 @@ enum Subpage {
// Note: Value 502 was for deprecated kAmbientModePhotos. Do not reuse.
kAmbientModeGooglePhotosAlbum = 503,
kAmbientModeArtGalleryAlbum = 504,
- kWallpaper = 505,
+ // 505 was used for kWallpaper. Do not reuse.
+ // 506 was used for kWallpaperImages. Do not reuse.
// Search and Assistant section.
kAssistant = 600,
@@ -187,7 +188,6 @@ const string kPowerSubpagePath = "power";
// Personalization section.
const string kPersonalizationSectionPath = "personalization";
const string kChangePictureSubpagePath = "changePicture";
-const string kWallpaperSubpagePath = "wallpaper";
const string kAmbientModeSubpagePath = "ambientMode";
const string kAmbientModeGooglePhotosAlbumSubpagePath =
"ambientMode/photos?topicSource=0";
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc
index ee8497629a5..341704d873d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc
@@ -61,7 +61,6 @@ bool IsOSSettingsSubPage(const std::string& sub_page) {
// Personalization section.
chromeos::settings::mojom::kPersonalizationSectionPath,
chromeos::settings::mojom::kChangePictureSubpagePath,
- chromeos::settings::mojom::kWallpaperSubpagePath,
chromeos::settings::mojom::kAmbientModeSubpagePath,
// Search and Assistant section.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom
index e975fd423ec..db80053db2d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom
@@ -38,6 +38,7 @@ enum Setting {
kCellularAddNetwork = 26,
kCellularRemoveESimNetwork = 27,
kCellularRenameESimNetwork = 28,
+ kWifiHidden = 29,
// Bluetooth section.
kBluetoothOnOff = 100,
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index 9e831c79f9e..c409b56d6b7 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -7,7 +7,6 @@
#include <set>
#include <utility>
-#include "ash/constants/ash_features.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/containers/flat_map.h"
@@ -28,7 +27,6 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
#include "chrome/browser/chromeos/printing/ppd_provider_factory.h"
-#include "chrome/browser/chromeos/printing/print_management/print_management_uma.h"
#include "chrome/browser/chromeos/printing/printer_configurer.h"
#include "chrome/browser/chromeos/printing/printer_event_tracker.h"
#include "chrome/browser/chromeos/printing/printer_event_tracker_factory.h"
@@ -44,7 +42,6 @@
#include "chrome/browser/ui/webui/settings/chromeos/server_printer_url_util.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
-#include "chromeos/components/scanning/scanning_uma.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
#include "chromeos/printing/ppd_line_reader.h"
@@ -86,7 +83,8 @@ void OnRemovedPrinter(const Printer::PrinterProtocol& protocol, bool success) {
// Log if the IPP attributes request was succesful.
void RecordIppQueryResult(const PrinterQueryResult& result) {
- bool reachable = (result != PrinterQueryResult::kUnreachable);
+ bool reachable = result != PrinterQueryResult::kHostnameResolution &&
+ result != PrinterQueryResult::kUnreachable;
UMA_HISTOGRAM_BOOLEAN("Printing.CUPS.IppDeviceReachable", reachable);
if (reachable) {
@@ -128,8 +126,6 @@ std::unique_ptr<chromeos::Printer> DictToPrinter(
std::string printer_id;
std::string printer_name;
std::string printer_description;
- std::string printer_manufacturer;
- std::string printer_model;
std::string printer_make_and_model;
std::string printer_address;
std::string printer_protocol;
@@ -138,8 +134,6 @@ std::unique_ptr<chromeos::Printer> DictToPrinter(
if (!printer_dict.GetString("printerId", &printer_id) ||
!printer_dict.GetString("printerName", &printer_name) ||
!printer_dict.GetString("printerDescription", &printer_description) ||
- !printer_dict.GetString("printerManufacturer", &printer_manufacturer) ||
- !printer_dict.GetString("printerModel", &printer_model) ||
!printer_dict.GetString("printerMakeAndModel", &printer_make_and_model) ||
!printer_dict.GetString("printerAddress", &printer_address) ||
!printer_dict.GetString("printerProtocol", &printer_protocol) ||
@@ -159,8 +153,6 @@ std::unique_ptr<chromeos::Printer> DictToPrinter(
auto printer = std::make_unique<chromeos::Printer>(printer_id);
printer->set_display_name(printer_name);
printer->set_description(printer_description);
- printer->set_manufacturer(printer_manufacturer);
- printer->set_model(printer_model);
printer->set_make_and_model(printer_make_and_model);
printer->set_print_server_uri(print_server_uri);
@@ -355,12 +347,10 @@ void CupsPrintersHandler::RegisterMessages() {
"openPrintManagementApp",
base::BindRepeating(&CupsPrintersHandler::HandleOpenPrintManagementApp,
base::Unretained(this)));
- if (base::FeatureList::IsEnabled(chromeos::features::kScanningUI)) {
- web_ui()->RegisterMessageCallback(
- "openScanningApp",
- base::BindRepeating(&CupsPrintersHandler::HandleOpenScanningApp,
- base::Unretained(this)));
- }
+ web_ui()->RegisterMessageCallback(
+ "openScanningApp",
+ base::BindRepeating(&CupsPrintersHandler::HandleOpenScanningApp,
+ base::Unretained(this)));
}
void CupsPrintersHandler::OnJavascriptAllowed() {
@@ -487,7 +477,7 @@ void CupsPrintersHandler::HandleGetPrinterInfo(const base::ListValue* args) {
!IsValidPrinterUri(uri)) {
// Run the failure callback.
OnAutoconfQueried(callback_id, PrinterQueryResult::kUnknownFailure,
- printing::PrinterStatus(), "", "", "", {}, false);
+ printing::PrinterStatus(), "", {}, false);
return;
}
@@ -501,8 +491,6 @@ void CupsPrintersHandler::OnAutoconfQueriedDiscovered(
Printer printer,
PrinterQueryResult result,
const printing::PrinterStatus& printer_status,
- const std::string& make,
- const std::string& model,
const std::string& make_and_model,
const std::vector<std::string>& document_formats,
bool ipp_everywhere) {
@@ -514,11 +502,6 @@ void CupsPrintersHandler::OnAutoconfQueriedDiscovered(
// guaranteed to have it. However, don't overwrite it if the printer
// advertises an empty value through printer-make-and-model.
if (!make_and_model.empty()) {
- // manufacturer and model are set with make_and_model because they are
- // derived from make_and_model for compatability and are slated for
- // removal.
- printer.set_manufacturer(make);
- printer.set_model(model);
printer.set_make_and_model(make_and_model);
PRINTER_LOG(DEBUG) << "Printer queried for make and model "
<< make_and_model;
@@ -548,15 +531,14 @@ void CupsPrintersHandler::OnAutoconfQueried(
const std::string& callback_id,
PrinterQueryResult result,
const printing::PrinterStatus& printer_status,
- const std::string& make,
- const std::string& model,
const std::string& make_and_model,
const std::vector<std::string>& document_formats,
bool ipp_everywhere) {
RecordIppQueryResult(result);
const bool success = result == PrinterQueryResult::kSuccess;
- if (result == PrinterQueryResult::kUnreachable) {
+ if (result == PrinterQueryResult::kHostnameResolution ||
+ result == PrinterQueryResult::kUnreachable) {
PRINTER_LOG(DEBUG) << "Could not reach printer";
RejectJavascriptCallback(
base::Value(callback_id),
@@ -579,8 +561,6 @@ void CupsPrintersHandler::OnAutoconfQueried(
// Bundle printer metadata
base::Value info(base::Value::Type::DICTIONARY);
- info.SetKey("manufacturer", base::Value(make));
- info.SetKey("model", base::Value(model));
info.SetKey("makeAndModel", base::Value(make_and_model));
info.SetKey("autoconf", base::Value(ipp_everywhere));
@@ -717,10 +697,6 @@ void CupsPrintersHandler::AddOrReconfigurePrinter(const base::ListValue* args,
}
if (printer->make_and_model().empty()) {
- // In lieu of more accurate information, populate the make and model
- // fields with the PPD information.
- printer->set_manufacturer(ppd_manufacturer);
- printer->set_model(ppd_model);
// PPD Model names are actually make and model.
printer->set_make_and_model(ppd_model);
}
@@ -899,7 +875,7 @@ void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) {
file_type_info.extensions.push_back({"ppd"});
file_type_info.extensions.push_back({"ppd.gz"});
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(), downloads_path,
+ ui::SelectFileDialog::SELECT_OPEN_FILE, std::u16string(), downloads_path,
&file_type_info, 0, FILE_PATH_LITERAL(""), owning_window, nullptr);
}
@@ -1313,15 +1289,12 @@ void CupsPrintersHandler::OnQueryPrintServerCompleted(
void CupsPrintersHandler::HandleOpenPrintManagementApp(
const base::ListValue* args) {
DCHECK(args->empty());
- chrome::ShowPrintManagementApp(profile_,
- PrintManagementAppEntryPoint::kSettings);
+ chrome::ShowPrintManagementApp(profile_);
}
void CupsPrintersHandler::HandleOpenScanningApp(const base::ListValue* args) {
DCHECK(args->empty());
- DCHECK(base::FeatureList::IsEnabled(chromeos::features::kScanningUI));
- chrome::ShowScanningApp(profile_,
- chromeos::scanning::ScanAppEntryPoint::kSettings);
+ chrome::ShowScanningApp(profile_);
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 1cc8e7fc66c..ac2cd672199 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -82,17 +82,13 @@ class CupsPrintersHandler : public ::settings::SettingsPageUIHandler,
// Handles the callback for HandleGetPrinterInfo. |callback_id| is the
// identifier to resolve the correct Promise. |result| indicates if the query
// was successful. |printer_status| contains the current status of the
- // printer. |make| is the detected printer manufacturer. |model| is the
- // detected model. |make_and_model| is the unparsed printer-make-and-model
- // string. |ipp_everywhere| indicates if configuration using the CUPS IPP
- // Everywhere driver should be attempted. If |result| is not SUCCESS, the
- // values of |printer_status|, |make|, |model|, |make_and_model|, and
- // |ipp_everywhere| are not specified.
+ // printer. |make_and_model| is the unparsed printer-make-and-model string.
+ // |ipp_everywhere| indicates if configuration using the CUPS IPP Everywhere
+ // driver should be attempted. If |result| is not SUCCESS, the values of
+ // |printer_status|, |make_and_model|, and |ipp_everywhere| are not specified.
void OnAutoconfQueried(const std::string& callback_id,
printing::PrinterQueryResult result,
const printing::PrinterStatus& printer_status,
- const std::string& make,
- const std::string& model,
const std::string& make_and_model,
const std::vector<std::string>& document_formats,
bool ipp_everywhere);
@@ -103,8 +99,6 @@ class CupsPrintersHandler : public ::settings::SettingsPageUIHandler,
Printer printer,
printing::PrinterQueryResult result,
const printing::PrinterStatus& printer_status,
- const std::string& make,
- const std::string& model,
const std::string& make_and_model,
const std::vector<std::string>& document_formats,
bool ipp_everywhere);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
index 3cbc84137cd..d956397ffdf 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
@@ -10,16 +10,13 @@
#include "base/callback_helpers.h"
#include "base/files/file_path.h"
#include "base/json/json_string_value_serializer.h"
-#include "base/test/metrics/histogram_tester.h"
#include "base/values.h"
-#include "chrome/browser/chromeos/printing/print_management/print_management_uma.h"
#include "chrome/browser/chromeos/printing/printing_stubs.h"
#include "chrome/browser/download/chrome_download_manager_delegate.h"
#include "chrome/browser/download/download_core_service_factory.h"
#include "chrome/browser/download/download_core_service_impl.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/test/base/testing_profile.h"
-#include "chromeos/components/scanning/scanning_uma.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
#include "content/public/test/browser_task_environment.h"
@@ -111,7 +108,7 @@ class FakeSelectFileDialog : public ui::SelectFileDialog {
protected:
void SelectFileImpl(Type type,
- const base::string16& title,
+ const std::u16string& title,
const base::FilePath& default_path,
const FileTypeInfo* file_types,
int file_type_index,
@@ -204,7 +201,6 @@ class CupsPrintersHandlerTest : public testing::Test {
protected:
// Must outlive |profile_|.
- base::HistogramTester histogram_tester_;
content::BrowserTaskEnvironment task_environment_;
TestingProfile profile_;
content::TestWebUI web_ui_;
@@ -258,35 +254,5 @@ TEST_F(CupsPrintersHandlerTest, VerifyOnlyPpdFilesAllowed) {
&base::Value::AsListValue(args));
}
-TEST_F(CupsPrintersHandlerTest, VerifyPrintManagementAppEntryPointHistogram) {
- base::Value args(base::Value::Type::LIST);
- web_ui_.HandleReceivedMessage("openPrintManagementApp",
- &base::Value::AsListValue(args));
- histogram_tester_.ExpectBucketCount(
- "Printing.CUPS.PrintManagementAppEntryPoint",
- PrintManagementAppEntryPoint::kSettings, 1);
- histogram_tester_.ExpectBucketCount(
- "Printing.CUPS.PrintManagementAppEntryPoint",
- PrintManagementAppEntryPoint::kNotification, 0);
- histogram_tester_.ExpectBucketCount(
- "Printing.CUPS.PrintManagementAppEntryPoint",
- PrintManagementAppEntryPoint::kLauncher, 0);
- histogram_tester_.ExpectBucketCount(
- "Printing.CUPS.PrintManagementAppEntryPoint",
- PrintManagementAppEntryPoint::kBrowser, 0);
-}
-
-TEST_F(CupsPrintersHandlerTest, VerifyScanAppEntryPointHistogram) {
- base::Value args(base::Value::Type::LIST);
- web_ui_.HandleReceivedMessage("openScanningApp",
- &base::Value::AsListValue(args));
- histogram_tester_.ExpectBucketCount(
- "Scanning.ScanAppEntryPoint",
- chromeos::scanning::ScanAppEntryPoint::kSettings, 1);
- histogram_tester_.ExpectBucketCount(
- "Scanning.ScanAppEntryPoint",
- chromeos::scanning::ScanAppEntryPoint::kLauncher, 0);
-}
-
} // namespace settings.
} // namespace chromeos.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
index 1c5867a610e..17b4267c337 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
@@ -11,11 +11,11 @@
#include "base/command_line.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/ash/system/timezone_resolver_manager.h"
#include "chrome/browser/ash/system/timezone_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
#include "chrome/browser/chromeos/set_time_dialog.h"
#include "chrome/common/pref_names.h"
#include "chromeos/dbus/system_clock/system_clock_client.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
index 31fe09897d5..a20eed2fb35 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
@@ -200,7 +200,8 @@ TEST_F(KeyboardHandlerTest, ExternalKeyboard) {
base::FilePath("/devices/platform/i8042/serio0/input/input1"), 1, 1,
0xab41);
fake_udev->AddFakeDevice(internal_kbd.name, internal_kbd.sys_path.value(),
- /*subsystem=*/"input", /*sysattrs=*/{},
+ /*subsystem=*/"input", /*devnode=*/base::nullopt,
+ /*devtype=*/base::nullopt, /*sysattrs=*/{},
/*properties=*/{});
// Generic external USB keyboard.
const ui::InputDevice external_generic_kbd(
@@ -211,7 +212,8 @@ TEST_F(KeyboardHandlerTest, ExternalKeyboard) {
0x046d, 0xc31c, 0x0111);
fake_udev->AddFakeDevice(external_generic_kbd.name,
external_generic_kbd.sys_path.value(),
- /*subsystem=*/"input", /*sysattrs=*/{},
+ /*subsystem=*/"input", /*devnode=*/base::nullopt,
+ /*devtype=*/base::nullopt, /*sysattrs=*/{},
/*properties=*/{});
// Apple keyboard.
const ui::InputDevice external_apple_kbd(
@@ -221,7 +223,8 @@ TEST_F(KeyboardHandlerTest, ExternalKeyboard) {
0x05ac, 0x026c, 0x0111);
fake_udev->AddFakeDevice(external_apple_kbd.name,
external_apple_kbd.sys_path.value(),
- /*subsystem=*/"input", /*sysattrs=*/{},
+ /*subsystem=*/"input", /*devnode=*/base::nullopt,
+ /*devtype=*/base::nullopt, /*sysattrs=*/{},
/*properties=*/{});
// Chrome OS external USB keyboard.
const ui::InputDevice external_chromeos_kbd(
@@ -231,7 +234,8 @@ TEST_F(KeyboardHandlerTest, ExternalKeyboard) {
0x04ca, 0x0082, 0x0111);
fake_udev->AddFakeDevice(
external_chromeos_kbd.name, external_chromeos_kbd.sys_path.value(),
- /*subsystem=*/"input", /*sysattrs=*/{},
+ /*subsystem=*/"input", /*devnode=*/base::nullopt,
+ /*devtype=*/base::nullopt, /*sysattrs=*/{},
/*properties=*/{{"CROS_KEYBOARD_TOP_ROW_LAYOUT", "1"}});
// An internal keyboard shouldn't change the defaults.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
index 6bf1eca2d85..266ebfe378d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
@@ -29,12 +29,12 @@ namespace chromeos {
namespace settings {
namespace {
-base::string16 GetBatteryTimeText(base::TimeDelta time_left) {
+std::u16string GetBatteryTimeText(base::TimeDelta time_left) {
int hour = 0;
int min = 0;
ash::power_utils::SplitTimeIntoHoursAndMinutes(time_left, &hour, &min);
- base::string16 time_text;
+ std::u16string time_text;
if (hour == 0 || min == 0) {
// Display only one unit ("2 hours" or "10 minutes").
return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION,
@@ -314,7 +314,7 @@ void PowerHandler::SendBatteryStatus() {
show_time = ash::power_utils::ShouldDisplayBatteryTime(time_left);
}
- base::string16 status_text;
+ std::u16string status_text;
if (show_time) {
status_text = l10n_util::GetStringFUTF16(
charging ? IDS_SETTINGS_BATTERY_STATUS_CHARGING
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.h
index 699802af8ae..dcda34138f2 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.h
@@ -7,12 +7,12 @@
#include <memory>
#include <set>
+#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/scoped_observation.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/dbus/power/power_policy_controller.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc
index 519773e5bda..8973f4bad3e 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc
@@ -17,7 +17,6 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
-#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/settings/chromeos/device_display_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h"
@@ -853,9 +852,8 @@ void DeviceSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
html_source->AddBoolean("isDemoSession",
chromeos::DemoSession::IsDeviceInDemoMode());
- html_source->AddBoolean("enableLanguageSettingsV2",
- base::FeatureList::IsEnabled(
- ::chromeos::features::kLanguageSettingsUpdate));
+ // TODO(crbug.com/1097328): Delete this.
+ html_source->AddBoolean("enableLanguageSettingsV2", true);
AddDevicePointersStrings(html_source);
AddDeviceKeyboardStrings(html_source);
@@ -1228,9 +1226,6 @@ void DeviceSection::AddDevicePointersStrings(
"allowDisableMouseAcceleration",
base::FeatureList::IsEnabled(::features::kAllowDisableMouseAcceleration));
html_source->AddBoolean("allowScrollSettings", AreScrollSettingsAllowed());
- html_source->AddBoolean(
- "separatePointingStickSettings",
- base::FeatureList::IsEnabled(::features::kSeparatePointingStickSettings));
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
index ad8de481a8d..7b94e1cdb60 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
@@ -10,7 +10,7 @@
#include <string>
#include <utility>
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
@@ -274,7 +274,7 @@ void StorageHandler::UpdateStorageItem(
if (calculation_type != calculator::SizeCalculator::CalculationType::kSystem)
UpdateSystemSize(calculation_type, total_bytes);
- base::string16 message;
+ std::u16string message;
if (total_bytes < 0) {
message = l10n_util::GetStringUTF16(IDS_SETTINGS_STORAGE_SIZE_UNKNOWN);
} else {
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
index 0819ea175cb..b11961161e6 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
@@ -8,8 +8,8 @@
#include <string>
#include "base/scoped_observation.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager_observer.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager_observer.h"
#include "chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/disks/disk_mount_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
index e82018ceead..3e161ee77c4 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
@@ -13,8 +13,8 @@
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
#include "base/test/scoped_running_on_chromeos.h"
-#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
-#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
+#include "chrome/browser/ash/arc/session/arc_session_manager.h"
+#include "chrome/browser/ash/arc/test/test_arc_session_manager.h"
#include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator_test_api.h"
@@ -463,12 +463,9 @@ TEST_F(StorageHandlerTest, SystemSize) {
std::vector<int64_t>{200 * GB, 50 * GB, 50 * GB};
other_users_size_test_api_->InitializeOtherUserSize(other_user_sizes.size());
for (std::size_t i = 0; i < other_user_sizes.size(); i++) {
- cryptohome::BaseReply result;
- result.set_error(cryptohome::CRYPTOHOME_ERROR_NOT_SET);
- cryptohome::GetAccountDiskUsageReply* usage_reply =
- result.MutableExtension(cryptohome::GetAccountDiskUsageReply::reply);
- usage_reply->set_size(other_user_sizes[i]);
- base::Optional<cryptohome::BaseReply> reply = std::move(result);
+ base::Optional<::user_data_auth::GetAccountDiskUsageReply> reply =
+ ::user_data_auth::GetAccountDiskUsageReply();
+ reply->set_size(other_user_sizes[i]);
other_users_size_test_api_->SimulateOnGetOtherUserSize(reply);
if (i < other_user_sizes.size() - 1) {
ASSERT_FALSE(GetWebUICallbackMessage("storage-other-users-size-changed"));
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
index c9be5570431..c18dde7c358 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
@@ -13,7 +13,7 @@
#include "base/bind.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc
index 75f9d4652ec..ff4ff98f1af 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/files_section.h"
+#include "base/callback_helpers.h"
#include "base/no_destructor.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
index b92e54c9b8b..3c7919f7867 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
@@ -10,8 +10,8 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
+#include "chrome/browser/ash/guest_os/guest_os_share_path.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
-#include "chrome/browser/chromeos/guest_os/guest_os_share_path.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h
index 41c4888116e..e6340387135 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h
@@ -7,8 +7,8 @@
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager_factory.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_manager.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_manager_factory.h"
#include "chrome/browser/chromeos/usb/cros_usb_detector.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.cc
index 2f586566acc..8e69018adc6 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.cc
@@ -267,7 +267,7 @@ std::string Hierarchy::ModifySearchResultUrl(
url_to_modify);
}
-std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
+std::vector<std::u16string> Hierarchy::GenerateAncestorHierarchyStrings(
mojom::Subpage subpage) const {
const SubpageMetadata& subpage_metadata = GetSubpageMetadata(subpage);
@@ -276,7 +276,7 @@ std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
return GenerateHierarchyStrings(subpage_metadata.section);
// Nested subpage; use recursive call, then append parent subpage name itself.
- std::vector<base::string16> hierarchy_strings =
+ std::vector<std::u16string> hierarchy_strings =
GenerateAncestorHierarchyStrings(*subpage_metadata.parent_subpage);
hierarchy_strings.push_back(
GetSubpageMetadata(*subpage_metadata.parent_subpage)
@@ -285,7 +285,7 @@ std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
return hierarchy_strings;
}
-std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
+std::vector<std::u16string> Hierarchy::GenerateAncestorHierarchyStrings(
mojom::Setting setting) const {
const SettingMetadata& setting_metadata = GetSettingMetadata(setting);
@@ -294,7 +294,7 @@ std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
return GenerateHierarchyStrings(setting_metadata.primary.first);
// Nested setting; use subpage ancestors, then append subpage name itself.
- std::vector<base::string16> hierarchy_strings =
+ std::vector<std::u16string> hierarchy_strings =
GenerateAncestorHierarchyStrings(*setting_metadata.primary.second);
hierarchy_strings.push_back(
GetSubpageMetadata(*setting_metadata.primary.second)
@@ -303,9 +303,9 @@ std::vector<base::string16> Hierarchy::GenerateAncestorHierarchyStrings(
return hierarchy_strings;
}
-std::vector<base::string16> Hierarchy::GenerateHierarchyStrings(
+std::vector<std::u16string> Hierarchy::GenerateHierarchyStrings(
mojom::Section section) const {
- std::vector<base::string16> hierarchy_strings;
+ std::vector<std::u16string> hierarchy_strings;
hierarchy_strings.push_back(
l10n_util::GetStringUTF16(IDS_INTERNAL_APP_SETTINGS));
hierarchy_strings.push_back(GetSectionMetadata(section)
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.h b/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.h
index 14b915670d4..53334ca524d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/hierarchy.h
@@ -5,12 +5,12 @@
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_HIERARCHY_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_HIERARCHY_H_
+#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include "base/optional.h"
-#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_identifier.h"
@@ -137,11 +137,11 @@ class Hierarchy {
// ["Settings", "Network"]
// Example 2 - External storage (has parent subpage):
// ["Settings", "Device", "Storage management"]
- std::vector<base::string16> GenerateAncestorHierarchyStrings(
+ std::vector<std::u16string> GenerateAncestorHierarchyStrings(
mojom::Subpage subpage) const;
// Same as above, but for settings.
- std::vector<base::string16> GenerateAncestorHierarchyStrings(
+ std::vector<std::u16string> GenerateAncestorHierarchyStrings(
mojom::Setting setting) const;
protected:
@@ -153,7 +153,7 @@ class Hierarchy {
class PerSectionHierarchyGenerator;
// Generates an array with the Settings app name and |section|'s name.
- std::vector<base::string16> GenerateHierarchyStrings(
+ std::vector<std::u16string> GenerateHierarchyStrings(
mojom::Section section) const;
virtual std::string ModifySearchResultUrl(
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc
index aaab88f1523..cbe5f880487 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc
@@ -8,6 +8,7 @@
#include "ash/public/cpp/ash_features.h"
#include "ash/public/cpp/network_config_service.h"
#include "base/bind.h"
+#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.h"
@@ -225,6 +226,19 @@ const std::vector<SearchConcept>& GetWifiMeteredSearchConcepts() {
return *tags;
}
+const std::vector<SearchConcept>& GetWifiHiddenSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_HIDDEN_NETWORK,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiHidden},
+ {IDS_OS_SETTINGS_TAG_HIDDEN_NETWORK_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
const std::vector<SearchConcept>& GetCellularSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_CELLULAR,
@@ -465,6 +479,7 @@ const std::vector<mojom::Setting>& GetWifiDetailsSettings() {
mojom::Setting::kWifiProxy,
mojom::Setting::kWifiAutoConnectToNetwork,
mojom::Setting::kWifiMetered,
+ mojom::Setting::kWifiHidden,
});
return *settings;
}
@@ -620,6 +635,8 @@ void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
{"networkButtonForget", IDS_SETTINGS_INTERNET_BUTTON_FORGET},
{"networkButtonViewAccount", IDS_SETTINGS_INTERNET_BUTTON_VIEW_ACCOUNT},
{"networkConnectNotAllowed", IDS_SETTINGS_INTERNET_CONNECT_NOT_ALLOWED},
+ {"networkHidden", IDS_SETTINGS_INTERNET_NETWORK_HIDDEN},
+ {"networkHiddenSublabel", IDS_SETTINGS_INTERNET_NETWORK_HIDDEN_SUBLABEL},
{"networkIPAddress", IDS_SETTINGS_INTERNET_NETWORK_IP_ADDRESS},
{"networkIPConfigAuto", IDS_SETTINGS_INTERNET_NETWORK_IP_CONFIG_AUTO},
{"networkMetered", IDS_SETTINGS_INTERNET_NETWORK_METERED},
@@ -648,10 +665,6 @@ void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
{"networkSharedNotOwner", IDS_SETTINGS_INTERNET_NETWORK_SHARED_NOT_OWNER},
{"networkVpnBuiltin", IDS_NETWORK_TYPE_VPN_BUILTIN},
{"networkOutOfRange", IDS_SETTINGS_INTERNET_WIFI_NETWORK_OUT_OF_RANGE},
- {"cellularContactSpecificCarrier",
- IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_SPECIFIC_CARRIER},
- {"cellularContactDefaultCarrier",
- IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_DEFAULT_CARRIER},
{"cellularSetupDialogTitle",
IDS_SETTINGS_INTERNET_CELLULAR_SETUP_DIALOG_TITLE},
{"tetherPhoneOutOfRange",
@@ -697,19 +710,22 @@ void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
{"tetherEnableBluetooth", IDS_ENABLE_BLUETOOTH},
{"cellularNetworkEsimLabel", IDS_SETTINGS_INTERNET_ESIM_LABEL},
{"cellularNetworkPsimLabel", IDS_SETTINGS_INTERNET_PSIM_LABEL},
- {"pSimNetworkNotSetup",
- IDS_SETTINGS_INTERNET_PSIM_NOT_SETUP_WITH_SETUP_LINK},
+ {"pSimNotInsertedLabel", IDS_SETTINGS_INTERNET_PSIM_NOT_INSERTED_LABEL},
{"eSimNetworkNotSetup",
IDS_SETTINGS_INTERNET_ESIM_NOT_SETUP_WITH_SETUP_LINK},
{"cellularNetworkTetherLabel", IDS_SETTINGS_INTERNET_TETHER_LABEL},
{"showEidPopupButtonLabel",
IDS_SETTINGS_INTERNET_SHOW_EID_POPUP_BUTTON_LABEL},
+ {"eSimNoConnectionErrorToast",
+ IDS_SETTINGS_INTERNET_ESIM_NO_CONNECTION_ERROR_TOAST},
{"eSimInstallErrorDialogTitle",
IDS_SETTINGS_INTERNET_NETWORK_INSTALL_ERROR_DIALOG_TITLE},
{"eSimInstallErrorDialogConfirmationCodeMessage",
IDS_SETTINGS_INTERNET_NETWORK_INSTALL_ERROR_DIALOG_CONFIRMATION_CODE_MESSAGE},
{"eSimInstallErrorDialogConfirmationCodeError",
IDS_CELLULAR_SETUP_ESIM_PAGE_INSTALL_ERROR_DIALOG_CONFIRMATION_CODE_ERROR},
+ {"eSimInstallErrorDialogGenericErrorMessage",
+ IDS_SETTINGS_INTERNET_NETWORK_INSTALL_ERROR_DIALOG_GENERIC_ERROR_MESSAGE},
{"eSimRenameProfileDialogLabel",
IDS_SETTINGS_INTERNET_NETWORK_RENAME_DIALOG_RENAME_PROFILE},
{"eSimRenameProfileDialogDone",
@@ -730,6 +746,16 @@ void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
IDS_SETTINGS_INTERNET_NETWORK_REMOVE_PROFILE_DIALOG_OKAY},
{"eSimDialogConnectionWarning",
IDS_SETTINGS_INTERNET_ESIM_DIALOG_CONNECTION_WARNING},
+ {"cellularNetworkInstallingProfile",
+ IDS_SETTINGS_INTERNET_NETWORK_CELLULAR_INSTALLING_PROFILE},
+ {"cellularNetworkRemovingProfile",
+ IDS_SETTINGS_INTERNET_NETWORK_CELLULAR_REMOVING_PROFILE},
+ {"cellularNetworkRenamingProfile",
+ IDS_SETTINGS_INTERNET_NETWORK_CELLULAR_RENAMING_PROFILE},
+ {"cellularNetworkConnectingToProfile",
+ IDS_SETTINGS_INTERNET_NETWORK_CELLULAR_CONNECTING_TO_PROFILE},
+ {"cellularNetworRefreshingProfileListProfile",
+ IDS_SETTINGS_INTERNET_NETWORK_CELLULAR_REFRESHING_PROFILE_LIST},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
@@ -748,10 +774,16 @@ void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
html_source->AddBoolean(
"showMeteredToggle",
base::FeatureList::IsEnabled(::features::kMeteredShowToggle));
+ html_source->AddBoolean(
+ "showHiddenToggle",
+ base::FeatureList::IsEnabled(::features::kShowHiddenNetworkToggle));
html_source->AddString("networkGoogleNameserversLearnMoreUrl",
chrome::kGoogleNameserversLearnMoreURL);
+ html_source->AddString("wifiHiddenNetworkLearnMoreUrl",
+ chrome::kWifiHiddenNetworkURL);
+
html_source->AddString(
"networkNotSynced",
l10n_util::GetStringFUTF16(
@@ -801,8 +833,15 @@ std::string InternetSection::GetSectionPath() const {
bool InternetSection::LogMetric(mojom::Setting setting,
base::Value& value) const {
- // Unimplemented.
- return false;
+ switch (setting) {
+ case mojom::Setting::kWifiHidden:
+ base::UmaHistogramBoolean("ChromeOS.Settings.Wifi.Hidden",
+ value.GetBool());
+ return true;
+
+ default:
+ return false;
+ }
}
void InternetSection::RegisterHierarchy(HierarchyGenerator* generator) const {
@@ -1012,6 +1051,7 @@ void InternetSection::OnNetworkList(
updater.RemoveSearchTags(GetEthernetNotConnectedSearchConcepts());
updater.RemoveSearchTags(GetWifiConnectedSearchConcepts());
updater.RemoveSearchTags(GetWifiMeteredSearchConcepts());
+ updater.RemoveSearchTags(GetWifiHiddenSearchConcepts());
updater.RemoveSearchTags(GetCellularSearchConcepts());
updater.RemoveSearchTags(GetCellularConnectedSearchConcepts());
updater.RemoveSearchTags(GetCellularSetupAndDetailMenuSearchConcepts());
@@ -1048,6 +1088,8 @@ void InternetSection::OnNetworkList(
updater.AddSearchTags(GetWifiConnectedSearchConcepts());
if (base::FeatureList::IsEnabled(::features::kMeteredShowToggle))
updater.AddSearchTags(GetWifiMeteredSearchConcepts());
+ if (base::FeatureList::IsEnabled(::features::kShowHiddenNetworkToggle))
+ updater.AddSearchTags(GetWifiHiddenSearchConcepts());
break;
case NetworkType::kCellular:
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
index 06f1ec6d9ef..928c18302cb 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
@@ -4,12 +4,12 @@
#include "chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h"
+#include <string>
#include <utility>
#include "ash/constants/ash_features.h"
#include "base/bind.h"
#include "base/memory/ptr_util.h"
-#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
@@ -110,6 +110,8 @@ void AddKerberosAddAccountDialogStrings(content::WebUIDataSource* html_source) {
IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NOT_SUPPORTED},
{"kerberosConfigErrorKrb5FailedToParse",
IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KRB5_FAILED_TO_PARSE},
+ {"kerberosConfigErrorTooManyNestedGroups",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_TOO_MANY_NESTED_GROUPS},
{"addKerberosAccountRefreshButtonLabel",
IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REFRESH_BUTTON_LABEL},
{"addKerberosAccount", IDS_SETTINGS_ADD_KERBEROS_ACCOUNT},
@@ -266,7 +268,7 @@ void KerberosAccountsHandler::OnListAccounts(
// 'nn days' otherwise.
base::TimeDelta tgt_validity =
base::TimeDelta::FromSeconds(account.tgt_validity_seconds());
- const base::string16 valid_for_duration = ui::TimeFormat::Detailed(
+ const std::u16string valid_for_duration = ui::TimeFormat::Detailed(
ui::TimeFormat::FORMAT_DURATION, ui::TimeFormat::LENGTH_LONG,
tgt_validity < base::TimeDelta::FromDays(1) ? -1 : 0, tgt_validity);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
index ea6d1082978..f94798ccf67 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
@@ -17,7 +17,9 @@ namespace chromeos {
namespace settings {
namespace {
-const std::vector<SearchConcept>& GetKerberosSearchConcepts() {
+// Provides search tags that are always available when the feature is enabled by
+// policy/flag.
+const std::vector<SearchConcept>& GetFixedKerberosSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_KERBEROS_SECTION,
mojom::kKerberosSectionPath,
@@ -37,6 +39,14 @@ const std::vector<SearchConcept>& GetKerberosSearchConcepts() {
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAddKerberosTicketV2}},
+ });
+ return *tags;
+}
+
+// Provides search tags that are only available when the feature is enabled by
+// policy/flag and there is at least one Kerberos ticket.
+const std::vector<SearchConcept>& GetDynamicKerberosSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_KERBEROS_REMOVE,
mojom::kKerberosAccountsV2SubpagePath,
mojom::SearchResultIcon::kAuthKey,
@@ -68,7 +78,7 @@ KerberosSection::KerberosSection(
if (kerberos_credentials_manager_) {
// Kerberos search tags are added/removed dynamically.
kerberos_credentials_manager_->AddObserver(this);
- OnKerberosEnabledStateChanged();
+ UpdateKerberosSearchConcepts();
}
}
@@ -140,13 +150,34 @@ void KerberosSection::RegisterHierarchy(HierarchyGenerator* generator) const {
kKerberosAccountsV2Settings, generator);
}
+void KerberosSection::OnAccountsChanged() {
+ UpdateKerberosSearchConcepts();
+}
+
void KerberosSection::OnKerberosEnabledStateChanged() {
+ UpdateKerberosSearchConcepts();
+}
+
+// Updates search tags according to the KerberosEnabled state and the presence
+// of Kerberos tickets in the system.
+void KerberosSection::UpdateKerberosSearchConcepts() {
+ CHECK(kerberos_credentials_manager_);
+
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
- if (kerberos_credentials_manager_->IsKerberosEnabled())
- updater.AddSearchTags(GetKerberosSearchConcepts());
- else
- updater.RemoveSearchTags(GetKerberosSearchConcepts());
+ // Removes all search tags first. They will be added conditionally later.
+ updater.RemoveSearchTags(GetFixedKerberosSearchConcepts());
+ updater.RemoveSearchTags(GetDynamicKerberosSearchConcepts());
+
+ if (kerberos_credentials_manager_->IsKerberosEnabled()) {
+ updater.AddSearchTags(GetFixedKerberosSearchConcepts());
+
+ const std::string account_name =
+ kerberos_credentials_manager_->GetActiveAccount();
+ if (!account_name.empty()) {
+ updater.AddSearchTags(GetDynamicKerberosSearchConcepts());
+ }
+ }
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
index 63a1150bb73..12c7d8b8846 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
@@ -42,8 +42,11 @@ class KerberosSection : public OsSettingsSection,
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// KerberosCredentialsManager::Observer:
+ void OnAccountsChanged() override;
void OnKerberosEnabledStateChanged() override;
+ void UpdateKerberosSearchConcepts();
+
KerberosCredentialsManager* kerberos_credentials_manager_;
};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
index b28881b432c..1b37da15afb 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
@@ -26,38 +26,6 @@ namespace chromeos {
namespace settings {
namespace {
-const std::vector<SearchConcept>& GetLanguagesSearchConceptsV1() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags({
- {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT,
- mojom::kLanguagesAndInputDetailsSubpagePath,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSubpage,
- {.subpage = mojom::Subpage::kLanguagesAndInputDetails}},
- {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_METHODS,
- mojom::kManageInputMethodsSubpagePath,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSubpage,
- {.subpage = mojom::Subpage::kManageInputMethods}},
- {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_ADD_LANGUAGE,
- mojom::kLanguagesAndInputDetailsSubpagePath,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSetting,
- {.setting = mojom::Setting::kAddLanguage}},
- {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_INPUT_OPTIONS_SHELF,
- mojom::kLanguagesAndInputDetailsSubpagePath,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSetting,
- {.setting = mojom::Setting::kShowInputOptionsInShelf},
- {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_INPUT_OPTIONS_SHELF_ALT1,
- SearchConcept::kAltTagEnd}},
- });
- return *tags;
-}
-
const std::vector<SearchConcept>& GetLanguagesPageSearchConceptsV2() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_LANGUAGES,
@@ -132,9 +100,9 @@ const std::vector<SearchConcept>& GetEditDictionarySearchConceptsV2() {
return *tags;
}
-bool IsLanguageSettingsV2Enabled() {
+bool IsLanguageSettingsV2Update2Enabled() {
return base::FeatureList::IsEnabled(
- ::chromeos::features::kLanguageSettingsUpdate);
+ ::chromeos::features::kLanguageSettingsUpdate2);
}
const std::vector<SearchConcept>& GetSmartInputsSearchConcepts() {
@@ -322,6 +290,12 @@ void AddInputPageStringsV2(content::WebUIDataSource* html_source) {
IDS_OS_SETTINGS_LANGUAGES_SPELL_CHECK_LANGUAGES_LIST_TITLE},
{"spellCheckLanguagesListDescription",
IDS_OS_SETTINGS_LANGUAGES_SPELL_CHECK_LANGUAGES_LIST_DESCRIPTION},
+ {"addSpellCheckLanguagesTitle",
+ IDS_OS_SETTINGS_LANGUAGES_ADD_SPELL_CHECK_LANGUAGES_TITLE},
+ {"spellCheckLanguageNotAllowed",
+ IDS_OS_SETTINGS_LANGUAGES_SPELL_CHECK_LANGUAGE_NOT_ALLOWED},
+ {"removeSpellCheckLanguageTooltip",
+ IDS_OS_SETTINGS_LANGUAGES_REMOVE_SPELL_CHECK_LANGUAGE_TOOLTIP},
{"languagesDictionaryDownloadError",
IDS_OS_SETTINGS_LANGUAGES_DICTIONARY_DOWNLOAD_FAILED},
{"languagesDictionaryDownloadRetryLabel",
@@ -353,19 +327,15 @@ LanguagesSection::LanguagesSection(Profile* profile,
: OsSettingsSection(profile, search_tag_registry),
pref_service_(pref_service) {
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
- if (IsLanguageSettingsV2Enabled()) {
- pref_change_registrar_.Init(pref_service_);
- pref_change_registrar_.Add(
- spellcheck::prefs::kSpellCheckEnable,
- base::BindRepeating(&LanguagesSection::UpdateSpellCheckSearchTags,
- base::Unretained(this)));
-
- updater.AddSearchTags(GetLanguagesPageSearchConceptsV2());
- updater.AddSearchTags(GetInputPageSearchConceptsV2());
- UpdateSpellCheckSearchTags();
- } else {
- updater.AddSearchTags(GetLanguagesSearchConceptsV1());
- }
+ pref_change_registrar_.Init(pref_service_);
+ pref_change_registrar_.Add(
+ spellcheck::prefs::kSpellCheckEnable,
+ base::BindRepeating(&LanguagesSection::UpdateSpellCheckSearchTags,
+ base::Unretained(this)));
+
+ updater.AddSearchTags(GetLanguagesPageSearchConceptsV2());
+ updater.AddSearchTags(GetInputPageSearchConceptsV2());
+ UpdateSpellCheckSearchTags();
if (IsAssistivePersonalInfoAllowed() || IsEmojiSuggestionAllowed()) {
updater.AddSearchTags(GetSmartInputsSearchConcepts());
@@ -426,8 +396,10 @@ void LanguagesSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
html_source->AddBoolean("imeOptionsInSettings",
base::FeatureList::IsEnabled(
::chromeos::features::kImeOptionsInSettings));
- html_source->AddBoolean("enableLanguageSettingsV2",
- IsLanguageSettingsV2Enabled());
+ // TODO(crbug.com/1097328): Delete this.
+ html_source->AddBoolean("enableLanguageSettingsV2", true);
+ html_source->AddBoolean("enableLanguageSettingsV2Update2",
+ IsLanguageSettingsV2Update2Enabled());
}
void LanguagesSection::AddHandlers(content::WebUI* web_ui) {
@@ -496,37 +468,17 @@ void LanguagesSection::RegisterHierarchy(HierarchyGenerator* generator) const {
mojom::SearchResultIcon::kGlobe, mojom::SearchResultDefaultRank::kMedium,
mojom::kLanguagesAndInputDetailsSubpagePath);
- // Shared settings between existing pages and the updated pages.
- if (IsLanguageSettingsV2Enabled()) {
- generator->RegisterNestedSetting(mojom::Setting::kAddLanguage,
- mojom::Subpage::kLanguages);
- generator->RegisterNestedSetting(mojom::Setting::kShowInputOptionsInShelf,
- mojom::Subpage::kInput);
-
- // Input method options.
- generator->RegisterNestedSubpage(
- IDS_SETTINGS_LANGUAGES_INPUT_METHOD_OPTIONS_TITLE,
- mojom::Subpage::kInputMethodOptions, mojom::Subpage::kInput,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::kInputMethodOptionsSubpagePath);
- } else {
- static constexpr mojom::Setting kLanguagesAndInputDetailsSettings[] = {
- mojom::Setting::kAddLanguage,
- mojom::Setting::kShowInputOptionsInShelf,
- };
- RegisterNestedSettingBulk(mojom::Subpage::kLanguagesAndInputDetails,
- kLanguagesAndInputDetailsSettings, generator);
-
- // Input method options.
- generator->RegisterNestedSubpage(
- IDS_SETTINGS_LANGUAGES_INPUT_METHOD_OPTIONS_TITLE,
- mojom::Subpage::kInputMethodOptions,
- mojom::Subpage::kLanguagesAndInputDetails,
- mojom::SearchResultIcon::kGlobe,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::kInputMethodOptionsSubpagePath);
- }
+ generator->RegisterNestedSetting(mojom::Setting::kAddLanguage,
+ mojom::Subpage::kLanguages);
+ generator->RegisterNestedSetting(mojom::Setting::kShowInputOptionsInShelf,
+ mojom::Subpage::kInput);
+
+ // Input method options.
+ generator->RegisterNestedSubpage(
+ IDS_SETTINGS_LANGUAGES_INPUT_METHOD_OPTIONS_TITLE,
+ mojom::Subpage::kInputMethodOptions, mojom::Subpage::kInput,
+ mojom::SearchResultIcon::kGlobe, mojom::SearchResultDefaultRank::kMedium,
+ mojom::kInputMethodOptionsSubpagePath);
// Manage input methods.
generator->RegisterNestedSubpage(
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc
index 023895cfeb0..e63667017f2 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc
@@ -69,7 +69,7 @@ void AddUpdateRequiredEolStrings(content::WebUIDataSource* html_source) {
// |eol_return_banner_text| contains the update required end of life banner
// text which is left empty when the banner should not be shown.
- base::string16 eol_return_banner_text;
+ std::u16string eol_return_banner_text;
if (device_managed && handler->ShouldShowUpdateRequiredEolBanner()) {
base::Optional<int> days = handler->GetTimeRemainingInDays();
// We only need to show the banner if less than equal to one week remains to
@@ -78,9 +78,9 @@ void AddUpdateRequiredEolStrings(content::WebUIDataSource* html_source) {
// |days| could have value equal to zero if we are very close to the
// deadline.
int days_remaining = days.value() ? days.value() : 1;
- base::string16 domain_name =
+ std::u16string domain_name =
base::UTF8ToUTF16(connector->GetEnterpriseDomainManager());
- base::string16 link_url =
+ std::u16string link_url =
base::UTF8ToUTF16(chrome::kChromeUIManagementURL);
if (days_remaining == 7) {
eol_return_banner_text = l10n_util::GetStringFUTF16(
@@ -254,6 +254,10 @@ std::unique_ptr<PluralStringHandler> MainSection::CreatePluralStringHandler() {
plural_string_handler->AddLocalizedString(
"nearbyShareContactVisibilityNumUnreachable",
IDS_NEARBY_CONTACT_VISIBILITY_NUM_UNREACHABLE);
+
+ plural_string_handler->AddLocalizedString(
+ "lockScreenNumberFingerprints",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS);
return plural_string_handler;
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler_unittest.cc
index 2ead0548f4d..14dacce7199 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler_unittest.cc
@@ -66,6 +66,8 @@ GenerateDefaultFeatureStatesMap() {
{multidevice_setup::mojom::Feature::kPhoneHubTaskContinuation,
multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost},
{multidevice_setup::mojom::Feature::kWifiSync,
+ multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost},
+ {multidevice_setup::mojom::Feature::kEche,
multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost}};
}
@@ -176,7 +178,8 @@ class MultideviceHandlerTest : public testing::Test {
handler_->RegisterMessages();
handler_->AllowJavascript();
- scoped_feature_list_.InitWithFeatures({chromeos::features::kPhoneHub}, {});
+ scoped_feature_list_.InitWithFeatures(
+ {chromeos::features::kPhoneHub, chromeos::features::kEcheSWA}, {});
}
void CallGetPageContentData() {
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc
index 9190e6f6ba9..d6be25b4068 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc
@@ -5,7 +5,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
#include "base/feature_list.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc
index 552e7c79439..752b433e03b 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc
@@ -29,7 +29,7 @@ OsSettingsManager::OsSettingsManager(
signin::IdentityManager* identity_manager,
android_sms::AndroidSmsService* android_sms_service,
CupsPrintersManager* printers_manager,
- apps::AppServiceProxy* app_service_proxy)
+ apps::AppServiceProxyChromeOs* app_service_proxy)
: search_tag_registry_(
std::make_unique<SearchTagRegistry>(local_search_service_proxy)),
sections_(
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
index 5377a69d657..fe45e845663 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
@@ -15,7 +15,7 @@ class Profile;
class SupervisedUserService;
namespace apps {
-class AppServiceProxy;
+class AppServiceProxyChromeOs;
} // namespace apps
namespace content {
@@ -100,7 +100,7 @@ class OsSettingsManager : public KeyedService {
signin::IdentityManager* identity_manager,
android_sms::AndroidSmsService* android_sms_service,
CupsPrintersManager* printers_manager,
- apps::AppServiceProxy* app_service_proxy);
+ apps::AppServiceProxyChromeOs* app_service_proxy);
OsSettingsManager(const OsSettingsManager& other) = delete;
OsSettingsManager& operator=(const OsSettingsManager& other) = delete;
~OsSettingsManager() override;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc
index a600d86be7c..f0211f64dac 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc
@@ -18,7 +18,7 @@ namespace settings {
constexpr const char OsSettingsSection::kSettingIdUrlParam[];
// static
-base::string16 OsSettingsSection::GetHelpUrlWithBoard(
+std::u16string OsSettingsSection::GetHelpUrlWithBoard(
const std::string& original_url) {
return base::ASCIIToUTF16(original_url +
"&b=" + base::SysInfo::GetLsbReleaseBoard());
@@ -60,7 +60,7 @@ mojom::SearchResultPtr OsSettingsSection::GenerateSectionSearchResult(
ModifySearchResultUrl(mojom::SearchResultType::kSection,
{.section = GetSection()}, GetSectionPath()),
GetSectionIcon(), relevance_score,
- std::vector<base::string16>{
+ std::vector<std::u16string>{
l10n_util::GetStringUTF16(IDS_INTERNAL_APP_SETTINGS),
l10n_util::GetStringUTF16(GetSectionNameMessageId())},
mojom::SearchResultDefaultRank::kMedium,
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h
index 52202657387..a7f7a76db39 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h
@@ -9,7 +9,6 @@
#include <vector>
#include "base/containers/span.h"
-#include "base/strings/string16.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
@@ -142,7 +141,7 @@ class OsSettingsSection {
mojom::SearchResultPtr GenerateSectionSearchResult(
double relevance_score) const;
- static base::string16 GetHelpUrlWithBoard(const std::string& original_url);
+ static std::u16string GetHelpUrlWithBoard(const std::string& original_url);
protected:
static void RegisterNestedSettingBulk(
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc
index 57434b8dc17..63a5f528fd0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc
@@ -43,7 +43,7 @@ OsSettingsSections::OsSettingsSections(
signin::IdentityManager* identity_manager,
android_sms::AndroidSmsService* android_sms_service,
CupsPrintersManager* printers_manager,
- apps::AppServiceProxy* app_service_proxy) {
+ apps::AppServiceProxyChromeOs* app_service_proxy) {
// Special case: Main section does not have an associated enum value.
sections_.push_back(
std::make_unique<MainSection>(profile, search_tag_registry));
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
index 2cef92ca7d6..bd98112e4c5 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
@@ -16,7 +16,7 @@ class Profile;
class SupervisedUserService;
namespace apps {
-class AppServiceProxy;
+class AppServiceProxyChromeOs;
} // namespace apps
namespace signin {
@@ -61,7 +61,7 @@ class OsSettingsSections {
signin::IdentityManager* identity_manager,
android_sms::AndroidSmsService* android_sms_service,
CupsPrintersManager* printers_manager,
- apps::AppServiceProxy* app_service_proxy);
+ apps::AppServiceProxyChromeOs* app_service_proxy);
OsSettingsSections(const OsSettingsSections& other) = delete;
OsSettingsSections& operator=(const OsSettingsSections& other) = delete;
virtual ~OsSettingsSections();
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
index 273c191c8a8..b56089a88e0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -64,27 +64,10 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
std::make_unique<chromeos::settings::StorageHandler>(profile,
html_source));
- int default_resource =
- base::FeatureList::IsEnabled(chromeos::features::kOsSettingsPolymer3)
- ? IDR_OS_SETTINGS_OS_SETTINGS_V3_HTML
-#if BUILDFLAG(OPTIMIZE_WEBUI)
- : IDR_OS_SETTINGS_VULCANIZED_HTML;
-#else
- : IDR_OS_SETTINGS_CHROMEOS_OS_SETTINGS_HTML;
-#endif
-
webui::SetupWebUIDataSource(
html_source,
base::make_span(kOsSettingsResources, kOsSettingsResourcesSize),
- default_resource);
-
- // For Polymer 2 optimized builds that rely on loading individual subpages,
- // set the default resource for tests.
-#if BUILDFLAG(OPTIMIZE_WEBUI)
- if (!base::FeatureList::IsEnabled(chromeos::features::kOsSettingsPolymer3)) {
- html_source->SetDefaultResource(default_resource);
- }
-#endif
+ IDR_OS_SETTINGS_OS_SETTINGS_V3_HTML);
ManagedUIHandler::Initialize(web_ui, html_source);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
index 364bfc38d0f..a304871edf7 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
@@ -62,7 +62,7 @@ void ParentalControlsHandler::HandleLaunchFamilyLinkSettings(
const base::ListValue* args) {
DCHECK(args->empty());
- apps::AppServiceProxy* proxy =
+ apps::AppServiceProxyChromeOs* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile_);
apps::AppRegistryCache& registry = proxy->AppRegistryCache();
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc
index a955e25b506..9fc306e9cad 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc
@@ -15,6 +15,7 @@
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/account_manager_facade_factory.h"
#include "chrome/browser/ash/account_manager/account_manager_util.h"
#include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
@@ -41,6 +42,7 @@
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/google/core/common/google_util.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/prefs/pref_service.h"
@@ -444,8 +446,6 @@ void AddLockScreenPageStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
{"lockScreenEditFingerprintsDescription",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
- {"lockScreenNumberFingerprints",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
{"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
{"lockScreenFingerprintNewName",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME},
@@ -483,6 +483,13 @@ void AddLockScreenPageStrings(content::WebUIDataSource* html_source,
"lockScreenHideSensitiveNotificationsSupported",
ash::features::IsLockScreenHideSensitiveNotificationsSupported());
+ html_source->AddString("lockScreenFingerprintNotice",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_NOTICE,
+ ui::GetChromeOSDeviceName()));
+ html_source->AddString("fingerprintLearnMoreLink",
+ chrome::kFingerprintLearnMoreURL);
+
if (chromeos::features::IsAccountManagementFlowsV2Enabled()) {
html_source->AddLocalizedString(
"lockScreenTitleLoginLock",
@@ -506,28 +513,16 @@ void AddFingerprintListStrings(content::WebUIDataSource* html_source) {
html_source->AddLocalizedStrings(kLocalizedStrings);
}
-void AddFingerprintStrings(content::WebUIDataSource* html_source,
- bool are_fingerprint_settings_allowed) {
+void AddFingerprintResources(content::WebUIDataSource* html_source,
+ bool are_fingerprint_settings_allowed) {
html_source->AddBoolean("fingerprintUnlockEnabled",
are_fingerprint_settings_allowed);
if (are_fingerprint_settings_allowed) {
- html_source->AddInteger(
- "fingerprintReaderLocation",
- static_cast<int32_t>(chromeos::quick_unlock::GetFingerprintLocation()));
-
- // To use lottie, the worker-src CSP needs to be updated for the web ui that
- // is using it. Since as of now there are only a couple of webuis using
- // lottie animations, this update has to be performed manually. As the usage
- // increases, set this as the default so manual override is no longer
- // required.
- html_source->OverrideContentSecurityPolicy(
- network::mojom::CSPDirectiveName::WorkerSrc,
- "worker-src blob: 'self';");
- html_source->AddResourcePath("finger_print.json",
- IDR_LOGIN_FINGER_PRINT_TABLET_ANIMATION);
+ chromeos::quick_unlock::AddFingerprintResources(html_source);
}
int instruction_id, aria_label_id;
+ bool aria_label_includes_device = false;
using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
switch (chromeos::quick_unlock::GetFingerprintLocation()) {
case FingerprintLocation::TABLET_POWER_BUTTON:
@@ -554,11 +549,37 @@ void AddFingerprintStrings(content::WebUIDataSource* html_source,
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
break;
+ case quick_unlock::FingerprintLocation::RIGHT_SIDE:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_RIGHT_SIDE_ARIA_LABEL;
+ aria_label_includes_device = true;
+ break;
+ case quick_unlock::FingerprintLocation::LEFT_SIDE:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_LEFT_SIDE_ARIA_LABEL;
+ aria_label_includes_device = true;
+ break;
+ case FingerprintLocation::UNKNOWN:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ break;
}
html_source->AddLocalizedString(
"configureFingerprintInstructionLocateScannerStep", instruction_id);
- html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
- aria_label_id);
+ if (aria_label_includes_device) {
+ html_source->AddString(
+ "configureFingerprintScannerStepAriaLabel",
+ l10n_util::GetStringFUTF16(aria_label_id, ui::GetChromeOSDeviceName()));
+ } else {
+ html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
+ aria_label_id);
+ }
}
void AddSetupFingerprintDialogStrings(content::WebUIDataSource* html_source) {
@@ -669,13 +690,13 @@ void AddParentalControlStrings(content::WebUIDataSource* html_source,
bool is_child = user_manager::UserManager::Get()->IsLoggedInAsChildUser();
html_source->AddBoolean("isChild", is_child);
- base::string16 tooltip;
+ std::u16string tooltip;
if (is_child) {
std::string custodian = supervised_user_service->GetCustodianName();
std::string second_custodian =
supervised_user_service->GetSecondCustodianName();
- base::string16 child_managed_tooltip;
+ std::u16string child_managed_tooltip;
if (second_custodian.empty()) {
child_managed_tooltip = l10n_util::GetStringFUTF16(
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_ONE_PARENT_TOOLTIP,
@@ -734,8 +755,10 @@ PeopleSection::PeopleSection(
g_browser_process->platform_part()->GetAccountManagerFactory();
account_manager_ = factory->GetAccountManager(profile->GetPath().value());
DCHECK(account_manager_);
-
- account_manager_->AddObserver(this);
+ account_manager_facade_ =
+ ::GetAccountManagerFacade(profile->GetPath().value());
+ DCHECK(account_manager_facade_);
+ account_manager_facade_observation_.Observe(account_manager_facade_);
FetchAccounts();
}
@@ -788,9 +811,6 @@ PeopleSection::~PeopleSection() {
if (chromeos::features::IsSplitSettingsSyncEnabled() && sync_service_)
sync_service_->RemoveObserver(this);
-
- if (account_manager_)
- account_manager_->RemoveObserver(this);
}
void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
@@ -835,7 +855,7 @@ void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
// Toggles the Chrome OS Account Manager submenu in the People section.
html_source->AddBoolean("isAccountManagerEnabled",
- account_manager_ != nullptr);
+ account_manager_facade_ != nullptr);
html_source->AddBoolean(
"isAccountManagementFlowsV2Enabled",
chromeos::features::IsAccountManagementFlowsV2Enabled());
@@ -884,7 +904,7 @@ void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
html_source, kerberos_credentials_manager_);
AddLockScreenPageStrings(html_source, profile()->GetPrefs());
AddFingerprintListStrings(html_source);
- AddFingerprintStrings(html_source, AreFingerprintSettingsAllowed());
+ AddFingerprintResources(html_source, AreFingerprintSettingsAllowed());
AddSetupFingerprintDialogStrings(html_source);
AddSetupPinDialogStrings(html_source);
AddSyncControlsStrings(html_source);
@@ -905,10 +925,10 @@ void PeopleSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(
std::make_unique<::settings::ProfileInfoHandler>(profile()));
- if (account_manager_) {
+ if (account_manager_facade_) {
web_ui->AddMessageHandler(
std::make_unique<chromeos::settings::AccountManagerUIHandler>(
- account_manager_, identity_manager_));
+ account_manager_, account_manager_facade_, identity_manager_));
}
if (chromeos::features::IsSplitSettingsSyncEnabled())
@@ -1070,12 +1090,13 @@ void PeopleSection::RegisterHierarchy(HierarchyGenerator* generator) const {
}
void PeopleSection::FetchAccounts() {
- account_manager_->GetAccounts(
+ account_manager_facade_->GetAccounts(
base::BindOnce(&PeopleSection::UpdateAccountManagerSearchTags,
weak_factory_.GetWeakPtr()));
}
-void PeopleSection::OnTokenUpserted(const ::account_manager::Account& account) {
+void PeopleSection::OnAccountUpserted(
+ const ::account_manager::Account& account) {
FetchAccounts();
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h
index 43fee276baa..61fe0e022c9 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h
@@ -7,10 +7,12 @@
#include "ash/components/account_manager/account_manager.h"
#include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
#include "base/values.h"
#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
#include "components/account_manager_core/account.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/sync/driver/sync_service_observer.h"
@@ -43,7 +45,7 @@ class SearchTagRegistry;
// they are allowed by policy/flags. Different sets of Sync tags are shown
// depending on whether the feature is enabed or disabled.
class PeopleSection : public OsSettingsSection,
- public AccountManager::Observer,
+ public account_manager::AccountManagerFacade::Observer,
public syncer::SyncServiceObserver,
public KerberosCredentialsManager::Observer {
public:
@@ -67,8 +69,8 @@ class PeopleSection : public OsSettingsSection,
bool LogMetric(mojom::Setting setting, base::Value& value) const override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
- // AccountManager::Observer:
- void OnTokenUpserted(const ::account_manager::Account& account) override;
+ // AccountManagerFacade::Observer:
+ void OnAccountUpserted(const ::account_manager::Account& account) override;
void OnAccountRemoved(const ::account_manager::Account& account) override;
// syncer::SyncServiceObserver:
@@ -84,12 +86,20 @@ class PeopleSection : public OsSettingsSection,
void UpdateRemoveFingerprintSearchTags();
AccountManager* account_manager_ = nullptr;
+ account_manager::AccountManagerFacade* account_manager_facade_ = nullptr;
syncer::SyncService* sync_service_;
SupervisedUserService* supervised_user_service_;
KerberosCredentialsManager* kerberos_credentials_manager_;
signin::IdentityManager* identity_manager_;
PrefService* pref_service_;
PrefChangeRegistrar fingerprint_pref_change_registrar_;
+
+ // An observer for `AccountManagerFacade`. Automatically deregisters when
+ // `this` is destructed.
+ base::ScopedObservation<account_manager::AccountManagerFacade,
+ account_manager::AccountManagerFacade::Observer>
+ account_manager_facade_observation_{this};
+
base::WeakPtrFactory<PeopleSection> weak_factory_{this};
};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc
index 94f0e039785..eaaa465e7a0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc
@@ -13,7 +13,6 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom-forward.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
@@ -42,6 +41,14 @@ const std::vector<SearchConcept>& GetPersonalizationSearchConcepts() {
{.section = mojom::Section::kPersonalization},
{IDS_OS_SETTINGS_TAG_PERSONALIZATION_ALT1,
IDS_OS_SETTINGS_TAG_PERSONALIZATION_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER,
+ mojom::kPersonalizationSectionPath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kOpenWallpaper},
+ {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT1,
+ IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT2, SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE,
mojom::kChangePictureSubpagePath,
mojom::SearchResultIcon::kAvatar,
@@ -57,34 +64,6 @@ const std::vector<SearchConcept>& GetPersonalizationSearchConcepts() {
return *tags;
}
-const std::vector<SearchConcept>& GetWallpaperChromeAppSearchConcepts() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags(
- {{IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER,
- mojom::kPersonalizationSectionPath,
- mojom::SearchResultIcon::kWallpaper,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSetting,
- {.setting = mojom::Setting::kOpenWallpaper},
- {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT1,
- IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT2,
- SearchConcept::kAltTagEnd}}});
- return *tags;
-}
-
-const std::vector<SearchConcept>& GetWallpaperWebUISearchConcepts() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags(
- {{IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER,
- mojom::kWallpaperSubpagePath,
- mojom::SearchResultIcon::kWallpaper,
- mojom::SearchResultDefaultRank::kMedium,
- mojom::SearchResultType::kSubpage,
- {.subpage = mojom::Subpage::kWallpaper},
- {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT1,
- IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT2,
- SearchConcept::kAltTagEnd}}});
- return *tags;
-}
-
const std::vector<SearchConcept>& GetAmbientModeSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_AMBIENT_MODE,
@@ -173,11 +152,6 @@ PersonalizationSection::PersonalizationSection(
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.AddSearchTags(GetPersonalizationSearchConcepts());
- if (chromeos::features::IsWallpaperWebUIEnabled())
- updater.AddSearchTags(GetWallpaperWebUISearchConcepts());
- else
- updater.AddSearchTags(GetWallpaperChromeAppSearchConcepts());
-
if (IsAmbientModeAllowed()) {
updater.AddSearchTags(GetAmbientModeSearchConcepts());
@@ -256,8 +230,6 @@ void PersonalizationSection::AddLoadTimeData(
IDS_SETTINGS_PHOTO_DISCARD_ACCESSIBLE_TEXT},
{"photoModeAccessibleText", IDS_SETTINGS_PHOTO_MODE_ACCESSIBLE_TEXT},
{"videoModeAccessibleText", IDS_SETTINGS_VIDEO_MODE_ACCESSIBLE_TEXT},
- // TODO(b/178399962) finalize error string for WallpaperWebUI.
- {"wallpaperCollectionsError", IDS_WALLPAPER_MANAGER_NETWORK_ERROR},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
@@ -277,9 +249,6 @@ void PersonalizationSection::AddLoadTimeData(
l10n_util::GetStringFUTF16(
IDS_OS_SETTINGS_AMBIENT_MODE_ALBUMS_SUBPAGE_GOOGLE_PHOTOS_NO_ALBUM,
base::UTF8ToUTF16(GetGooglePhotosURL().spec())));
-
- html_source->AddBoolean("isWallpaperWebUIEnabled",
- chromeos::features::IsWallpaperWebUIEnabled());
}
void PersonalizationSection::AddHandlers(content::WebUI* web_ui) {
@@ -330,12 +299,6 @@ void PersonalizationSection::RegisterHierarchy(
generator->RegisterNestedSetting(mojom::Setting::kChangeDeviceAccountImage,
mojom::Subpage::kChangePicture);
- // Wallpaper.
- generator->RegisterTopLevelSubpage(
- IDS_OS_SETTINGS_SET_WALLPAPER, mojom::Subpage::kWallpaper,
- mojom::SearchResultIcon::kWallpaper,
- mojom::SearchResultDefaultRank::kMedium, mojom::kWallpaperSubpagePath);
-
// Ambient mode.
generator->RegisterTopLevelSubpage(
IDS_OS_SETTINGS_AMBIENT_MODE_TITLE, mojom::Subpage::kAmbientMode,
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
index f6ae5f23922..10e938f32be 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
@@ -10,8 +10,8 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager_factory.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_manager.h"
+#include "chrome/browser/ash/plugin_vm/plugin_vm_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
index 6e42c805de8..fcb6da225cc 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
@@ -4,8 +4,6 @@
#include "chrome/browser/ui/webui/settings/chromeos/printing_section.h"
-#include "ash/constants/ash_features.h"
-#include "base/feature_list.h"
#include "base/no_destructor.h"
#include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
@@ -80,10 +78,6 @@ const std::vector<SearchConcept>& GetScanningAppSearchConcepts() {
return *tags;
}
-bool IsScanningAppEnabled() {
- return base::FeatureList::IsEnabled(chromeos::features::kScanningUI);
-}
-
} // namespace
PrintingSection::PrintingSection(Profile* profile,
@@ -94,9 +88,7 @@ PrintingSection::PrintingSection(Profile* profile,
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.AddSearchTags(GetPrintingSearchConcepts());
updater.AddSearchTags(GetPrintingManagementSearchConcepts());
-
- if (IsScanningAppEnabled())
- updater.AddSearchTags(GetScanningAppSearchConcepts());
+ updater.AddSearchTags(GetScanningAppSearchConcepts());
// Saved Printers search tags are added/removed dynamically.
if (printers_manager_) {
@@ -265,7 +257,6 @@ void PrintingSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
html_source->AddString(
"printingCUPSPrintPpdLearnMoreUrl",
GetHelpUrlWithBoard(chrome::kCupsPrintPPDLearnMoreURL));
- html_source->AddBoolean("scanningAppEnabled", IsScanningAppEnabled());
}
void PrintingSection::AddHandlers(content::WebUI* web_ui) {
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
index 671c8b66a3b..21f04bb91a2 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
@@ -66,7 +66,7 @@ void SearchHandler::BindInterface(
receivers_.Add(this, std::move(pending_receiver));
}
-void SearchHandler::Search(const base::string16& query,
+void SearchHandler::Search(const std::u16string& query,
uint32_t max_num_results,
mojom::ParentResultBehavior parent_result_behavior,
SearchCallback callback) {
@@ -260,7 +260,7 @@ mojom::SearchResultPtr SearchHandler::ResultToSearchResult(
std::string url;
mojom::SearchResultIdentifierPtr result_id;
- std::vector<base::string16> hierarchy_strings;
+ std::vector<std::u16string> hierarchy_strings;
switch (concept->type) {
case mojom::SearchResultType::kSection: {
mojom::Section section = concept->id.section;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
index 592fc768909..ef6666f14b8 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
@@ -51,7 +51,7 @@ class SearchHandler : public mojom::SearchHandler,
mojo::PendingReceiver<mojom::SearchHandler> pending_receiver);
// mojom::SearchHandler:
- void Search(const base::string16& query,
+ void Search(const std::u16string& query,
uint32_t max_num_results,
mojom::ParentResultBehavior parent_result_behavior,
SearchCallback callback) override;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
index 5d2bb644d0e..c298276df3b 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
@@ -74,10 +74,10 @@ const std::vector<SearchConcept>& GetPrintingSearchConcepts() {
// Creates a result with some default values.
mojom::SearchResultPtr CreateDummyResult() {
return mojom::SearchResult::New(
- /*result_text=*/base::string16(),
- /*canonical_result_text=*/base::string16(), /*url=*/"",
+ /*result_text=*/std::u16string(),
+ /*canonical_result_text=*/std::u16string(), /*url=*/"",
mojom::SearchResultIcon::kPrinter, /*relevance_score=*/0.5,
- /*hierarchy_strings=*/std::vector<base::string16>(),
+ /*hierarchy_strings=*/std::vector<std::u16string>(),
mojom::SearchResultDefaultRank::kMedium,
/*was_generated_from_text_match=*/false,
mojom::SearchResultType::kSection,
@@ -151,7 +151,7 @@ TEST_F(SearchHandlerTest, AddAndRemove) {
// 3 results should be available for a "Print" query.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Print"),
+ .Search(u"Print",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -159,7 +159,7 @@ TEST_F(SearchHandlerTest, AddAndRemove) {
// Limit results to 1 max and ensure that only 1 result is returned.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Print"),
+ .Search(u"Print",
/*max_num_results=*/1u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -167,7 +167,7 @@ TEST_F(SearchHandlerTest, AddAndRemove) {
// Search for a query which should return no results.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("QueryWithNoResults"),
+ .Search(u"QueryWithNoResults",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -177,7 +177,7 @@ TEST_F(SearchHandlerTest, AddAndRemove) {
// returned for "Printing".
RemoveSearchTags(GetPrintingSearchConcepts());
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Print"),
+ .Search(u"Print",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -190,7 +190,7 @@ TEST_F(SearchHandlerTest, UrlModification) {
AddSearchTags(GetPrintingSearchConcepts());
std::vector<mojom::SearchResultPtr> search_results;
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Saved"),
+ .Search(u"Saved",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -200,9 +200,8 @@ TEST_F(SearchHandlerTest, UrlModification) {
// The URL should have bee modified according to the FakeOsSettingSection
// scheme.
- EXPECT_EQ(
- std::string("Section::kPrinting::") + mojom::kPrintingDetailsSubpagePath,
- search_results[0]->url_path_with_parameters);
+ EXPECT_EQ(std::string("kPrinting::") + mojom::kPrintingDetailsSubpagePath,
+ search_results[0]->url_path_with_parameters);
}
TEST_F(SearchHandlerTest, AltTagMatch) {
@@ -214,7 +213,7 @@ TEST_F(SearchHandlerTest, AltTagMatch) {
// tag "CUPS" (referring to the Unix printing protocol), so we should receive
// one match.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("CUPS"),
+ .Search(u"CUPS",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kDoNotIncludeParentResults,
&search_results);
@@ -236,7 +235,7 @@ TEST_F(SearchHandlerTest, AllowParentResult) {
// Pass the kAllowParentResults flag, which should also cause its parent
// subpage item to be returned.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Saved"),
+ .Search(u"Saved",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kAllowParentResults,
&search_results);
@@ -253,7 +252,7 @@ TEST_F(SearchHandlerTest, DefaultRank) {
// contains the word "Printing", but the other results have the similar word
// "Printer". Thus, "Printing" has a higher relevance score.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Print"),
+ .Search(u"Print",
/*max_num_results=*/3u,
mojom::ParentResultBehavior::kAllowParentResults,
&search_results);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
index a1f17aafc7c..eb5b8964043 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
@@ -5,9 +5,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
#include "base/bind.h"
-#include "chrome/browser/chromeos/backdrop_wallpaper_handlers/backdrop_wallpaper.pb.h"
-#include "chrome/browser/chromeos/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h"
-#include "chrome/browser/ui/ash/wallpaper_controller_client.h"
+#include "chrome/browser/ui/ash/wallpaper_controller_client_impl.h"
#include "content/public/browser/web_ui.h"
namespace chromeos {
@@ -35,11 +33,6 @@ void WallpaperHandler::RegisterMessages() {
"isWallpaperPolicyControlled",
base::BindRepeating(&WallpaperHandler::HandleIsWallpaperPolicyControlled,
base::Unretained(this)));
-
- web_ui()->RegisterMessageCallback(
- "fetchWallpaperCollections",
- base::BindRepeating(&WallpaperHandler::HandleFetchWallpaperCollections,
- base::Unretained(this)));
}
void WallpaperHandler::HandleIsWallpaperSettingVisible(
@@ -47,49 +40,19 @@ void WallpaperHandler::HandleIsWallpaperSettingVisible(
CHECK_EQ(args->GetSize(), 1U);
ResolveCallback(
args->GetList()[0],
- WallpaperControllerClient::Get()->ShouldShowWallpaperSetting());
+ WallpaperControllerClientImpl::Get()->ShouldShowWallpaperSetting());
}
void WallpaperHandler::HandleIsWallpaperPolicyControlled(
const base::ListValue* args) {
CHECK_EQ(args->GetSize(), 1U);
- bool result = WallpaperControllerClient::Get()
+ bool result = WallpaperControllerClientImpl::Get()
->IsActiveUserWallpaperControlledByPolicy();
ResolveCallback(args->GetList()[0], result);
}
void WallpaperHandler::HandleOpenWallpaperManager(const base::ListValue* args) {
- WallpaperControllerClient::Get()->OpenWallpaperPickerIfAllowed();
-}
-
-void WallpaperHandler::HandleFetchWallpaperCollections(
- const base::ListValue* args) {
- CHECK_EQ(args->GetSize(), 1U);
- DCHECK(IsJavascriptAllowed()) << "Page should already be initialized";
- backdrop_api_weak_factory_.InvalidateWeakPtrs();
- collection_info_fetcher_.Start(
- base::BindOnce(&WallpaperHandler::OnFetchWallpaperCollections,
- backdrop_api_weak_factory_.GetWeakPtr(),
- args->GetList().front().Clone()));
-}
-
-void WallpaperHandler::OnFetchWallpaperCollections(
- const base::Value& callback_id,
- bool success,
- const std::vector<backdrop::Collection>& collections) {
- if (!success || collections.empty()) {
- RejectJavascriptCallback(callback_id, base::Value(base::Value::Type::NONE));
- return;
- }
-
- base::Value result(base::Value::Type::LIST);
- for (const auto& collection : collections) {
- base::Value item(base::Value::Type::DICTIONARY);
- item.SetKey("id", base::Value(collection.collection_id()));
- item.SetKey("name", base::Value(collection.collection_name()));
- result.Append(std::move(item));
- }
- ResolveJavascriptCallback(callback_id, result);
+ WallpaperControllerClientImpl::Get()->OpenWallpaperPickerIfAllowed();
}
void WallpaperHandler::ResolveCallback(const base::Value& callback_id,
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
index 645671d06a1..f6bd13d61de 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
@@ -6,14 +6,8 @@
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_WALLPAPER_HANDLER_H_
#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-namespace backdrop {
-class Collection;
-} // namespace backdrop
-
namespace base {
class ListValue;
} // namespace base
@@ -42,21 +36,9 @@ class WallpaperHandler : public ::settings::SettingsPageUIHandler {
// Open the wallpaper manager app.
void HandleOpenWallpaperManager(const base::ListValue* args);
- // Begin to fetch wallpaper collection info.
- void HandleFetchWallpaperCollections(const base::ListValue* args);
-
- void OnFetchWallpaperCollections(
- const base::Value& callback_id,
- bool success,
- const std::vector<backdrop::Collection>& collections);
-
// Helper function to resolve the Javascript callback.
void ResolveCallback(const base::Value& callback_id, bool result);
- backdrop_wallpaper_handlers::CollectionInfoFetcher collection_info_fetcher_;
-
- base::WeakPtrFactory<WallpaperHandler> backdrop_api_weak_factory_{this};
-
DISALLOW_COPY_AND_ASSIGN(WallpaperHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
index b4b0df20082..d724b704126 100644
--- a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
+++ b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
@@ -37,7 +37,7 @@ struct CustomHomePagesTableModel::Entry {
GURL url;
// Page title. If this is empty, we'll display the URL as the entry.
- base::string16 title;
+ std::u16string title;
// If not |base::CancelableTaskTracker::kBadTaskId|, indicates we're loading
// the title for the page.
@@ -189,15 +189,15 @@ int CustomHomePagesTableModel::RowCount() {
return static_cast<int>(entries_.size());
}
-base::string16 CustomHomePagesTableModel::GetText(int row, int column_id) {
+std::u16string CustomHomePagesTableModel::GetText(int row, int column_id) {
DCHECK(column_id == 0);
DCHECK(row >= 0 && row < RowCount());
return entries_[row].title.empty() ? FormattedURL(row) : entries_[row].title;
}
-base::string16 CustomHomePagesTableModel::GetTooltip(int row) {
+std::u16string CustomHomePagesTableModel::GetTooltip(int row) {
return entries_[row].title.empty()
- ? base::string16()
+ ? std::u16string()
: l10n_util::GetStringFUTF16(IDS_SETTINGS_ON_STARTUP_PAGE_TOOLTIP,
entries_[row].title,
FormattedURL(row));
@@ -288,8 +288,8 @@ void CustomHomePagesTableModel::OnGotTitle(const GURL& entry_url,
}
}
-base::string16 CustomHomePagesTableModel::FormattedURL(int row) const {
- base::string16 url = url_formatter::FormatUrl(entries_[row].url);
+std::u16string CustomHomePagesTableModel::FormattedURL(int row) const {
+ std::u16string url = url_formatter::FormatUrl(entries_[row].url);
url = base::i18n::GetDisplayStringInLTRDirectionality(url);
return url;
}
diff --git a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.h b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.h
index cbe342ab191..a4d0bf0393b 100644
--- a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.h
+++ b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.h
@@ -57,8 +57,8 @@ class CustomHomePagesTableModel : public ui::TableModel {
// TableModel overrides:
int RowCount() override;
- base::string16 GetText(int row, int column_id) override;
- base::string16 GetTooltip(int row) override;
+ std::u16string GetText(int row, int column_id) override;
+ std::u16string GetTooltip(int row) override;
void SetObserver(ui::TableModelObserver* observer) override;
private:
@@ -96,7 +96,7 @@ class CustomHomePagesTableModel : public ui::TableModel {
void RemoveWithoutNotification(int index);
// Returns the URL for a particular row, formatted for display to the user.
- base::string16 FormattedURL(int row) const;
+ std::u16string FormattedURL(int row) const;
// Set of entries we're showing.
std::vector<Entry> entries_;
diff --git a/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
index 80ea9d4632c..330647db6af 100644
--- a/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
@@ -65,9 +65,8 @@ class DownloadsHandlerTest : public testing::Test {
std::string event;
ASSERT_TRUE(data.arg1()->GetAsString(&event));
EXPECT_EQ("auto-open-downloads-changed", event);
- bool auto_open_downloads = false;
- ASSERT_TRUE(data.arg2()->GetAsBoolean(&auto_open_downloads));
- EXPECT_FALSE(auto_open_downloads);
+ ASSERT_TRUE(data.arg2()->is_bool());
+ EXPECT_FALSE(data.arg2()->GetBool());
}
Profile* profile() { return &profile_; }
diff --git a/chromium/chrome/browser/ui/webui/settings/font_handler.cc b/chromium/chrome/browser/ui/webui/settings/font_handler.cc
index 26ae033e95f..27fa6f75890 100644
--- a/chromium/chrome/browser/ui/webui/settings/font_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/font_handler.cc
@@ -64,7 +64,7 @@ void FontHandler::FontListHasLoaded(std::string callback_id,
bool has_font = list->GetList(i, &font);
DCHECK(has_font);
- base::string16 value;
+ std::u16string value;
bool has_value = font->GetString(1, &value);
DCHECK(has_value);
diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler.cc b/chromium/chrome/browser/ui/webui/settings/hats_handler.cc
index 74723f1b870..3c814af569f 100644
--- a/chromium/chrome/browser/ui/webui/settings/hats_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/hats_handler.cc
@@ -9,9 +9,45 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/hats/hats_service.h"
#include "chrome/browser/ui/hats/hats_service_factory.h"
+#include "chrome/common/chrome_features.h"
+#include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/content_settings/core/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
#include "content/public/browser/visibility.h"
#include "content/public/browser/web_contents.h"
+namespace {
+
+// Requests that the HaTS service for |profile|, if available, attempt to
+// launch the survey associated with |trigger| on |web_contents|. Where the
+// survey for |trigger| is configured to accept product specific data related to
+// the user's 3P cookie & privacy sandbox setting.
+void LaunchHatsSurveyWithProductSpecificData(Profile* profile,
+ content::WebContents* web_contents,
+ const std::string& trigger) {
+ HatsService* hats_service = HatsServiceFactory::GetForProfile(
+ profile, /* create_if_necessary = */ true);
+
+ // The HaTS service may not be available for the profile, for example if it
+ // is a guest profile.
+ if (!hats_service)
+ return;
+
+ const bool third_party_cookies_blocked =
+ static_cast<content_settings::CookieControlsMode>(
+ profile->GetPrefs()->GetInteger(prefs::kCookieControlsMode)) ==
+ content_settings::CookieControlsMode::kBlockThirdParty;
+ const bool privacy_sandbox_enabled =
+ profile->GetPrefs()->GetBoolean(prefs::kPrivacySandboxApisEnabled);
+ hats_service->LaunchDelayedSurveyForWebContents(
+ trigger, web_contents, 20000,
+ {{"3P cookies blocked", third_party_cookies_blocked},
+ {"Privacy Sandbox enabled", privacy_sandbox_enabled}});
+}
+
+} // namespace
+
namespace settings {
HatsHandler::HatsHandler() = default;
@@ -23,15 +59,33 @@ void HatsHandler::RegisterMessages() {
"tryShowHatsSurvey",
base::BindRepeating(&HatsHandler::HandleTryShowHatsSurvey,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "tryShowPrivacySandboxSurvey",
+ base::BindRepeating(&HatsHandler::HandleTryShowPrivacySandboxHatsSurvey,
+ base::Unretained(this)));
}
void HatsHandler::HandleTryShowHatsSurvey(const base::ListValue* args) {
- HatsService* hats_service = HatsServiceFactory::GetForProfile(
- Profile::FromWebUI(web_ui()), /* create_if_necessary = */ true);
- if (hats_service) {
- hats_service->LaunchDelayedSurveyForWebContents(
- kHatsSurveyTriggerSettingsPrivacy, web_ui()->GetWebContents(), 20000);
+ // If the privacy settings survey is explicitly targeting users who have not
+ // viewed the Privacy Sandbox page, and this user has viewed the page, do
+ // not attempt to show the privacy settings survey.
+ if (features::kHappinessTrackingSurveysForDesktopSettingsPrivacyNoSandbox
+ .Get() &&
+ Profile::FromWebUI(web_ui())->GetPrefs()->GetBoolean(
+ prefs::kPrivacySandboxPageViewed)) {
+ return;
}
+
+ LaunchHatsSurveyWithProductSpecificData(Profile::FromWebUI(web_ui()),
+ web_ui()->GetWebContents(),
+ kHatsSurveyTriggerSettingsPrivacy);
+}
+
+void HatsHandler::HandleTryShowPrivacySandboxHatsSurvey(
+ const base::ListValue* args) {
+ LaunchHatsSurveyWithProductSpecificData(Profile::FromWebUI(web_ui()),
+ web_ui()->GetWebContents(),
+ kHatsSurveyTriggerPrivacySandbox);
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler.h b/chromium/chrome/browser/ui/webui/settings/hats_handler.h
index f2e22b4a0c5..69197fccb77 100644
--- a/chromium/chrome/browser/ui/webui/settings/hats_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/hats_handler.h
@@ -25,6 +25,8 @@ class HatsHandler : public SettingsPageUIHandler {
void HandleTryShowHatsSurvey(const base::ListValue* args);
+ void HandleTryShowPrivacySandboxHatsSurvey(const base::ListValue* args);
+
private:
friend class HatsHandlerTest;
FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, HandleTryShowHatsSurvey);
diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
index dc459945792..c7e564190b1 100644
--- a/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
@@ -11,7 +11,12 @@
#include "chrome/browser/ui/hats/hats_service.h"
#include "chrome/browser/ui/hats/hats_service_factory.h"
#include "chrome/browser/ui/hats/mock_hats_service.h"
+#include "chrome/common/chrome_features.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/content_settings/core/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -48,18 +53,64 @@ class HatsHandlerTest : public ChromeRenderViewHostTestHarness {
HatsHandler* handler() { return handler_.get(); }
MockHatsService* mock_hats_service_;
+ protected:
+ base::test::ScopedFeatureList scoped_feature_list_;
+
private:
std::unique_ptr<content::TestWebUI> web_ui_;
std::unique_ptr<HatsHandler> handler_;
};
TEST_F(HatsHandlerTest, HandleTryShowHatsSurvey) {
- EXPECT_CALL(*mock_hats_service_,
- LaunchDelayedSurveyForWebContents(
- kHatsSurveyTriggerSettingsPrivacy, web_contents(), 20000));
+ profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxApisEnabled, false);
+ profile()->GetPrefs()->SetInteger(
+ prefs::kCookieControlsMode,
+ static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty));
+ std::map<std::string, bool> expected_product_specific_data = {
+ {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}};
+
+ EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(
+ kHatsSurveyTriggerSettingsPrivacy,
+ web_contents(), 20000, expected_product_specific_data));
base::ListValue args;
handler()->HandleTryShowHatsSurvey(&args);
task_environment()->RunUntilIdle();
+
+ testing::Mock::VerifyAndClearExpectations(mock_hats_service_);
+
+ // Enable targeting for users who have not seen the Privacy Sandbox page and
+ // ensure the handler does not attempt to launch the survey.
+ EXPECT_CALL(*mock_hats_service_,
+ LaunchDelayedSurveyForWebContents(testing::_, testing::_,
+ testing::_, testing::_))
+ .Times(0);
+
+ base::test::ScopedFeatureList::FeatureAndParams feature_and_params{
+ features::kHappinessTrackingSurveysForDesktopSettingsPrivacy,
+ {{"no-sandbox", "true"}}};
+ scoped_feature_list_.InitWithFeaturesAndParameters({feature_and_params}, {});
+
+ profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxPageViewed, true);
+
+ handler()->HandleTryShowHatsSurvey(&args);
+ task_environment()->RunUntilIdle();
+}
+
+TEST_F(HatsHandlerTest, HandleTryShowPrivacySandboxHatsSurvey) {
+ // Check that the handler correctly forwards the survey request to the
+ // HaTS service and also includes the appropriate product specific data.
+ profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxApisEnabled, false);
+ profile()->GetPrefs()->SetInteger(
+ prefs::kCookieControlsMode,
+ static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty));
+ std::map<std::string, bool> expected_product_specific_data = {
+ {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}};
+ EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(
+ kHatsSurveyTriggerPrivacySandbox,
+ web_contents(), 20000, expected_product_specific_data));
+ base::ListValue args;
+ handler()->HandleTryShowPrivacySandboxHatsSurvey(&args);
+ task_environment()->RunUntilIdle();
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc b/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc
index 5eca85a0c62..7d2161fdf5e 100644
--- a/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc
@@ -12,7 +12,6 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -178,7 +177,7 @@ void ImportDataHandler::HandleImportFromBookmarksFile(
chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
select_file_dialog_->SelectFile(
- ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(),
+ ui::SelectFileDialog::SELECT_OPEN_FILE, std::u16string(),
base::FilePath(), &file_type_info, 0, base::FilePath::StringType(),
browser->window()->GetNativeWindow(), nullptr);
}
diff --git a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
index 46b3d283ad4..6772fa07b0a 100644
--- a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
+++ b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
@@ -100,7 +100,7 @@ void IncompatibleApplicationsHandler::HandleRequestIncompatibleApplicationsList(
// Also add the application to the list that is passed to the javascript.
base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetKey("name", base::Value(application.info.name));
+ dict.SetKey("name", base::Value(base::WideToUTF8(application.info.name)));
dict.SetKey("type",
base::Value(application.blocklist_action->message_type()));
dict.SetKey("url",
@@ -123,7 +123,7 @@ void IncompatibleApplicationsHandler::HandleStartApplicationUninstallation(
// Open the Apps & Settings page with the application name highlighted.
uninstall_application::LaunchUninstallFlow(
- base::UTF8ToUTF16(args->GetList()[0].GetString()));
+ base::UTF8ToWide(args->GetList()[0].GetString()));
}
void IncompatibleApplicationsHandler::HandleGetSubtitlePluralString(
@@ -165,7 +165,7 @@ void IncompatibleApplicationsHandler::OnApplicationRemoved(
registry_key_watchers_.erase(application);
FireWebUIListener("incompatible-application-removed",
- base::Value(application.name));
+ base::Value(base::WideToUTF8(application.name)));
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
index f28bfd2e3b4..cce93cf6169 100644
--- a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
@@ -15,8 +15,8 @@
#include "content/public/browser/web_ui.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/base/locale_util.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/base/locale_util.h"
#include "chrome/browser/profiles/profile.h"
#include "components/user_manager/user_manager.h"
#include "components/user_manager/user_type.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
index 6aebbaeefd4..51518ded9bc 100644
--- a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
@@ -2,9 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "build/branding_buildflags.h"
#include "build/chromeos_buildflags.h"
-#if defined(GOOGLE_CHROME_BUILD) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ui/webui/settings/metrics_reporting_handler.h"
@@ -150,4 +151,4 @@ void MetricsReportingHandler::SendMetricsReportingChange() {
} // namespace settings
-#endif // defined(GOOGLE_CHROME_BUILD) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.h b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
index 420eac58251..d7bb54f00c0 100644
--- a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
@@ -5,9 +5,10 @@
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_METRICS_REPORTING_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_METRICS_REPORTING_HANDLER_H_
+#include "build/branding_buildflags.h"
#include "build/chromeos_buildflags.h"
-#if defined(GOOGLE_CHROME_BUILD) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
#include <memory>
@@ -80,6 +81,6 @@ class MetricsReportingHandler : public SettingsPageUIHandler {
} // namespace settings
-#endif // defined(GOOGLE_CHROME_BUILD) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS_ASH)
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_METRICS_REPORTING_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
index d8346169635..ca3fb4508b6 100644
--- a/chromium/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
@@ -11,7 +11,7 @@
#include "base/values.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "components/user_manager/scoped_user_manager.h"
#endif
#include "build/chromeos_buildflags.h"
@@ -48,8 +48,7 @@ class OnStartupHandlerTest : public testing::Test {
ASSERT_TRUE(profile_manager_.SetUp());
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::FakeChromeUserManager* fake_user_manager =
- new chromeos::FakeChromeUserManager;
+ auto* fake_user_manager = new ash::FakeChromeUserManager;
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(fake_user_manager));
constexpr char kFakeEmail[] = "fake_id@gmail.com";
diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.cc b/chromium/chrome/browser/ui/webui/settings/people_handler.cc
index eb6cf74a3c1..312b78877ac 100644
--- a/chromium/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/people_handler.cc
@@ -180,7 +180,7 @@ base::Value GetAccountValue(const AccountInfo& account) {
return dictionary;
}
-base::string16 GetEnterPassphraseBody(syncer::PassphraseType passphrase_type,
+std::u16string GetEnterPassphraseBody(syncer::PassphraseType passphrase_type,
base::Time passphrase_time) {
DCHECK(syncer::IsExplicitPassphrase(passphrase_type));
switch (passphrase_type) {
@@ -204,10 +204,10 @@ base::string16 GetEnterPassphraseBody(syncer::PassphraseType passphrase_type,
break;
}
NOTREACHED();
- return base::string16();
+ return std::u16string();
}
-base::string16 GetFullEncryptionBody(syncer::PassphraseType passphrase_type,
+std::u16string GetFullEncryptionBody(syncer::PassphraseType passphrase_type,
base::Time passphrase_time) {
DCHECK(syncer::IsExplicitPassphrase(passphrase_type));
if (passphrase_time.is_null()) {
@@ -226,7 +226,7 @@ base::string16 GetFullEncryptionBody(syncer::PassphraseType passphrase_type,
break;
}
NOTREACHED();
- return base::string16();
+ return std::u16string();
}
} // namespace
@@ -378,7 +378,7 @@ void PeopleHandler::DisplayGaiaLoginInNewTabOrWindow(
// then sign in again.
identity_manager->GetPrimaryAccountMutator()->RevokeSyncConsent(
signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS,
- signin_metrics::SignoutDelete::IGNORE_METRIC);
+ signin_metrics::SignoutDelete::kIgnoreMetric);
}
// If the identity manager already has a primary account, this is a
@@ -491,7 +491,7 @@ base::Value PeopleHandler::GetStoredAccountsList() {
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
base::Optional<AccountInfo> primary_account_info =
identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
- identity_manager->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+ identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin));
if (primary_account_info.has_value())
accounts.Append(GetAccountValue(primary_account_info.value()));
return accounts;
@@ -641,7 +641,7 @@ void PeopleHandler::HandleTurnOffSync(const base::ListValue* args) {
identity_manager->GetPrimaryAccountMutator()->RevokeSyncConsent(
signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS,
- signin_metrics::SignoutDelete::IGNORE_METRIC);
+ signin_metrics::SignoutDelete::kIgnoreMetric);
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -677,8 +677,8 @@ void PeopleHandler::HandleSignout(const base::ListValue* args) {
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
signin_metrics::SignoutDelete delete_metric =
- delete_profile ? signin_metrics::SignoutDelete::DELETED
- : signin_metrics::SignoutDelete::KEEPING;
+ delete_profile ? signin_metrics::SignoutDelete::kDeleted
+ : signin_metrics::SignoutDelete::kKeeping;
// Only revoke the sync consent.
// * If the primary account is still valid, then it will be removed by
@@ -776,7 +776,7 @@ void PeopleHandler::CloseSyncSetup() {
->GetPrimaryAccountMutator()
->RevokeSyncConsent(
signin_metrics::ABORT_SIGNIN,
- signin_metrics::SignoutDelete::IGNORE_METRIC);
+ signin_metrics::SignoutDelete::kIgnoreMetric);
}
#endif
}
diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index 10dcebabbce..fd32782c108 100644
--- a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -292,9 +292,8 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness {
std::string callback_id;
ASSERT_TRUE(data.arg1()->GetAsString(&callback_id));
EXPECT_EQ(kTestCallbackId, callback_id);
- bool success = false;
- ASSERT_TRUE(data.arg2()->GetAsBoolean(&success));
- EXPECT_TRUE(success);
+ ASSERT_TRUE(data.arg2()->is_bool());
+ EXPECT_TRUE(data.arg2()->GetBool());
std::string status;
ASSERT_TRUE(data.arg3()->GetAsString(&status));
EXPECT_EQ(expected_status, status);
diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc
index 8a695265d04..747b4651bb5 100644
--- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc
@@ -88,7 +88,7 @@ void ProfileInfoHandler::OnUserImageChanged(const user_manager::User& user) {
void ProfileInfoHandler::OnProfileNameChanged(
const base::FilePath& /* profile_path */,
- const base::string16& /* old_profile_name */) {
+ const std::u16string& /* old_profile_name */) {
PushProfileInfo();
}
diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h
index cd5be0f13e1..59a7d6c85f9 100644
--- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h
@@ -50,7 +50,7 @@ class ProfileInfoHandler : public SettingsPageUIHandler,
// ProfileAttributesStorage::Observer implementation.
void OnProfileNameChanged(const base::FilePath& profile_path,
- const base::string16& old_profile_name) override;
+ const std::u16string& old_profile_name) override;
void OnProfileAvatarChanged(const base::FilePath& profile_path) override;
private:
diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
index 76feb8d9130..e7ff776badb 100644
--- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
@@ -24,7 +24,7 @@
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "components/user_manager/scoped_user_manager.h"
#endif
@@ -57,8 +57,7 @@ class ProfileInfoHandlerTest : public testing::Test {
ASSERT_TRUE(profile_manager_.SetUp());
#if BUILDFLAG(IS_CHROMEOS_ASH)
- chromeos::FakeChromeUserManager* fake_user_manager =
- new chromeos::FakeChromeUserManager;
+ auto* fake_user_manager = new ash::FakeChromeUserManager;
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(fake_user_manager));
profile_ = profile_manager_.CreateTestingProfile(fake_email);
@@ -128,9 +127,8 @@ TEST_F(ProfileInfoHandlerTest, GetProfileInfo) {
ASSERT_TRUE(data.arg1()->GetAsString(&callback_id));
EXPECT_EQ("get-profile-info-callback-id", callback_id);
- bool success = false;
- ASSERT_TRUE(data.arg2()->GetAsBoolean(&success));
- EXPECT_TRUE(success);
+ ASSERT_TRUE(data.arg2()->is_bool());
+ EXPECT_TRUE(data.arg2()->GetBool());
VerifyProfileInfo(data.arg3());
}
diff --git a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
index b453a5ebf1f..8c0eea5add4 100644
--- a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -172,8 +172,8 @@ void ProtocolHandlersHandler::HandleSetDefault(const base::ListValue* args) {
ProtocolHandler ProtocolHandlersHandler::ParseHandlerFromArgs(
const base::ListValue* args) const {
- base::string16 protocol;
- base::string16 url;
+ std::u16string protocol;
+ std::u16string url;
bool ok = args->GetString(0, &protocol) && args->GetString(1, &url);
if (!ok)
return ProtocolHandler::EmptyProtocolHandler();
diff --git a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index 7f63fe98b0e..53b8ae1f551 100644
--- a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -4,13 +4,13 @@
#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
+#include <string>
#include <utility>
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
-#include "base/strings/string16.h"
#include "base/time/time.h"
#include "base/values.h"
#include "build/build_config.h"
@@ -276,7 +276,7 @@ void ResetSettingsHandler::HandleGetTriggeredResetToolName(
// Set up the localized strings for the triggered profile reset dialog.
// Custom reset tool names are supported on Windows only.
- base::string16 reset_tool_name;
+ std::u16string reset_tool_name;
#if defined(OS_WIN)
Profile* profile = Profile::FromWebUI(web_ui());
TriggeredProfileResetter* triggered_profile_resetter =
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
index 3c08e46999f..2d38cfbf440 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
@@ -4,6 +4,9 @@
#include "chrome/browser/ui/webui/settings/safety_check_handler.h"
+#include <memory>
+#include <string>
+
#include "base/bind.h"
#include "base/feature_list.h"
#include "base/i18n/number_formatting.h"
@@ -11,7 +14,6 @@
#include "base/metrics/histogram_functions.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
@@ -278,7 +280,7 @@ void SafetyCheckHandler::SendSafetyCheckStartedWebUiUpdates() {
void SafetyCheckHandler::PerformSafetyCheck() {
// Checks common to desktop, Android, and iOS are handled by
// safety_check::SafetyCheck.
- safety_check_.reset(new safety_check::SafetyCheck(this));
+ safety_check_ = std::make_unique<safety_check::SafetyCheck>(this);
safety_check_->CheckSafeBrowsing(Profile::FromWebUI(web_ui())->GetPrefs());
if (!version_updater_) {
@@ -286,10 +288,10 @@ void SafetyCheckHandler::PerformSafetyCheck() {
}
DCHECK(version_updater_);
if (!update_helper_) {
- update_helper_.reset(new safety_check::UpdateCheckHelper(
+ update_helper_ = std::make_unique<safety_check::UpdateCheckHelper>(
content::BrowserContext::GetDefaultStoragePartition(
Profile::FromWebUI(web_ui()))
- ->GetURLLoaderFactoryForBrowserProcess()));
+ ->GetURLLoaderFactoryForBrowserProcess());
}
DCHECK(update_helper_);
CheckUpdates();
@@ -552,7 +554,7 @@ void SafetyCheckHandler::OnChromeCleanerCheckResult(
}
#endif
-base::string16 SafetyCheckHandler::GetStringForParent(ParentStatus status) {
+std::u16string SafetyCheckHandler::GetStringForParent(ParentStatus status) {
switch (status) {
case ParentStatus::kBefore:
return l10n_util::GetStringUTF16(
@@ -565,10 +567,10 @@ base::string16 SafetyCheckHandler::GetStringForParent(ParentStatus status) {
}
}
-base::string16 SafetyCheckHandler::GetStringForUpdates(UpdateStatus status) {
+std::u16string SafetyCheckHandler::GetStringForUpdates(UpdateStatus status) {
switch (status) {
case UpdateStatus::kChecking:
- return base::UTF8ToUTF16("");
+ return u"";
case UpdateStatus::kUpdated:
#if BUILDFLAG(IS_CHROMEOS_ASH)
return ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE);
@@ -598,20 +600,21 @@ base::string16 SafetyCheckHandler::GetStringForUpdates(UpdateStatus status) {
l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
? IDS_VERSION_UI_OFFICIAL
: IDS_VERSION_UI_UNOFFICIAL),
- base::UTF8ToUTF16(chrome::GetChannelName()),
+ base::UTF8ToUTF16(
+ chrome::GetChannelName(chrome::WithExtendedStable(true))),
l10n_util::GetStringUTF16(VersionUI::VersionProcessorVariation()));
// This state is only used on Android for recording metrics. This codepath
// is unreachable.
case UpdateStatus::kOutdated:
- return base::UTF8ToUTF16("");
+ return u"";
}
}
-base::string16 SafetyCheckHandler::GetStringForSafeBrowsing(
+std::u16string SafetyCheckHandler::GetStringForSafeBrowsing(
SafeBrowsingStatus status) {
switch (status) {
case SafeBrowsingStatus::kChecking:
- return base::UTF8ToUTF16("");
+ return u"";
case SafeBrowsingStatus::kEnabled:
case SafeBrowsingStatus::kEnabledStandard:
return l10n_util::GetStringUTF16(
@@ -635,7 +638,7 @@ base::string16 SafetyCheckHandler::GetStringForSafeBrowsing(
}
}
-base::string16 SafetyCheckHandler::GetStringForPasswords(
+std::u16string SafetyCheckHandler::GetStringForPasswords(
PasswordsStatus status,
Compromised compromised,
Weak weak,
@@ -645,7 +648,7 @@ base::string16 SafetyCheckHandler::GetStringForPasswords(
case PasswordsStatus::kChecking: {
// Unable to get progress for some reason.
if (total.value() == 0) {
- return base::UTF8ToUTF16("");
+ return u"";
}
return l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_PROGRESS,
base::FormatNumber(done.value()),
@@ -700,14 +703,14 @@ base::string16 SafetyCheckHandler::GetStringForPasswords(
}
}
-base::string16 SafetyCheckHandler::GetStringForExtensions(
+std::u16string SafetyCheckHandler::GetStringForExtensions(
ExtensionsStatus status,
Blocklisted blocklisted,
ReenabledUser reenabled_user,
ReenabledAdmin reenabled_admin) {
switch (status) {
case ExtensionsStatus::kChecking:
- return base::UTF8ToUTF16("");
+ return u"";
case ExtensionsStatus::kError:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_EXTENSIONS_ERROR);
@@ -739,14 +742,14 @@ base::string16 SafetyCheckHandler::GetStringForExtensions(
}
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
-base::string16 SafetyCheckHandler::GetStringForChromeCleaner(
+std::u16string SafetyCheckHandler::GetStringForChromeCleaner(
ChromeCleanerStatus status,
base::Time cct_completion_time,
base::Time system_time) {
switch (status) {
case ChromeCleanerStatus::kHidden:
case ChromeCleanerStatus::kChecking:
- return base::UTF8ToUTF16("");
+ return u"";
case ChromeCleanerStatus::kInfected:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED);
@@ -776,7 +779,7 @@ base::string16 SafetyCheckHandler::GetStringForChromeCleaner(
}
#endif
-base::string16 SafetyCheckHandler::GetStringForTimePassed(
+std::u16string SafetyCheckHandler::GetStringForTimePassed(
base::Time completion_timestamp,
base::Time system_time,
int less_than_one_minute_ago_message_id,
@@ -827,7 +830,7 @@ base::string16 SafetyCheckHandler::GetStringForTimePassed(
}
}
-base::string16 SafetyCheckHandler::GetStringForParentRan(
+std::u16string SafetyCheckHandler::GetStringForParentRan(
base::Time safety_check_completion_time,
base::Time system_time) {
return SafetyCheckHandler::GetStringForTimePassed(
@@ -839,14 +842,14 @@ base::string16 SafetyCheckHandler::GetStringForParentRan(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER_DAYS);
}
-base::string16 SafetyCheckHandler::GetStringForParentRan(
+std::u16string SafetyCheckHandler::GetStringForParentRan(
base::Time safety_check_completion_time) {
return SafetyCheckHandler::GetStringForParentRan(safety_check_completion_time,
base::Time::Now());
}
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
-base::string16 SafetyCheckHandler::GetStringForChromeCleanerRan(
+std::u16string SafetyCheckHandler::GetStringForChromeCleanerRan(
base::Time cct_completion_time,
base::Time system_time) {
if (cct_completion_time.is_null()) {
@@ -912,7 +915,7 @@ void SafetyCheckHandler::OnVersionUpdaterResult(VersionUpdater::Status status,
bool powerwash,
const std::string& version,
int64_t update_size,
- const base::string16& message) {
+ const std::u16string& message) {
if (status == VersionUpdater::FAILED) {
update_helper_->CheckConnectivity(
base::BindOnce(&SafetyCheckHandler::DetermineIfOfflineOrError,
@@ -1111,7 +1114,7 @@ void SafetyCheckHandler::CompleteParentIfChildrenCompleted() {
void SafetyCheckHandler::FireBasicSafetyCheckWebUiListener(
const std::string& event_name,
int new_state,
- const base::string16& display_string) {
+ const std::u16string& display_string) {
base::DictionaryValue event;
event.SetIntKey(kNewState, new_state);
event.SetStringKey(kDisplayString, display_string);
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
index 774f6eb199c..63f90a9f297 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
@@ -119,7 +119,7 @@ class SafetyCheckHandler
// Constructs a string depicting how much time passed since the completion of
// something from the corresponding timestamps and strings IDs.
- base::string16 GetStringForTimePassed(base::Time completion_timestamp,
+ std::u16string GetStringForTimePassed(base::Time completion_timestamp,
base::Time system_time,
int less_than_one_minute_ago_message_id,
int minutes_ago_message_id,
@@ -129,15 +129,15 @@ class SafetyCheckHandler
// Constructs the 'safety check ran' display string by how long ago safety
// check ran.
- base::string16 GetStringForParentRan(base::Time safety_check_completion_time);
- base::string16 GetStringForParentRan(base::Time safety_check_completion_time,
+ std::u16string GetStringForParentRan(base::Time safety_check_completion_time);
+ std::u16string GetStringForParentRan(base::Time safety_check_completion_time,
base::Time system_time);
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Constructs the string for the Chrome cleaner 'safe' state which depicts
// how long ago its last check ran.
- base::string16 GetStringForChromeCleanerRan();
- base::string16 GetStringForChromeCleanerRan(base::Time cct_completion_time,
+ std::u16string GetStringForChromeCleanerRan();
+ std::u16string GetStringForChromeCleanerRan(base::Time cct_completion_time,
base::Time system_time);
// safe_browsing::ChromeCleanerController::Observer overrides.
@@ -228,20 +228,20 @@ class SafetyCheckHandler
// Methods for building user-visible strings based on the safety check
// state.
- base::string16 GetStringForParent(ParentStatus status);
- base::string16 GetStringForUpdates(UpdateStatus status);
- base::string16 GetStringForSafeBrowsing(SafeBrowsingStatus status);
- base::string16 GetStringForPasswords(PasswordsStatus status,
+ std::u16string GetStringForParent(ParentStatus status);
+ std::u16string GetStringForUpdates(UpdateStatus status);
+ std::u16string GetStringForSafeBrowsing(SafeBrowsingStatus status);
+ std::u16string GetStringForPasswords(PasswordsStatus status,
Compromised compromised,
Weak weak,
Done done,
Total total);
- base::string16 GetStringForExtensions(ExtensionsStatus status,
+ std::u16string GetStringForExtensions(ExtensionsStatus status,
Blocklisted blocklisted,
ReenabledUser reenabled_user,
ReenabledAdmin reenabled_admin);
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
- base::string16 GetStringForChromeCleaner(ChromeCleanerStatus status,
+ std::u16string GetStringForChromeCleaner(ChromeCleanerStatus status,
base::Time cct_completion_time,
base::Time system_time);
#endif
@@ -271,7 +271,7 @@ class SafetyCheckHandler
bool powerwash,
const std::string& version,
int64_t update_size,
- const base::string16& message);
+ const std::u16string& message);
// SafetyCheck::SafetyCheckHandlerInterface implementation.
void OnSafeBrowsingCheckResult(SafeBrowsingStatus status) override;
@@ -300,7 +300,7 @@ class SafetyCheckHandler
// Fire a safety check element WebUI update with a state and string.
void FireBasicSafetyCheckWebUiListener(const std::string& event_name,
int new_state,
- const base::string16& display_string);
+ const std::u16string& display_string);
// The current status of the safety check elements. Before safety
// check is started, the parent is in the 'before' state.
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
index 34991ccfa08..38e1563742f 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -10,7 +10,6 @@
#include "base/bind.h"
#include "base/optional.h"
#include "base/strings/strcat.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -171,12 +170,12 @@ class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate {
// Credentials have to be unique, so the callback is always invoked.
form.username_value = base::ASCIIToUTF16(
"test" + base::NumberToString(test_credential_counter_++));
- form.password_value = base::ASCIIToUTF16("password");
- form.username_element = base::ASCIIToUTF16("username_element");
+ form.password_value = u"password";
+ form.username_element = u"username_element";
store_->AddLogin(form);
base::RunLoop().RunUntilIdle();
- store_->AddInsecureCredential(password_manager::CompromisedCredentials(
+ store_->AddInsecureCredential(password_manager::InsecureCredential(
form.signon_realm, form.username_value, base::Time(),
password_manager::InsecureType::kLeaked,
password_manager::IsMuted(false)));
@@ -295,14 +294,14 @@ class SafetyCheckHandlerTest : public testing::Test {
std::string GenerateExtensionId(char char_to_repeat);
void VerifyDisplayString(const base::DictionaryValue* event,
- const base::string16& expected);
+ const std::u16string& expected);
void VerifyDisplayString(const base::DictionaryValue* event,
const std::string& expected);
// Replaces any instances of browser name (e.g. Google Chrome, Chromium,
// etc) with "browser" to make sure tests work both on Chromium and
// Google Chrome.
- void ReplaceBrowserName(base::string16* s);
+ void ReplaceBrowserName(std::u16string* s);
protected:
content::BrowserTaskEnvironment browser_task_environment_;
@@ -397,14 +396,14 @@ std::string SafetyCheckHandlerTest::GenerateExtensionId(char char_to_repeat) {
void SafetyCheckHandlerTest::VerifyDisplayString(
const base::DictionaryValue* event,
- const base::string16& expected) {
- base::string16 display;
+ const std::u16string& expected) {
+ std::u16string display;
ASSERT_TRUE(event->GetString("displayString", &display));
ReplaceBrowserName(&display);
// Need to also replace any instances of Chrome and Chromium in the
// expected string due to an edge case on ChromeOS, where a device name
// is "Chrome", which gets replaced in the display string.
- base::string16 expected_replaced = expected;
+ std::u16string expected_replaced = expected;
ReplaceBrowserName(&expected_replaced);
EXPECT_EQ(expected_replaced, display);
}
@@ -415,13 +414,10 @@ void SafetyCheckHandlerTest::VerifyDisplayString(
VerifyDisplayString(event, base::ASCIIToUTF16(expected));
}
-void SafetyCheckHandlerTest::ReplaceBrowserName(base::string16* s) {
- base::ReplaceSubstringsAfterOffset(s, 0, base::ASCIIToUTF16("Google Chrome"),
- base::ASCIIToUTF16("Browser"));
- base::ReplaceSubstringsAfterOffset(s, 0, base::ASCIIToUTF16("Chrome"),
- base::ASCIIToUTF16("Browser"));
- base::ReplaceSubstringsAfterOffset(s, 0, base::ASCIIToUTF16("Chromium"),
- base::ASCIIToUTF16("Browser"));
+void SafetyCheckHandlerTest::ReplaceBrowserName(std::u16string* s) {
+ base::ReplaceSubstringsAfterOffset(s, 0, u"Google Chrome", u"Browser");
+ base::ReplaceSubstringsAfterOffset(s, 0, u"Chrome", u"Browser");
+ base::ReplaceSubstringsAfterOffset(s, 0, u"Chromium", u"Browser");
}
TEST_F(SafetyCheckHandlerTest, CheckUpdates_Checking) {
@@ -432,7 +428,7 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Checking) {
kUpdates,
static_cast<int>(SafetyCheckHandler::UpdateStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event, u"");
// Checking state should not get recorded.
histogram_tester_.ExpectTotalCount("Settings.SafetyCheck.UpdatesResult", 0);
}
@@ -446,9 +442,8 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Updated) {
static_cast<int>(SafetyCheckHandler::UpdateStatus::kUpdated));
ASSERT_TRUE(event);
#if BUILDFLAG(IS_CHROMEOS_ASH)
- base::string16 expected = base::ASCIIToUTF16("Your ") +
- ui::GetChromeOSDeviceName() +
- base::ASCIIToUTF16(" is up to date");
+ std::u16string expected =
+ u"Your " + ui::GetChromeOSDeviceName() + u" is up to date";
VerifyDisplayString(event, expected);
#else
VerifyDisplayString(event, "Browser is up to date");
@@ -532,7 +527,9 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Disabled) {
event, "Version " + version_info::GetVersionNumber() + " (" +
(version_info::IsOfficialBuild() ? "Official Build"
: "Developer Build") +
- ") " + chrome::GetChannelName() + processor_variation);
+ ") " +
+ chrome::GetChannelName(chrome::WithExtendedStable(true)) +
+ processor_variation);
histogram_tester_.ExpectBucketCount(
"Settings.SafetyCheck.UpdatesResult",
SafetyCheckHandler::UpdateStatus::kUnknown, 1);
@@ -772,7 +769,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_ObserverRemovedAfterError) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event, u"");
histogram_tester_.ExpectTotalCount("Settings.SafetyCheck.PasswordsResult", 0);
// Second, an "offline" state.
test_leak_service_->set_state_and_notify(
@@ -812,7 +809,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_InterruptedAndRefreshed) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event, u"");
// The check gets interrupted and the page is refreshed.
safety_check_->DisallowJavascript();
safety_check_->AllowJavascript();
@@ -926,9 +923,8 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_StaleSafeThenCompromised) {
// Not a "safe" state, so send an |OnCredentialDone| with is_leaked=true.
static_cast<password_manager::BulkLeakCheckService::Observer*>(
safety_check_.get())
- ->OnCredentialDone(
- {base::ASCIIToUTF16("login"), base::ASCIIToUTF16("password")},
- password_manager::IsLeaked(true));
+ ->OnCredentialDone({u"login", u"password"},
+ password_manager::IsLeaked(true));
// The service goes idle, but the disk still has a stale "safe" state.
test_leak_service_->set_state_and_notify(
password_manager::BulkLeakCheckService::State::kIdle);
@@ -1195,8 +1191,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_NoPasswords) {
}
TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) {
- auto credential = password_manager::LeakCheckCredential(
- base::UTF8ToUTF16("test"), base::UTF8ToUTF16("test"));
+ auto credential = password_manager::LeakCheckCredential(u"test", u"test");
auto is_leaked = password_manager::IsLeaked(false);
safety_check_->PerformSafetyCheck();
test_passwords_delegate_.SetPasswordCheckState(
@@ -1210,7 +1205,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
EXPECT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16("Checking passwords (1 of 3)…"));
+ VerifyDisplayString(event, u"Checking passwords (1 of 3)…");
test_passwords_delegate_.SetProgress(2, 3);
static_cast<password_manager::BulkLeakCheckService::Observer*>(
@@ -1221,8 +1216,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
EXPECT_TRUE(event2);
- VerifyDisplayString(event2,
- base::UTF8ToUTF16("Checking passwords (2 of 3)…"));
+ VerifyDisplayString(event2, u"Checking passwords (2 of 3)…");
// Final update comes after status change, so no new progress message should
// be present.
@@ -1238,8 +1232,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) {
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
EXPECT_TRUE(event3);
// Still 2/3 event.
- VerifyDisplayString(event3,
- base::UTF8ToUTF16("Checking passwords (2 of 3)…"));
+ VerifyDisplayString(event3, u"Checking passwords (2 of 3)…");
}
TEST_F(SafetyCheckHandlerTest, CheckExtensions_NoExtensions) {
@@ -1431,7 +1424,7 @@ class SafetyCheckHandlerChromeCleanerIdleTest
public testing::WithParamInterface<
std::tuple<safe_browsing::ChromeCleanerController::IdleReason,
SafetyCheckHandler::ChromeCleanerStatus,
- base::string16>> {
+ std::u16string>> {
protected:
void SetUp() override {
SafetyCheckHandlerTest::SetUp();
@@ -1442,7 +1435,7 @@ class SafetyCheckHandlerChromeCleanerIdleTest
safe_browsing::ChromeCleanerController::IdleReason idle_reason_;
SafetyCheckHandler::ChromeCleanerStatus expected_cct_status_;
- base::string16 expected_display_string_;
+ std::u16string expected_display_string_;
};
TEST_P(SafetyCheckHandlerChromeCleanerIdleTest, CheckChromeCleanerIdleStates) {
@@ -1495,7 +1488,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kReporterFailed,
SafetyCheckHandler::ChromeCleanerStatus::kError,
- base::UTF8ToUTF16("Something went wrong. Click for more details."))));
+ u"Something went wrong. Click for more details.")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_ScanningFoundNothing,
@@ -1513,7 +1506,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kScanningFailed,
SafetyCheckHandler::ChromeCleanerStatus::kError,
- base::UTF8ToUTF16("Something went wrong. Click for more details."))));
+ u"Something went wrong. Click for more details.")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_ConnectionLost,
@@ -1521,16 +1514,16 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kConnectionLost,
SafetyCheckHandler::ChromeCleanerStatus::kInfected,
- base::UTF8ToUTF16("Browser found harmful software on your computer"))));
+ u"Browser found harmful software on your computer")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_UserDeclinedCleanup,
SafetyCheckHandlerChromeCleanerIdleTest,
- ::testing::Values(std::make_tuple(
- safe_browsing::ChromeCleanerController::IdleReason::
- kUserDeclinedCleanup,
- SafetyCheckHandler::ChromeCleanerStatus::kInfected,
- base::UTF8ToUTF16("Browser found harmful software on your computer"))));
+ ::testing::Values(
+ std::make_tuple(safe_browsing::ChromeCleanerController::IdleReason::
+ kUserDeclinedCleanup,
+ SafetyCheckHandler::ChromeCleanerStatus::kInfected,
+ u"Browser found harmful software on your computer")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_CleaningFailed,
@@ -1538,7 +1531,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kCleaningFailed,
SafetyCheckHandler::ChromeCleanerStatus::kError,
- base::UTF8ToUTF16("Something went wrong. Click for more details."))));
+ u"Something went wrong. Click for more details.")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_CleaningSucceed,
@@ -1552,18 +1545,18 @@ INSTANTIATE_TEST_SUITE_P(
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_CleanerDownloadFailed,
SafetyCheckHandlerChromeCleanerIdleTest,
- ::testing::Values(std::make_tuple(
- safe_browsing::ChromeCleanerController::IdleReason::
- kCleanerDownloadFailed,
- SafetyCheckHandler::ChromeCleanerStatus::kError,
- base::UTF8ToUTF16("Something went wrong. Click for more details."))));
+ ::testing::Values(
+ std::make_tuple(safe_browsing::ChromeCleanerController::IdleReason::
+ kCleanerDownloadFailed,
+ SafetyCheckHandler::ChromeCleanerStatus::kError,
+ u"Something went wrong. Click for more details.")));
class SafetyCheckHandlerChromeCleanerNonIdleTest
: public SafetyCheckHandlerTest,
public testing::WithParamInterface<
std::tuple<safe_browsing::ChromeCleanerController::State,
SafetyCheckHandler::ChromeCleanerStatus,
- base::string16>> {
+ std::u16string>> {
protected:
void SetUp() override {
SafetyCheckHandlerTest::SetUp();
@@ -1574,7 +1567,7 @@ class SafetyCheckHandlerChromeCleanerNonIdleTest
safe_browsing::ChromeCleanerController::State state_;
SafetyCheckHandler::ChromeCleanerStatus expected_cct_status_;
- base::string16 expected_display_string_;
+ std::u16string expected_display_string_;
};
TEST_P(SafetyCheckHandlerChromeCleanerNonIdleTest,
@@ -1635,7 +1628,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::State::kInfected,
SafetyCheckHandler::ChromeCleanerStatus::kInfected,
- base::UTF8ToUTF16("Browser found harmful software on your computer"))));
+ u"Browser found harmful software on your computer")));
INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_RebootRequired,
@@ -1723,7 +1716,7 @@ TEST_F(SafetyCheckHandlerTest, CheckParentRanDisplayString) {
for (auto tuple : tuples) {
const base::Time time =
system_time - base::TimeDelta::FromSeconds(std::get<1>(tuple));
- const base::string16 display_string =
+ const std::u16string display_string =
safety_check_->GetStringForParentRan(time, system_time);
EXPECT_EQ(base::UTF8ToUTF16(
base::StrCat({"Safety check ran ", std::get<0>(tuple)})),
@@ -1735,7 +1728,7 @@ TEST_F(SafetyCheckHandlerTest, CheckParentRanDisplayString) {
TEST_F(SafetyCheckHandlerTest, CheckChromeCleanerRanDisplayString) {
// Test string without timestamp.
base::Time null_time;
- base::string16 display_string =
+ std::u16string display_string =
safety_check_->GetStringForChromeCleanerRan(null_time, null_time);
ReplaceBrowserName(&display_string);
EXPECT_EQ(display_string,
@@ -1789,31 +1782,31 @@ TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckStartedWebUiEvents) {
kParent,
static_cast<int>(SafetyCheckHandler::ParentStatus::kChecking));
ASSERT_TRUE(event_parent);
- VerifyDisplayString(event_parent, base::UTF8ToUTF16("Running…"));
+ VerifyDisplayString(event_parent, u"Running…");
const base::DictionaryValue* event_updates =
GetSafetyCheckStatusChangedWithDataIfExists(
kUpdates,
static_cast<int>(SafetyCheckHandler::UpdateStatus::kChecking));
ASSERT_TRUE(event_updates);
- VerifyDisplayString(event_updates, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event_updates, u"");
const base::DictionaryValue* event_pws =
GetSafetyCheckStatusChangedWithDataIfExists(
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
ASSERT_TRUE(event_pws);
- VerifyDisplayString(event_pws, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event_pws, u"");
const base::DictionaryValue* event_sb =
GetSafetyCheckStatusChangedWithDataIfExists(
kSafeBrowsing,
static_cast<int>(SafetyCheckHandler::SafeBrowsingStatus::kChecking));
ASSERT_TRUE(event_sb);
- VerifyDisplayString(event_sb, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event_sb, u"");
const base::DictionaryValue* event_extensions =
GetSafetyCheckStatusChangedWithDataIfExists(
kExtensions,
static_cast<int>(SafetyCheckHandler::ExtensionsStatus::kChecking));
ASSERT_TRUE(event_extensions);
- VerifyDisplayString(event_extensions, base::UTF8ToUTF16(""));
+ VerifyDisplayString(event_extensions, u"");
}
TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckCompletedWebUiEvents) {
@@ -1836,8 +1829,7 @@ TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckCompletedWebUiEvents) {
GetSafetyCheckStatusChangedWithDataIfExists(
kParent, static_cast<int>(SafetyCheckHandler::ParentStatus::kAfter));
ASSERT_TRUE(event_parent);
- VerifyDisplayString(event_parent,
- base::UTF8ToUTF16("Safety check ran a moment ago"));
+ VerifyDisplayString(event_parent, u"Safety check ran a moment ago");
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Subsequent Chrome cleaner status updates without the user running safety
diff --git a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc
index 6f0374d327b..fcc19c65815 100644
--- a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc
@@ -288,8 +288,8 @@ void SearchEnginesHandler::HandleSearchEngineEditStarted(
}
void SearchEnginesHandler::OnEditedKeyword(TemplateURL* template_url,
- const base::string16& title,
- const base::string16& keyword,
+ const std::u16string& title,
+ const std::u16string& keyword,
const std::string& url) {
DCHECK(!url.empty());
if (template_url)
diff --git a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.h b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.h
index 5452f1ee59e..a36946a8d3c 100644
--- a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.h
@@ -44,8 +44,8 @@ class SearchEnginesHandler : public SettingsPageUIHandler,
// EditSearchEngineControllerDelegate implementation.
void OnEditedKeyword(TemplateURL* template_url,
- const base::string16& title,
- const base::string16& keyword,
+ const std::u16string& title,
+ const std::u16string& keyword,
const std::string& url) override;
// SettingsPageUIHandler implementation.
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
index 6a8860ce957..287961269dd 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
@@ -278,10 +278,10 @@ void CookiesViewHandler::HandleGetNumCookiesString(
int num_cookies = args->GetList()[1].GetInt();
AllowJavascript();
- const base::string16 string =
+ const std::u16string string =
num_cookies > 0 ? l10n_util::GetPluralStringFUTF16(
IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, num_cookies)
- : base::string16();
+ : std::u16string();
ResolveJavascriptCallback(base::Value(callback_id), base::Value(string));
}
@@ -289,7 +289,7 @@ void CookiesViewHandler::HandleGetNumCookiesString(
void CookiesViewHandler::HandleGetDisplayList(const base::ListValue* args) {
CHECK_EQ(2U, args->GetList().size());
std::string callback_id = args->GetList()[0].GetString();
- base::string16 filter = base::UTF8ToUTF16(args->GetList()[1].GetString());
+ std::u16string filter = base::UTF8ToUTF16(args->GetList()[1].GetString());
AllowJavascript();
pending_requests_.emplace(
@@ -302,7 +302,7 @@ void CookiesViewHandler::HandleGetDisplayList(const base::ListValue* args) {
}
void CookiesViewHandler::GetDisplayList(std::string callback_id,
- const base::string16& filter) {
+ const std::u16string& filter) {
if (filter != filter_) {
filter_ = filter;
cookies_tree_model_->UpdateSearchResults(filter_);
@@ -387,8 +387,7 @@ void CookiesViewHandler::HandleRemoveThirdParty(const base::ListValue* args) {
content::ClearSameSiteNoneData,
base::BindOnce(&CookiesViewHandler::RecreateCookiesTreeModel,
callback_weak_ptr_factory_.GetWeakPtr()),
- profile,
- /* clear_storage */ true),
+ profile),
base::BindOnce(&CookiesViewHandler::ResolveJavascriptCallback,
callback_weak_ptr_factory_.GetWeakPtr(),
base::Value(callback_id), base::Value()));
@@ -414,7 +413,7 @@ void CookiesViewHandler::RemoveShownItems() {
void CookiesViewHandler::HandleRemoveSite(const base::ListValue* args) {
CHECK_EQ(1U, args->GetList().size());
- base::string16 site = base::UTF8ToUTF16(args->GetList()[0].GetString());
+ std::u16string site = base::UTF8ToUTF16(args->GetList()[0].GetString());
AllowJavascript();
pending_requests_.emplace(
Request::NO_BATCH,
@@ -423,7 +422,7 @@ void CookiesViewHandler::HandleRemoveSite(const base::ListValue* args) {
ProcessPendingRequests();
}
-void CookiesViewHandler::RemoveSite(const base::string16& site) {
+void CookiesViewHandler::RemoveSite(const std::u16string& site) {
CookieTreeNode* parent = cookies_tree_model_->GetRoot();
const auto i = std::find_if(
parent->children().cbegin(), parent->children().cend(),
@@ -445,10 +444,10 @@ void CookiesViewHandler::ReturnLocalDataList(const std::string& callback_id) {
// Gather list of sites with some highlights of the categories and items.
base::ListValue site_list;
for (const auto& site : parent->children()) {
- base::string16 description;
+ std::u16string description;
for (const auto& category : site->children()) {
if (!description.empty())
- description += base::ASCIIToUTF16(", ");
+ description += u", ";
const auto node_type = category->GetDetailedInfo().node_type;
size_t item_count = category->children().size();
switch (node_type) {
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
index c98b2c9708b..1c3d0725bbc 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
@@ -12,7 +12,6 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/browser/browsing_data/cookies_tree_model.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
@@ -69,7 +68,7 @@ class CookiesViewHandler : public SettingsPageUIHandler,
// Set |filter_| and get a portion (or all) of the list items.
void HandleGetDisplayList(const base::ListValue* args);
- void GetDisplayList(std::string callback_id, const base::string16& filter);
+ void GetDisplayList(std::string callback_id, const std::u16string& filter);
// Remove all items matching the current |filter_|.
void HandleRemoveShownItems(const base::ListValue* args);
@@ -77,7 +76,7 @@ class CookiesViewHandler : public SettingsPageUIHandler,
// Remove selected sites data.
void HandleRemoveSite(const base::ListValue* args);
- void RemoveSite(const base::string16& site);
+ void RemoveSite(const std::u16string& site);
// Retrieve cookie details for a specific site.
void HandleGetCookieDetails(const base::ListValue* args);
@@ -115,7 +114,7 @@ class CookiesViewHandler : public SettingsPageUIHandler,
std::unique_ptr<CookiesTreeModel> cookies_tree_model_for_testing_;
// Only show items that contain |filter|.
- base::string16 filter_;
+ std::u16string filter_;
struct Request {
// Specifies the batch behavior of the tree model when this request is run
@@ -174,7 +173,7 @@ class CookiesViewHandler : public SettingsPageUIHandler,
void RequestComplete();
// Sorted index list, by site. Indexes refer to |model->GetRoot()| children.
- typedef std::pair<base::string16, size_t> LabelAndIndex;
+ typedef std::pair<std::u16string, size_t> LabelAndIndex;
std::vector<LabelAndIndex> sorted_sites_;
std::unique_ptr<CookiesTreeModelUtil> model_util_;
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
index 3cbe948cb6d..92ebcec5e49 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
@@ -22,10 +22,8 @@ bool DefaultBrowserIsDisabledByPolicy() {
g_browser_process->local_state()->FindPreference(
prefs::kDefaultBrowserSettingEnabled);
DCHECK(pref);
- bool may_set_default_browser;
- bool success = pref->GetValue()->GetAsBoolean(&may_set_default_browser);
- DCHECK(success);
- return pref->IsManaged() && !may_set_default_browser;
+ DCHECK(pref->GetValue()->is_bool());
+ return pref->IsManaged() && !pref->GetValue()->GetBool();
}
} // namespace
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index f384bc355db..5483a4d9f89 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -102,9 +102,9 @@
#include "chrome/browser/ash/account_manager/account_manager_util.h"
#include "chrome/browser/ash/assistant/assistant_util.h"
#include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
+#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/common/webui_url_constants.h"
@@ -211,10 +211,6 @@ void AddA11yStrings(content::WebUIDataSource* html_source) {
IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
{"settingsSliderRoleDescription",
IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION},
- {"captionsEnableLiveCaptionTitle",
- IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE},
- {"captionsEnableLiveCaptionSubtitle",
- IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE},
{"caretBrowsingTitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE},
{"caretBrowsingSubtitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE},
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -241,9 +237,6 @@ void AddA11yStrings(content::WebUIDataSource* html_source) {
base::FeatureList::IsEnabled(features::kAccessibilityFocusHighlight));
#endif
- html_source->AddBoolean("enableLiveCaption",
- base::FeatureList::IsEnabled(media::kLiveCaption));
-
AddCaptionSubpageStrings(html_source);
}
@@ -287,7 +280,8 @@ void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) {
l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
? IDS_VERSION_UI_OFFICIAL
: IDS_VERSION_UI_UNOFFICIAL),
- base::UTF8ToUTF16(chrome::GetChannelName()),
+ base::UTF8ToUTF16(
+ chrome::GetChannelName(chrome::WithExtendedStable(true))),
l10n_util::GetStringUTF16(VersionUI::VersionProcessorVariation())));
html_source->AddString(
"aboutProductCopyright",
@@ -295,7 +289,7 @@ void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) {
l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT),
base::Time::Now()));
- base::string16 license = l10n_util::GetStringFUTF16(
+ std::u16string license = l10n_util::GetStringFUTF16(
IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
html_source->AddString("aboutProductLicense", license);
@@ -361,6 +355,8 @@ void AddAppearanceStrings(content::WebUIDataSource* html_source,
#endif
{"readerMode", IDS_SETTINGS_READER_MODE},
{"readerModeDescription", IDS_SETTINGS_READER_MODE_DESCRIPTION},
+ {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE},
+ {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
@@ -466,9 +462,9 @@ void AddDownloadsStrings(content::WebUIDataSource* html_source) {
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
void AddChromeCleanupStrings(content::WebUIDataSource* html_source) {
- const wchar_t kUnwantedSoftwareProtectionWhitePaperUrl[] =
- L"https://www.google.ca/chrome/browser/privacy/"
- "whitepaper.html#unwantedsoftware";
+ const char16_t kUnwantedSoftwareProtectionWhitePaperUrl[] =
+ u"https://www.google.ca/chrome/browser/privacy/"
+ u"whitepaper.html#unwantedsoftware";
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"chromeCleanupPageTitle",
@@ -547,12 +543,12 @@ void AddChromeCleanupStrings(content::WebUIDataSource* html_source) {
ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
IDR_CHROME_CLEANUP_PARTNER),
"</span>"});
- const base::string16 powered_by_html =
+ const std::u16string powered_by_html =
l10n_util::GetStringFUTF16(IDS_SETTINGS_RESET_CLEANUP_FOOTER_POWERED_BY,
base::UTF8ToUTF16(powered_by_element));
html_source->AddString("chromeCleanupPoweredByHtml", powered_by_html);
- const base::string16 cleanup_details_explanation =
+ const std::u16string cleanup_details_explanation =
l10n_util::GetStringFUTF16(IDS_SETTINGS_RESET_CLEANUP_DETAILS_EXPLANATION,
kUnwantedSoftwareProtectionWhitePaperUrl);
html_source->AddString("chromeCleanupDetailsExplanation",
@@ -580,7 +576,7 @@ void AddIncompatibleApplicationsStrings(content::WebUIDataSource* html_source) {
// The help URL is provided via Field Trial param. If none is provided, the
// "Learn How" text is left empty so that no link is displayed.
- base::string16 learn_how_text;
+ std::u16string learn_how_text;
std::string help_url = GetFieldTrialParamValueByFeature(
features::kIncompatibleApplicationsWarning, "HelpURL");
if (!help_url.empty()) {
@@ -692,6 +688,9 @@ void AddLanguagesStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_LABEL},
{"spellCheckEnhancedDescription",
IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_DESCRIPTION},
+ // Managed dialog strings:
+ {"languageManagedDialogTitle", IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_TITLE},
+ {"languageManagedDialogBody", IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_BODY},
#if !defined(OS_MAC)
{"spellCheckDisabledReason",
IDS_SETTING_LANGUAGES_SPELL_CHECK_DISABLED_REASON},
@@ -749,9 +748,8 @@ void AddLanguagesStrings(content::WebUIDataSource* html_source,
html_source->AddString(
"chromeOSLanguagesSettingsPath",
chromeos::settings::mojom::kLanguagesAndInputSectionPath);
- html_source->AddBoolean("isChromeOSLanguagesSettingsUpdate",
- base::FeatureList::IsEnabled(
- chromeos::features::kLanguageSettingsUpdate));
+ // TODO(crbug.com/1097328): Delete this.
+ html_source->AddBoolean("isChromeOSLanguagesSettingsUpdate", true);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
@@ -973,14 +971,18 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_PASSWORD_DELETED_PASSWORD_FROM_ACCOUNT_AND_DEVICE},
{"passwordMovePasswordsToAccount",
IDS_SETTINGS_PASSWORD_MOVE_PASSWORDS_TO_ACCOUNT},
- {"passwordMovePasswordsToAccountDialogFooter",
- IDS_SETTINGS_PASSWORD_MOVE_PASSWORDS_TO_ACCOUNT_DIALOG_FOOTER},
+ {"passwordMovePasswordsToAccountDialogBodyText",
+ IDS_SETTINGS_PASSWORD_MOVE_PASSWORDS_TO_ACCOUNT_DIALOG_BODY_TEXT},
{"passwordMovePasswordsToAccountDialogTitle",
IDS_SETTINGS_PASSWORD_MOVE_PASSWORDS_TO_ACCOUNT_DIALOG_TITLE},
{"passwordMoveToAccountDialogTitle",
IDS_SETTINGS_PASSWORD_MOVE_TO_ACCOUNT_DIALOG_TITLE},
{"passwordMoveToAccountDialogBody",
IDS_SETTINGS_PASSWORD_MOVE_TO_ACCOUNT_DIALOG_BODY},
+ {"passwordMoveMultiplePasswordsToAccountDialogMoveButtonText",
+ IDS_SETTINGS_PASSWORD_MOVE_MULTIPLE_PASSWORDS_TO_ACCOUNT_DIALOG_MOVE_BUTTON_TEXT},
+ {"passwordMoveMultiplePasswordsToAccountDialogCancelButtonText",
+ IDS_SETTINGS_PASSWORD_MOVE_MULTIPLE_PASSWORDS_TO_ACCOUNT_DIALOG_CANCEL_BUTTON_TEXT},
{"passwordMoveToAccountDialogMoveButtonText",
IDS_SETTINGS_PASSWORD_MOVE_TO_ACCOUNT_DIALOG_MOVE_BUTTON_TEXT},
{"passwordMoveToAccountDialogCancelButtonText",
@@ -1182,8 +1184,8 @@ void AddSignOutDialogStrings(content::WebUIDataSource* html_source,
html_source->AddString(
"syncDisconnectManagedProfileExplanation",
l10n_util::GetStringFUTF8(
- IDS_SETTINGS_SYNC_DISCONNECT_MANAGED_PROFILE_EXPLANATION,
- base::ASCIIToUTF16("$1"), base::ASCIIToUTF16(sync_dashboard_url)));
+ IDS_SETTINGS_SYNC_DISCONNECT_MANAGED_PROFILE_EXPLANATION, u"$1",
+ base::ASCIIToUTF16(sync_dashboard_url)));
#endif
}
@@ -1222,6 +1224,10 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) {
{"defaultThemeLabel", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL},
{"thirdPartyThemeDescription", IDS_NTP_CUSTOMIZE_3PT_THEME_DESC},
{"uninstallThirdPartyThemeButton", IDS_NTP_CUSTOMIZE_3PT_THEME_UNINSTALL},
+
+ // Managed theme dialog strings:
+ {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE},
+ {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY},
#endif
{"deleteProfileWarningExpandA11yLabel",
IDS_SETTINGS_SYNC_DISCONNECT_EXPAND_ACCESSIBILITY_LABEL},
@@ -1244,6 +1250,11 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) {
html_source->AddBoolean("profileShortcutsEnabled",
ProfileShortcutManager::IsFeatureEnabled());
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+ html_source->AddBoolean("signinAvailable",
+ AccountConsistencyModeManager::IsDiceSignInAllowed());
+#endif
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Toggles the Chrome OS Account Manager submenu in the People section.
html_source->AddBoolean("isAccountManagerEnabled",
@@ -1542,7 +1553,7 @@ void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) {
};
html_source->AddLocalizedStrings(kLocalizedStrings);
- base::string16 help_text = l10n_util::GetStringFUTF16(
+ std::u16string help_text = l10n_util::GetStringFUTF16(
IDS_SETTINGS_SEARCH_NO_RESULTS_HELP,
base::ASCIIToUTF16(chrome::kSettingsSearchHelpURL));
html_source->AddString("searchNoResultsHelp", help_text);
@@ -1769,6 +1780,8 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_PDF_DOWNLOAD_PDFS},
{"siteSettingsProtectedContent",
IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT},
+ {"siteSettingsProtectedContentMidSentence",
+ IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_MID_SENTENCE},
{"siteSettingsProtectedContentIdentifiers",
IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS},
{"siteSettingsProtectedContentEnable",
@@ -1825,15 +1838,15 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
{"siteSettingsBluetoothDevicesBlock",
IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_BLOCK},
{"siteSettingsFileSystemWrite",
- IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE},
+ IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE},
{"siteSettingsFileSystemWriteMidSentence",
- IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_MID_SENTENCE},
+ IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE},
{"siteSettingsFileSystemWriteAsk",
- IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK},
+ IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK},
{"siteSettingsFileSystemWriteAskRecommended",
- IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK_RECOMMENDED},
+ IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK_RECOMMENDED},
{"siteSettingsFileSystemWriteBlock",
- IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_BLOCK},
+ IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_BLOCK},
{"siteSettingsRemoveZoomLevel",
IDS_SETTINGS_SITE_SETTINGS_REMOVE_ZOOM_LEVEL},
{"siteSettingsZoomLevels", IDS_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS},
@@ -2073,6 +2086,12 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_ALLOWED_EXCEPTIONS},
{"siteSettingsBackgroundSyncBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED_EXCEPTIONS},
+ {"siteSettingsBluetoothDevicesDescription",
+ IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_DESCRIPTION},
+ {"siteSettingsBluetoothDevicesAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_ALLOWED},
+ {"siteSettingsBluetoothDevicesBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_BLOCKED},
{"siteSettingsCameraDescription",
IDS_SETTINGS_SITE_SETTINGS_CAMERA_DESCRIPTION},
{"siteSettingsCameraAllowed", IDS_SETTINGS_SITE_SETTINGS_CAMERA_ALLOWED},
@@ -2093,6 +2112,26 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_ALLOWED_EXCEPTIONS},
{"siteSettingsClipboardBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_BLOCKED_EXCEPTIONS},
+ {"siteSettingsDeviceUseDescription",
+ IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_DESCRIPTION},
+ {"siteSettingsDeviceUseAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED},
+ {"siteSettingsDeviceUseBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED},
+ {"siteSettingsDeviceUseAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED_EXCEPTIONS},
+ {"siteSettingsDeviceUseBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED_EXCEPTIONS},
+ {"siteSettingsFileHandlingDescription",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_DESCRIPTION},
+ {"siteSettingsFileHandlingAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_ALLOWED},
+ {"siteSettingsFileHandlingBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_BLOCKED},
+ {"siteSettingsFileHandlingAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_ALLOWED_EXCEPTIONS},
+ {"siteSettingsFileHandlingBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_BLOCKED_EXCEPTIONS},
{"siteSettingsFileSystemWriteDescription",
IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_DESCRIPTION},
{"siteSettingsFileSystemWriteAllowed",
@@ -2101,18 +2140,20 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED},
{"siteSettingsFileSystemWriteBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED_EXCEPTIONS},
- {"siteSettingsLocationDescription",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_DESCRIPTION},
- {"siteSettingsLocationAllowed",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED},
- {"siteSettingsLocationBlocked",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED},
- {"siteSettingsLocationBlockedSubLabel",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_SUB_LABEL},
- {"siteSettingsLocationAllowedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED_EXCEPTIONS},
- {"siteSettingsLocationBlockedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_EXCEPTIONS},
+ {"siteSettingsFontsDescription",
+ IDS_SETTINGS_SITE_SETTINGS_FONTS_DESCRIPTION},
+ {"siteSettingsFontsAllowed", IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED},
+ {"siteSettingsFontsBlocked", IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED},
+ {"siteSettingsFontsAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED_EXCEPTIONS},
+ {"siteSettingsFontsBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED_EXCEPTIONS},
+ {"siteSettingsHidDevicesDescription",
+ IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_DESCRIPTION},
+ {"siteSettingsHidDevicesAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_ALLOWED},
+ {"siteSettingsHidDevicesBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_BLOCKED},
{"siteSettingsImagesDescription",
IDS_SETTINGS_SITE_SETTINGS_IMAGES_DESCRIPTION},
{"siteSettingsImagesAllowed", IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED},
@@ -2121,6 +2162,12 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED_EXCEPTIONS},
{"siteSettingsImagedBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED_EXCEPTIONS},
+ {"siteSettingsInsecureContentDescription",
+ IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_DESCRIPTION},
+ {"siteSettingsInsecureContentAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_ALLOWED_EXCEPTIONS},
+ {"siteSettingsInsecureContentBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCKED_EXCEPTIONS},
{"siteSettingsJavascriptDescription",
IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_DESCRIPTION},
{"siteSettingsJavascriptAllowed",
@@ -2131,6 +2178,18 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_ALLOWED_EXCEPTIONS},
{"siteSettingsJavascriptBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_BLOCKED_EXCEPTIONS},
+ {"siteSettingsLocationDescription",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_DESCRIPTION},
+ {"siteSettingsLocationAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED},
+ {"siteSettingsLocationBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED},
+ {"siteSettingsLocationBlockedSubLabel",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_SUB_LABEL},
+ {"siteSettingsLocationAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED_EXCEPTIONS},
+ {"siteSettingsLocationBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_EXCEPTIONS},
{"siteSettingsMicDescription", IDS_SETTINGS_SITE_SETTINGS_MIC_DESCRIPTION},
{"siteSettingsMicAllowed", IDS_SETTINGS_SITE_SETTINGS_MIC_ALLOWED},
{"siteSettingsMicBlocked", IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED},
@@ -2148,10 +2207,18 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_MIDI_ALLOWED_EXCEPTIONS},
{"siteSettingsMidiBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_MIDI_BLOCKED_EXCEPTIONS},
- {"siteSettingsInsecureContentAllowedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_ALLOWED_EXCEPTIONS},
- {"siteSettingsInsecureContentBlockedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCKED_EXCEPTIONS},
+ {"siteSettingsMotionSensorsDescription",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_DESCRIPTION},
+ {"siteSettingsMotionSensorsAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED},
+ {"siteSettingsMotionSensorsBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED},
+ {"siteSettingsMotionSensorsBlockedSubLabel",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_SUB_LABEL},
+ {"siteSettingsMotionSensorsAllowedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED_EXCEPTIONS},
+ {"siteSettingsMotionSensorsBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_EXCEPTIONS},
{"siteSettingsNotificationsDescription",
IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_DESCRIPTION},
{"siteSettingsNotificationsAllowed",
@@ -2178,6 +2245,10 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_ALLOWED_EXCEPTIONS},
{"siteSettingsPaymentHandlersBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_BLOCKED_EXCEPTIONS},
+ {"siteSettingsPdfsDescription",
+ IDS_SETTINGS_SITE_SETTINGS_PDFS_DESCRIPTION},
+ {"siteSettingsPdfsAllowed", IDS_SETTINGS_SITE_SETTINGS_PDFS_ALLOWED},
+ {"siteSettingsPdfsBlocked", IDS_SETTINGS_SITE_SETTINGS_PDFS_BLOCKED},
{"siteSettingsPopupsDescription",
IDS_SETTINGS_SITE_SETTINGS_POPUPS_DESCRIPTION},
{"siteSettingsPopupsAllowed", IDS_SETTINGS_SITE_SETTINGS_POPUPS_ALLOWED},
@@ -2196,18 +2267,14 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_ALLOWED_EXCEPTIONS},
{"siteSettingsProtectedContentBlockedExceptions",
IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_BLOCKED_EXCEPTIONS},
- {"siteSettingsMotionSensorsDescription",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_DESCRIPTION},
- {"siteSettingsMotionSensorsAllowed",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED},
- {"siteSettingsMotionSensorsBlocked",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED},
- {"siteSettingsMotionSensorsBlockedSubLabel",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_SUB_LABEL},
- {"siteSettingsMotionSensorsAllowedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED_EXCEPTIONS},
- {"siteSettingsMotionSensorsBlockedExceptions",
- IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_EXCEPTIONS},
+ {"siteSettingsProtocolHandlersDescription",
+ IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_DESCRIPTION},
+ {"siteSettingsProtocolHandlersAllowed",
+ IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_ALLOWED},
+ {"siteSettingsProtocolHandlersBlocked",
+ IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED},
+ {"siteSettingsProtocolHandlersBlockedExceptions",
+ IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED_EXCEPTIONS},
{"siteSettingsSerialPortsDescription",
IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_DESCRIPTION},
{"siteSettingsSerialPortsAllowed",
@@ -2296,6 +2363,13 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SITE_SETTINGS_IDLE_DETECTION_ASK},
{"siteSettingsIdleDetectionBlock",
IDS_SETTINGS_SITE_SETTINGS_IDLE_DETECTION_BLOCK},
+ {"siteSettingsFileHandling", IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING},
+ {"siteSettingsFileHandlingMidSentence",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_MID_SENTENCE},
+ {"siteSettingsFileHandlingAsk",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_ASK},
+ {"siteSettingsFileHandlingBlock",
+ IDS_SETTINGS_SITE_SETTINGS_FILE_HANDLING_BLOCK},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
@@ -2355,6 +2429,10 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
"enableFontAccessContentSetting",
base::FeatureList::IsEnabled(::blink::features::kFontAccess));
+ html_source->AddBoolean(
+ "enableFileHandlingContentSetting",
+ base::FeatureList::IsEnabled(::blink::features::kFileHandlingAPI));
+
// The exception placeholder should not be translated. See crbug.com/1095878.
html_source->AddString("addSiteExceptionPlaceholder", "[*.]example.com");
}
@@ -2500,10 +2578,8 @@ void AddSecurityKeysStrings(content::WebUIDataSource* html_source) {
#endif
html_source->AddBoolean("enableSecurityKeysSubpage",
!win_native_api_available);
- html_source->AddBoolean(
- "enableSecurityKeysBioEnrollment",
- base::FeatureList::IsEnabled(device::kWebAuthBiometricEnrollment) &&
- !win_native_api_available);
+ html_source->AddBoolean("enableSecurityKeysBioEnrollment",
+ !win_native_api_available);
}
} // namespace
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
index 0759f545164..753ca0a5e91 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
@@ -24,12 +24,14 @@
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/signin/profile_colors_util.h"
+#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_ui.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "ui/base/l10n/l10n_util.h"
@@ -82,6 +84,8 @@ void ManageProfileHandler::RegisterMessages() {
"removeProfileShortcut",
base::BindRepeating(&ManageProfileHandler::HandleRemoveProfileShortcut,
base::Unretained(this)));
+ content::URLDataSource::Add(profile_,
+ std::make_unique<ThemeSource>(profile_));
}
void ManageProfileHandler::OnJavascriptAllowed() {
@@ -219,7 +223,7 @@ void ManageProfileHandler::HandleSetProfileName(const base::ListValue* args) {
CHECK(args);
CHECK_EQ(1u, args->GetSize());
- base::string16 new_profile_name;
+ std::u16string new_profile_name;
CHECK(args->GetString(0, &new_profile_name));
base::TrimWhitespace(new_profile_name, base::TRIM_ALL, &new_profile_name);
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
index a0fa5517e2d..061263c6783 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
@@ -55,7 +55,7 @@ class ManageProfileHandlerTest : public testing::Test {
void SetSignedInProfile() {
gfx::Image gaia_image(gfx::test::CreateImage(256, 256));
- entry()->SetAuthInfo("gaia_id", base::UTF8ToUTF16("user@gmail.com"), false);
+ entry()->SetAuthInfo("gaia_id", u"user@gmail.com", false);
entry()->SetGAIAPicture("GAIA_IMAGE_URL_WITH_SIZE", gaia_image);
EXPECT_TRUE(entry()->IsUsingDefaultAvatar());
EXPECT_TRUE(entry()->IsUsingGAIAPicture());
@@ -271,7 +271,7 @@ TEST_F(ManageProfileHandlerTest, GetAvailableIconsSignedInProfile) {
/*gaia_selected=*/false);
// Sign out.
- entry()->SetAuthInfo("", base::string16(), false);
+ entry()->SetAuthInfo("", std::u16string(), false);
entry()->SetGAIAPicture(std::string(), gfx::Image());
const content::TestWebUI::CallData& data_2 = *web_ui()->call_data().back();
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
index ae1a6e96af2..9d31f5f1ec0 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -18,6 +18,7 @@
#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "chrome/browser/account_manager_facade_factory.h"
#include "chrome/browser/privacy_sandbox/privacy_sandbox_settings.h"
#include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -67,6 +68,7 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/settings_resources.h"
#include "chrome/grit/settings_resources_map.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/favicon_base/favicon_url_parser.h"
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/pref_registry/pref_registry_syncable.h"
@@ -95,6 +97,10 @@
#include "chrome/browser/ui/webui/settings/languages_handler.h"
#endif // defined(OS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "components/language/core/common/language_experiments.h"
+#endif // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/components/account_manager/account_manager.h"
#include "ash/components/account_manager/account_manager_factory.h"
@@ -253,15 +259,6 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
profile->GetPrefs()->GetBoolean(
prefs::kSigninAllowed));
- html_source->AddBoolean(
- "safeBrowsingEnhancedEnabled",
- base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection));
-
- html_source->AddBoolean(
- "editPasswordsInSettings",
- base::FeatureList::IsEnabled(
- password_manager::features::kEditPasswordsInSettings));
-
html_source->AddBoolean("showImportPasswords",
base::FeatureList::IsEnabled(
password_manager::features::kPasswordImport));
@@ -291,6 +288,12 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
features::kChromeCleanupScanCompletedNotification));
#endif
+#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+ html_source->AddBoolean("enableDesktopRestructuredLanguageSettings",
+ base::FeatureList::IsEnabled(
+ language::kDesktopRestructuredLanguageSettings));
+#endif // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
html_source->AddBoolean("splitSettingsSyncEnabled",
chromeos::features::IsSplitSettingsSyncEnabled());
@@ -315,6 +318,10 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
AddSettingsPageUIHandler(std::make_unique<AboutHandler>(profile));
AddSettingsPageUIHandler(std::make_unique<ResetSettingsHandler>(profile));
+ html_source->AddBoolean(
+ "searchHistoryLink",
+ base::FeatureList::IsEnabled(features::kSearchHistoryLink));
+
// Add a handler to provide pluralized strings.
auto plural_string_handler = std::make_unique<PluralStringHandler>();
plural_string_handler->AddLocalizedString(
@@ -379,10 +386,14 @@ void SettingsUI::InitBrowserSettingsWebUIHandlers() {
auto* account_manager =
factory->GetAccountManager(profile->GetPath().value());
DCHECK(account_manager);
+ auto* account_manager_facade =
+ ::GetAccountManagerFacade(profile->GetPath().value());
+ DCHECK(account_manager_facade);
web_ui()->AddMessageHandler(
std::make_unique<chromeos::settings::AccountManagerUIHandler>(
- account_manager, IdentityManagerFactory::GetForProfile(profile)));
+ account_manager, account_manager_facade,
+ IdentityManagerFactory::GetForProfile(profile)));
}
// MultideviceHandler is required in browser settings to show a special note
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
index fea44d1b3ba..bde9f8e8a3c 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
@@ -54,7 +54,7 @@ IN_PROC_BROWSER_TEST_F(SettingsUITest, TriggerHappinessTrackingSurveys) {
HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
browser()->profile(), base::BindRepeating(&BuildMockHatsService)));
EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(
- kHatsSurveyTriggerSettings, _, _));
+ kHatsSurveyTriggerSettings, _, _, _));
NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
base::RunLoop().RunUntilIdle();
}
diff --git a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
index 3a5ab607cf1..b2d09de33a6 100644
--- a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
@@ -20,6 +20,7 @@
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/google/core/common/google_util.h"
+#include "components/soda/constants.h"
#include "components/strings/grit/components_strings.h"
#include "components/user_manager/user_manager.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -41,7 +42,7 @@ namespace {
// Generates a Google Help URL which includes a "board type" parameter. Some
// help pages need to be adjusted depending on the type of CrOS device that is
// accessing the page.
-base::string16 GetHelpUrlWithBoard(const std::string& original_url) {
+std::u16string GetHelpUrlWithBoard(const std::string& original_url) {
return base::ASCIIToUTF16(original_url +
"&b=" + base::SysInfo::GetLsbReleaseBoard());
}
@@ -82,15 +83,66 @@ void AddCaptionSubpageStrings(content::WebUIDataSource* html_source) {
{"captionsColorCyan", IDS_SETTINGS_CAPTIONS_COLOR_CYAN},
{"captionsColorMagenta", IDS_SETTINGS_CAPTIONS_COLOR_MAGENTA},
{"captionsDefaultSetting", IDS_SETTINGS_CAPTIONS_DEFAULT_SETTING},
- {"captionsEnableLiveCaptionTitle",
- IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE},
- {"captionsEnableLiveCaptionSubtitle",
- IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
+ AddLiveCaptionSectionStrings(html_source);
+}
+
+void AddLiveCaptionSectionStrings(content::WebUIDataSource* html_source) {
+ html_source->AddLocalizedString(
+ "captionsEnableLiveCaptionTitle",
+ IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE);
+
+ const bool liveCaptionMultiLanguageEnabled =
+ base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage) &&
+ base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption);
+ const int live_caption_subtitle_message =
+ liveCaptionMultiLanguageEnabled
+ ? IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE
+ : IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE_ENGLISH_ONLY;
+ html_source->AddLocalizedString("captionsEnableLiveCaptionSubtitle",
+ live_caption_subtitle_message);
+
+ base::Optional<speech::SodaLanguagePackComponentConfig> englishConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kEnUs);
+ html_source->AddString("sodaLanguageCodeEnglish",
+ englishConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameEnglish",
+ englishConfig->display_name);
+ base::Optional<speech::SodaLanguagePackComponentConfig> frenchConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kFrFr);
+ html_source->AddString("sodaLanguageCodeFrench", frenchConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameFrench",
+ frenchConfig->display_name);
+ base::Optional<speech::SodaLanguagePackComponentConfig> germanConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kDeDe);
+ html_source->AddString("sodaLanguageCodeGerman", germanConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameGerman",
+ germanConfig->display_name);
+ base::Optional<speech::SodaLanguagePackComponentConfig> italianConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kItIt);
+ html_source->AddString("sodaLanguageCodeItalian",
+ italianConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameItalian",
+ italianConfig->display_name);
+ base::Optional<speech::SodaLanguagePackComponentConfig> japaneseConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kJaJp);
+ html_source->AddString("sodaLanguageCodeJapanese",
+ japaneseConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameJapanese",
+ japaneseConfig->display_name);
+ base::Optional<speech::SodaLanguagePackComponentConfig> spanishConfig =
+ speech::GetLanguageComponentConfig(speech::LanguageCode::kEsEs);
+ html_source->AddString("sodaLanguageCodeSpanish",
+ spanishConfig->language_name);
+ html_source->AddLocalizedString("sodaLanguageDisplayNameSpanish",
+ spanishConfig->display_name);
+
html_source->AddBoolean("enableLiveCaption",
base::FeatureList::IsEnabled(media::kLiveCaption));
+ html_source->AddBoolean("enableLiveCaptionMultiLanguage",
+ liveCaptionMultiLanguageEnabled);
}
void AddPersonalizationOptionsStrings(content::WebUIDataSource* html_source) {
diff --git a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h
index d0138b68721..b05355d9f25 100644
--- a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h
+++ b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h
@@ -16,6 +16,9 @@ namespace settings {
// Adds strings used by the <settings-captions> element.
void AddCaptionSubpageStrings(content::WebUIDataSource* html_source);
+// Adds strings used by the <settings-live-caption> element.
+void AddLiveCaptionSectionStrings(content::WebUIDataSource* html_source);
+
// Adds strings used by the <settings-personalization-options> element.
void AddPersonalizationOptionsStrings(content::WebUIDataSource* html_source);
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
index 73dd3c48952..2050cc2c12a 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -74,6 +74,8 @@
#include "components/user_manager/user_manager.h"
#endif
+using extensions::mojom::APIPermissionID;
+
namespace settings {
namespace {
@@ -107,35 +109,36 @@ enum class AllSitesAction2 {
};
// Return an appropriate API Permission ID for the given string name.
-extensions::APIPermission::APIPermission::ID APIPermissionFromGroupName(
- std::string type) {
+APIPermissionID APIPermissionFromGroupName(std::string type) {
// Once there are more than two groups to consider, this should be changed to
// something better than if's.
if (site_settings::ContentSettingsTypeFromGroupName(type) ==
- ContentSettingsType::GEOLOCATION)
- return extensions::APIPermission::APIPermission::kGeolocation;
+ ContentSettingsType::GEOLOCATION) {
+ return APIPermissionID::kGeolocation;
+ }
if (site_settings::ContentSettingsTypeFromGroupName(type) ==
- ContentSettingsType::NOTIFICATIONS)
- return extensions::APIPermission::APIPermission::kNotifications;
+ ContentSettingsType::NOTIFICATIONS) {
+ return APIPermissionID::kNotifications;
+ }
- return extensions::APIPermission::APIPermission::kInvalid;
+ return APIPermissionID::kInvalid;
}
// Asks the |profile| for hosted apps which have the |permission| set, and
// adds their web extent and launch URL to the |exceptions| list.
-void AddExceptionsGrantedByHostedApps(
- content::BrowserContext* context,
- extensions::APIPermission::APIPermission::ID permission,
- base::ListValue* exceptions) {
+void AddExceptionsGrantedByHostedApps(content::BrowserContext* context,
+ APIPermissionID permission,
+ base::ListValue* exceptions) {
const extensions::ExtensionSet& extensions =
extensions::ExtensionRegistry::Get(context)->enabled_extensions();
for (extensions::ExtensionSet::const_iterator extension = extensions.begin();
extension != extensions.end(); ++extension) {
if (!(*extension)->is_hosted_app() ||
- !(*extension)->permissions_data()->HasAPIPermission(permission))
+ !(*extension)->permissions_data()->HasAPIPermission(permission)) {
continue;
+ }
const extensions::URLPatternSet& web_extent = (*extension)->web_extent();
// Add patterns from web extent.
@@ -917,7 +920,7 @@ void SiteSettingsHandler::HandleGetFormattedBytes(const base::ListValue* args) {
double num_bytes;
CHECK(args->GetDouble(1, &num_bytes));
- const base::string16 string = ui::FormatBytes(int64_t(num_bytes));
+ const std::u16string string = ui::FormatBytes(int64_t(num_bytes));
ResolveJavascriptCallback(*callback_id, base::Value(string));
}
@@ -1237,7 +1240,6 @@ void SiteSettingsHandler::HandleResetChooserExceptionForSite(
permissions::ChooserContextBase* chooser_context =
chooser_type->get_context(profile_);
chooser_context->RevokeObjectPermission(
- url::Origin::Create(requesting_origin),
url::Origin::Create(embedding_origin), args->GetList()[3]);
}
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
index 70758bf88d5..64d624a1f5a 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -211,6 +211,9 @@ class SiteSettingsHandler
void HandleResetCategoryPermissionForPattern(const base::ListValue* args);
void HandleSetCategoryPermissionForPattern(const base::ListValue* args);
+ // TODO(andypaicu, crbug.com/880684): Update to only expect a list of three
+ // arguments, replacing the current (requesting,embedding) arguments with
+ // simply (origin) and update all call sites.
// Handles resetting a chooser exception for the given site.
void HandleResetChooserExceptionForSite(const base::ListValue* args);
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index b54f5d0d7fa..f695c1ac4b2 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -69,7 +69,7 @@
#include "ui/webui/webui_allowlist.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/ash/login/users/mock_user_manager.h"
#include "components/user_manager/scoped_user_manager.h"
#endif
@@ -157,7 +157,7 @@ class SiteSettingsHandlerTest : public testing::Test {
ContentSettingsType::COOKIES)) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
- std::make_unique<chromeos::MockUserManager>());
+ std::make_unique<ash::MockUserManager>());
#endif
// Fully initialize |profile_| in the constructor since some children
@@ -176,7 +176,10 @@ class SiteSettingsHandlerTest : public testing::Test {
// AllowJavascript() adds a callback to create leveldb_env::ChromiumEnv
// which reads the FeatureList. Wait for the callback to be finished so that
// we won't destruct |feature_list_| before the callback is executed.
- base::RunLoop().RunUntilIdle();
+ // We also want to let the storage system finish setting up, to avoid test
+ // flakiness caused by the quota storage system shutting down at test end,
+ // while still being set up.
+ task_environment_.RunUntilIdle();
web_ui()->ClearTrackedCalls();
}
@@ -1200,8 +1203,10 @@ TEST_F(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) {
EXPECT_EQ(
*ukm_recorder.GetEntryMetric(entry, "Source"),
static_cast<int64_t>(permissions::PermissionSourceUI::SITE_SETTINGS));
+ size_t num_values = 0;
EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
- static_cast<int64_t>(ContentSettingsType::NOTIFICATIONS));
+ ContentSettingTypeToHistogramValue(
+ ContentSettingsType::NOTIFICATIONS, &num_values));
EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
static_cast<int64_t>(permissions::PermissionAction::REVOKED));
}
@@ -1991,17 +1996,15 @@ class SiteSettingsHandlerChooserExceptionTest : public SiteSettingsHandlerTest {
// Add the user granted permissions for testing.
// These two persistent device permissions should be lumped together with
// the policy permissions, since they apply to the same device and URL.
- chooser_context->GrantDevicePermission(kChromiumOrigin, kChromiumOrigin,
- *persistent_device_info_);
- chooser_context->GrantDevicePermission(kChromiumOrigin, kGoogleOrigin,
+ chooser_context->GrantDevicePermission(kChromiumOrigin,
*persistent_device_info_);
- chooser_context->GrantDevicePermission(kAndroidOrigin, kChromiumOrigin,
+ chooser_context->GrantDevicePermission(kGoogleOrigin,
*persistent_device_info_);
- chooser_context->GrantDevicePermission(kWebUIOrigin, kWebUIOrigin,
+ chooser_context->GrantDevicePermission(kWebUIOrigin,
*persistent_device_info_);
- chooser_context->GrantDevicePermission(kAndroidOrigin, kAndroidOrigin,
+ chooser_context->GrantDevicePermission(kAndroidOrigin,
*ephemeral_device_info_);
- chooser_context->GrantDevicePermission(kAndroidOrigin, kAndroidOrigin,
+ chooser_context->GrantDevicePermission(kAndroidOrigin,
*user_granted_device_info_);
// Add the policy granted permissions for testing.
@@ -2029,9 +2032,8 @@ class SiteSettingsHandlerChooserExceptionTest : public SiteSettingsHandlerTest {
base::DoNothing::Once<std::vector<device::mojom::UsbDeviceInfoPtr>>());
base::RunLoop().RunUntilIdle();
- const auto kAndroidOrigin = url::Origin::Create(AndroidUrl());
const auto kChromiumOrigin = url::Origin::Create(ChromiumUrl());
- chooser_context->GrantDevicePermission(kChromiumOrigin, kAndroidOrigin,
+ chooser_context->GrantDevicePermission(kChromiumOrigin,
*off_the_record_device_);
// Add the observer for permission changes.
@@ -2083,26 +2085,18 @@ class SiteSettingsHandlerChooserExceptionTest : public SiteSettingsHandlerTest {
// Iterate through the exception's sites array and return true if a site
// exception matches |requesting_origin| and |embedding_origin|.
- bool ChooserExceptionContainsSiteException(
- const base::Value& exception,
- const std::string& requesting_origin,
- const std::string& embedding_origin) {
+ bool ChooserExceptionContainsSiteException(const base::Value& exception,
+ const std::string& origin) {
const base::Value* sites = exception.FindListKey(site_settings::kSites);
if (!sites)
return false;
for (const auto& site : sites->GetList()) {
- const std::string* origin = site.FindStringKey(site_settings::kOrigin);
- if (!origin)
- continue;
- if (*origin != requesting_origin)
- continue;
-
- const std::string* exception_embedding_origin =
- site.FindStringKey(site_settings::kEmbeddingOrigin);
- if (!exception_embedding_origin)
+ const std::string* exception_origin =
+ site.FindStringKey(site_settings::kOrigin);
+ if (!exception_origin)
continue;
- if (*exception_embedding_origin == embedding_origin)
+ if (*exception_origin == origin)
return true;
}
return false;
@@ -2110,12 +2104,10 @@ class SiteSettingsHandlerChooserExceptionTest : public SiteSettingsHandlerTest {
// Iterate through the |exception_list| array and return true if there is a
// chooser exception with |display_name| that contains a site exception for
- // |requesting_origin| and |embedding_origin|.
- bool ChooserExceptionContainsSiteException(
- const base::Value& exceptions,
- const std::string& display_name,
- const std::string& requesting_origin,
- const std::string& embedding_origin) {
+ // |origin|.
+ bool ChooserExceptionContainsSiteException(const base::Value& exceptions,
+ const std::string& display_name,
+ const std::string& origin) {
if (!exceptions.is_list())
return false;
@@ -2126,8 +2118,7 @@ class SiteSettingsHandlerChooserExceptionTest : public SiteSettingsHandlerTest {
continue;
if (*exception_display_name == display_name) {
- return ChooserExceptionContainsSiteException(
- exception, requesting_origin, embedding_origin);
+ return ChooserExceptionContainsSiteException(exception, origin);
}
}
return false;
@@ -2157,8 +2148,8 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
// Don't include WebUI schemes.
const std::string kWebUIOriginStr = WebUIUrl().GetOrigin().spec();
- EXPECT_FALSE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kWebUIOriginStr, kWebUIOriginStr));
+ EXPECT_FALSE(ChooserExceptionContainsSiteException(exceptions, "Gizmo",
+ kWebUIOriginStr));
}
TEST_F(SiteSettingsHandlerChooserExceptionTest,
@@ -2206,8 +2197,10 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
.as_string();
const auto kAndroidOrigin = url::Origin::Create(AndroidUrl());
const auto kChromiumOrigin = url::Origin::Create(ChromiumUrl());
+ const auto kGoogleOrigin = url::Origin::Create(GoogleUrl());
const std::string kAndroidOriginStr = AndroidUrl().GetOrigin().spec();
const std::string kChromiumOriginStr = ChromiumUrl().GetOrigin().spec();
+ const std::string kGoogleOriginStr = GoogleUrl().GetOrigin().spec();
{
const base::Value& exceptions = GetChooserExceptionListFromWebUiCallData(
@@ -2220,15 +2213,15 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
// from the list.
base::ListValue args;
args.AppendString(kUsbChooserGroupName);
- args.AppendString(kAndroidOriginStr);
- args.AppendString(kChromiumOriginStr);
+ args.AppendString("https://unused.com");
+ args.AppendString(kGoogleOriginStr);
args.Append(base::Value::ToUniquePtrValue(
UsbChooserContext::DeviceInfoToValue(*persistent_device_info_)));
EXPECT_CALL(observer_, OnChooserObjectPermissionChanged(
ContentSettingsType::USB_GUARD,
ContentSettingsType::USB_CHOOSER_DATA));
- EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin, kChromiumOrigin));
+ EXPECT_CALL(observer_, OnPermissionRevoked(kGoogleOrigin));
handler()->HandleResetChooserExceptionForSite(&args);
// The HandleResetChooserExceptionForSite() method should have also caused the
@@ -2244,15 +2237,15 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
// Ensure that the sites list does not contain the URLs of the removed
// permission.
- EXPECT_FALSE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kAndroidOriginStr, kChromiumOriginStr));
+ EXPECT_FALSE(ChooserExceptionContainsSiteException(exceptions, "Gizmo",
+ kGoogleOriginStr));
}
// User granted USB permissions that are also granted by policy should not
// be able to be reset.
args.Clear();
args.AppendString(kUsbChooserGroupName);
- args.AppendString(kChromiumOriginStr);
+ args.AppendString("https://unused.com");
args.AppendString(kChromiumOriginStr);
args.Append(base::Value::ToUniquePtrValue(
UsbChooserContext::DeviceInfoToValue(*persistent_device_info_)));
@@ -2263,19 +2256,18 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
EXPECT_EQ(exceptions.GetList().size(), 5u);
// User granted exceptions that are also granted by policy are only
- // displayed through the policy granted site exception, so ensure that a
- // site exception entry for a requesting and embedding origin of
- // kChromiumOriginStr does not exist.
- EXPECT_TRUE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kChromiumOriginStr, std::string()));
- EXPECT_FALSE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kChromiumOriginStr, kChromiumOriginStr));
+ // displayed through the policy granted site exception, so ensure that the
+ // policy exception is present under the "Gizmo" device.
+ EXPECT_TRUE(ChooserExceptionContainsSiteException(exceptions, "Gizmo",
+ kChromiumOriginStr));
+ EXPECT_FALSE(ChooserExceptionContainsSiteException(exceptions, "Gizmo",
+ kGoogleOriginStr));
}
EXPECT_CALL(observer_, OnChooserObjectPermissionChanged(
ContentSettingsType::USB_GUARD,
ContentSettingsType::USB_CHOOSER_DATA));
- EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumOrigin, kChromiumOrigin));
+ EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumOrigin));
handler()->HandleResetChooserExceptionForSite(&args);
// The HandleResetChooserExceptionForSite() method should have also caused the
@@ -2287,12 +2279,16 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
kUsbChooserGroupName, /*expected_total_calls=*/8u);
EXPECT_EQ(exceptions.GetList().size(), 5u);
- // Ensure that the sites list still displays a site exception entry for a
- // requesting origin of kChromiumOriginStr and a wildcard embedding origin.
+ // Ensure that the sites list still displays a site exception entry for an
+ // origin of kGoogleOriginStr. Since now the device has had its
+ // permission revoked, the policy-provided object will not be able to deduce
+ // the name "Gizmo" from the connected device. As such we check that the
+ // policy is still active by looking for the genericly constructed name.
EXPECT_TRUE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kChromiumOriginStr, std::string()));
- EXPECT_FALSE(ChooserExceptionContainsSiteException(
- exceptions, "Gizmo", kChromiumOriginStr, kChromiumOriginStr));
+ exceptions, "Unknown product 0x162E from Google Inc.",
+ kChromiumOriginStr));
+ EXPECT_FALSE(ChooserExceptionContainsSiteException(exceptions, "Gizmo",
+ kGoogleOriginStr));
}
// User granted USB permissions that are not covered by policy should be able
@@ -2300,7 +2296,7 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
// when the exception only has one site exception granted to it..
args.Clear();
args.AppendString(kUsbChooserGroupName);
- args.AppendString(kAndroidOriginStr);
+ args.AppendString("https://unused.com");
args.AppendString(kAndroidOriginStr);
args.Append(base::Value::ToUniquePtrValue(
UsbChooserContext::DeviceInfoToValue(*user_granted_device_info_)));
@@ -2309,14 +2305,14 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
const base::Value& exceptions =
GetChooserExceptionListFromWebUiCallData(kUsbChooserGroupName, 9u);
EXPECT_EQ(exceptions.GetList().size(), 5u);
- EXPECT_TRUE(ChooserExceptionContainsSiteException(
- exceptions, "Widget", kAndroidOriginStr, kAndroidOriginStr));
+ EXPECT_TRUE(ChooserExceptionContainsSiteException(exceptions, "Widget",
+ kAndroidOriginStr));
}
EXPECT_CALL(observer_, OnChooserObjectPermissionChanged(
ContentSettingsType::USB_GUARD,
ContentSettingsType::USB_CHOOSER_DATA));
- EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin, kAndroidOrigin));
+ EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin));
handler()->HandleResetChooserExceptionForSite(&args);
// The HandleResetChooserExceptionForSite() method should have also caused the
@@ -2327,8 +2323,8 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest,
const base::Value& exceptions = GetChooserExceptionListFromWebUiCallData(
kUsbChooserGroupName, /*expected_total_calls=*/12u);
EXPECT_EQ(exceptions.GetList().size(), 4u);
- EXPECT_FALSE(ChooserExceptionContainsSiteException(
- exceptions, "Widget", kAndroidOriginStr, kAndroidOriginStr));
+ EXPECT_FALSE(ChooserExceptionContainsSiteException(exceptions, "Widget",
+ kAndroidOriginStr));
}
}
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc
index af39c456668..f92f91351d6 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -11,7 +11,6 @@
#include "base/containers/contains.h"
#include "base/feature_list.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/bluetooth/bluetooth_chooser_context.h"
@@ -113,6 +112,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
kBluetoothChooserDataGroupType},
{ContentSettingsType::WINDOW_PLACEMENT, "window-placement"},
{ContentSettingsType::FONT_ACCESS, "font-access"},
+ {ContentSettingsType::FILE_HANDLING, "file-handling"},
// Add new content settings here if a corresponding Javascript string
// representation for it is not required. Note some exceptions do have UI in
@@ -151,9 +151,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
{ContentSettingsType::DISPLAY_CAPTURE, nullptr},
};
-// TODO(crbug.com/1149878): After removing
-// ContentSettingsType::DEPRECATED_PLUGINS, remove +1.
-static_assert(base::size(kContentSettingsTypeGroupNames) + 1 ==
+static_assert(base::size(kContentSettingsTypeGroupNames) ==
// ContentSettingsType starts at -1, so add 1 here.
static_cast<int32_t>(ContentSettingsType::NUM_TYPES) + 1,
"kContentSettingsTypeGroupNames should have "
@@ -794,7 +792,7 @@ const ChooserTypeNameEntry* ChooserTypeFromGroupName(const std::string& name) {
// in a chooser permission exceptions table. The chooser permission will contain
// a list of site exceptions that correspond to the exception.
base::Value CreateChooserExceptionObject(
- const base::string16& display_name,
+ const std::u16string& display_name,
const base::Value& object,
const std::string& chooser_type,
const ChooserExceptionDetails& chooser_exception_details) {
@@ -880,32 +878,31 @@ base::Value GetChooserExceptionListFromProfile(
// Maps from a chooser exception name/object pair to a
// ChooserExceptionDetails. This will group and sort the exceptions by the UI
// string and object for display.
- std::map<std::pair<base::string16, base::Value>, ChooserExceptionDetails>
+ std::map<std::pair<std::u16string, base::Value>, ChooserExceptionDetails>
all_chooser_objects;
for (const auto& object : objects) {
// Don't include WebUI settings.
- if (content::HasWebUIScheme(object->requesting_origin))
+ if (content::HasWebUIScheme(object->origin))
continue;
- base::string16 name = chooser_context->GetObjectDisplayName(object->value);
+ std::u16string name = chooser_context->GetObjectDisplayName(object->value);
auto& chooser_exception_details =
all_chooser_objects[std::make_pair(name, object->value.Clone())];
std::string source = GetSourceStringForChooserException(
profile, content_type, object->source);
- const auto requesting_origin_source_pair =
- std::make_pair(object->requesting_origin, source);
- auto& embedding_origin_incognito_pair_set =
- chooser_exception_details[requesting_origin_source_pair];
+ const auto origin_source_pair = std::make_pair(object->origin, source);
+ auto& origin_incognito_pair_set =
+ chooser_exception_details[origin_source_pair];
- const auto embedding_origin_incognito_pair =
- std::make_pair(object->embedding_origin, object->incognito);
- embedding_origin_incognito_pair_set.insert(embedding_origin_incognito_pair);
+ const auto origin_incognito_pair =
+ std::make_pair(object->origin, object->incognito);
+ origin_incognito_pair_set.insert(origin_incognito_pair);
}
for (const auto& all_chooser_objects_entry : all_chooser_objects) {
- const base::string16& name = all_chooser_objects_entry.first.first;
+ const std::u16string& name = all_chooser_objects_entry.first.first;
const base::Value& object = all_chooser_objects_entry.first.second;
const ChooserExceptionDetails& chooser_exception_details =
all_chooser_objects_entry.second;
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.h b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.h
index 34704af033a..c2774159fcd 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.h
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.h
@@ -12,7 +12,6 @@
#include <utility>
#include <vector>
-#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
#include "components/content_settings/core/common/content_settings.h"
@@ -205,7 +204,7 @@ const ChooserTypeNameEntry* ChooserTypeFromGroupName(const std::string& name);
// The structure of the SiteException objects is the same as the objects
// returned by GetExceptionForPage().
base::Value CreateChooserExceptionObject(
- const base::string16& display_name,
+ const std::u16string& display_name,
const base::Value& object,
const std::string& chooser_type,
const ChooserExceptionDetails& chooser_exception_details);
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
index 93d30f0b05d..b4228e1061c 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -482,11 +482,14 @@ GURL ChromiumUrl() {
GURL AndroidUrl() {
return GURL("https://android.com");
}
+GURL TestUrl() {
+ return GURL("https://test.com");
+}
void ExpectValidChooserExceptionObject(
const base::Value& actual_exception_object,
const std::string& chooser_type,
- const base::string16& display_name,
+ const std::u16string& display_name,
const base::Value& chooser_object) {
const base::Value* chooser_type_value = actual_exception_object.FindKeyOfType(
kChooserType, base::Value::Type::STRING);
@@ -510,7 +513,6 @@ void ExpectValidChooserExceptionObject(
void ExpectValidSiteExceptionObject(const base::Value& actual_site_object,
const GURL& origin,
- const GURL& embedding_origin,
const std::string source,
bool incognito) {
ASSERT_TRUE(actual_site_object.is_dict());
@@ -525,12 +527,6 @@ void ExpectValidSiteExceptionObject(const base::Value& actual_site_object,
ASSERT_TRUE(origin_value);
EXPECT_EQ(origin_value->GetString(), origin.GetOrigin().spec());
- const base::Value* embedding_origin_value = actual_site_object.FindKeyOfType(
- kEmbeddingOrigin, base::Value::Type::STRING);
- ASSERT_TRUE(embedding_origin_value);
- EXPECT_EQ(embedding_origin_value->GetString(),
- embedding_origin.GetOrigin().spec());
-
const base::Value* setting_value =
actual_site_object.FindKeyOfType(kSetting, base::Value::Type::STRING);
ASSERT_TRUE(setting_value);
@@ -548,14 +544,6 @@ void ExpectValidSiteExceptionObject(const base::Value& actual_site_object,
EXPECT_EQ(incognito_value->GetBool(), incognito);
}
-void ExpectValidSiteExceptionObject(const base::Value& actual_site_object,
- const GURL& origin,
- const std::string source,
- bool incognito) {
- ExpectValidSiteExceptionObject(actual_site_object, origin, GURL::EmptyGURL(),
- source, incognito);
-}
-
} // namespace
TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) {
@@ -566,7 +554,7 @@ TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) {
SiteSettingSourceToString(SiteSettingSource::kPolicy);
const std::string& kPreferenceSource =
SiteSettingSourceToString(SiteSettingSource::kPreference);
- const base::string16& kObjectName = base::ASCIIToUTF16("Gadget");
+ const std::u16string& kObjectName = u"Gadget";
ChooserExceptionDetails exception_details;
// Create a chooser object for testing.
@@ -591,7 +579,6 @@ TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) {
const auto& sites_list = exception.FindKey(kSites)->GetList();
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
/*origin=*/GoogleUrl(),
- /*embedding_origin=*/ChromiumUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/false);
}
@@ -617,12 +604,10 @@ TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) {
const auto& sites_list = exception.FindKey(kSites)->GetList();
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
/*origin=*/AndroidUrl(),
- /*embedding_origin=*/AndroidUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/true);
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[1],
/*origin=*/GoogleUrl(),
- /*embedding_origin=*/ChromiumUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/false);
}
@@ -649,17 +634,14 @@ TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) {
const auto& sites_list = exception.FindKey(kSites)->GetList();
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
/*origin=*/GoogleUrl(),
- /*embedding_origin=*/GURL::EmptyGURL(),
/*source=*/kPolicySource,
/*incognito=*/false);
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[1],
/*origin=*/AndroidUrl(),
- /*embedding_origin=*/AndroidUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/true);
ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[2],
/*origin=*/GoogleUrl(),
- /*embedding_origin=*/ChromiumUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/false);
}
@@ -712,18 +694,16 @@ class SiteSettingsHelperChooserExceptionTest : public testing::Test {
const auto kAndroidOrigin = url::Origin::Create(AndroidUrl());
const auto kChromiumOrigin = url::Origin::Create(ChromiumUrl());
- const auto kGoogleOrigin = url::Origin::Create(GoogleUrl());
+ const auto kTestOrigin = url::Origin::Create(TestUrl());
- // Add the user granted permissions for testing.
- // These two persistent device permissions should be lumped together with
- // the policy permissions, since they apply to the same device and URL.
- chooser_context->GrantDevicePermission(kChromiumOrigin, kChromiumOrigin,
- *persistent_device_info);
- chooser_context->GrantDevicePermission(kChromiumOrigin, kGoogleOrigin,
+ // Add the user granted permissions for testing. "Gizmo" is allowed on two
+ // origins, one overlapping with the policy and one distinct. "Gadget" is
+ // allowed on one origin which is overlapping with the policy.
+ chooser_context->GrantDevicePermission(kTestOrigin,
*persistent_device_info);
- chooser_context->GrantDevicePermission(kAndroidOrigin, kChromiumOrigin,
+ chooser_context->GrantDevicePermission(kChromiumOrigin,
*persistent_device_info);
- chooser_context->GrantDevicePermission(kAndroidOrigin, kAndroidOrigin,
+ chooser_context->GrantDevicePermission(kAndroidOrigin,
*ephemeral_device_info);
// Add the policy granted permissions for testing.
@@ -775,8 +755,7 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
// This exception should describe the permissions for any device with the
// vendor ID corresponding to "Google Inc.". There are no user granted
// permissions that intersect with this permission, and this policy only
- // grants one permission to the following site pair:
- // * ("https://google.com", "https://android.com")
+ // grants one permission to the "https://android.com" origin.
{
const auto& exception = exceptions_list[0];
ExpectDisplayNameEq(exception,
@@ -785,16 +764,15 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
const auto& sites_list = exception.FindKey(kSites)->GetList();
ASSERT_EQ(sites_list.size(), 1u);
ExpectValidSiteExceptionObject(sites_list[0],
- /*origin=*/GoogleUrl(),
- /*embedding_origin=*/AndroidUrl(),
+ /*origin=*/AndroidUrl(),
/*source=*/kPolicySource,
/*incognito=*/false);
}
// This exception should describe the permissions for any device.
// There are no user granted permissions that intersect with this permission,
- // and this policy only grants one permission to the following site pair:
- // * ("https://google.com", "https://google.com")
+ // and this policy only grants one permission to the following site:
+ // "https://google.com".
{
const auto& exception = exceptions_list[1];
ExpectDisplayNameEq(exception,
@@ -804,7 +782,6 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
ASSERT_EQ(sites_list.size(), 1u);
ExpectValidSiteExceptionObject(sites_list[0],
/*origin=*/GoogleUrl(),
- /*embedding_origin=*/GoogleUrl(),
/*source=*/kPolicySource,
/*incognito=*/false);
}
@@ -812,8 +789,7 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
// This exception should describe the permissions for any device with the
// vendor ID 6354. There is a user granted permission for a device with that
// vendor ID, so the site list for this exception will only have the policy
- // granted permission, which is the following:
- // * ("https://android.com", "")
+ // granted permission, which is the following: "https://android.com"
{
const auto& exception = exceptions_list[2];
ExpectDisplayNameEq(exception,
@@ -829,17 +805,13 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
// This exception should describe the permissions for the "Gizmo" device.
// The user granted permissions are the following:
- // * ("https://chromium.org", "https://chromium.org")
- // * ("https://chromium.org", "https://google.com")
- // * ("https://android.com", "https://chromium.org")
+ // * "https://chromium.org"
+ // * "https://test.org"
// The policy granted permission is the following:
- // * ("https://chromium.org", "")
- // The embedding origin is a wildcard, so the policy granted permission covers
- // any user granted permissions that contain a requesting origin of
- // "https://chromium.org", so the site list for this exception will only have
- // the following permissions:
- // * ("https://chromium.org", "")
- // * ("https://android.com", "https://chromium.org")
+ // * "https://chromium.org"
+ // The chromium granted permission should be coalesced into the policy
+ // permissions. The test one does not overlap with any policy permission so
+ // it will be a separate preference-sourced exception.
{
const auto& exception = exceptions_list[3];
ExpectDisplayNameEq(exception, /*display_name=*/"Gizmo");
@@ -851,8 +823,7 @@ TEST_F(SiteSettingsHelperChooserExceptionTest,
/*source=*/kPolicySource,
/*incognito=*/false);
ExpectValidSiteExceptionObject(sites_list[1],
- /*origin=*/AndroidUrl(),
- /*embedding_origin=*/ChromiumUrl(),
+ /*origin=*/TestUrl(),
/*source=*/kPreferenceSource,
/*incognito=*/false);
}
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
index 964ad7e3728..9f58c55b674 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -12,7 +12,6 @@
#include "base/location.h"
#include "base/logging.h"
#include "base/macros.h"
-#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
#include "base/no_destructor.h"
@@ -162,11 +161,10 @@ void SetCurrentDiceTurnSyncOnHelper(Profile* profile,
// static
void DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(
- const base::string16& email,
- const base::string16& error_message,
+ const SigninUIError& error,
Browser* browser) {
LoginUIServiceFactory::GetForProfile(browser->profile())
- ->DisplayLoginResult(browser, error_message, email);
+ ->DisplayLoginResult(browser, error);
}
// static
@@ -283,8 +281,7 @@ DiceTurnSyncOnHelper::~DiceTurnSyncOnHelper() {
bool DiceTurnSyncOnHelper::HasCanOfferSigninError() {
SigninUIError can_offer_error =
- CanOfferSignin(profile_, CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
- account_info_.gaia, account_info_.email);
+ CanOfferSignin(profile_, account_info_.gaia, account_info_.email);
if (can_offer_error.IsOk())
return false;
@@ -319,8 +316,6 @@ void DiceTurnSyncOnHelper::OnMergeAccountConfirmation(SigninChoice choice) {
void DiceTurnSyncOnHelper::OnEnterpriseAccountConfirmation(
SigninChoice choice) {
- UMA_HISTOGRAM_ENUMERATION("Enterprise.UserSigninChoice", choice,
- DiceTurnSyncOnHelper::SIGNIN_CHOICE_SIZE);
switch (choice) {
case SIGNIN_CHOICE_CANCEL:
base::RecordAction(
@@ -442,7 +437,7 @@ void DiceTurnSyncOnHelper::CreateNewSignedInProfile() {
dice_signed_in_profile_creator_ =
std::make_unique<DiceSignedInProfileCreator>(
profile_, account_info_.account_id,
- /*local_profile_name=*/base::string16(), /*icon_index=*/base::nullopt,
+ /*local_profile_name=*/std::u16string(), /*icon_index=*/base::nullopt,
/*use_guest=*/false,
base::BindOnce(&DiceTurnSyncOnHelper::OnNewSignedInProfileCreated,
base::Unretained(this)));
@@ -596,14 +591,15 @@ void DiceTurnSyncOnHelper::FinishSyncSetupAndDelete(
DCHECK(primary_account_mutator);
primary_account_mutator->RevokeSyncConsent(
signin_metrics::ABORT_SIGNIN,
- signin_metrics::SignoutDelete::IGNORE_METRIC);
+ signin_metrics::SignoutDelete::kIgnoreMetric);
AbortAndDelete();
return;
}
// No explicit action when the ui gets closed. If the embedder wants the
// helper to abort sync in this case, it must redirect this action to
- // ABORT_SYNC.
+ // ABORT_SYNC. For UI_CLOSED, also no final callback is sent.
case LoginUIService::UI_CLOSED:
+ scoped_callback_runner_.ReplaceClosure(base::OnceClosure());
break;
}
delete this;
@@ -626,9 +622,6 @@ void DiceTurnSyncOnHelper::SwitchToProfile(Profile* new_profile) {
->Subscribe(base::AdaptCallbackForRepeating(base::BindOnce(
&DiceTurnSyncOnHelper::AbortAndDelete, base::Unretained(this))));
delegate_->SwitchToProfile(new_profile);
- // Since this is a fresh profile, it's better to remove the token if the user
- // aborts the signin.
- signin_aborted_mode_ = SigninAbortedMode::REMOVE_ACCOUNT;
}
void DiceTurnSyncOnHelper::AttachToProfile() {
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
index 186d279df43..7d82d7e357a 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
@@ -117,13 +117,10 @@ class DiceTurnSyncOnHelper
// Informs the delegate that the flow is switching to a new profile.
virtual void SwitchToProfile(Profile* new_profile) = 0;
- // Shows the login error with `error_message` and `email` for `browser`.
+ // Shows the `error` for `browser`.
// This helper is static because in some cases it needs to be called
// after this object gets destroyed.
- // TODO(crbug.com/1133189): Replace `email` and `error_message` with a
- // `SigninUIError`.
- static void ShowLoginErrorForBrowser(const base::string16& email,
- const base::string16& error_message,
+ static void ShowLoginErrorForBrowser(const SigninUIError& error,
Browser* browser);
// Shows the enterprise account confirmation dialog with `email` for
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
index b318d092d9e..5fb56a6a91a 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
@@ -87,8 +87,7 @@ DiceTurnSyncOnHelperDelegateImpl::~DiceTurnSyncOnHelperDelegateImpl() {
void DiceTurnSyncOnHelperDelegateImpl::ShowLoginError(
const SigninUIError& error) {
DCHECK(!error.IsOk());
- DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(
- error.email(), error.message(), browser_);
+ DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(error, browser_);
}
void DiceTurnSyncOnHelperDelegateImpl::ShowEnterpriseAccountConfirmation(
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index 5f0f4fa99ae..7330a25ae5e 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -35,10 +35,12 @@
#include "components/policy/core/common/management/management_service.h"
#include "components/policy/core/common/management/scoped_management_service_override_for_testing.h"
#include "components/prefs/pref_service.h"
+#include "components/signin/public/base/account_consistency_method.h"
#include "components/signin/public/base/signin_metrics.h"
#include "components/signin/public/base/signin_pref_names.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/signin/public/identity_manager/primary_account_mutator.h"
#include "components/sync/driver/mock_sync_service.h"
#include "components/sync/driver/sync_user_settings_mock.h"
#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
@@ -64,7 +66,7 @@ const signin_metrics::AccessPoint kAccessPoint =
const signin_metrics::PromoAction kSigninPromoAction =
signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT;
const signin_metrics::Reason kSigninReason =
- signin_metrics::Reason::REASON_REAUTHENTICATION;
+ signin_metrics::Reason::kReauthentication;
// Builds a testing profile with the right setup for this test.
std::unique_ptr<TestingProfile> BuildTestingProfile(
@@ -220,8 +222,12 @@ std::unique_ptr<TestingProfile> BuildTestingProfile(
base::BindRepeating(&FakeUserPolicySigninService::Build));
profile_builder.SetDelegate(delegate);
profile_builder.SetPath(path);
+ // Use |signin::AccountConsistencyMethod::kDice| to ensure that profiles are
+ // treated as they would when DICE is enabled and profiles are cleared when
+ // sync is revoked only is there is a refresh token error..
return IdentityTestEnvironmentProfileAdaptor::
- CreateProfileForIdentityTestEnvironment(profile_builder);
+ CreateProfileForIdentityTestEnvironment(
+ profile_builder, signin::AccountConsistencyMethod::kDice);
}
} // namespace
@@ -273,6 +279,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
// Basic accessors.
Profile* profile() { return profile_.get(); }
+ Profile* new_profile() { return new_profile_; }
signin::IdentityTestEnvironment* identity_test_env() {
return identity_test_env_profile_adaptor_->identity_test_env();
}
@@ -462,6 +469,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
EXPECT_NE(initial_device_id(),
GetSigninScopedDeviceIdForProfile(new_profile));
+ new_profile_ = new_profile;
switched_to_new_profile_ = true;
}
@@ -530,6 +538,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
std::string merge_data_previous_email_;
std::string merge_data_new_email_;
bool switched_to_new_profile_ = false;
+ Profile* new_profile_ = nullptr;
bool sync_confirmation_shown_ = false;
SyncDisabledConfirmation sync_disabled_confirmation_ = kNotShown;
bool sync_settings_shown_ = false;
@@ -844,6 +853,42 @@ TEST_F(DiceTurnSyncOnHelperTest, EnterpriseConfirmationNewProfile) {
CheckDelegateCalls();
}
+// Test that the unconsented primary account is kept if the user creates a new
+// account and cancels sync activation.
+TEST_F(DiceTurnSyncOnHelperTest, SignedInAccountUndoSyncKeepAccount) {
+ // Set expectations.
+ expected_enterprise_confirmation_email_ = kEnterpriseEmail;
+ expected_switched_to_new_profile_ = true;
+ expected_sync_confirmation_shown_ = true;
+ sync_confirmation_result_ =
+ LoginUIService::SyncConfirmationUIClosedResult::ABORT_SYNC;
+ SetExpectationsForSyncStartupCompletedForNextProfileCreated();
+ // Configure the test.
+ user_policy_signin_service()->set_dm_token("foo");
+ user_policy_signin_service()->set_client_id("bar");
+ enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
+ UseEnterpriseAccount();
+ identity_manager()->GetPrimaryAccountMutator()->SetUnconsentedPrimaryAccount(
+ account_id());
+
+ // Signin flow.
+ CreateDiceTurnOnSyncHelper(
+ DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+ // Check expectations.
+ base::RunLoop().RunUntilIdle(); // Profile creation is asynchronous.
+ EXPECT_FALSE(
+ identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
+ EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id()));
+
+ DCHECK(new_profile());
+ auto* new_identity_manager =
+ IdentityManagerFactory::GetForProfile(new_profile());
+ DCHECK_NE(new_identity_manager, identity_manager());
+ EXPECT_EQ(account_id(), new_identity_manager->GetPrimaryAccountId(
+ signin::ConsentLevel::kSignin));
+ CheckDelegateCalls();
+}
+
// Tests that the sync confirmation is shown and the user can abort.
TEST_F(DiceTurnSyncOnHelperTest, UndoSync) {
// Set expectations.
diff --git a/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
new file mode 100644
index 00000000000..5da506c1261
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
@@ -0,0 +1,211 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/policy/chrome_browser_policy_connector.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_attributes_entry.h"
+#include "chrome/browser/profiles/profile_avatar_icon_util.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/managed_ui.h"
+#include "chrome/browser/ui/webui/management/management_ui_handler.h"
+#include "chrome/common/themes/autogenerated_theme_util.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/strings/grit/components_strings.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/color_utils.h"
+#include "ui/gfx/image/image.h"
+
+namespace {
+const int kAvatarSize = 100;
+
+std::string GetManagedAccountTitle(ProfileAttributesEntry* entry,
+ const std::string& fallback_domain_name) {
+ DCHECK(entry);
+ if (entry->GetHostedDomain() == kNoHostedDomainFound)
+ return std::string();
+ const std::string domain_name = entry->GetHostedDomain().empty()
+ ? fallback_domain_name
+ : entry->GetHostedDomain();
+ return l10n_util::GetStringFUTF8(
+ IDS_ENTERPRISE_PROFILE_WELCOME_ACCOUNT_MANAGED_BY,
+ base::UTF8ToUTF16(domain_name));
+}
+
+std::string GetManagedDeviceTitle() {
+ base::Optional<std::string> device_manager =
+ chrome::GetDeviceManagerIdentity();
+ if (!device_manager)
+ return std::string();
+ if (device_manager->empty()) {
+ return l10n_util::GetStringUTF8(
+ IDS_ENTERPRISE_PROFILE_WELCOME_DEVICE_MANAGED);
+ }
+ return l10n_util::GetStringFUTF8(
+ IDS_ENTERPRISE_PROFILE_WELCOME_DEVICE_MANAGED_BY,
+ base::UTF8ToUTF16(*device_manager));
+}
+
+SkColor GetFrameColor(SkColor theme_color) {
+ auto theme_colors = GetAutogeneratedThemeColors(theme_color);
+ return theme_colors.frame_color;
+}
+
+} // namespace
+
+EnterpriseProfileWelcomeHandler::EnterpriseProfileWelcomeHandler(
+ EnterpriseProfileWelcomeUI::ScreenType type,
+ const std::string& domain_name,
+ SkColor profile_color,
+ base::OnceCallback<void(bool)> proceed_callback)
+ : type_(type),
+ domain_name_(domain_name),
+ profile_color_(profile_color),
+ proceed_callback_(std::move(proceed_callback)) {
+ DCHECK(proceed_callback_);
+}
+
+EnterpriseProfileWelcomeHandler::~EnterpriseProfileWelcomeHandler() = default;
+
+void EnterpriseProfileWelcomeHandler::RegisterMessages() {
+ profile_path_ = Profile::FromWebUI(web_ui())->GetPath();
+ web_ui()->RegisterMessageCallback(
+ "initialized",
+ base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleInitialized,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "proceed",
+ base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleProceed,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "cancel",
+ base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleCancel,
+ base::Unretained(this)));
+}
+
+void EnterpriseProfileWelcomeHandler::OnProfileAvatarChanged(
+ const base::FilePath& profile_path) {
+ UpdateProfileInfo(profile_path);
+}
+
+void EnterpriseProfileWelcomeHandler::OnProfileHighResAvatarLoaded(
+ const base::FilePath& profile_path) {
+ UpdateProfileInfo(profile_path);
+}
+
+void EnterpriseProfileWelcomeHandler::OnProfileHostedDomainChanged(
+ const base::FilePath& profile_path) {
+ UpdateProfileInfo(profile_path);
+}
+
+void EnterpriseProfileWelcomeHandler::OnJavascriptAllowed() {
+ observed_profile_.Observe(
+ &g_browser_process->profile_manager()->GetProfileAttributesStorage());
+}
+
+void EnterpriseProfileWelcomeHandler::OnJavascriptDisallowed() {
+ observed_profile_.Reset();
+}
+
+void EnterpriseProfileWelcomeHandler::HandleInitialized(
+ const base::ListValue* args) {
+ CHECK_EQ(1u, args->GetSize());
+ AllowJavascript();
+ const base::Value& callback_id = args->GetList()[0];
+ ResolveJavascriptCallback(callback_id, GetProfileInfoValue());
+}
+
+void EnterpriseProfileWelcomeHandler::HandleProceed(
+ const base::ListValue* args) {
+ if (proceed_callback_)
+ std::move(proceed_callback_).Run(true);
+}
+
+void EnterpriseProfileWelcomeHandler::HandleCancel(
+ const base::ListValue* args) {
+ if (proceed_callback_)
+ std::move(proceed_callback_).Run(false);
+}
+
+void EnterpriseProfileWelcomeHandler::UpdateProfileInfo(
+ const base::FilePath& profile_path) {
+ DCHECK(IsJavascriptAllowed());
+ if (profile_path != profile_path_)
+ return;
+ FireWebUIListener("on-profile-info-changed", GetProfileInfoValue());
+}
+
+base::Value EnterpriseProfileWelcomeHandler::GetProfileInfoValue() {
+ base::Value dict(base::Value::Type::DICTIONARY);
+ dict.SetStringKey("backgroundColor", color_utils::SkColorToRgbaString(
+ GetFrameColor(profile_color_)));
+
+ ProfileAttributesEntry* entry = GetProfileEntry();
+ const int avatar_icon_size = kAvatarSize * web_ui()->GetDeviceScaleFactor();
+ gfx::Image icon =
+ profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), true,
+ avatar_icon_size, avatar_icon_size);
+ dict.SetStringKey("pictureUrl", webui::GetBitmapDataUrl(icon.AsBitmap()));
+
+ std::string enterprise_title;
+ std::string enterprise_info;
+
+ switch (type_) {
+ case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled:
+ dict.SetBoolKey("showEnterpriseBadge", true);
+ enterprise_title = GetManagedAccountTitle(entry, domain_name_);
+ enterprise_info = l10n_util::GetStringUTF8(
+ IDS_ENTERPRISE_PROFILE_WELCOME_MANAGED_DESCRIPTION_WITH_SYNC);
+ dict.SetStringKey("proceedLabel", "Next");
+ break;
+ case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncDisabled:
+ dict.SetBoolKey("showEnterpriseBadge", true);
+ enterprise_title = GetManagedAccountTitle(entry, domain_name_);
+ enterprise_info = l10n_util ::GetStringUTF8(
+ IDS_ENTERPRISE_PROFILE_WELCOME_MANAGED_DESCRIPTION_WITHOUT_SYNC);
+ dict.SetStringKey("proceedLabel", l10n_util::GetStringUTF8(IDS_DONE));
+ break;
+ case EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled:
+ dict.SetBoolKey("showEnterpriseBadge", false);
+ enterprise_title = GetManagedDeviceTitle();
+ enterprise_info =
+ l10n_util::GetStringUTF8(IDS_SYNC_DISABLED_CONFIRMATION_DETAILS);
+ dict.SetStringKey("proceedLabel", l10n_util::GetStringUTF8(IDS_DONE));
+ break;
+ }
+
+ dict.SetStringKey("enterpriseTitle", enterprise_title);
+ dict.SetStringKey("enterpriseInfo", enterprise_info);
+
+ return dict;
+}
+
+ProfileAttributesEntry* EnterpriseProfileWelcomeHandler::GetProfileEntry()
+ const {
+ ProfileAttributesEntry* entry =
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetProfileAttributesWithPath(profile_path_);
+ DCHECK(entry);
+ return entry;
+}
+
+EnterpriseProfileWelcomeUI::ScreenType
+EnterpriseProfileWelcomeHandler::GetTypeForTesting() {
+ return type_;
+}
+
+void EnterpriseProfileWelcomeHandler::CallProceedCallbackForTesting(
+ bool proceed) {
+ if (proceed_callback_)
+ std::move(proceed_callback_).Run(proceed);
+}
diff --git a/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h
new file mode 100644
index 00000000000..80bca308999
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h
@@ -0,0 +1,84 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
+
+#include <string>
+
+#include "base/callback.h"
+#include "base/files/file_path.h"
+#include "base/scoped_observation.h"
+#include "base/values.h"
+#include "chrome/browser/profiles/profile_attributes_storage.h"
+#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "content/public/browser/web_ui_message_handler.h"
+#include "third_party/skia/include/core/SkColor.h"
+
+namespace base {
+class FilePath;
+}
+
+// WebUI message handler for the welcome screen for enterprise profiles in the
+// profile creation flow.
+class EnterpriseProfileWelcomeHandler
+ : public content::WebUIMessageHandler,
+ public ProfileAttributesStorage::Observer {
+ public:
+ EnterpriseProfileWelcomeHandler(
+ EnterpriseProfileWelcomeUI::ScreenType type,
+ const std::string& domain_name,
+ SkColor profile_color,
+ base::OnceCallback<void(bool)> proceed_callback);
+ ~EnterpriseProfileWelcomeHandler() override;
+
+ EnterpriseProfileWelcomeHandler(const EnterpriseProfileWelcomeHandler&) =
+ delete;
+ EnterpriseProfileWelcomeHandler& operator=(
+ const EnterpriseProfileWelcomeHandler&) = delete;
+
+ // content::WebUIMessageHandler:
+ void RegisterMessages() override;
+ void OnJavascriptAllowed() override;
+ void OnJavascriptDisallowed() override;
+
+ // ProfileAttributesStorage::Observer:
+ void OnProfileAvatarChanged(const base::FilePath& profile_path) override;
+ void OnProfileHighResAvatarLoaded(
+ const base::FilePath& profile_path) override;
+ void OnProfileHostedDomainChanged(
+ const base::FilePath& profile_path) override;
+
+ // Access to construction parameters for tests.
+ EnterpriseProfileWelcomeUI::ScreenType GetTypeForTesting();
+ void CallProceedCallbackForTesting(bool proceed);
+
+ private:
+ void HandleInitialized(const base::ListValue* args);
+ void HandleProceed(const base::ListValue* args);
+ void HandleCancel(const base::ListValue* args);
+
+ // Sends an updated profile info (avatar and colors) to the WebUI.
+ // `profile_path` is the path of the profile being updated, this function does
+ // nothing if the profile path does not match the current profile.
+ void UpdateProfileInfo(const base::FilePath& profile_path);
+
+ // Computes the profile info (avatar and colors) to be sent to the WebUI.
+ base::Value GetProfileInfoValue();
+
+ // Returns the ProfilesAttributesEntry associated with the current profile.
+ ProfileAttributesEntry* GetProfileEntry() const;
+
+ base::FilePath profile_path_;
+ base::ScopedObservation<ProfileAttributesStorage,
+ ProfileAttributesStorage::Observer>
+ observed_profile_{this};
+
+ const EnterpriseProfileWelcomeUI::ScreenType type_;
+ const std::string domain_name_;
+ SkColor profile_color_;
+ base::OnceCallback<void(bool)> proceed_callback_;
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
new file mode 100644
index 00000000000..45d64d69144
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
@@ -0,0 +1,65 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+
+#include "base/callback_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "services/network/public/mojom/content_security_policy.mojom.h"
+#include "ui/base/webui/resource_path.h"
+#include "ui/resources/grit/webui_generated_resources.h"
+
+EnterpriseProfileWelcomeUI::EnterpriseProfileWelcomeUI(content::WebUI* web_ui)
+ : content::WebUIController(web_ui) {
+ content::WebUIDataSource* source = content::WebUIDataSource::Create(
+ chrome::kChromeUIEnterpriseProfileWelcomeHost);
+ webui::SetJSModuleDefaults(source);
+
+ source->SetDefaultResource(IDR_ENTERPRISE_PROFILE_WELCOME_HTML);
+ static constexpr webui::ResourcePath kResources[] = {
+ {"enterprise_profile_welcome_app.js",
+ IDR_ENTERPRISE_PROFILE_WELCOME_APP_JS},
+ {"enterprise_profile_welcome_browser_proxy.js",
+ IDR_ENTERPRISE_PROFILE_WELCOME_BROWSER_PROXY_JS},
+ {"images/enterprise_profile_welcome_illustration.svg",
+ IDR_ENTERPRISE_PROFILE_WELCOME_ILLUSTRATION_SVG},
+ {"signin_shared_css.js", IDR_SIGNIN_SHARED_CSS_JS},
+ {"signin_vars_css.js", IDR_SIGNIN_VARS_CSS_JS},
+ };
+ source->AddResourcePaths(kResources);
+
+ source->AddLocalizedString("enterpriseProfileWelcomeTitle",
+ IDS_ENTERPRISE_PROFILE_WELCOME_TITLE);
+ source->AddLocalizedString("cancelLabel", IDS_CANCEL);
+
+ content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
+}
+
+EnterpriseProfileWelcomeUI::~EnterpriseProfileWelcomeUI() = default;
+
+void EnterpriseProfileWelcomeUI::Initialize(
+ EnterpriseProfileWelcomeUI::ScreenType type,
+ const std::string& domain_name,
+ SkColor profile_color,
+ base::OnceCallback<void(bool)> proceed_callback) {
+ auto handler = std::make_unique<EnterpriseProfileWelcomeHandler>(
+ type, domain_name, profile_color, std::move(proceed_callback));
+ handler_ = handler.get();
+ web_ui()->AddMessageHandler(std::move(handler));
+}
+
+EnterpriseProfileWelcomeHandler*
+EnterpriseProfileWelcomeUI::GetHandlerForTesting() {
+ return handler_;
+}
+
+WEB_UI_CONTROLLER_TYPE_IMPL(EnterpriseProfileWelcomeUI)
diff --git a/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h
new file mode 100644
index 00000000000..3e6c7d73ebf
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h
@@ -0,0 +1,50 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
+
+#include "base/callback.h"
+#include "content/public/browser/web_ui_controller.h"
+#include "third_party/skia/include/core/SkColor.h"
+
+class EnterpriseProfileWelcomeHandler;
+
+namespace content {
+class WebUI;
+}
+
+class EnterpriseProfileWelcomeUI : public content::WebUIController {
+ public:
+ // Type of a welcome screen for the enterprise flow.
+ enum class ScreenType {
+ kEntepriseAccountSyncEnabled,
+ kEntepriseAccountSyncDisabled,
+ kConsumerAccountSyncDisabled
+ };
+
+ explicit EnterpriseProfileWelcomeUI(content::WebUI* web_ui);
+ ~EnterpriseProfileWelcomeUI() override;
+
+ EnterpriseProfileWelcomeUI(const EnterpriseProfileWelcomeUI&) = delete;
+ EnterpriseProfileWelcomeUI& operator=(const EnterpriseProfileWelcomeUI&) =
+ delete;
+
+ // Initializes the EnterpriseProfileWelcomeUI.
+ void Initialize(ScreenType type,
+ const std::string& domain_name,
+ SkColor profile_color,
+ base::OnceCallback<void(bool)> proceed_callback);
+
+ // Allows tests to trigger page events.
+ EnterpriseProfileWelcomeHandler* GetHandlerForTesting();
+
+ private:
+ // Stored for tests.
+ EnterpriseProfileWelcomeHandler* handler_ = nullptr;
+
+ WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
index 97b05489183..10c39c3e16f 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
@@ -45,6 +45,13 @@ InlineLoginDialogChromeOS* dialog = nullptr;
constexpr int kSigninDialogWidth = 768;
constexpr int kSigninDialogHeight = 640;
+// The EDU Coexistence signin dialog uses different dimensions
+// that match the dimensions of the equivalent OOBE
+// dialog, and are required for the size of the web content
+// that the dialog hosts.
+constexpr int kEduCoexistenceSigninDialogWidth = 1040;
+constexpr int kEduCoexistenceSigninDialogHeight = 680;
+
bool IsDeviceAccountEmail(const std::string& email) {
auto* active_user = user_manager::UserManager::Get()->GetActiveUser();
return active_user &&
@@ -104,14 +111,6 @@ void InlineLoginDialogChromeOS::ShowDeprecated(
ShowDeprecated(/* email= */ std::string(), source);
}
-// static
-void InlineLoginDialogChromeOS::UpdateEduCoexistenceFlowResult(
- EduCoexistenceFlowResult result) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- if (dialog)
- dialog->SetEduCoexistenceFlowResult(result);
-}
-
void InlineLoginDialogChromeOS::AdjustWidgetInitParams(
views::Widget::InitParams* params) {
params->z_order = ui::ZOrderLevel::kNormal;
@@ -144,16 +143,11 @@ void InlineLoginDialogChromeOS::RemoveObserver(
modal_dialog_host_observer_list_.RemoveObserver(observer);
}
-void InlineLoginDialogChromeOS::SetEduCoexistenceFlowResult(
- EduCoexistenceFlowResult result) {
- edu_coexistence_flow_result_ = result;
-}
-
InlineLoginDialogChromeOS::InlineLoginDialogChromeOS()
: InlineLoginDialogChromeOS(GetInlineLoginUrl(std::string())) {}
InlineLoginDialogChromeOS::InlineLoginDialogChromeOS(const GURL& url)
- : SystemWebDialogDelegate(url, base::string16() /* title */),
+ : SystemWebDialogDelegate(url, std::u16string() /* title */),
delegate_(this),
url_(url) {
DCHECK(!dialog);
@@ -163,7 +157,7 @@ InlineLoginDialogChromeOS::InlineLoginDialogChromeOS(const GURL& url)
InlineLoginDialogChromeOS::InlineLoginDialogChromeOS(
const GURL& url,
base::OnceClosure close_dialog_closure)
- : SystemWebDialogDelegate(url, base::string16() /* title */),
+ : SystemWebDialogDelegate(url, std::u16string() /* title */),
delegate_(this),
url_(url),
close_dialog_closure_(std::move(close_dialog_closure)) {
@@ -192,6 +186,16 @@ InlineLoginDialogChromeOS::~InlineLoginDialogChromeOS() {
void InlineLoginDialogChromeOS::GetDialogSize(gfx::Size* size) const {
const display::Display display =
display::Screen::GetScreen()->GetDisplayNearestWindow(dialog_window());
+
+ if (ProfileManager::GetActiveUserProfile()->IsChild() &&
+ base::FeatureList::IsEnabled(supervised_users::kEduCoexistenceFlowV2)) {
+ size->SetSize(
+ std::min(kEduCoexistenceSigninDialogWidth, display.work_area().width()),
+ std::min(kEduCoexistenceSigninDialogHeight,
+ display.work_area().height()));
+ return;
+ }
+
size->SetSize(std::min(kSigninDialogWidth, display.work_area().width()),
std::min(kSigninDialogHeight, display.work_area().height()));
}
@@ -216,12 +220,6 @@ void InlineLoginDialogChromeOS::OnDialogShown(content::WebUI* webui) {
}
void InlineLoginDialogChromeOS::OnDialogClosed(const std::string& json_retval) {
- if (ProfileManager::GetActiveUserProfile()->IsChild() &&
- !base::FeatureList::IsEnabled(supervised_users::kEduCoexistenceFlowV2)) {
- DCHECK(edu_coexistence_flow_result_.has_value());
- base::UmaHistogramEnumeration("AccountManager.EduCoexistence.FlowResult",
- edu_coexistence_flow_result_.value());
- }
SystemWebDialogDelegate::OnDialogClosed(json_retval);
}
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h
index 013153af41b..21e3479e86f 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h
@@ -8,9 +8,9 @@
#include <string>
#include "ash/components/account_manager/account_manager.h"
+#include "base/callback_helpers.h"
#include "base/macros.h"
#include "base/observer_list.h"
-#include "base/optional.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h"
#include "components/account_manager_core/account_manager_facade.h"
@@ -31,21 +31,6 @@ namespace chromeos {
class InlineLoginDialogChromeOS : public SystemWebDialogDelegate,
public web_modal::WebContentsModalDialogHost {
public:
- // Represents the last reached step in the flow.
- // Keep in sync with
- // chrome/browser/resources/chromeos/edu_login/edu_login_util.js
- // Used in UMA, do not delete or reorder values.
- // Note: Please update enums.xml after adding new values.
- enum class EduCoexistenceFlowResult : int {
- kParentsListScreen = 0,
- kParentPasswordScreen = 1,
- kParentInfoScreen1 = 2,
- kParentInfoScreen2 = 3,
- kEduAccountLoginScreen = 4,
- kFlowCompleted = 5,
- kMaxValue = kFlowCompleted
- };
-
static bool IsShown();
// Displays the dialog. |email| pre-fills the account email field in the
@@ -66,10 +51,6 @@ class InlineLoginDialogChromeOS : public SystemWebDialogDelegate,
const ::account_manager::AccountManagerFacade::AccountAdditionSource&
source);
- // Updates the value of the last reached step in 'Add Account' flow for child
- // users. Before the dialog will close, this value will be reported to UMA.
- static void UpdateEduCoexistenceFlowResult(EduCoexistenceFlowResult result);
-
// ui::SystemWebDialogDelegate overrides.
void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
@@ -80,8 +61,6 @@ class InlineLoginDialogChromeOS : public SystemWebDialogDelegate,
void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
- void SetEduCoexistenceFlowResult(EduCoexistenceFlowResult result);
-
protected:
InlineLoginDialogChromeOS();
explicit InlineLoginDialogChromeOS(const GURL& url);
@@ -118,7 +97,6 @@ class InlineLoginDialogChromeOS : public SystemWebDialogDelegate,
InlineLoginHandlerModalDelegate delegate_;
const GURL url_;
- base::Optional<EduCoexistenceFlowResult> edu_coexistence_flow_result_;
base::OnceClosure close_dialog_closure_;
base::ObserverList<web_modal::ModalDialogHostObserver>::Unchecked
modal_dialog_host_observer_list_;
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc
index 3eef888c118..868fd642b1d 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc
@@ -84,6 +84,12 @@ InlineLoginDialogChromeOSOnboarding* InlineLoginDialogChromeOSOnboarding::Show(
return dialog;
}
+ui::ModalType InlineLoginDialogChromeOSOnboarding::GetDialogModalType() const {
+ // Override the default system-modal behavior of the dialog so that the
+ // shelf can be accessed during onboarding.
+ return ui::ModalType::MODAL_TYPE_WINDOW;
+}
+
InlineLoginDialogChromeOSOnboarding::InlineLoginDialogChromeOSOnboarding(
const gfx::Size& size,
base::OnceCallback<void(void)> dialog_closed_callback)
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h
index 1a6989712da..c5592297e3c 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h
@@ -8,6 +8,7 @@
#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h"
#include "base/callback.h"
+#include "ui/base/ui_base_types.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/widget/widget_observer.h"
@@ -55,6 +56,10 @@ class InlineLoginDialogChromeOSOnboarding : public InlineLoginDialogChromeOS {
gfx::NativeWindow window,
base::OnceCallback<void(void)> dialog_closed_callback);
+ protected:
+ // ui::WebDialogDelegate overrides
+ ui::ModalType GetDialogModalType() const override;
+
private:
InlineLoginDialogChromeOSOnboarding(
const gfx::Size& bounds,
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
index 25a5f214eb4..5091acb587b 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -111,9 +111,8 @@ void InlineLoginHandler::ContinueHandleInitializeMessage() {
signin_metrics::Reason reason =
signin::GetSigninReasonForEmbeddedPromoURL(current_url);
- if (reason != signin_metrics::Reason::REASON_REAUTHENTICATION &&
- reason != signin_metrics::Reason::REASON_UNLOCK &&
- reason != signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT) {
+ if (reason != signin_metrics::Reason::kReauthentication &&
+ reason != signin_metrics::Reason::kAddSecondaryAccount) {
signin_metrics::LogSigninAccessPointStarted(
access_point,
signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO);
@@ -126,8 +125,8 @@ void InlineLoginHandler::ContinueHandleInitializeMessage() {
Profile* profile = Profile::FromWebUI(web_ui());
std::string default_email;
- if (reason == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT ||
- reason == signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT) {
+ if (reason == signin_metrics::Reason::kSigninPrimaryAccount ||
+ reason == signin_metrics::Reason::kForcedSigninPrimaryAccount) {
default_email =
profile->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername);
} else {
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index d22510b08c4..c7478da62c6 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -11,11 +11,12 @@
#include "ash/components/account_manager/account_manager_factory.h"
#include "ash/constants/ash_pref_names.h"
#include "base/base64.h"
+#include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/macros.h"
-#include "base/metrics/histogram_macros.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/values.h"
+#include "chrome/browser/account_manager_facade_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h"
@@ -30,6 +31,7 @@
#include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h"
#include "chrome/common/pref_names.h"
#include "chromeos/dbus/util/version_loader.h"
+#include "components/account_manager_core/account_manager_facade.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/identity_manager/account_info.h"
@@ -71,7 +73,7 @@ std::string GetInlineLoginFlowName(Profile* profile, const std::string* email) {
std::string primary_account_email =
IdentityManagerFactory::GetForProfile(profile)
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+ ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
.email;
// If provided email is for primary account - it's a reauthentication, use
// normal add account flow.
@@ -136,7 +138,6 @@ class ChildSigninHelper : public SigninHelper {
void OnConsentLogged(const std::string& refresh_token,
SecondaryAccountConsentLogger::Result result) {
- UMA_HISTOGRAM_ENUMERATION("Signin.SecondaryAccountConsentLog", result);
secondary_account_consent_logger_.reset();
if (result == SecondaryAccountConsentLogger::Result::kSuccess) {
// The EDU account has been added/re-authenticated. Mark migration to
@@ -333,8 +334,7 @@ void InlineLoginHandlerChromeOS::CompleteLogin(const std::string& email,
signin::IdentityManager* identity_manager =
IdentityManagerFactory::GetForProfile(profile);
std::string primary_account_email =
- identity_manager
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+ identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
.email;
// Child user added a secondary account.
@@ -348,8 +348,6 @@ void InlineLoginHandlerChromeOS::CompleteLogin(const std::string& email,
const std::string* parentId =
edu_login_params.FindStringKey("parentObfuscatedGaiaId");
CHECK(parentId);
- InlineLoginDialogChromeOS::UpdateEduCoexistenceFlowResult(
- InlineLoginDialogChromeOS::EduCoexistenceFlowResult::kFlowCompleted);
// ChildSigninHelper deletes itself after its work is done.
new ChildSigninHelper(
@@ -392,13 +390,9 @@ void InlineLoginHandlerChromeOS::GetAccountsInSession(
const base::ListValue* args) {
const std::string& callback_id = args->GetList()[0].GetString();
const Profile* profile = Profile::FromWebUI(web_ui());
- auto* account_manager = g_browser_process->platform_part()
- ->GetAccountManagerFactory()
- ->GetAccountManager(profile->GetPath().value());
-
- account_manager->GetAccounts(
- base::BindOnce(&InlineLoginHandlerChromeOS::OnGetAccounts,
- weak_factory_.GetWeakPtr(), callback_id));
+ ::GetAccountManagerFacade(profile->GetPath().value())
+ ->GetAccounts(base::BindOnce(&InlineLoginHandlerChromeOS::OnGetAccounts,
+ weak_factory_.GetWeakPtr(), callback_id));
}
void InlineLoginHandlerChromeOS::OnGetAccounts(
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
index 673f0fc9459..6697d28e1c7 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -19,7 +19,6 @@
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
#include "base/single_thread_task_runner.h"
-#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -37,9 +36,10 @@
#include "chrome/browser/signin/account_consistency_mode_manager.h"
#include "chrome/browser/signin/chrome_device_id_helper.h"
#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/signin/local_auth.h"
#include "chrome/browser/signin/signin_promo.h"
#include "chrome/browser/signin/signin_util.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
@@ -93,7 +93,6 @@ namespace {
// InlineLoginHandlerImpl.
enum class HandlerSigninReason {
FORCED_SIGNIN_PRIMARY_ACCOUNT,
- UNLOCK,
FETCH_LST_ONLY
};
@@ -102,11 +101,9 @@ HandlerSigninReason GetHandlerSigninReason(const GURL& url) {
signin_metrics::Reason reason =
signin::GetSigninReasonForEmbeddedPromoURL(url);
switch (reason) {
- case signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT:
+ case signin_metrics::Reason::kForcedSigninPrimaryAccount:
return HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT;
- case signin_metrics::Reason::REASON_UNLOCK:
- return HandlerSigninReason::UNLOCK;
- case signin_metrics::Reason::REASON_FETCH_LST_ONLY:
+ case signin_metrics::Reason::kFetchLstOnly:
return HandlerSigninReason::FETCH_LST_ONLY;
default:
NOTREACHED() << "Unexpected signin reason: " << static_cast<int>(reason);
@@ -114,19 +111,6 @@ HandlerSigninReason GetHandlerSigninReason(const GURL& url) {
}
}
-// Converts from HandlerSigninReason to signin_metrics::Reason.
-signin_metrics::Reason GetSigninReasonFromHandlerSigninReason(
- HandlerSigninReason r) {
- switch (r) {
- case HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT:
- return signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT;
- case HandlerSigninReason::UNLOCK:
- return signin_metrics::Reason::REASON_UNLOCK;
- case HandlerSigninReason::FETCH_LST_ONLY:
- return signin_metrics::Reason::REASON_FETCH_LST_ONLY;
- }
-}
-
// Specific implementation of DiceTurnSyncOnHelper::Delegate for forced
// signin flows. Some confirmation prompts are skipped.
class ForcedSigninDiceTurnSyncOnHelperDelegate
@@ -237,7 +221,7 @@ void SetProfileLocked(const base::FilePath profile_path, bool locked) {
}
void SetProfileName(const base::FilePath& profile_path,
- const base::string16 name) {
+ const std::u16string name) {
ProfileAttributesEntry* entry =
g_browser_process->profile_manager()
->GetProfileAttributesStorage()
@@ -281,9 +265,6 @@ void OnSyncSetupComplete(Profile* profile,
/*is_primary_account_=*/true,
password_manager::metrics_util::GaiaPasswordHashChange::
SAVED_ON_CHROME_SIGNIN);
-
- if (profiles::IsLockAvailable(profile))
- LocalAuth::SetLocalAuthCredentials(profile, password);
}
if (has_primary_account && is_force_sign_in_with_usermanager &&
@@ -293,7 +274,7 @@ void OnSyncSetupComplete(Profile* profile,
base::Optional<AccountInfo> primary_account_info =
identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
primary_account);
- base::string16 profile_name;
+ std::u16string profile_name;
if (primary_account_info.has_value()) {
profile_name =
profiles::GetDefaultNameForNewSignedInProfile(*primary_account_info);
@@ -304,7 +285,10 @@ void OnSyncSetupComplete(Profile* profile,
}
SetProfileName(profile->GetPath(), profile_name);
Browser* browser = chrome::FindBrowserWithProfile(profile);
- if (browser) {
+
+ // Don't show the customization bubble if a valid policy theme is set.
+ if (browser &&
+ !ThemeServiceFactory::GetForProfile(profile)->UsingPolicyTheme()) {
ApplyProfileColorAndShowCustomizationBubbleWhenNoValueSynced(
browser, GenerateNewProfileColor().color);
}
@@ -408,11 +392,6 @@ void InlineSigninHelper::OnClientOAuthSuccessAndBrowserOpened(
std::string primary_email =
identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
.email;
- if (gaia::AreEmailsSame(email_, primary_email) &&
- reason == HandlerSigninReason::UNLOCK && !password_.empty() &&
- profiles::IsLockAvailable(profile_)) {
- LocalAuth::SetLocalAuthCredentials(profile_, password_);
- }
if (!password_.empty()) {
scoped_refptr<password_manager::PasswordStore> password_store =
@@ -426,44 +405,19 @@ void InlineSigninHelper::OnClientOAuthSuccessAndBrowserOpened(
}
}
- if (reason == HandlerSigninReason::UNLOCK) {
- DCHECK(!identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
- .IsEmpty());
-
- identity_manager->GetAccountsMutator()->AddOrUpdateAccount(
- gaia_id_, email_, result.refresh_token,
- result.is_under_advanced_protection,
- signin_metrics::SourceForRefreshTokenOperation::
- kInlineLoginHandler_Signin);
-
- if (signin::IsAutoCloseEnabledInEmbeddedURL(current_url_)) {
- // Close the gaia sign in tab via a task to make sure we aren't in the
- // middle of any webui handler code.
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&InlineLoginHandlerImpl::CloseTab, handler_));
- }
-
- identity_manager->GetAccountsCookieMutator()->AddAccountToCookie(
- identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSync),
- gaia::GaiaSource::kPrimaryAccountManager, {});
-
- signin_metrics::LogSigninReason(
- GetSigninReasonFromHandlerSigninReason(reason));
- } else {
- if (confirm_untrusted_signin_) {
- // Display a confirmation dialog to the user.
- base::RecordAction(
- base::UserMetricsAction("Signin_Show_UntrustedSigninPrompt"));
- Browser* browser = chrome::FindLastActiveWithProfile(profile_);
- browser->window()->ShowOneClickSigninConfirmation(
- base::UTF8ToUTF16(email_),
- base::BindOnce(&InlineSigninHelper::UntrustedSigninConfirmed,
- base::Unretained(this), result.refresh_token));
- return;
- }
- CreateSyncStarter(result.refresh_token);
+ if (confirm_untrusted_signin_) {
+ // Display a confirmation dialog to the user.
+ base::RecordAction(
+ base::UserMetricsAction("Signin_Show_UntrustedSigninPrompt"));
+ Browser* browser = chrome::FindLastActiveWithProfile(profile_);
+ browser->window()->ShowOneClickSigninConfirmation(
+ base::UTF8ToUTF16(email_),
+ base::BindOnce(&InlineSigninHelper::UntrustedSigninConfirmed,
+ base::Unretained(this), result.refresh_token));
+ return;
}
+ CreateSyncStarter(result.refresh_token);
+
base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
}
@@ -517,8 +471,10 @@ void InlineSigninHelper::CreateSyncStarter(const std::string& refresh_token) {
void InlineSigninHelper::OnClientOAuthFailure(
const GoogleServiceAuthError& error) {
- if (handler_)
- handler_->HandleLoginError(error.ToString(), base::string16());
+ if (handler_) {
+ handler_->HandleLoginError(
+ SigninUIError::FromGoogleServiceAuthError(email_, error));
+ }
HandlerSigninReason reason = GetHandlerSigninReason(current_url_);
if (reason != HandlerSigninReason::FETCH_LST_ONLY) {
@@ -597,9 +553,6 @@ void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) {
std::string flow;
switch (reason) {
- case HandlerSigninReason::UNLOCK:
- flow = "reauth";
- break;
case HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT:
flow = "enterprisefsi";
break;
@@ -672,8 +625,7 @@ void InlineLoginHandlerImpl::CompleteLogin(const std::string& email,
return;
}
- DCHECK(reason == HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT ||
- reason == HandlerSigninReason::UNLOCK);
+ DCHECK(reason == HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT);
DCHECK(signin_util::IsForceSigninEnabled());
ProfileManager* manager = g_browser_process->profile_manager();
@@ -750,8 +702,9 @@ void InlineLoginHandlerImpl::FinishCompleteLogin(
credential_provider::UiExitCodes exit_code = ValidateSigninEmail(
validate_gaia_id, email_domains, params.email, params.gaia_id);
if (exit_code != credential_provider::kUiecSuccess) {
- params.handler->HandleLoginError(base::NumberToString((int)exit_code),
- base::UTF8ToUTF16(params.email));
+ params.handler->HandleLoginError(
+ SigninUIError::FromCredentialProviderUiExitCode(params.email,
+ exit_code));
return;
} else {
// Validation has already been done for GCPW, so clear the validate
@@ -769,9 +722,7 @@ void InlineLoginHandlerImpl::FinishCompleteLogin(
if (validate_email == "1" && !default_email.empty()) {
if (!gaia::AreEmailsSame(params.email, default_email)) {
params.handler->HandleLoginError(
- l10n_util::GetStringFUTF8(IDS_SYNC_WRONG_EMAIL,
- base::UTF8ToUTF16(default_email)),
- base::UTF8ToUTF16(params.email));
+ SigninUIError::WrongReauthAccount(params.email, default_email));
return;
}
}
@@ -786,25 +737,12 @@ void InlineLoginHandlerImpl::FinishCompleteLogin(
? signin_metrics::HISTOGRAM_WITH_ADVANCED
: signin_metrics::HISTOGRAM_WITH_DEFAULTS);
- CanOfferSigninType can_offer_for = CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS;
- if (reason == HandlerSigninReason::UNLOCK) {
- std::string primary_username =
- IdentityManagerFactory::GetForProfile(profile)
- ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
- .email;
- if (!gaia::AreEmailsSame(default_email, primary_username))
- can_offer_for = CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT;
- }
-
SigninUIError can_offer_error = SigninUIError::Ok();
- if (reason != HandlerSigninReason::FETCH_LST_ONLY) {
- can_offer_error =
- CanOfferSignin(profile, can_offer_for, params.gaia_id, params.email);
- }
+ if (reason != HandlerSigninReason::FETCH_LST_ONLY)
+ can_offer_error = CanOfferSignin(profile, params.gaia_id, params.email);
+
if (!can_offer_error.IsOk()) {
- params.handler->HandleLoginError(
- base::UTF16ToUTF8(can_offer_error.message()),
- base::UTF8ToUTF16(params.email));
+ params.handler->HandleLoginError(can_offer_error);
return;
}
@@ -833,8 +771,7 @@ void InlineLoginHandlerImpl::FinishCompleteLogin(
}
}
-void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg,
- const base::string16& email) {
+void InlineLoginHandlerImpl::HandleLoginError(const SigninUIError& error) {
content::WebContents* contents = web_ui()->GetWebContents();
const GURL& current_url = contents->GetURL();
HandlerSigninReason reason = GetHandlerSigninReason(current_url);
@@ -842,11 +779,12 @@ void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg,
if (reason == HandlerSigninReason::FETCH_LST_ONLY) {
base::Value error_value(base::Value::Type::DICTIONARY);
#if defined(OS_WIN)
- // If the message is an integer error code, send it as part of the result.
- int exit_code = 0;
- if (base::StringToInt(error_msg, &exit_code)) {
+ // If the error contains an integer error code, send it as part of the
+ // result.
+ if (error.type() ==
+ SigninUIError::Type::kFromCredentialProviderUiExitCode) {
error_value.SetKey(credential_provider::kKeyExitCode,
- base::Value(exit_code));
+ base::Value(error.credential_provider_exit_code()));
}
#endif
SendLSTFetchResultsMessage(error_value);
@@ -859,9 +797,9 @@ void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg,
if (profile->IsSystemProfile())
profile = g_browser_process->profile_manager()->GetProfileByPath(
ProfilePicker::GetForceSigninProfilePath());
- if (!error_msg.empty()) {
- LoginUIServiceFactory::GetForProfile(profile)->DisplayLoginResult(
- browser, base::UTF8ToUTF16(error_msg), email);
+ if (!error.IsOk()) {
+ LoginUIServiceFactory::GetForProfile(profile)->DisplayLoginResult(browser,
+ error);
}
}
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.h b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.h
index 76f73ef8fa1..320fb2a5887 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.h
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_impl.h
@@ -28,6 +28,7 @@ class SharedURLLoaderFactory;
}
class Browser;
+class SigninUIError;
// Implementation for the inline login WebUI handler on desktop Chrome. Once
// CrOS migrates to the same webview approach as desktop Chrome, much of the
@@ -48,8 +49,7 @@ class InlineLoginHandlerImpl : public InlineLoginHandler {
void SyncSetupFailed();
// Closes the current tab.
void CloseTab();
- void HandleLoginError(const std::string& error_msg,
- const base::string16& email);
+ void HandleLoginError(const SigninUIError& error);
// Calls the javascript function 'sendLSTFetchResults' with the given
// base::Value result. This value will be passed to another
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
index 5bc7bc72da0..900cd48afae 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -38,6 +38,7 @@
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/supervised_user/supervised_user_features.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h"
@@ -56,7 +57,7 @@ namespace {
#if BUILDFLAG(IS_CHROMEOS_ASH)
void AddEduStrings(content::WebUIDataSource* source,
- const base::string16& username) {
+ const std::u16string& username) {
source->AddLocalizedString("okButton", IDS_APP_OK);
source->AddLocalizedString("backButton", IDS_EDU_LOGIN_BACK);
source->AddLocalizedString("nextButton", IDS_EDU_LOGIN_NEXT);
@@ -169,6 +170,8 @@ content::WebUIDataSource* CreateWebUIDataSource(Profile* profile) {
{"edu_coexistence_template.js",
IDR_EDU_COEXISTENCE_EDU_COEXISTENCE_TEMPLATE_JS},
{"edu_coexistence_css.js", IDR_EDU_COEXISTENCE_EDU_COEXISTENCE_CSS_JS},
+ {"an_error_occurred.svg", IDR_CHROME_OS_AN_ERROR_OCCURRED_SVG},
+ {"no_network.svg", IDR_CHROME_OS_NO_NETWORK_SVG},
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
{"account_manager_welcome_1x.png", IDR_ACCOUNT_MANAGER_WELCOME_1X_PNG},
@@ -180,10 +183,10 @@ content::WebUIDataSource* CreateWebUIDataSource(Profile* profile) {
source->AddResourcePaths(kResources);
static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"title", IDS_CHROME_SIGNIN_TITLE},
{"accessibleCloseButtonLabel", IDS_SIGNIN_ACCESSIBLE_CLOSE_BUTTON},
{"accessibleBackButtonLabel", IDS_SIGNIN_ACCESSIBLE_BACK_BUTTON},
#if BUILDFLAG(IS_CHROMEOS_ASH)
+ {"title", IDS_ACCOUNT_MANAGER_DIALOG_TITLE},
{"ok", IDS_APP_OK},
{"accountManagerDialogWelcomeTitle",
IDS_ACCOUNT_MANAGER_DIALOG_WELCOME_TITLE},
@@ -197,6 +200,8 @@ content::WebUIDataSource* CreateWebUIDataSource(Profile* profile) {
IDS_ACCOUNT_MANAGER_ERROR_CANNOT_ADD_ACCOUNT_TITLE},
{"accountManagerErrorCannotAddAccountBody",
IDS_ACCOUNT_MANAGER_ERROR_CANNOT_ADD_ACCOUNT_BODY},
+#else
+ {"title", IDS_CHROME_SIGNIN_TITLE},
#endif
};
source->AddLocalizedStrings(kLocalizedStrings);
@@ -207,10 +212,17 @@ content::WebUIDataSource* CreateWebUIDataSource(Profile* profile) {
source->AddBoolean("shouldSkipWelcomePage",
profile->GetPrefs()->GetBoolean(
chromeos::prefs::kShouldSkipInlineLoginWelcomePage));
+ bool is_incognito_enabled =
+ (IncognitoModePrefs::GetAvailability(profile->GetPrefs()) !=
+ IncognitoModePrefs::DISABLED);
+ int message_id =
+ is_incognito_enabled
+ ? IDS_ACCOUNT_MANAGER_DIALOG_WELCOME_BODY
+ : IDS_ACCOUNT_MANAGER_DIALOG_WELCOME_BODY_WITHOUT_INCOGNITO;
source->AddString(
"accountManagerDialogWelcomeBody",
l10n_util::GetStringFUTF16(
- IDS_ACCOUNT_MANAGER_DIALOG_WELCOME_BODY,
+ message_id,
base::UTF8ToUTF16(
chrome::GetOSSettingsUrl(
chromeos::settings::mojom::kMyAccountsSubpagePath)
@@ -240,24 +252,20 @@ bool IsValidChromeSigninReason(const GURL& url) {
signin::GetSigninReasonForEmbeddedPromoURL(url);
switch (reason) {
- case signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT:
- case signin_metrics::Reason::REASON_UNLOCK:
+ case signin_metrics::Reason::kForcedSigninPrimaryAccount:
// Used by the user manager.
return true;
- case signin_metrics::Reason::REASON_FETCH_LST_ONLY:
+ case signin_metrics::Reason::kFetchLstOnly:
#if defined(OS_WIN)
// Used by the Google Credential Provider for Windows.
return true;
#else
return false;
#endif
- case signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT:
- case signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT:
- case signin_metrics::Reason::REASON_REAUTHENTICATION:
- case signin_metrics::Reason::REASON_UNKNOWN_REASON:
- return false;
- case signin_metrics::Reason::REASON_MAX:
- NOTREACHED();
+ case signin_metrics::Reason::kSigninPrimaryAccount:
+ case signin_metrics::Reason::kAddSecondaryAccount:
+ case signin_metrics::Reason::kReauthentication:
+ case signin_metrics::Reason::kUnknownReason:
return false;
}
NOTREACHED();
@@ -273,7 +281,7 @@ InlineLoginUI::InlineLoginUI(content::WebUI* web_ui) : WebDialogUI(web_ui) {
Profile* profile = Profile::FromWebUI(web_ui);
content::WebUIDataSource* source = CreateWebUIDataSource(profile);
#if BUILDFLAG(IS_CHROMEOS_ASH)
- base::string16 username =
+ std::u16string username =
chromeos::ProfileHelper::Get()->GetUserByProfile(profile)->GetGivenName();
AddEduStrings(source, username);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chromium/chrome/browser/ui/webui/signin/login_ui_service.cc b/chromium/chrome/browser/ui/webui/signin/login_ui_service.cc
index 5fddfe996f0..12e30cd7185 100644
--- a/chromium/chrome/browser/ui/webui/signin/login_ui_service.cc
+++ b/chromium/chrome/browser/ui/webui/signin/login_ui_service.cc
@@ -29,7 +29,7 @@ LoginUIService::LoginUIService(Profile* profile)
{
}
-LoginUIService::~LoginUIService() {}
+LoginUIService::~LoginUIService() = default;
void LoginUIService::AddObserver(LoginUIService::Observer* observer) {
observer_list_.AddObserver(observer);
@@ -94,47 +94,39 @@ void LoginUIService::ShowExtensionLoginPrompt(bool enable_sync,
}
void LoginUIService::DisplayLoginResult(Browser* browser,
- const base::string16& error_message,
- const base::string16& email) {
+ const SigninUIError& error) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
// ChromeOS doesn't have the avatar bubble so it never calls this function.
NOTREACHED();
#else
- is_displaying_profile_blocking_error_message_ = false;
- last_login_result_ = error_message;
- last_login_error_email_ = email;
- if (!error_message.empty()) {
+ last_login_error_ = error;
+ if (!error.message().empty()) {
if (browser) {
browser->signin_view_controller()->ShowModalSigninErrorDialog();
} else if (profile_->GetPath() ==
ProfilePicker::GetForceSigninProfilePath()) {
ProfilePickerForceSigninDialog::DisplayErrorMessage();
} else {
- LOG(ERROR) << "Unable to show Login error message: " << error_message;
+ LOG(ERROR) << "Unable to show Login error message: " << error.message();
}
} else if (browser) {
browser->window()->ShowAvatarBubbleFromAvatarButton(
BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN,
-
signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS, false);
}
#endif
}
void LoginUIService::SetProfileBlockingErrorMessage() {
- last_login_result_ = base::string16();
- last_login_error_email_ = base::string16();
- is_displaying_profile_blocking_error_message_ = true;
-}
-
-bool LoginUIService::IsDisplayingProfileBlockedErrorMessage() const {
- return is_displaying_profile_blocking_error_message_;
-}
-
-const base::string16& LoginUIService::GetLastLoginResult() const {
- return last_login_result_;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ NOTREACHED();
+#else
+ last_login_error_ = SigninUIError::ProfileIsBlocked();
+#endif
}
-const base::string16& LoginUIService::GetLastLoginErrorEmail() const {
- return last_login_error_email_;
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+const SigninUIError& LoginUIService::GetLastLoginError() const {
+ return last_login_error_;
}
+#endif
diff --git a/chromium/chrome/browser/ui/webui/signin/login_ui_service.h b/chromium/chrome/browser/ui/webui/signin/login_ui_service.h
index 00f29ff1093..9d08f6b5ae3 100644
--- a/chromium/chrome/browser/ui/webui/signin/login_ui_service.h
+++ b/chromium/chrome/browser/ui/webui/signin/login_ui_service.h
@@ -11,8 +11,8 @@
#include "base/macros.h"
#include "base/observer_list.h"
-#include "base/strings/string16.h"
#include "build/chromeos_buildflags.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
#include "components/keyed_service/core/keyed_service.h"
class Browser;
@@ -88,40 +88,29 @@ class LoginUIService : public KeyedService {
const std::string& email_hint);
// Displays login results. This is either the Modal Signin Error dialog if
- // |error_message| is a non-empty string, or the User Menu with a blue header
- // toast otherwise.
- virtual void DisplayLoginResult(Browser* browser,
- const base::string16& error_message,
- const base::string16& email);
+ // |error.message()| is a non-empty string, or the User Menu with a blue
+ // header toast otherwise.
+ virtual void DisplayLoginResult(Browser* browser, const SigninUIError& error);
// Set the profile blocking modal error dialog message.
virtual void SetProfileBlockingErrorMessage();
- // Gets whether the Modal Signin Error dialog should display profile blocking
- // error message.
- bool IsDisplayingProfileBlockedErrorMessage() const;
-
- // Gets the last login result set through |DisplayLoginResult|.
- const base::string16& GetLastLoginResult() const;
-
- // Gets the last email used for signing in when a signin error occured; set
- // through |DisplayLoginResult|.
- const base::string16& GetLastLoginErrorEmail() const;
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+ // Gets the last error set through |DisplayLoginResult|.
+ const SigninUIError& GetLastLoginError() const;
+#endif
private:
// Weak pointers to the recently opened UIs, with the most recent in front.
std::list<LoginUI*> ui_list_;
#if !BUILDFLAG(IS_CHROMEOS_ASH)
Profile* profile_;
+ SigninUIError last_login_error_ = SigninUIError::Ok();
#endif
// List of observers.
base::ObserverList<Observer>::Unchecked observer_list_;
- base::string16 last_login_result_;
- base::string16 last_login_error_email_;
- bool is_displaying_profile_blocking_error_message_ = false;
-
DISALLOW_COPY_AND_ASSIGN(LoginUIService);
};
diff --git a/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc b/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
index 479e48dc4fc..f2d349bd555 100644
--- a/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
@@ -25,6 +25,7 @@
#include "chrome/browser/profiles/profile_attributes_storage.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "content/public/browser/web_contents.h"
#include "extensions/common/extension_builder.h"
@@ -93,15 +94,15 @@ TEST_F(LoginUIServiceTest, CanSetMultipleLoginUIs) {
EXPECT_EQ(nullptr, service.current_login_ui());
}
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(LoginUIServiceTest, SetProfileBlockingErrorMessage) {
LoginUIService service(profile_);
service.SetProfileBlockingErrorMessage();
- EXPECT_EQ(base::string16(), service.GetLastLoginResult());
- EXPECT_EQ(base::string16(), service.GetLastLoginErrorEmail());
- EXPECT_TRUE(service.IsDisplayingProfileBlockedErrorMessage());
+ EXPECT_EQ(service.GetLastLoginError(), SigninUIError::ProfileIsBlocked());
}
+#endif
#if !BUILDFLAG(IS_CHROMEOS_ASH)
class LoginUIServiceExtensionLoginPromptTest
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.cc b/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.cc
index 80408938859..1a6e851014b 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.cc
@@ -4,12 +4,12 @@
#include "chrome/browser/ui/webui/signin/profile_customization_handler.h"
+#include <string>
#include <utility>
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/check.h"
-#include "base/strings/string16.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
@@ -18,9 +18,11 @@
#include "chrome/browser/profiles/profile_avatar_icon_util.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/signin/profile_colors_util.h"
+#include "chrome/grit/generated_resources.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/image/image.h"
@@ -75,6 +77,12 @@ void ProfileCustomizationHandler::OnProfileHostedDomainChanged(
UpdateProfileInfo(profile_path);
}
+void ProfileCustomizationHandler::OnProfileNameChanged(
+ const base::FilePath& profile_path,
+ const std::u16string& old_profile_name) {
+ UpdateProfileInfo(profile_path);
+}
+
void ProfileCustomizationHandler::HandleInitialized(
const base::ListValue* args) {
CHECK_EQ(1u, args->GetSize());
@@ -85,7 +93,7 @@ void ProfileCustomizationHandler::HandleInitialized(
void ProfileCustomizationHandler::HandleDone(const base::ListValue* args) {
CHECK_EQ(1u, args->GetSize());
- base::string16 profile_name =
+ std::u16string profile_name =
base::UTF8ToUTF16(args->GetList()[0].GetString());
base::TrimWhitespace(profile_name, base::TRIM_ALL, &profile_name);
@@ -107,16 +115,12 @@ void ProfileCustomizationHandler::UpdateProfileInfo(
base::Value ProfileCustomizationHandler::GetProfileInfoValue() {
ProfileAttributesEntry* entry = GetProfileEntry();
- SkColor profile_color =
- entry->GetProfileThemeColors().profile_highlight_color;
base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("textColor",
- color_utils::SkColorToRgbaString(
- GetProfileForegroundTextColor(profile_color)));
- dict.SetStringKey("backgroundColor",
- color_utils::SkColorToRgbaString(profile_color));
-
+ dict.SetStringKey(
+ "backgroundColor",
+ color_utils::SkColorToRgbaString(
+ entry->GetProfileThemeColors().profile_highlight_color));
const int avatar_icon_size = kAvatarSize * web_ui()->GetDeviceScaleFactor();
gfx::Image icon =
profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), true,
@@ -124,6 +128,12 @@ base::Value ProfileCustomizationHandler::GetProfileInfoValue() {
dict.SetStringKey("pictureUrl", webui::GetBitmapDataUrl(icon.AsBitmap()));
dict.SetBoolKey("isManaged",
AccountInfo::IsManaged(entry->GetHostedDomain()));
+ std::u16string gaia_name = entry->GetGAIANameToDisplay();
+ if (gaia_name.empty())
+ gaia_name = entry->GetLocalProfileName();
+ dict.SetStringKey(
+ "welcomeTitle",
+ l10n_util::GetStringFUTF8(IDS_PROFILE_CUSTOMIZATION_WELCOME, gaia_name));
return dict;
}
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.h b/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.h
index f505cdb8849..733581dfe1d 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.h
+++ b/chromium/chrome/browser/ui/webui/signin/profile_customization_handler.h
@@ -41,6 +41,8 @@ class ProfileCustomizationHandler : public content::WebUIMessageHandler,
void OnProfileThemeColorsChanged(const base::FilePath& profile_path) override;
void OnProfileHostedDomainChanged(
const base::FilePath& profile_path) override;
+ void OnProfileNameChanged(const base::FilePath& profile_path,
+ const std::u16string& old_profile_name) override;
private:
// Handlers for messages from javascript.
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chromium/chrome/browser/ui/webui/signin/profile_customization_ui.cc
index 02d53bfc69c..c8f12611b01 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_customization_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "content/public/browser/web_ui.h"
@@ -45,9 +46,8 @@ ProfileCustomizationUI::ProfileCustomizationUI(content::WebUI* web_ui)
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"profileCustomizationDoneLabel",
IDS_PROFILE_CUSTOMIZATION_DONE_BUTTON_LABEL},
- {"profileCustomizationPickThemeTitle",
- IDS_PROFILE_CUSTOMIZATION_PICK_THEME_TITLE},
{"profileCustomizationInputLabel", IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL},
+ {"profileCustomizationText", IDS_PROFILE_CUSTOMIZATION_TEXT},
// Color picker strings:
{"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL},
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.cc
index 5073dbcd727..f6cebb05168 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -27,6 +27,7 @@
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/profile_picker.h"
#include "chrome/browser/ui/signin/profile_colors_util.h"
@@ -35,12 +36,15 @@
#include "chrome/browser/ui/webui/profile_helper.h"
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
+#include "chrome/browser/ui/webui/theme_source.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/search/generated_colors_info.h"
#include "chrome/common/themes/autogenerated_theme_util.h"
#include "chrome/common/webui_url_constants.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/startup_metric_utils/browser/startup_metric_utils.h"
+#include "content/public/browser/url_data_source.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
@@ -121,9 +125,8 @@ base::Value GetAutogeneratedProfileThemeInfoValue(int color_id,
return dict;
}
-base::Value CreateDefaultProfileThemeInfo(int avatar_icon_size) {
- bool dark_mode =
- ui::NativeTheme::GetInstanceForNativeUi()->ShouldUseDarkColors();
+base::Value CreateDefaultProfileThemeInfo(int avatar_icon_size,
+ bool dark_mode) {
SkColor frame_color = ThemeProperties::GetDefaultColor(
ThemeProperties::COLOR_FRAME_ACTIVE, /*incognito=*/false, dark_mode);
SkColor active_tab_color = ThemeProperties::GetDefaultColor(
@@ -159,7 +162,6 @@ void OpenOnSelectProfileTargetUrl(Browser* browser) {
chrome::ShowSettings(browser);
} else if (target_page_url.spec() == ProfilePicker::kTaskManagerUrl) {
chrome::OpenTaskManager(browser);
-
} else {
NavigateParams params(
GetSingletonTabNavigateParams(browser, target_page_url));
@@ -168,6 +170,29 @@ void OpenOnSelectProfileTargetUrl(Browser* browser) {
}
}
+base::Value CreateProfileEntry(const ProfileAttributesEntry* entry,
+ int avatar_icon_size) {
+ base::Value profile_entry(base::Value::Type::DICTIONARY);
+ profile_entry.SetKey("profilePath", util::FilePathToValue(entry->GetPath()));
+ profile_entry.SetStringKey("localProfileName", entry->GetLocalProfileName());
+ profile_entry.SetBoolKey(
+ "isSyncing", entry->GetSigninState() ==
+ SigninState::kSignedInWithConsentedPrimaryAccount);
+ profile_entry.SetBoolKey("needsSignin", entry->IsSigninRequired());
+ // GAIA full name/user name can be empty, if the profile is not signed in to
+ // chrome.
+ profile_entry.SetStringKey("gaiaName", entry->GetGAIAName());
+ profile_entry.SetStringKey("userName", entry->GetUserName());
+ profile_entry.SetBoolKey("isManaged",
+ AccountInfo::IsManaged(entry->GetHostedDomain()));
+ gfx::Image icon =
+ profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), true,
+ avatar_icon_size, avatar_icon_size);
+ std::string icon_url = webui::GetBitmapDataUrl(icon.AsBitmap());
+ profile_entry.SetStringKey("avatarIcon", icon_url);
+ return profile_entry;
+}
+
} // namespace
ProfilePickerHandler::ProfilePickerHandler() = default;
@@ -240,6 +265,18 @@ void ProfilePickerHandler::RegisterMessages() {
base::BindRepeating(&ProfilePickerHandler::HandleCreateProfile,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
+ "getSwitchProfile",
+ base::BindRepeating(&ProfilePickerHandler::HandleGetSwitchProfile,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "confirmProfileSwitch",
+ base::BindRepeating(&ProfilePickerHandler::HandleConfirmProfileSwitch,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "cancelProfileSwitch",
+ base::BindRepeating(&ProfilePickerHandler::HandleCancelProfileSwitch,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
"setProfileName",
base::BindRepeating(&ProfilePickerHandler::HandleSetProfileName,
base::Unretained(this)));
@@ -248,6 +285,8 @@ void ProfilePickerHandler::RegisterMessages() {
base::BindRepeating(
&ProfilePickerHandler::HandleRecordSignInPromoImpression,
base::Unretained(this)));
+ Profile* profile = Profile::FromWebUI(web_ui());
+ content::URLDataSource::Add(profile, std::make_unique<ThemeSource>(profile));
}
void ProfilePickerHandler::OnJavascriptAllowed() {
@@ -371,7 +410,9 @@ void ProfilePickerHandler::HandleGetProfileThemeInfo(
base::Value dict;
switch (color_id) {
case kDefaultThemeColorId:
- dict = CreateDefaultProfileThemeInfo(avatar_icon_size);
+ dict = CreateDefaultProfileThemeInfo(
+ avatar_icon_size, webui::GetNativeTheme(web_ui()->GetWebContents())
+ ->ShouldUseDarkColors());
break;
case kManuallyPickedColorId:
dict = CreateAutogeneratedProfileThemeInfo(color_id, *color,
@@ -396,7 +437,7 @@ void ProfilePickerHandler::HandleGetAvailableIcons(
void ProfilePickerHandler::HandleCreateProfile(const base::ListValue* args) {
CHECK_EQ(4U, args->GetList().size());
- base::string16 profile_name =
+ std::u16string profile_name =
base::UTF8ToUTF16(args->GetList()[0].GetString());
// profileColor is undefined for the default theme.
base::Optional<SkColor> profile_color;
@@ -411,16 +452,55 @@ void ProfilePickerHandler::HandleCreateProfile(const base::ListValue* args) {
DCHECK(profiles::IsDefaultAvatarIconIndex(avatar_index));
#endif
- std::string avatar_url = profiles::GetDefaultAvatarIconUrl(avatar_index);
ProfileMetrics::LogProfileAddNewUser(
ProfileMetrics::ADD_NEW_PROFILE_PICKER_LOCAL);
ProfileManager::CreateMultiProfileAsync(
- profile_name, avatar_url,
+ profile_name, avatar_index,
base::BindRepeating(&ProfilePickerHandler::OnProfileCreated,
weak_factory_.GetWeakPtr(), profile_color,
create_shortcut));
}
+void ProfilePickerHandler::HandleGetSwitchProfile(const base::ListValue* args) {
+ AllowJavascript();
+ CHECK_EQ(1U, args->GetSize());
+ const base::Value& callback_id = args->GetList()[0];
+ int avatar_icon_size =
+ kProfileCardAvatarSize * web_ui()->GetDeviceScaleFactor();
+ base::FilePath profile_path = ProfilePicker::GetSwitchProfilePath();
+ ProfileAttributesEntry* entry =
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetProfileAttributesWithPath(profile_path);
+ CHECK(entry);
+ base::Value dict = CreateProfileEntry(entry, avatar_icon_size);
+ ResolveJavascriptCallback(callback_id, std::move(dict));
+}
+
+void ProfilePickerHandler::HandleConfirmProfileSwitch(
+ const base::ListValue* args) {
+ const base::Value* profile_path_value = nullptr;
+ if (!args->Get(0, &profile_path_value))
+ return;
+
+ base::Optional<base::FilePath> profile_path =
+ util::ValueToFilePath(*profile_path_value);
+ if (!profile_path)
+ return;
+
+ // TODO(https://crbug.com/1182206): remove the profile used for the sign-in
+ // flow.
+ profiles::SwitchToProfile(
+ *profile_path, /*always_create=*/false,
+ base::BindRepeating(&ProfilePickerHandler::OnSwitchToProfileComplete,
+ weak_factory_.GetWeakPtr(), false, false));
+}
+
+void ProfilePickerHandler::HandleCancelProfileSwitch(
+ const base::ListValue* args) {
+ ProfilePicker::CancelSignIn();
+}
+
void ProfilePickerHandler::OnProfileCreated(
base::Optional<SkColor> profile_color,
bool create_shortcut,
@@ -467,7 +547,7 @@ void ProfilePickerHandler::OnProfileCreationSuccess(
else
theme_service->UseDefaultTheme();
- // Create shortcut if edded.
+ // Create shortcut if needed.
if (create_shortcut) {
DCHECK(ProfileShortcutManager::IsFeatureEnabled());
ProfileShortcutManager* shortcut_manager =
@@ -511,7 +591,7 @@ void ProfilePickerHandler::HandleSetProfileName(const base::ListValue* args) {
NOTREACHED();
return;
}
- base::string16 profile_name =
+ std::u16string profile_name =
base::UTF8ToUTF16(args->GetList()[1].GetString());
base::TrimWhitespace(profile_name, base::TRIM_ALL, &profile_name);
CHECK(!profile_name.empty());
@@ -616,6 +696,20 @@ void ProfilePickerHandler::OnSwitchToProfileComplete(
DCHECK(browser);
DCHECK(browser->window());
+ // Only show the profile switch IPH when the user clicked the card, and there
+ // are multiple profiles.
+ std::vector<ProfileAttributesEntry*> entries =
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetAllProfilesAttributes();
+ int profile_count = std::count_if(
+ entries.begin(), entries.end(),
+ [](ProfileAttributesEntry* entry) { return !entry->IsOmitted(); });
+ if (profile_count > 1 && !open_settings &&
+ ProfilePicker::GetOnSelectProfileTargetUrl().is_empty()) {
+ browser->window()->MaybeShowProfileSwitchIPH();
+ }
+
if (new_profile) {
RecordProfilePickerAction(ProfilePickerAction::kLaunchNewProfile);
ProfilePicker::Hide();
@@ -672,7 +766,9 @@ ProfilePickerHandler::GetProfileAttributes() {
// Should only happen the first time the function is called.
// Profile creation and deletion are handled at
// 'OnProfileAdded', 'OnProfileWasRemoved'.
- DCHECK(!profiles_order_.size());
+ // TODO(https://crbug.com/1195784): revert CHECK back to DCHECKs after the
+ // crash is investigated.
+ CHECK(!profiles_order_.size());
SetProfilesOrder(ordered_entries);
return ordered_entries;
}
@@ -680,55 +776,47 @@ ProfilePickerHandler::GetProfileAttributes() {
// Vector of nullptr entries.
std::vector<ProfileAttributesEntry*> entries(number_of_profiles);
for (ProfileAttributesEntry* entry : ordered_entries) {
- DCHECK(profiles_order_.find(entry->GetPath()) != profiles_order_.end());
+ // TODO(https://crbug.com/1195784): revert CHECKs back to DCHECKs after the
+ // crash is investigated.
+ CHECK(profiles_order_.find(entry->GetPath()) != profiles_order_.end());
size_t index = profiles_order_[entry->GetPath()];
- DCHECK_LT(index, number_of_profiles);
- DCHECK(!entries[index]);
+ CHECK_LT(index, number_of_profiles);
+ CHECK(!entries[index]);
entries[index] = entry;
}
return entries;
}
base::Value ProfilePickerHandler::GetProfilesList() {
- base::ListValue profiles_list;
+ base::Value profiles_list(base::Value::Type::LIST);
std::vector<ProfileAttributesEntry*> entries = GetProfileAttributes();
const int avatar_icon_size =
kProfileCardAvatarSize * web_ui()->GetDeviceScaleFactor();
for (const ProfileAttributesEntry* entry : entries) {
- auto profile_entry = std::make_unique<base::DictionaryValue>();
- profile_entry->SetKey("profilePath",
- util::FilePathToValue(entry->GetPath()));
- profile_entry->SetString("localProfileName", entry->GetLocalProfileName());
- profile_entry->SetBoolPath(
- "isSyncing", entry->GetSigninState() ==
- SigninState::kSignedInWithConsentedPrimaryAccount);
- profile_entry->SetBoolPath("needsSignin", entry->IsSigninRequired());
- // GAIA full name/user name can be empty, if the profile is not signed in to
- // chrome.
- profile_entry->SetString("gaiaName", entry->GetGAIAName());
- profile_entry->SetString("userName", entry->GetUserName());
- profile_entry->SetBoolPath(
- "isManaged", AccountInfo::IsManaged(entry->GetHostedDomain()));
- gfx::Image icon =
- profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size),
- true, avatar_icon_size, avatar_icon_size);
- std::string icon_url = webui::GetBitmapDataUrl(icon.AsBitmap());
- profile_entry->SetString("avatarIcon", icon_url);
- profiles_list.Append(std::move(profile_entry));
+ profiles_list.Append(CreateProfileEntry(entry, avatar_icon_size));
}
- return std::move(profiles_list);
+ return profiles_list;
}
void ProfilePickerHandler::AddProfileToList(
const base::FilePath& profile_path) {
size_t number_of_profiles = profiles_order_.size();
- profiles_order_[profile_path] = number_of_profiles;
+ auto it_and_whether_inserted =
+ profiles_order_.insert({profile_path, number_of_profiles});
+ // We shouldn't add the same profile to the list more than once. Use
+ // `insert()` to not corrput the map in case this happens.
+ // https://crbug.com/1195784
+ DCHECK(it_and_whether_inserted.second);
}
bool ProfilePickerHandler::RemoveProfileFromList(
const base::FilePath& profile_path) {
auto remove_it = profiles_order_.find(profile_path);
// Guest and omitted profiles aren't added to the list.
+ // It's possible that a profile gets marked as guest or as omitted after it
+ // had been added to the list. In that case, the profile gets removed from the
+ // list once in `OnProfileIsOmittedChanged()` but not the second time when
+ // `OnProfileWasRemoved()` is called.
if (remove_it == profiles_order_.end())
return false;
@@ -755,7 +843,7 @@ void ProfilePickerHandler::OnProfileAdded(const base::FilePath& profile_path) {
void ProfilePickerHandler::OnProfileWasRemoved(
const base::FilePath& profile_path,
- const base::string16& profile_name) {
+ const std::u16string& profile_name) {
DCHECK(IsJavascriptAllowed());
if (RemoveProfileFromList(profile_path))
FireWebUIListener("profile-removed", util::FilePathToValue(profile_path));
@@ -763,8 +851,6 @@ void ProfilePickerHandler::OnProfileWasRemoved(
void ProfilePickerHandler::OnProfileIsOmittedChanged(
const base::FilePath& profile_path) {
- if (profile_path == ProfileManager::GetGuestProfilePath())
- return;
ProfileAttributesEntry* entry =
g_browser_process->profile_manager()
->GetProfileAttributesStorage()
@@ -791,7 +877,7 @@ void ProfilePickerHandler::OnProfileHighResAvatarLoaded(
void ProfilePickerHandler::OnProfileNameChanged(
const base::FilePath& profile_path,
- const base::string16& old_profile_name) {
+ const std::u16string& old_profile_name) {
PushProfilesList();
}
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.h
index 666ed5368b5..a7ee9a29896 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.h
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -36,6 +36,13 @@ class ProfilePickerHandler : public content::WebUIMessageHandler,
private:
friend class ProfilePickerHandlerTest;
+ friend class ProfilePickerCreationFlowBrowserTest;
+ FRIEND_TEST_ALL_PREFIXES(
+ ProfilePickerIntegratedEnterpriseCreationFlowBrowserTest,
+ CreateSignedInProfileSigninAlreadyExists_ConfirmSwitch);
+ FRIEND_TEST_ALL_PREFIXES(
+ ProfilePickerIntegratedEnterpriseCreationFlowBrowserTest,
+ CreateSignedInProfileSigninAlreadyExists_CancelSwitch);
void HandleMainViewInitialize(const base::ListValue* args);
void HandleLaunchSelectedProfile(bool open_settings,
@@ -53,6 +60,11 @@ class ProfilePickerHandler : public content::WebUIMessageHandler,
void HandleGetAvailableIcons(const base::ListValue* args);
void HandleCreateProfile(const base::ListValue* args);
+ // Profile switch screen:
+ void HandleGetSwitchProfile(const base::ListValue* args);
+ void HandleConfirmProfileSwitch(const base::ListValue* args);
+ void HandleCancelProfileSwitch(const base::ListValue* args);
+
// |args| is unused.
void HandleRecordSignInPromoImpression(const base::ListValue* args);
@@ -82,13 +94,13 @@ class ProfilePickerHandler : public content::WebUIMessageHandler,
// ProfileAttributesStorage::Observer:
void OnProfileAdded(const base::FilePath& profile_path) override;
void OnProfileWasRemoved(const base::FilePath& profile_path,
- const base::string16& profile_name) override;
+ const std::u16string& profile_name) override;
void OnProfileIsOmittedChanged(const base::FilePath& profile_path) override;
void OnProfileAvatarChanged(const base::FilePath& profile_path) override;
void OnProfileHighResAvatarLoaded(
const base::FilePath& profile_path) override;
void OnProfileNameChanged(const base::FilePath& profile_path,
- const base::string16& old_profile_name) override;
+ const std::u16string& old_profile_name) override;
void OnProfileHostedDomainChanged(
const base::FilePath& profile_path) override;
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
index 86ed0d24b64..57a1e33f805 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
@@ -136,7 +136,7 @@ TEST_F(ProfilePickerHandlerTest, RenameProfile) {
web_ui()->ClearTrackedCalls();
// The profile list doesn't get re-ordered after a rename.
- profile_b->SetLocalProfileName(base::UTF8ToUTF16("X"), false);
+ profile_b->SetLocalProfileName(u"X", false);
VerifyProfileListWasPushed({profile_a, profile_b, profile_c, profile_d});
web_ui()->ClearTrackedCalls();
}
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc
index 36a36bc4a05..b5cdd0fdad2 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc
@@ -6,13 +6,16 @@
#include "base/feature_list.h"
#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/policy/browser_signin_policy_handler.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_avatar_icon_util.h"
#include "chrome/browser/profiles/profile_shortcut_manager.h"
+#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/browser/signin/account_consistency_mode_manager.h"
#include "chrome/browser/signin/signin_util.h"
+#include "chrome/browser/ui/managed_ui.h"
#include "chrome/browser/ui/profile_picker.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/signin/profile_creation_customize_themes_handler.h"
@@ -32,6 +35,7 @@
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/webui/mojo_web_ui_controller.h"
#include "url/gurl.h"
@@ -41,18 +45,6 @@ namespace {
// Miniumum size for the picker UI.
constexpr int kMinimumPickerSizePx = 620;
-bool IsProfileCreationAllowed() {
- PrefService* service = g_browser_process->local_state();
- DCHECK(service);
- return service->GetBoolean(prefs::kBrowserAddPersonEnabled);
-}
-
-bool IsGuestModeEnabled() {
- PrefService* service = g_browser_process->local_state();
- DCHECK(service);
- return service->GetBoolean(prefs::kBrowserGuestModeEnabled);
-}
-
bool IsBrowserSigninAllowed() {
policy::PolicyService* policy_service = g_browser_process->policy_service();
DCHECK(policy_service);
@@ -78,6 +70,22 @@ bool IsSignInProfileCreationFlowSupported() {
base::FeatureList::IsEnabled(features::kSignInProfileCreation);
}
+std::string GetManagedDeviceDisclaimer() {
+ if (!base::FeatureList::IsEnabled(features::kSignInProfileCreationEnterprise))
+ return std::string();
+ base::Optional<std::string> device_manager =
+ chrome::GetDeviceManagerIdentity();
+ if (!device_manager)
+ return std::string();
+ if (device_manager->empty()) {
+ return l10n_util::GetStringUTF8(
+ IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_DEVICE_MANAGED_DESCRIPTION);
+ }
+ return l10n_util::GetStringFUTF8(
+ IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_DEVICE_MANAGED_BY_DESCRIPTION,
+ base::UTF8ToUTF16(*device_manager));
+}
+
void AddStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"mainViewSubtitle", IDS_PROFILE_PICKER_MAIN_VIEW_SUBTITLE},
@@ -108,7 +116,7 @@ void AddStrings(content::WebUIDataSource* html_source) {
{"removeWarningAutofill", IDS_PROFILE_PICKER_REMOVE_WARNING_AUTOFILL},
{"removeWarningCalculating",
IDS_PROFILE_PICKER_REMOVE_WARNING_CALCULATING},
- {"backButtonLabel", IDS_PROFILE_PICKER_BACK_BUTTON_LABEL},
+ {"backButtonAriaLabel", IDS_PROFILE_PICKER_BACK_BUTTON_ARIA_LABEL},
{"profileTypeChoiceTitle",
IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_PROFILE_TYPE_CHOICE_TITLE},
{"profileTypeChoiceSubtitle",
@@ -134,6 +142,10 @@ void AddStrings(content::WebUIDataSource* html_source) {
IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_LOCAL_PROFILE_CREATION_AVATAR_TEXT},
{"selectAvatarDoneButtonLabel",
IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_LOCAL_PROFILE_CREATION_AVATAR_DONE},
+ {"profileSwitchTitle", IDS_PROFILE_PICKER_PROFILE_SWITCH_TITLE},
+ {"profileSwitchSubtitle", IDS_PROFILE_PICKER_PROFILE_SWITCH_SUBTITLE},
+ {"switchButtonLabel",
+ IDS_PROFILE_PICKER_PROFILE_SWITCH_SWITCH_BUTTON_LABEL},
// Color picker.
{"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL},
@@ -168,13 +180,16 @@ void AddStrings(content::WebUIDataSource* html_source) {
html_source->AddInteger("placeholderAvatarIndex",
profiles::GetPlaceholderAvatarIndex());
+ html_source->AddString("managedDeviceDisclaimer",
+ GetManagedDeviceDisclaimer());
+
// Add policies.
html_source->AddBoolean("isBrowserSigninAllowed", IsBrowserSigninAllowed());
html_source->AddBoolean("isForceSigninEnabled",
signin_util::IsForceSigninEnabled());
- html_source->AddBoolean("isGuestModeEnabled", IsGuestModeEnabled());
+ html_source->AddBoolean("isGuestModeEnabled", profiles::IsGuestModeEnabled());
html_source->AddBoolean("isProfileCreationAllowed",
- IsProfileCreationAllowed());
+ profiles::IsProfileCreationAllowed());
html_source->AddBoolean("profileShortcutsEnabled",
ProfileShortcutManager::IsFeatureEnabled());
}
@@ -190,12 +205,12 @@ ProfilePickerUI::ProfilePickerUI(content::WebUI* web_ui)
std::unique_ptr<ProfilePickerHandler> handler =
std::make_unique<ProfilePickerHandler>();
- ProfilePickerHandler* raw_handler = handler.get();
+ profile_picker_handler_ = handler.get();
web_ui->AddMessageHandler(std::move(handler));
if (web_ui->GetWebContents()->GetURL().query() ==
chrome::kChromeUIProfilePickerStartupQuery) {
- raw_handler->EnableStartupMetrics();
+ profile_picker_handler_->EnableStartupMetrics();
}
AddStrings(html_source);
@@ -223,6 +238,10 @@ void ProfilePickerUI::BindInterface(
customize_themes_factory_receiver_.Bind(std::move(pending_receiver));
}
+ProfilePickerHandler* ProfilePickerUI::GetProfilePickerHandlerForTesting() {
+ return profile_picker_handler_;
+}
+
void ProfilePickerUI::CreateCustomizeThemesHandler(
mojo::PendingRemote<customize_themes::mojom::CustomizeThemesClient>
pending_client,
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h
index 0bc1e8e353e..c0ef04a568c 100644
--- a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h
@@ -13,6 +13,7 @@
#include "ui/webui/resources/cr_components/customize_themes/customize_themes.mojom.h"
class ProfileCreationCustomizeThemesHandler;
+class ProfilePickerHandler;
// The WebUI controller for chrome://profile-picker/.
class ProfilePickerUI
@@ -35,6 +36,9 @@ class ProfilePickerUI
customize_themes::mojom::CustomizeThemesHandlerFactory>
pending_receiver);
+ // Allows tests to trigger page events.
+ ProfilePickerHandler* GetProfilePickerHandlerForTesting();
+
private:
// customize_themes::mojom::CustomizeThemesHandlerFactory:
void CreateCustomizeThemesHandler(
@@ -48,6 +52,9 @@ class ProfilePickerUI
mojo::Receiver<customize_themes::mojom::CustomizeThemesHandlerFactory>
customize_themes_factory_receiver_;
+ // Stored for tests.
+ ProfilePickerHandler* profile_picker_handler_ = nullptr;
+
WEB_UI_CONTROLLER_TYPE_DECL();
};
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
index d96fffe86d4..66ba4cdd62b 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
@@ -143,8 +143,8 @@ ui::ModalType SigninEmailConfirmationDialog::GetDialogModalType() const {
return ui::MODAL_TYPE_WINDOW;
}
-base::string16 SigninEmailConfirmationDialog::GetDialogTitle() const {
- return base::string16();
+std::u16string SigninEmailConfirmationDialog::GetDialogTitle() const {
+ return std::u16string();
}
GURL SigninEmailConfirmationDialog::GetDialogContentURL() const {
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
index 1e6fab521cf..93e5035c2ab 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
+++ b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
@@ -65,7 +65,7 @@ class SigninEmailConfirmationDialog : public ui::WebDialogDelegate,
// WebDialogDelegate implementation.
ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
+ std::u16string GetDialogTitle() const override;
GURL GetDialogContentURL() const override;
void GetWebUIMessageHandlers(
std::vector<content::WebUIMessageHandler*>* handlers) const override;
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc b/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
index 5b8de88ee0e..81ec2c20936 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
#include "chrome/browser/ui/webui/signin/signin_error_handler.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
@@ -83,33 +84,34 @@ void SigninErrorUI::Initialize(Browser* browser, bool is_system_profile) {
// Retrieve the last signin error message and email used.
LoginUIService* login_ui_service =
LoginUIServiceFactory::GetForProfile(signin_profile);
- const base::string16 last_login_result(
- login_ui_service->GetLastLoginResult());
- const base::string16 email = login_ui_service->GetLastLoginErrorEmail();
+ const SigninUIError last_login_error = login_ui_service->GetLastLoginError();
const bool is_profile_blocked =
- login_ui_service->IsDisplayingProfileBlockedErrorMessage();
+ last_login_error.type() == SigninUIError::Type::kProfileIsBlocked;
if (is_profile_blocked) {
source->AddLocalizedString("signinErrorTitle",
IDS_OLD_PROFILES_DISABLED_TITLE);
- } else if (email.empty()) {
+ } else if (last_login_error.email().empty()) {
+ // TODO(https://crbug.com/1133189): investigate whether an empty email
+ // string is ever passed and possibly add a DCHECK.
source->AddLocalizedString("signinErrorTitle", IDS_SIGNIN_ERROR_TITLE);
} else {
int title_string_id =
AccountConsistencyModeManager::IsDiceEnabledForProfile(signin_profile)
? IDS_SIGNIN_ERROR_DICE_EMAIL_TITLE
: IDS_SIGNIN_ERROR_EMAIL_TITLE;
- source->AddString("signinErrorTitle",
- l10n_util::GetStringFUTF16(title_string_id, email));
+ source->AddString(
+ "signinErrorTitle",
+ l10n_util::GetStringFUTF16(title_string_id, last_login_error.email()));
}
- source->AddString("signinErrorMessage", base::string16());
- source->AddString("profileBlockedMessage", base::string16());
- source->AddString("profileBlockedAddPersonSuggestion", base::string16());
- source->AddString("profileBlockedRemoveProfileSuggestion", base::string16());
+ source->AddString("signinErrorMessage", std::u16string());
+ source->AddString("profileBlockedMessage", std::u16string());
+ source->AddString("profileBlockedAddPersonSuggestion", std::u16string());
+ source->AddString("profileBlockedRemoveProfileSuggestion", std::u16string());
// Tweak the dialog UI depending on whether the signin error is
// username-in-use error and the error UI is shown with a browser window.
- base::string16 existing_name;
+ std::u16string existing_name;
if (is_profile_blocked) {
source->AddLocalizedString("profileBlockedMessage",
IDS_OLD_PROFILES_DISABLED_MESSAGE);
@@ -131,35 +133,25 @@ void SigninErrorUI::Initialize(Browser* browser, bool is_system_profile) {
source->AddLocalizedString("profileBlockedRemoveProfileSuggestion",
IDS_OLD_PROFILES_DISABLED_REMOVED_OLD_PROFILE);
} else if (!is_system_profile &&
- last_login_result.compare(l10n_util::GetStringUTF16(
- IDS_SYNC_USER_NAME_IN_USE_ERROR)) == 0) {
- ProfileManager* profile_manager = g_browser_process->profile_manager();
- if (profile_manager) {
- std::vector<ProfileAttributesEntry*> entries =
- profile_manager->GetProfileAttributesStorage()
- .GetAllProfilesAttributes();
- DCHECK(!email.empty());
- for (const ProfileAttributesEntry* entry : entries) {
- if (!entry->IsAuthenticated())
- continue;
-
- if (gaia::AreEmailsSame(base::UTF16ToUTF8(email),
- base::UTF16ToUTF8(entry->GetUserName()))) {
- handler->set_duplicate_profile_path(entry->GetPath());
- existing_name = entry->GetName();
- }
- }
- }
- DCHECK(!existing_name.empty());
- source->AddString(
- "signinErrorMessage",
- l10n_util::GetStringFUTF16(IDS_SYNC_USER_NAME_IN_USE_BY_ERROR,
- existing_name));
+ last_login_error.type() ==
+ SigninUIError::Type::kAccountAlreadyUsedByAnotherProfile) {
+ ProfileAttributesEntry* entry =
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetProfileAttributesWithPath(
+ last_login_error.another_profile_path());
+ DCHECK(entry);
+ DCHECK(entry->IsAuthenticated());
+ handler->set_duplicate_profile_path(entry->GetPath());
+ existing_name = entry->GetName();
+ source->AddString("signinErrorMessage",
+ l10n_util::GetStringFUTF16(
+ IDS_SYNC_USER_NAME_IN_USE_BY_ERROR, existing_name));
// Elide the existing name for the switch user button label.
existing_name =
gfx::TruncateString(existing_name, 10, gfx::CHARACTER_BREAK);
} else {
- source->AddString("signinErrorMessage", last_login_result);
+ source->AddString("signinErrorMessage", last_login_error.message());
}
// Add button label strings.
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_reauth_ui.cc b/chromium/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
index 8ef00596a76..e722b84d351 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
@@ -43,7 +43,7 @@ std::string GetAccountImageURL(Profile* profile) {
// TODO(crbug.com/1083429): generalize for arbitrary accounts by passing an
// account id as a method parameter.
CoreAccountId account_id =
- identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+ identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
// Sync shouldn't be enabled. Otherwise, the primary account and the first
// cookie account may diverge.
DCHECK(!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_ui_error.cc b/chromium/chrome/browser/ui/webui/signin/signin_ui_error.cc
index 7f021d0239d..119a117a4ff 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_ui_error.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_ui_error.cc
@@ -6,19 +6,21 @@
#include <tuple>
+#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
+#include "google_apis/gaia/google_service_auth_error.h"
#include "ui/base/l10n/l10n_util.h"
// static
SigninUIError SigninUIError::Ok() {
- return SigninUIError(Type::kOk, std::string(), base::string16());
+ return SigninUIError(Type::kOk, std::string(), std::u16string());
}
// static
SigninUIError SigninUIError::Other(const std::string& email) {
- return SigninUIError(Type::kOther, email, base::string16());
+ return SigninUIError(Type::kOther, email, std::u16string());
}
// static
@@ -41,10 +43,13 @@ SigninUIError SigninUIError::WrongReauthAccount(
// static
SigninUIError SigninUIError::AccountAlreadyUsedByAnotherProfile(
- const std::string& email) {
- return SigninUIError(
+ const std::string& email,
+ const base::FilePath& another_profile_path) {
+ SigninUIError error(
Type::kAccountAlreadyUsedByAnotherProfile, email,
l10n_util::GetStringUTF16(IDS_SYNC_USER_NAME_IN_USE_ERROR));
+ error.another_profile_path_ = another_profile_path;
+ return error;
}
// static
@@ -57,6 +62,35 @@ SigninUIError SigninUIError::ProfileWasUsedByAnotherAccount(
base::UTF8ToUTF16(last_email)));
}
+// static
+SigninUIError SigninUIError::FromGoogleServiceAuthError(
+ const std::string& email,
+ const GoogleServiceAuthError& error) {
+ return SigninUIError(Type::kFromGoogleServiceAuthError, email,
+ base::UTF8ToUTF16(error.ToString()));
+}
+
+#if defined(OS_WIN)
+// static
+SigninUIError SigninUIError::FromCredentialProviderUiExitCode(
+ const std::string& email,
+ credential_provider::UiExitCodes exit_code) {
+ SigninUIError error(Type::kFromCredentialProviderUiExitCode, email,
+ base::NumberToString16(exit_code));
+ error.credential_provider_exit_code_ = exit_code;
+ return error;
+}
+#endif
+
+// static
+SigninUIError SigninUIError::ProfileIsBlocked() {
+ return SigninUIError(Type::kProfileIsBlocked, /*email=*/std::string(),
+ /*error_message=*/std::u16string());
+}
+
+SigninUIError::SigninUIError(const SigninUIError& other) = default;
+SigninUIError& SigninUIError::operator=(const SigninUIError& other) = default;
+
bool SigninUIError::IsOk() const {
return type_ == Type::kOk;
}
@@ -65,17 +99,36 @@ SigninUIError::Type SigninUIError::type() const {
return type_;
}
-const base::string16& SigninUIError::email() const {
+const std::u16string& SigninUIError::email() const {
return email_;
}
-const base::string16& SigninUIError::message() const {
+const std::u16string& SigninUIError::message() const {
return message_;
}
+const base::FilePath& SigninUIError::another_profile_path() const {
+ DCHECK(type() == Type::kAccountAlreadyUsedByAnotherProfile);
+ return another_profile_path_;
+}
+
+#if defined(OS_WIN)
+credential_provider::UiExitCodes SigninUIError::credential_provider_exit_code()
+ const {
+ DCHECK(type() == Type::kFromCredentialProviderUiExitCode);
+ return credential_provider_exit_code_;
+}
+#endif
+
bool SigninUIError::operator==(const SigninUIError& other) const {
- return std::tie(type_, email_, message_) ==
- std::tie(other.type_, other.email_, other.message_);
+ bool result = std::tie(type_, email_, message_, another_profile_path_) ==
+ std::tie(other.type_, other.email_, other.message_,
+ other.another_profile_path_);
+#if defined(OS_WIN)
+ result = result && credential_provider_exit_code_ ==
+ other.credential_provider_exit_code_;
+#endif
+ return result;
}
bool SigninUIError::operator!=(const SigninUIError& other) const {
@@ -84,5 +137,5 @@ bool SigninUIError::operator!=(const SigninUIError& other) const {
SigninUIError::SigninUIError(Type type,
const std::string& email,
- const base::string16& error_message)
+ const std::u16string& error_message)
: type_(type), email_(base::UTF8ToUTF16(email)), message_(error_message) {}
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_ui_error.h b/chromium/chrome/browser/ui/webui/signin/signin_ui_error.h
index 6c49516feb3..33006fcb8da 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_ui_error.h
+++ b/chromium/chrome/browser/ui/webui/signin/signin_ui_error.h
@@ -7,7 +7,14 @@
#include <string>
-#include "base/strings/string16.h"
+#include "base/files/file_path.h"
+#include "build/build_config.h"
+
+#if defined(OS_WIN)
+#include "chrome/credential_provider/common/gcp_strings.h"
+#endif
+
+class GoogleServiceAuthError;
// Holds different sign-in error types along with error messages for displaying
// in the UI.
@@ -22,6 +29,9 @@ class SigninUIError {
kWrongReauthAccount,
kAccountAlreadyUsedByAnotherProfile,
kProfileWasUsedByAnotherAccount,
+ kFromGoogleServiceAuthError,
+ kFromCredentialProviderUiExitCode,
+ kProfileIsBlocked,
};
// Following static functions construct a `SigninUIError` with a corresponding
@@ -33,17 +43,40 @@ class SigninUIError {
static SigninUIError WrongReauthAccount(const std::string& email,
const std::string& current_email);
static SigninUIError AccountAlreadyUsedByAnotherProfile(
- const std::string& email);
+ const std::string& email,
+ const base::FilePath& another_profile_path);
static SigninUIError ProfileWasUsedByAnotherAccount(
const std::string& email,
const std::string& last_email);
+ static SigninUIError FromGoogleServiceAuthError(
+ const std::string& email,
+ const GoogleServiceAuthError& error);
+#if defined(OS_WIN)
+ static SigninUIError FromCredentialProviderUiExitCode(
+ const std::string& email,
+ credential_provider::UiExitCodes exit_code);
+#endif
+ static SigninUIError ProfileIsBlocked();
+
+ SigninUIError(const SigninUIError& other);
+ SigninUIError& operator=(const SigninUIError& other);
// Returns true if the instance contains a non-error type.
bool IsOk() const;
Type type() const;
- const base::string16& email() const;
- const base::string16& message() const;
+ const std::u16string& email() const;
+ const std::u16string& message() const;
+
+ // Should be called only if `type()` ==
+ // `Type::kAccountAlreadyUsedByAnotherProfile`.
+ const base::FilePath& another_profile_path() const;
+
+#if defined(OS_WIN)
+ // Should be called only if `type()` ==
+ // `Type::kFromCredentialProviderUiExitCode`.
+ credential_provider::UiExitCodes credential_provider_exit_code() const;
+#endif
bool operator==(const SigninUIError& other) const;
bool operator!=(const SigninUIError& other) const;
@@ -51,12 +84,21 @@ class SigninUIError {
private:
SigninUIError(Type type,
const std::string& email,
- const base::string16& error_message);
+ const std::u16string& error_message);
// Don't forget to update operator==() when adding new class members.
Type type_;
- base::string16 email_;
- base::string16 message_;
+ std::u16string email_;
+ std::u16string message_;
+
+ // Defined only for Type::kAccountAlreadyUsedByAnotherProfile.
+ base::FilePath another_profile_path_;
+
+#if defined(OS_WIN)
+ // Defined only for Type::kFromCredentialProviderUiExitCode.
+ credential_provider::UiExitCodes credential_provider_exit_code_ =
+ credential_provider::UiExitCodes::kUiecSuccess;
+#endif
};
#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_UI_ERROR_H_
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.cc b/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
index 6acf6a18238..96546378cea 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
@@ -26,7 +26,6 @@
#include "ui/base/l10n/l10n_util.h"
SigninUIError CanOfferSignin(Profile* profile,
- CanOfferSigninType can_offer,
const std::string& gaia_id,
const std::string& email) {
if (!profile)
@@ -49,11 +48,8 @@ SigninUIError CanOfferSignin(Profile* profile,
return SigninUIError::UsernameNotAllowedByPatternFromPrefs(email);
}
- if (can_offer == CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT)
- return SigninUIError::Ok();
-
// If the identity manager already has a primary account, then this is a
- // re-auth scenario. Make sure the email just signed in corresponds to
+ // re-auth scenario. Make sure the email just signed in corresponds to
// the one sign in manager expects.
std::string current_email =
identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
@@ -76,7 +72,22 @@ SigninUIError CanOfferSignin(Profile* profile,
.GetAllProfilesAttributes();
for (const ProfileAttributesEntry* entry : entries) {
- if (!entry->IsAuthenticated())
+ // Ignore omitted profiles (these are notably profiles being created
+ // using the signed-in profile creation flow). This is motivated by
+ // these profile hanging around until the next restart which could
+ // block subsequent profile creation, resulting in
+ // SigninUIError::AccountAlreadyUsedByAnotherProfile.
+ // TODO(crbug.com/1196290): This opens the possibility for getting
+ // into a state with 2 profiles syncing to the same account:
+ // - start creating a new profile and sign-in,
+ // - enabled sync for the same account in another (existing) profile,
+ // - finish the profile creation by consenting to sync.
+ // Properly addressing this would require deleting profiles from
+ // cancelled flow right away, returning an error here for omitted
+ // profiles, and fix the code that switches to the other syncing
+ // profile so that the profile creation flow window gets activated for
+ // profiles being created (instead of opening a new window).
+ if (!entry->IsAuthenticated() || entry->IsOmitted())
continue;
// For backward compatibility, need to check also the username of the
@@ -87,7 +98,8 @@ SigninUIError CanOfferSignin(Profile* profile,
std::string profile_email = base::UTF16ToUTF8(entry->GetUserName());
if (gaia_id == profile_gaia_id ||
gaia::AreEmailsSame(email, profile_email)) {
- return SigninUIError::AccountAlreadyUsedByAnotherProfile(email);
+ return SigninUIError::AccountAlreadyUsedByAnotherProfile(
+ email, entry->GetPath());
}
}
}
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.h b/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.h
index 0eb11010f05..a9b8ae20147 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.h
+++ b/chromium/chrome/browser/ui/webui/signin/signin_utils_desktop.h
@@ -10,17 +10,10 @@
class Profile;
class SigninUIError;
-// Argument for |CanOfferSignin|.
-enum CanOfferSigninType {
- CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
- CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT
-};
-
// Returns a non-error if sign-in is allowed for account with |email| and
// |gaia_id| to |profile|. If the sign-in is not allowed, then the error type
// and the error message are passed in the returned value.
SigninUIError CanOfferSignin(Profile* profile,
- CanOfferSigninType can_offer_type,
const std::string& gaia_id,
const std::string& email);
diff --git a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
index 2953d8d1d0d..f2efd0cd3d5 100644
--- a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -80,8 +80,8 @@ void SyncConfirmationHandler::RegisterMessages() {
base::BindRepeating(&SyncConfirmationHandler::HandleInitializedWithSize,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
- "accountImageRequest",
- base::BindRepeating(&SyncConfirmationHandler::HandleAccountImageRequest,
+ "accountInfoRequest",
+ base::BindRepeating(&SyncConfirmationHandler::HandleAccountInfoRequest,
base::Unretained(this)));
}
@@ -103,19 +103,19 @@ void SyncConfirmationHandler::HandleUndo(const base::ListValue* args) {
CloseModalSigninWindow(LoginUIService::ABORT_SYNC);
}
-void SyncConfirmationHandler::HandleAccountImageRequest(
+void SyncConfirmationHandler::HandleAccountInfoRequest(
const base::ListValue* args) {
DCHECK(ProfileSyncServiceFactory::IsSyncAllowed(profile_));
base::Optional<AccountInfo> primary_account_info =
identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
- identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+ identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
- // Fire the "account-image-changed" listener from |SetUserImageURL()|.
+ // Fire the "account-info-changed" listener from |SetAccountInfo()|.
// Note: If the account info is not available yet in the
// IdentityManager, i.e. account_info is empty, the listener will be
// fired again through |OnAccountUpdated()|.
- if (primary_account_info)
- SetUserImageURL(primary_account_info->picture_url);
+ if (primary_account_info && primary_account_info->IsValid())
+ SetAccountInfo(*primary_account_info);
}
void SyncConfirmationHandler::RecordConsent(const base::ListValue* args) {
@@ -151,30 +151,28 @@ void SyncConfirmationHandler::RecordConsent(const base::ListValue* args) {
consent_auditor::ConsentAuditor* consent_auditor =
ConsentAuditorFactory::GetForProfile(profile_);
consent_auditor->RecordSyncConsent(
- identity_manager_->GetPrimaryAccountId(ConsentLevel::kNotRequired),
+ identity_manager_->GetPrimaryAccountId(ConsentLevel::kSignin),
sync_consent);
}
-void SyncConfirmationHandler::SetUserImageURL(const std::string& picture_url) {
+void SyncConfirmationHandler::SetAccountInfo(const AccountInfo& info) {
+ DCHECK(info.IsValid());
if (!ProfileSyncServiceFactory::IsSyncAllowed(profile_)) {
// The sync disabled confirmation handler does not present the user image.
// Avoid updating the image URL in this case.
return;
}
- GURL picture_gurl(picture_url);
- if (!picture_gurl.is_valid()) {
- // As long as the provided gaia picture is not valid, stick to the default
- // avatar provided in the load-time data.
- return;
- }
-
+ GURL picture_gurl(info.picture_url);
GURL picture_gurl_with_options = signin::GetAvatarImageURLWithOptions(
picture_gurl, kProfileImageSize, false /* no_silhouette */);
- base::Value picture_url_value(picture_gurl_with_options.spec());
+
+ base::Value value(base::Value::Type::DICTIONARY);
+ value.SetKey("src", base::Value(picture_gurl_with_options.spec()));
+ value.SetKey("showEnterpriseBadge", base::Value(info.IsManaged()));
AllowJavascript();
- FireWebUIListener("account-image-changed", picture_url_value);
+ FireWebUIListener("account-info-changed", value);
}
void SyncConfirmationHandler::OnExtendedAccountInfoUpdated(
@@ -183,12 +181,12 @@ void SyncConfirmationHandler::OnExtendedAccountInfoUpdated(
return;
if (info.account_id !=
- identity_manager_->GetPrimaryAccountId(ConsentLevel::kNotRequired)) {
+ identity_manager_->GetPrimaryAccountId(ConsentLevel::kSignin)) {
return;
}
identity_manager_->RemoveObserver(this);
- SetUserImageURL(info.picture_url);
+ SetAccountInfo(info);
}
void SyncConfirmationHandler::CloseModalSigninWindow(
@@ -221,7 +219,7 @@ void SyncConfirmationHandler::HandleInitializedWithSize(
base::Optional<AccountInfo> primary_account_info =
identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
- identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+ identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
if (!primary_account_info) {
// No account is signed in, so there is nothing to be displayed in the sync
// confirmation dialog.
@@ -231,7 +229,7 @@ void SyncConfirmationHandler::HandleInitializedWithSize(
if (!primary_account_info->IsValid()) {
identity_manager_->AddObserver(this);
} else {
- SetUserImageURL(primary_account_info->picture_url);
+ SetAccountInfo(*primary_account_info);
}
if (browser_)
diff --git a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.h b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
index becbc76ba36..8c69d6156c3 100644
--- a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
+++ b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
@@ -23,7 +23,7 @@ class IdentityManager;
}
// WebUI message handler for the sync confirmation dialog. IdentityManager calls
-// in this class use signin::ConsentLevel::kNotRequired because the user hasn't
+// in this class use signin::ConsentLevel::kSignin because the user hasn't
// consented to sync yet.
class SyncConfirmationHandler : public content::WebUIMessageHandler,
public signin::IdentityManager::Observer,
@@ -70,10 +70,10 @@ class SyncConfirmationHandler : public content::WebUIMessageHandler,
// a single integer value for the height the native view should resize to.
virtual void HandleInitializedWithSize(const base::ListValue* args);
- // Handles the "accountImageRequest" message sent after the
- // "account-image-changed" WebUIListener was added. This method calls
- // |SetUserImageURL| with the signed-in user's picture url.
- virtual void HandleAccountImageRequest(const base::ListValue* args);
+ // Handles the "accountInfoRequest" message sent after the
+ // "account-info-changed" WebUIListener was added. This method calls
+ // |SetAccountInfo| with the signed-in user's picture url.
+ virtual void HandleAccountInfoRequest(const base::ListValue* args);
// Records the user's consent to sync. Called from |HandleConfirm| and
// |HandleGoToSettings|, and expects two parameters to be passed through
@@ -85,8 +85,9 @@ class SyncConfirmationHandler : public content::WebUIMessageHandler,
// manner, i.e. clicks on the confirmation button or the settings link.
virtual void RecordConsent(const base::ListValue* args);
- // Sets the profile picture shown in the dialog to the image at |url|.
- virtual void SetUserImageURL(const std::string& url);
+ // Sets the account image shown in the dialog based on |info|, which is
+ // expected to be valid.
+ virtual void SetAccountInfo(const AccountInfo& info);
// Closes the modal signin window and calls
// LoginUIService::SyncConfirmationUIClosed with |result|. |result| indicates
diff --git a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
index 15ea67b8746..73ff06f2279 100644
--- a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
@@ -56,7 +56,6 @@ class TestingSyncConfirmationHandler : public SyncConfirmationHandler {
using SyncConfirmationHandler::HandleInitializedWithSize;
using SyncConfirmationHandler::HandleGoToSettings;
using SyncConfirmationHandler::RecordConsent;
- using SyncConfirmationHandler::SetUserImageURL;
private:
DISALLOW_COPY_AND_ASSIGN(TestingSyncConfirmationHandler);
@@ -158,12 +157,11 @@ class SyncConfirmationHandlerTest : public BrowserWithTestWindowTest,
sync_confirmation_ui_closed_result_ = result;
}
- void ExpectAccountImageChanged(
- const content::TestWebUI::CallData& call_data) {
+ void ExpectAccountInfoChanged(const content::TestWebUI::CallData& call_data) {
EXPECT_EQ("cr.webUIListenerCallback", call_data.function_name());
std::string event;
ASSERT_TRUE(call_data.arg1()->GetAsString(&event));
- EXPECT_EQ("account-image-changed", event);
+ EXPECT_EQ("account-info-changed", event);
signin::IdentityManager* identity_manager =
IdentityManagerFactory::GetForProfile(profile());
@@ -180,8 +178,13 @@ class SyncConfirmationHandlerTest : public BrowserWithTestWindowTest,
false /* no_silhouette */)
.spec();
std::string passed_picture_url;
- ASSERT_TRUE(call_data.arg2()->GetAsString(&passed_picture_url));
- EXPECT_EQ(expected_picture_url, passed_picture_url);
+ const base::Value* src = call_data.arg2()->FindKey("src");
+ EXPECT_NE(src, nullptr);
+ EXPECT_EQ(expected_picture_url, src->GetString());
+ const base::Value* show_enterprise_badge =
+ call_data.arg2()->FindKey("showEnterpriseBadge");
+ EXPECT_NE(show_enterprise_badge, nullptr);
+ EXPECT_EQ(primary_account->IsManaged(), show_enterprise_badge->GetBool());
}
protected:
@@ -213,7 +216,7 @@ const char SyncConfirmationHandlerTest::kConsentText3[] = "consentText3";
const char SyncConfirmationHandlerTest::kConsentText4[] = "consentText4";
const char SyncConfirmationHandlerTest::kConsentText5[] = "consentText5";
-TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReady) {
+TEST_F(SyncConfirmationHandlerTest, TestSetAccountInfoIfPrimaryAccountReady) {
identity_test_env()->SimulateSuccessfulFetchOfAccountInfo(
account_info_.account_id, account_info_.email, account_info_.gaia, "",
"full_name", "given_name", "locale",
@@ -224,10 +227,11 @@ TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReady) {
handler()->HandleInitializedWithSize(&args);
ASSERT_EQ(1U, web_ui()->call_data().size());
- ExpectAccountImageChanged(*web_ui()->call_data()[0]);
+ ExpectAccountInfoChanged(*web_ui()->call_data()[0]);
}
-TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReadyLater) {
+TEST_F(SyncConfirmationHandlerTest,
+ TestSetAccountInfoIfPrimaryAccountReadyLater) {
base::ListValue args;
args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight));
handler()->HandleInitializedWithSize(&args);
@@ -241,11 +245,11 @@ TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReadyLater) {
"http://picture.example.com/picture.jpg");
ASSERT_EQ(1U, web_ui()->call_data().size());
- ExpectAccountImageChanged(*web_ui()->call_data()[0]);
+ ExpectAccountInfoChanged(*web_ui()->call_data()[0]);
}
TEST_F(SyncConfirmationHandlerTest,
- TestSetImageIgnoredIfSecondaryAccountUpdated) {
+ TestSetAccountInfoIgnoredIfSecondaryAccountUpdated) {
base::ListValue args;
args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight));
handler()->HandleInitializedWithSize(&args);
@@ -270,7 +274,21 @@ TEST_F(SyncConfirmationHandlerTest,
// Updating the account info of the primary account should update the
// image of the sync confirmation dialog.
ASSERT_EQ(1U, web_ui()->call_data().size());
- ExpectAccountImageChanged(*web_ui()->call_data()[0]);
+ ExpectAccountInfoChanged(*web_ui()->call_data()[0]);
+}
+
+TEST_F(SyncConfirmationHandlerTest, TestSetAccountInfoManaged) {
+ identity_test_env()->SimulateSuccessfulFetchOfAccountInfo(
+ account_info_.account_id, account_info_.email, account_info_.gaia,
+ "google.com", "full_name", "given_name", "locale",
+ "http://picture.example.com/picture.jpg");
+
+ base::ListValue args;
+ args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight));
+ handler()->HandleInitializedWithSize(&args);
+
+ ASSERT_EQ(1U, web_ui()->call_data().size());
+ ExpectAccountInfoChanged(*web_ui()->call_data()[0]);
}
TEST_F(SyncConfirmationHandlerTest, TestHandleUndo) {
diff --git a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
index dcaf46e7ea5..768fdca3114 100644
--- a/chromium/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/signin/profile_colors_util.h"
#include "chrome/browser/ui/webui/signin/sync_confirmation_handler.h"
+#include "chrome/common/themes/autogenerated_theme_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
@@ -31,6 +32,15 @@
#include "ui/resources/grit/webui_generated_resources.h"
#include "ui/resources/grit/webui_resources.h"
+namespace {
+
+SkColor GetFrameColor(SkColor theme_color) {
+ auto theme_colors = GetAutogeneratedThemeColors(theme_color);
+ return theme_colors.frame_color;
+}
+
+} // namespace
+
SyncConfirmationUI::SyncConfirmationUI(content::WebUI* web_ui)
: SigninWebDialogUI(web_ui), profile_(Profile::FromWebUI(web_ui)) {
// Initializing the WebUIDataSource in the constructor is needed for polymer
@@ -67,9 +77,14 @@ void SyncConfirmationUI::Initialize(
{"sync_confirmation_browser_proxy.js",
IDR_SYNC_CONFIRMATION_BROWSER_PROXY_JS},
{"sync_confirmation.js", IDR_SYNC_CONFIRMATION_JS},
+ {chrome::kChromeUISyncConfirmationLoadingPath,
+ IDR_SYNC_LOADING_CONFIRMATION_HTML},
};
source->AddResourcePaths(kResources);
+ AddStringResource(source, "syncLoadingConfirmationTitle",
+ IDS_SYNC_LOADING_CONFIRMATION_TITLE);
+
if (is_sync_allowed) {
InitializeForSyncConfirmation(source, profile_creation_flow_color);
} else {
@@ -120,7 +135,7 @@ void SyncConfirmationUI::InitializeForSyncConfirmation(
const int kAccountPictureSize = 128;
std::string avatar_picture_url;
if (profile_creation_flow_color.has_value()) {
- SkColor fill_color = *profile_creation_flow_color;
+ SkColor fill_color = GetFrameColor(*profile_creation_flow_color);
gfx::Image avatar_picture = profiles::GetPlaceholderAvatarIconWithColors(
/*fill_color=*/fill_color,
/*stroke_color=*/GetAvatarStrokeColor(fill_color), kAccountPictureSize);
@@ -149,8 +164,9 @@ void SyncConfirmationUI::InitializeForSyncConfirmation(
}
AddStringResource(source, "syncConfirmationUndoLabel", IDS_NO_THANKS);
- source->AddString("highlightColor", color_utils::SkColorToRgbaString(
- *profile_creation_flow_color));
+ source->AddString("highlightColor",
+ color_utils::SkColorToRgbaString(
+ GetFrameColor(*profile_creation_flow_color)));
source->AddResourcePath(
"images/sync_confirmation_refreshed_illustration.svg",
diff --git a/chromium/chrome/browser/ui/webui/signin_internals_ui.cc b/chromium/chrome/browser/ui/webui/signin_internals_ui.cc
index 550968a052f..5a95c0fc049 100644
--- a/chromium/chrome/browser/ui/webui/signin_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin_internals_ui.cc
@@ -34,6 +34,7 @@ content::WebUIDataSource* CreateSignInInternalsHTMLSource() {
source->UseStringsJs();
source->AddResourcePath("signin_internals.js", IDR_SIGNIN_INTERNALS_INDEX_JS);
+ source->AddResourcePath("signin_index.css", IDR_SIGNIN_INTERNALS_INDEX_CSS);
source->SetDefaultResource(IDR_SIGNIN_INTERNALS_INDEX_HTML);
return source;
}
@@ -44,6 +45,22 @@ SignInInternalsUI::SignInInternalsUI(content::WebUI* web_ui)
: WebUIController(web_ui) {
Profile* profile = Profile::FromWebUI(web_ui);
content::WebUIDataSource::Add(profile, CreateSignInInternalsHTMLSource());
+ web_ui->AddMessageHandler(std::make_unique<SignInInternalsHandler>());
+}
+
+SignInInternalsUI::~SignInInternalsUI() = default;
+
+SignInInternalsHandler::SignInInternalsHandler() = default;
+
+SignInInternalsHandler::~SignInInternalsHandler() {
+ // This handler can be destroyed without OnJavascriptDisallowed() ever being
+ // called (https://crbug.com/1199198). Call it to ensure that `this` is
+ // removed as an observer.
+ OnJavascriptDisallowed();
+}
+
+void SignInInternalsHandler::OnJavascriptAllowed() {
+ Profile* profile = Profile::FromWebUI(web_ui());
if (profile) {
AboutSigninInternals* about_signin_internals =
AboutSigninInternalsFactory::GetForProfile(profile);
@@ -52,7 +69,7 @@ SignInInternalsUI::SignInInternalsUI(content::WebUI* web_ui)
}
}
-SignInInternalsUI::~SignInInternalsUI() {
+void SignInInternalsHandler::OnJavascriptDisallowed() {
Profile* profile = Profile::FromWebUI(web_ui());
if (profile) {
AboutSigninInternals* about_signin_internals =
@@ -63,50 +80,53 @@ SignInInternalsUI::~SignInInternalsUI() {
}
}
-bool SignInInternalsUI::OverrideHandleWebUIMessage(
- const GURL& source_url,
- const std::string& name,
- const base::ListValue& content) {
- if (name == "getSigninInfo") {
- Profile* profile = Profile::FromWebUI(web_ui());
- if (!profile)
- return false;
+void SignInInternalsHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "getSigninInfo",
+ base::BindRepeating(&SignInInternalsHandler::HandleGetSignInInfo,
+ base::Unretained(this)));
+}
- AboutSigninInternals* about_signin_internals =
- AboutSigninInternalsFactory::GetForProfile(profile);
- // TODO(vishwath): The UI would look better if we passed in a dict with some
- // reasonable defaults, so the about:signin-internals page doesn't look
- // empty in incognito mode. Alternatively, we could force about:signin to
- // open in non-incognito mode always (like about:settings for ex.).
- if (about_signin_internals) {
- web_ui()->CallJavascriptFunctionUnsafe(
- "chrome.signin.getSigninInfo.handleReply",
- *about_signin_internals->GetSigninStatus());
-
- signin::IdentityManager* identity_manager =
- IdentityManagerFactory::GetForProfile(profile);
- signin::AccountsInCookieJarInfo accounts_in_cookie_jar =
- identity_manager->GetAccountsInCookieJar();
- if (accounts_in_cookie_jar.accounts_are_fresh) {
- about_signin_internals->OnAccountsInCookieUpdated(
- accounts_in_cookie_jar,
- GoogleServiceAuthError(GoogleServiceAuthError::NONE));
- }
-
- return true;
- }
+void SignInInternalsHandler::HandleGetSignInInfo(const base::ListValue* args) {
+ std::string callback_id = args->GetList()[0].GetString();
+ AllowJavascript();
+
+ Profile* profile = Profile::FromWebUI(web_ui());
+ if (!profile) {
+ ResolveJavascriptCallback(base::Value(callback_id), base::Value());
+ return;
+ }
+
+ AboutSigninInternals* about_signin_internals =
+ AboutSigninInternalsFactory::GetForProfile(profile);
+ if (!about_signin_internals) {
+ ResolveJavascriptCallback(base::Value(callback_id), base::Value());
+ return;
+ }
+
+ // TODO(vishwath): The UI would look better if we passed in a dict with some
+ // reasonable defaults, so the about:signin-internals page doesn't look
+ // empty in incognito mode. Alternatively, we could force about:signin to
+ // open in non-incognito mode always (like about:settings for ex.).
+ ResolveJavascriptCallback(base::Value(callback_id),
+ *about_signin_internals->GetSigninStatus());
+ signin::IdentityManager* identity_manager =
+ IdentityManagerFactory::GetForProfile(profile);
+ signin::AccountsInCookieJarInfo accounts_in_cookie_jar =
+ identity_manager->GetAccountsInCookieJar();
+ if (accounts_in_cookie_jar.accounts_are_fresh) {
+ about_signin_internals->OnAccountsInCookieUpdated(
+ accounts_in_cookie_jar,
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE));
}
- return false;
}
-void SignInInternalsUI::OnSigninStateChanged(
+void SignInInternalsHandler::OnSigninStateChanged(
const base::DictionaryValue* info) {
- web_ui()->CallJavascriptFunctionUnsafe(
- "chrome.signin.onSigninInfoChanged.fire", *info);
+ FireWebUIListener("signin-info-changed", *info);
}
-void SignInInternalsUI::OnCookieAccountsFetched(
+void SignInInternalsHandler::OnCookieAccountsFetched(
const base::DictionaryValue* info) {
- web_ui()->CallJavascriptFunctionUnsafe(
- "chrome.signin.onCookieAccountsFetched.fire", *info);
+ FireWebUIListener("update-cookie-accounts", *info);
}
diff --git a/chromium/chrome/browser/ui/webui/signin_internals_ui.h b/chromium/chrome/browser/ui/webui/signin_internals_ui.h
index 217a72291a8..0b7d21751e0 100644
--- a/chromium/chrome/browser/ui/webui/signin_internals_ui.h
+++ b/chromium/chrome/browser/ui/webui/signin_internals_ui.h
@@ -10,27 +10,39 @@
#include "base/values.h"
#include "components/signin/core/browser/about_signin_internals.h"
#include "content/public/browser/web_ui_controller.h"
+#include "content/public/browser/web_ui_message_handler.h"
// The implementation for the chrome://signin-internals page.
-class SignInInternalsUI : public content::WebUIController,
- public AboutSigninInternals::Observer {
+class SignInInternalsUI : public content::WebUIController {
public:
explicit SignInInternalsUI(content::WebUI* web_ui);
~SignInInternalsUI() override;
- // content::WebUIController implementation.
- bool OverrideHandleWebUIMessage(const GURL& source_url,
- const std::string& name,
- const base::ListValue& args) override;
+ SignInInternalsUI(const SignInInternalsUI&) = delete;
+ SignInInternalsUI& operator=(const SignInInternalsUI&) = delete;
+};
+
+class SignInInternalsHandler : public content::WebUIMessageHandler,
+ public AboutSigninInternals::Observer {
+ public:
+ SignInInternalsHandler();
+ ~SignInInternalsHandler() override;
+
+ SignInInternalsHandler(const SignInInternalsHandler&) = delete;
+ SignInInternalsHandler& operator=(const SignInInternalsHandler&) = delete;
+
+ // content::WebUIMessageHandler:
+ void RegisterMessages() override;
+ void OnJavascriptAllowed() override;
+ void OnJavascriptDisallowed() override;
+
+ void HandleGetSignInInfo(const base::ListValue* args);
// AboutSigninInternals::Observer::OnSigninStateChanged implementation.
void OnSigninStateChanged(const base::DictionaryValue* info) override;
// Notification that the cookie accounts are ready to be displayed.
void OnCookieAccountsFetched(const base::DictionaryValue* info) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(SignInInternalsUI);
};
#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INTERNALS_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/sync_file_system_internals/OWNERS b/chromium/chrome/browser/ui/webui/sync_file_system_internals/OWNERS
index 20f262936de..86da7f4de7a 100644
--- a/chromium/chrome/browser/ui/webui/sync_file_system_internals/OWNERS
+++ b/chromium/chrome/browser/ui/webui/sync_file_system_internals/OWNERS
@@ -1,4 +1,5 @@
calvinlo@chromium.org
kinuko@chromium.org
+mek@chromium.org
nhiroki@chromium.org
pwnall@chromium.org
diff --git a/chromium/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc b/chromium/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
index 93669a82fd9..de98822fa6d 100644
--- a/chromium/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
@@ -31,9 +31,9 @@ void DumpDatabaseHandler::HandleGetDatabaseDump(const base::ListValue* args) {
sync_file_system::SyncFileSystemService* sync_service =
SyncFileSystemServiceFactory::GetForProfile(profile_);
if (sync_service) {
- sync_service->DumpDatabase(base::AdaptCallbackForRepeating(base::BindOnce(
+ sync_service->DumpDatabase(base::BindOnce(
&DumpDatabaseHandler::DidGetDatabaseDump, base::Unretained(this),
- args->GetList()[0].GetString() /* callback_id */)));
+ args->GetList()[0].GetString() /* callback_id */));
}
}
diff --git a/chromium/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc b/chromium/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
index 3bfd716580a..b829fa45ba0 100644
--- a/chromium/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
@@ -61,9 +61,8 @@ void FileMetadataHandler::HandleGetFileMetadata(const base::ListValue* args) {
if (!sync_service)
return;
sync_service->DumpFiles(
- origin, base::AdaptCallbackForRepeating(
- base::BindOnce(&FileMetadataHandler::DidGetFileMetadata,
- weak_factory_.GetWeakPtr(), callback_id)));
+ origin, base::BindOnce(&FileMetadataHandler::DidGetFileMetadata,
+ weak_factory_.GetWeakPtr(), callback_id));
}
void FileMetadataHandler::HandleGetExtensions(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_browsertest.js b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_browsertest.js
index 3a0aa976740..d51f70fd0cc 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_browsertest.js
+++ b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_browsertest.js
@@ -36,7 +36,7 @@ SyncInternalsWebUITest.prototype = {
* @protected
*/
hasInDetails: function(isValid, key, value) {
- const details = chrome.sync.aboutInfo.details;
+ const details = getAboutInfoForTest().details;
if (!details) {
return false;
}
@@ -154,7 +154,7 @@ const HARD_CODED_ALL_NODES = [{
* A value to return in mock onReceivedUpdatedAboutInfo event.
* @const
*/
-HARD_CODED_ABOUT_INFO = {
+const HARD_CODED_ABOUT_INFO = {
'actionable_error': [
{
'stat_status': 'uninitialized',
@@ -180,13 +180,11 @@ HARD_CODED_ABOUT_INFO = {
'actionable_error_detected': false,
'details': [
{
- 'data': [
- {
- 'stat_status': '',
- 'stat_name': 'Summary',
- 'stat_value': 'Sync service initialized'
- }
- ],
+ 'data': [{
+ 'stat_status': '',
+ 'stat_name': 'Summary',
+ 'stat_value': 'Sync service initialized'
+ }],
'is_sensitive': false,
'title': 'Summary'
},
@@ -227,7 +225,7 @@ NETWORK_EVENT_DETAILS_2 = {
};
TEST_F('SyncInternalsWebUITest', 'Uninitialized', function() {
- assertNotEquals(null, chrome.sync.aboutInfo);
+ assertNotEquals(null, getAboutInfoForTest());
});
GEN('#if defined(OS_CHROMEOS)');
@@ -259,33 +257,32 @@ GEN('#endif // defined(OS_CHROMEOS)');
TEST_F('SyncInternalsWebUITest', 'LoadPastedAboutInfo', function() {
// Expose the text field.
- $('import-status').click();
+ document.querySelector('#import-status').click();
// Fill it with fake data.
- $('status-text').value = JSON.stringify(HARD_CODED_ABOUT_INFO);
+ document.querySelector('#status-text').value =
+ JSON.stringify(HARD_CODED_ABOUT_INFO);
// Trigger the import.
- $('import-status').click();
+ document.querySelector('#import-status').click();
expectTrue(this.hasInDetails(true, 'Summary', 'Sync service initialized'));
});
TEST_F('SyncInternalsWebUITest', 'NetworkEventsTest', function() {
- const networkEvent1 = new Event('onProtocolEvent');
- networkEvent1.details = NETWORK_EVENT_DETAILS_1;
- const networkEvent2 = new Event('onProtocolEvent');
- networkEvent2.details = NETWORK_EVENT_DETAILS_2;
-
- chrome.sync.events.dispatchEvent(networkEvent1);
- chrome.sync.events.dispatchEvent(networkEvent2);
+ cr.webUIListenerCallback('onProtocolEvent', NETWORK_EVENT_DETAILS_1);
+ cr.webUIListenerCallback('onProtocolEvent', NETWORK_EVENT_DETAILS_2);
// Make sure that both events arrived.
- const eventCount = $('traffic-event-container').children.length;
+ const eventCount =
+ document.querySelector('#traffic-event-container').children.length;
assertGE(eventCount, 2);
// Check that the event details are displayed.
- const displayedEvent1 = $('traffic-event-container').children[eventCount - 2];
- const displayedEvent2 = $('traffic-event-container').children[eventCount - 1];
+ const displayedEvent1 = document.querySelector('#traffic-event-container')
+ .children[eventCount - 2];
+ const displayedEvent2 = document.querySelector('#traffic-event-container')
+ .children[eventCount - 1];
expectTrue(
displayedEvent1.innerHTML.includes(NETWORK_EVENT_DETAILS_1.details));
expectTrue(displayedEvent1.innerHTML.includes(NETWORK_EVENT_DETAILS_1.type));
@@ -294,19 +291,20 @@ TEST_F('SyncInternalsWebUITest', 'NetworkEventsTest', function() {
expectTrue(displayedEvent2.innerHTML.includes(NETWORK_EVENT_DETAILS_2.type));
// Test that repeated events are not re-displayed.
- chrome.sync.events.dispatchEvent(networkEvent1);
- expectEquals(eventCount, $('traffic-event-container').children.length);
+ cr.webUIListenerCallback('onProtocolEvent', NETWORK_EVENT_DETAILS_1);
+ expectEquals(
+ eventCount,
+ document.querySelector('#traffic-event-container').children.length);
});
TEST_F('SyncInternalsWebUITest', 'SearchTabDoesntChangeOnItemSelect',
function() {
// Select the search tab.
- $('sync-search-tab').selected = true;
- expectTrue($('sync-search-tab').selected);
+ document.querySelector('#sync-search-tab').selected = true;
+ expectTrue(document.querySelector('#sync-search-tab').selected);
// Build the data model and attach to result list.
- cr.ui.List.decorate($('sync-results-list'));
- $('sync-results-list').dataModel = new cr.ui.ArrayDataModel([
+ setupSyncResultsListForTest([
{
value: 'value 0',
toString: function() {
@@ -322,26 +320,27 @@ TEST_F('SyncInternalsWebUITest', 'SearchTabDoesntChangeOnItemSelect',
]);
// Select the first list item and verify the search tab remains selected.
- $('sync-results-list').getListItemByIndex(0).selected = true;
- expectTrue($('sync-search-tab').selected);
+ document.querySelector('#sync-results-list').getListItemByIndex(0).selected =
+ true;
+ expectTrue(document.querySelector('#sync-search-tab').selected);
});
TEST_F('SyncInternalsWebUITest', 'NodeBrowserTest', function() {
- chrome.sync.getAllNodes = (callback) => {
- callback(HARD_CODED_ALL_NODES);
- };
+ setAllNodesForTest(HARD_CODED_ALL_NODES);
// Hit the refresh button.
- $('node-browser-refresh-button').click();
+ document.querySelector('#node-browser-refresh-button').click();
// Check that the refresh time was updated.
- expectNotEquals($('node-browser-refresh-time').textContent, 'Never');
+ expectNotEquals(
+ document.querySelector('#node-browser-refresh-time').textContent,
+ 'Never');
// Verify some hard-coded assumptions. These depend on the value of the
// hard-coded nodes, specified elsewhere in this file.
// Start with the tree itself.
- const tree = $('sync-node-tree');
+ const tree = document.querySelector('#sync-node-tree');
assertEquals(1, tree.items.length);
// Check the type root and expand it.
@@ -354,39 +353,43 @@ TEST_F('SyncInternalsWebUITest', 'NodeBrowserTest', function() {
const leaf = typeRoot.items[0];
// Verify that selecting it affects the details view.
- expectTrue($('node-details').hasAttribute('hidden'));
+ expectTrue(document.querySelector('#node-details').hasAttribute('hidden'));
leaf.selected = true;
- expectFalse($('node-details').hasAttribute('hidden'));
+ expectFalse(document.querySelector('#node-details').hasAttribute('hidden'));
});
TEST_F('SyncInternalsWebUITest', 'NodeBrowserRefreshOnTabSelect', function() {
- chrome.sync.getAllNodes = (callback) => {
- callback(HARD_CODED_ALL_NODES);
- };
+ setAllNodesForTest(HARD_CODED_ALL_NODES);
// Should start with non-refreshed node browser.
- expectEquals($('node-browser-refresh-time').textContent, 'Never');
+ expectEquals(
+ document.querySelector('#node-browser-refresh-time').textContent,
+ 'Never');
// Selecting the tab will refresh it.
- $('sync-browser-tab').selected = true;
- expectNotEquals($('node-browser-refresh-time').textContent, 'Never');
+ document.querySelector('#sync-browser-tab').selected = true;
+ expectNotEquals(
+ document.querySelector('#node-browser-refresh-time').textContent,
+ 'Never');
// Re-selecting the tab shouldn't re-refresh.
- $('node-browser-refresh-time').textContent = 'TestCanary';
- $('sync-browser-tab').selected = false;
- $('sync-browser-tab').selected = true;
- expectEquals($('node-browser-refresh-time').textContent, 'TestCanary');
+ document.querySelector('#node-browser-refresh-time').textContent =
+ 'TestCanary';
+ document.querySelector('#sync-browser-tab').selected = false;
+ document.querySelector('#sync-browser-tab').selected = true;
+ expectEquals(
+ document.querySelector('#node-browser-refresh-time').textContent,
+ 'TestCanary');
});
// Tests that the events log page correctly receives and displays an event.
TEST_F('SyncInternalsWebUITest', 'EventLogTest', function() {
// Dispatch an event.
- const connectionEvent = new Event('onConnectionStatusChange');
- connectionEvent.details = {'status': 'CONNECTION_OK'};
- chrome.sync.events.dispatchEvent(connectionEvent);
+ cr.webUIListenerCallback(
+ 'onConnectionStatusChange', {'status': 'CONNECTION_OK'});
// Verify that it is displayed in the events log.
- const syncEventsTable = $('sync-events');
+ const syncEventsTable = document.querySelector('#sync-events');
assertGE(syncEventsTable.children.length, 1);
const lastRow = syncEventsTable.children[syncEventsTable.children.length - 1];
@@ -407,15 +410,15 @@ TEST_F('SyncInternalsWebUITest', 'EventLogTest', function() {
TEST_F('SyncInternalsWebUITest', 'DumpSyncEventsToText', function() {
// Dispatch an event.
- const connectionEvent = new Event('onConnectionStatusChange');
- connectionEvent.details = {'status': 'CONNECTION_OK'};
- chrome.sync.events.dispatchEvent(connectionEvent);
+ connectionEvent = {'status': 'CONNECTION_OK'};
+ cr.webUIListenerCallback('onConnectionStatusChange',
+ { 'status': 'CONNECTION_OK' });
// Click the dump-to-text button.
- $('dump-to-text').click();
+ document.querySelector('#dump-to-text').click();
// Verify our event is among the results.
- const eventDumpText = $('data-dump').textContent;
+ const eventDumpText = document.querySelector('#data-dump').textContent;
expectGE(eventDumpText.indexOf('onConnectionStatusChange'), 0);
expectGE(eventDumpText.indexOf('CONNECTION_OK'), 0);
diff --git a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
index b149bee7c50..f87b2cfaab9 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -116,12 +116,6 @@ void SyncInternalsMessageHandler::RegisterMessages() {
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
- syncer::sync_ui_util::kRequestUserEventsVisibility,
- base::BindRepeating(
- &SyncInternalsMessageHandler::HandleRequestUserEventsVisibility,
- base::Unretained(this)));
-
- web_ui()->RegisterMessageCallback(
syncer::sync_ui_util::kSetIncludeSpecifics,
base::BindRepeating(
&SyncInternalsMessageHandler::HandleSetIncludeSpecifics,
@@ -199,7 +193,8 @@ void SyncInternalsMessageHandler::HandleRequestListOfTypes(
type_list->AppendString(ModelTypeToString(type));
}
event_details.Set(syncer::sync_ui_util::kTypes, std::move(type_list));
- DispatchEvent(syncer::sync_ui_util::kOnReceivedListOfTypes, event_details);
+ FireWebUIListener(syncer::sync_ui_util::kOnReceivedListOfTypes,
+ event_details);
}
void SyncInternalsMessageHandler::HandleRequestIncludeSpecificsInitialState(
@@ -211,16 +206,16 @@ void SyncInternalsMessageHandler::HandleRequestIncludeSpecificsInitialState(
value.SetBoolean(syncer::sync_ui_util::kIncludeSpecifics,
GetIncludeSpecificsInitialState());
- DispatchEvent(syncer::sync_ui_util::kOnReceivedIncludeSpecificsInitialState,
- value);
+ FireWebUIListener(
+ syncer::sync_ui_util::kOnReceivedIncludeSpecificsInitialState, value);
}
void SyncInternalsMessageHandler::HandleGetAllNodes(const ListValue* args) {
DCHECK_EQ(1U, args->GetSize());
AllowJavascript();
- int request_id = 0;
- bool success = ExtractIntegerValue(args, &request_id);
+ std::string callback_id;
+ bool success = args->GetString(0, &callback_id);
DCHECK(success);
SyncService* service = GetSyncService();
@@ -231,20 +226,10 @@ void SyncInternalsMessageHandler::HandleGetAllNodes(const ListValue* args) {
// should javascript become disallowed.
service->GetAllNodesForDebugging(
base::BindOnce(&SyncInternalsMessageHandler::OnReceivedAllNodes,
- weak_ptr_factory_.GetWeakPtr(), request_id));
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
}
-void SyncInternalsMessageHandler::HandleRequestUserEventsVisibility(
- const base::ListValue* args) {
- DCHECK(args->empty());
- AllowJavascript();
- // TODO(crbug.com/934333): Get rid of this callback now that user events are
- // always enabled.
- CallJavascriptFunction(syncer::sync_ui_util::kUserEventsVisibilityCallback,
- Value(true));
-}
-
void SyncInternalsMessageHandler::HandleSetIncludeSpecifics(
const ListValue* args) {
DCHECK_EQ(1U, args->GetSize());
@@ -328,10 +313,9 @@ void SyncInternalsMessageHandler::HandleTriggerRefresh(
}
void SyncInternalsMessageHandler::OnReceivedAllNodes(
- int request_id,
+ const std::string& callback_id,
std::unique_ptr<ListValue> nodes) {
- CallJavascriptFunction(syncer::sync_ui_util::kGetAllNodesCallback,
- Value(request_id), *nodes);
+ ResolveJavascriptCallback(base::Value(callback_id), *nodes);
}
void SyncInternalsMessageHandler::OnStateChanged(SyncService* sync) {
@@ -341,7 +325,7 @@ void SyncInternalsMessageHandler::OnStateChanged(SyncService* sync) {
void SyncInternalsMessageHandler::OnProtocolEvent(
const syncer::ProtocolEvent& event) {
std::unique_ptr<DictionaryValue> value(event.ToValue(include_specifics_));
- DispatchEvent(syncer::sync_ui_util::kOnProtocolEvent, *value);
+ FireWebUIListener(syncer::sync_ui_util::kOnProtocolEvent, *value);
}
void SyncInternalsMessageHandler::OnInvalidationReceived(
@@ -362,7 +346,8 @@ void SyncInternalsMessageHandler::OnInvalidationReceived(
}
}
- DispatchEvent(syncer::sync_ui_util::kOnInvalidationReceived, data_types_list);
+ FireWebUIListener(syncer::sync_ui_util::kOnInvalidationReceived,
+ data_types_list);
}
void SyncInternalsMessageHandler::HandleJsEvent(
@@ -370,13 +355,14 @@ void SyncInternalsMessageHandler::HandleJsEvent(
const syncer::JsEventDetails& details) {
DVLOG(1) << "Handling event: " << name << " with details "
<< details.ToString();
- DispatchEvent(name, details.Get());
+ FireWebUIListener(name, details.Get());
}
void SyncInternalsMessageHandler::SendAboutInfoAndEntityCounts() {
- std::unique_ptr<DictionaryValue> value =
- about_sync_data_delegate_.Run(GetSyncService(), chrome::GetChannel());
- DispatchEvent(syncer::sync_ui_util::kOnAboutInfoUpdated, *value);
+ std::unique_ptr<DictionaryValue> value = about_sync_data_delegate_.Run(
+ GetSyncService(),
+ chrome::GetChannelName(chrome::WithExtendedStable(true)));
+ FireWebUIListener(syncer::sync_ui_util::kOnAboutInfoUpdated, *value);
if (SyncService* service = GetSyncService()) {
service->GetEntityCountsForDebugging(
@@ -404,8 +390,8 @@ void SyncInternalsMessageHandler::OnGotEntityCounts(
DictionaryValue event_details;
event_details.SetPath(syncer::sync_ui_util::kEntityCounts,
std::move(count_list));
- DispatchEvent(syncer::sync_ui_util::kOnEntityCountsUpdated,
- std::move(event_details));
+ FireWebUIListener(syncer::sync_ui_util::kOnEntityCountsUpdated,
+ std::move(event_details));
}
SyncService* SyncInternalsMessageHandler::GetSyncService() {
@@ -419,12 +405,6 @@ SyncInternalsMessageHandler::GetSyncInvalidationsService() {
Profile::FromWebUI(web_ui())->GetOriginalProfile());
}
-void SyncInternalsMessageHandler::DispatchEvent(const std::string& name,
- const Value& details_value) {
- CallJavascriptFunction(syncer::sync_ui_util::kDispatchEvent, Value(name),
- details_value);
-}
-
void SyncInternalsMessageHandler::UnregisterModelNotifications() {
SyncService* service = GetSyncService();
if (!service)
diff --git a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
index 5b473f3472c..b5bf2384e2f 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
+++ b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
@@ -16,7 +16,6 @@
#include "components/sync/invalidations/invalidations_listener.h"
#include "components/sync/js/js_controller.h"
#include "components/sync/js/js_event_handler.h"
-#include "components/version_info/channel.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace syncer {
@@ -52,9 +51,6 @@ class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
// Handler for getAllNodes message. Needs a |request_id| argument.
void HandleGetAllNodes(const base::ListValue* args);
- // Handler for requests to get UserEvents tab visibility.
- void HandleRequestUserEventsVisibility(const base::ListValue* args);
-
// Handler for setting internal state of if specifics should be included in
// protocol events when sent to be displayed.
void HandleSetIncludeSpecifics(const base::ListValue* args);
@@ -79,7 +75,7 @@ class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
const syncer::JsEventDetails& details) override;
// Callback used in GetAllNodes.
- void OnReceivedAllNodes(int request_id,
+ void OnReceivedAllNodes(const std::string& callback_id,
std::unique_ptr<base::ListValue> nodes);
// syncer::SyncServiceObserver implementation.
@@ -95,7 +91,7 @@ class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
using AboutSyncDataDelegate =
base::RepeatingCallback<std::unique_ptr<base::DictionaryValue>(
syncer::SyncService* service,
- version_info::Channel channel)>;
+ const std::string& channel)>;
// Constructor used for unit testing to override dependencies.
explicit SyncInternalsMessageHandler(
@@ -119,9 +115,6 @@ class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
// return nullptr (e.g. if sync invalidations are not enabled).
syncer::SyncInvalidationsService* GetSyncInvalidationsService();
- // Sends a dispatch event to the UI. Javascript must be enabled.
- void DispatchEvent(const std::string& name, const base::Value& details_value);
-
// Unregisters for notifications from all notifications coming from the sync
// machinery. Leaves notifications hooked into the UI alone.
void UnregisterModelNotifications();
diff --git a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
index cb01769aa02..87fef67a618 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h"
#include <memory>
+#include <string>
#include <utility>
#include "base/bind.h"
@@ -129,7 +130,7 @@ class SyncInternalsMessageHandlerTest : public ChromeRenderViewHostTestHarness {
// Returns copies of the same constant dictionary, |about_information_|.
std::unique_ptr<DictionaryValue> ConstructFakeAboutInformation(
SyncService* service,
- version_info::Channel channel) {
+ const std::string& channel) {
++about_sync_data_delegate_call_count_;
last_delegate_sync_service_ = service;
return base::DictionaryValue::From(
@@ -142,8 +143,7 @@ class SyncInternalsMessageHandlerTest : public ChromeRenderViewHostTestHarness {
// Check the syncer::sync_ui_util::kOnAboutInfoUpdated event dispatch.
const content::TestWebUI::CallData& about_info_call_data =
*web_ui_.call_data()[0];
- EXPECT_EQ(syncer::sync_ui_util::kDispatchEvent,
- about_info_call_data.function_name());
+ EXPECT_EQ("cr.webUIListenerCallback", about_info_call_data.function_name());
ASSERT_NE(nullptr, about_info_call_data.arg1());
EXPECT_EQ(base::Value(syncer::sync_ui_util::kOnAboutInfoUpdated),
*about_info_call_data.arg1());
@@ -154,7 +154,7 @@ class SyncInternalsMessageHandlerTest : public ChromeRenderViewHostTestHarness {
// so check the syncer::sync_ui_util::kOnEntityCountsUpdated event dispatch.
const content::TestWebUI::CallData& entity_counts_updated_call_data =
*web_ui_.call_data()[1];
- EXPECT_EQ(syncer::sync_ui_util::kDispatchEvent,
+ EXPECT_EQ("cr.webUIListenerCallback",
entity_counts_updated_call_data.function_name());
ASSERT_NE(nullptr, entity_counts_updated_call_data.arg1());
EXPECT_EQ(base::Value(syncer::sync_ui_util::kOnEntityCountsUpdated),
@@ -253,24 +253,28 @@ TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObserversSyncDisabled) {
TEST_F(SyncInternalsMessageHandlerTest, HandleGetAllNodes) {
ListValue args;
- args.AppendInteger(0);
+ args.AppendString("getAllNodes_0");
handler()->HandleGetAllNodes(&args);
test_sync_service()->get_all_nodes_callback().Run(
std::make_unique<ListValue>());
- EXPECT_EQ(1, CallCountWithName(syncer::sync_ui_util::kGetAllNodesCallback));
+ EXPECT_EQ(1, CallCountWithName("cr.webUIResponse"));
- handler()->HandleGetAllNodes(&args);
+ ListValue args2;
+ args2.AppendString("getAllNodes_1");
+ handler()->HandleGetAllNodes(&args2);
// This breaks the weak ref the callback is hanging onto. Which results in
// the call count not incrementing.
handler()->DisallowJavascript();
test_sync_service()->get_all_nodes_callback().Run(
std::make_unique<ListValue>());
- EXPECT_EQ(1, CallCountWithName(syncer::sync_ui_util::kGetAllNodesCallback));
+ EXPECT_EQ(1, CallCountWithName("cr.webUIResponse"));
- handler()->HandleGetAllNodes(&args);
+ ListValue args3;
+ args3.AppendString("getAllNodes_2");
+ handler()->HandleGetAllNodes(&args3);
test_sync_service()->get_all_nodes_callback().Run(
std::make_unique<ListValue>());
- EXPECT_EQ(2, CallCountWithName(syncer::sync_ui_util::kGetAllNodesCallback));
+ EXPECT_EQ(2, CallCountWithName("cr.webUIResponse"));
}
TEST_F(SyncInternalsMessageHandlerTest, SendAboutInfo) {
diff --git a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc
index c8c52da9654..1ef0831ea1e 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc
@@ -10,7 +10,8 @@
#include "chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
-#include "components/grit/sync_driver_resources.h"
+#include "components/grit/sync_driver_sync_internals_resources.h"
+#include "components/grit/sync_driver_sync_internals_resources_map.h"
#include "components/sync/driver/sync_internals_util.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -29,32 +30,9 @@ content::WebUIDataSource* CreateSyncInternalsHTMLSource() {
"trusted-types jstemplate cr-ui-tree-js-static;");
source->UseStringsJs();
-
- static constexpr webui::ResourcePath kResources[] = {
- {syncer::sync_ui_util::kSyncIndexJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS},
- {syncer::sync_ui_util::kChromeSyncJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS},
- {syncer::sync_ui_util::kSyncLogJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS},
- {syncer::sync_ui_util::kSyncNodeBrowserJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_NODE_BROWSER_JS},
- {syncer::sync_ui_util::kSyncSearchJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_SEARCH_JS},
- {syncer::sync_ui_util::kAboutJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_ABOUT_JS},
- {syncer::sync_ui_util::kDataJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_DATA_JS},
- {syncer::sync_ui_util::kEventsJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_EVENTS_JS},
- {syncer::sync_ui_util::kSearchJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SEARCH_JS},
- {syncer::sync_ui_util::kUserEventsJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_USER_EVENTS_JS},
- {syncer::sync_ui_util::kTrafficLogJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_TRAFFIC_LOG_JS},
- {syncer::sync_ui_util::kInvalidationsJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_INVALIDATIONS_JS},
- };
- source->AddResourcePaths(kResources);
+ source->AddResourcePaths(
+ base::make_span(kSyncDriverSyncInternalsResources,
+ kSyncDriverSyncInternalsResourcesSize));
source->SetDefaultResource(IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_HTML);
return source;
diff --git a/chromium/chrome/browser/ui/webui/system_info_ui.cc b/chromium/chrome/browser/ui/webui/system_info_ui.cc
index a9d39ab1105..2aaa185db2d 100644
--- a/chromium/chrome/browser/ui/webui/system_info_ui.cc
+++ b/chromium/chrome/browser/ui/webui/system_info_ui.cc
@@ -80,14 +80,16 @@ class SystemInfoHandler : public WebUIMessageHandler {
// WebUIMessageHandler implementation.
void RegisterMessages() override;
+ void OnJavascriptDisallowed() override;
// Callback for the "requestSystemInfo" message. This asynchronously requests
// system info and eventually returns it to the front end.
- void HandleRequestSystemInfo(const base::ListValue*);
+ void HandleRequestSystemInfo(const base::ListValue* args);
void OnSystemInfo(std::unique_ptr<SystemLogsResponse> sys_info);
private:
+ std::string callback_id_;
base::WeakPtrFactory<SystemInfoHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(SystemInfoHandler);
};
@@ -101,15 +103,22 @@ SystemInfoHandler::SystemInfoHandler() {}
SystemInfoHandler::~SystemInfoHandler() {}
+void SystemInfoHandler::OnJavascriptDisallowed() {
+ weak_ptr_factory_.InvalidateWeakPtrs();
+ callback_id_.clear();
+}
+
void SystemInfoHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"requestSystemInfo",
base::BindRepeating(&SystemInfoHandler::HandleRequestSystemInfo,
- weak_ptr_factory_.GetWeakPtr()));
+ base::Unretained(this)));
}
-void SystemInfoHandler::HandleRequestSystemInfo(const base::ListValue*) {
+void SystemInfoHandler::HandleRequestSystemInfo(const base::ListValue* args) {
AllowJavascript();
+ callback_id_ = args->GetList()[0].GetString();
+
system_logs::SystemLogsFetcher* fetcher =
system_logs::BuildAboutSystemLogsFetcher();
fetcher->Fetch(base::BindOnce(&SystemInfoHandler::OnSystemInfo,
@@ -129,7 +138,8 @@ void SystemInfoHandler::OnSystemInfo(
val->SetString("statValue", it->second);
data.Append(std::move(val));
}
- CallJavascriptFunction("returnSystemInfo", data);
+ ResolveJavascriptCallback(base::Value(callback_id_), data);
+ callback_id_.clear();
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search.mojom b/chromium/chrome/browser/ui/webui/tab_search/tab_search.mojom
index e2f0d589721..135f7e954f3 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search.mojom
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search.mojom
@@ -9,6 +9,7 @@ import "mojo/public/mojom/base/time.mojom";
// Collection of window details associated with a profile.
struct ProfileData {
array<Window> windows;
+ array<RecentlyClosedTab> recently_closed_tabs;
};
// Properties and tabs associated with a window.
@@ -51,8 +52,32 @@ struct Tab {
// Whether the tab strip should show the icon.
bool show_icon;
- // Time ticks when the tab is last active.
+ // Time ticks when the tab is last active. This value is used to order open
+ // tabs by recency.
mojo_base.mojom.TimeTicks last_active_time_ticks;
+
+ // String representing the elapsed time since the tab was last active.
+ string last_active_elapsed_text;
+};
+
+// Information about a recently closed tab.
+struct RecentlyClosedTab {
+ // The unique identifier of the tab.
+ int32 tab_id;
+
+ // The title of the tab.
+ string title;
+
+ // The URL of the tab.
+ // TODO(crbug.com/1099917): Change this and elsewhere to use url.mojom.Url.
+ string url;
+
+ // Elapsed time since the tab was last closed. This value is used to order
+ // closed tabs by recency.
+ mojo_base.mojom.Time last_active_time_ticks;
+
+ // String representing the elapsed time since the tab was closed.
+ string last_active_elapsed_text;
};
// Collection of tab groups.
@@ -90,12 +115,12 @@ interface PageHandler {
// Get tab groups for the current profile.
GetTabGroups() => (TabGroups tab_groups);
- // Show the feedback page.
- ShowFeedbackPage();
-
// Switch to a specific tab.
SwitchToTab(SwitchToTabInfo switch_to_tab_info);
+ // Open a recently closed tab.
+ OpenRecentlyClosedTab(int32 tab_id);
+
// Notify the backend that the UI is ready to be shown.
ShowUI();
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
index c0110fff236..2545e53c4fb 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include <memory>
+#include <set>
#include <string>
#include <utility>
#include <vector>
@@ -19,26 +20,38 @@
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/favicon/favicon_utils.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_live_tab_context.h"
#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/tabs/tab_renderer_data.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/util/image_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "ui/base/l10n/time_format.h"
namespace {
constexpr base::TimeDelta kTabsChangeDelay =
base::TimeDelta::FromMilliseconds(50);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-constexpr char kFeedbackCategoryTag[] = "FromTabSearch";
-#else
-constexpr char kFeedbackCategoryTag[] = "FromTabSearchBrowser";
-#endif
+std::string GetLastActiveElapsedText(
+ const base::TimeTicks& last_active_time_ticks) {
+ const base::TimeDelta elapsed =
+ base::TimeTicks::Now() - last_active_time_ticks;
+ return base::UTF16ToUTF8(ui::TimeFormat::Simple(
+ ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, elapsed));
}
+std::string GetLastActiveElapsedText(const base::Time& last_active_time) {
+ const base::TimeDelta elapsed = base::Time::Now() - last_active_time;
+ return base::UTF16ToUTF8(ui::TimeFormat::Simple(
+ ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, elapsed));
+}
+} // namespace
+
TabSearchPageHandler::TabSearchPageHandler(
mojo::PendingReceiver<tab_search::mojom::PageHandler> receiver,
mojo::PendingRemote<tab_search::mojom::Page> page,
@@ -129,18 +142,6 @@ void TabSearchPageHandler::GetTabGroups(GetTabGroupsCallback callback) {
NOTIMPLEMENTED();
}
-void TabSearchPageHandler::ShowFeedbackPage() {
- Browser* browser = chrome::FindLastActive();
- if (!browser)
- return;
- chrome::ShowFeedbackPage(browser,
- chrome::FeedbackSource::kFeedbackSourceTabSearch,
- std::string() /* description_template */,
- std::string() /* description_placeholder_text */,
- std::string(kFeedbackCategoryTag) /* category_tag */,
- std::string() /* extra_diagnostics */);
-}
-
void TabSearchPageHandler::SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) {
base::Optional<TabDetails> optional_details =
@@ -155,6 +156,21 @@ void TabSearchPageHandler::SwitchToTab(
details.browser->window()->Activate();
}
+void TabSearchPageHandler::OpenRecentlyClosedTab(int32_t tab_id) {
+ sessions::TabRestoreService* tab_restore_service =
+ TabRestoreServiceFactory::GetForProfile(Profile::FromWebUI(web_ui_));
+ if (!tab_restore_service)
+ return;
+ Browser* active_browser = chrome::FindLastActive();
+ if (!active_browser)
+ return;
+ tab_restore_service->RestoreEntryById(
+ BrowserLiveTabContext::FindContextForWebContents(
+ active_browser->tab_strip_model()->GetActiveWebContents()),
+ SessionID::FromSerializedValue(tab_id),
+ WindowOpenDisposition::NEW_FOREGROUND_TAB);
+}
+
void TabSearchPageHandler::ShowUI() {
auto embedder = webui_controller_->embedder();
if (embedder)
@@ -166,6 +182,8 @@ tab_search::mojom::ProfileDataPtr TabSearchPageHandler::CreateProfileData() {
Browser* active_browser = chrome::FindLastActive();
if (!active_browser)
return profile_data;
+
+ std::set<std::string> tab_urls;
for (auto* browser : *BrowserList::GetInstance()) {
if (!ShouldTrackBrowser(browser))
continue;
@@ -174,15 +192,92 @@ tab_search::mojom::ProfileDataPtr TabSearchPageHandler::CreateProfileData() {
window->active = (browser == active_browser);
window->height = browser->window()->GetContentsSize().height();
for (int i = 0; i < tab_strip_model->count(); ++i) {
- window->tabs.push_back(
- GetTabData(tab_strip_model, tab_strip_model->GetWebContentsAt(i), i));
+ tab_search::mojom::TabPtr tab =
+ GetTab(tab_strip_model, tab_strip_model->GetWebContentsAt(i), i);
+ tab_urls.insert(tab->url);
+ window->tabs.push_back(std::move(tab));
}
profile_data->windows.push_back(std::move(window));
}
+
+ AddRecentlyClosedTabs(profile_data->recently_closed_tabs, tab_urls);
+ DCHECK(features::kTabSearchRecentlyClosedMaxEntries.Get() >= 0);
+ DCHECK(profile_data->recently_closed_tabs.size() <=
+ static_cast<unsigned int>(
+ features::kTabSearchRecentlyClosedMaxEntries.Get()));
return profile_data;
}
-tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
+void TabSearchPageHandler::AddRecentlyClosedTabs(
+ std::vector<tab_search::mojom::RecentlyClosedTabPtr>& recently_closed_tabs,
+ std::set<std::string>& tab_urls) {
+ sessions::TabRestoreService* tab_restore_service =
+ TabRestoreServiceFactory::GetForProfile(Profile::FromWebUI(web_ui_));
+ const size_t kMaxTabCount =
+ static_cast<size_t>(features::kTabSearchRecentlyClosedMaxEntries.Get());
+ if (tab_restore_service) {
+ // Flatten tab restore service entries into tabs. Ignore any entries that
+ // match URLs that are currently open.
+ for (auto& entry : tab_restore_service->entries()) {
+ if (entry->type == sessions::TabRestoreService::Type::WINDOW) {
+ sessions::TabRestoreService::Window* window =
+ static_cast<sessions::TabRestoreService::Window*>(entry.get());
+ for (auto& tab : window->tabs) {
+ if (!AddRecentlyClosedTab(recently_closed_tabs, tab.get(), tab_urls,
+ kMaxTabCount)) {
+ return;
+ }
+ }
+ } else if (entry->type == sessions::TabRestoreService::Type::TAB) {
+ sessions::TabRestoreService::Tab* tab =
+ static_cast<sessions::TabRestoreService::Tab*>(entry.get());
+ if (!AddRecentlyClosedTab(recently_closed_tabs, tab, tab_urls,
+ kMaxTabCount)) {
+ return;
+ }
+ } else if (entry->type == sessions::TabRestoreService::Type::GROUP) {
+ sessions::TabRestoreService::Group* group =
+ static_cast<sessions::TabRestoreService::Group*>(entry.get());
+ for (auto& tab : group->tabs) {
+ if (!AddRecentlyClosedTab(recently_closed_tabs, tab.get(), tab_urls,
+ kMaxTabCount)) {
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+bool TabSearchPageHandler::AddRecentlyClosedTab(
+ std::vector<tab_search::mojom::RecentlyClosedTabPtr>& recently_closed_tabs,
+ sessions::TabRestoreService::Tab* tab,
+ std::set<std::string>& tab_urls,
+ size_t max_tab_count) {
+ if (recently_closed_tabs.size() >= max_tab_count)
+ return false;
+
+ if (tab->navigations.size() == 0)
+ return true;
+
+ tab_search::mojom::RecentlyClosedTabPtr recently_closed_tab =
+ GetRecentlyClosedTab(tab);
+
+ // New tab page entries may exist inside a window and should be
+ // ignored.
+ if (recently_closed_tab->url == GURL(chrome::kChromeUINewTabPageURL))
+ return true;
+
+ if (tab_urls.count(recently_closed_tab->url))
+ return true;
+
+ tab_urls.insert(recently_closed_tab->url);
+ recently_closed_tabs.push_back(std::move(recently_closed_tab));
+
+ return true;
+}
+
+tab_search::mojom::TabPtr TabSearchPageHandler::GetTab(
TabStripModel* tab_strip_model,
content::WebContents* contents,
int index) {
@@ -200,7 +295,9 @@ tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
TabRendererData::FromTabInModel(tab_strip_model, index);
tab_data->pinned = tab_renderer_data.pinned;
tab_data->title = base::UTF16ToUTF8(tab_renderer_data.title);
- tab_data->url = tab_renderer_data.visible_url.spec();
+ tab_data->url = tab_renderer_data.last_committed_url.is_empty()
+ ? tab_renderer_data.visible_url.spec()
+ : tab_renderer_data.last_committed_url.spec();
if (tab_renderer_data.favicon.isNull()) {
tab_data->is_default_favicon = true;
@@ -213,11 +310,34 @@ tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
}
tab_data->show_icon = tab_renderer_data.show_icon;
- tab_data->last_active_time_ticks = contents->GetLastActiveTime();
+
+ const base::TimeTicks last_active_time_ticks = contents->GetLastActiveTime();
+ tab_data->last_active_time_ticks = last_active_time_ticks;
+ tab_data->last_active_elapsed_text =
+ GetLastActiveElapsedText(last_active_time_ticks);
return tab_data;
}
+tab_search::mojom::RecentlyClosedTabPtr
+TabSearchPageHandler::GetRecentlyClosedTab(
+ sessions::TabRestoreService::Tab* tab) {
+ auto recently_closed_tab = tab_search::mojom::RecentlyClosedTab::New();
+ DCHECK(tab->navigations.size() > 0);
+ sessions::SerializedNavigationEntry& entry =
+ tab->navigations[tab->current_navigation_index];
+ recently_closed_tab->tab_id = tab->id.id();
+ recently_closed_tab->url = entry.virtual_url().spec();
+ recently_closed_tab->title = entry.title().empty()
+ ? recently_closed_tab->url
+ : base::UTF16ToUTF8(entry.title());
+ const base::Time last_active_time_ticks = entry.timestamp();
+ recently_closed_tab->last_active_time_ticks = last_active_time_ticks;
+ recently_closed_tab->last_active_elapsed_text =
+ GetLastActiveElapsedText(last_active_time_ticks);
+ return recently_closed_tab;
+}
+
void TabSearchPageHandler::OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
@@ -251,7 +371,7 @@ void TabSearchPageHandler::TabChangedAt(content::WebContents* contents,
if (!browser)
return;
TRACE_EVENT0("browser", "custom_metric:TabSearchPageHandler:TabChangedAt");
- page_->TabUpdated(GetTabData(browser->tab_strip_model(), contents, index));
+ page_->TabUpdated(GetTab(browser->tab_strip_model(), contents, index));
}
void TabSearchPageHandler::ScheduleDebounce() {
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
index daabd11d2fe..f06f14ddb38 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
@@ -13,6 +13,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h"
+#include "components/sessions/core/tab_restore_service.h"
#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
@@ -48,9 +49,9 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
void CloseTab(int32_t tab_id) override;
void GetProfileData(GetProfileDataCallback callback) override;
void GetTabGroups(GetTabGroupsCallback callback) override;
- void ShowFeedbackPage() override;
void SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) override;
+ void OpenRecentlyClosedTab(int32_t tab_id) override;
void ShowUI() override;
// TODO(tluk): Remove this once all uses of the CloseUI() interface are
// removed from the Tab Search WebUI code.
@@ -87,9 +88,27 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
tab_search::mojom::ProfileDataPtr CreateProfileData();
- tab_search::mojom::TabPtr GetTabData(TabStripModel* tab_strip_model,
- content::WebContents* contents,
- int index);
+ // Adds recently closed tabs in a flattened list.
+ void AddRecentlyClosedTabs(
+ std::vector<tab_search::mojom::RecentlyClosedTabPtr>&
+ recently_closed_tabs,
+ std::set<std::string>& tab_urls);
+
+ // Tries to add a single recently closed tab to a flattened list. Returns
+ // whether the the tab fits within |max_tab_count|.
+ bool AddRecentlyClosedTab(
+ std::vector<tab_search::mojom::RecentlyClosedTabPtr>&
+ recently_closed_tabs,
+ sessions::TabRestoreService::Tab* tab,
+ std::set<std::string>& tab_urls,
+ size_t max_tab_count);
+
+ tab_search::mojom::TabPtr GetTab(TabStripModel* tab_strip_model,
+ content::WebContents* contents,
+ int index);
+ tab_search::mojom::RecentlyClosedTabPtr GetRecentlyClosedTab(
+ sessions::TabRestoreService::Tab* tab);
+
// Returns tab details required to perform an action on the tab.
base::Optional<TabDetails> GetTabDetails(int32_t tab_id);
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
index 3b1ccff17b9..4e98aa10af3 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
@@ -5,16 +5,18 @@
#include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include "base/test/bind.h"
-#include "base/test/metrics/histogram_tester.h"
#include "base/timer/mock_timer.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/sessions/chrome_tab_restore_service_client.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "chrome/test/base/test_browser_window.h"
#include "chrome/test/base/testing_profile_manager.h"
+#include "components/sessions/core/tab_restore_service_impl.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -71,6 +73,13 @@ void ExpectNewTab(const tab_search::mojom::Tab* tab,
EXPECT_GT(tab->last_active_time_ticks, base::TimeTicks());
}
+void ExpectRecentlyClosedTab(const tab_search::mojom::RecentlyClosedTab* tab,
+ const std::string url,
+ const std::string title) {
+ EXPECT_EQ(url, tab->url);
+ EXPECT_EQ(title, tab->title);
+}
+
void ExpectProfileTabs(tab_search::mojom::ProfileData* profile_tabs) {
ASSERT_EQ(2u, profile_tabs->windows.size());
auto* window1 = profile_tabs->windows[0].get();
@@ -111,7 +120,7 @@ class TabSearchPageHandlerTest : public BrowserWithTestWindowTest {
content::WebContents::CreateParams(profile()));
web_ui_.set_web_contents(web_contents_.get());
profile2_ = profile_manager()->CreateTestingProfile(
- "testing_profile2", nullptr, base::string16(), 0, std::string(),
+ "testing_profile2", nullptr, std::u16string(), 0, std::string(),
GetTestingFactories());
browser2_ = CreateTestBrowser(profile1(), false);
browser3_ =
@@ -162,6 +171,14 @@ class TabSearchPageHandlerTest : public BrowserWithTestWindowTest {
void FireTimer() { handler_->mock_debounce_timer()->Fire(); }
bool IsTimerRunning() { return handler_->mock_debounce_timer()->IsRunning(); }
+ static std::unique_ptr<KeyedService> GetTabRestoreService(
+ content::BrowserContext* browser_context) {
+ return std::make_unique<sessions::TabRestoreServiceImpl>(
+ std::make_unique<ChromeTabRestoreServiceClient>(
+ Profile::FromBrowserContext(browser_context)),
+ nullptr, nullptr);
+ }
+
protected:
void AddTabWithTitle(Browser* browser,
const GURL url,
@@ -351,16 +368,121 @@ TEST_F(TabSearchPageHandlerTest, CloseTab) {
ASSERT_EQ(1, browser2()->tab_strip_model()->count());
}
-// TODO(crbug.com/1128855): Fix the test for Lacros build.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE_ShowFeedbackPage DISABLED_ShowFeedbackPage
-#else
-#define MAYBE_ShowFeedbackPage ShowFeedbackPage
-#endif
-TEST_F(TabSearchPageHandlerTest, MAYBE_ShowFeedbackPage) {
- base::HistogramTester histogram_tester;
- handler()->ShowFeedbackPage();
- histogram_tester.ExpectTotalCount("Feedback.RequestSource", 1);
+TEST_F(TabSearchPageHandlerTest, RecentlyClosedTab) {
+ TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
+ profile(),
+ base::BindRepeating(&TabSearchPageHandlerTest::GetTabRestoreService));
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+ AddTabWithTitle(browser1(), GURL(kTabUrl2), kTabName2);
+ AddTabWithTitle(browser2(), GURL(kTabUrl3), kTabName3);
+ AddTabWithTitle(browser2(), GURL(kTabUrl4), kTabName4);
+ AddTabWithTitle(browser3(), GURL(kTabUrl5), kTabName5);
+
+ int tab_id = extensions::ExtensionTabUtil::GetTabId(
+ browser1()->tab_strip_model()->GetWebContentsAt(0));
+ handler()->CloseTab(tab_id);
+ browser2()->tab_strip_model()->CloseAllTabs();
+ browser3()->tab_strip_model()->CloseAllTabs();
+ tab_search::mojom::PageHandler::GetProfileDataCallback callback =
+ base::BindLambdaForTesting(
+ [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+ auto& tabs = profile_tabs->recently_closed_tabs;
+ ASSERT_EQ(3u, tabs.size());
+ ExpectRecentlyClosedTab(tabs[0].get(), kTabUrl4, kTabName4);
+ ExpectRecentlyClosedTab(tabs[1].get(), kTabUrl3, kTabName3);
+ ExpectRecentlyClosedTab(tabs[2].get(), kTabUrl2, kTabName2);
+ });
+ handler()->GetProfileData(std::move(callback));
+ EXPECT_CALL(page_, TabUpdated(_)).Times(2);
+ EXPECT_CALL(page_, TabsRemoved(_)).Times(3);
+}
+
+TEST_F(TabSearchPageHandlerTest, OpenRecentlyClosedTab) {
+ TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
+ profile(),
+ base::BindRepeating(&TabSearchPageHandlerTest::GetTabRestoreService));
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+ AddTabWithTitle(browser1(), GURL(kTabUrl2), kTabName2);
+
+ int tab_id = extensions::ExtensionTabUtil::GetTabId(
+ browser1()->tab_strip_model()->GetWebContentsAt(0));
+ handler()->CloseTab(tab_id);
+ tab_search::mojom::PageHandler::GetProfileDataCallback callback1 =
+ base::BindLambdaForTesting(
+ [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+ auto& tabs = profile_tabs->windows[0]->tabs;
+ ASSERT_EQ(1u, tabs.size());
+ ExpectNewTab(tabs[0].get(), kTabUrl1, kTabName1, 0);
+ auto& recently_closed_tabs = profile_tabs->recently_closed_tabs;
+ ASSERT_EQ(1u, recently_closed_tabs.size());
+ ExpectRecentlyClosedTab(recently_closed_tabs[0].get(), kTabUrl2,
+ kTabName2);
+ tab_id = recently_closed_tabs[0]->tab_id;
+ });
+ handler()->GetProfileData(std::move(callback1));
+ handler()->OpenRecentlyClosedTab(tab_id);
+ tab_search::mojom::PageHandler::GetProfileDataCallback callback2 =
+ base::BindLambdaForTesting(
+ [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+ auto& tabs = profile_tabs->windows[0]->tabs;
+ ASSERT_EQ(2u, tabs.size());
+ ExpectNewTab(tabs[0].get(), kTabUrl1, kTabName1, 0);
+ ExpectNewTab(tabs[1].get(), kTabUrl2, kTabName2, 1);
+ auto& recently_closed_tabs = profile_tabs->recently_closed_tabs;
+ ASSERT_EQ(0u, recently_closed_tabs.size());
+ });
+ handler()->GetProfileData(std::move(callback2));
+ EXPECT_CALL(page_, TabUpdated(_)).Times(1);
+ EXPECT_CALL(page_, TabsRemoved(_)).Times(2);
+}
+
+TEST_F(TabSearchPageHandlerTest, RecentlyClosedTabsHaveNoRepeatedURLEntry) {
+ TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
+ profile(),
+ base::BindRepeating(&TabSearchPageHandlerTest::GetTabRestoreService));
+
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+ browser1()->tab_strip_model()->CloseAllTabs();
+ EXPECT_CALL(page_, TabsRemoved(_)).Times(1);
+ EXPECT_CALL(page_, TabUpdated(_)).Times(1);
+
+ tab_search::mojom::PageHandler::GetProfileDataCallback callback1 =
+ base::BindLambdaForTesting(
+ [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+ auto& recently_closed_tabs = profile_tabs->recently_closed_tabs;
+ ASSERT_EQ(1u, recently_closed_tabs.size());
+ ExpectRecentlyClosedTab(recently_closed_tabs[0].get(), kTabUrl1,
+ kTabName1);
+ });
+ handler()->GetProfileData(std::move(callback1));
+}
+
+TEST_F(TabSearchPageHandlerTest, RecentlyClosedTabEntriesFilterOpenTabUrls) {
+ TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
+ profile(),
+ base::BindRepeating(&TabSearchPageHandlerTest::GetTabRestoreService));
+
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+ AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+
+ int tab_id = extensions::ExtensionTabUtil::GetTabId(
+ browser1()->tab_strip_model()->GetWebContentsAt(0));
+ handler()->CloseTab(tab_id);
+
+ EXPECT_CALL(page_, TabsRemoved(_)).Times(2);
+ EXPECT_CALL(page_, TabUpdated(_)).Times(1);
+
+ tab_search::mojom::PageHandler::GetProfileDataCallback callback1 =
+ base::BindLambdaForTesting(
+ [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+ auto& tabs = profile_tabs->windows[0]->tabs;
+ ASSERT_EQ(1u, tabs.size());
+ ExpectNewTab(tabs[0].get(), kTabUrl1, kTabName1, 0);
+ auto& recently_closed_tabs = profile_tabs->recently_closed_tabs;
+ ASSERT_EQ(0u, recently_closed_tabs.size());
+ });
+ handler()->GetProfileData(std::move(callback1));
}
} // namespace
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui.cc b/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
index c546a23c8b0..406564d0ddb 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
@@ -37,18 +37,15 @@ TabSearchUI::TabSearchUI(content::WebUI* web_ui)
{"searchTabs", IDS_TAB_SEARCH_SEARCH_TABS},
{"noResultsFound", IDS_TAB_SEARCH_NO_RESULTS_FOUND},
{"closeTab", IDS_TAB_SEARCH_CLOSE_TAB},
- {"submitFeedback", IDS_TAB_SEARCH_SUBMIT_FEEDBACK},
{"a11yTabClosed", IDS_TAB_SEARCH_A11Y_TAB_CLOSED},
{"a11yFoundTab", IDS_TAB_SEARCH_A11Y_FOUND_TAB},
{"a11yFoundTabs", IDS_TAB_SEARCH_A11Y_FOUND_TABS},
{"a11yFoundTabFor", IDS_TAB_SEARCH_A11Y_FOUND_TAB_FOR},
{"a11yFoundTabsFor", IDS_TAB_SEARCH_A11Y_FOUND_TABS_FOR},
+ {"openTabs", IDS_TAB_SEARCH_OPEN_TABS},
+ {"recentlyClosedTabs", IDS_TAB_SEARCH_RECENTLY_CLOSED_TABS},
};
source->AddLocalizedStrings(kStrings);
-
- source->AddBoolean(
- "submitFeedbackEnabled",
- base::FeatureList::IsEnabled(features::kTabSearchFeedback));
source->AddBoolean("useRipples", views::PlatformStyle::kUseRipples);
// Add the configuration parameters for fuzzy search.
@@ -68,6 +65,10 @@ TabSearchUI::TabSearchUI(content::WebUI* web_ui)
features::kTabSearchMoveActiveTabToBottom.Get());
source->AddLocalizedString("close", IDS_CLOSE);
+ source->AddInteger(
+ "recentlyClosedDefaultItemDisplayCount",
+ features::kTabSearchRecentlyClosedDefaultItemDisplayCount.Get());
+
ui::Accelerator accelerator(ui::VKEY_A,
ui::EF_SHIFT_DOWN | ui::EF_PLATFORM_ACCELERATOR);
source->AddString("shortcutText", accelerator.GetShortcutText());
diff --git a/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui_browsertest.cc
index bf18d85ff84..3cae2141b2a 100644
--- a/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/tab_search/tab_search_ui_browsertest.cc
@@ -4,12 +4,10 @@
#include <string>
-#include "base/test/scoped_feature_list.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
-#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_ui.h"
#include "chrome/common/chrome_isolated_world_ids.h"
#include "chrome/common/webui_url_constants.h"
@@ -19,11 +17,6 @@
class TabSearchUIBrowserTest : public InProcessBrowserTest {
public:
- void SetUp() override {
- feature_list_.InitAndEnableFeature(features::kTabSearch);
- InProcessBrowserTest::SetUp();
- }
-
void SetUpOnMainThread() override {
AppendTab(chrome::kChromeUISettingsURL);
AppendTab(chrome::kChromeUIHistoryURL);
@@ -58,9 +51,6 @@ class TabSearchUIBrowserTest : public InProcessBrowserTest {
protected:
std::unique_ptr<content::WebContents> webui_contents_;
-
- private:
- base::test::ScopedFeatureList feature_list_;
};
// TODO(romanarora): Investigate a way to call WebUI custom methods and refactor
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
index 79694dfef5b..288bfdcab94 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
@@ -94,6 +94,8 @@ TabStripUI::TabStripUI(content::WebUI* web_ui)
TabStripUI::~TabStripUI() = default;
+WEB_UI_CONTROLLER_TYPE_IMPL(TabStripUI)
+
void TabStripUI::Initialize(Browser* browser, TabStripUIEmbedder* embedder) {
content::WebUI* const web_ui = TabStripUI::web_ui();
DCHECK_EQ(Profile::FromWebUI(web_ui), browser->profile());
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
index b30afc1e6d4..b3b508c3c8f 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
@@ -43,6 +43,7 @@ class TabStripUI : public content::WebUIController {
TabStripUIHandler* handler_ = nullptr;
+ WEB_UI_CONTROLLER_TYPE_DECL();
DISALLOW_COPY_AND_ASSIGN(TabStripUI);
};
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc
index 976587b5cf3..598260ea0f9 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc
@@ -41,12 +41,16 @@ class MockTabStripUIEmbedder : public TabStripUIEmbedder {
public:
MOCK_CONST_METHOD0(GetAcceleratorProvider, const ui::AcceleratorProvider*());
MOCK_METHOD0(CloseContainer, void());
- MOCK_METHOD2(ShowContextMenuAtPoint,
- void(gfx::Point, std::unique_ptr<ui::MenuModel>));
+ MOCK_METHOD3(ShowContextMenuAtPoint,
+ void(gfx::Point,
+ std::unique_ptr<ui::MenuModel>,
+ base::RepeatingClosure));
+ MOCK_METHOD0(CloseContextMenu, void());
MOCK_METHOD3(ShowEditDialogForGroupAtPoint,
void(gfx::Point, gfx::Rect, tab_groups::TabGroupId));
MOCK_METHOD0(GetLayout, TabStripUILayout());
MOCK_CONST_METHOD1(GetColor, SkColor(int));
+ MOCK_CONST_METHOD1(GetSystemColor, SkColor(ui::NativeTheme::ColorId));
};
} // namespace
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h
index d798f96a009..1bec1dea73e 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h
@@ -5,11 +5,13 @@
#ifndef CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_
#define CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_
+#include "base/callback_forward.h"
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_layout.h"
#include "components/tab_groups/tab_group_id.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/models/menu_model.h"
#include "ui/gfx/geometry/point.h"
+#include "ui/native_theme/native_theme.h"
// Interface to be implemented by the embedder. Provides native UI
// functionality such as showing context menus.
@@ -24,7 +26,10 @@ class TabStripUIEmbedder {
virtual void ShowContextMenuAtPoint(
gfx::Point point,
- std::unique_ptr<ui::MenuModel> menu_model) = 0;
+ std::unique_ptr<ui::MenuModel> menu_model,
+ base::RepeatingClosure on_menu_closed_callback) = 0;
+
+ virtual void CloseContextMenu() = 0;
virtual void ShowEditDialogForGroupAtPoint(gfx::Point point,
gfx::Rect rect,
@@ -33,6 +38,7 @@ class TabStripUIEmbedder {
virtual TabStripUILayout GetLayout() = 0;
virtual SkColor GetColor(int id) const = 0;
+ virtual SkColor GetSystemColor(ui::NativeTheme::ColorId id) const = 0;
};
#endif // CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
index 3e92e9fb1ec..a1dd532899f 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
@@ -28,6 +28,7 @@
#include "chrome/browser/ui/tabs/tab_menu_model.h"
#include "chrome/browser/ui/tabs/tab_renderer_data.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
+#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h"
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_metrics.h"
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h"
@@ -36,10 +37,15 @@
#include "components/tab_groups/tab_group_color.h"
#include "components/tab_groups/tab_group_id.h"
#include "components/tab_groups/tab_group_visual_data.h"
+#include "third_party/blink/public/common/input/web_gesture_event.h"
+#include "ui/aura/window_delegate.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/list_selection_model.h"
#include "ui/base/models/simple_menu_model.h"
#include "ui/base/theme_provider.h"
+#include "ui/events/event.h"
+#include "ui/events/event_utils.h"
+#include "ui/events/gesture_event_details.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/rect.h"
@@ -47,6 +53,13 @@
namespace {
+// Delay in milliseconds of when the dragging UI should be shown for touch drag.
+// Note: For better user experience, this is made shorter than
+// ET_GESTURE_LONG_PRESS delay, which is too long for this case, e.g., about
+// 650ms.
+constexpr base::TimeDelta kTouchLongpressDelay =
+ base::TimeDelta::FromMilliseconds(300);
+
std::string ConvertAlertStateToString(TabAlertState alert_state) {
switch (alert_state) {
case TabAlertState::MEDIA_RECORDING:
@@ -174,7 +187,12 @@ TabStripUIHandler::TabStripUIHandler(Browser* browser,
base::Unretained(this))),
tab_before_unload_tracker_(
base::BindRepeating(&TabStripUIHandler::OnTabCloseCancelled,
- base::Unretained(this))) {}
+ base::Unretained(this))),
+ long_press_timer_(std::make_unique<base::RetainingOneShotTimer>(
+ FROM_HERE,
+ kTouchLongpressDelay,
+ base::BindRepeating(&TabStripUIHandler::OnLongPressTimer,
+ base::Unretained(this)))) {}
TabStripUIHandler::~TabStripUIHandler() = default;
void TabStripUIHandler::NotifyLayoutChanged() {
@@ -189,8 +207,15 @@ void TabStripUIHandler::NotifyReceivedKeyboardFocus() {
FireWebUIListener("received-keyboard-focus");
}
+void TabStripUIHandler::NotifyContextMenuClosed() {
+ if (!IsJavascriptAllowed())
+ return;
+ FireWebUIListener("context-menu-closed");
+}
+
// content::WebUIMessageHandler:
void TabStripUIHandler::OnJavascriptAllowed() {
+ web_ui()->GetWebContents()->SetDelegate(this);
browser_->tab_strip_model()->AddObserver(this);
}
@@ -350,6 +375,70 @@ void TabStripUIHandler::TabBlockedStateChanged(content::WebContents* contents,
FireWebUIListener("tab-updated", GetTabData(contents, index));
}
+bool TabStripUIHandler::PreHandleGestureEvent(
+ content::WebContents* source,
+ const blink::WebGestureEvent& event) {
+ switch (event.GetType()) {
+ case blink::WebInputEvent::Type::kGestureScrollBegin:
+ // Drag and drop for the WebUI tab strip is currently only supported for
+ // Aura platforms.
+#if defined(USE_AURA)
+ // If we are passed the `kTouchLongpressDelay` threshold since the initial
+ // tap down initiate a drag on scroll start.
+ if (!long_press_timer_->IsRunning()) {
+ handling_gesture_scroll_ = true;
+
+ // If we are about to start a drag ensure the context menu is closed.
+ embedder_->CloseContextMenu();
+
+ // Synthesize a long press event to start the drag and drop session.
+ // TODO(tluk): Replace this with a better drag and drop trigger when
+ // available.
+ ui::GestureEventDetails press_details(ui::ET_GESTURE_LONG_PRESS);
+ press_details.set_device_type(
+ ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
+ ui::GestureEvent press_event(
+ touch_drag_start_point_.x(), touch_drag_start_point_.y(),
+ ui::EF_IS_SYNTHESIZED, base::TimeTicks::Now(), press_details);
+
+ auto* window = web_ui()->GetWebContents()->GetContentNativeView();
+ window->delegate()->OnGestureEvent(&press_event);
+
+ // Following the long press we need to dispatch a scroll end event to
+ // ensure the gesture stream is not left in an inconsistent state.
+ ui::GestureEventDetails scroll_end_details(ui::ET_GESTURE_SCROLL_END);
+ scroll_end_details.set_device_type(
+ ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
+ ui::GestureEvent scroll_end_event(
+ touch_drag_start_point_.x(), touch_drag_start_point_.y(),
+ ui::EF_IS_SYNTHESIZED, base::TimeTicks::Now(), scroll_end_details);
+ window->delegate()->OnGestureEvent(&scroll_end_event);
+ return true;
+ }
+ long_press_timer_->Stop();
+ return false;
+#endif // defined(USE_AURA)
+ return false;
+ case blink::WebInputEvent::Type::kGestureScrollEnd:
+ handling_gesture_scroll_ = false;
+ return false;
+ case blink::WebInputEvent::Type::kGestureTapDown:
+ touch_drag_start_point_ =
+ gfx::ToRoundedPoint(event.PositionInRootFrame());
+ long_press_timer_->Reset();
+ return false;
+ case blink::WebInputEvent::Type::kGestureLongPress:
+ // Do not block the long press if handling a scroll gesture.
+ if (handling_gesture_scroll_)
+ return false;
+ FireWebUIListener("show-context-menu");
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
// content::WebUIMessageHandler:
void TabStripUIHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
@@ -420,6 +509,12 @@ void TabStripUIHandler::RegisterMessages() {
base::Unretained(this)));
}
+void TabStripUIHandler::OnLongPressTimer() {
+ if (!IsJavascriptAllowed())
+ return;
+ FireWebUIListener("long-press");
+}
+
void TabStripUIHandler::HandleCreateNewTab(const base::ListValue* args) {
UMA_HISTOGRAM_ENUMERATION("Tab.NewTab",
TabStripModel::NEW_TAB_BUTTON_IN_WEBUI_TAB_STRIP,
@@ -557,19 +652,16 @@ void TabStripUIHandler::HandleGetThemeColors(const base::ListValue* args) {
color_utils::SkColorToRgbaString(embedder_->GetColor(
ThemeProperties::COLOR_TAB_THROBBER_WAITING)));
colors.SetString("--tabstrip-indicator-recording-color",
- color_utils::SkColorToRgbaString(
- ui::NativeTheme::GetInstanceForWeb()->GetSystemColor(
- ui::NativeTheme::kColorId_AlertSeverityHigh)));
+ color_utils::SkColorToRgbaString(embedder_->GetSystemColor(
+ ui::NativeTheme::kColorId_AlertSeverityHigh)));
colors.SetString("--tabstrip-indicator-pip-color", throbber_color);
colors.SetString("--tabstrip-indicator-capturing-color", throbber_color);
colors.SetString("--tabstrip-tab-blocked-color",
- color_utils::SkColorToRgbaString(
- ui::NativeTheme::GetInstanceForWeb()->GetSystemColor(
- ui::NativeTheme::kColorId_ProminentButtonColor)));
+ color_utils::SkColorToRgbaString(embedder_->GetSystemColor(
+ ui::NativeTheme::kColorId_ProminentButtonColor)));
colors.SetString("--tabstrip-focus-outline-color",
- color_utils::SkColorToRgbaString(
- ui::NativeTheme::GetInstanceForWeb()->GetSystemColor(
- ui::NativeTheme::kColorId_FocusedBorderColor)));
+ color_utils::SkColorToRgbaString(embedder_->GetSystemColor(
+ ui::NativeTheme::kColorId_FocusedBorderColor)));
#if !BUILDFLAG(IS_CHROMEOS_ASH)
colors.SetString(
@@ -740,7 +832,9 @@ void TabStripUIHandler::HandleShowBackgroundContextMenu(
embedder_->ShowContextMenuAtPoint(
gfx::ToRoundedPoint(point),
std::make_unique<WebUIBackgroundContextMenu>(
- browser_, embedder_->GetAcceleratorProvider()));
+ browser_, embedder_->GetAcceleratorProvider()),
+ base::BindRepeating(&TabStripUIHandler::NotifyContextMenuClosed,
+ weak_ptr_factory_.GetWeakPtr()));
}
void TabStripUIHandler::HandleShowEditDialogForGroup(
@@ -800,7 +894,9 @@ void TabStripUIHandler::HandleShowTabContextMenu(const base::ListValue* args) {
embedder_->ShowContextMenuAtPoint(
gfx::ToRoundedPoint(point),
std::make_unique<WebUITabContextMenu>(
- browser, embedder_->GetAcceleratorProvider(), tab_index));
+ browser, embedder_->GetAcceleratorProvider(), tab_index),
+ base::BindRepeating(&TabStripUIHandler::NotifyContextMenuClosed,
+ weak_ptr_factory_.GetWeakPtr()));
}
void TabStripUIHandler::HandleGetLayout(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h
index f87c6eba222..955ae9f29be 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_HANDLER_H_
#include "base/macros.h"
+#include "base/timer/timer.h"
#include "base/values.h"
#include "chrome/browser/ui/tabs/tab_change_type.h"
#include "chrome/browser/ui/tabs/tab_group.h"
@@ -13,19 +14,22 @@
#include "chrome/browser/ui/webui/tab_strip/tab_before_unload_tracker.h"
#include "chrome/browser/ui/webui/tab_strip/thumbnail_tracker.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_ui_message_handler.h"
class Browser;
class TabStripUIEmbedder;
class TabStripUIHandler : public content::WebUIMessageHandler,
- public TabStripModelObserver {
+ public TabStripModelObserver,
+ public content::WebContentsDelegate {
public:
explicit TabStripUIHandler(Browser* browser, TabStripUIEmbedder* embedder);
~TabStripUIHandler() override;
void NotifyLayoutChanged();
void NotifyReceivedKeyboardFocus();
+ void NotifyContextMenuClosed();
// TabStripModelObserver:
void OnTabGroupChanged(const TabGroupChange& change) override;
@@ -45,6 +49,10 @@ class TabStripUIHandler : public content::WebUIMessageHandler,
void TabBlockedStateChanged(content::WebContents* contents,
int index) override;
+ // content::WebContentsDelegate:
+ bool PreHandleGestureEvent(content::WebContents* source,
+ const blink::WebGestureEvent& event) override;
+
protected:
// content::WebUIMessageHandler:
void OnJavascriptAllowed() override;
@@ -64,6 +72,7 @@ class TabStripUIHandler : public content::WebUIMessageHandler,
RemoveTabIfInvalidContextMenu);
FRIEND_TEST_ALL_PREFIXES(TabStripUIHandlerTest, UngroupTab);
+ void OnLongPressTimer();
void HandleCreateNewTab(const base::ListValue* args);
base::DictionaryValue GetTabData(content::WebContents* contents, int index);
base::DictionaryValue GetTabGroupData(TabGroup* group);
@@ -96,6 +105,20 @@ class TabStripUIHandler : public content::WebUIMessageHandler,
ThumbnailTracker thumbnail_tracker_;
tab_strip_ui::TabBeforeUnloadTracker tab_before_unload_tracker_;
+ // Tracks whether we are currently handling a gesture scroll event sequence.
+ bool handling_gesture_scroll_ = false;
+
+ // The point at which the initial gesture tap event occurred and at which the
+ // drag will start.
+ gfx::Point touch_drag_start_point_;
+
+ // Timer that starts when a press gesture is encountered and runs for the
+ // duration of a long press. The timer is stopped if the tap gesture is
+ // interrupted (eg by a scroll start gesture).
+ std::unique_ptr<base::RetainingOneShotTimer> long_press_timer_;
+
+ base::WeakPtrFactory<TabStripUIHandler> weak_ptr_factory_{this};
+
DISALLOW_COPY_AND_ASSIGN(TabStripUIHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler_unittest.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler_unittest.cc
index 15c3626066e..ebd0335f85d 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler_unittest.cc
@@ -47,13 +47,18 @@ class StubTabStripUIEmbedder : public TabStripUIEmbedder {
void CloseContainer() override {}
void ShowContextMenuAtPoint(
gfx::Point point,
- std::unique_ptr<ui::MenuModel> menu_model) override {}
+ std::unique_ptr<ui::MenuModel> menu_model,
+ base::RepeatingClosure on_menu_closed_callback) override {}
+ void CloseContextMenu() override {}
void ShowEditDialogForGroupAtPoint(gfx::Point point,
gfx::Rect rect,
tab_groups::TabGroupId group_id) override {
}
TabStripUILayout GetLayout() override { return TabStripUILayout(); }
SkColor GetColor(int id) const override { return SK_ColorWHITE; }
+ SkColor GetSystemColor(ui::NativeTheme::ColorId id) const override {
+ return SK_ColorWHITE;
+ }
};
} // namespace
@@ -64,11 +69,18 @@ class TabStripUIHandlerTest : public BrowserWithTestWindowTest {
void SetUp() override {
BrowserWithTestWindowTest::SetUp();
+ web_contents_ = content::WebContents::Create(
+ content::WebContents::CreateParams(profile()));
+ web_ui_.set_web_contents(web_contents_.get());
handler_ = std::make_unique<TestTabStripUIHandler>(web_ui(), browser(),
&stub_embedder_);
handler()->AllowJavascriptForTesting();
web_ui()->ClearTrackedCalls();
}
+ void TearDown() override {
+ web_contents_.reset();
+ BrowserWithTestWindowTest::TearDown();
+ }
TabStripUIHandler* handler() { return handler_.get(); }
content::TestWebUI* web_ui() { return &web_ui_; }
@@ -87,6 +99,7 @@ class TabStripUIHandlerTest : public BrowserWithTestWindowTest {
private:
StubTabStripUIEmbedder stub_embedder_;
+ std::unique_ptr<content::WebContents> web_contents_;
content::TestWebUI web_ui_;
std::unique_ptr<TestTabStripUIHandler> handler_;
};
@@ -139,7 +152,7 @@ TEST_F(TabStripUIHandlerTest, GetGroupVisualData) {
tab_groups::TabGroupId group1 =
browser()->tab_strip_model()->AddToNewGroup({0});
const tab_groups::TabGroupVisualData group1_visuals(
- base::ASCIIToUTF16("Group 1"), tab_groups::TabGroupColorId::kGreen);
+ u"Group 1", tab_groups::TabGroupColorId::kGreen);
browser()
->tab_strip_model()
->group_model()
@@ -148,7 +161,7 @@ TEST_F(TabStripUIHandlerTest, GetGroupVisualData) {
tab_groups::TabGroupId group2 =
browser()->tab_strip_model()->AddToNewGroup({1});
const tab_groups::TabGroupVisualData group2_visuals(
- base::ASCIIToUTF16("Group 2"), tab_groups::TabGroupColorId::kCyan);
+ u"Group 2", tab_groups::TabGroupColorId::kCyan);
browser()
->tab_strip_model()
->group_model()
@@ -181,7 +194,7 @@ TEST_F(TabStripUIHandlerTest, GroupVisualDataChangedEvent) {
tab_groups::TabGroupId expected_group_id =
browser()->tab_strip_model()->AddToNewGroup({0});
const tab_groups::TabGroupVisualData new_visual_data(
- base::ASCIIToUTF16("My new title"), tab_groups::TabGroupColorId::kGreen);
+ u"My new title", tab_groups::TabGroupColorId::kGreen);
browser()
->tab_strip_model()
->group_model()
@@ -259,7 +272,7 @@ TEST_F(TabStripUIHandlerTest, MoveGroupAcrossWindows) {
// Create some visual data to make sure it gets transferred.
const tab_groups::TabGroupVisualData visual_data(
- base::ASCIIToUTF16("My group"), tab_groups::TabGroupColorId::kGreen);
+ u"My group", tab_groups::TabGroupColorId::kGreen);
new_browser.get()
->tab_strip_model()
->group_model()
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
index 1b23814e6f2..1c0444e353a 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
@@ -108,8 +108,8 @@ bool DropTabsInNewBrowser(Browser* new_browser,
drop_data.GetPickledData(ui::ClipboardFormatType::GetWebCustomDataType(),
&pickle);
- base::string16 tab_id_str;
- base::string16 group_id_str;
+ std::u16string tab_id_str;
+ std::u16string group_id_str;
ui::ReadCustomDataForType(pickle.data(), pickle.size(),
base::ASCIIToUTF16(kWebUITabIdDataType),
&tab_id_str);
diff --git a/chromium/chrome/browser/ui/webui/theme_handler.cc b/chromium/chrome/browser/ui/webui/theme_handler.cc
index 2198f534cc6..eca19120685 100644
--- a/chromium/chrome/browser/ui/webui/theme_handler.cc
+++ b/chromium/chrome/browser/ui/webui/theme_handler.cc
@@ -8,20 +8,22 @@
#include "base/bind.h"
#include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/webui/theme_source.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/grit/theme_resources.h"
-#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_ui.h"
///////////////////////////////////////////////////////////////////////////////
// ThemeHandler
ThemeHandler::ThemeHandler() = default;
-ThemeHandler::~ThemeHandler() = default;
+
+ThemeHandler::~ThemeHandler() {
+ ThemeServiceFactory::GetForProfile(GetProfile())->RemoveObserver(this);
+}
void ThemeHandler::RegisterMessages() {
// These are not actual message registrations, but can't be done in the
@@ -36,27 +38,34 @@ void ThemeHandler::RegisterMessages() {
void ThemeHandler::OnJavascriptAllowed() {
// Listen for theme installation.
- registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
- content::Source<ThemeService>(
- ThemeServiceFactory::GetForProfile(GetProfile())));
+ ThemeServiceFactory::GetForProfile(GetProfile())->AddObserver(this);
+
// Or native theme change.
- theme_observation_.Observe(ui::NativeTheme::GetInstanceForNativeUi());
+ if (web_ui()) {
+ theme_observation_.Observe(
+ webui::GetNativeTheme(web_ui()->GetWebContents()));
+ }
}
void ThemeHandler::OnJavascriptDisallowed() {
- registrar_.RemoveAll();
+ ThemeServiceFactory::GetForProfile(GetProfile())->RemoveObserver(this);
theme_observation_.Reset();
}
-void ThemeHandler::Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
+void ThemeHandler::OnThemeChanged() {
SendThemeChanged();
}
void ThemeHandler::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {
- DCHECK_EQ(observed_theme, ui::NativeTheme::GetInstanceForNativeUi());
+ // There are two types of theme update. a) The observed theme change. e.g.
+ // switch between light/dark mode. b) A different theme is enabled. e.g.
+ // switch between GTK and classic theme on Linux. Reset observer in case b).
+ ui::NativeTheme* current_theme =
+ webui::GetNativeTheme(web_ui()->GetWebContents());
+ if (observed_theme != current_theme) {
+ theme_observation_.Reset();
+ theme_observation_.Observe(current_theme);
+ }
SendThemeChanged();
}
diff --git a/chromium/chrome/browser/ui/webui/theme_handler.h b/chromium/chrome/browser/ui/webui/theme_handler.h
index f7c0c351f31..af2a7ae6b8e 100644
--- a/chromium/chrome/browser/ui/webui/theme_handler.h
+++ b/chromium/chrome/browser/ui/webui/theme_handler.h
@@ -7,8 +7,7 @@
#include "base/macros.h"
#include "base/scoped_observation.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "chrome/browser/themes/theme_service_observer.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "ui/native_theme/native_theme.h"
#include "ui/native_theme/native_theme_observer.h"
@@ -21,7 +20,7 @@ class NativeTheme;
// A class to keep the ThemeSource up to date when theme changes.
class ThemeHandler : public content::WebUIMessageHandler,
- public content::NotificationObserver,
+ public ThemeServiceObserver,
public ui::NativeThemeObserver {
public:
ThemeHandler();
@@ -36,10 +35,8 @@ class ThemeHandler : public content::WebUIMessageHandler,
// Re/set the CSS caches.
void InitializeCSSCaches();
- // content::NotificationObserver implementation.
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override;
+ // ThemeServiceObserver implementation.
+ void OnThemeChanged() override;
// ui::NativeThemeObserver:
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
@@ -52,8 +49,6 @@ class ThemeHandler : public content::WebUIMessageHandler,
Profile* GetProfile() const;
- content::NotificationRegistrar registrar_;
-
base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver>
theme_observation_{this};
diff --git a/chromium/chrome/browser/ui/webui/theme_source.cc b/chromium/chrome/browser/ui/webui/theme_source.cc
index 1386ed6ae3b..eb9cefd96fb 100644
--- a/chromium/chrome/browser/ui/webui/theme_source.cc
+++ b/chromium/chrome/browser/ui/webui/theme_source.cc
@@ -93,7 +93,7 @@ void ThemeSource::StartDataRequest(
NTPResourceCache::WindowType type =
NTPResourceCache::GetWindowType(profile_, /*render_host=*/nullptr);
NTPResourceCache* cache = NTPResourceCacheFactory::GetForProfile(profile_);
- std::move(callback).Run(cache->GetNewTabCSS(type));
+ std::move(callback).Run(cache->GetNewTabCSS(type, wc_getter));
return;
}
diff --git a/chromium/chrome/browser/ui/webui/theme_source_unittest.cc b/chromium/chrome/browser/ui/webui/theme_source_unittest.cc
index d4cc3e8e41a..7dc6f16f4f3 100644
--- a/chromium/chrome/browser/ui/webui/theme_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/theme_source_unittest.cc
@@ -8,12 +8,14 @@
#include "base/memory/ref_counted_memory.h"
#include "base/run_loop.h"
#include "base/strings/strcat.h"
+#include "base/test/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/theme_resources.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
class WebUISourcesTest : public testing::Test {
@@ -28,7 +30,7 @@ class WebUISourcesTest : public testing::Test {
theme_source()->StartDataRequest(
GURL(base::StrCat({content::kChromeUIScheme, "://",
chrome::kChromeUIThemeHost, "/", source})),
- content::WebContents::Getter(),
+ test_web_contents_getter_,
base::BindOnce(&WebUISourcesTest::SendResponse,
base::Unretained(this)));
}
@@ -39,10 +41,16 @@ class WebUISourcesTest : public testing::Test {
void SetUp() override {
profile_ = std::make_unique<TestingProfile>();
theme_source_ = std::make_unique<ThemeSource>(profile_.get());
+ test_web_contents_ = content::WebContentsTester::CreateTestWebContents(
+ profile_.get(), nullptr);
+ test_web_contents_getter_ =
+ base::BindLambdaForTesting([&] { return test_web_contents_.get(); });
}
void TearDown() override {
theme_source_.reset();
+ test_web_contents_.reset();
+ test_web_contents_getter_ = content::WebContents::Getter();
profile_.reset();
}
@@ -54,6 +62,8 @@ class WebUISourcesTest : public testing::Test {
std::unique_ptr<TestingProfile> profile_;
std::unique_ptr<ThemeSource> theme_source_;
+ std::unique_ptr<content::WebContents> test_web_contents_;
+ content::WebContents::Getter test_web_contents_getter_;
};
TEST_F(WebUISourcesTest, ThemeSourceMimeTypes) {
diff --git a/chromium/chrome/browser/ui/webui/translate_internals/translate_internals_ui.cc b/chromium/chrome/browser/ui/webui/translate_internals/translate_internals_ui.cc
index 719ae2bce9e..bb30402525e 100644
--- a/chromium/chrome/browser/ui/webui/translate_internals/translate_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/translate_internals/translate_internals_ui.cc
@@ -16,6 +16,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
+#include "components/translate/core/common/translate_util.h"
#include "components/translate/translate_internals/translate_internals_handler.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
@@ -30,6 +31,8 @@ content::WebUIDataSource* CreateTranslateInternalsHTMLSource() {
source->SetDefaultResource(IDR_TRANSLATE_INTERNALS_HTML);
source->UseStringsJs();
+ source->AddResourcePath("translate_internals.css",
+ IDR_TRANSLATE_INTERNALS_CSS);
source->AddResourcePath("translate_internals.js", IDR_TRANSLATE_INTERNALS_JS);
base::DictionaryValue langs;
@@ -41,7 +44,11 @@ content::WebUIDataSource* CreateTranslateInternalsHTMLSource() {
source->AddString(key, value);
}
- // Current language detection model is "CLD3".
+ if (translate::IsTFLiteLanguageDetectionEnabled()) {
+ source->AddString("model-version", "TFLite_v1");
+ return source;
+ }
+ // The default language detection model is "CLD3".
source->AddString("model-version", "CLD3");
return source;
diff --git a/chromium/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc b/chromium/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
index f1bf3dfe10a..dc2960a947d 100644
--- a/chromium/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
@@ -40,6 +40,6 @@ void UserActionsUIHandler::OnUserAction(const std::string& action,
if (!IsJavascriptAllowed())
return;
base::Value user_action_name(action);
- web_ui()->CallJavascriptFunctionUnsafe("userActions.observeUserAction",
- user_action_name);
+
+ FireWebUIListener("user-action", user_action_name);
}
diff --git a/chromium/chrome/browser/ui/webui/version/version_handler.cc b/chromium/chrome/browser/ui/webui/version/version_handler.cc
index c38ef0830f3..3b834cf057a 100644
--- a/chromium/chrome/browser/ui/webui/version/version_handler.cc
+++ b/chromium/chrome/browser/ui/webui/version/version_handler.cc
@@ -6,11 +6,12 @@
#include <stddef.h>
+#include <string>
+
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/metrics/field_trial.h"
-#include "base/strings/string16.h"
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/threading/scoped_blocking_call.h"
@@ -31,8 +32,8 @@ namespace {
// Retrieves the executable and profile paths on the FILE thread.
void GetFilePaths(const base::FilePath& profile_path,
- base::string16* exec_path_out,
- base::string16* profile_path_out) {
+ std::u16string* exec_path_out,
+ std::u16string* profile_path_out) {
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::MAY_BLOCK);
@@ -109,8 +110,8 @@ void VersionHandler::HandleRequestPathInfo(const base::ListValue* args) {
// Grab the executable path on the FILE thread. It is returned in
// OnGotFilePaths.
- base::string16* exec_path_buffer = new base::string16;
- base::string16* profile_path_buffer = new base::string16;
+ std::u16string* exec_path_buffer = new std::u16string;
+ std::u16string* profile_path_buffer = new std::u16string;
base::ThreadPool::PostTaskAndReply(
FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()},
base::BindOnce(&GetFilePaths, Profile::FromWebUI(web_ui())->GetPath(),
@@ -123,8 +124,8 @@ void VersionHandler::HandleRequestPathInfo(const base::ListValue* args) {
}
void VersionHandler::OnGotFilePaths(std::string callback_id,
- base::string16* executable_path_data,
- base::string16* profile_path_data) {
+ std::u16string* executable_path_data,
+ std::u16string* profile_path_data) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
base::Value response(base::Value::Type::DICTIONARY);
response.SetKey(version_ui::kKeyExecPath, base::Value(*executable_path_data));
diff --git a/chromium/chrome/browser/ui/webui/version/version_handler.h b/chromium/chrome/browser/ui/webui/version/version_handler.h
index 8c0c75deb5e..40143c2bc5a 100644
--- a/chromium/chrome/browser/ui/webui/version/version_handler.h
+++ b/chromium/chrome/browser/ui/webui/version/version_handler.h
@@ -39,8 +39,8 @@ class VersionHandler : public content::WebUIMessageHandler {
// Callback which handles returning the executable and profile paths to the
// front end.
void OnGotFilePaths(std::string callback_id,
- base::string16* executable_path_data,
- base::string16* profile_path_data);
+ std::u16string* executable_path_data,
+ std::u16string* profile_path_data);
// Factory for the creating refs in callbacks.
base::WeakPtrFactory<VersionHandler> weak_ptr_factory_{this};
diff --git a/chromium/chrome/browser/ui/webui/version/version_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/version/version_handler_chromeos.cc
index fdde9bc2c1b..76f9c72eaad 100644
--- a/chromium/chrome/browser/ui/webui/version/version_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/version/version_handler_chromeos.cc
@@ -39,16 +39,13 @@ void VersionHandlerChromeOS::HandleRequestVersionInfo(
}
void VersionHandlerChromeOS::OnVersion(const std::string& version) {
- base::Value arg(version);
- web_ui()->CallJavascriptFunctionUnsafe("returnOsVersion", arg);
+ FireWebUIListener("return-os-version", base::Value(version));
}
void VersionHandlerChromeOS::OnOSFirmware(const std::string& version) {
- base::Value arg(version);
- web_ui()->CallJavascriptFunctionUnsafe("returnOsFirmwareVersion", arg);
+ FireWebUIListener("return-os-firmware-version", base::Value(version));
}
void VersionHandlerChromeOS::OnARCVersion(const std::string& version) {
- base::Value arg(version);
- web_ui()->CallJavascriptFunctionUnsafe("returnARCVersion", arg);
+ FireWebUIListener("return-arc-version", base::Value(version));
}
diff --git a/chromium/chrome/browser/ui/webui/version/version_handler_win.cc b/chromium/chrome/browser/ui/webui/version/version_handler_win.cc
index 541c822887e..94663ad8718 100644
--- a/chromium/chrome/browser/ui/webui/version/version_handler_win.cc
+++ b/chromium/chrome/browser/ui/webui/version/version_handler_win.cc
@@ -29,8 +29,7 @@ void VersionHandlerWindows::HandleRequestVersionInfo(
}
void VersionHandlerWindows::OnVersion(const std::string& version) {
- base::Value arg(version);
- CallJavascriptFunction("returnOsVersion", arg);
+ FireWebUIListener("return-os-version", base::Value(version));
}
// static
diff --git a/chromium/chrome/browser/ui/webui/version/version_ui.cc b/chromium/chrome/browser/ui/webui/version/version_ui.cc
index a2d5348fa26..e817fa64dfd 100644
--- a/chromium/chrome/browser/ui/webui/version/version_ui.cc
+++ b/chromium/chrome/browser/ui/webui/version/version_ui.cc
@@ -22,6 +22,7 @@
#include "chrome/grit/generated_resources.h"
#include "components/embedder_support/user_agent_utils.h"
#include "components/grit/components_resources.h"
+#include "components/grit/components_scaled_resources.h"
#include "components/strings/grit/components_chromium_strings.h"
#include "components/strings/grit/components_strings.h"
#include "components/version_info/version_info.h"
@@ -92,6 +93,13 @@ WebUIDataSource* CreateVersionUIDataSource() {
html_source->AddResourcePath(version_ui::kVersionJS, IDR_VERSION_UI_JS);
html_source->AddResourcePath(version_ui::kAboutVersionCSS,
IDR_VERSION_UI_CSS);
+#if defined(OS_ANDROID)
+ html_source->AddResourcePath(version_ui::kAboutVersionMobileCSS,
+ IDR_VERSION_UI_MOBILE_CSS);
+ html_source->AddResourcePath("images/product_logo.png", IDR_PRODUCT_LOGO);
+ html_source->AddResourcePath("images/product_logo_white.png",
+ IDR_PRODUCT_LOGO_WHITE);
+#endif // defined(OS_ANDROID)
html_source->SetDefaultResource(IDR_VERSION_UI_HTML);
return html_source;
}
@@ -162,8 +170,9 @@ void VersionUI::AddVersionDetailStrings(content::WebUIDataSource* html_source) {
// Data strings.
html_source->AddString(version_ui::kVersion,
version_info::GetVersionNumber());
- html_source->AddString(version_ui::kVersionModifier,
- chrome::GetChannelName());
+ html_source->AddString(
+ version_ui::kVersionModifier,
+ chrome::GetChannelName(chrome::WithExtendedStable(true)));
html_source->AddString(version_ui::kJSEngine, "V8");
html_source->AddString(version_ui::kJSVersion, V8_VERSION_STRING);
html_source->AddString(
diff --git a/chromium/chrome/browser/ui/webui/version/version_util_win.cc b/chromium/chrome/browser/ui/webui/version/version_util_win.cc
index 5eb0bcfe2bf..7300c6a38f9 100644
--- a/chromium/chrome/browser/ui/webui/version/version_util_win.cc
+++ b/chromium/chrome/browser/ui/webui/version/version_util_win.cc
@@ -74,7 +74,7 @@ std::string GetFullWindowsVersion() {
return version;
}
-base::string16 GetCohortVersionInfo() {
+std::u16string GetCohortVersionInfo() {
std::wstring update_cohort_name =
install_static::InstallDetails::Get().update_cohort_name();
if (!update_cohort_name.empty()) {
@@ -82,7 +82,7 @@ base::string16 GetCohortVersionInfo() {
base::WideToUTF16(update_cohort_name));
}
- return base::string16();
+ return std::u16string();
}
} // namespace win
diff --git a/chromium/chrome/browser/ui/webui/version/version_util_win.h b/chromium/chrome/browser/ui/webui/version/version_util_win.h
index b328bd5a6db..32628425b9b 100644
--- a/chromium/chrome/browser/ui/webui/version/version_util_win.h
+++ b/chromium/chrome/browser/ui/webui/version/version_util_win.h
@@ -7,7 +7,6 @@
#include <string>
-#include "base/strings/string16.h"
namespace version_utils {
namespace win {
@@ -19,7 +18,7 @@ std::string GetFullWindowsVersion();
// Return a formatted version of the update cohort string
// IDS_VERSION_UI_COHORT_NAME filled with the update cohort of this Chromium
// install.
-base::string16 GetCohortVersionInfo();
+std::u16string GetCohortVersionInfo();
} // namespace win
} // namespace version_utils
diff --git a/chromium/chrome/browser/ui/webui/web_ui_test_handler.cc b/chromium/chrome/browser/ui/webui/web_ui_test_handler.cc
index 6037116676b..69214277fb8 100644
--- a/chromium/chrome/browser/ui/webui/web_ui_test_handler.cc
+++ b/chromium/chrome/browser/ui/webui/web_ui_test_handler.cc
@@ -25,7 +25,7 @@ WebUITestHandler::WebUITestHandler() = default;
WebUITestHandler::~WebUITestHandler() = default;
void WebUITestHandler::PreloadJavaScript(
- const base::string16& js_text,
+ const std::u16string& js_text,
content::RenderFrameHost* preload_frame) {
DCHECK(preload_frame);
mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> chrome_render_frame;
@@ -34,23 +34,25 @@ void WebUITestHandler::PreloadJavaScript(
chrome_render_frame->ExecuteWebUIJavaScript(js_text);
}
-void WebUITestHandler::RunJavaScript(const base::string16& js_text) {
- GetWebUI()->GetWebContents()->GetMainFrame()->ExecuteJavaScriptForTests(
- js_text, base::NullCallback());
+void WebUITestHandler::RunJavaScript(const std::u16string& js_text) {
+ GetRenderFrameHostForTest()->ExecuteJavaScriptForTests(js_text,
+ base::NullCallback());
}
bool WebUITestHandler::RunJavaScriptTestWithResult(
- const base::string16& js_text) {
+ const std::u16string& js_text) {
test_succeeded_ = false;
run_test_succeeded_ = false;
- content::RenderFrameHost* frame =
- GetWebUI()->GetWebContents()->GetMainFrame();
- frame->ExecuteJavaScriptForTests(
+ GetRenderFrameHostForTest()->ExecuteJavaScriptForTests(
js_text, base::BindOnce(&WebUITestHandler::JavaScriptComplete,
base::Unretained(this)));
return WaitForResult();
}
+content::RenderFrameHost* WebUITestHandler::GetRenderFrameHostForTest() {
+ return GetWebUI()->GetWebContents()->GetMainFrame();
+}
+
void WebUITestHandler::TestComplete(
const base::Optional<std::string>& error_message) {
// To ensure this gets done, do this before ASSERT* calls.
diff --git a/chromium/chrome/browser/ui/webui/web_ui_test_handler.h b/chromium/chrome/browser/ui/webui/web_ui_test_handler.h
index d6a72f21110..49bf84f7a6b 100644
--- a/chromium/chrome/browser/ui/webui/web_ui_test_handler.h
+++ b/chromium/chrome/browser/ui/webui/web_ui_test_handler.h
@@ -5,9 +5,10 @@
#ifndef CHROME_BROWSER_UI_WEBUI_WEB_UI_TEST_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_WEB_UI_TEST_HANDLER_H_
+#include <string>
+
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "chrome/test/data/webui/web_ui_test.mojom-forward.h"
#include "content/public/browser/web_ui_message_handler.h"
@@ -27,15 +28,17 @@ class WebUITestHandler {
// Sends a message through |preload_frame| with the |js_text| to preload at
// the appropriate time before the onload call is made.
- void PreloadJavaScript(const base::string16& js_text,
+ void PreloadJavaScript(const std::u16string& js_text,
content::RenderFrameHost* preload_frame);
// Runs |js_text| in this object's WebUI frame. Does not wait for any result.
- void RunJavaScript(const base::string16& js_text);
+ void RunJavaScript(const std::u16string& js_text);
// Runs |js_text| in this object's WebUI frame. Waits for result, logging an
// error message on failure. Returns test pass/fail.
- bool RunJavaScriptTestWithResult(const base::string16& js_text);
+ bool RunJavaScriptTestWithResult(const std::u16string& js_text);
+
+ content::RenderFrameHost* GetRenderFrameHostForTest();
protected:
virtual content::WebUI* GetWebUI() = 0;
diff --git a/chromium/chrome/browser/ui/webui/webui_load_timer.cc b/chromium/chrome/browser/ui/webui/webui_load_timer.cc
index c09c69b8af4..961746c01bb 100644
--- a/chromium/chrome/browser/ui/webui/webui_load_timer.cc
+++ b/chromium/chrome/browser/ui/webui/webui_load_timer.cc
@@ -55,7 +55,8 @@ void WebuiLoadTimer::DOMContentLoaded(
CallUmaHistogramTimes(document_initial_load_uma_id_, timer_->Elapsed());
}
-void WebuiLoadTimer::DocumentOnLoadCompletedInMainFrame() {
+void WebuiLoadTimer::DocumentOnLoadCompletedInMainFrame(
+ content::RenderFrameHost* render_frame_host) {
// The WebContents could have been created for a child RenderFrameHost so it
// would never receive a DidStartNavigation with the main frame, however it
// will receive this callback.
diff --git a/chromium/chrome/browser/ui/webui/webui_load_timer.h b/chromium/chrome/browser/ui/webui/webui_load_timer.h
index 83e089c370a..cd635f168c9 100644
--- a/chromium/chrome/browser/ui/webui/webui_load_timer.h
+++ b/chromium/chrome/browser/ui/webui/webui_load_timer.h
@@ -32,7 +32,8 @@ class WebuiLoadTimer : public content::WebContentsObserver {
void DidStartNavigation(
content::NavigationHandle* navigation_handle) override;
void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override;
- void DocumentOnLoadCompletedInMainFrame() override;
+ void DocumentOnLoadCompletedInMainFrame(
+ content::RenderFrameHost* render_frame_host) override;
private:
std::string document_initial_load_uma_id_;
diff --git a/chromium/chrome/browser/ui/webui/webui_util.cc b/chromium/chrome/browser/ui/webui/webui_util.cc
index 8097c617748..d110a3adc06 100644
--- a/chromium/chrome/browser/ui/webui/webui_util.cc
+++ b/chromium/chrome/browser/ui/webui/webui_util.cc
@@ -21,6 +21,14 @@
#include "base/enterprise_util.h"
#endif
+#if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/views/widget/widget.h"
+#endif // defined(TOOLKIT_VIEWS)
+
namespace webui {
void SetJSModuleDefaults(content::WebUIDataSource* source) {
@@ -57,4 +65,37 @@ bool IsEnterpriseManaged() {
#endif
}
+#if defined(TOOLKIT_VIEWS)
+ui::NativeTheme* GetNativeTheme(content::WebContents* web_contents) {
+ ui::NativeTheme* native_theme = nullptr;
+
+ if (web_contents) {
+ Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
+
+ if (browser) {
+ // Find for WebContents hosted in a tab.
+ native_theme = browser->window()->GetNativeTheme();
+ }
+
+ if (!native_theme) {
+ // Find for WebContents hosted in a widget, but not directly in a
+ // Browser. e.g. Tab Search, Read Later.
+ views::Widget* widget = views::Widget::GetTopLevelWidgetForNativeView(
+ web_contents->GetContentNativeView());
+ if (widget)
+ native_theme = widget->GetNativeTheme();
+ }
+ }
+
+ if (!native_theme) {
+ // Find for isolated WebContents, e.g. in tests.
+ // Or when |web_contents| is nullptr, because the renderer is not ready.
+ // TODO(crbug/1056916): Remove global accessor to NativeTheme.
+ native_theme = ui::NativeTheme::GetInstanceForNativeUi();
+ }
+
+ return native_theme;
+}
+#endif // !defined(TOOLKIT_VIEWS)
+
} // namespace webui
diff --git a/chromium/chrome/browser/ui/webui/webui_util.h b/chromium/chrome/browser/ui/webui/webui_util.h
index 25fb46c86ff..9cd884479e6 100644
--- a/chromium/chrome/browser/ui/webui/webui_util.h
+++ b/chromium/chrome/browser/ui/webui/webui_util.h
@@ -9,12 +9,18 @@
#include "base/containers/span.h"
#include "base/strings/string_piece.h"
+#include "build/build_config.h"
#include "ui/base/webui/resource_path.h"
namespace content {
+class WebContents;
class WebUIDataSource;
}
+namespace ui {
+class NativeTheme;
+}
+
namespace webui {
// Performs common setup steps for a |source| using JS modules: enable i18n
@@ -35,6 +41,12 @@ void SetupWebUIDataSource(content::WebUIDataSource* source,
// false.
bool IsEnterpriseManaged();
+#if defined(TOOLKIT_VIEWS)
+// Returns whether WebContents should use dark mode colors depending on the
+// theme.
+ui::NativeTheme* GetNativeTheme(content::WebContents* web_contents);
+#endif
+
} // namespace webui
#endif // CHROME_BROWSER_UI_WEBUI_WEBUI_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc b/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
index 0ed03532c86..394c3f59c09 100644
--- a/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
@@ -128,7 +128,7 @@ class WebUIWebViewBrowserTest : public WebUIBrowserTest {
#else
return GURL(signin::GetEmbeddedPromoURL(
signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
- signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT, false));
+ signin_metrics::Reason::kForcedSigninPrimaryAccount, false));
#endif
}
@@ -375,7 +375,7 @@ IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, DISABLED_DragAndDropToInput) {
content::DropData dropdata;
dropdata.did_originate_from_renderer = true;
dropdata.url = GURL(url::kAboutBlankURL);
- dropdata.url_title = base::string16(base::ASCIIToUTF16("Drop me"));
+ dropdata.url_title = std::u16string(u"Drop me");
// Drag url into input in webview.
@@ -392,7 +392,7 @@ IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, DISABLED_DragAndDropToInput) {
render_view_host->GetWidget()->FilterDropData(&dropdata);
render_view_host->GetWidget()->DragTargetDragEnter(
dropdata, client_pt, screen_pt, drag_operation_mask,
- blink::WebInputEvent::kLeftButtonDown);
+ blink::WebInputEvent::kLeftButtonDown, base::DoNothing());
ASSERT_TRUE(listener.Wait());
}
@@ -404,7 +404,7 @@ IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, DISABLED_DragAndDropToInput) {
"Step2: destNode gets dragover");
render_view_host->GetWidget()->DragTargetDragOver(
client_pt, screen_pt, drag_operation_mask,
- blink::WebInputEvent::kLeftButtonDown);
+ blink::WebInputEvent::kLeftButtonDown, base::DoNothing());
ASSERT_TRUE(listener.Wait());
}
@@ -416,7 +416,7 @@ IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, DISABLED_DragAndDropToInput) {
WebUIMessageListener listener(embedder_web_contents->GetWebUI(),
"Step3: destNode gets drop");
render_view_host->GetWidget()->DragTargetDrop(
- dropdata, client_pt, screen_pt, 0);
+ dropdata, client_pt, screen_pt, 0, base::DoNothing());
ASSERT_TRUE(listener.Wait());
// Confirm no navigation
EXPECT_FALSE(observer.Navigated());
diff --git a/chromium/chrome/browser/ui/webui/welcome/bookmark_item.cc b/chromium/chrome/browser/ui/webui/welcome/bookmark_item.cc
index fc61b6b3567..74866058267 100644
--- a/chromium/chrome/browser/ui/webui/welcome/bookmark_item.cc
+++ b/chromium/chrome/browser/ui/webui/welcome/bookmark_item.cc
@@ -4,7 +4,8 @@
#include "chrome/browser/ui/webui/welcome/bookmark_item.h"
-#include "base/strings/string16.h"
+#include <string>
+
#include "base/values.h"
namespace welcome {
diff --git a/chromium/chrome/browser/ui/webui/welcome/ntp_background_handler.cc b/chromium/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
index b970bec8740..3d90928a40f 100644
--- a/chromium/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
+++ b/chromium/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
@@ -136,7 +136,7 @@ void NtpBackgroundHandler::HandleSetBackground(const base::ListValue* args) {
instant_service->SetCustomBackgroundInfo(
NtpBackgrounds[backgroundIndex],
l10n_util::GetStringFUTF8(IDS_WELCOME_NTP_BACKGROUND_PHOTO_BY_LABEL,
- base::UTF8ToUTF16("Ev Tchebotarev")),
+ u"Ev Tchebotarev"),
"",
GURL("https://500px.com/photo/135751035/"
"soulseek-by-%E5%B0%A4%E9%87%91%E5%B0%BC-ev-tchebotarev"),
@@ -146,7 +146,7 @@ void NtpBackgroundHandler::HandleSetBackground(const base::ListValue* args) {
instant_service->SetCustomBackgroundInfo(
NtpBackgrounds[backgroundIndex],
l10n_util::GetStringFUTF8(IDS_WELCOME_NTP_BACKGROUND_PHOTO_BY_LABEL,
- base::UTF8ToUTF16("NASA Image Library")),
+ u"NASA Image Library"),
"", GURL("https://www.google.com/sky/"), "");
break;
case static_cast<int>(NtpBackgrounds::kGeometricShapes):
@@ -159,7 +159,7 @@ void NtpBackgroundHandler::HandleSetBackground(const base::ListValue* args) {
instant_service->SetCustomBackgroundInfo(
NtpBackgrounds[backgroundIndex],
l10n_util::GetStringFUTF8(IDS_WELCOME_NTP_BACKGROUND_PHOTO_BY_LABEL,
- base::UTF8ToUTF16("Giulio Rosso Chioso")),
+ u"Giulio Rosso Chioso"),
"",
GURL("https://500px.com/photo/41149196/"
"le-piscine-sunset-by-giulio-rosso-chioso"),
diff --git a/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc b/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
index 07aa2ed29b1..139d769fd26 100644
--- a/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
+++ b/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
@@ -135,35 +135,6 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url)
// Add welcome strings.
AddStrings(html_source);
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- // Load unscaled images.
- static constexpr webui::ResourcePath kPaths[] = {
- {"images/module_icons/google_dark.svg",
- IDR_WELCOME_MODULE_ICONS_GOOGLE_DARK},
- {"images/module_icons/google_light.svg",
- IDR_WELCOME_MODULE_ICONS_GOOGLE_LIGHT},
- {"images/module_icons/set_default_dark.svg",
- IDR_WELCOME_MODULE_ICONS_SET_DEFAULT_DARK},
- {"images/module_icons/set_default_light.svg",
- IDR_WELCOME_MODULE_ICONS_SET_DEFAULT_LIGHT},
- {"images/module_icons/wallpaper_dark.svg",
- IDR_WELCOME_MODULE_ICONS_WALLPAPER_DARK},
- {"images/module_icons/wallpaper_light.svg",
- IDR_WELCOME_MODULE_ICONS_WALLPAPER_LIGHT},
- {"images/ntp_thumbnails/art.jpg", IDR_WELCOME_NTP_THUMBNAILS_ART},
- {"images/ntp_thumbnails/cityscape.jpg",
- IDR_WELCOME_NTP_THUMBNAILS_CITYSCAPE},
- {"images/ntp_thumbnails/earth.jpg", IDR_WELCOME_NTP_THUMBNAILS_EARTH},
- {"images/ntp_thumbnails/geometric_shapes.jpg",
- IDR_WELCOME_NTP_THUMBNAILS_GEOMETRIC_SHAPES},
- {"images/ntp_thumbnails/landscape.jpg",
- IDR_WELCOME_NTP_THUMBNAILS_LANDSCAPE},
- {"images/set_default_dark.svg", IDR_WELCOME_SET_DEFAULT_DARK},
- {"images/set_default_light.svg", IDR_WELCOME_SET_DEFAULT_LIGHT},
- };
- html_source->AddResourcePaths(kPaths);
-#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
-
#if defined(OS_WIN)
html_source->AddBoolean("is_win10",
base::win::GetVersion() >= base::win::Version::WIN10);
diff --git a/chromium/chrome/browser/user_education/BUILD.gn b/chromium/chrome/browser/user_education/BUILD.gn
index 1ecb3fbc72d..bbbe46a1626 100644
--- a/chromium/chrome/browser/user_education/BUILD.gn
+++ b/chromium/chrome/browser/user_education/BUILD.gn
@@ -16,6 +16,7 @@ android_library("java") {
deps = [
":java_resources",
"//base:base_java",
+ "//chrome/browser/feature_engagement:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/util:java",
"//components/browser_ui/util/android:java",
diff --git a/chromium/chrome/browser/util/BUILD.gn b/chromium/chrome/browser/util/BUILD.gn
index 36a2f7fc1a3..b7f8d3f292b 100644
--- a/chromium/chrome/browser/util/BUILD.gn
+++ b/chromium/chrome/browser/util/BUILD.gn
@@ -17,7 +17,6 @@ android_library("java") {
]
deps = [
"//base:base_java",
- "//base:jni_java",
"//components/browser_ui/util/android:java",
"//components/embedder_support/android:util_java",
"//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chromium/chrome/browser/video_tutorials/internal/BUILD.gn b/chromium/chrome/browser/video_tutorials/internal/BUILD.gn
index 60f078ed049..312827757bf 100644
--- a/chromium/chrome/browser/video_tutorials/internal/BUILD.gn
+++ b/chromium/chrome/browser/video_tutorials/internal/BUILD.gn
@@ -87,7 +87,6 @@ if (is_android) {
deps = [
":java_resources",
"//base:base_java",
- "//base:jni_java",
"//chrome/browser/flags:java",
"//chrome/browser/image_fetcher:java",
"//chrome/browser/profiles/android:java",
diff --git a/chromium/chrome/browser/web_applications/BUILD.gn b/chromium/chrome/browser/web_applications/BUILD.gn
index 24baac79b23..c0b171f8245 100644
--- a/chromium/chrome/browser/web_applications/BUILD.gn
+++ b/chromium/chrome/browser/web_applications/BUILD.gn
@@ -35,8 +35,10 @@ source_set("web_applications") {
"policy/web_app_policy_manager.cc",
"policy/web_app_policy_manager.h",
"policy/web_app_policy_manager_observer.h",
- "system_web_app_manager.cc",
- "system_web_app_manager.h",
+ "system_web_apps/system_web_app_background_task.cc",
+ "system_web_apps/system_web_app_background_task.h",
+ "system_web_apps/system_web_app_manager.cc",
+ "system_web_apps/system_web_app_manager.h",
"web_app.cc",
"web_app.h",
"web_app_database.cc",
@@ -112,6 +114,7 @@ source_set("web_applications") {
"//chromeos/components/eche_app_ui",
"//chromeos/components/help_app_ui",
"//chromeos/components/media_app_ui",
+ "//chromeos/components/personalization_app",
"//chromeos/strings",
"//components/arc:arc_base",
"//components/arc/mojom",
@@ -125,7 +128,10 @@ source_set("web_applications") {
}
}
- public_deps = [ "//chrome/browser/web_applications/proto" ]
+ public_deps = [
+ "//chrome/browser/web_applications/proto",
+ "//components/permissions:permissions",
+ ]
}
# This test_support library doesn't use extensions.
@@ -133,6 +139,16 @@ source_set("web_applications_test_support") {
testonly = true
sources = [
+ "system_web_apps/test/system_web_app_browsertest_base.cc",
+ "system_web_apps/test/system_web_app_browsertest_base.h",
+ "system_web_apps/test/test_system_web_app_installation.cc",
+ "system_web_apps/test/test_system_web_app_installation.h",
+ "system_web_apps/test/test_system_web_app_manager.cc",
+ "system_web_apps/test/test_system_web_app_manager.h",
+ "system_web_apps/test/test_system_web_app_url_data_source.cc",
+ "system_web_apps/test/test_system_web_app_url_data_source.h",
+ "system_web_apps/test/test_system_web_app_web_ui_controller_factory.cc",
+ "system_web_apps/test/test_system_web_app_web_ui_controller_factory.h",
"test/fake_protocol_handler_manager.cc",
"test/fake_protocol_handler_manager.h",
"test/fake_url_handler_manager.cc",
@@ -141,8 +157,6 @@ source_set("web_applications_test_support") {
"test/fake_web_app_origin_association_manager.h",
"test/service_worker_registration_waiter.cc",
"test/service_worker_registration_waiter.h",
- "test/system_web_app_browsertest_base.cc",
- "test/system_web_app_browsertest_base.h",
"test/test_app_registrar.cc",
"test/test_app_registrar.h",
"test/test_app_registry_controller.cc",
@@ -161,14 +175,6 @@ source_set("web_applications_test_support") {
"test/test_pending_app_manager.h",
"test/test_pending_app_manager_impl.cc",
"test/test_pending_app_manager_impl.h",
- "test/test_system_web_app_installation.cc",
- "test/test_system_web_app_installation.h",
- "test/test_system_web_app_manager.cc",
- "test/test_system_web_app_manager.h",
- "test/test_system_web_app_url_data_source.cc",
- "test/test_system_web_app_url_data_source.h",
- "test/test_system_web_app_web_ui_controller_factory.cc",
- "test/test_system_web_app_web_ui_controller_factory.h",
"test/test_web_app_database_factory.cc",
"test/test_web_app_database_factory.h",
"test/test_web_app_provider.cc",
@@ -207,6 +213,7 @@ source_set("web_applications_test_support") {
"//components/keyed_service/content:content",
"//components/services/app_service/public/cpp:app_url_handling",
"//components/sync:test_support_model",
+ "//components/webapps/browser",
"//content/test:test_support",
"//testing/gtest",
"//ui/webui:webui",
@@ -220,8 +227,9 @@ source_set("web_applications_unit_tests") {
"daily_metrics_helper_unittest.cc",
"external_web_app_manager_unittest.cc",
"external_web_app_utils_unittest.cc",
+ "manifest_update_task_unittest.cc",
"pending_app_manager_impl_unittest.cc",
- "system_web_app_manager_unittest.cc",
+ "system_web_apps/test/system_web_app_manager_unittest.cc",
"web_app_database_unittest.cc",
"web_app_icon_manager_unittest.cc",
"web_app_install_manager_unittest.cc",
@@ -281,7 +289,7 @@ source_set("web_applications_browser_tests") {
"manifest_update_manager_browsertest.cc",
"pending_app_manager_impl_browsertest.cc",
"preinstalled_web_apps_browsertest.cc",
- "system_web_app_manager_browsertest.cc",
+ "system_web_apps/test/system_web_app_manager_browsertest.cc",
"web_app_audio_focus_browsertest.cc",
"web_app_icon_manager_browsertest.cc",
"web_app_migration_manager_browsertest.cc",
diff --git a/chromium/chrome/browser/web_applications/components/BUILD.gn b/chromium/chrome/browser/web_applications/components/BUILD.gn
index 08b0a0edd0a..d51025045b1 100644
--- a/chromium/chrome/browser/web_applications/components/BUILD.gn
+++ b/chromium/chrome/browser/web_applications/components/BUILD.gn
@@ -6,6 +6,7 @@ import("//build/config/chromeos/ui_mode.gni")
source_set("components") {
sources = [
+ "../system_web_apps/system_web_app_types.h",
"app_icon_manager.cc",
"app_icon_manager.h",
"app_registrar.cc",
@@ -37,9 +38,6 @@ source_set("components") {
"policy/web_app_policy_constants.h",
"protocol_handler_manager.cc",
"protocol_handler_manager.h",
- "system_web_app_background_task.cc",
- "system_web_app_background_task.h",
- "system_web_app_types.h",
"url_handler_manager.cc",
"url_handler_manager.h",
"web_app_audio_focus_id_map.cc",
@@ -57,6 +55,7 @@ source_set("components") {
"web_app_icon_generator.cc",
"web_app_icon_generator.h",
"web_app_id.h",
+ "web_app_id_constants.cc",
"web_app_id_constants.h",
"web_app_install_utils.cc",
"web_app_install_utils.h",
@@ -112,17 +111,28 @@ source_set("components") {
# Desktop linux, doesn't count ChromeOS.
sources += [
"web_app_file_handler_registration_linux.cc",
- "web_app_run_on_os_login_linux.cc",
"web_app_shortcut_linux.cc",
"web_app_shortcut_linux.h",
]
}
+ if (is_linux) {
+ sources += [
+ "web_app_protocol_handler_registration_linux.cc",
+ "web_app_run_on_os_login_linux.cc",
+ ]
+ }
+
+ if (is_chromeos_ash || is_chromeos_lacros) {
+ sources += [ "web_app_run_on_os_login_chromeos.cc" ]
+ }
+
if (is_mac) {
sources += [
"app_shim_registry_mac.cc",
"app_shim_registry_mac.h",
"web_app_file_handler_registration_mac.cc",
+ "web_app_protocol_handler_registration_mac.cc",
"web_app_run_on_os_login_mac.mm",
"web_app_shortcut_mac.h",
"web_app_shortcut_mac.mm",
@@ -146,6 +156,8 @@ source_set("components") {
if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) {
sources += [
+ "url_handler_launch_params.cc",
+ "url_handler_launch_params.h",
"url_handler_manager_impl.cc",
"url_handler_manager_impl.h",
"url_handler_prefs.cc",
@@ -153,8 +165,10 @@ source_set("components") {
]
}
- public_deps =
- [ "//components/services/app_service/public/cpp:app_share_target" ]
+ public_deps = [
+ "//components/services/app_service/public/cpp:app_share_target",
+ "//components/services/app_service/public/cpp:app_url_handling",
+ ]
deps = [
"//base",
@@ -168,7 +182,6 @@ source_set("components") {
"//components/crx_file",
"//components/keyed_service/content",
"//components/pref_registry",
- "//components/services/app_service/public/cpp:app_url_handling",
"//components/services/app_service/public/cpp:protocol_handling",
"//components/services/app_service/public/mojom",
"//components/site_engagement/content",
@@ -194,10 +207,7 @@ source_set("components") {
}
if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) {
- deps += [
- "//base/util/values:values_util",
- "//components/services/app_service/public/cpp:app_url_handling",
- ]
+ deps += [ "//base/util/values:values_util" ]
}
}
@@ -205,6 +215,7 @@ source_set("unit_tests") {
testonly = true
sources = [
+ "external_app_install_features_unittest.cc",
"file_handler_manager_unittest.cc",
"install_finalizer_unittest.cc",
"os_integration_manager_unittest.cc",
@@ -228,12 +239,14 @@ source_set("unit_tests") {
"web_app_handler_registration_utils_win_unittest.cc",
"web_app_protocol_handler_registration_win_unittest.cc",
"web_app_run_on_os_login_win_unittest.cc",
+ "web_app_shortcut_win_unittest.cc",
]
}
if (is_mac) {
sources += [
"app_shim_registry_mac_unittest.cc",
+ "web_app_protocol_handler_registration_mac_unittest.cc",
"web_app_run_on_os_login_mac_unittest.mm",
"web_app_shortcut_mac_unittest.mm",
]
@@ -243,11 +256,17 @@ source_set("unit_tests") {
# Desktop linux, doesn't count ChromeOS.
sources += [
"web_app_file_handler_registration_linux_unittest.cc",
- "web_app_run_on_os_login_linux_unittest.cc",
"web_app_shortcut_linux_unittest.cc",
]
}
+ if (is_linux) {
+ sources += [
+ "web_app_protocol_handler_registration_linux_unittest.cc",
+ "web_app_run_on_os_login_linux_unittest.cc",
+ ]
+ }
+
if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) {
sources += [
"url_handler_manager_impl_unittest.cc",
diff --git a/chromium/chrome/browser/webapps/android/BUILD.gn b/chromium/chrome/browser/webapps/android/BUILD.gn
index 0e78d73cb86..027b0766537 100644
--- a/chromium/chrome/browser/webapps/android/BUILD.gn
+++ b/chromium/chrome/browser/webapps/android/BUILD.gn
@@ -30,6 +30,7 @@ android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java",
+ "java/src/org/chromium/chrome/browser/webapps/AddToHomescreenIPHController.java",
"java/src/org/chromium/chrome/browser/webapps/ImageZoomView.java",
"java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java",
"java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerFactory.java",
@@ -42,14 +43,26 @@ android_library("java") {
":java_resources",
":jni_headers",
"//base:base_java",
- "//base:jni_java",
+ "//chrome/browser/feature_engagement:java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/profiles/android:java",
+ "//chrome/browser/tab:java",
+ "//chrome/browser/ui/android/appmenu:java",
+ "//chrome/browser/ui/android/strings:ui_strings_grd",
+ "//chrome/browser/user_education:java",
"//components/browser_ui/bottomsheet/android:java",
"//components/browser_ui/styles/android:java_resources",
+ "//components/embedder_support/android:util_java",
+ "//components/feature_engagement:feature_engagement_java",
+ "//components/messages/android:java",
+ "//components/webapk/android/libs/client:java",
"//components/webapps/browser/android:java",
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_recyclerview_recyclerview_java",
+ "//third_party/androidx:androidx_vectordrawable_vectordrawable_java",
"//ui/android:ui_no_recycler_view_java",
+ "//url:gurl_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
@@ -70,6 +83,7 @@ android_resources("java_resources") {
"java/res/values/dimens.xml",
]
deps = [
+ "//chrome/android:chrome_app_java_resources",
"//chrome/browser/ui/android/strings:ui_strings_grd",
"//components/webapk/android/libs/common:splash_resources",
]
diff --git a/chromium/chrome/browser/webauthn/android/BUILD.gn b/chromium/chrome/browser/webauthn/android/BUILD.gn
index 8eb7c78d77d..f5b8bbfc1cd 100644
--- a/chromium/chrome/browser/webauthn/android/BUILD.gn
+++ b/chromium/chrome/browser/webauthn/android/BUILD.gn
@@ -8,7 +8,6 @@ android_library("java") {
sources = [ "java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java" ]
deps = [
"//base:base_java",
- "//base:jni_java",
"//chrome/android/modules/cablev2_authenticator/public:java",
"//third_party/android_deps:android_support_v7_appcompat_java",
"//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chromium/chrome/browser/webshare/BUILD.gn b/chromium/chrome/browser/webshare/BUILD.gn
index 5553a535065..aec3e1a26ad 100644
--- a/chromium/chrome/browser/webshare/BUILD.gn
+++ b/chromium/chrome/browser/webshare/BUILD.gn
@@ -42,6 +42,10 @@ source_set("unit_tests") {
sources += [ "prepare_directory_task_unittest.cc" ]
}
+ if (is_mac) {
+ sources += [ "mac/sharing_service_operation_unittest.cc" ]
+ }
+
deps = [
"//base/test:test_support",
"//build:chromeos_buildflags",