M110 stage 3

This commit is contained in:
Alexander Frick 2023-02-21 01:06:48 -06:00
parent 2063b436a5
commit 9fcd499a09
14 changed files with 3958 additions and 264 deletions

View file

@ -1,4 +1,4 @@
// Copyright 2022 The Chromium Authors and Alex313031
// Copyright 2023 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -49,13 +49,6 @@ BASE_FEATURE(kChromeWhatsNewUI,
#endif
);
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Enables "new" badge for "Chrome What's New" in Main Chrome Menu | Help.
BASE_FEATURE(kChromeWhatsNewInMainMenuNewBadge,
"ChromeWhatsNewInMainMenuNewBadge",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
#if !defined(ANDROID)
// Enables "Access Code Cast" UI.
BASE_FEATURE(kAccessCodeCastUI,
@ -149,14 +142,6 @@ BASE_FEATURE(kSidePanelWebView,
"SidePanelWebView",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSidePanelJourneys,
"SidePanelJourneys",
base::FEATURE_ENABLED_BY_DEFAULT);
// If enabled, and the main flag is also enabled, the Journeys omnibox
// entrypoints open Journeys in Side Panel rather than the History WebUI.
const base::FeatureParam<bool> kSidePanelJourneysOpensFromOmnibox{
&kSidePanelJourneys, "SidePanelJourneysOpensFromOmnibox", false};
BASE_FEATURE(kSidePanelJourneysQueryless,
"SidePanelJourneysQueryless",
base::FEATURE_DISABLED_BY_DEFAULT);
@ -177,28 +162,43 @@ const char kTabScrollingButtonPositionParameterName[] = "buttonPosition";
// https://crbug.com/1145747
BASE_FEATURE(kScrollableTabStripWithDragging,
"kScrollableTabStripWithDragging",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
const char kTabScrollingWithDraggingModeName[] = "tabScrollWithDragMode";
// Enables different methods of overflow when scrolling tabs in tabstrip
// https://crbug.com/951078
BASE_FEATURE(kScrollableTabStripOverflow,
"kScrollableTabStripOverflow",
base::FEATURE_DISABLED_BY_DEFAULT);
const char kScrollableTabStripOverflowModeName[] = "tabScrollOverflow";
// Splits pinned and unpinned tabs into separate TabStrips.
// https://crbug.com/1346019
BASE_FEATURE(kSplitTabStrip,
"SplitTabStrip",
base::FEATURE_DISABLED_BY_DEFAULT);
// Enables tabs to be frozen when collapsed.
// https://crbug.com/1110108
BASE_FEATURE(kTabGroupsCollapseFreezing,
"TabGroupsCollapseFreezing",
base::FEATURE_ENABLED_BY_DEFAULT);
// Directly controls the "new" badge (as opposed to old "master switch"; see
// https://crbug.com/1169907 for master switch deprecation and
// https://crbug.com/968587 for the feature itself)
// https://crbug.com/1173792
BASE_FEATURE(kTabGroupsNewBadgePromo,
"TabGroupsNewBadgePromo",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
// Enables users to explicitly save and recall tab groups.
// https://crbug.com/1223929
BASE_FEATURE(kTabGroupsSave,
"TabGroupsSave",
base::FEATURE_ENABLED_BY_DEFAULT);
const base::FeatureParam<bool> kTabGroupsSaveSyncIntegration{
&kTabGroupsSave, "TabGroupsSaveSyncIntegration", false};
// Enables preview images in tab-hover cards.
// https://crbug.com/928954
@ -293,11 +293,11 @@ BASE_FEATURE(kToolbarUseHardwareBitmapDraw,
// chrome renderers are present.
BASE_FEATURE(kTopChromeWebUIUsesSpareRenderer,
"TopChromeWebUIUsesSpareRenderer",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kUnifiedSidePanel,
"UnifiedSidePanel",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
// This enables enables persistence of a WebContents in a 1-to-1 association
// with the current Profile for WebUI bubbles. See https://crbug.com/1177048.

View file

@ -1,4 +1,4 @@
// Copyright (c) 2022 The Chromium Authors and Alex313031. All rights reserved.
// Copyright 2023 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2022 The Chromium Authors and Alex313031. All rights reserved.
// Copyright 2023 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -33,7 +33,7 @@ const InstallConstants kInstallModes[] = {
L"", // Empty install_suffix for the primary install mode.
.logo_suffix = L"", // No logo suffix for the primary install mode.
.app_guid =
L"", // Empty app_guid since no integraion with Google Update.
L"", // Empty app_guid since no integration with Google Update.
.base_app_name = L"Thorium", // A distinct base_app_name.
.base_app_id = L"Thorium", // A distinct base_app_id.
.prog_id_prefix = L"ThoriumHTM", // ProgID prefix.

View file

@ -1,4 +1,4 @@
// Copyright 2022 The Chromium Authors and Alex313031. All rights reserved.
// Copyright 2023 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -6,6 +6,7 @@
#include "base/test/test_reg_util_win.h"
#include "build/branding_buildflags.h"
#include "chrome/browser/chrome_for_testing/buildflags.h"
#include "chrome/chrome_elf/nt_registry/nt_registry.h"
#include "chrome/install_static/install_details.h"
#include "chrome/install_static/user_data_dir.h"
@ -23,6 +24,11 @@ inline bool EndsWith(const std::wstring& value, const std::wstring& ending) {
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
const wchar_t kPolicyRegistryKey[] = L"SOFTWARE\\Policies\\Google\\Chrome";
const wchar_t kUserDataDirNameSuffix[] = L"\\Google\\Chrome\\User Data";
#elif BUILDFLAG(GOOGLE_CHROME_FOR_TESTING_BRANDING)
const wchar_t kPolicyRegistryKey[] =
L"SOFTWARE\\Policies\\Google\\Chrome for Testing";
const wchar_t kUserDataDirNameSuffix[] =
L"\\Google\\Chrome for Testing\\User Data";
#else
const wchar_t kPolicyRegistryKey[] = L"SOFTWARE\\Policies\\Chromium";
const wchar_t kUserDataDirNameSuffix[] = L"\\Thorium\\User Data";

File diff suppressed because it is too large Load diff

View file

@ -590,6 +590,9 @@
<message name="IDS_AUTOFILL_VIRTUAL_CARD_ENROLLMENT_LEARN_MORE_LINK_LABEL" desc="Link text to learn more about virtual cards. Added to the end of the explanatory message of the virtual card enrollment dialog in IDS_AUTOFILL_VIRTUAL_CARD_ENROLLMENT_DIALOG_CONTENT_LABEL.">
Learn about virtual cards
</message>
<message name="IDS_AUTOFILL_VIRTUAL_CARD_ENROLLMENT_CARD_IMAGE_TOOLTIP" desc="The tooltip text shown in the virtual card enrollment bubble. This tooltip shows the network/issuer icon of the card that is being prompted to enroll.">
Card image
</message>
<message name="IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_OPTION_VALUE" desc="The text shown in the virtual card option in the credit card suggestion list. It is shown as the value of the suggestion.">
Virtual card
</message>
@ -772,5 +775,17 @@
Add card
</message>
</if>
<!-- Touch to fill bottom sheet -->
<if expr="is_android">
<message name="IDS_AUTOFILL_BOTTOM_SHEET_MANAGE_PAYMENT_METHODS" desc="An option in the autofill bottom sheet that triggers navigation to the payment settings." formatter_data="android_java">
Manage payment methods
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_BOTTOM_SHEET_TITLE" desc="The title of the touch to fill bottom sheet for payments that appears under the GPay icon." formatter_data="android_java">
Autofill payment info
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_CONTINUE_BUTTON" desc="The label of the button, which would fill in the web form with card credentials." formatter_data="android_java">
Continue
</message>
</if>
</grit-part>

View file

@ -30,13 +30,13 @@
</message>
<if expr="_google_chrome">
<message name="IDS_AUTOFILL_DELETE_AUTOCOMPLETE_SUGGESTION_CONFIRMATION_BODY" desc="Text in a dialog to confirm that the user wants to delete an autocomplete form history suggestion.">
Remove form suggestion from Chrome?
Remove form suggestion from Thorium?
</message>
<message name="IDS_AUTOFILL_DELETE_CREDIT_CARD_SUGGESTION_CONFIRMATION_BODY" desc="Text in a dialog to confirm that the user wants to delete a credit card from Autofill.">
Remove credit card from Chrome?
Remove credit card from Thorium?
</message>
<message name="IDS_AUTOFILL_DELETE_PROFILE_SUGGESTION_CONFIRMATION_BODY" desc="Text in a dialog to confirm that the user wants to delete an address from Autofill.">
Remove address from Chrome?
Remove address from Thorium?
</message>
</if>
<if expr="not _google_chrome">
@ -93,37 +93,45 @@
, '''
</message>
<message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILLED_FORM" desc="Screen reader announcement indicating that current form was autofilled.">
The form was filled in
</message>
<message name="IDS_AUTOFILL_A11Y_ANNOUNCE_CLEARED_FORM" desc="Screen reader announcement indicating that current form autofilled values were cleared.">
The autofilled info was cleared from the form
</message>
<message name="IDS_AUTOFILL_HIDE_SUGGESTIONS" desc="The text displayed at the Autofill popup to allow the user to hide the suggestions menu." meaning="Hides the suggestion list.">
Hide suggestions
</message>
<message name="IDS_AUTOFILL_MANAGE" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses, credit cards, and passwords. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses, credit cards and passwords in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses, credit cards, and passwords. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses, credit cards and passwords in the user profile that can be used by Thorium Autofill.">
Manage...
</message>
<if expr="not use_titlecase">
<message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Thorium Autofill.">
Manage addresses...
</message>
<message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Thorium Autofill.">
Manage payment methods...
</message>
<message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Thorium Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Thorium Autofill.">
Manage passwords...
</message>
</if>
<if expr="use_titlecase">
<message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_ADDRESSES" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for addresses. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage addresses in the user profile that can be used by Thorium Autofill.">
Manage Addresses...
</message>
<message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_PAYMENT_METHODS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage their Autofill preferences for payment methods like credit cards/debit cards. Imperative. When the user clicks on it, opens the Autofill settings page." meaning="Manage the payment methods in the user profile that can be used by Thorium Autofill.">
Manage Payment Methods...
</message>
<message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Chrome Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Chrome Autofill.">
<message name="IDS_AUTOFILL_MANAGE_PASSWORDS" desc="In Title Case: The text displayed at the bottom of the Autofill popup to allow the user to manage passwords that can be used by Thorium Autofill. Imperative. When the user clicks on it, opens the Passwords section of the Settings page." meaning="Manage passwords in the user profile that can be used by Thorium Autofill.">
Manage Passwords...
</message>
</if>
@ -168,7 +176,7 @@
<message name="IDS_AUTOFILL_CREDIT_CARD_TWO_LINE_LABEL_FROM_NAME" desc="Second line label for the autofill credit card popup when the name is selected. This text will appear below the cardholder name. [CHAR_LIMIT=32]">
<ph name="CREDIT_CARD">$1<ex>Visa ••••5679</ex></ph>, expires on <ph name="EXPIRATION_DATE_ABBR">$2<ex>06/17</ex></ph>
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_TWO_LINE_LABEL_FROM_CARD_NUMBER" desc="Second line label for the autofill credit card popup when the card number is selected. This text will appear below the credit card number. [CHAR_LIMIT=32]">
<message name="IDS_AUTOFILL_CREDIT_CARD_TWO_LINE_LABEL_FROM_CARD_NUMBER" desc="Second line label for the autofill credit card popup when the card number is selected. This text will appear below the credit card number. [CHAR_LIMIT=32]" formatter_data="android_java">
Expires on <ph name="EXPIRATION_DATE_ABBR">$1<ex>06/17</ex></ph>
</message>

View file

@ -213,9 +213,6 @@
<message name="IDS_ERRORPAGES_SUMMARY_BLOCKED_BY_CLIENT" desc="Summary in the error page when a request is blocked by the browser.">
This page has been blocked by Thorium
</message>
<message name="IDS_ERRORPAGES_SUMMARY_BLOCKED_ENROLLMENT_CHECK_PENDING" desc="Summary in the error page when the user tries to browse before the forced enrollment check has finished.">
ThoriumOS hasnt completed its initial setup.
</message>
<if expr="is_macosx">
<message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="Mac OSX instructions for disabling use of a proxy server.">
Go to

View file

@ -90,8 +90,11 @@
<ph name="PLATFORM_TEXT">$1<ex>Goto the wrench menu and choose Fix It.</ex></ph>
</message>
</if>
<message name="IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN" desc="ThoriumOS instructions for signing in to a captive portal.">
<ph name="BEGIN_LINK">&lt;a href="#buttons" onclick="javascript:portalSignin()"&gt;</ph>Signing in<ph name="END_LINK">&lt;/a&gt;</ph> to the network.
</message>
<if expr="is_chromeos">
<message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="ChromeOS instructions for disabling use of a proxy server.">
<message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="ThoriumOS instructions for disabling use of a proxy server.">
You can disable any proxies configured for a connection from the settings page.
</message>
</if>
@ -330,12 +333,6 @@
<message name="IDS_ERRORPAGES_SUGGESTION_CHECK_WIFI_SUMMARY" desc="The message displayed in a list of suggestions following a network error suggesting to the user to reconnect to Wi-Fi. The suggestions list is prefixed with 'Try:'.">
Reconnecting to Wi-Fi
</message>
<message name="IDS_ERRORPAGES_SUGGESTION_DIAGNOSE_CONNECTION_SUMMARY" desc="The message displayed asking the user to check their network connection using the diagnostics tool.">
Fix your connection using the <ph name="BEGIN_LINK">&lt;a href="#buttons" onclick="javascript:diagnoseErrors()"&gt;</ph>diagnostics app<ph name="END_LINK">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
</message>
<message name="IDS_ERRORPAGES_SUGGESTION_COMPLETE_SETUP_SUMMARY" desc="The message displayed asking the user to sign out and complete their device setup.">
Sign out and complete setup
</message>
<message name="IDS_ERRORPAGES_SUGGESTION_DISABLE_EXTENSION_SUMMARY" desc="When a page fails to load, we provide a suggestion that the user try disabling the extension that's blocking it.">
Try disabling your extensions.
</message>
@ -386,7 +383,7 @@
</if>
<if expr="not is_android and not is_ios">
<message name="IDS_ERRORPAGES_GAME_INSTRUCTIONS" desc="Instructions on how to start playing the offline game.">
Press Space or the Up Arrow to Play
Press space to play
</message>
<message name="IDS_ERRORPAGE_DINO_GAME_DESCRIPTION" desc="Message to be spoken by a screen reader to give the user context and instructions for playing the net error dino game. Pressing space activates the game and causes the dinosaur to jump. Desktop platforms only.">
Dino game. A pixelated dinosaur dodges cacti and pterodactyls as it runs across a desolate landscape. When you hear an audio cue, press space to jump over obstacles.
@ -408,6 +405,6 @@
Jump!
</message>
<message name="IDS_ERRORPAGE_DINO_SLOW_SPEED_TOGGLE" desc="Label for a toggle which allows a user to select a slower speed for the dino game.">
Start slower&#63;
Start slower
</message>
</grit-part>

View file

@ -11,7 +11,7 @@
<!-- Sad Tab Strings -->
<message name="IDS_SAD_TAB_TITLE" desc="The title of the sad tab page that is shown when a tab crashes. This is intended to be a humorous exclamation of dismay." formatter_data="android_java">
Aw, Fuck!
Aw, #@%!, this tab's process has gone bye bye...
</message>
<message name="IDS_SAD_TAB_MESSAGE" desc="The message displayed on the sad tab page." formatter_data="android_java">
Something went wrong while displaying this webpage.

View file

@ -65,29 +65,6 @@
Attackers sometimes mimic sites by making hard-to-see changes to the web address.
</message>
<!-- Accuracy Tip strings -->
<message name="IDS_PAGE_INFO_ACCURACY_TIP_TITLE" meaning="Text for feature that encourages the user to think about how accurate the content is" desc="With this feature, the user will see a reminder on the page they're visiting that encourages the user to think about how accurate the content is. You may translate 'Accuracy' as 'Trustworthiness' or 'Reliability,' if those terms work better in your language. This text appears in the page info bubble when a user visits a page.">
Take a moment to consider accuracy
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_LEARN_MORE_BUTTON" desc="Text of button to learn more about inaccurate pages. Shown on the accuracy tip page info bubble.">
Learn more
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_IGNORE_BUTTON" desc="Text of button to close the accuracy tip page info bubble.">
Ignore
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_OPT_OUT_BUTTON" desc="Text of button to close the accuracy tip page info bubble and not show it again.">
Don't show again
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1" meaning="Text for feature that encourages the user to think about how accurate the content is" desc="With this feature, the user will see a reminder on the page they're visiting that encourages the user to think about how accurate the content is. This text appears in the page info bubble when a user visits a page. It is the first item in a bulleted list.">
Whos behind this information?
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2" meaning="Text for feature that encourages the user to think about how accurate the content is" desc="With this feature, the user will see a reminder on the page they're visiting that encourages the user to think about how accurate the content is. This text appears in the page info bubble when a user visits a page. It is the second item in a bulleted list.">
What evidence supports it?
</message>
<message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3" meaning="Text for feature that encourages the user to think about how accurate the content is" desc="With this feature, the user will see a reminder on the page they're visiting that encourages the user to think about how accurate the content is. This text appears in the page info bubble when a user visits a page. It is the third item in a bulleted list.">
What do other sources say?
</message>
<!-- Viewing file strings -->
<message name="IDS_PAGE_INFO_FILE_PAGE" desc="Message to display in the page info bubble when the page the user has navigated to is a file:// page">
You're viewing a local or shared file

View file

@ -1,4 +1,4 @@
# Copyright 2014 The Chromium Authors. All rights reserved.
# Copyright 2023 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@ -16,6 +16,8 @@ declare_args() {
compile_credentials = is_linux || is_chromeos
compile_syscall_broker = is_linux || is_chromeos
# On Android, use plain GTest.
use_base_test_suite = is_linux || is_chromeos
}
@ -83,10 +85,6 @@ source_set("sandbox_linux_unittests_sources") {
"services/syscall_wrappers_unittest.cc",
"services/thread_helpers_unittest.cc",
"services/yama_unittest.cc",
"syscall_broker/broker_file_permission_unittest.cc",
"syscall_broker/broker_process_unittest.cc",
"syscall_broker/broker_simple_message_unittest.cc",
"syscall_broker/remote_syscall_arg_handler_unittest.cc",
"tests/main.cc",
"tests/scoped_temporary_file.cc",
"tests/scoped_temporary_file.h",
@ -100,7 +98,6 @@ source_set("sandbox_linux_unittests_sources") {
":sandbox_linux_test_utils",
"//base",
"//base/test:test_support",
"//base/third_party/dynamic_annotations",
"//build:chromeos_buildflags",
"//testing/gtest",
]
@ -130,7 +127,6 @@ source_set("sandbox_linux_unittests_sources") {
"bpf_dsl/verifier.cc",
"bpf_dsl/verifier.h",
"integration_tests/bpf_dsl_seccomp_unittest.cc",
"integration_tests/seccomp_broker_process_unittest.cc",
"seccomp-bpf-helpers/baseline_policy_unittest.cc",
"seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc",
"seccomp-bpf/bpf_tests_unittest.cc",
@ -159,6 +155,19 @@ source_set("sandbox_linux_unittests_sources") {
# For credentials_unittest.cc
configs += [ "//build/config/linux:libcap" ]
}
if (compile_syscall_broker) {
sources += [
"syscall_broker/broker_file_permission_unittest.cc",
"syscall_broker/broker_process_unittest.cc",
"syscall_broker/broker_simple_message_unittest.cc",
"syscall_broker/remote_syscall_arg_handler_unittest.cc",
]
}
if (use_seccomp_bpf && compile_syscall_broker) {
sources += [ "integration_tests/seccomp_broker_process_unittest.cc" ]
}
}
action("bpf_dsl_golden") {
@ -241,7 +250,6 @@ component("seccomp_bpf") {
deps = [
":sandbox_services",
"//base",
"//base/third_party/dynamic_annotations",
"//build:chromeos_buildflags",
"//sandbox:sandbox_buildflags",
]
@ -322,37 +330,12 @@ component("sandbox_services") {
"services/thread_helpers.h",
"services/yama.cc",
"services/yama.h",
"syscall_broker/broker_channel.cc",
"syscall_broker/broker_channel.h",
"syscall_broker/broker_client.cc",
"syscall_broker/broker_client.h",
"syscall_broker/broker_command.cc",
"syscall_broker/broker_command.h",
"syscall_broker/broker_file_permission.cc",
"syscall_broker/broker_file_permission.h",
"syscall_broker/broker_host.cc",
"syscall_broker/broker_host.h",
"syscall_broker/broker_permission_list.cc",
"syscall_broker/broker_permission_list.h",
"syscall_broker/broker_process.cc",
"syscall_broker/broker_process.h",
"syscall_broker/broker_sandbox_config.cc",
"syscall_broker/broker_sandbox_config.h",
"syscall_broker/broker_simple_message.cc",
"syscall_broker/broker_simple_message.h",
"syscall_broker/remote_syscall_arg_handler.cc",
"syscall_broker/remote_syscall_arg_handler.h",
"syscall_broker/syscall_dispatcher.cc",
"syscall_broker/syscall_dispatcher.h",
]
defines = [ "SANDBOX_IMPLEMENTATION" ]
public_deps = [ "//sandbox:sandbox_export" ]
deps = [
"//base",
"//base/third_party/dynamic_annotations",
]
deps = [ "//base" ]
if (compile_credentials) {
sources += [
@ -369,6 +352,33 @@ component("sandbox_services") {
deps += [ ":sandbox_services_headers" ]
}
if (compile_syscall_broker) {
sources += [
"syscall_broker/broker_channel.cc",
"syscall_broker/broker_channel.h",
"syscall_broker/broker_client.cc",
"syscall_broker/broker_client.h",
"syscall_broker/broker_command.cc",
"syscall_broker/broker_command.h",
"syscall_broker/broker_file_permission.cc",
"syscall_broker/broker_file_permission.h",
"syscall_broker/broker_host.cc",
"syscall_broker/broker_host.h",
"syscall_broker/broker_permission_list.cc",
"syscall_broker/broker_permission_list.h",
"syscall_broker/broker_process.cc",
"syscall_broker/broker_process.h",
"syscall_broker/broker_sandbox_config.cc",
"syscall_broker/broker_sandbox_config.h",
"syscall_broker/broker_simple_message.cc",
"syscall_broker/broker_simple_message.h",
"syscall_broker/remote_syscall_arg_handler.cc",
"syscall_broker/remote_syscall_arg_handler.h",
"syscall_broker/syscall_dispatcher.cc",
"syscall_broker/syscall_dispatcher.h",
]
}
if (!is_android) {
sources += [
"services/libc_interceptor.cc",
@ -414,7 +424,6 @@ if (compile_suid_client) {
deps = [
":sandbox_services",
"//base",
"//base/third_party/dynamic_annotations",
]
}
}

View file

@ -1,4 +1,4 @@
// Copyright 2022 The Chromium Authors and Alex313031
// Copyright 2023 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -269,15 +269,6 @@ BASE_FEATURE(kPortalsCrossOrigin,
// allows the element to be enabled by the runtime enabled feature, for origin
// trials.
BASE_FEATURE(kFencedFrames, "FencedFrames", base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<FencedFramesImplementationType>::Option
fenced_frame_implementation_types[] = {
{FencedFramesImplementationType::kShadowDOM, "shadow_dom"},
{FencedFramesImplementationType::kMPArch, "mparch"}};
const base::FeatureParam<FencedFramesImplementationType>
kFencedFramesImplementationTypeParam{
&kFencedFrames, "implementation_type",
FencedFramesImplementationType::kMPArch,
&fenced_frame_implementation_types};
// Enable the shared storage API. Note that enabling this feature does not
// automatically expose this API to the web, it only allows the element to be
@ -306,17 +297,15 @@ const base::FeatureParam<int> kSharedStorageBitBudget = {
const base::FeatureParam<base::TimeDelta> kSharedStorageBudgetInterval = {
&kSharedStorageAPI, "SharedStorageBudgetInterval", base::Hours(24)};
const base::FeatureParam<base::TimeDelta>
kSharedStorageStaleOriginPurgeInitialInterval = {
&kSharedStorageAPI, "SharedStorageStaleOriginPurgeInitialInterval",
base::Minutes(15)};
kSharedStorageStalePurgeInitialInterval = {
&kSharedStorageAPI, "SharedStorageStalePurgeInitialInterval",
base::Minutes(2)};
const base::FeatureParam<base::TimeDelta>
kSharedStorageStaleOriginPurgeRecurringInterval = {
&kSharedStorageAPI, "SharedStorageStaleOriginPurgeRecurringInterval",
kSharedStorageStalePurgeRecurringInterval = {
&kSharedStorageAPI, "SharedStorageStalePurgeRecurringInterval",
base::Hours(2)};
const base::FeatureParam<base::TimeDelta>
kSharedStorageOriginStalenessThreshold = {
&kSharedStorageAPI, "SharedStorageOriginStalenessThreshold",
base::Days(30)};
const base::FeatureParam<base::TimeDelta> kSharedStorageStalenessThreshold = {
&kSharedStorageAPI, "SharedStorageStalenessThreshold", base::Days(30)};
const base::FeatureParam<int>
kSharedStorageMaxAllowedFencedFrameDepthForSelectURL = {
&kSharedStorageAPI,
@ -324,7 +313,7 @@ const base::FeatureParam<int>
BASE_FEATURE(kSameSiteCrossOriginForSpeculationRulesPrerender,
"SameSiteCrossOriginForSpeculationRulesPrerender",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSameSiteRedirectionForEmbedderTriggeredPrerender,
"SameSiteRedirectionForEmbedderTriggeredPrerender",
@ -346,11 +335,11 @@ const char kPrerender2MemoryAcceptablePercentOfSystemMemoryParamName[] =
BASE_FEATURE(kPrerender2InBackground,
"Prerender2InBackground",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsPrerender2Enabled() {
return base::FeatureList::IsEnabled(blink::features::kPrerender2);
}
BASE_FEATURE(kPrerender2InNewTab,
"Prerender2InNewTab",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsSameSiteCrossOriginForSpeculationRulesPrerender2Enabled() {
return base::FeatureList::IsEnabled(
@ -366,24 +355,6 @@ bool IsFencedFramesEnabled() {
return base::FeatureList::IsEnabled(blink::features::kFencedFrames);
}
bool IsFencedFramesMPArchBased() {
return blink::features::kFencedFramesImplementationTypeParam.Get() ==
blink::features::FencedFramesImplementationType::kMPArch;
}
bool IsFencedFramesShadowDOMBased() {
return blink::features::kFencedFramesImplementationTypeParam.Get() ==
blink::features::FencedFramesImplementationType::kShadowDOM;
}
BASE_FEATURE(kInitialNavigationEntry,
"InitialNavigationEntry",
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsInitialNavigationEntryEnabled() {
return base::FeatureList::IsEnabled(blink::features::kInitialNavigationEntry);
}
// Enable limiting previews loading hints to specific resource types.
BASE_FEATURE(kPreviewsResourceLoadingHintsSpecificResourceTypes,
"PreviewsResourceLoadingHintsSpecificResourceTypes",
@ -723,6 +694,11 @@ BASE_FEATURE(kWebviewAccelerateSmallCanvases,
"WebviewAccelerateSmallCanvases",
base::FEATURE_DISABLED_BY_DEFAULT);
// Whether to aggressively free resources for canvases in background pages.
BASE_FEATURE(kCanvasFreeMemoryWhenHidden,
"CanvasFreeMemoryWhenHidden",
base::FEATURE_DISABLED_BY_DEFAULT);
// When enabled, frees up CachedMetadata after consumption by script resources
// and modules. Needed for the experiment in http://crbug.com/1045052.
BASE_FEATURE(kDiscardCodeCacheAfterFirstUse,
@ -735,9 +711,6 @@ BASE_FEATURE(kCacheCodeOnIdle,
const base::FeatureParam<int> kCacheCodeOnIdleDelayParam{&kCacheCodeOnIdle,
"delay-in-ms", 0};
// Enables the JPEG XL Image File Format (JXL).
BASE_FEATURE(kJXL, "JXL", base::FEATURE_ENABLED_BY_DEFAULT);
// Make all pending 'display: auto' web fonts enter the swap or failure period
// immediately before reaching the LCP time limit (~2500ms), so that web fonts
// do not become a source of bad LCP.
@ -828,7 +801,7 @@ BASE_FEATURE(kUseSnappyForParkableStrings,
// the delay.
BASE_FEATURE(kDelayFirstParkingOfStrings,
"DelayFirstParkingOfStrings",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
bool ParkableStringsUseSnappy() {
return base::FeatureList::IsEnabled(kUseSnappyForParkableStrings);
@ -902,12 +875,6 @@ BASE_FEATURE(kLoadingTasksUnfreezable,
"LoadingTasksUnfreezable",
base::FEATURE_ENABLED_BY_DEFAULT);
// Controls how max frame rates are enforced in MediaStreamTracks.
// TODO(crbug.com/1152307): Remove in M91.
BASE_FEATURE(kMediaStreamTrackUseConfigMaxFrameRate,
"MediaStreamTrackUseConfigMaxFrameRate",
base::FEATURE_DISABLED_BY_DEFAULT);
// When enabled, the SubresourceFilter receives calls from the ResourceLoader
// to perform additional checks against any aliases found from DNS CNAME records
// for the requested URL.
@ -915,10 +882,6 @@ BASE_FEATURE(kSendCnameAliasesToSubresourceFilterFromRenderer,
"SendCnameAliasesToSubresourceFilterFromRenderer",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDisableDocumentDomainByDefault,
"DisableDocumentDomainByDefault",
base::FEATURE_DISABLED_BY_DEFAULT);
// Scopes the memory cache to a fetcher i.e. document/frame. Any resource cached
// in the blink cache will only be reused if the most recent fetcher that
// fetched it was the same as the current document.
@ -941,21 +904,6 @@ const base::FeatureParam<std::string>
kBackgroundTracingPerformanceMark_AllowList{
&kBackgroundTracingPerformanceMark, "allow_list", ""};
// Controls whether the Sanitizer API allows namespaced content (SVG + MathML).
//
// This feature is unlikely to be launched as-is. The primary purpose is to
// allow testing of different non-standard configurations.
BASE_FEATURE(kSanitizerAPINamespaces,
"SanitizerAPINamespacesForTesting",
base::FEATURE_DISABLED_BY_DEFAULT);
// Kill switch for the blocking of the navigation of top from a cross origin
// iframe to a different protocol. TODO(https://crbug.com/1151507): Remove in
// M92.
BASE_FEATURE(kBlockCrossOriginTopNavigationToDiffentScheme,
"BlockCrossOriginTopNavigationToDiffentScheme",
base::FEATURE_ENABLED_BY_DEFAULT);
// Kill switch for the Interest Group API, i.e. if disabled, the
// API exposure will be disabled regardless of the OT config.
BASE_FEATURE(kInterestGroupStorage,
@ -973,6 +921,14 @@ const base::FeatureParam<int> kInterestGroupStorageMaxOpsBeforeMaintenance{
// Enables FLEDGE implementation. See https://crbug.com/1186444.
BASE_FEATURE(kFledge, "Fledge", base::FEATURE_DISABLED_BY_DEFAULT);
// See in the header.
BASE_FEATURE(kFledgeConsiderKAnonymity,
"FledgeConsiderKAnonymity",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kFledgeEnforceKAnonymity,
"FledgeEnforceKAnonymity",
base::FEATURE_DISABLED_BY_DEFAULT);
// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
// Changes default Permissions Policy for features join-ad-interest-group and
// run-ad-auction to a more restricted EnableForSelf.
@ -1092,14 +1048,6 @@ BASE_FEATURE(kDelayLowPriorityRequestsAccordingToNetworkState,
"DelayLowPriorityRequestsAccordingToNetworkState",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kIncludeInitiallyInvisibleImagesInLCP,
"IncludeInitiallyInvisibleImagesInLCP",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kIncludeBackgroundSVGInLCP,
"IncludeBackgroundSVGInLCP",
base::FEATURE_ENABLED_BY_DEFAULT);
const base::FeatureParam<int> kMaxNumOfThrottleableRequestsInTightMode{
&kDelayLowPriorityRequestsAccordingToNetworkState,
"MaxNumOfThrottleableRequestsInTightMode", 5};
@ -1162,43 +1110,12 @@ BASE_FEATURE(kSetTimeoutWithoutClamp,
"SetTimeoutWithoutClamp",
base::FEATURE_ENABLED_BY_DEFAULT);
namespace {
enum class SetTimeoutWithout1MsClampPolicyOverride {
kNoOverride,
kForceDisable,
kForceEnable
};
bool g_set_timeout_without_1m_clamp_policy_override_cached = false;
// Returns the SetTimeoutWithout1MsClamp policy settings. This is calculated
// once on first access and cached.
SetTimeoutWithout1MsClampPolicyOverride
GetSetTimeoutWithout1MsClampPolicyOverride() {
static SetTimeoutWithout1MsClampPolicyOverride policy =
SetTimeoutWithout1MsClampPolicyOverride::kNoOverride;
if (g_set_timeout_without_1m_clamp_policy_override_cached)
return policy;
// Otherwise, check the command-line for the renderer. Only values of "0"
// and "1" are valid, anything else is ignored (and allows the base::Feature
// to control the feature). This slow path will only be hit once per renderer
// process.
std::string value =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kSetTimeoutWithout1MsClampPolicy);
if (value == switches::kSetTimeoutWithout1MsClampPolicy_ForceEnable) {
policy = SetTimeoutWithout1MsClampPolicyOverride::kForceEnable;
} else if (value == switches::kSetTimeoutWithout1MsClampPolicy_ForceDisable) {
policy = SetTimeoutWithout1MsClampPolicyOverride::kForceDisable;
} else {
policy = SetTimeoutWithout1MsClampPolicyOverride::kNoOverride;
}
g_set_timeout_without_1m_clamp_policy_override_cached = true;
return policy;
bool IsSetTimeoutWithoutClampEnabled() {
return base::FeatureList::IsEnabled(features::kSetTimeoutWithoutClamp);
}
namespace {
enum class UnthrottledNestedTimeoutPolicyOverride {
kNoOverride,
kForceDisable,
@ -1236,21 +1153,6 @@ GetUnthrottledNestedTimeoutPolicyOverride() {
} // namespace
void ClearSetTimeoutWithout1MsClampPolicyOverrideCacheForTesting() {
// Tests may want to force recalculation of the cached policy value when
// exercising different configs.
g_set_timeout_without_1m_clamp_policy_override_cached = false;
}
bool IsSetTimeoutWithoutClampEnabled() {
// If policy is present then respect it.
auto policy = GetSetTimeoutWithout1MsClampPolicyOverride();
if (policy != SetTimeoutWithout1MsClampPolicyOverride::kNoOverride)
return policy == SetTimeoutWithout1MsClampPolicyOverride::kForceEnable;
// Otherwise respect the base::Feature.
return base::FeatureList::IsEnabled(features::kSetTimeoutWithoutClamp);
}
void ClearUnthrottledNestedTimeoutOverrideCacheForTesting() {
// Tests may want to force recalculation of the cached policy value when
// exercising different configs.
@ -1291,14 +1193,6 @@ BASE_FEATURE(kLCPAnimatedImagesReporting,
"LCPAnimatedImagesReporting",
base::FEATURE_DISABLED_BY_DEFAULT);
// Enables loading the response body earlier in navigation.
BASE_FEATURE(kEarlyBodyLoad, "EarlyBodyLoad", base::FEATURE_ENABLED_BY_DEFAULT);
// Enables fetching the code cache earlier in navigation.
BASE_FEATURE(kEarlyCodeCache,
"EarlyCodeCache",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kOriginAgentClusterDefaultEnabled,
"OriginAgentClusterDefaultEnable",
base::FEATURE_DISABLED_BY_DEFAULT);
@ -1307,23 +1201,6 @@ BASE_FEATURE(kOriginAgentClusterDefaultWarning,
"OriginAgentClusterDefaultWarning",
base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID)
// Enables prefetching Android fonts on renderer startup.
BASE_FEATURE(kPrefetchAndroidFonts,
"PrefetchAndroidFonts",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
// TODO(https://crbug.com/1276864): Delete this flag.
BASE_FEATURE(kBackForwardCacheAppBanner,
"BackForwardCacheAppBanner",
base::FEATURE_ENABLED_BY_DEFAULT);
// Initialize CSSDefaultStyleSheets early in renderer startup.
BASE_FEATURE(kDefaultStyleSheetsEarlyInit,
"DefaultStyleSheetsEarlyInit",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSystemColorChooser,
"SystemColorChooser",
base::FEATURE_DISABLED_BY_DEFAULT);
@ -1585,11 +1462,15 @@ BASE_FEATURE(kFileSystemUrlNavigationForChromeAppsOnly,
BASE_FEATURE(kEarlyExitOnNoopClassOrStyleChange,
"EarlyExitOnNoopClassOrStyleChange",
base::FEATURE_DISABLED_BY_DEFAULT);
base::FEATURE_ENABLED_BY_DEFAULT);
// TODO(mahesh.ma): Enable for supported Android versions once feature is ready.
BASE_FEATURE(kStylusWritingToInput,
"StylusWritingToInput",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kStylusPointerAdjustment,
"StylusPointerAdjustment",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDisableArrayBufferSizeLimitsForTesting,
@ -1671,8 +1552,10 @@ bool IsNewBaseUrlInheritanceBehaviorEnabled() {
// The kIsolateSandboxedIframes feature depends on the new base URL behavior,
// so it enables the new behavior even if kNewBaseUrlInheritanceBehavior
// isn't enabled.
return base::FeatureList::IsEnabled(kNewBaseUrlInheritanceBehavior) ||
base::FeatureList::IsEnabled(kIsolateSandboxedIframes);
return (base::FeatureList::IsEnabled(kNewBaseUrlInheritanceBehavior) ||
base::FeatureList::IsEnabled(kIsolateSandboxedIframes)) &&
!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableNewBaseUrlInheritanceBehavior);
}
const base::FeatureParam<int> kDocumentMaxEventNodePathCachedEntries{
@ -1761,5 +1644,36 @@ BASE_FEATURE(kTextCodecCJKEnabled,
"TextCodecCJKEnabled",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kStartMediaStreamCaptureIndicatorInBrowser,
"StartMediaStreamCaptureIndicatorInBrowser",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kUseThreadPoolForMediaStreamVideoTaskRunner,
"UseThreadPoolForMediaStreamVideoTaskRunner",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,
"ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframesEnabled() {
static bool throttling_disabled =
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableThrottleNonVisibleCrossOriginIframes);
return !throttling_disabled &&
base::FeatureList::IsEnabled(
features::
kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes);
}
BASE_FEATURE(kSpeculationRulesHeaderEnableThirdPartyOriginTrial,
"SpeculationRulesHeaderEnableThirdPartyOriginTrial",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSpeculationRulesPrefetchFuture,
"SpeculationRulesPrefetchFuture",
base::FEATURE_ENABLED_BY_DEFAULT);
} // namespace features
} // namespace blink

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2022 Alex313031. -->
<grit base_dir="." latest_public_release="0" current_release="1"
output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
<outputs>
@ -1073,6 +1072,9 @@
<message name="IDS_IME_NAME_KEYBOARD_ENGLISH_SOUTH_AFRICA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, its dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On ThoriumOS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on ThoriumOS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
English (South Africa)
</message>
<message name="IDS_IME_NAME_KEYBOARD_ENGLISH_PAKISTAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, its dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On ThoriumOS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on ThoriumOS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
English (Pakistan)
</message>
<message name="IDS_IME_NAME_KEYBOARD_UKRAINIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, its dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On ThoriumOS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on ThoriumOS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
Ukrainian
</message>