diff --git a/AUTHORS b/AUTHORS index 1d362016..a4de4f4 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -985,6 +985,7 @@ Yan Wang <yan0422.wang@samsung.com> Yang Gu <yang.gu@intel.com> Yannic Bonenberger <contact@yannic-bonenberger.com> +Yannic Bonenberger <yannic.bonenberger@gmail.com> Yarin Kaul <yarin.kaul@gmail.com> Yash Vempati <vempatiy@amazon.com> Ye Liu <cbakgly@gmail.com>
diff --git a/DEPS b/DEPS index bb83e1d..039f4f0f 100644 --- a/DEPS +++ b/DEPS
@@ -162,11 +162,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'c25802db30fa371d3984eeef6b04a605e7b7f51f', + 'skia_revision': 'df432d5efb70947c5424b690992899f7b45b8d82', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '7720ac9d21ceeaa24715da66d11c0437010fbdee', + 'v8_revision': '4b4c63ad2abc4471b0051edcc16ad77fb2846e2f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -174,15 +174,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'b5560486ad224ec6de8a54e2f2a7e638bed17fe1', + 'angle_revision': '41079d70e4695544a9d0d0bcc41788a92f9d1c6a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '7a7f630ffbad1044c65c06ec08e5b7fa236666e2', + 'swiftshader_revision': '860369fc431e8510f974799961083b42d01cfa8b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'c2da3ad9993bb1611691a18032a12306d0e378b3', + 'pdfium_revision': 'c6642beb8c78df9a7a85c2c431cde184a7e76ee5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -225,7 +225,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'd8359680722cfcfdb4840462780c0dca5a728fdc', + 'catapult_revision': 'b19a360c1269c795eff8dcf1e6d44093d20aeefe', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -432,7 +432,7 @@ 'packages': [ { 'package': 'chromium/chrome/test/data/autofill/captured_sites', - 'version': 'Us5OlZWKzAUEXqNns8LuFnOqPuU4xo5FfFguzHPVfhAC', + 'version': '6niw5QrKgpjhu1MvG19isM19ArW-6wNcak5nGbW5I7cC', } ], 'condition': 'checkout_chromium_autofill_test_dependencies', @@ -443,7 +443,7 @@ 'packages': [ { 'package': 'chromium/chrome/test/data/password/captured_sites', - 'version': '484POXsN4YniZtOU5CH6WWuVHJK82SmGIjbpxvEHaR0C', + 'version': 'XxyN4JjdvL2TBSIFThfP0pJhd0-4COvFTOMCt356ht0C', } ], 'condition': 'checkout_chromium_password_manager_test_dependencies', @@ -853,7 +853,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '497d3d907b450e1d67e5fb65b004f27406b1b74d', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '08a7e90d730a745faa146a02217cd3e0d0968e6e', 'condition': 'checkout_linux', }, @@ -878,7 +878,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4a60db4c3e62239e471dc69906353fcf0384920a', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2c210a490857380a93f8308dd504aeb1ef759d38', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -1257,7 +1257,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'cec6a1f798c47b299b8b88af0759b26489140519', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b895066e074a45851279c34e730195d95837efc6', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1425,7 +1425,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'abaae129d9a0c6e1e092067e0b105475df43352e', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'f5dec1c6af02647d669cf255527464ec58a8f03b', + Var('webrtc_git') + '/src.git' + '@' + '3d1647412c08f589b03aed641a3cca5f0b05555d', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1487,7 +1487,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@79e09388b11e22eaee47ef410fceb14c5b3e6162', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6e25bd5bbc4fafca4698b293e2c1e74e172cdea3', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/README.md b/android_webview/README.md index a114f3cf..838faeb5 100644 --- a/android_webview/README.md +++ b/android_webview/README.md
@@ -1,6 +1,28 @@ # Android WebView -This directory contains the Android WebView implementation. +Android WebView is an Android system component for displaying web content. +[WebView](https://developer.android.com/reference/android/webkit/WebView) (and +the [related Android classes][1]) are implemented by the code in the +`//android_webview/` folder. -See https://developer.android.com/reference/android/webkit/WebView for -developer documentation. +Android WebView is a content embedder, meaning it depends on code in +`//content/` and lower layers (ex. `//net/`, `//base/`), but does not depend on +sibling layers such as `//chrome/`. + +This directory contains the Android WebView implementation, as well as the +implementation for the [AndroidX Webkit support library][2]. + +## Want to use WebView in an Android app? + +Please consult our API documentation and app development guides: + +* [Android Frameworks classes][1] +* [AndroidX Webkit support library][2] +* [Development guides](https://developer.android.com/guide/webapps) + +## Want to build and install WebView on a device? + +See our [Chromium developer documentation](docs/README.md). + +[1]: https://developer.android.com/reference/android/webkit/package-summary +[2]: https://developer.android.com/reference/androidx/webkit/package-summary
diff --git a/android_webview/docs/README.md b/android_webview/docs/README.md index 77d7c69..ba6b4d0 100644 --- a/android_webview/docs/README.md +++ b/android_webview/docs/README.md
@@ -13,18 +13,8 @@ ## What is Android WebView? -Android WebView is an Android system component for displaying web content. This -(and the related Android classes) are implemented by the code in the -`//android_webview/` folder. - -Android WebView is a content embedder, meaning it depends on code in -`//content/` and lower layers (ex. `//net/`, `//base/`), but does not depend on -sibling layers such as `//chrome/`. +See [//android\_webview/README.md](/android\_webview/README.md). ## Want to use WebView in an Android app? -Please consult https://developer.android.com/reference/android/webkit/WebView, -and the related classes in the `android.webkit` package. You may also be -interested in our -[`androidx.webkit`](https://developer.android.com/reference/androidx/webkit/WebViewCompat) -API documentation. +See [//android\_webview/README.md](/android\_webview/README.md).
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PopupWindowTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PopupWindowTest.java index 52cebea2..bab4aa8 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/PopupWindowTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/PopupWindowTest.java
@@ -244,7 +244,7 @@ // additional onPageFinished() callback. Also, this eventually affects commit stage of the // navigation which creates additional navigationStateChanged() and one additional // onPageFinished() callback. - onPageFinishedHelper.waitForCallback(onPageFinishedCount, 3); + onPageFinishedHelper.waitForCallback(onPageFinishedCount, 4); // This is the URL that gets shown to the user because parent changed DOM of the popup // window. List<String> urlList = onPageFinishedHelper.getUrlList(); @@ -253,8 +253,8 @@ // that we wanted. The loaded page does not have the changed DOM. This is slightly different // from the original workflow in b/19325392 as there is no good hook to stop navigation and // trigger DidAccessInitialDocument at the same time. - Assert.assertTrue(urlList.get(onPageFinishedCount + 1).endsWith(popupPath)); Assert.assertTrue(urlList.get(onPageFinishedCount + 2).endsWith(popupPath)); + Assert.assertTrue(urlList.get(onPageFinishedCount + 3).endsWith(popupPath)); } @Test
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index 46990bf6..4421348 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -118,8 +118,8 @@ using message_center::Notification; using message_center::SystemNotificationWarningLevel; -// Toast id and duration for voice interaction shortcuts -constexpr char kVoiceInteractionErrorToastId[] = "voice_interaction_error"; +// Toast id and duration for Assistant shortcuts. +constexpr char kAssistantErrorToastId[] = "assistant_error"; const char kFeatureDisabledByPolicyToastId[] = "disabled_by_policy_error"; constexpr int kToastDurationMs = 2500; @@ -806,7 +806,7 @@ Shell::Get()->ambient_controller()->Toggle(); } -void HandleToggleVoiceInteraction(const ui::Accelerator& accelerator) { +void HandleToggleAssistant(const ui::Accelerator& accelerator) { if (accelerator.IsCmdDown() && accelerator.key_code() == ui::VKEY_SPACE) { base::RecordAction( base::UserMetricsAction("VoiceInteraction.Started.Search_Space")); @@ -826,51 +826,50 @@ mojom::AssistantAllowedState::ALLOWED)) { case mojom::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER: // Show a toast if the active user is not primary. - ShowToast(kVoiceInteractionErrorToastId, + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_SECONDARY_USER_TOAST_MESSAGE)); + IDS_ASH_ASSISTANT_SECONDARY_USER_TOAST_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_LOCALE: - // Show a toast if voice interaction is disabled due to unsupported + // Show a toast if the Assistant is disabled due to unsupported // locales. - ShowToast( - kVoiceInteractionErrorToastId, - l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_LOCALE_UNSUPPORTED_TOAST_MESSAGE)); + ShowToast(kAssistantErrorToastId, + l10n_util::GetStringUTF16( + IDS_ASH_ASSISTANT_LOCALE_UNSUPPORTED_TOAST_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_POLICY: - // Show a toast if voice interaction is disabled due to enterprise policy. - ShowToast(kVoiceInteractionErrorToastId, + // Show a toast if the Assistant is disabled due to enterprise policy. + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_DISABLED_BY_POLICY_MESSAGE)); + IDS_ASH_ASSISTANT_DISABLED_BY_POLICY_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE: - // Show a toast if voice interaction is disabled due to being in Demo + // Show a toast if the Assistant is disabled due to being in Demo // Mode. - ShowToast(kVoiceInteractionErrorToastId, + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE)); + IDS_ASH_ASSISTANT_DISABLED_IN_DEMO_MODE_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION: - // Show a toast if voice interaction is disabled due to being in Demo - // Mode. - ShowToast(kVoiceInteractionErrorToastId, + // Show a toast if the Assistant is disabled due to being in public + // session. + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE)); + IDS_ASH_ASSISTANT_DISABLED_IN_PUBLIC_SESSION_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_SUPERVISED_USER: // supervised user is deprecated, wait for the code clean up. NOTREACHED(); return; case mojom::AssistantAllowedState::DISALLOWED_BY_INCOGNITO: - ShowToast(kVoiceInteractionErrorToastId, + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_DISABLED_IN_GUEST_MESSAGE)); + IDS_ASH_ASSISTANT_DISABLED_IN_GUEST_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE: - ShowToast(kVoiceInteractionErrorToastId, + ShowToast(kAssistantErrorToastId, l10n_util::GetStringUTF16( - IDS_ASH_VOICE_INTERACTION_DISABLED_BY_ACCOUNT_MESSAGE)); + IDS_ASH_ASSISTANT_DISABLED_BY_ACCOUNT_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE: // No need to show toast in KIOSK mode. @@ -1568,7 +1567,7 @@ return CanHandleShowStylusTools(); case START_AMBIENT_MODE: return CanHandleStartAmbientMode(); - case START_VOICE_INTERACTION: + case START_ASSISTANT: return true; case SWAP_PRIMARY_DISPLAY: return display::Screen::GetScreen()->GetNumDisplays() > 1; @@ -1903,8 +1902,8 @@ case START_AMBIENT_MODE: HandleToggleAmbientMode(accelerator); break; - case START_VOICE_INTERACTION: - HandleToggleVoiceInteraction(accelerator); + case START_ASSISTANT: + HandleToggleAssistant(accelerator); break; case SUSPEND: HandleSuspend();
diff --git a/ash/app_list/app_list_metrics_unittest.cc b/ash/app_list/app_list_metrics_unittest.cc index 84e610c..d602e26 100644 --- a/ash/app_list/app_list_metrics_unittest.cc +++ b/ash/app_list/app_list_metrics_unittest.cc
@@ -78,6 +78,9 @@ app_list_test_model_ = static_cast<app_list::test::AppListTestModel*>( Shell::Get()->app_list_controller()->GetModel()); + + shelf_test_api_ = std::make_unique<ShelfViewTestAPI>( + GetPrimaryShelf()->GetShelfViewForTesting()); } void TearDown() override { @@ -87,11 +90,13 @@ protected: void CreateAndClickShelfItem() { - // Add shelf item to be launched. + // Add shelf item to be launched. Waits for the shelf view's bounds + // animations to end. ShelfItem shelf_item; shelf_item.id = ash::ShelfID("app_id"); shelf_item.type = TYPE_BROWSER_SHORTCUT; ShelfModel::Get()->Add(shelf_item); + shelf_test_api_->RunMessageLoopUntilAnimationsDone(); // The TestShelfItemDelegate will simulate a window activation after the // shelf item is clicked. @@ -103,10 +108,8 @@ void ClickShelfItem() { // Get location of the shelf item. - ShelfViewTestAPI shelf_test_api( - GetPrimaryShelf()->GetShelfViewForTesting()); - ShelfView* shelf_view = shelf_test_api.shelf_view(); - const views::ViewModel* view_model = shelf_view->view_model_for_test(); + const views::ViewModel* view_model = + GetPrimaryShelf()->GetShelfViewForTesting()->view_model_for_test(); gfx::Point center = view_model->view_at(kBrowserAppIndexOnShelf) ->GetBoundsInScreen() .CenterPoint(); @@ -189,6 +192,7 @@ private: app_list::SearchModel* search_model_ = nullptr; app_list::test::AppListTestModel* app_list_test_model_ = nullptr; + std::unique_ptr<ShelfViewTestAPI> shelf_test_api_; DISALLOW_COPY_AND_ASSIGN(AppListAppLaunchedMetricTest); };
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 64f9c96..740e1ca3 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -526,7 +526,7 @@ gfx::PointF(0, y_offset), gfx::PointF())), view_(view) { - DCHECK(view_->is_in_drag()); + DCHECK(view_->ending_drag()); DCHECK_EQ(view_->app_list_state(), ash::AppListViewState::kPeeking); DCHECK(!view_->is_tablet_mode()); } @@ -952,6 +952,9 @@ } void AppListView::EndDrag(const gfx::Point& location) { + base::AutoReset<bool> auto_reset(&ending_drag_, true); + SetIsInDrag(false); + // Change the app list state based on where the drag ended. If fling velocity // was over the threshold, snap to the next state in the direction of the // fling. @@ -1065,7 +1068,6 @@ } } } - SetIsInDrag(false); UpdateChildViewsYPositionAndOpacity(); initial_drag_point_ = gfx::Point(); } @@ -1450,6 +1452,8 @@ ->horizontal_page_container() ->OnTabletModeChanged(started); + base::AutoReset<bool> auto_reset(&ending_drag_, is_in_drag_); + if (is_in_drag_) { SetIsInDrag(false); UpdateChildViewsYPositionAndOpacity(); @@ -1596,7 +1600,7 @@ ui::ImplicitAnimationObserver* animation_observer = delegate_->GetAnimationObserver(target_state); - if (is_side_shelf_) { + if (is_side_shelf_ || is_in_drag_) { // There is no animation in side shelf. OnBoundsAnimationCompleted(); UpdateAppListBackgroundYPosition(target_state); @@ -2262,7 +2266,7 @@ if (is_tablet_mode_) return false; - if (target_state != ash::AppListViewState::kPeeking || !is_in_drag_ || + if (target_state != ash::AppListViewState::kPeeking || !ending_drag_ || app_list_state_ != target_state) { return false; } @@ -2282,13 +2286,15 @@ } void AppListView::EndDragFromShelf(ash::AppListViewState app_list_state) { + base::AutoReset<bool> auto_reset(&ending_drag_, true); + SetIsInDrag(false); + if (app_list_state == ash::AppListViewState::kClosed || app_list_state_ == ash::AppListViewState::kClosed) { Dismiss(); } else { SetState(app_list_state); } - SetIsInDrag(false); UpdateChildViewsYPositionAndOpacity(); }
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index 0c411170..6aaa367 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -320,6 +320,8 @@ bool is_in_drag() const { return is_in_drag_; } + bool ending_drag() const { return ending_drag_; } + void set_onscreen_keyboard_shown(bool onscreen_keyboard_shown) { onscreen_keyboard_shown_ = onscreen_keyboard_shown; } @@ -474,6 +476,9 @@ // or dragging the app list from shelf. bool is_in_drag_ = false; + // Whether the app list view is going through state change due to drag ending. + bool ending_drag_ = false; + // Whether the view is being built. bool is_building_ = false;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 29c8c7d..e358fe5 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -689,25 +689,25 @@ <message name="IDS_ASH_PALETTE_SETTINGS" desc="The label on the setting button used to open palette setting page."> Stylus settings </message> - <message name="IDS_ASH_VOICE_INTERACTION_LOCALE_UNSUPPORTED_TOAST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the locale is unsupported."> + <message name="IDS_ASH_ASSISTANT_LOCALE_UNSUPPORTED_TOAST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the locale is unsupported."> The Google Assistant doesn’t speak this language. </message> - <message name="IDS_ASH_VOICE_INTERACTION_SECONDARY_USER_TOAST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the active user profile is not the primary user profile."> + <message name="IDS_ASH_ASSISTANT_SECONDARY_USER_TOAST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the active user profile is not the primary user profile."> The Google Assistant is only available for primary profile. </message> - <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_BY_POLICY_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the feature is disabled by enterprise policy."> + <message name="IDS_ASH_ASSISTANT_DISABLED_BY_POLICY_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but the feature is disabled by enterprise policy."> The Google Assistant is disabled by your administrator. </message> - <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a demo session, which does not support voice interaction."> + <message name="IDS_ASH_ASSISTANT_DISABLED_IN_DEMO_MODE_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a demo session, which does not support voice interaction."> The Google Assistant is not available in a demo session. </message> - <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_PUBLIC_SESSION_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a public session, which does not support voice interaction."> + <message name="IDS_ASH_ASSISTANT_DISABLED_IN_PUBLIC_SESSION_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a public session, which does not support voice interaction."> The Google Assistant is not available in a public session. </message> - <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_GUEST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a guest session, which does not support voice interaction."> + <message name="IDS_ASH_ASSISTANT_DISABLED_IN_GUEST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a guest session, which does not support voice interaction."> The Google Assistant is not available in a guest session. </message> - <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_BY_ACCOUNT_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but current logged in user account does not support voice interaction."> + <message name="IDS_ASH_ASSISTANT_DISABLED_BY_ACCOUNT_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but current logged in user account does not support voice interaction."> The Google Assistant is not available for current user account. </message>
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb index 85f5307..5c70a64c 100644 --- a/ash/components/strings/ash_components_strings_bn.xtb +++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">অ্যাড্রেস বারে আপনার ইনপুটে www. এবং .com যোগ করে পৃষ্ঠা খুলুন</translation> +<translation id="1872219238824176091">বর্তমানের ডেস্কটি সরিয়ে দিন</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, তারপর <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> অথবা <ph name="LEFT" /></translation> <translation id="1996162290124031907">পরের ট্যাবে যান</translation> <translation id="2010818616644390445">উইন্ডোটির শেষ ট্যাবে যান</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">উইন্ডোগুলির মধ্যে দ্রুত পরিবর্তন করুন</translation> <translation id="2454251766545114447">ডিসপ্লের জুম কমান</translation> <translation id="2478303094958140141">ChromeVox (স্ক্রিনে যা আছে তা পড়ে শোনানোর বৈশিষ্ট্য) চালু অথবা বন্ধ করুন</translation> +<translation id="2488661730534396940">বাঁদিকে ডেস্ক চালু করুন</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">ওয়েব পৃষ্ঠাটিকে স্ক্রল করে নিচে নিয়ে আসুন</translation> <translation id="2574014812750545982">পৃষ্ঠায় জুম লেভেল রিসেট করুন</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, তারপর <ph name="TAB" /> অথবা <ph name="RIGHT" /></translation> <translation id="2750942583782703988">আপনার বর্তমান পৃষ্ঠাটি আবার লোড করুন</translation> <translation id="2764005613199379871">সার্চ অ্যাড্রেস বারে ফোকাস রাখুন</translation> +<translation id="2774822903829597107">একটি নতুন ডেস্ক তৈরি করুন</translation> <translation id="2789868185375229787">পৃষ্ঠাটি ছোট করুন</translation> <translation id="2804480015716812239"><ph name="ALT" /> টিপুন এবং একটি লিঙ্কে ক্লিক করুন</translation> <translation id="2830827904629746450">ডান দিকে উইন্ডো ডক করুন</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">আংশিক স্ক্রিনশট নিন</translation> <translation id="4698850295812410683">স্টাইলাস টুল দেখান</translation> <translation id="4801989101741319327">পরের শব্দের শেষে নিয়ে যান</translation> +<translation id="4866066940972151697">ডানদিকে ডেস্ক চালু করুন</translation> <translation id="4916163929714267752">একটি নতুন উইন্ডোতে লিঙ্কটি খুলুন</translation> <translation id="5030659775136592441">বুকমার্ক পরিচালক দেখান</translation> <translation id="5034421018520995080">পৃষ্ঠার উপরে যান</translation>
diff --git a/ash/components/strings/ash_components_strings_gu.xtb b/ash/components/strings/ash_components_strings_gu.xtb index 431e8e3..543c755 100644 --- a/ash/components/strings/ash_components_strings_gu.xtb +++ b/ash/components/strings/ash_components_strings_gu.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">ઍડ્રેસ બારમાંના તમારા ઇનપુટમાં www. અને .com ઉમેરો, પછી પેજ ખોલો</translation> +<translation id="1872219238824176091">વર્તમાન ડેસ્ક કાઢી નાખો</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, પછી <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> અથવા <ph name="LEFT" /></translation> <translation id="1996162290124031907">આગળના ટૅબ પર જાઓ</translation> <translation id="2010818616644390445">વિંડોમાં છેલ્લા ટૅબ પર જાઓ</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">વિંડોને ઝડપથી સ્વિચ કરો</translation> <translation id="2454251766545114447">ડિસ્પ્લે ઝૂમ ઘટાડો</translation> <translation id="2478303094958140141">ChromeVox (બોલાયેલ પ્રતિસાદ) ચાલુ અથવા બંધ કરો</translation> +<translation id="2488661730534396940">ડાબી બાજુના ડેસ્કને સક્રિય કરો</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">વેબપેજમાં નીચે સ્ક્રોલ કરો</translation> <translation id="2574014812750545982">પેજ પર ઝૂમ લેવલ રીસેટ કરો</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, પછી <ph name="TAB" /> અથવા <ph name="RIGHT" /></translation> <translation id="2750942583782703988">તમારું વર્તમાન પેજ ફરીથી લોડ કરો</translation> <translation id="2764005613199379871">શોધ ઍડ્રેસ બારમાં ફોકસ કરો</translation> +<translation id="2774822903829597107">નવું ડેસ્ક બનાવો</translation> <translation id="2789868185375229787">આ પેજ પર ઝૂમ ઘટાડો</translation> <translation id="2804480015716812239"><ph name="ALT" />ને દબાવો અને લિંકને ક્લિક કરો</translation> <translation id="2830827904629746450">જમણી બાજુની વિંડોને ડૉક કરો</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">આંશિક સ્ક્રીનશૉટ લો</translation> <translation id="4698850295812410683">સ્ટાઇલસનાં સાધનો બતાવો</translation> <translation id="4801989101741319327">આગલા શબ્દના અંતે જાઓ</translation> +<translation id="4866066940972151697">જમણી બાજુના ડેસ્કને સક્રિય કરો</translation> <translation id="4916163929714267752">લિંકને નવી વિંડોમાં ખોલો</translation> <translation id="5030659775136592441">બુકમાર્ક મેનેજર બતાવો</translation> <translation id="5034421018520995080">પેજની ટોચે જાઓ</translation>
diff --git a/ash/components/strings/ash_components_strings_id.xtb b/ash/components/strings/ash_components_strings_id.xtb index 9045ebc..f53bb59 100644 --- a/ash/components/strings/ash_components_strings_id.xtb +++ b/ash/components/strings/ash_components_strings_id.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Menambahkan www. dan .com ke masukan Anda dalam kolom URL, lalu membuka halaman</translation> +<translation id="1872219238824176091">Menghapus desktop saat ini</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, lalu <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> atau <ph name="LEFT" /></translation> <translation id="1996162290124031907">Membuka tab berikutnya</translation> <translation id="2010818616644390445">Membuka tab terakhir di jendela</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Beralih antarjendela dengan cepat</translation> <translation id="2454251766545114447">Menampilkan fitur Perkecil</translation> <translation id="2478303094958140141">Mengaktifkan atau menonaktifkan ChromeVox (masukan lisan)</translation> +<translation id="2488661730534396940">Mengaktifkan desktop di sisi kiri</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Men-scroll halaman ke bawah</translation> <translation id="2574014812750545982">Menyetel ulang tingkat perbesaran/perkecilan di halaman</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, lalu <ph name="TAB" /> atau <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Memuat ulang halaman aktif</translation> <translation id="2764005613199379871">Menempatkan fokus pada kolom URL penelusuran</translation> +<translation id="2774822903829597107">Membuat desktop baru</translation> <translation id="2789868185375229787">Zoom out halaman</translation> <translation id="2804480015716812239">Tekan <ph name="ALT" />, lalu klik link</translation> <translation id="2830827904629746450">Memasang jendela ke dok di sebelah kanan</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Mengambil screenshot sebagian</translation> <translation id="4698850295812410683">Menampilkan fitur stilus</translation> <translation id="4801989101741319327">Berpindah ke akhir kata berikutnya</translation> +<translation id="4866066940972151697">Mengaktifkan desktop di sisi kanan</translation> <translation id="4916163929714267752">Membuka link di jendela baru</translation> <translation id="5030659775136592441">Menampilkan pengelola bookmark</translation> <translation id="5034421018520995080">Membuka bagian atas halaman</translation>
diff --git a/ash/components/strings/ash_components_strings_ml.xtb b/ash/components/strings/ash_components_strings_ml.xtb index b0bb87f..bf09140 100644 --- a/ash/components/strings/ash_components_strings_ml.xtb +++ b/ash/components/strings/ash_components_strings_ml.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">വിലാസ ബാറിലെ നിങ്ങളുടെ ഇന്പുട്ടിൽ www., .com എന്നിവ ചേർത്ത ശേഷം പേജ് തുറക്കുക</translation> +<translation id="1872219238824176091">നിലവിലെ ഡെസ്ക് നീക്കം ചെയ്യുക</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, തുടർന്ന് <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> അല്ലെങ്കിൽ <ph name="LEFT" /></translation> <translation id="1996162290124031907">അടുത്ത ടാബിലേക്ക് പോവുക</translation> <translation id="2010818616644390445">വിൻഡോയിലെ അവസാന ടാബിലേക്ക് പോവുക</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">വിന്ഡോകൾക്ക് ഇടയിൽ വേഗത്തിൽ മാറുക</translation> <translation id="2454251766545114447">സൂം ഔട്ട് ഡിസ്പ്ലേ ചെയ്യുക</translation> <translation id="2478303094958140141">ChromeVox (സംഭാഷണ ഫീഡ്ബാക്ക്) ഓണാക്കുക അല്ലെങ്കിൽ ഓഫാക്കുക</translation> +<translation id="2488661730534396940">ഇടതുവശത്ത് ഡെസ്ക് സജീവമാക്കുക</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">വെബ് പേജ് താഴേയ്ക്ക് സ്ക്രോൾ ചെയ്യുക</translation> <translation id="2574014812750545982">പേജിൽ സൂം നില പുനഃസജ്ജീകരിക്കുക</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, തുടർന്ന് <ph name="TAB" /> അല്ലെങ്കിൽ <ph name="RIGHT" /></translation> <translation id="2750942583782703988">നിങ്ങളുടെ നിലവിലെ പേജ് വീണ്ടും ലോഡ് ചെയ്യുക</translation> <translation id="2764005613199379871">തിരയൽ വിലാസബാറിൽ ഫോക്കസ് ചെയ്യുക</translation> +<translation id="2774822903829597107">പുതിയൊരു ഡെസ്ക് സൃഷ്ടിക്കുക</translation> <translation id="2789868185375229787">പേജിൽ സൂം ഔട്ട് ചെയ്യുക</translation> <translation id="2804480015716812239"><ph name="ALT" /> അമർത്തി ഒരു ലിങ്ക് ക്ലിക്ക് ചെയ്യുക</translation> <translation id="2830827904629746450">വലത് വശത്ത് ഒരു വിൻഡോ ഡോക്ക് ചെയ്യുക</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">ഭാഗിക സ്ക്രീൻഷോട്ട് എടുക്കുക</translation> <translation id="4698850295812410683">സ്റ്റൈലസ് ടൂളുകൾ കാണിക്കുക</translation> <translation id="4801989101741319327">അടുത്ത വാക്കിന്റെ അവസാനത്തിലേക്ക് നീങ്ങുക</translation> +<translation id="4866066940972151697">വലതുവശത്ത് ഡെസ്ക് സജീവമാക്കുക</translation> <translation id="4916163929714267752">ഒരു പുതിയ വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="5030659775136592441">ബുക്ക്മാർക്ക് മാനേജർ കാണിക്കുക</translation> <translation id="5034421018520995080">പേജിന്റെ മുകളിലേക്ക് പോവുക</translation>
diff --git a/ash/components/strings/ash_components_strings_no.xtb b/ash/components/strings/ash_components_strings_no.xtb index 5d24698..b616612 100644 --- a/ash/components/strings/ash_components_strings_no.xtb +++ b/ash/components/strings/ash_components_strings_no.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Legg til www. og .com i det du har skrevet i adressefeltet, og åpne siden</translation> +<translation id="1872219238824176091">Fjern det aktive skrivebordet</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> og så <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> eller <ph name="LEFT" /></translation> <translation id="1996162290124031907">Gå til neste fane</translation> <translation id="2010818616644390445">Gå til den siste fanen i vinduet</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Bytt raskt mellom vinduer</translation> <translation id="2454251766545114447">Zoom ut skjerm</translation> <translation id="2478303094958140141">Slå ChromeVox (taletilbakemelding) på eller av</translation> +<translation id="2488661730534396940">Aktivér skrivebordet til venstre</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Rull ned på nettsiden</translation> <translation id="2574014812750545982">Tilbakestill zoomnivået på siden</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> og så <ph name="TAB" /> eller <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Last inn den aktive siden på nytt</translation> <translation id="2764005613199379871">Plassér fokuset i søkeadressefeltet</translation> +<translation id="2774822903829597107">Opprett et nytt skrivebord</translation> <translation id="2789868185375229787">Zoom ut på siden</translation> <translation id="2804480015716812239">Trykk på <ph name="ALT" /> og klikk på en link</translation> <translation id="2830827904629746450">Dokk et vindu til høyre</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Ta en delvis skjermdump</translation> <translation id="4698850295812410683">Vis pekepennverktøyet</translation> <translation id="4801989101741319327">Flytt til slutten av neste ord</translation> +<translation id="4866066940972151697">Aktivér skrivebordet til høyre</translation> <translation id="4916163929714267752">Åpne linken i et nytt vindu</translation> <translation id="5030659775136592441">Vis bokmerkebehandlingen</translation> <translation id="5034421018520995080">Gå til toppen av siden</translation>
diff --git a/ash/components/strings/ash_components_strings_sv.xtb b/ash/components/strings/ash_components_strings_sv.xtb index adbf641..9f0a04bf 100644 --- a/ash/components/strings/ash_components_strings_sv.xtb +++ b/ash/components/strings/ash_components_strings_sv.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Skift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Lägg till www. och .com före och efter det du skriver i adressfältet och öppna sedan sidan</translation> +<translation id="1872219238824176091">Ta bort det aktuella skrivbordet</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, sedan <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> eller <ph name="LEFT" /></translation> <translation id="1996162290124031907">Öppna nästa flik</translation> <translation id="2010818616644390445">Öppna den sista fliken i fönstret</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Byt snabbt mellan fönster</translation> <translation id="2454251766545114447">Zooma ut</translation> <translation id="2478303094958140141">Aktivera eller inaktivera ChromeVox (talad feedback)</translation> +<translation id="2488661730534396940">Aktivera skrivbordet till vänster</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Rulla nedåt på webbsidan</translation> <translation id="2574014812750545982">Återställ zoomnivån på sidan</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, sedan <ph name="TAB" /> eller <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Läs in den aktuella sidan igen</translation> <translation id="2764005613199379871">Flytta fokus till sökadressfältet</translation> +<translation id="2774822903829597107">Skapa ett nytt skrivbord</translation> <translation id="2789868185375229787">Zooma ut</translation> <translation id="2804480015716812239">Tryck på <ph name="ALT" /> och klicka på en länk</translation> <translation id="2830827904629746450">Docka ett fönster till höger</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Ta en skärmdump av en del av skärmen</translation> <translation id="4698850295812410683">Visa verktyg för e-penna</translation> <translation id="4801989101741319327">Placera markören efter nästa ord</translation> +<translation id="4866066940972151697">Aktivera skrivbordet till höger</translation> <translation id="4916163929714267752">Öppna länken i ett nytt fönster</translation> <translation id="5030659775136592441">Visa bokmärkeshanteraren</translation> <translation id="5034421018520995080">Till högst upp på sidan</translation>
diff --git a/ash/components/strings/ash_components_strings_sw.xtb b/ash/components/strings/ash_components_strings_sw.xtb index c6b107e..dc84aa3 100644 --- a/ash/components/strings/ash_components_strings_sw.xtb +++ b/ash/components/strings/ash_components_strings_sw.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Hama</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Ongeza www. na .com kwenye maandishi uliyoandika katika sehemu ya anwani, kisha ufungue ukurasa</translation> +<translation id="1872219238824176091">Ondoa eneokazi la sasa</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, kisha <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> au <ph name="LEFT" /></translation> <translation id="1996162290124031907">Nenda kwenye kichupo kinachofuata</translation> <translation id="2010818616644390445">Nenda kwenye kichupo cha mwisho katika dirisha</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Badilisha madirisha haraka</translation> <translation id="2454251766545114447">Sogeza onyesho mbali</translation> <translation id="2478303094958140141">Washa au uzime ChromeVox (maelezo yanayotamkwa)</translation> +<translation id="2488661730534396940">Washa eneokazi katika upande wa kushoto</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Sogeza chini ukurasa wa wavuti</translation> <translation id="2574014812750545982">Badilisha kiwango cha kukuza ukurasa</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, kisha <ph name="TAB" /> au <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Pakia upya ukurasa wa sasa</translation> <translation id="2764005613199379871">Angazia sehemu ya anwani ya utafutaji</translation> +<translation id="2774822903829597107">Anzisha eneokazi jipya</translation> <translation id="2789868185375229787">Sogeza ukurasa mbali</translation> <translation id="2804480015716812239">Bonyeza <ph name="ALT" /> na ubofye kiungo</translation> <translation id="2830827904629746450">Tumia dirisha likiwa upande wa kulia</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Piga picha ya sehemu ya skrini</translation> <translation id="4698850295812410683">Onyesha zana za stylus</translation> <translation id="4801989101741319327">Sogeza hadi mwisho wa neno linalofuata</translation> +<translation id="4866066940972151697">Washa eneokazi katika upande wa kulia</translation> <translation id="4916163929714267752">Fungua kiungo katika dirisha jipya</translation> <translation id="5030659775136592441">Onyesha kidhibiti cha alamisho</translation> <translation id="5034421018520995080">Nenda juu ya ukurasa</translation>
diff --git a/ash/components/strings/ash_components_strings_tr.xtb b/ash/components/strings/ash_components_strings_tr.xtb index 062c524..ca89e43 100644 --- a/ash/components/strings/ash_components_strings_tr.xtb +++ b/ash/components/strings/ash_components_strings_tr.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">ÜstKrktr</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Adres çubuğuna yazdığınız metnin başına www. ve sonuna .com ifadelerini ekleyip sayfayı açar</translation> +<translation id="1872219238824176091">Geçerli masayı kaldır</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, daha sonra <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> veya <ph name="LEFT" /></translation> <translation id="1996162290124031907">Sonraki sekmeye gider</translation> <translation id="2010818616644390445">Penceredeki son sekmeye gider</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Pencereler arasında hızlı geçiş yapar</translation> <translation id="2454251766545114447">Görüntüyü Uzaklaştır</translation> <translation id="2478303094958140141">ChromeVox'u (sesli geri bildirim) açar veya kapatır</translation> +<translation id="2488661730534396940">Soldaki masayı etkinleştir</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Web sayfasını aşağı doğru kaydırır</translation> <translation id="2574014812750545982">Sayfadaki yakınlaştırma düzeyini sıfırla</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, daha sonra <ph name="TAB" /> veya <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Geçerli sayfanızı yeniden yükler</translation> <translation id="2764005613199379871">Odağı arama adres çubuğuna taşır</translation> +<translation id="2774822903829597107">Yeni bir masa oluştur</translation> <translation id="2789868185375229787">Sayfayı uzaklaştırır</translation> <translation id="2804480015716812239"><ph name="ALT" /> tuşunu basılı tutarken bağlantıyı tıklayın</translation> <translation id="2830827904629746450">Pencereyi sağa yerleştirir</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Kısmi ekran görüntüsü alır</translation> <translation id="4698850295812410683">Ekran kalemi araçlarını görüntüler</translation> <translation id="4801989101741319327">Sonraki kelimenin sonuna gider</translation> +<translation id="4866066940972151697">Sağdaki masayı etkinleştir</translation> <translation id="4916163929714267752">Bağlantıyı yeni bir pencerede açar</translation> <translation id="5030659775136592441">Yer işareti yöneticisini görüntüler</translation> <translation id="5034421018520995080">Sayfanın başına gider</translation>
diff --git a/ash/components/strings/ash_components_strings_vi.xtb b/ash/components/strings/ash_components_strings_vi.xtb index d9cd74e4..17df9e71 100644 --- a/ash/components/strings/ash_components_strings_vi.xtb +++ b/ash/components/strings/ash_components_strings_vi.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">Thêm www. và .com vào nội dung mà bạn nhập trên thanh địa chỉ rồi mở trang</translation> +<translation id="1872219238824176091">Xóa không gian làm việc hiện tại</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, rồi đến <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> hoặc <ph name="LEFT" /></translation> <translation id="1996162290124031907">Chuyển sang tab tiếp theo</translation> <translation id="2010818616644390445">Chuyển đến tab cuối cùng trong cửa sổ</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">Chuyển nhanh giữa các cửa sổ</translation> <translation id="2454251766545114447">Thu nhỏ màn hình</translation> <translation id="2478303094958140141">Bật hoặc tắt ChromeVox (phản hồi bằng giọng nói)</translation> +<translation id="2488661730534396940">Kích hoạt không gian làm việc ở bên trái</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">Cuộn xuống dưới trang web</translation> <translation id="2574014812750545982">Đặt lại mức thu phóng trên trang</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, rồi đến <ph name="TAB" /> hoặc <ph name="RIGHT" /></translation> <translation id="2750942583782703988">Tải lại trang hiện tại</translation> <translation id="2764005613199379871">Đặt tiêu điểm vào thanh địa chỉ tìm kiếm</translation> +<translation id="2774822903829597107">Tạo không gian làm việc mới</translation> <translation id="2789868185375229787">Thu nhỏ trang</translation> <translation id="2804480015716812239">Nhấn <ph name="ALT" /> rồi nhấp vào một liên kết</translation> <translation id="2830827904629746450">Gắn một cửa sổ ở bên phải</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">Chụp ảnh một phần màn hình</translation> <translation id="4698850295812410683">Hiển thị công cụ bút cảm ứng</translation> <translation id="4801989101741319327">Di chuyển đến cuối từ tiếp theo</translation> +<translation id="4866066940972151697">Kích hoạt không gian làm việc ở bên phải</translation> <translation id="4916163929714267752">Mở liên kết trong cửa sổ mới</translation> <translation id="5030659775136592441">Hiển thị trình quản lý dấu trang</translation> <translation id="5034421018520995080">Chuyển tới đầu trang</translation>
diff --git a/ash/components/strings/ash_components_strings_zh-CN.xtb b/ash/components/strings/ash_components_strings_zh-CN.xtb index 7f11e93..d0b0aa0 100644 --- a/ash/components/strings/ash_components_strings_zh-CN.xtb +++ b/ash/components/strings/ash_components_strings_zh-CN.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation> <translation id="1733525068429116555">将 www. 和 .com 添加到您在搜索栏内输入的内容中,然后打开相应网页</translation> +<translation id="1872219238824176091">移除当前桌面</translation> <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />,然后按 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 或<ph name="LEFT" />键</translation> <translation id="1996162290124031907">转到下一个标签页</translation> <translation id="2010818616644390445">转到窗口中的最后一个标签页</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">快速切换窗口</translation> <translation id="2454251766545114447">缩小显示内容</translation> <translation id="2478303094958140141">开启或关闭 ChromeVox(语音反馈)</translation> +<translation id="2488661730534396940">启用左侧桌面</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">向下滚动网页</translation> <translation id="2574014812750545982">重置网页的缩放级别</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />,然后按 <ph name="TAB" /> 键或<ph name="RIGHT" />键</translation> <translation id="2750942583782703988">重新加载当前网页</translation> <translation id="2764005613199379871">将焦点置于搜索地址栏中</translation> +<translation id="2774822903829597107">创建新桌面</translation> <translation id="2789868185375229787">缩小网页</translation> <translation id="2804480015716812239">在按住 <ph name="ALT" /> 键的同时点击链接</translation> <translation id="2830827904629746450">将窗口固定在右侧</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">截取局部屏幕截图</translation> <translation id="4698850295812410683">显示触控笔工具</translation> <translation id="4801989101741319327">移到下一个字词的末尾</translation> +<translation id="4866066940972151697">启用右侧桌面</translation> <translation id="4916163929714267752">在新窗口中打开链接</translation> <translation id="5030659775136592441">显示书签管理器</translation> <translation id="5034421018520995080">转到网页顶部</translation>
diff --git a/ash/components/strings/ash_components_strings_zh-TW.xtb b/ash/components/strings/ash_components_strings_zh-TW.xtb index 32550f82..a453c2f 100644 --- a/ash/components/strings/ash_components_strings_zh-TW.xtb +++ b/ash/components/strings/ash_components_strings_zh-TW.xtb
@@ -23,6 +23,7 @@ <translation id="169515659049020177">Shift</translation> <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /> 鍵</translation> <translation id="1733525068429116555">為你在網址列中輸入的字串加上 www. 和 .com 並開啟網頁</translation> +<translation id="1872219238824176091">移除目前的桌面</translation> <translation id="1920446759863417809">按下 <ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> 鍵,然後按下 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 鍵或 <ph name="LEFT" /> 鍵</translation> <translation id="1996162290124031907">前往下一個分頁</translation> <translation id="2010818616644390445">前往視窗中的最後一個分頁</translation> @@ -42,6 +43,7 @@ <translation id="2441202986792279177">快速切換視窗</translation> <translation id="2454251766545114447">縮小畫面</translation> <translation id="2478303094958140141">開啟或關閉 ChromeVox 互動朗讀功能</translation> +<translation id="2488661730534396940">啟用左側的桌面</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2530339807289914946">向下捲動網頁</translation> <translation id="2574014812750545982">重設網頁的縮放比例</translation> @@ -49,6 +51,7 @@ <translation id="2685170433750953446">按下 <ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> 鍵,然後按下 <ph name="TAB" /> 或 <ph name="RIGHT" /> 鍵</translation> <translation id="2750942583782703988">重新載入目前網頁</translation> <translation id="2764005613199379871">將焦點放在搜尋網址列</translation> +<translation id="2774822903829597107">建立新桌面</translation> <translation id="2789868185375229787">縮小網頁</translation> <translation id="2804480015716812239">按住 <ph name="ALT" /> 鍵,然後按一下連結</translation> <translation id="2830827904629746450">將視窗固定在右側</translation> @@ -100,6 +103,7 @@ <translation id="4642092649622328492">擷取部分螢幕畫面</translation> <translation id="4698850295812410683">顯示觸控筆工具</translation> <translation id="4801989101741319327">移至下一個字詞的結尾</translation> +<translation id="4866066940972151697">啟用右側的桌面</translation> <translation id="4916163929714267752">在新視窗開啟連結</translation> <translation id="5030659775136592441">顯示書籤管理員</translation> <translation id="5034421018520995080">前往頁面頂端</translation>
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc index 61efd4b..11b1536 100644 --- a/ash/public/cpp/accelerators.cc +++ b/ash/public/cpp/accelerators.cc
@@ -177,9 +177,9 @@ {true, ui::VKEY_MEDIA_PLAY_PAUSE, ui::EF_NONE, MEDIA_PLAY_PAUSE}, {true, ui::VKEY_MEDIA_PREV_TRACK, ui::EF_NONE, MEDIA_PREV_TRACK}, - // Voice Interaction shortcuts. - {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION}, - {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_VOICE_INTERACTION}, + // Assistant shortcuts. + {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_ASSISTANT}, + {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_ASSISTANT}, // IME mode change key. {true, ui::VKEY_MODECHANGE, ui::EF_NONE, SWITCH_TO_NEXT_IME},
diff --git a/ash/public/cpp/accelerators.h b/ash/public/cpp/accelerators.h index 325e3a9..b148b2c 100644 --- a/ash/public/cpp/accelerators.h +++ b/ash/public/cpp/accelerators.h
@@ -78,7 +78,7 @@ SHOW_STYLUS_TOOLS, SHOW_TASK_MANAGER, START_AMBIENT_MODE, - START_VOICE_INTERACTION, + START_ASSISTANT, SUSPEND, SWAP_PRIMARY_DISPLAY, SWITCH_IME, // Switch to another IME depending on the accelerator.
diff --git a/ash/shelf/home_button_unittest.cc b/ash/shelf/home_button_unittest.cc index d965b9a..e2c1cf69 100644 --- a/ash/shelf/home_button_unittest.cc +++ b/ash/shelf/home_button_unittest.cc
@@ -177,7 +177,7 @@ // Simulate two user with primary user as active. CreateUserSessions(2); - // Enable voice interaction in system settings. + // Enable the Assistant in system settings. prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true); assistant_state()->NotifyFeatureAllowed( mojom::AssistantAllowedState::ALLOWED); @@ -210,13 +210,13 @@ assistant_state()->NotifyFeatureAllowed( mojom::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER); - // Enable voice interaction in system settings. + // Enable the Assistant in system settings. prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true); ui::GestureEvent long_press = CreateGestureEvent(ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); SendGestureEvent(&long_press); - // Voice interaction is disabled for secondary user. + // The Assistant is disabled for secondary user. EXPECT_NE(AssistantVisibility::kVisible, Shell::Get() ->assistant_controller() ->ui_controller() @@ -236,8 +236,8 @@ // Simulate two user with primary user as active. CreateUserSessions(2); - // Simulate a user who has already completed setup flow, but disabled voice - // interaction in settings. + // Simulate a user who has already completed setup flow, but disabled the + // Assistant in settings. prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, false); assistant_state()->NotifyFeatureAllowed( mojom::AssistantAllowedState::ALLOWED);
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc index 53485fd7..e2e57f4c 100644 --- a/ash/shelf/scrollable_shelf_view.cc +++ b/ash/shelf/scrollable_shelf_view.cc
@@ -257,6 +257,8 @@ focus_search_ = std::make_unique<ScrollableShelfFocusSearch>(this); GetShelf()->tooltip()->set_shelf_tooltip_delegate(this); + + set_context_menu_controller(this); } void ScrollableShelfView::OnFocusRingActivationChanged(bool activated) { @@ -568,8 +570,8 @@ void ScrollableShelfView::OnGestureEvent(ui::GestureEvent* event) { if (ShouldHandleGestures(*event)) HandleGestureEvent(event); - else - shelf_view_->HandleGestureEvent(event); + else if (shelf_view_->HandleGestureEvent(event)) + event->StopPropagation(); } const char* ScrollableShelfView::GetClassName() const { @@ -580,6 +582,14 @@ ShelfButton* button, bool reverse) {} +void ScrollableShelfView::ShowContextMenuForViewImpl( + views::View* source, + const gfx::Point& point, + ui::MenuSourceType source_type) { + // |point| is in screen coordinates. So it does not need to transform. + shelf_view_->ShowContextMenuForViewImpl(shelf_view_, point, source_type); +} + void ScrollableShelfView::ButtonPressed(views::Button* sender, const ui::Event& event, views::InkDrop* ink_drop) { @@ -606,6 +616,11 @@ if (view->parent() != shelf_view_) return false; + // The shelf item corresponding to |view| may have been removed from the + // model. + if (!shelf_view_->ShouldShowTooltipForChildView(view)) + return false; + const gfx::Rect screen_bounds = view->GetBoundsInScreen(); const gfx::Rect visible_bounds = shelf_container_view_->GetBoundsInScreen(); return visible_bounds.Contains(screen_bounds); @@ -943,10 +958,16 @@ } views::View* ScrollableShelfView::FindFirstFocusableChild() { + if (shelf_view_->view_model()->view_size() == 0) + return nullptr; + return shelf_view_->view_model()->view_at(shelf_view_->first_visible_index()); } views::View* ScrollableShelfView::FindLastFocusableChild() { + if (shelf_view_->view_model()->view_size() == 0) + return nullptr; + return shelf_view_->view_model()->view_at(shelf_view_->last_visible_index()); }
diff --git a/ash/shelf/scrollable_shelf_view.h b/ash/shelf/scrollable_shelf_view.h index 81370c87..450269df 100644 --- a/ash/shelf/scrollable_shelf_view.h +++ b/ash/shelf/scrollable_shelf_view.h
@@ -14,6 +14,7 @@ #include "ash/shelf/shelf_tooltip_delegate.h" #include "ash/shelf/shelf_view.h" #include "ui/views/animation/ink_drop_host_view.h" +#include "ui/views/context_menu_controller.h" #include "ui/views/controls/button/button.h" namespace views { @@ -25,7 +26,8 @@ class ASH_EXPORT ScrollableShelfView : public views::AccessiblePaneView, public ShellObserver, public ShelfButtonDelegate, - public ShelfTooltipDelegate { + public ShelfTooltipDelegate, + public views::ContextMenuController { public: enum LayoutStrategy { // The arrow buttons are not shown. It means that there is enough space to @@ -131,6 +133,12 @@ // ShelfButtonDelegate: void OnShelfButtonAboutToRequestFocusFromTabTraversal(ShelfButton* button, bool reverse) override; + + // ContextMenuController: + void ShowContextMenuForViewImpl(views::View* source, + const gfx::Point& point, + ui::MenuSourceType source_type) override; + void ButtonPressed(views::Button* sender, const ui::Event& event, views::InkDrop* ink_drop) override;
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index 203fec8..15d67bbd 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -2902,6 +2902,8 @@ generator->MoveMouseTo(0, 0); ShelfTestUtil::AddAppShortcut("app_id", TYPE_APP); + ShelfViewTestAPI(GetPrimaryShelf()->GetShelfViewForTesting()) + .RunMessageLoopUntilAnimationsDone(); // Turn on the auto-hide mode for shelf. Check the initial states. shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); @@ -3346,6 +3348,8 @@ EXPECT_NE(display_1, display_2); ShelfTestUtil::AddAppShortcut("app_id", TYPE_PINNED_APP); + ShelfViewTestAPI(GetPrimaryShelf()->GetShelfViewForTesting()) + .RunMessageLoopUntilAnimationsDone(); gfx::Point app_center_1 = shelf_1->GetShelfViewForTesting() ->first_visible_button_for_testing() ->bounds()
diff --git a/ash/shelf/shelf_tooltip_manager_unittest.cc b/ash/shelf/shelf_tooltip_manager_unittest.cc index bf61981..af60328 100644 --- a/ash/shelf/shelf_tooltip_manager_unittest.cc +++ b/ash/shelf/shelf_tooltip_manager_unittest.cc
@@ -31,9 +31,10 @@ void SetUp() override { AshTestBase::SetUp(); shelf_view_ = GetPrimaryShelf()->GetShelfViewForTesting(); - ShelfViewTestAPI test_api(shelf_view_); - test_api.AddItem(TYPE_PINNED_APP); - tooltip_manager_ = test_api.tooltip_manager(); + test_api_ = std::make_unique<ShelfViewTestAPI>(shelf_view_); + test_api_->AddItem(TYPE_PINNED_APP); + test_api_->RunMessageLoopUntilAnimationsDone(); + tooltip_manager_ = test_api_->tooltip_manager(); tooltip_manager_->set_timer_delay_for_test(0); } @@ -49,6 +50,7 @@ protected: ShelfView* shelf_view_; ShelfTooltipManager* tooltip_manager_; + std::unique_ptr<ShelfViewTestAPI> test_api_; private: DISALLOW_COPY_AND_ASSIGN(ShelfTooltipManagerTest); @@ -89,6 +91,8 @@ item.id = ShelfID("foo"); item.type = TYPE_PINNED_APP; const int index = model->Add(item); + ShelfViewTestAPI(GetPrimaryShelf()->GetShelfViewForTesting()) + .RunMessageLoopUntilAnimationsDone(); // Note: There's no easy way to correlate shelf a model index/id to its view. tooltip_manager_->ShowTooltipWithDelay(shelf_view_->children().back()); EXPECT_TRUE(IsTimerRunning());
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 3bb6f8b4..522f398 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -822,6 +822,32 @@ drag_image_->SetWidgetVisible(true); } +void ShelfView::ShowContextMenuForViewImpl(views::View* source, + const gfx::Point& point, + ui::MenuSourceType source_type) { + // Prevent concurrent requests that may show application or context menus. + const ShelfItem* item = ShelfItemForView(source); + if (!item_awaiting_response_.IsNull()) { + if (item && item->id != item_awaiting_response_) { + static_cast<views::Button*>(source)->AnimateInkDrop( + views::InkDropState::DEACTIVATED, nullptr); + } + return; + } + last_pressed_index_ = -1; + if (!item || !model_->GetShelfItemDelegate(item->id)) { + ShowShelfContextMenu(ShelfID(), point, source, source_type, nullptr); + return; + } + + item_awaiting_response_ = item->id; + const int64_t display_id = GetDisplayIdForView(this); + model_->GetShelfItemDelegate(item->id)->GetContextMenu( + display_id, base::BindOnce(&ShelfView::ShowShelfContextMenu, + weak_factory_.GetWeakPtr(), item->id, point, + source, source_type)); +} + void ShelfView::OnTabletModeStarted() { // Close all menus when tablet mode starts to ensure that the clamshell only // context menu options are not available in tablet mode. @@ -969,6 +995,19 @@ return false; } +bool ShelfView::ShouldShowTooltipForChildView( + const views::View* child_view) const { + DCHECK_EQ(this, child_view->parent()); + + if (child_view == overflow_button_) + return true; + // Don't show a tooltip for a view that's currently being dragged. + if (child_view == drag_view_) + return false; + + return ShelfItemForView(child_view) && !IsShowingMenuForView(child_view); +} + // static void ShelfView::ConfigureChildView(views::View* view) { view->SetPaintToLayer(); @@ -2298,32 +2337,6 @@ ShowMenu(std::move(model), source, point, /*context_menu=*/true, source_type); } -void ShelfView::ShowContextMenuForViewImpl(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) { - // Prevent concurrent requests that may show application or context menus. - const ShelfItem* item = ShelfItemForView(source); - if (!item_awaiting_response_.IsNull()) { - if (item && item->id != item_awaiting_response_) { - static_cast<views::Button*>(source)->AnimateInkDrop( - views::InkDropState::DEACTIVATED, nullptr); - } - return; - } - last_pressed_index_ = -1; - if (!item || !model_->GetShelfItemDelegate(item->id)) { - ShowShelfContextMenu(ShelfID(), point, source, source_type, nullptr); - return; - } - - item_awaiting_response_ = item->id; - const int64_t display_id = GetDisplayIdForView(this); - model_->GetShelfItemDelegate(item->id)->GetContextMenu( - display_id, base::BindOnce(&ShelfView::ShowShelfContextMenu, - weak_factory_.GetWeakPtr(), item->id, point, - source, source_type)); -} - void ShelfView::ShowMenu(std::unique_ptr<ui::SimpleMenuModel> menu_model, views::View* source, const gfx::Point& click_point, @@ -2482,15 +2495,4 @@ return item ? item->title : base::string16(); } -bool ShelfView::ShouldShowTooltipForChildView( - const views::View* child_view) const { - if (child_view == overflow_button_) - return true; - // Don't show a tooltip for a view that's currently being dragged. - if (child_view == drag_view_) - return false; - - return ShelfItemForView(child_view) && !IsShowingMenuForView(child_view); -} - } // namespace ash
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index 0368a16..d4820df0 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -207,6 +207,11 @@ const gfx::Vector2d& cursor_offset_from_center, float scale_factor) override; + // Overridden from views::ContextMenuController: + void ShowContextMenuForViewImpl(views::View* source, + const gfx::Point& point, + ui::MenuSourceType source_type) override; + // ash::TabletModeObserver: void OnTabletModeStarted() override; void OnTabletModeEnded() override; @@ -283,6 +288,9 @@ // Handles the gesture event. Returns true if |event| has been consumed. bool HandleGestureEvent(const ui::GestureEvent* event); + // Different from ShouldShowTooltipForView, |view| here must be a child view. + bool ShouldShowTooltipForChildView(const views::View* child_view) const; + // Return the view model for test purposes. const views::ViewModel* view_model_for_test() const { return view_model_.get(); @@ -507,11 +515,6 @@ ShelfAction action, ShelfItemDelegate::AppMenuItems menu_items); - // Overridden from views::ContextMenuController: - void ShowContextMenuForViewImpl(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) override; - // Show either a context or normal click menu of given |menu_model|. // If |context_menu| is set, the displayed menu is a context menu and not // a menu listing one or more running applications. @@ -554,9 +557,6 @@ // Different from GetTitleForView, |view| here must be a child view. base::string16 GetTitleForChildView(const views::View* view) const; - // Different from ShouldShowTooltipForView, |view| here must be a child view. - bool ShouldShowTooltipForChildView(const views::View* child_view) const; - // The model; owned by Launcher. ShelfModel* model_;
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index 4a970fee..781a5145 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -2378,6 +2378,11 @@ ShelfID shelf_id("123"); window->SetProperty(kShelfIDKey, shelf_id.Serialize()); window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); + + // Waits for the bounds animation triggered by window property setting to + // finish. + test_api_->RunMessageLoopUntilAnimationsDone(); + ShelfAppButton* button = GetButtonByID(shelf_id); ASSERT_TRUE(button);
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index fbf231a..7a3705f 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">নিম্ন শক্তির চার্জার</translation> <translation id="2135456203358955318">ডক করা ম্যাগনিফায়ার</translation> <translation id="2144487987174258011">Adobe ফ্ল্যাশ প্লেয়ার আপডেট করার জন্য বন্ধ করে আবার চালু করুন</translation> +<translation id="2148902151539191989">ফিরুন</translation> <translation id="2208323208084708176">একীভূত ডেস্কটপ মোড</translation> <translation id="2220572644011485463">PIN বা পাসওয়ার্ড</translation> <translation id="225680501294068881">ডিভাইসগুলির জন্য স্ক্যান করা হচ্ছে...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">একটি ডেমো সেশনে Google অ্যাসিস্ট্যান্ট উপলভ্য নয়।</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">সংযোগ বিচ্ছিন্ন</translation> +<translation id="4814539958450445987">লগ-ইন স্ক্রিন</translation> <translation id="4831034276697007977">অটোমেটিক ক্লিক বন্ধ করতে চান কিনা সেই বিষয়টি ভাল করে দেখে নিন?</translation> <translation id="4849058404725798627">কিবোর্ড ফোকাসের মাধ্যমে হাইলাইট করুন</translation> <translation id="485592688953820832">কোনও অ্যাকশন নেবেন না (পজ)</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 493f5ab..2e25e95 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">નિમ્ન-પાવર ચાર્જર</translation> <translation id="2135456203358955318">ડૉક કરેલ મૅગ્નિફાયર</translation> <translation id="2144487987174258011">Adobe Flash Player અપડેટ કરવા પુનઃપ્રારંભ કરો</translation> +<translation id="2148902151539191989">પાછળ</translation> <translation id="2208323208084708176">એકીકૃત ડેસ્કટૉપ મોડ</translation> <translation id="2220572644011485463">PIN અથવા પાસવર્ડ</translation> <translation id="225680501294068881">ઉપકરણો માટે સ્કેન કરી રહ્યું છે...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">ડેમો સત્રમાં Google આસિસ્ટંટ ઉપલબ્ધ નથી.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">ડિસ્કનેક્ટ કરો</translation> +<translation id="4814539958450445987">લૉગ ઇન સ્ક્રીન</translation> <translation id="4831034276697007977">શું તમારે ખરેખર ઑટોમૅટિક ક્લિક બંધ કરવા છે?</translation> <translation id="4849058404725798627">કીબોર્ડ ફોકસ વડે ઑબ્જેક્ટને હાઇલાઇટ કરો</translation> <translation id="485592688953820832">કોઈ ક્રિયા નથી (થોભાવો)</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index f5fe46e1..4f0652a 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Pengisi daya rendah</translation> <translation id="2135456203358955318">Kaca pembesar yang dipasang ke dok</translation> <translation id="2144487987174258011">Nyalakan ulang untuk mengupdate Adobe Flash Player</translation> +<translation id="2148902151539191989">KEMBALI</translation> <translation id="2208323208084708176">Mode desktop terpadu</translation> <translation id="2220572644011485463">PIN atau sandi</translation> <translation id="225680501294068881">Memindai perangkat...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Asisten Google tidak tersedia dalam sesi demo.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Putuskan</translation> +<translation id="4814539958450445987">Layar Login</translation> <translation id="4831034276697007977">Yakin ingin menonaktifkan klik otomatis?</translation> <translation id="4849058404725798627">Sorot objek dengan fokus keyboard</translation> <translation id="485592688953820832">Tidak ada tindakan (jeda)</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 18bddbe..efb5db3 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ</translation> <translation id="2135456203358955318">ഡോക്ക് ചെയ്ത മാഗ്നിഫയർ</translation> <translation id="2144487987174258011">Adobe Flash Player അപ്ഡേറ്റ് ചെയ്യാൻ പുനരാരംഭിക്കുക</translation> +<translation id="2148902151539191989">മടങ്ങുക</translation> <translation id="2208323208084708176">ഏകീകൃത ഡെസ്ക്ടോപ്പ് മോഡ്</translation> <translation id="2220572644011485463">പിൻ അല്ലെങ്കിൽ പാസ്വേഡ്</translation> <translation id="225680501294068881">ഉപകരണങ്ങൾക്കായി സ്കാൻ ചെയ്യുന്നു...</translation> @@ -261,6 +262,7 @@ <translation id="4778095205580009397">ഡെമോ സെഷനിൽ Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">വിച്ഛേദിക്കുക</translation> +<translation id="4814539958450445987">ലോഗിൻ സ്ക്രീൻ</translation> <translation id="4831034276697007977">സ്വയമേവയുള്ള ക്ലിക്കുകൾ ഓഫാക്കണമെന്ന് നിങ്ങൾക്ക് തീർച്ചയാണോ?</translation> <translation id="4849058404725798627">കീബോർഡ് ഫോക്കസ് ഉപയോഗിച്ച് ഒബ്ജക്റ്റിനെ ഹൈലൈറ്റുചെയ്യുക</translation> <translation id="485592688953820832">പ്രവർത്തനമൊന്നും വേണ്ട (താൽക്കാലികമായി നിർത്തുക)</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 5aaf4d6..7269095 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Lading med lav effekt</translation> <translation id="2135456203358955318">Dokket lupe</translation> <translation id="2144487987174258011">Start på nytt for å oppdatere Adobe Flash Player</translation> +<translation id="2148902151539191989">TILBAKE</translation> <translation id="2208323208084708176">Enhetlig skrivebordsmodus</translation> <translation id="2220572644011485463">PIN-kode eller passord</translation> <translation id="225680501294068881">Leter etter enheter ...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Google-assistenten er ikke tilgjengelig under demonstrasjonsøkter.</translation> <translation id="479989351350248267">søk</translation> <translation id="4804818685124855865">Koble fra</translation> +<translation id="4814539958450445987">Påloggingsskjerm</translation> <translation id="4831034276697007977">Er du sikker på at du vil slå av automatiske klikk?</translation> <translation id="4849058404725798627">Fremhev objektet med tastaturfokus</translation> <translation id="485592688953820832">Ingen handling (pause)</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 581f8cf5..995e33a9 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Laddning med låg effekt</translation> <translation id="2135456203358955318">Dockad skärmförstoring</translation> <translation id="2144487987174258011">Starta om för att uppdatera Adobe Flash Player</translation> +<translation id="2148902151539191989">TILLBAKA</translation> <translation id="2208323208084708176">Enhetligt skrivbordsläge</translation> <translation id="2220572644011485463">Pinkod eller lösenord</translation> <translation id="225680501294068881">Söker efter enheter ...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Google-assistenten är inte tillgänglig i en demosession.</translation> <translation id="479989351350248267">sök</translation> <translation id="4804818685124855865">Koppla från</translation> +<translation id="4814539958450445987">Inloggningsskärm</translation> <translation id="4831034276697007977">Vill du inaktivera automatiska klick?</translation> <translation id="4849058404725798627">Markera objekt med tangentbordsfokus</translation> <translation id="485592688953820832">Ingen åtgärd (pausa)</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 41c6eacd..7b7b151 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Chaja ya nguvu ya chini</translation> <translation id="2135456203358955318">Kikuzaji kilichofungwa</translation> <translation id="2144487987174258011">Zima kisha uwashe ili usasishe Adobe Flash Player</translation> +<translation id="2148902151539191989">NYUMA</translation> <translation id="2208323208084708176">Hali ya eneo-kazi iliyounganishwa</translation> <translation id="2220572644011485463">PIN au nenosiri</translation> <translation id="225680501294068881">Inatambazaa vifaa...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Programu ya Mratibu wa Google haipatikani katika kipindi cha onyesho.</translation> <translation id="479989351350248267">tafuta</translation> <translation id="4804818685124855865">Tenganisha</translation> +<translation id="4814539958450445987">Skrini ya Kuingia katika Akaunti</translation> <translation id="4831034276697007977">Je, una uhakika ungependa kuzima mibofyo ya kiotomatiki?</translation> <translation id="4849058404725798627">Angazia kipengee kilicholengwa kwa kibodi</translation> <translation id="485592688953820832">Hakuna kitendo (simamisha)</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 71b91fe..25bcbe4e 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Düşük güçlü şarj cihazı</translation> <translation id="2135456203358955318">Yerleştirilmiş büyüteç</translation> <translation id="2144487987174258011">Adobe Flash Player'ı güncellemek için yeniden başlatın</translation> +<translation id="2148902151539191989">GERİ</translation> <translation id="2208323208084708176">Birleştirilmiş masaüstü modu</translation> <translation id="2220572644011485463">PIN veya şifre</translation> <translation id="225680501294068881">Cihazlar taranıyor...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Google Asistan, demo oturumunda kullanılamaz.</translation> <translation id="479989351350248267">ara</translation> <translation id="4804818685124855865">Bağlantıyı kes</translation> +<translation id="4814539958450445987">Giriş Ekranı</translation> <translation id="4831034276697007977">Otomatik tıklamaları kapatmak istediğinizden emin misiniz?</translation> <translation id="4849058404725798627">Klavye odağının olduğu nesneyi vurgula</translation> <translation id="485592688953820832">İşlem yok (duraklat)</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 62941cfe..9e2ba36 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">Bộ sạc công suất thấp</translation> <translation id="2135456203358955318">Phóng to ở vị trí cố định</translation> <translation id="2144487987174258011">Khởi động lại để cập nhật Adobe Flash Player</translation> +<translation id="2148902151539191989">QUAY LẠI</translation> <translation id="2208323208084708176">Chế độ màn hình đồng nhất</translation> <translation id="2220572644011485463">Mã PIN hoặc mật khẩu</translation> <translation id="225680501294068881">Đang quét tìm thiết bị...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Bạn không thể sử dụng Trợ lý Google trong phiên minh họa.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Ngắt kết nối</translation> +<translation id="4814539958450445987">Màn hình đăng nhập</translation> <translation id="4831034276697007977">Bạn có chắc chắn muốn tắt tính năng tự động nhấp không?</translation> <translation id="4849058404725798627">Đánh dấu đối tượng bằng tiêu điểm bàn phím</translation> <translation id="485592688953820832">Không có hành động nào (tạm dừng)</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index eb234e49..f2af0449 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">低功率充电器</translation> <translation id="2135456203358955318">停靠的放大镜</translation> <translation id="2144487987174258011">请重新启动以更新 Adobe Flash Player</translation> +<translation id="2148902151539191989">返回</translation> <translation id="2208323208084708176">统一桌面模式</translation> <translation id="2220572644011485463">PIN 码或密码</translation> <translation id="225680501294068881">正在查找设备...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">无法在演示会话中使用 Google 助理。</translation> <translation id="479989351350248267">搜索</translation> <translation id="4804818685124855865">断开连接</translation> +<translation id="4814539958450445987">登录屏幕</translation> <translation id="4831034276697007977">确定要关闭自动点击吗?</translation> <translation id="4849058404725798627">突出显示键盘焦点所在对象</translation> <translation id="485592688953820832">不执行任何操作(暂停)</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 3b88227..2a63f9f 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -88,6 +88,7 @@ <translation id="2127372758936585790">低功率充電器</translation> <translation id="2135456203358955318">停駐放大鏡</translation> <translation id="2144487987174258011">重新啟動以便更新 Adobe Flash Player</translation> +<translation id="2148902151539191989">返回</translation> <translation id="2208323208084708176">整合桌面模式</translation> <translation id="2220572644011485463">PIN 或密碼</translation> <translation id="225680501294068881">正在掃描裝置...</translation> @@ -262,6 +263,7 @@ <translation id="4778095205580009397">Google 助理不適用於示範工作階段。</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">中斷連線</translation> +<translation id="4814539958450445987">登入畫面</translation> <translation id="4831034276697007977">確定要關閉自動點擊功能嗎?</translation> <translation id="4849058404725798627">醒目顯示鍵盤焦點所在物件</translation> <translation id="485592688953820832">不執行任何動作 (暫停)</translation>
diff --git a/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc b/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc index 335153b9..66a4f3e 100644 --- a/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc +++ b/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc
@@ -50,11 +50,11 @@ } void TrayBluetoothHelperExperimental::StartBluetoothDiscovering() { - bluetooth_system_->StartScan(base::DoNothing()); + bluetooth_system_->StartScan(base::NullCallback()); } void TrayBluetoothHelperExperimental::StopBluetoothDiscovering() { - bluetooth_system_->StopScan(base::DoNothing()); + bluetooth_system_->StopScan(base::NullCallback()); } void TrayBluetoothHelperExperimental::ConnectToBluetoothDevice( @@ -68,7 +68,7 @@ } void TrayBluetoothHelperExperimental::SetBluetoothEnabled(bool enabled) { - bluetooth_system_->SetPowered(enabled, base::DoNothing()); + bluetooth_system_->SetPowered(enabled, base::NullCallback()); } bool TrayBluetoothHelperExperimental::HasBluetoothDiscoverySession() {
diff --git a/ash/system/palette/tools/metalayer_mode.h b/ash/system/palette/tools/metalayer_mode.h index 678bf9f..fe24116 100644 --- a/ash/system/palette/tools/metalayer_mode.h +++ b/ash/system/palette/tools/metalayer_mode.h
@@ -15,7 +15,7 @@ namespace ash { // A palette tool that lets the user select a screen region to be passed -// to the voice interaction framework. +// to the Assistant framework. // // Unlike other palette tools, it can be activated not only through the stylus // menu, but also by the stylus button click.
diff --git a/ash/system/palette/tools/metalayer_unittest.cc b/ash/system/palette/tools/metalayer_unittest.cc index b7aff2f..bb59e54 100644 --- a/ash/system/palette/tools/metalayer_unittest.cc +++ b/ash/system/palette/tools/metalayer_unittest.cc
@@ -68,7 +68,7 @@ } // namespace // The metalayer tool is always visible, but only enabled when the user -// has enabled the metalayer AND the voice interaction framework is ready. +// has enabled the metalayer AND the Assistant framework is ready. TEST_F(MetalayerToolTest, PaletteMenuState) { const mojom::AssistantState kStates[] = {mojom::AssistantState::NOT_READY, mojom::AssistantState::READY};
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h index 5a0e70f9..c69c32c 100644 --- a/base/allocator/partition_allocator/partition_page.h +++ b/base/allocator/partition_allocator/partition_page.h
@@ -11,6 +11,7 @@ #include "base/allocator/partition_allocator/partition_bucket.h" #include "base/allocator/partition_allocator/partition_cookie.h" #include "base/allocator/partition_allocator/partition_freelist_entry.h" +#include "base/allocator/partition_allocator/random.h" #include "base/logging.h" namespace base { @@ -201,19 +202,28 @@ } ALWAYS_INLINE void PartitionPage::Free(void* ptr) { -#if DCHECK_IS_ON() size_t slot_size = this->bucket->slot_size; const size_t raw_size = get_raw_size(); if (raw_size) { slot_size = raw_size; } +#if DCHECK_IS_ON() // If these asserts fire, you probably corrupted memory. PartitionCookieCheckValue(ptr); PartitionCookieCheckValue(reinterpret_cast<char*>(ptr) + slot_size - kCookieSize); memset(ptr, kFreedByte, slot_size); +#else + // Probabilistically poison the memory. The goal is to do it often enough to + // catch bugs in production, but not so often that it significantly affects + // performance. Set fewer bits in the mask to increase the probability of + // poisoning; set more to reduce the performance effect. + constexpr uint32_t kProbabilityMask = 0x3f; + if (kProbabilityMask == (RandomValue() & kProbabilityMask)) { + memset(ptr, kFreedByte, slot_size); + } #endif DCHECK(this->num_allocated_slots);
diff --git a/base/allocator/partition_allocator/random.h b/base/allocator/partition_allocator/random.h index 85cb66d..a9aaa7f 100644 --- a/base/allocator/partition_allocator/random.h +++ b/base/allocator/partition_allocator/random.h
@@ -15,7 +15,7 @@ // `base::RandUint64` which is very unpredictable, but which is expensive due to // the need to call into the kernel. Therefore this generator uses a fast, // entirely user-space function after initialization. -uint32_t RandomValue(); +BASE_EXPORT uint32_t RandomValue(); // Sets the seed for the random number generator to a known value, to cause the // RNG to generate a predictable sequence of outputs. May be called multiple
diff --git a/base/android/proguard/chromium_code.flags b/base/android/proguard/chromium_code.flags index a9f4e38..983dbd5 100644 --- a/base/android/proguard/chromium_code.flags +++ b/base/android/proguard/chromium_code.flags
@@ -50,12 +50,9 @@ -assumenosideeffects class ** { # Remove @RemovableInRelease methods so long as return values are unused. @org.chromium.base.annotations.RemovableInRelease <methods>; -} - --assumevalues class ** { # Remove object @RemovableInRelease methods even when return value is used. - # Note: ** in return type does not match primitives. - @org.chromium.base.annotations.RemovableInRelease ** *(...) return null; + # Note: * in return type does not match primitives. + @org.chromium.base.annotations.RemovableInRelease * *(...) return null; # Remove boolean @RemovableInRelease methods even when return value is used. @org.chromium.base.annotations.RemovableInRelease boolean *(...) return false; }
diff --git a/base/feature_list.h b/base/feature_list.h index a6f39da..116f31f 100644 --- a/base/feature_list.h +++ b/base/feature_list.h
@@ -24,6 +24,8 @@ class FieldTrialList; // Specifies whether a given feature is enabled or disabled by default. +// NOTE: The actual runtime state may be different, due to a field trial or a +// command line switch. enum FeatureState { FEATURE_DISABLED_BY_DEFAULT, FEATURE_ENABLED_BY_DEFAULT, @@ -42,6 +44,8 @@ const char* const name; // The default state (i.e. enabled or disabled) for this feature. + // NOTE: The actual runtime state may be different, due to a field trial or a + // command line switch. const FeatureState default_state; };
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 95b8c2aa..1c12c8c 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -50,13 +50,6 @@ r'.*daydream_icon_.*\.png'])) -def _ListToDictionary(lst, separator): - """Splits each element of the passed-in |lst| using |separator| and creates - dictionary treating first element of the split as the key and second as the - value.""" - return dict(item.split(separator, 1) for item in lst) - - def _ParseArgs(args): """Parses command line options. @@ -100,17 +93,13 @@ input_opts.add_argument( '--package-id', - help='Custom package ID for resources (instead of 0x7f). Cannot be used ' - 'with --shared-resources.') - - input_opts.add_argument( - '--package-name-to-id-mapping', - help='List containing mapping from package name to package IDs that will ' - 'be assigned.') + type=int, + help='Decimal integer representing custom package ID for resources ' + '(instead of 127==0x7f). Cannot be used with --shared-resources.') input_opts.add_argument( '--package-name', - help='Package name that will be used to determine package ID.') + help='Package name that will be used to create R class.') input_opts.add_argument( '--rename-manifest-package', help='Package name to force AAPT to use.') @@ -266,11 +255,8 @@ parser.error( '--resources-path-map-out-path requires --short-resource-paths') - if options.package_name_to_id_mapping: - package_names_list = build_utils.ParseGnList( - options.package_name_to_id_mapping) - options.package_name_to_id_mapping = _ListToDictionary( - package_names_list, '=') + if options.package_id and options.shared_resources: + parser.error('--package-id and --shared-resources are mutually exclusive') return options @@ -423,19 +409,6 @@ return renamed_paths -def _PackageIdFromOptions(options): - package_id = None - if options.package_id: - package_id = options.package_id - if options.package_name: - package_id = options.package_name_to_id_mapping.get(options.package_name) - if package_id is None: - raise Exception( - 'Package name %s is not present in package_name_to_id_mapping.' % - options.package_name) - return package_id - - def _FixManifest(options, temp_dir): """Fix the APK's AndroidManifest.xml. @@ -751,9 +724,12 @@ if options.no_xml_namespaces: link_command.append('--no-xml-namespaces') - package_id = _PackageIdFromOptions(options) - if package_id is not None: - link_command += ['--package-id', package_id, '--allow-reserved-package-id'] + if options.package_id: + link_command += [ + '--package-id', + hex(options.package_id), + '--allow-reserved-package-id', + ] fixed_manifest, desired_manifest_package_name = _FixManifest( options, build.temp_dir) @@ -962,10 +938,12 @@ build_utils.ZipDir(build.srcjar_path, build.srcjar_dir) # Sanity check that the created resources have the expected package ID. - expected_id = _PackageIdFromOptions(options) - if expected_id is None: - expected_id = '0x00' if options.shared_resources else '0x7f' - expected_id = int(expected_id, 16) + if options.package_id: + expected_id = options.package_id + elif options.shared_resources: + expected_id = 0 + else: + expected_id = 127 # == '0x7f'. _, package_id = resource_utils.ExtractArscPackage( options.aapt2_path, build.arsc_path if options.arsc_path else build.proto_path)
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 68f765b..d294f207 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -2025,16 +2025,10 @@ # post_process_script: (optional) # # package_name: (optional) - # Name of the package for the purpose of assigning package ID. - # - # package_name_to_id_mapping: (optional) - # List containing mapping from package names to package IDs. It will be - # used to determine which package ID to assign if package_name variable - # was passed in. + # Name of the package for the purpose of creating R class. # # package_id: (optional) - # Use a custom package ID in resource IDs (same purpose as - # package_name_to_id_mapping) + # Use a custom package ID in resource IDs. # # arsc_package_name: (optional) # Use this package name in the arsc file rather than the package name @@ -2270,8 +2264,8 @@ } if (defined(invoker.package_name)) { args += [ - "--package-name=${invoker.package_name}", - "--package-name-to-id-mapping=${invoker.package_name_to_id_mapping}", + "--package-name", + invoker.package_name, ] } if (defined(invoker.arsc_package_name)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 57e1dae..deb412f 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2457,8 +2457,8 @@ "manifest_package", "max_sdk_version", "no_xml_namespaces", + "package_id", "package_name", - "package_name_to_id_mapping", "png_to_webp", "r_java_root_package_name", "resource_blacklist_exceptions", @@ -3518,8 +3518,8 @@ "native_lib_version_rule", "negative_main_dex_globs", "no_xml_namespaces", + "package_id", "package_name", - "package_name_to_id_mapping", "png_to_webp", "product_version_resources_dep", "proguard_configs",
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 8f259e6..d302082 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8902165776636496112 \ No newline at end of file +8902133882846761520 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 72796f7..8e158e9 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8902165780797463872 \ No newline at end of file +8902137368905111040 \ No newline at end of file
diff --git a/chrome/README.md b/chrome/README.md index 3d90be4..936f4277 100644 --- a/chrome/README.md +++ b/chrome/README.md
@@ -11,5 +11,6 @@ - Chrome mobile browser for Android - Chrome OS system UI -See //ios for the Chrome mobile browser for iOS, and note that code that is -shared between //chrome and //ios is typically factored out into //components. +See //ios/chrome for the Chrome mobile browser for iOS, and note that code that +is shared between //chrome and //ios/chrome is typically factored out into +//components.
diff --git a/chrome/VERSION b/chrome/VERSION index 18016e9..4b545af 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=79 MINOR=0 -BUILD=3915 +BUILD=3916 PATCH=0
diff --git a/chrome/android/chrome_bundle_tmpl.gni b/chrome/android/chrome_bundle_tmpl.gni index 42a659f..763239b1 100644 --- a/chrome/android/chrome_bundle_tmpl.gni +++ b/chrome/android/chrome_bundle_tmpl.gni
@@ -16,8 +16,10 @@ # a module descriptor. template("chrome_bundle") { _bundle_target_name = target_name + _package_id = 126 # == 0x7e. _extra_modules = [] foreach(_module_desc, invoker.module_descs) { + assert(_package_id > 2, "Too many modules, ran out of package IDs!") chrome_feature_module( "${_bundle_target_name}__${_module_desc.name}_bundle_module") { forward_variables_from(invoker, @@ -34,10 +36,15 @@ version_name = chrome_version_name uncompress_shared_libraries = invoker.is_monochrome_or_trichrome || chromium_linker_supported + + # Each module needs a unique resource package ID so that we don't have ID + # collisions between feature modules. + package_id = _package_id } _module_desc.module_target = ":${_bundle_target_name}__${_module_desc.name}_bundle_module" _extra_modules += [ _module_desc ] + _package_id -= 1 } android_app_bundle(target_name) {
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 2b28ccf..7488ffc 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -66,6 +66,11 @@ "java/src/org/chromium/chrome/browser/WindowDelegate.java", "java/src/org/chromium/chrome/browser/ZoomController.java", "java/src/org/chromium/chrome/browser/accessibility/FontSizePrefs.java", + "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelAdapter.java", + "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java", + "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListView.java", + "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java", + "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout.java", "java/src/org/chromium/chrome/browser/appmenu/AppMenu.java", "java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java", "java/src/org/chromium/chrome/browser/appmenu/AppMenuBlocker.java", @@ -687,6 +692,12 @@ "java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java", "java/src/org/chromium/chrome/browser/findinpage/FindMatchRectsDetails.java", "java/src/org/chromium/chrome/browser/findinpage/FindNotificationDetails.java", + "java/src/org/chromium/chrome/browser/findinpage/FindResultBar.java", + "java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java", + "java/src/org/chromium/chrome/browser/findinpage/FindToolbarManager.java", + "java/src/org/chromium/chrome/browser/findinpage/FindToolbarObserver.java", + "java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java", + "java/src/org/chromium/chrome/browser/findinpage/FindToolbarTablet.java", "java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyFirstRunFragment.java", "java/src/org/chromium/chrome/browser/firstrun/DefaultSearchEngineFirstRunFragment.java", "java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java", @@ -936,6 +947,7 @@ "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/WebContentsDarkModeController.java", "java/src/org/chromium/chrome/browser/notifications/ActionInfo.java", "java/src/org/chromium/chrome/browser/notifications/ChromeNotification.java", "java/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilder.java", @@ -1620,15 +1632,16 @@ "java/src/org/chromium/chrome/browser/tasks/TaskRecognizer.java", "java/src/org/chromium/chrome/browser/tasks/TasksUma.java", "java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java", + "java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java", "java/src/org/chromium/chrome/browser/toolbar/HomeButton.java", "java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java", "java/src/org/chromium/chrome/browser/toolbar/IncognitoStateProvider.java", "java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java", "java/src/org/chromium/chrome/browser/toolbar/KeyboardNavigationListener.java", "java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java", - "java/src/org/chromium/chrome/browser/toolbar/ToolbarCommonPropertiesModel.java", "java/src/org/chromium/chrome/browser/toolbar/MenuButton.java", "java/src/org/chromium/chrome/browser/toolbar/NewTabButton.java", + "java/src/org/chromium/chrome/browser/toolbar/ProgressAnimationSmooth.java", "java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java", "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java", "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonProperties.java", @@ -1636,8 +1649,11 @@ "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonViewBinder.java", "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java", + "java/src/org/chromium/chrome/browser/toolbar/ToolbarCommonPropertiesModel.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java", + "java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java", + "java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarTabController.java", "java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator.java", "java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java", @@ -1700,6 +1716,10 @@ "java/src/org/chromium/chrome/browser/ui/ImmersiveModeManager.java", "java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java", "java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java", + "java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewTablet.java", + "java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java", + "java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java", + "java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java", "java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java", "java/src/org/chromium/chrome/browser/util/ChromeContextUtil.java", "java/src/org/chromium/chrome/browser/util/ChromeIntentUtil.java", @@ -1789,14 +1809,11 @@ "java/src/org/chromium/chrome/browser/widget/ChromeTextInputLayout.java", "java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java", "java/src/org/chromium/chrome/browser/widget/ContextMenuDialog.java", - "java/src/org/chromium/chrome/browser/widget/ControlContainer.java", "java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java", "java/src/org/chromium/chrome/browser/widget/FeatureHighlightProvider.java", "java/src/org/chromium/chrome/browser/widget/MaterialProgressBar.java", "java/src/org/chromium/chrome/browser/widget/NumberRollView.java", - "java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java", "java/src/org/chromium/chrome/browser/widget/PaddedFrameLayout.java", - "java/src/org/chromium/chrome/browser/widget/ProgressAnimationSmooth.java", "java/src/org/chromium/chrome/browser/widget/PromoDialog.java", "java/src/org/chromium/chrome/browser/widget/PromoDialogLayout.java", "java/src/org/chromium/chrome/browser/widget/PulseDrawable.java", @@ -1812,14 +1829,8 @@ "java/src/org/chromium/chrome/browser/widget/ThumbnailProviderImpl.java", "java/src/org/chromium/chrome/browser/widget/ThumbnailStorageDelegate.java", "java/src/org/chromium/chrome/browser/widget/TintedDrawable.java", - "java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java", - "java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java", "java/src/org/chromium/chrome/browser/widget/ViewHighlighter.java", "java/src/org/chromium/chrome/browser/widget/ViewResourceFrameLayout.java", - "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java", - "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java", - "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListView.java", - "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java", "java/src/org/chromium/chrome/browser/widget/animation/AnimatorProperties.java", "java/src/org/chromium/chrome/browser/widget/animation/CancelAwareAnimatorListener.java", "java/src/org/chromium/chrome/browser/widget/animation/FocusAnimator.java", @@ -1837,16 +1848,6 @@ "java/src/org/chromium/chrome/browser/widget/displaystyle/ViewResizer.java", "java/src/org/chromium/chrome/browser/widget/dragreorder/DragReorderableListAdapter.java", "java/src/org/chromium/chrome/browser/widget/dragreorder/DragStateDelegate.java", - "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java", - "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarObserver.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java", - "java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java", - "java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java", - "java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButtonTablet.java", "java/src/org/chromium/chrome/browser/widget/prefeditor/Completable.java", "java/src/org/chromium/chrome/browser/widget/prefeditor/DropdownFieldAdapter.java", "java/src/org/chromium/chrome/browser/widget/prefeditor/EditableOption.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index b782775..7babe26 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -48,6 +48,7 @@ "javatests/src/org/chromium/chrome/browser/ViewHighlighterTestUtils.java", "javatests/src/org/chromium/chrome/browser/WarmupManagerTest.java", "javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java", + "javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java", "javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java", "javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java", "javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java", @@ -173,6 +174,7 @@ "javatests/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java", "javatests/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTestRule.java", "javatests/src/org/chromium/chrome/browser/feedback/ConnectivityTaskTest.java", + "javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java", "javatests/src/org/chromium/chrome/browser/firstrun/FirstRunActivityTestObserver.java", "javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java", @@ -488,6 +490,8 @@ "javatests/src/org/chromium/chrome/browser/test/CommandLineInitRule.java", "javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java", "javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java", + "javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java", + "javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuTest.java", @@ -524,20 +528,16 @@ "javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java", "javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java", "javatests/src/org/chromium/chrome/browser/widget/ChromeTextInputLayoutRenderTest.java", - "javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java", "javatests/src/org/chromium/chrome/browser/widget/PromoDialogTest.java", "javatests/src/org/chromium/chrome/browser/widget/RadioButtonLayoutTest.java", "javatests/src/org/chromium/chrome/browser/widget/RoundedIconGeneratorTest.java", "javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java", "javatests/src/org/chromium/chrome/browser/widget/ThumbnailDiskStorageTest.java", "javatests/src/org/chromium/chrome/browser/widget/ThumbnailProviderImplTest.java", - "javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarIntegrationTest.java", - "javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarTest.java", "javatests/src/org/chromium/chrome/browser/widget/ViewHighlighterTest.java", "javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java", "javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetObserverTest.java", "javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java", - "javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java", "javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java", "javatests/src/org/chromium/chrome/test/ui/DisableAnimationsTestRule.java", "javatests/src/org/chromium/chrome/test/ui/DisableNativeTestRule.java",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb index 0831eaf..33166e46 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="bn"> <translation id="1566281227936819866">সেভ করা পেমেন্টের পদ্ধতি দেখানো হচ্ছে</translation> +<translation id="2354494097381247142">কীবোর্ড অ্যাক্সেসরিতে সাজেশন পূরণ করার সুবিধা পাওয়া যাবে</translation> <translation id="2610239185026711824">পাসওয়ার্ড সাজেস্ট করুন</translation> <translation id="2803478378562657435">সেভ করা পাসওয়ার্ড এবং পাসওয়ার্ড বিকল্পগুলি দেখানো হচ্ছে</translation> <translation id="2903493209154104877">ঠিকানা</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb index 7f94e45..63e799da 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="gu"> <translation id="1566281227936819866">સાચવેલી ચુકવણી પદ્ધતિઓ બતાવી રહ્યાં છીએ</translation> +<translation id="2354494097381247142">કીબોર્ડ ઍક્સેસરીમાં સૂચનો ભરવાની સુવિધા ઉપલબ્ધ છે</translation> <translation id="2610239185026711824">પાસવર્ડ સૂચવો</translation> <translation id="2803478378562657435">સાચવેલા પાસવર્ડ અને પાસવર્ડ માટેના વિકલ્પો બતાવી રહ્યા છીએ</translation> <translation id="2903493209154104877">સરનામાંઓ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb index cf6da73..2d0fe01 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="id"> <translation id="1566281227936819866">Menampilkan metode pembayaran yang tersimpan</translation> +<translation id="2354494097381247142">Saran pengisian tersedia di aksesori keyboard</translation> <translation id="2610239185026711824">Sarankan sandi</translation> <translation id="2803478378562657435">Menampilkan opsi sandi dan sandi yang disimpan</translation> <translation id="2903493209154104877">Alamat</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb index 155ca9f..b43c8fb 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ml"> <translation id="1566281227936819866">സംരക്ഷിച്ച പേയ്മെന്റ് രീതികൾ കാണിക്കുന്നു</translation> +<translation id="2354494097381247142">പൂരിപ്പിക്കൽ നിർദ്ദേശങ്ങൾ കീബോർഡ് ആക്സസറിയിൽ ലഭ്യമാണ്</translation> <translation id="2610239185026711824">പാസ്വേഡ് നിർദ്ദേശിക്കുക</translation> <translation id="2803478378562657435">സംരക്ഷിച്ച പാസ്വേഡുകളും പാസ്വേഡ് ഓപ്ഷനുകളും കാണിക്കുന്നു</translation> <translation id="2903493209154104877">വിലാസങ്ങള്</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb index c75042e9..619892ad 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="no"> <translation id="1566281227936819866">Viser lagrede betalingsmåter</translation> +<translation id="2354494097381247142">Utfyllingsforslag er tilgjengelige i tastaturtilbehøret</translation> <translation id="2610239185026711824">Foreslå passord</translation> <translation id="2803478378562657435">Viser lagrede passord og passordalternativer</translation> <translation id="2903493209154104877">Adresser</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb index 0904a1d..5caacaf8 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sv"> <translation id="1566281227936819866">Sparade betalningsmetoder visas</translation> +<translation id="2354494097381247142">Fyller i förslag i tangentbordstillbehör</translation> <translation id="2610239185026711824">Föreslå lösenord</translation> <translation id="2803478378562657435">Sparade lösenord och lösenordsalternativ visas</translation> <translation id="2903493209154104877">Adresser</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb index 68ee00e..372517c 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sw"> <translation id="1566281227936819866">Inaonyesha njia za kulipa ulizohifadhi</translation> +<translation id="2354494097381247142">Mapendekezo ya kujaza yanapatikana katika kifuasi cha kibodi</translation> <translation id="2610239185026711824">Pendekeza nenosiri</translation> <translation id="2803478378562657435">Inaonyesha manenosiri yaliyohifadhiwa na chaguo za manenosiri</translation> <translation id="2903493209154104877">Anwani</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb index e6d0c24..5eca6077 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="tr"> <translation id="1566281227936819866">Kayıtlı ödeme yöntemleri</translation> +<translation id="2354494097381247142">Doldurma önerileri klavye aksesuarında kullanılabilir</translation> <translation id="2610239185026711824">Şifre öner</translation> <translation id="2803478378562657435">Kayıtlı şifreler ve şifre seçenekleri gösteriliyor</translation> <translation id="2903493209154104877">Adresler</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb index 7c8a5a2..4f7be0e 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="vi"> <translation id="1566281227936819866">Đang hiển thị các phương thức thanh toán đã lưu</translation> +<translation id="2354494097381247142">Tính năng đề xuất điền có trong phụ kiện bàn phím</translation> <translation id="2610239185026711824">Đề xuất mật khẩu</translation> <translation id="2803478378562657435">Đang hiển thị mật khẩu đã lưu và các tùy chọn mật khẩu</translation> <translation id="2903493209154104877">Địa chỉ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb index 7aa4300..37fa1e6 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> <translation id="1566281227936819866">显示的是已保存的付款方式</translation> +<translation id="2354494097381247142">以键盘配件视图的形式显示的填充建议</translation> <translation id="2610239185026711824">建议一个密码</translation> <translation id="2803478378562657435">正在显示已保存的密码和密码选项</translation> <translation id="2903493209154104877">地址</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb index d1581c1..1ccade9e 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> <translation id="1566281227936819866">正在顯示已儲存的付款方式</translation> +<translation id="2354494097381247142">可搭配鍵盤配件使用的填寫建議</translation> <translation id="2610239185026711824">建議密碼</translation> <translation id="2803478378562657435">正在顯示已儲存的密碼和密碼選項</translation> <translation id="2903493209154104877">地址</translation>
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index 62b06094..fdb830d 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -99,29 +99,19 @@ createAndSetStartSurface(); } - StartSurfaceMediator.OverlayVisibilityHandler overlayVisibilityHandler = - new StartSurfaceMediator.OverlayVisibilityHandler() { - @Override - // TODO(crbug.com/982018): Consider moving this to LayoutManager. - public void setContentOverlayVisibility(boolean isVisible) { - if (mActivity.getTabModelSelector().getCurrentTab() == null) return; - mActivity.getCompositorViewHolder().setContentOverlayVisibility( - isVisible, true); - } - }; TabSwitcher.Controller controller = mTabSwitcher != null ? mTabSwitcher.getController() : mTasksSurface.getController(); mStartSurfaceMediator = new StartSurfaceMediator(controller, - mActivity.getTabModelSelector(), overlayVisibilityHandler, mPropertyModel, + mActivity.getTabModelSelector(), mPropertyModel, mExploreSurfaceCoordinator == null ? null : mExploreSurfaceCoordinator.getFeedSurfaceCreator(), mSurfaceMode == SurfaceMode.SINGLE_PANE ? this::initializeSecondaryTasksSurface : null, - mSurfaceMode == SurfaceMode.SINGLE_PANE); + mSurfaceMode); // TODO(crbug.com/982018): Consider merging mSecondaryTasksSurfacePropertyModel with - // mPropertyModel, so mStartSurfaceMediator can set MORE_TABS_CLICK_LISTENER by itself. + // mPropertyModel, so mStartSurfaceMediator can set MORE_TABS_CLICK_LISTENER by itself. if (mSurfaceMode == SurfaceMode.SINGLE_PANE) { mSecondaryTasksSurfacePropertyModel.set( MORE_TABS_CLICK_LISTENER, mStartSurfaceMediator); @@ -162,6 +152,13 @@ return mTabSwitcher.getTabListDelegate(); } + @Override + public void destroy() { + if (mTasksSurface != null) { + mTasksSurface.destroy(); + } + } + private @SurfaceMode int computeSurfaceMode() { String feature = ChromeFeatureList.getFieldTrialParamByFeature( ChromeFeatureList.START_SURFACE_ANDROID, "start_surface_variation"); @@ -174,7 +171,8 @@ if (feature.equals("single")) return SurfaceMode.SINGLE_PANE; - // TODO(crbug.com/982018): Add the task only surface variation. + if (feature.equals("tasksonly")) return SurfaceMode.TASKS_ONLY; + return SurfaceMode.NO_START_SURFACE; } @@ -186,11 +184,6 @@ mActivity.getCompositorViewHolder().addView(mTasksSurface.getContainerView()); } - // There is nothing else to do for SurfaceMode.TASKS_ONLY for now. - if (mSurfaceMode != SurfaceMode.TWO_PANES && mSurfaceMode != SurfaceMode.SINGLE_PANE) { - return; - } - mPropertyModel = new PropertyModel(StartSurfaceProperties.ALL_KEYS); if (mSurfaceMode == SurfaceMode.TWO_PANES) { @@ -198,6 +191,10 @@ mActivity, mActivity.getCompositorViewHolder(), mPropertyModel); } + if (mSurfaceMode == SurfaceMode.TASKS_ONLY) { + return; + } + int toolbarHeight = mActivity.getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow); int topControlsHeight =
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java index f5ff909..ab8cfd53 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -147,6 +147,10 @@ if (mController != null) { mController.removeOverviewModeObserver(this); } + + if (mStartSurface != null) { + mStartSurface.destroy(); + } } @Override @@ -190,7 +194,7 @@ public void startHiding(int nextId, boolean hintAtTabSelection) { super.startHiding(nextId, hintAtTabSelection); - int sourceTabId = mNextTabId; + int sourceTabId = nextId; if (sourceTabId == Tab.INVALID_TAB_ID) sourceTabId = mTabModelSelector.getCurrentTabId(); LayoutTab sourceLayoutTab = createLayoutTab( sourceTabId, mTabModelSelector.isIncognitoSelected(), NO_CLOSE_BUTTON, NO_TITLE);
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 269a402..a21c981 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -11,6 +11,7 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_BOTTOM_BAR_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_EXPLORE_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; +import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_BAR_HEIGHT; import android.view.View; @@ -30,15 +31,6 @@ /** The mediator implements the logic to interact with the surfaces and caller. */ class StartSurfaceMediator implements StartSurface.Controller, TabSwitcher.OverviewModeObserver, View.OnClickListener { - /** Interface to control overlay visibility. */ - interface OverlayVisibilityHandler { - /** - * Set the content overlay visibility. - * @param isVisible Whether the content overlay should be visible. - */ - void setContentOverlayVisibility(boolean isVisible); - } - /** Interface to initialize a secondary tasks surface for more tabs. */ interface SecondaryTasksSurfaceInitializer { /** @@ -51,7 +43,6 @@ private final ObserverList<StartSurface.OverviewModeObserver> mObservers = new ObserverList<>(); private final TabSwitcher.Controller mController; - private final OverlayVisibilityHandler mOverlayVisibilityHandler; @Nullable private final PropertyModel mPropertyModel; @Nullable @@ -64,17 +55,15 @@ private boolean mIsIncognito; StartSurfaceMediator(TabSwitcher.Controller controller, TabModelSelector tabModelSelector, - OverlayVisibilityHandler overlayVisibilityHandler, @Nullable PropertyModel propertyModel, @Nullable ExploreSurfaceCoordinator.FeedSurfaceCreator feedSurfaceCreator, @Nullable SecondaryTasksSurfaceInitializer secondaryTasksSurfaceInitializer, - boolean onlyShowExploreSurface) { + @StartSurfaceCoordinator.SurfaceMode int mode) { mController = controller; - mOverlayVisibilityHandler = overlayVisibilityHandler; mPropertyModel = propertyModel; mFeedSurfaceCreator = feedSurfaceCreator; mSecondaryTasksSurfaceInitializer = secondaryTasksSurfaceInitializer; - mOnlyShowExploreSurface = onlyShowExploreSurface; + mOnlyShowExploreSurface = mode == StartSurfaceCoordinator.SurfaceMode.SINGLE_PANE; if (mPropertyModel != null) { mPropertyModel.set( @@ -110,10 +99,11 @@ // Show explore surface if not in incognito and either in SINGLE PANES mode // or in TWO PANES mode with last visible pane explore. boolean shouldShowExploreSurface = - (onlyShowExploreSurface || ReturnToStartSurfaceUtil.shouldShowExploreSurface()) + (mOnlyShowExploreSurface || ReturnToStartSurfaceUtil.shouldShowExploreSurface()) && !mIsIncognito; setExploreSurfaceVisibility(shouldShowExploreSurface); - if (!onlyShowExploreSurface) { + if (mode != StartSurfaceCoordinator.SurfaceMode.SINGLE_PANE + && mode != StartSurfaceCoordinator.SurfaceMode.TASKS_ONLY) { mPropertyModel.set(BOTTOM_BAR_HEIGHT, ContextUtils.getApplicationContext().getResources().getDimensionPixelSize( R.dimen.ss_bottom_bar_height)); @@ -123,6 +113,13 @@ mController.setBottomControlsHeight( mIsIncognito ? 0 : mPropertyModel.get(BOTTOM_BAR_HEIGHT)); } + + if (mode == StartSurfaceCoordinator.SurfaceMode.TWO_PANES) { + int toolbarHeight = + ContextUtils.getApplicationContext().getResources().getDimensionPixelSize( + R.dimen.toolbar_height_no_shadow); + mPropertyModel.set(TOP_BAR_HEIGHT, toolbarHeight * 2); + } } mController.addOverviewModeObserver(this); } @@ -224,12 +221,10 @@ for (StartSurface.OverviewModeObserver observer : mObservers) { observer.finishedShowing(); } - mOverlayVisibilityHandler.setContentOverlayVisibility(false); } @Override public void startedHiding() { - mOverlayVisibilityHandler.setContentOverlayVisibility(true); if (mPropertyModel != null) { mPropertyModel.set(IS_SHOWING_OVERVIEW, false); destroyFeedSurfaceCoordinator();
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java index 9f7d521..ad31c61 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java +++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -92,4 +92,9 @@ * @return TabListDelegate implementation that can be used to access the Tab List. */ TabSwitcher.TabListDelegate getTabListDelegate(); + + /** + * Perform any necessary cleanup. + */ + void destroy(); } \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index a8f6146..ed90a64a 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -77,6 +77,8 @@ android_library("java") { java_files = [ + "java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java", + "java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java", "java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/TasksView.java", "java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java", @@ -86,6 +88,9 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridView.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphItemCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphItemMediator.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml index 66b8ff1..dab25141 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
@@ -10,6 +10,17 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> + <HorizontalScrollView android:id="@+id/mv_tiles_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/modern_primary_color" + android:visibility="gone" + android:scrollbars="none"> + <LinearLayout android:id="@+id/mv_tiles_layout" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:orientation="horizontal" /> + </HorizontalScrollView> <LinearLayout android:id="@+id/tab_switcher_title" android:layout_width="match_parent" @@ -40,5 +51,5 @@ <FrameLayout android:id="@+id/tab_switcher_container" android:layout_width="match_parent" - android:layout_height="match_parent"/> + android:layout_height="match_parent" /> </org.chromium.chrome.browser.tasks.TasksView> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java new file mode 100644 index 0000000..76fb603 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
@@ -0,0 +1,206 @@ +// 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. + +package org.chromium.chrome.browser.tasks; + +import android.view.ContextMenu; +import android.view.View; +import android.view.ViewGroup; + +import org.chromium.base.DiscardableReferencePool; +import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.GlobalDiscardableReferencePool; +import org.chromium.chrome.browser.favicon.LargeIconBridge; +import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; +import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.snackbar.SnackbarManager; +import org.chromium.chrome.browser.suggestions.DestructionObserver; +import org.chromium.chrome.browser.suggestions.ImageFetcher; +import org.chromium.chrome.browser.suggestions.SuggestionsConfig; +import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory; +import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter; +import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate; +import org.chromium.chrome.browser.suggestions.SuggestionsRanker; +import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate; +import org.chromium.chrome.browser.suggestions.tile.SuggestionsTileView; +import org.chromium.chrome.browser.suggestions.tile.Tile; +import org.chromium.chrome.browser.suggestions.tile.TileGroup; +import org.chromium.chrome.browser.suggestions.tile.TileGroup.TileInteractionDelegate; +import org.chromium.chrome.browser.suggestions.tile.TileGroupDelegateImpl; +import org.chromium.chrome.browser.suggestions.tile.TileRenderer; +import org.chromium.chrome.browser.suggestions.tile.TileSectionType; +import org.chromium.ui.base.PageTransition; + +/** + * Coordinator for displaying a list of {@link SuggestionsTileView} in a {@link ViewGroup}. + * + * TODO(mattsimmons): Finish MVC of this. The way the renderer builds the layout complicates things. + */ +class MostVisitedListCoordinator + implements SuggestionsUiDelegate, TileGroup.Observer, TileGroup.TileSetupDelegate { + private static final int TITLE_LINES = 1; + + // There's a limit of 12 in {@link MostVisitedSitesBridge#setObserver}. + private static final int MAX_RESULTS = 12; + private SuggestionsSource mSuggestionsSource; + private SuggestionsRanker mSuggestionsRanker; + private SuggestionsEventReporter mEventReporter; + private SnackbarManager mSnackbarManager; + private TileGroup mTileGroup; + private ImageFetcher mImageFetcher; + private DiscardableReferencePool mReferencePool; + private TileRenderer mRenderer; + private ViewGroup mParent; + + public MostVisitedListCoordinator(ChromeActivity activity, ViewGroup parent) { + mParent = parent; + Profile profile = Profile.getLastUsedProfile(); + mSuggestionsSource = + SuggestionsDependencyFactory.getInstance().createSuggestionSource(profile); + mSuggestionsRanker = new SuggestionsRanker(); + mEventReporter = SuggestionsDependencyFactory.getInstance().createEventReporter(); + + mReferencePool = GlobalDiscardableReferencePool.getReferencePool(); + mImageFetcher = new ImageFetcher(mSuggestionsSource, profile, mReferencePool); + mSnackbarManager = activity.getSnackbarManager(); + + mRenderer = new TileRenderer( + activity, SuggestionsConfig.TileStyle.MODERN, TITLE_LINES, mImageFetcher); + + OfflinePageBridge offlinePageBridge = + SuggestionsDependencyFactory.getInstance().getOfflinePageBridge(profile); + + TileGroupDelegateImpl tileGroupDelegate = + new TileGroupDelegateImpl(activity, profile, null, mSnackbarManager); + mTileGroup = + new TileGroup(mRenderer, this, null, tileGroupDelegate, this, offlinePageBridge); + mTileGroup.startObserving(MAX_RESULTS); + } + + private void updateTileIcon(Tile tile) { + for (int i = 0; i < mParent.getChildCount(); i++) { + View tileView = mParent.getChildAt(i); + + assert tileView instanceof SuggestionsTileView : "Tiles must be SuggestionsTileView"; + + SuggestionsTileView suggestionsTileView = (SuggestionsTileView) tileView; + + if (!suggestionsTileView.getUrl().equals(tile.getUrl())) continue; + + ((SuggestionsTileView) mParent.getChildAt(i)).renderIcon(tile); + } + } + + /** SuggestionsUiDelegate Implementation. */ + @Override + public SuggestionsSource getSuggestionsSource() { + return mSuggestionsSource; + } + + @Override + public SuggestionsRanker getSuggestionsRanker() { + return mSuggestionsRanker; + } + + @Override + public SuggestionsEventReporter getEventReporter() { + return mEventReporter; + } + + @Override + public SuggestionsNavigationDelegate getNavigationDelegate() { + return null; + } + + @Override + public ImageFetcher getImageFetcher() { + return mImageFetcher; + } + + @Override + public SnackbarManager getSnackbarManager() { + return mSnackbarManager; + } + + @Override + public DiscardableReferencePool getReferencePool() { + return mReferencePool; + } + + @Override + public void addDestructionObserver(DestructionObserver destructionObserver) {} + + @Override + public boolean isVisible() { + return false; + } + + /** TileGroup.Observer implementation. */ + + @Override + public void onTileDataChanged() { + if (mTileGroup.getTileSections().size() < 1) return; + + mRenderer.renderTileSection( + mTileGroup.getTileSections().get(TileSectionType.PERSONALIZED), mParent, this); + } + + @Override + public void onTileCountChanged() {} + + @Override + public void onTileIconChanged(Tile tile) {} + + @Override + public void onTileOfflineBadgeVisibilityChanged(Tile tile) {} + + /** TileSetupDelegate implementation. */ + @Override + public TileInteractionDelegate createInteractionDelegate(Tile tile) { + return new MostVisitedTileInteractionDelegate(tile); + } + + @Override + public LargeIconBridge.LargeIconCallback createIconLoadCallback(Tile tile) { + LargeIconBridge.LargeIconCallback callback = + (icon, fallbackColor, isFallbackColorDefault, iconType) -> { + if (tile != null) { // Do nothing if the tile was removed. + tile.setIconType(iconType); + if (icon == null) { + mRenderer.setTileIconFromColor(tile, fallbackColor, isFallbackColorDefault); + } else { + mRenderer.setTileIconFromBitmap(tile, icon); + } + + updateTileIcon(tile); + } + }; + + return callback; + } + + private class MostVisitedTileInteractionDelegate implements TileInteractionDelegate { + private Tile mTile; + + public MostVisitedTileInteractionDelegate(Tile tile) { + mTile = tile; + } + + @Override + public void setOnClickRunnable(Runnable clickRunnable) {} + + @Override + public void onClick(View v) { + ReturnToChromeExperimentsUtil.willHandleLoadUrlFromLocationBar( + mTile.getUrl(), PageTransition.AUTO_BOOKMARK); + } + + @Override + public void onCreateContextMenu( + ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + // TODO(mattsimmons): Handle this, likely not a blocker for MVP. + } + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java index 4bbf97b2..80b614dd 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java
@@ -36,4 +36,9 @@ * @return The surface's container {@link ViewGroup}. */ ViewGroup getContainerView(); + + /** + * Perform any necessary cleanup. + */ + void destroy(); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java index be0e4a8b..9805cab 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java
@@ -4,10 +4,9 @@ package org.chromium.chrome.browser.tasks; -import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL; - import android.view.LayoutInflater; import android.view.ViewGroup; +import android.widget.LinearLayout; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider; @@ -24,6 +23,8 @@ private final TabSwitcher mTabSwitcher; private final TasksView mView; private final PropertyModelChangeProcessor mPropertyModelChangeProcessor; + private final MostVisitedListCoordinator mMostVisitedList; + private final TasksSurfaceMediator mMediator; public TasksSurfaceCoordinator( ChromeActivity activity, boolean isTabCarousel, PropertyModel propertyModel) { @@ -31,15 +32,22 @@ mPropertyModelChangeProcessor = PropertyModelChangeProcessor.create(propertyModel, mView, TasksViewBinder::bind); if (isTabCarousel) { - propertyModel.set(IS_TAB_CAROUSEL, true); mTabSwitcher = TabManagementModuleProvider.getDelegate().createCarouselTabSwitcher( activity, mView.getTabSwitcherContainer()); } else { mTabSwitcher = TabManagementModuleProvider.getDelegate().createGridTabSwitcher( activity, mView.getTabSwitcherContainer()); } + + mMediator = new TasksSurfaceMediator( + activity, propertyModel, isTabCarousel, activity.getOverviewModeBehavior()); + + // TODO(mattsimmons): Handle incognito/dark theming. + LinearLayout mvTilesLayout = mView.findViewById(R.id.mv_tiles_layout); + mMostVisitedList = new MostVisitedListCoordinator(activity, mvTilesLayout); } + /** TasksSurface implementation. */ @Override public void setOnTabSelectingListener(TabSwitcher.OnTabSelectingListener listener) { mTabSwitcher.setOnTabSelectingListener(listener); @@ -59,4 +67,9 @@ public ViewGroup getContainerView() { return mView; } + + @Override + public void destroy() { + mMediator.destroy(); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java new file mode 100644 index 0000000..5d59f794 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
@@ -0,0 +1,67 @@ +// 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. + +package org.chromium.chrome.browser.tasks; + +import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL; +import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; +import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.TOP_PADDING; + +import android.content.Context; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Mediator for handling {@link TasksSurface}-related logic. + */ +class TasksSurfaceMediator implements OverviewModeBehavior.OverviewModeObserver { + private final PropertyModel mModel; + + private OverviewModeBehavior mOverviewModeBehavior; + + TasksSurfaceMediator(Context context, PropertyModel model, boolean isTabCarousel, + OverviewModeBehavior overviewModeBehavior) { + mModel = model; + + mModel.set(IS_TAB_CAROUSEL, isTabCarousel); + + if (!isTabCarousel) { + mModel.set(TOP_PADDING, + context.getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow) + * 2); + } + + // TODO(mattsimmons): Move all of the tasks surface visibility changes here and handle it + // for all surface variations. This is not ideal as-is. + if (ReturnToChromeExperimentsUtil.shouldShowMostVisitedOnTabSwitcher()) { + mOverviewModeBehavior = overviewModeBehavior; + mOverviewModeBehavior.addOverviewModeObserver(this); + } + } + + @Override + public void onOverviewModeStartedShowing(boolean showToolbar) { + mModel.set(MV_TILES_VISIBLE, true); + } + + @Override + public void onOverviewModeFinishedShowing() {} + + @Override + public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) { + mModel.set(MV_TILES_VISIBLE, false); + } + + @Override + public void onOverviewModeFinishedHiding() {} + + void destroy() { + if (mOverviewModeBehavior != null) { + mOverviewModeBehavior.removeOverviewModeObserver(this); + mOverviewModeBehavior = null; + } + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java index 9644e5d..fc9126e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java
@@ -16,6 +16,10 @@ public static final PropertyModel .WritableObjectPropertyKey<View.OnClickListener> MORE_TABS_CLICK_LISTENER = new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>(); - public static final PropertyKey[] ALL_KEYS = - new PropertyKey[] {IS_TAB_CAROUSEL, MORE_TABS_CLICK_LISTENER}; + public static final PropertyModel.WritableBooleanPropertyKey MV_TILES_VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); + public static final PropertyModel.WritableIntPropertyKey TOP_PADDING = + new PropertyModel.WritableIntPropertyKey(); + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] { + IS_TAB_CAROUSEL, MORE_TABS_CLICK_LISTENER, MV_TILES_VISIBLE, TOP_PADDING}; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java index 3230e9848..bfe6ae26 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
@@ -38,6 +38,10 @@ return mTabSwitcherContainer; } + /** + * Sets whether the tasks view should behave in Carousel mode. + * @param isTabCarousel whether the tab switcher is in .CAROUSEL mode + */ void setIsTabCarousel(boolean isTabCarousel) { if (isTabCarousel) { // TODO(crbug.com/982018): Change view according to incognito and dark mode. @@ -55,7 +59,17 @@ } } - void setMoreTabsOnClicklistener(@Nullable View.OnClickListener listener) { + /** + * Set the visibility of the Most Visited Tiles. + */ + void setMostVisitedVisibility(int visibility) { + findViewById(R.id.mv_tiles_container).setVisibility(visibility); + } + + /** + * Set the {@link android.view.View.OnClickListener} for More Tabs. + */ + void setMoreTabsOnClickListener(@Nullable View.OnClickListener listener) { findViewById(R.id.more_tabs).setOnClickListener(listener); } } \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java index 93f2e56..5316c49a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java
@@ -6,6 +6,10 @@ import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL; import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER; +import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; +import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.TOP_PADDING; + +import android.view.View; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -16,7 +20,12 @@ if (propertyKey == IS_TAB_CAROUSEL) { view.setIsTabCarousel(model.get(IS_TAB_CAROUSEL)); } else if (propertyKey == MORE_TABS_CLICK_LISTENER) { - view.setMoreTabsOnClicklistener(model.get(MORE_TABS_CLICK_LISTENER)); + view.setMoreTabsOnClickListener(model.get(MORE_TABS_CLICK_LISTENER)); + } else if (propertyKey == MV_TILES_VISIBLE) { + // TODO(mattsimmons): Hide these when in incognito mode. + view.setMostVisitedVisibility(model.get(MV_TILES_VISIBLE) ? View.VISIBLE : View.GONE); + } else if (propertyKey == TOP_PADDING) { + view.setPadding(0, model.get(TOP_PADDING), 0, 0); } } } \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java index e4f2b0e5..3c93b901 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -313,6 +313,10 @@ }; } + private View.OnClickListener getMenuButtonClickListener() { + return TabGridDialogMenuCoordinator.getTabGridDialogMenuOnClickListener(null); + } + private List<Tab> getRelatedTabs(int tabId) { return mTabModelSelector.getTabModelFilterProvider() .getCurrentTabModelFilter()
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java new file mode 100644 index 0000000..899ef5b --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
@@ -0,0 +1,156 @@ +// 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. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.app.Activity; +import android.content.ComponentCallbacks; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Rect; +import android.support.annotation.IntDef; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ListView; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.Callback; +import org.chromium.base.LifetimeAssert; +import org.chromium.chrome.R; +import org.chromium.ui.modelutil.MVCListAdapter.ListItem; +import org.chromium.ui.modelutil.MVCListAdapter.ModelList; +import org.chromium.ui.modelutil.ModelListAdapter; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.widget.AnchoredPopupWindow; +import org.chromium.ui.widget.ViewRectProvider; + +/** + * A coordinator for the menu in TabGridDialog toolbar. It is responsible for creating a list of + * menu items, setting up the menu and displaying the menu. + */ +public class TabGridDialogMenuCoordinator { + @IntDef({ListItemType.MENU_ITEM}) + public @interface ListItemType { + int MENU_ITEM = 0; + } + + private final Context mContext; + private final ComponentCallbacks mComponentCallbacks; + private final Callback<Integer> mOnItemClickedCallback; + private final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); + private AnchoredPopupWindow mMenuWindow; + + /** + * Creates a {@link View.OnClickListener} that creates the menu and shows it when clicked. + * @param onItemClicked The clicked listener callback that handles clicks on menu items. + * @return A {@link View.OnClickListener} for the button that opens up the menu. + */ + static View.OnClickListener getTabGridDialogMenuOnClickListener( + Callback<Integer> onItemClicked) { + return view -> { + Context context = view.getContext(); + TabGridDialogMenuCoordinator menu = + new TabGridDialogMenuCoordinator(context, view, onItemClicked); + menu.display(); + }; + } + + private TabGridDialogMenuCoordinator( + Context context, View anchorView, Callback<Integer> onItemClicked) { + mContext = context; + mOnItemClickedCallback = onItemClicked; + mComponentCallbacks = new ComponentCallbacks() { + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (mMenuWindow == null || !mMenuWindow.isShowing()) return; + mMenuWindow.dismiss(); + } + + @Override + public void onLowMemory() {} + }; + mContext.registerComponentCallbacks(mComponentCallbacks); + + final View contentView = LayoutInflater.from(context).inflate( + R.layout.tab_switcher_action_menu_layout, null); + setupMenu(contentView, anchorView); + } + + private void setupMenu(View contentView, View anchorView) { + ListView listView = contentView.findViewById(R.id.tab_switcher_action_menu_list); + ModelList modelList = buildMenuItems(mContext); + ModelListAdapter adapter = new ModelListAdapter(modelList) { + @Override + public long getItemId(int position) { + return ((ListItem) getItem(position)) + .model.get(TabGridDialogMenuItemProperties.MENU_ID); + } + }; + listView.setAdapter(adapter); + // clang-format off + adapter.registerType(ListItemType.MENU_ITEM, + () -> LayoutInflater.from(listView.getContext()) + .inflate(R.layout.tab_switcher_action_menu_item, null), + TabGridDialogMenuItemBinder::binder); + // clang-format on + listView.setOnItemClickListener((p, v, pos, id) -> { + mOnItemClickedCallback.onResult((int) id); + mMenuWindow.dismiss(); + }); + + View decorView = ((Activity) mContext).getWindow().getDecorView(); + ViewRectProvider rectProvider = new ViewRectProvider(anchorView); + Rect rect = new Rect(); + decorView.getWindowVisibleDisplayFrame(rect); + int statusBarHeight = rect.top; + // Move the rect down by statusBarHeight because we are positioning the rect within the + // TabGridDialog popup window which doesn't include status bar. However, we are showing it + // in the root decor view which includes the status bar. Thus, adding status bar height as a + // offset. + rectProvider.setInsetPx(0, statusBarHeight, 0, statusBarHeight); + + mMenuWindow = new AnchoredPopupWindow(mContext, decorView, + ApiCompatibilityUtils.getDrawable( + mContext.getResources(), R.drawable.popup_bg_tinted), + contentView, rectProvider); + mMenuWindow.setFocusable(true); + mMenuWindow.setHorizontalOverlapAnchor(true); + mMenuWindow.setVerticalOverlapAnchor(true); + mMenuWindow.setAnimationStyle(R.style.OverflowMenuAnim); + int popupWidth = mContext.getResources().getDimensionPixelSize(R.dimen.menu_width); + mMenuWindow.setMaxWidth(popupWidth); + + // When the menu is dismissed, call destroy to unregister the orientation listener. + mMenuWindow.addOnDismissListener(this::destroy); + } + + private void display() { + if (mMenuWindow == null) return; + + mMenuWindow.show(); + } + + private void destroy() { + mContext.unregisterComponentCallbacks(mComponentCallbacks); + // If mLifetimeAssert is GC'ed before this is called, it will throw an exception + // with a stack trace showing the stack during LifetimeAssert.create(). + LifetimeAssert.setSafeToGc(mLifetimeAssert, true); + } + + private ModelList buildMenuItems(Context context) { + ModelList itemList = new ModelList(); + itemList.add(new ListItem(ListItemType.MENU_ITEM, + buildPropertyModel(context, + org.chromium.chrome.tab_ui.R.string.tab_grid_dialog_remove_from_group, + R.id.ungroup_tab))); + return itemList; + } + + private PropertyModel buildPropertyModel(Context context, int titleId, int menuId) { + return new PropertyModel.Builder(TabGridDialogMenuItemProperties.ALL_KEYS) + .with(TabGridDialogMenuItemProperties.TITLE, context.getString(titleId)) + .with(TabGridDialogMenuItemProperties.MENU_ID, menuId) + .build(); + } +} \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java new file mode 100644 index 0000000..6a2216d --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java
@@ -0,0 +1,24 @@ +// 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. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.view.View; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * ViewBinder for menu item in tab grid dialog menu. + */ +public class TabGridDialogMenuItemBinder { + public static void binder(PropertyModel model, View view, PropertyKey propertyKey) { + if (propertyKey == TabGridDialogMenuItemProperties.TITLE) { + TextView textView = view.findViewById(R.id.menu_item_text); + textView.setText(model.get(TabGridDialogMenuItemProperties.TITLE)); + } + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemProperties.java new file mode 100644 index 0000000..e52e2af --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemProperties.java
@@ -0,0 +1,19 @@ +// 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. + +package org.chromium.chrome.browser.tasks.tab_management; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; + +/** + * List of properties to designate information about a menu item in tab grid dialog menu. + */ +public class TabGridDialogMenuItemProperties { + public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); + public static final WritableIntPropertyKey MENU_ID = new WritableIntPropertyKey(); + + public static final PropertyKey[] ALL_KEYS = {TITLE, MENU_ID}; +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java index c7a2d39..504c649a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java
@@ -57,10 +57,13 @@ new PropertyModel.WritableObjectPropertyKey(true); public static final PropertyModel.WritableBooleanPropertyKey IS_MAIN_CONTENT_VISIBLE = new PropertyModel.WritableBooleanPropertyKey(); + public static final PropertyModel + .WritableObjectPropertyKey<OnClickListener> MENU_CLICK_LISTENER = + new PropertyModel.WritableObjectPropertyKey<>(); public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {COLLAPSE_CLICK_LISTENER, ADD_CLICK_LISTENER, HEADER_TITLE, CONTENT_TOP_MARGIN, PRIMARY_COLOR, TINT, IS_DIALOG_VISIBLE, SCRIMVIEW_OBSERVER, ANIMATION_PARAMS, UNGROUP_BAR_STATUS, DIALOG_BACKGROUND_RESOUCE_ID, DIALOG_UNGROUP_BAR_BACKGROUND_COLOR_ID, DIALOG_UNGROUP_BAR_HOVERED_BACKGROUND_COLOR_ID, DIALOG_UNGROUP_BAR_TEXT_APPEARANCE, - INITIAL_SCROLL_INDEX, IS_MAIN_CONTENT_VISIBLE}; + INITIAL_SCROLL_INDEX, IS_MAIN_CONTENT_VISIBLE, MENU_CLICK_LISTENER}; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java index feb6cecb..a4c3efd7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java
@@ -40,9 +40,7 @@ PropertyModel toolbarPropertyModel, TabGridDialogParent dialog) { mToolbarView = (TabGroupUiToolbarView) LayoutInflater.from(context).inflate( R.layout.bottom_tab_grid_toolbar, contentView, false); - if (dialog != null) { - mToolbarView.setupDialogToolbarLayout(); - } + mToolbarView.setupToolbarLayout(dialog != null); mModelChangeProcessor = PropertyModelChangeProcessor.create(toolbarPropertyModel, new TabGridPanelViewBinder.ViewHolder(mToolbarView, contentView, dialog), TabGridPanelViewBinder::bind);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java index 5c15f87..be62ff0 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java
@@ -16,6 +16,7 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.INITIAL_SCROLL_INDEX; import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.IS_DIALOG_VISIBLE; import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.IS_MAIN_CONTENT_VISIBLE; +import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.MENU_CLICK_LISTENER; import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.PRIMARY_COLOR; import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.SCRIMVIEW_OBSERVER; import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.TINT; @@ -114,6 +115,8 @@ .scrollToPositionWithOffset(index, 0); } else if (IS_MAIN_CONTENT_VISIBLE == propertyKey) { viewHolder.contentView.setVisibility(View.VISIBLE); + } else if (MENU_CLICK_LISTENER == propertyKey) { + viewHolder.toolbarView.setMenuButtonOnClickListener(model.get(MENU_CLICK_LISTENER)); } } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java index a12df5b..2ae5cfd7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
@@ -12,6 +12,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; @@ -25,9 +26,10 @@ public class TabGroupUiToolbarView extends FrameLayout { private ChromeImageView mRightButton; private ChromeImageView mLeftButton; + private ChromeImageView mMenuButton; private ViewGroup mContainerView; private TextView mTitleTextView; - private View mMainContent; + private LinearLayout mMainContent; public TabGroupUiToolbarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -52,13 +54,18 @@ mRightButton.setOnClickListener(listener); } + void setMenuButtonOnClickListener(OnClickListener listener) { + mMenuButton.setOnClickListener(listener); + } + ViewGroup getViewContainer() { return mContainerView; } void setMainContentVisibility(boolean isVisible) { - if (mContainerView == null) + if (mContainerView == null) { throw new IllegalStateException("Current Toolbar doesn't have a container view"); + } for (int i = 0; i < ((ViewGroup) mContainerView).getChildCount(); i++) { View child = ((ViewGroup) mContainerView).getChildAt(i); @@ -67,8 +74,9 @@ } void setTitle(String title) { - if (mTitleTextView == null) + if (mTitleTextView == null) { throw new IllegalStateException("Current Toolbar doesn't have a title text view"); + } mTitleTextView.setText(title); } @@ -84,9 +92,15 @@ } /** - * Setup a TabGridDialog-specific toolbar. It is different from the toolbar for TabGridSheet. + * Setup the toolbar layout base on the component it belongs to. The toolbars for TabGridSheet + * and TabGridDialog are different. */ - void setupDialogToolbarLayout() { + void setupToolbarLayout(boolean isDialog) { + if (!isDialog) { + // We don't support toolbar menu for TabGridSheet. + mMainContent.removeView(mMenuButton); + return; + } Context context = getContext(); mLeftButton.setImageResource(org.chromium.chrome.R.drawable.ic_arrow_back_24dp); int topicMargin =
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerProperties.java index da4617e8..8d3fec1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerProperties.java
@@ -34,13 +34,10 @@ public static final PropertyModel.WritableIntPropertyKey BOTTOM_CONTROLS_HEIGHT = new PropertyModel.WritableIntPropertyKey(); - public static final PropertyModel.WritableIntPropertyKey TOP_PADDING = - new PropertyModel.WritableIntPropertyKey(); - public static final PropertyModel.WritableIntPropertyKey SHADOW_TOP_MARGIN = new PropertyModel.WritableIntPropertyKey(); public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {IS_VISIBLE, IS_INCOGNITO, VISIBILITY_LISTENER, INITIAL_SCROLL_INDEX, ANIMATE_VISIBILITY_CHANGES, - TOP_CONTROLS_HEIGHT, BOTTOM_CONTROLS_HEIGHT, TOP_PADDING, SHADOW_TOP_MARGIN}; + TOP_CONTROLS_HEIGHT, BOTTOM_CONTROLS_HEIGHT, SHADOW_TOP_MARGIN}; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java index 1953007f..92ba9b6e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java
@@ -11,7 +11,6 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.IS_VISIBLE; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.SHADOW_TOP_MARGIN; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.TOP_CONTROLS_HEIGHT; -import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.TOP_PADDING; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.VISIBILITY_LISTENER; import android.support.v7.widget.LinearLayoutManager; @@ -56,9 +55,6 @@ FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); params.bottomMargin = model.get(BOTTOM_CONTROLS_HEIGHT); view.requestLayout(); - } else if (TOP_PADDING == propertyKey) { - view.setPadding(view.getPaddingLeft(), model.get(TOP_PADDING), view.getPaddingRight(), - view.getPaddingBottom()); } else if (SHADOW_TOP_MARGIN == propertyKey) { view.setShadowTopMargin(model.get(SHADOW_TOP_MARGIN)); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index 0d8a013f..33b37345 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -11,7 +11,6 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.IS_VISIBLE; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.SHADOW_TOP_MARGIN; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.TOP_CONTROLS_HEIGHT; -import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.TOP_PADDING; import static org.chromium.chrome.browser.tasks.tab_management.TabListContainerProperties.VISIBILITY_LISTENER; import android.graphics.Bitmap; @@ -238,23 +237,21 @@ .isIncognito()); mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, true); - // Container view takes care of padding and margin in carousel mode. + // Container view takes care of padding and margin in start surface. if (mode != TabListCoordinator.TabListMode.CAROUSEL) { - mContainerViewModel.set(TOP_CONTROLS_HEIGHT, fullscreenManager.getTopControlsHeight()); + int topControlsHeight = ReturnToChromeExperimentsUtil.shouldShowOmniboxOnTabSwitcher() + ? 0 + : fullscreenManager.getTopControlsHeight(); + mContainerViewModel.set(TOP_CONTROLS_HEIGHT, topControlsHeight); mContainerViewModel.set( BOTTOM_CONTROLS_HEIGHT, fullscreenManager.getBottomControlsHeight()); int toolbarHeight = ContextUtils.getApplicationContext().getResources().getDimensionPixelSize( R.dimen.toolbar_height_no_shadow); - int topPadding = ReturnToChromeExperimentsUtil.shouldShowOmniboxOnTabSwitcher() - ? toolbarHeight - : DEFAULT_TOP_PADDING; - mContainerViewModel.set(TOP_PADDING, topPadding); - int shadowTopMargin = ReturnToChromeExperimentsUtil.shouldShowOmniboxOnTabSwitcher() - ? toolbarHeight * 2 - : toolbarHeight; - mContainerViewModel.set(SHADOW_TOP_MARGIN, shadowTopMargin); + mContainerViewModel.set(SHADOW_TOP_MARGIN, + ReturnToChromeExperimentsUtil.shouldShowOmniboxOnTabSwitcher() ? 0 + : toolbarHeight); } mContainerView = containerView; @@ -565,8 +562,9 @@ @Nullable TabListMediator.TabActionListener getCreateGroupButtonOnClickListener(Tab tab) { - if (!ableToCreateGroup(tab) || FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()) + if (!ableToCreateGroup(tab) || FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()) { return null; + } return tabId -> { Tab parentTab = TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java index f8ad79b..0aa57f3 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -73,7 +73,8 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class}) -@DisableFeatures(ChromeFeatureList.TAB_SWITCHER_ON_RETURN) +@DisableFeatures( + {ChromeFeatureList.TAB_SWITCHER_ON_RETURN, ChromeFeatureList.START_SURFACE_ANDROID}) @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) public class TabSwitcherMediatorUnitTest { @Rule @@ -193,6 +194,7 @@ public void tearDown() { RecordUserAction.setDisabledForTests(false); RecordHistogram.setDisabledForTests(false); + FeatureUtilities.setGridTabSwitcherEnabledForTesting(false); } @Test
diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected index d5df36c37b..182431d 100644 --- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected +++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
@@ -200,12 +200,9 @@ -assumenosideeffects class ** { # Remove @RemovableInRelease methods so long as return values are unused. @org.chromium.base.annotations.RemovableInRelease <methods>; -} - --assumevalues class ** { # Remove object @RemovableInRelease methods even when return value is used. - # Note: ** in return type does not match primitives. - @org.chromium.base.annotations.RemovableInRelease ** *(...) return null; + # Note: * in return type does not match primitives. + @org.chromium.base.annotations.RemovableInRelease * *(...) return null; # Remove boolean @RemovableInRelease methods even when return value is used. @org.chromium.base.annotations.RemovableInRelease boolean *(...) return false; }
diff --git a/chrome/android/java/res/drawable-hdpi/ic_lightbulb_outline_googblue_24dp.png b/chrome/android/java/res/drawable-hdpi/ic_lightbulb_outline_googblue_24dp.png deleted file mode 100644 index 6fc3ca4f..0000000 --- a/chrome/android/java/res/drawable-hdpi/ic_lightbulb_outline_googblue_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/safetytip_shield.png b/chrome/android/java/res/drawable-hdpi/safetytip_shield.png new file mode 100644 index 0000000..f869686 --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/safetytip_shield.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_lightbulb_outline_googblue_24dp.png b/chrome/android/java/res/drawable-mdpi/ic_lightbulb_outline_googblue_24dp.png deleted file mode 100644 index 399ac87c..0000000 --- a/chrome/android/java/res/drawable-mdpi/ic_lightbulb_outline_googblue_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/safetytip_shield.png b/chrome/android/java/res/drawable-mdpi/safetytip_shield.png new file mode 100644 index 0000000..4a2b1f7 --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/safetytip_shield.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_lightbulb_outline_googblue_24dp.png b/chrome/android/java/res/drawable-xhdpi/ic_lightbulb_outline_googblue_24dp.png deleted file mode 100644 index 4c7db9b9..0000000 --- a/chrome/android/java/res/drawable-xhdpi/ic_lightbulb_outline_googblue_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/safetytip_shield.png b/chrome/android/java/res/drawable-xhdpi/safetytip_shield.png new file mode 100644 index 0000000..bf1c828d --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/safetytip_shield.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_lightbulb_outline_googblue_24dp.png b/chrome/android/java/res/drawable-xxhdpi/ic_lightbulb_outline_googblue_24dp.png deleted file mode 100644 index 5bac05e..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/ic_lightbulb_outline_googblue_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/safetytip_shield.png b/chrome/android/java/res/drawable-xxhdpi/safetytip_shield.png new file mode 100644 index 0000000..5a2a54c --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/safetytip_shield.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_lightbulb_outline_googblue_24dp.png b/chrome/android/java/res/drawable-xxxhdpi/ic_lightbulb_outline_googblue_24dp.png deleted file mode 100644 index 09dc764..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/ic_lightbulb_outline_googblue_24dp.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/safetytip_shield.png b/chrome/android/java/res/drawable-xxxhdpi/safetytip_shield.png new file mode 100644 index 0000000..55c1343 --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/safetytip_shield.png Binary files differ
diff --git a/chrome/android/java/res/layout-sw600dp/find_toolbar.xml b/chrome/android/java/res/layout-sw600dp/find_toolbar.xml index b873d844..ee12b22e 100644 --- a/chrome/android/java/res/layout-sw600dp/find_toolbar.xml +++ b/chrome/android/java/res/layout-sw600dp/find_toolbar.xml
@@ -5,7 +5,7 @@ <!-- Width and height are 0 because things inflated from a ViewStub inherit the ViewStub's LayoutParams. Making these 0 so that it's explicit that setting these does nothing. --> -<org.chromium.chrome.browser.widget.findinpage.FindToolbarTablet +<org.chromium.chrome.browser.findinpage.FindToolbarTablet xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/find_toolbar" android:layout_width="0dp" @@ -16,4 +16,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" layout="@layout/find_in_page" /> -</org.chromium.chrome.browser.widget.findinpage.FindToolbarTablet> +</org.chromium.chrome.browser.findinpage.FindToolbarTablet>
diff --git a/chrome/android/java/res/layout/accessibility_tab_switcher.xml b/chrome/android/java/res/layout/accessibility_tab_switcher.xml index 1a517645..e197d3b 100644 --- a/chrome/android/java/res/layout/accessibility_tab_switcher.xml +++ b/chrome/android/java/res/layout/accessibility_tab_switcher.xml
@@ -6,7 +6,7 @@ found in the LICENSE file. --> -<org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWrapper +<org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelWrapper xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" @@ -17,7 +17,7 @@ android:divider="@drawable/accessibility_tab_switcher_divider" android:showDividers="middle"> - <org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListView + <org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="0dp" @@ -82,4 +82,4 @@ android:contentDescription="@string/accessibility_tab_switcher_incognito_stack" style="?android:attr/borderlessButtonStyle" /> </LinearLayout> -</org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWrapper> +</org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelWrapper>
diff --git a/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml b/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml index 2cabb34e..d6ef032 100644 --- a/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml +++ b/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml
@@ -6,7 +6,7 @@ found in the LICENSE file. --> -<org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem +<org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelListItem xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/list_item_frame" @@ -47,4 +47,4 @@ style="@style/TextButton" /> </LinearLayout> -</org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem> +</org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelListItem>
diff --git a/chrome/android/java/res/layout/empty_background_view_tablet.xml b/chrome/android/java/res/layout/empty_background_view_tablet.xml index 8d935d96..95629cc 100644 --- a/chrome/android/java/res/layout/empty_background_view_tablet.xml +++ b/chrome/android/java/res/layout/empty_background_view_tablet.xml
@@ -3,7 +3,7 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewTablet +<org.chromium.chrome.browser.ui.tablet.emptybackground.EmptyBackgroundViewTablet xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/empty_container" @@ -31,7 +31,7 @@ android:layout_weight="1.0" android:layout_height="wrap_content" android:layout_width="0dp" /> - <org.chromium.chrome.browser.widget.incognitotoggle.IncognitoToggleButtonTablet + <org.chromium.chrome.browser.ui.tablet.emptybackground.incognitotoggle.IncognitoToggleButtonTablet android:id="@+id/empty_incognito_toggle_button" android:layout_width="48dp" android:layout_height="@dimen/toolbar_height_no_shadow" @@ -52,4 +52,4 @@ app:tint="@color/tint_on_dark_bg" /> </LinearLayout> -</org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewTablet> +</org.chromium.chrome.browser.ui.tablet.emptybackground.EmptyBackgroundViewTablet>
diff --git a/chrome/android/java/res/layout/find_in_page.xml b/chrome/android/java/res/layout/find_in_page.xml index 1b7aef27..ff5a2c0 100644 --- a/chrome/android/java/res/layout/find_in_page.xml +++ b/chrome/android/java/res/layout/find_in_page.xml
@@ -12,7 +12,7 @@ android:gravity="center_vertical" style="@android:style/Theme.Holo.Light"> <view - class="org.chromium.chrome.browser.widget.findinpage.FindToolbar$FindQuery" + class="org.chromium.chrome.browser.findinpage.FindToolbar$FindQuery" android:id="@+id/find_query" android:layout_width="0dp" android:layout_weight="1"
diff --git a/chrome/android/java/res/layout/find_toolbar.xml b/chrome/android/java/res/layout/find_toolbar.xml index dc648a7ab..fee3284c 100644 --- a/chrome/android/java/res/layout/find_toolbar.xml +++ b/chrome/android/java/res/layout/find_toolbar.xml
@@ -5,7 +5,7 @@ <!-- Width and height are 0 because things inflated from a ViewStub inherit the ViewStub's LayoutParams. Making these 0 so that it's explicit that setting these does nothing. --> -<org.chromium.chrome.browser.widget.findinpage.FindToolbarPhone +<org.chromium.chrome.browser.findinpage.FindToolbarPhone xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/find_toolbar" android:layout_width="0dp" @@ -16,4 +16,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" layout="@layout/find_in_page" /> -</org.chromium.chrome.browser.widget.findinpage.FindToolbarPhone> +</org.chromium.chrome.browser.findinpage.FindToolbarPhone>
diff --git a/chrome/android/java/res/layout/radio_button_group_theme_preference.xml b/chrome/android/java/res/layout/radio_button_group_theme_preference.xml index 1183109..de3377f 100644 --- a/chrome/android/java/res/layout/radio_button_group_theme_preference.xml +++ b/chrome/android/java/res/layout/radio_button_group_theme_preference.xml
@@ -19,10 +19,14 @@ app:titleText="@string/themes_system_default_title" app:descriptionText="@string/themes_system_default_summary" /> + <!-- override default padding top and bottom --> <org.chromium.chrome.browser.widget.RadioButtonWithDescription android:id="@+id/light" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="@dimen/min_touch_target_size" + android:paddingTop="8dp" + android:paddingBottom="8dp" android:background="?attr/selectableItemBackground" app:titleText="@string/light_mode" /> @@ -30,6 +34,38 @@ android:id="@+id/dark" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="@dimen/min_touch_target_size" + android:paddingTop="8dp" + android:paddingBottom="8dp" android:background="?attr/selectableItemBackground" app:titleText="@string/dark_mode" /> + + <!-- Make the row clickable --> + <LinearLayout + android:id="@+id/checkbox_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/min_touch_target_size" + android:gravity="center_vertical" + android:clickable="true" + android:focusable="true" + android:paddingStart="@dimen/theme_preferences_checkbox_container_padding_start" + android:paddingEnd="@dimen/theme_preferences_checkbox_container_padding_end" + android:visibility="gone" + android:background="?attr/selectableItemBackground"> + + <CheckBox + android:id="@+id/darken_websites" + android:clickable="false" + android:focusable="false" + android:layout_marginEnd="@dimen/theme_preferences_checkbox_margin_end" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/darken_websites" + android:textAppearance="@style/TextAppearance.BlackTitle1" /> + </LinearLayout> </LinearLayout> \ No newline at end of file
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index e6ef3c0..91df9fd8 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -681,4 +681,9 @@ <!-- ChromeTextInputLayout dimensions --> <dimen name="text_input_layout_padding_start">3dp</dimen> + + <!-- Appearance Settings dimensions --> + <dimen name="theme_preferences_checkbox_margin_end">8dp</dimen> + <dimen name="theme_preferences_checkbox_container_padding_start">60dp</dimen> + <dimen name="theme_preferences_checkbox_container_padding_end">16dp</dimen> </resources>
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml index bfbcdbdb..862f1764 100644 --- a/chrome/android/java/res/values/ids.xml +++ b/chrome/android/java/res/values/ids.xml
@@ -20,6 +20,7 @@ <!-- Tab Actions --> <item type="id" name="close_tab" /> + <item type="id" name="ungroup_tab" /> <!-- InfoBar constants --> <item type="id" name="infobar_icon" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index 1a72716b..ef4c939 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -140,6 +140,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; import org.chromium.chrome.browser.tabmodel.TabModelUtils; +import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.toolbar.top.Toolbar; import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer; @@ -154,7 +155,6 @@ import org.chromium.chrome.browser.vr.ArDelegateProvider; import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenManager; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; @@ -2377,8 +2377,9 @@ } private void setLowEndTheme() { - if (getThemeId() == R.style.Theme_Chromium_WithWindowAnimation_LowEnd) + if (getThemeId() == R.style.Theme_Chromium_WithWindowAnimation_LowEnd) { setTheme(R.style.Theme_Chromium_WithWindowAnimation_LowEnd); + } } /** @@ -2400,8 +2401,9 @@ @Override public boolean onActivityResultWithNative(int requestCode, int resultCode, Intent intent) { if (super.onActivityResultWithNative(requestCode, resultCode, intent)) return true; - if (VrModuleProvider.getDelegate().onActivityResultWithNative(requestCode, resultCode)) + if (VrModuleProvider.getDelegate().onActivityResultWithNative(requestCode, resultCode)) { return true; + } return false; } @@ -2486,8 +2488,9 @@ public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) { // Avoid starting Activities when possible while in VR. if (VrModuleProvider.getDelegate().isInVr() - && !VrModuleProvider.getIntentDelegate().isVrIntent(intent)) + && !VrModuleProvider.getIntentDelegate().isVrIntent(intent)) { return false; + } return super.startActivityIfNeeded(intent, requestCode, options); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 3ac1805..78ed598 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -220,6 +220,8 @@ "ContextualSearchTapDisableOverride"; public static final String CONTEXTUAL_SEARCH_TRANSLATION_MODEL = "ContextualSearchTranslationModel"; + public static final String DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING = + "DarkenWebsitesCheckboxInThemesSetting"; public static final String DIRECT_ACTIONS = "DirectActions"; public static final String DOWNLOAD_FILE_PROVIDER = "DownloadFileProvider"; public static final String DOWNLOAD_HOME_SHOW_STORAGE_INFO = "DownloadHomeShowStorageInfo";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index a1d3621..ad35eae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -51,6 +51,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.IntentHandler.IntentHandlerDelegate; import org.chromium.chrome.browser.IntentHandler.TabOpenType; +import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.compositor.CompositorViewHolder; @@ -99,6 +100,7 @@ import org.chromium.chrome.browser.multiwindow.MultiInstanceManager; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.native_page.NativePageAssassin; +import org.chromium.chrome.browser.night_mode.WebContentsDarkModeController; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.omaha.OmahaBase; @@ -151,7 +153,6 @@ import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.chrome.browser.vr.VrModuleProvider; -import org.chromium.chrome.browser.widget.OverviewListLayout; import org.chromium.chrome.features.start_surface.StartSurface; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.FeatureConstants; @@ -892,6 +893,11 @@ public void startNativeInitialization() { try (TraceEvent e = TraceEvent.scoped("ChromeTabbedActivity.startNativeInitialization")) { // This is on the critical path so don't delay. + if (FeatureUtilities.isNightModeAvailable() + && ChromeFeatureList.isEnabled( + ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) { + WebContentsDarkModeController.createInstance(); + } setupCompositorContent(); // All this initialization can be expensive so it's split into multiple tasks.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java index 465ed13..fb01b95 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -28,8 +28,8 @@ import org.chromium.base.task.AsyncTask; import org.chromium.chrome.R; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.util.UrlConstants; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelAdapter.java similarity index 62% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java rename to chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelAdapter.java index b35114a..826fd3c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelAdapter.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.accessibility; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.content.Context; import android.view.LayoutInflater; @@ -11,11 +11,11 @@ import android.widget.BaseAdapter; import org.chromium.chrome.R; +import org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelListItem.AccessibilityTabModelListItemListener; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelUtils; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem.AccessibilityTabModelListItemListener; /** * An instance of a {@link BaseAdapter} that represents a {@link TabModel}. @@ -42,53 +42,52 @@ private final AccessibilityTabModelListItemListener mInternalListener = new AccessibilityTabModelListItemListener() { - @Override - public void tabSelected(int tab) { - if (mListener != null) mListener.showTab(tab); - TabModelUtils.setIndex(mActualTabModel, - TabModelUtils.getTabIndexById(mActualTabModel, tab)); - notifyDataSetChanged(); - } + @Override + public void tabSelected(int tab) { + if (mListener != null) mListener.showTab(tab); + TabModelUtils.setIndex( + mActualTabModel, TabModelUtils.getTabIndexById(mActualTabModel, tab)); + notifyDataSetChanged(); + } - @Override - public void tabClosed(int tab) { - if (mActualTabModel.isClosurePending(tab)) { - mActualTabModel.commitTabClosure(tab); - } else { - TabModelUtils.closeTabById(mActualTabModel, tab); - } - notifyDataSetChanged(); - } + @Override + public void tabClosed(int tab) { + if (mActualTabModel.isClosurePending(tab)) { + mActualTabModel.commitTabClosure(tab); + } else { + TabModelUtils.closeTabById(mActualTabModel, tab); + } + notifyDataSetChanged(); + } - @Override - public boolean hasPendingClosure(int tab) { - return mUndoneTabModel.isClosurePending(tab); - } + @Override + public boolean hasPendingClosure(int tab) { + return mUndoneTabModel.isClosurePending(tab); + } - @Override - public void schedulePendingClosure(int tab) { - mActualTabModel.closeTab( - TabModelUtils.getTabById(mActualTabModel, tab), true, false, true); - notifyDataSetChanged(); - } + @Override + public void schedulePendingClosure(int tab) { + mActualTabModel.closeTab( + TabModelUtils.getTabById(mActualTabModel, tab), true, false, true); + notifyDataSetChanged(); + } - @Override - public void cancelPendingClosure(int tab) { - mActualTabModel.cancelTabClosure(tab); - notifyDataSetChanged(); - } + @Override + public void cancelPendingClosure(int tab) { + mActualTabModel.cancelTabClosure(tab); + notifyDataSetChanged(); + } - @Override - public void tabChanged(int tabId) { - notifyDataSetChanged(); - } - }; + @Override + public void tabChanged(int tabId) { + notifyDataSetChanged(); + } + }; /** * @param context The Context to use to inflate {@link View}s in. */ - public AccessibilityTabModelAdapter(Context context, - AccessibilityTabModelListView listener) { + public AccessibilityTabModelAdapter(Context context, AccessibilityTabModelListView listener) { mContext = context; mCanScrollListener = listener; } @@ -122,8 +121,8 @@ @Override public long getItemId(int position) { - return mUndoneTabModel != null - ? mUndoneTabModel.getTabAt(position).getId() : Tab.INVALID_TAB_ID; + return mUndoneTabModel != null ? mUndoneTabModel.getTabAt(position).getId() + : Tab.INVALID_TAB_ID; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java similarity index 92% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java rename to chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java index eb6a865..cf8a069 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.accessibility; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -143,8 +143,7 @@ /** * Used with the swipe away and blink out animations to bring in the undo view. */ - private final AnimatorListenerAdapter mCloseAnimatorListener = - new AnimatorListenerAdapter() { + private final AnimatorListenerAdapter mCloseAnimatorListener = new AnimatorListenerAdapter() { private boolean mIsCancelled; @Override @@ -178,31 +177,31 @@ */ private final AnimatorListenerAdapter mActuallyCloseAnimatorListener = new AnimatorListenerAdapter() { - private boolean mIsCancelled; + private boolean mIsCancelled; - @Override - public void onAnimationStart(Animator animation) { - mIsCancelled = false; - } + @Override + public void onAnimationStart(Animator animation) { + mIsCancelled = false; + } - @Override - public void onAnimationCancel(Animator animation) { - mIsCancelled = true; - mCloseButtonClicked = false; - } + @Override + public void onAnimationCancel(Animator animation) { + mIsCancelled = true; + mCloseButtonClicked = false; + } - @Override - public void onAnimationEnd(Animator animator) { - if (mIsCancelled) return; + @Override + public void onAnimationEnd(Animator animator) { + if (mIsCancelled) return; - showUndoView(false); - setAlpha(1.f); - mTabContents.setAlpha(1.f); - mUndoContents.setAlpha(1.f); - cancelRunningAnimation(); - mListener.tabClosed(mTab.getId()); - } - }; + showUndoView(false); + setAlpha(1.f); + mTabContents.setAlpha(1.f); + mUndoContents.setAlpha(1.f); + cancelRunningAnimation(); + mListener.tabClosed(mTab.getId()); + } + }; /** * @param context The Context to build this widget in. @@ -211,8 +210,7 @@ public AccessibilityTabModelListItem(Context context, AttributeSet attrs) { super(context, attrs); mSwipeGestureDetector = new GestureDetector(context, new SwipeGestureListener()); - mSwipeCommitDistance = - context.getResources().getDimension(R.dimen.swipe_commit_distance); + mSwipeCommitDistance = context.getResources().getDimension(R.dimen.swipe_commit_distance); mFlingCommitDistance = mSwipeCommitDistance / 3; mDefaultHeight = @@ -303,11 +301,11 @@ if (!title.equals(mTitleView.getText())) mTitleView.setText(title); - String accessibilityString = getContext().getString(R.string.accessibility_tabstrip_tab, - title); + String accessibilityString = + getContext().getString(R.string.accessibility_tabstrip_tab, title); if (!accessibilityString.equals(getContentDescription())) { - setContentDescription(getContext().getString(R.string.accessibility_tabstrip_tab, - title)); + setContentDescription( + getContext().getString(R.string.accessibility_tabstrip_tab, title)); mCloseButton.setContentDescription( getContext().getString(R.string.accessibility_tabstrip_btn_close_tab, title)); } @@ -524,8 +522,8 @@ if (Math.abs(getTranslationX()) < mFlingCommitDistance) return false; double velocityMagnitude = Math.sqrt(velocityX * velocityX + velocityY * velocityY); - long closeTime = (long) Math.abs((getWidth() / velocityMagnitude)) - * VELOCITY_SCALING_FACTOR; + long closeTime = + (long) Math.abs((getWidth() / velocityMagnitude)) * VELOCITY_SCALING_FACTOR; runSwipeAnimation(Math.min(closeTime, mDefaultAnimationDurationMs)); mCanScrollListener.setCanScroll(true); return true; @@ -555,8 +553,8 @@ cancelRunningAnimation(); mSwipedAway = getTranslationX(); - ObjectAnimator swipe = ObjectAnimator.ofFloat(this, View.TRANSLATION_X, - getTranslationX() > 0 ? getWidth() : -getWidth()); + ObjectAnimator swipe = ObjectAnimator.ofFloat( + this, View.TRANSLATION_X, getTranslationX() > 0 ? getWidth() : -getWidth()); ObjectAnimator fadeOut = ObjectAnimator.ofFloat(this, View.ALPHA, 0.f); AnimatorSet set = new AnimatorSet(); @@ -579,8 +577,8 @@ AnimatorSet set = new AnimatorSet(); set.playTogether(swipe, fadeIn, scaleX, scaleY, resetHeight); - set.setDuration(useCloseAnimationDuration - ? mCloseAnimationDurationMs : mDefaultAnimationDurationMs); + set.setDuration(useCloseAnimationDuration ? mCloseAnimationDurationMs + : mDefaultAnimationDurationMs); set.start(); mActiveAnimation = set;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListView.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListView.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListView.java rename to chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListView.java index 19f0e09..a289090 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListView.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.accessibility; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.content.Context; import android.util.AttributeSet;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java similarity index 94% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java rename to chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java index e33be68..f3b05a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.accessibility; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.content.Context; import android.content.res.ColorStateList; @@ -17,11 +17,11 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; import org.chromium.ui.widget.ChromeImageView; /** @@ -47,17 +47,17 @@ private TabModelSelector mTabModelSelector; private TabModelSelectorObserver mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() { - @Override - public void onChange() { - getAdapter().notifyDataSetChanged(); - updateVisibilityForLayoutOrStackButton(); - } + @Override + public void onChange() { + getAdapter().notifyDataSetChanged(); + updateVisibilityForLayoutOrStackButton(); + } - @Override - public void onNewTabCreated(Tab tab) { - getAdapter().notifyDataSetChanged(); - } - }; + @Override + public void onNewTabCreated(Tab tab) { + getAdapter().notifyDataSetChanged(); + } + }; // TODO(bauerb): Use View#isAttachedToWindow() as soon as we are guaranteed // to run against API version 19. @@ -84,8 +84,7 @@ super(context, attrs); } - public AccessibilityTabModelWrapper(Context context, AttributeSet attrs, - int defStyle) { + public AccessibilityTabModelWrapper(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS new file mode 100644 index 0000000..b8539046 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS
@@ -0,0 +1,4 @@ +twellington@chromium.org + +# TEAM: chrome-android-app@chromium.org +# COMPONENT: UI>Browser>Mobile>TabSwitcher
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout.java similarity index 96% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java rename to chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout.java index 3e95688..b147005 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.content.Context; import android.view.LayoutInflater; @@ -14,6 +14,7 @@ import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.accessibility_tab_switcher.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; @@ -24,8 +25,6 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelUtils; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWrapper; import org.chromium.ui.base.DeviceFormFactor; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 4ae3f63..b6bd553 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -53,8 +53,8 @@ import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.util.ColorUtils; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.components.content_capture.ContentCaptureConsumer; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.KeyboardVisibilityDelegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index fbf6299..8f99977 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -12,6 +12,7 @@ import org.chromium.base.ObserverList; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.compositor.TitleCache; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; @@ -36,7 +37,6 @@ import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.chrome.browser.util.FeatureUtilities; -import org.chromium.chrome.browser.widget.OverviewListLayout; import org.chromium.chrome.features.start_surface.StartSurface; import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java index f89c53d..8d321c0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java
@@ -21,9 +21,9 @@ import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.DrawingInfo; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.resources.ResourceManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index 3ddde3d..d70729d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -545,7 +545,7 @@ ShareHelper.share(linkShareParams); } else if (itemId == R.id.contextmenu_search_with_google_lens) { ContextMenuUma.record(params, ContextMenuUma.Action.SEARCH_WITH_GOOGLE_LENS); - helper.searchWithGoogleLens(); + helper.searchWithGoogleLens(mDelegate.isIncognito()); } else if (itemId == R.id.contextmenu_search_by_image) { ContextMenuUma.record(params, ContextMenuUma.Action.SEARCH_BY_IMAGE); helper.searchForImage();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java index d91102f..dd6fbe1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
@@ -5,11 +5,10 @@ package org.chromium.chrome.browser.contextmenu; import android.app.Activity; -import android.content.ComponentName; import android.content.res.Resources; import android.graphics.Bitmap; +import android.net.Uri; import android.os.Build; -import android.support.annotation.Nullable; import android.util.Pair; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -188,9 +187,12 @@ /** * Search for the image by intenting to the lens app with the image data attached. + * @param isIncognito Whether the image to search came from an incognito context. */ - public void searchWithGoogleLens() { - shareImageDirectly(null, /* shareWithGoogleLens = */ true); + public void searchWithGoogleLens(boolean isIncognito) { + retrieveImage((Uri imageUri) -> { + ShareHelper.shareImageWithGoogleLens(mActivity, imageUri, isIncognito); + }); } /** @@ -207,36 +209,37 @@ * it will use the right activity set when the menu was displayed. */ void shareImage() { - shareImageDirectly(null, /* shareWithGoogleLens = */ false); + retrieveImage((Uri imageUri) -> { ShareHelper.shareImage(mActivity, null, imageUri); }); } /** * Share the image that triggered the current context menu with the last app used to share. */ private void shareImageWithLastShareComponent() { - shareImageDirectly( - ShareHelper.getLastShareComponentName(null), /* shareWithGoogleLens = */ false); + retrieveImage((Uri imageUri) -> { + ShareHelper.shareImage( + mActivity, ShareHelper.getLastShareComponentName(null), imageUri); + }); } /** - * Share image triggered with the current context menu directly with a specific app. - * @param name The {@link ComponentName} of the app to share the image directly with. - * @param shareWithGoogleLens Whether to share with the Google Lens (overrides the - * value specified in the ComponentName field). + * Retrieves a URI for the selected image for sharing with external apps. If the function fails + * to retrieve the image bytes or generate a URI the callback will *not* be called. + * @param callback Called once the the image is generated and ready to be shared. */ - private void shareImageDirectly( - @Nullable final ComponentName name, boolean shareWithGoogleLens) { + private void retrieveImage(Callback<Uri> callback) { if (mNativeContextMenuHelper == 0) return; - Callback<byte[]> callback = new Callback<byte[]>() { + Callback<byte[]> imageRetrievalCallback = new Callback<byte[]>() { @Override public void onResult(byte[] result) { if (mActivity == null) return; - ShareHelper.shareImage(mActivity, result, name, shareWithGoogleLens); + ShareHelper.generateUriFromData(mActivity, result, callback); } }; ContextMenuHelperJni.get().retrieveImageForShare(mNativeContextMenuHelper, - ContextMenuHelper.this, callback, MAX_SHARE_DIMEN_PX, MAX_SHARE_DIMEN_PX); + ContextMenuHelper.this, imageRetrievalCallback, MAX_SHARE_DIMEN_PX, + MAX_SHARE_DIMEN_PX); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 110fdc2..9f7abb0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -62,6 +62,7 @@ import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.contextual_search.mojom.OverlayPosition; import org.chromium.net.NetworkChangeNotifier; +import org.chromium.ui.touch_selection.SelectionEventType; import java.net.MalformedURLException; import java.net.URL; @@ -195,9 +196,6 @@ // TODO(donnd): replace with a more systematic approach using the InternalStateController. private int mSelectWordAroundCaretCounter; - /** Whether Smart Text Selection might be active. If false, we know it's not active. */ - private boolean mCouldSmartSelectionBeActive; - /** An observer that reports selected context to GSA for search quality. */ private ContextualSearchObserver mContextReportingObserver; @@ -1262,15 +1260,6 @@ } /** - * Notifies Contextual Search whether Smart Selection could be active. - * @param isSmartSelectionEnabledInChrome Whether Smart Selection is enabled in Chrome, and - * therefore could be active. - */ - void setCouldSmartSelectionBeActive(boolean isSmartSelectionEnabledInChrome) { - mCouldSmartSelectionBeActive = isSmartSelectionEnabledInChrome; - } - - /** * Implements the {@link SelectionClient} interface for Contextual Search. * Handles messages from Content about selection changes. These are the key drivers of * Contextual Search logic. @@ -1285,7 +1274,8 @@ } @Override - public void onSelectionEvent(int eventType, float posXPix, float posYPix) { + public void onSelectionEvent( + @SelectionEventType int eventType, float posXPix, float posYPix) { if (!isOverlayVideoMode()) { mSelectionController.handleSelectionEvent(eventType, posXPix, posYPix); } @@ -1573,19 +1563,6 @@ mSelectionController.getSelectionType() == SelectionType.TAP || mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS; - if (!isResolvingGesture && mCouldSmartSelectionBeActive && mContext != null) { - // If Smart Selection might be active we need to work around a race - // condition gathering surrounding text. See https://crbug.com/773330. - // Instead we just return the selection which is good enough for the assistant. - mInternalStateController.notifyStartingWorkOn( - InternalState.GATHERING_SURROUNDINGS); - String currentSelection = mSelectionController.getSelectedText(); - mContext.setSurroundingText(getBaseWebContents(), currentSelection); - mInternalStateController.notifyFinishedWorkOn( - InternalState.GATHERING_SURROUNDINGS); - return; - } - if (isResolvingGesture && mPolicy.shouldPreviousGestureResolve()) { ContextualSearchInteractionPersister.PersistedInteraction interaction = mInteractionRecorder.getInteractionPersister() @@ -1699,7 +1676,8 @@ String selection = mSelectionController.getSelectedText(); assert !TextUtils.isEmpty(selection); - boolean isRestrictedResolve = mPolicy.isPrivacyAggressiveResolveEnabled() + boolean isRestrictedResolve = + mPolicy.isPrivacyAggressiveResolveEnabled() && mPolicy.isPromoAvailable() || mSelectionController.isAdjustedSelection(); mNetworkCommunicator.startSearchTermResolutionRequest( selection, isRestrictedResolve); @@ -1714,14 +1692,16 @@ @Override public void showContextualSearchResolvingUi() { - mInternalStateController.notifyStartingWorkOn(InternalState.SHOW_RESOLVING_UI); - if (mSelectionController.getSelectionType() != SelectionType.UNDETERMINED) { + if (mSelectionController.getSelectionType() == SelectionType.UNDETERMINED) { + mInternalStateController.reset(StateChangeReason.INVALID_SELECTION); + } else { + mInternalStateController.notifyStartingWorkOn(InternalState.SHOW_RESOLVING_UI); boolean isTap = mSelectionController.getSelectionType() == SelectionType.TAP; showContextualSearch(isTap ? StateChangeReason.TEXT_SELECT_TAP : StateChangeReason.TEXT_SELECT_LONG_PRESS); if (isTap) ContextualSearchUma.logRankerFeaturesAvailable(true); + mInternalStateController.notifyFinishedWorkOn(InternalState.SHOW_RESOLVING_UI); } - mInternalStateController.notifyFinishedWorkOn(InternalState.SHOW_RESOLVING_UI); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index dd40d63..6cbf30a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -148,8 +148,9 @@ } if (isPrivacyAggressiveResolveEnabled() - && mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) + && mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) { return true; + } return isPromoAvailable() ? isBasePageHTTP(mNetworkCommunicator.getBasePageUrl()) : true; } @@ -251,7 +252,7 @@ /** * @return Whether a verbatim request should be made for the given base page, assuming there - * is no exiting request. + * is no existing request. */ boolean shouldCreateVerbatimRequest() { if (isPrivacyAggressiveResolveEnabled()) return false; @@ -491,8 +492,9 @@ */ String getHomeCountry(Context context) { if (ContextualSearchFieldTrial.getSwitch( - ContextualSearchSwitch.IS_SEND_HOME_COUNTRY_DISABLED)) + ContextualSearchSwitch.IS_SEND_HOME_COUNTRY_DISABLED)) { return ""; + } TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java index 2eb58e2..bd83b4fd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -312,7 +312,7 @@ * @param posXPix The x coordinate of the selection start handle. * @param posYPix The y coordinate of the selection start handle. */ - void handleSelectionEvent(int eventType, float posXPix, float posYPix) { + void handleSelectionEvent(@SelectionEventType int eventType, float posXPix, float posYPix) { boolean shouldHandleSelection = false; switch (eventType) { case SelectionEventType.SELECTION_HANDLES_SHOWN: @@ -334,6 +334,7 @@ resetAllStates(); break; case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED: + case SelectionEventType.SELECTION_HANDLES_MOVED: shouldHandleSelection = mShouldHandleSelectionModification; mIsAdjustedSelection = true; break;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java index f5e315a..07406ef 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java
@@ -346,8 +346,6 @@ controller.setSelectionClient( mSelectionClientManager.addContextualSearchSelectionClient( contextualSearchManager.getContextualSearchSelectionClient())); - contextualSearchManager.setCouldSmartSelectionBeActive( - mSelectionClientManager.isSmartSelectionEnabledInChrome()); ContextualSearchTabHelperJni.get().installUnhandledTapNotifierIfNeeded( mNativeHelper, ContextualSearchTabHelper.this, webContents, mPxToDp); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SelectionClientManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SelectionClientManager.java index bf34ecb..8b3b26e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SelectionClientManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SelectionClientManager.java
@@ -15,6 +15,7 @@ import org.chromium.content_public.browser.SelectionMetricsLogger; import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.touch_selection.SelectionEventType; /** * Manages the current {@link SelectionClient} instances, with support for 0-2 instances. @@ -45,9 +46,6 @@ */ SelectionClientManager(WebContents webContents) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SMART_SELECTION) - // TODO(donnd): revert this line when crbug.com/956277 is fixed. - && !ChromeFeatureList.isEnabled( - ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE) && Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { assert webContents != null; mOptionalSelectionClient = SelectionClient.createSmartSelectionClient(webContents); @@ -65,11 +63,6 @@ mIsSmartSelectionEnabledInChrome = enableSmartSelection; } - /** @return Whether Smart Text Selection is currently enabled in Chrome. */ - boolean isSmartSelectionEnabledInChrome() { - return mIsSmartSelectionEnabledInChrome; - } - /** * @return the current {@link SelectionClient} or {@code null} if there is none currently * active. @@ -160,7 +153,8 @@ } @Override - public void onSelectionEvent(int eventType, float posXPix, float posYPix) { + public void onSelectionEvent( + @SelectionEventType int eventType, float posXPix, float posYPix) { mSmartSelectionClient.onSelectionEvent(eventType, posXPix, posYPix); mContextualSearchSelectionClient.onSelectionEvent(eventType, posXPix, posYPix); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java index 6ff612eb..69fc9a0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java
@@ -361,6 +361,11 @@ computeNextStepForUpdate(item); } + /** @return Whether the infobar is currently showing. */ + public boolean isShowing() { + return mCurrentInfoBar != null; + } + /** * Helper method to get the parameters for showing accelerated download infobar IPH. * @return The UI parameters to show IPH, if an IPH should be shown, null otherwise.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index fe386136..8b0c3c8c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -317,8 +317,7 @@ mUpdateDelayInMillis = updateDelayInMillis; mHandler = handler; mDownloadSnackbarController = new DownloadSnackbarController(); - mOMADownloadHandler = - new OMADownloadHandler(applicationContext, mDownloadSnackbarController); + mOMADownloadHandler = new OMADownloadHandler(applicationContext); // Note that this technically leaks the native object, however, DownloadManagerService // is a singleton that lives forever and there's no clean shutdown of Chrome on Android. init(); @@ -553,7 +552,6 @@ // TODO(cmsy): Use correct FailState. mDownloadNotifier.notifyDownloadFailed(info); Log.w(TAG, "Download failed: " + info.getFilePath()); - onDownloadFailed(item, DownloadManager.ERROR_UNKNOWN); break; case DownloadStatus.IN_PROGRESS: if (info.isPaused()) { @@ -629,7 +627,6 @@ .build(); mDownloadNotifier.notifyDownloadFailed(info); // TODO(qinmin): get the failure message from native. - onDownloadFailed(item, DownloadManager.ERROR_UNKNOWN); maybeRecordBackgroundDownload( UmaBackgroundDownload.FAILED, info.getDownloadGuid()); } @@ -833,13 +830,7 @@ return; } - // TODO(shaktisahu): We should show this on infobar instead. - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) { - getInfoBarController(downloadItem.getDownloadInfo().isOffTheRecord()) - .onDownloadStarted(); - } else { - DownloadUtils.showDownloadStartToast(ContextUtils.getApplicationContext()); - } + getInfoBarController(downloadItem.getDownloadInfo().isOffTheRecord()).onDownloadStarted(); addUmaStatsEntry(new DownloadUmaStatsEntry(String.valueOf(response.downloadId), downloadItem.getStartTime(), 0, false, true, 0, 0)); } @@ -1023,8 +1014,6 @@ protected void onDownloadFailed(DownloadItem item, int reason) { String failureMessage = getDownloadFailureMessage(item.getDownloadInfo().getFileName(), reason); - // TODO(shaktisahu): Notify infobar controller of the failure. - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) return; if (mDownloadSnackbarController.getSnackbarManager() != null) { mDownloadSnackbarController.onDownloadFailed( @@ -1286,8 +1275,6 @@ if (infobarController != null) { infobarController.onNotificationShown(info.getContentId(), notificationId); } - mDownloadSnackbarController.onDownloadSucceeded( - info, notificationId, systemDownloadId, canResolve, false); } } else { if (getInfoBarController(info.isOffTheRecord()) != null) { @@ -1425,10 +1412,6 @@ .onItemUpdated(DownloadInfo.createOfflineItem( item.getDownloadInfo()), null); - mDownloadSnackbarController.onDownloadSucceeded( - item.getDownloadInfo(), - DownloadSnackbarController.INVALID_NOTIFICATION_ID, - item.getSystemDownloadId(), canResolve, true); } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSnackbarController.java index de7b709..5054a5b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSnackbarController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSnackbarController.java
@@ -6,18 +6,15 @@ import android.app.Activity; import android.app.DownloadManager; -import android.content.Context; import android.content.Intent; import org.chromium.base.ApplicationStatus; -import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.SnackbarManager; -import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.components.offline_items_collection.LegacyHelpers; /** @@ -77,46 +74,6 @@ } /** - * Called to display the download succeeded snackbar. - * - * @param downloadInfo Info of the download. - * @param notificationId Notification Id of the successful download. - * @param downloadId Id of the download from Android DownloadManager. - * @param canBeResolved Whether the download can be resolved to any activity. - * @param usesAndroidDownloadManager Whether the download uses Android DownloadManager. - */ - public void onDownloadSucceeded( - DownloadInfo downloadInfo, int notificationId, long downloadId, boolean canBeResolved, - boolean usesAndroidDownloadManager) { - Context appContext = ContextUtils.getApplicationContext(); - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) return; - if (getSnackbarManager() == null) return; - Snackbar snackbar; - if (getActivity() instanceof CustomTabActivity) { - String packageLabel = BuildInfo.getInstance().hostPackageLabel; - snackbar = Snackbar.make(appContext.getString(R.string.download_succeeded_message, - downloadInfo.getFileName(), packageLabel), - this, Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_DOWNLOAD_SUCCEEDED); - } else { - snackbar = - Snackbar.make(appContext.getString(R.string.download_succeeded_message_default, - downloadInfo.getFileName()), - this, Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_DOWNLOAD_SUCCEEDED); - } - // TODO(qinmin): Coalesce snackbars if multiple downloads finish at the same time. - snackbar.setDuration(SNACKBAR_DURATION_MS).setSingleLine(false); - ActionDataInfo info = null; - if (canBeResolved || !LegacyHelpers.isLegacyDownload(downloadInfo.getContentId()) - || usesAndroidDownloadManager) { - info = new ActionDataInfo(downloadInfo, notificationId, downloadId, - usesAndroidDownloadManager); - } - // Show downloads app if the download cannot be resolved to any activity. - snackbar.setAction(appContext.getString(R.string.open_downloaded_label), info); - getSnackbarManager().showSnackbar(snackbar); - } - - /** * Called to display the download failed snackbar. * * @param errorMessage The message to show on the snackbar. @@ -124,7 +81,7 @@ * duplicated files. */ public void onDownloadFailed(String errorMessage, boolean showAllDownloads) { - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) return; + if (isShowingDownloadInfoBar()) return; if (getSnackbarManager() == null) return; // TODO(qinmin): Coalesce snackbars if multiple downloads finish at the same time. Snackbar snackbar = Snackbar.make(errorMessage, this, Snackbar.TYPE_NOTIFICATION, @@ -170,4 +127,10 @@ } return null; } + + private boolean isShowingDownloadInfoBar() { + return DownloadManagerService.getDownloadManagerService() + .getInfoBarController(Profile.getLastUsedProfile().isOffTheRecord()) + .isShowing(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java index bb37f4a..7886998 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
@@ -42,7 +42,6 @@ import org.chromium.chrome.browser.download.DownloadManagerBridge.DownloadEnqueueRequest; import org.chromium.chrome.browser.download.DownloadManagerBridge.DownloadEnqueueResponse; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; -import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.download.R; import org.chromium.components.download.DownloadCollectionBridge; import org.chromium.components.offline_items_collection.LegacyHelpers; @@ -131,7 +130,6 @@ new LongSparseArray<DownloadItem>(); private final LongSparseArray<OMAInfo> mPendingOMADownloads = new LongSparseArray<OMAInfo>(); - private final DownloadSnackbarController mDownloadSnackbarController; private final ObserverList<TestObserver> mObservers = new ObserverList<>(); /** @@ -257,11 +255,10 @@ } } - public OMADownloadHandler( - Context context, DownloadSnackbarController downloadSnackbarController) { + /** Constructor. */ + public OMADownloadHandler(Context context) { mContext = context; mSharedPrefs = ContextUtils.getAppSharedPreferences(); - mDownloadSnackbarController = downloadSnackbarController; } /** @@ -863,25 +860,13 @@ if (result.downloadStatus == DownloadManagerService.DownloadStatus.COMPLETE) { onDownloadCompleted(item.getDownloadInfo(), downloadId, installNotifyURI); removeOMADownloadFromSharedPrefs(downloadId); - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) { - showDownloadOnInfoBar(item, result.downloadStatus); - } else { - mDownloadSnackbarController.onDownloadSucceeded(item.getDownloadInfo(), - DownloadSnackbarController.INVALID_NOTIFICATION_ID, downloadId, - canResolve, true); - } - + showDownloadOnInfoBar(item, result.downloadStatus); } else if (result.downloadStatus == DownloadManagerService.DownloadStatus.FAILED) { onDownloadFailed(item.getDownloadInfo(), downloadId, result.failureReason, installNotifyURI); removeOMADownloadFromSharedPrefs(downloadId); - if (FeatureUtilities.isDownloadProgressInfoBarEnabled()) { - // TODO(shaktisahu): Find a way to pass the failure reason. - showDownloadOnInfoBar(item, result.downloadStatus); - } else { - DownloadManagerService.getDownloadManagerService().onDownloadFailed( - item, result.failureReason); - } + // TODO(shaktisahu): Find a way to pass the failure reason. + showDownloadOnInfoBar(item, result.downloadStatus); } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindResultBar.java similarity index 81% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindResultBar.java index a503356..e937800 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindResultBar.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -21,7 +21,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.findinpage.FindInPageBridge; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.MathUtils; import org.chromium.ui.KeyboardVisibilityDelegate; @@ -92,31 +91,26 @@ super(context); Resources res = context.getResources(); - mBackgroundColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_background_color); - mBackgroundBorderColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_background_border_color); - mResultColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_result_color); - mResultBorderColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_result_border_color); - mActiveColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_active_color); - mActiveBorderColor = ApiCompatibilityUtils.getColor(res, - R.color.find_result_bar_active_border_color); - mBarTouchWidth = res.getDimensionPixelSize( - R.dimen.find_result_bar_touch_width); + mBackgroundColor = + ApiCompatibilityUtils.getColor(res, R.color.find_result_bar_background_color); + mBackgroundBorderColor = ApiCompatibilityUtils.getColor( + res, R.color.find_result_bar_background_border_color); + mResultColor = ApiCompatibilityUtils.getColor(res, R.color.find_result_bar_result_color); + mResultBorderColor = + ApiCompatibilityUtils.getColor(res, R.color.find_result_bar_result_border_color); + mActiveColor = ApiCompatibilityUtils.getColor(res, R.color.find_result_bar_active_color); + mActiveBorderColor = + ApiCompatibilityUtils.getColor(res, R.color.find_result_bar_active_border_color); + mBarTouchWidth = res.getDimensionPixelSize(R.dimen.find_result_bar_touch_width); mBarDrawWidth = res.getDimensionPixelSize(R.dimen.find_result_bar_draw_width) + res.getDimensionPixelSize(R.dimen.find_in_page_separator_width); mResultMinHeight = res.getDimensionPixelSize(R.dimen.find_result_bar_result_min_height); - mActiveMinHeight = res.getDimensionPixelSize( - R.dimen.find_result_bar_active_min_height); - mBarVerticalPadding = res.getDimensionPixelSize( - R.dimen.find_result_bar_vertical_padding); - mMinGapBetweenStacks = res.getDimensionPixelSize( - R.dimen.find_result_bar_min_gap_between_stacks); - mStackedResultHeight = res.getDimensionPixelSize( - R.dimen.find_result_bar_stacked_result_height); + mActiveMinHeight = res.getDimensionPixelSize(R.dimen.find_result_bar_active_min_height); + mBarVerticalPadding = res.getDimensionPixelSize(R.dimen.find_result_bar_vertical_padding); + mMinGapBetweenStacks = + res.getDimensionPixelSize(R.dimen.find_result_bar_min_gap_between_stacks); + mStackedResultHeight = + res.getDimensionPixelSize(R.dimen.find_result_bar_stacked_result_height); mFillPaint = new Paint(); mStrokePaint = new Paint(); @@ -131,8 +125,7 @@ mTab.getContentView().addView(this, new FrameLayout.LayoutParams( mBarTouchWidth, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.END)); - setTranslationX( - MathUtils.flipSignIf(mBarTouchWidth, LocalizationUtils.isLayoutRtl())); + setTranslationX(MathUtils.flipSignIf(mBarTouchWidth, LocalizationUtils.isLayoutRtl())); mVisibilityAnimation = ObjectAnimator.ofFloat(this, TRANSLATION_X, 0); mVisibilityAnimation.setDuration(VISIBILITY_ANIMATION_DURATION_MS); @@ -193,8 +186,8 @@ KeyboardVisibilityDelegate.getInstance().hideKeyboard(this); // Identify which drawn tickmark is closest to the user's finger. - int closest = Collections.binarySearch(mTickmarks, - new Tickmark(event.getY(), event.getY())); + int closest = + Collections.binarySearch(mTickmarks, new Tickmark(event.getY(), event.getY())); if (closest < 0) { // No exact match, so must determine nearest. int insertionPoint = -1 - closest; @@ -203,10 +196,10 @@ } else if (insertionPoint == mTickmarks.size()) { closest = mTickmarks.size() - 1; } else { - float distanceA = Math.abs(event.getY() - - mTickmarks.get(insertionPoint - 1).centerY()); - float distanceB = Math.abs(event.getY() - - mTickmarks.get(insertionPoint).centerY()); + float distanceA = + Math.abs(event.getY() - mTickmarks.get(insertionPoint - 1).centerY()); + float distanceB = + Math.abs(event.getY() - mTickmarks.get(insertionPoint).centerY()); closest = insertionPoint - (distanceA <= distanceB ? 1 : 0); } } @@ -219,8 +212,7 @@ // that point (which will usually be the same one). mWaitingForActivateAck = true; mFindInPageBridge.activateNearestFindResult( - mMatches[closest].centerX(), - mMatches[closest].centerY()); + mMatches[closest].centerX(), mMatches[closest].centerY()); } return true; // Consume the event, whether or not we acted upon it. } @@ -241,11 +233,9 @@ int leftMargin = getLeftMargin(); mFillPaint.setColor(mBackgroundColor); mStrokePaint.setColor(mBackgroundBorderColor); - canvas.drawRect(leftMargin, 0, - leftMargin + mBarDrawWidth, getHeight(), mFillPaint); - float lineX = LocalizationUtils.isLayoutRtl() - ? leftMargin + mBarDrawWidth - 0.5f - : leftMargin + 0.5f; + canvas.drawRect(leftMargin, 0, leftMargin + mBarDrawWidth, getHeight(), mFillPaint); + float lineX = LocalizationUtils.isLayoutRtl() ? leftMargin + mBarDrawWidth - 0.5f + : leftMargin + 0.5f; canvas.drawLine(lineX, 0, lineX, getHeight(), mStrokePaint); if (mMatches.length == 0) { @@ -316,8 +306,8 @@ i++; while (i < mMatches.length) { nextTickmark = tickmarkForRect(mMatches[i], false); - if (nextTickmark.mTop <= cluster.get(cluster.size() - 1).mBottom - + mMinGapBetweenStacks) { + if (nextTickmark.mTop + <= cluster.get(cluster.size() - 1).mBottom + mMinGapBetweenStacks) { cluster.add(nextTickmark); i++; } else { @@ -329,15 +319,15 @@ int cn = cluster.size(); float minStart = lastGroupEnd + mMinGapBetweenStacks; lastGroupEnd = cluster.get(cn - 1).mBottom; - float preferredStart = lastGroupEnd - - (cn - 1) * mStackedResultHeight - - mResultMinHeight; + float preferredStart = + lastGroupEnd - (cn - 1) * mStackedResultHeight - mResultMinHeight; float maxStart = cluster.get(0).mTop; float start = Math.round(MathUtils.clamp(preferredStart, minStart, maxStart)); - float scale = start >= preferredStart ? 1.0f : - (lastGroupEnd - start) / (lastGroupEnd - preferredStart); - float spacing = cn == 1 ? 0 : (lastGroupEnd - start - - scale * mResultMinHeight) / (cn - 1); + float scale = start >= preferredStart + ? 1.0f + : (lastGroupEnd - start) / (lastGroupEnd - preferredStart); + float spacing = + cn == 1 ? 0 : (lastGroupEnd - start - scale * mResultMinHeight) / (cn - 1); for (int j = 0; j < cn; j++) { Tickmark tickmark = cluster.get(j); tickmark.mTop = start + j * spacing; @@ -353,18 +343,16 @@ // Ratio of results bar height to page height float vScale = mBarHeightForWhichTickmarksWereCached - 2 * mBarVerticalPadding; Tickmark tickmark = new Tickmark( - r.top * vScale + mBarVerticalPadding, - r.bottom * vScale + mBarVerticalPadding); + r.top * vScale + mBarVerticalPadding, r.bottom * vScale + mBarVerticalPadding); return expandTickmarkToMinHeight(tickmark, active); } - private Tickmark expandTickmarkToMinHeight(Tickmark tickmark, - boolean active) { + private Tickmark expandTickmarkToMinHeight(Tickmark tickmark, boolean active) { int minHeight = active ? mActiveMinHeight : mResultMinHeight; float missingHeight = minHeight - tickmark.height(); if (missingHeight > 0) { - return new Tickmark(tickmark.mTop - missingHeight / 2.0f, - tickmark.mBottom + missingHeight / 2.0f); + return new Tickmark( + tickmark.mTop - missingHeight / 2.0f, tickmark.mBottom + missingHeight / 2.0f); } return tickmark; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java index c3eb4ad..5864b93 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.animation.Animator; import android.annotation.SuppressLint; @@ -36,9 +36,6 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; -import org.chromium.chrome.browser.findinpage.FindInPageBridge; -import org.chromium.chrome.browser.findinpage.FindMatchRectsDetails; -import org.chromium.chrome.browser.findinpage.FindNotificationDetails; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; @@ -153,8 +150,8 @@ @Override public boolean onTextContextMenuItem(int id) { if (id == android.R.id.paste) { - ClipboardManager clipboard = (ClipboardManager) getContext() - .getSystemService(Context.CLIPBOARD_SERVICE); + ClipboardManager clipboard = + (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clipData = clipboard.getPrimaryClip(); if (clipData != null) { // Convert the clip data to a simple string @@ -300,13 +297,10 @@ } @Override - public void beforeTextChanged(CharSequence s, - int start, int count, int after) { - } + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override - public void afterTextChanged(Editable s) { - } + public void afterTextChanged(Editable s) {} }); mFindQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override @@ -361,8 +355,7 @@ } // Overriden by subclasses. - protected void findResultSelected(Rect rect) { - } + protected void findResultSelected(Rect rect) {} private void hideKeyboardAndStartFinding(boolean forward) { if (mFindInPageBridge == null) return; @@ -463,18 +456,15 @@ // active match (while counting the matches), as in b/4147049. In such // cases it looks less broken to show 0 instead of -1 (as desktop does). Context context = getContext(); - String text = context.getResources().getString( - R.string.find_in_page_count, - Math.max(result.activeMatchOrdinal, 0), - result.numberOfMatches); + String text = context.getResources().getString(R.string.find_in_page_count, + Math.max(result.activeMatchOrdinal, 0), result.numberOfMatches); setStatus(text, result.numberOfMatches == 0); setPrevNextEnabled(result.numberOfMatches > 0); // The accessible version will be something like "Result 1 of 9". String accessibleText = getAccessibleStatusText( - Math.max(result.activeMatchOrdinal, 0), - result.numberOfMatches); + Math.max(result.activeMatchOrdinal, 0), result.numberOfMatches); mFindStatus.setContentDescription(accessibleText); announceStatusForAccessibility(accessibleText); @@ -482,12 +472,12 @@ if (result.numberOfMatches == 0 && result.finalUpdate && !mFindInPageBridge.getPreviousFindText().startsWith( mFindQuery.getText().toString())) { - final boolean hapticFeedbackEnabled = Settings.System.getInt( - context.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) == 1; + final boolean hapticFeedbackEnabled = + Settings.System.getInt(context.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) + == 1; if (hapticFeedbackEnabled) { - Vibrator v = (Vibrator) context.getSystemService( - Context.VIBRATOR_SERVICE); + Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); final long noResultsVibrateDurationMs = 50; v.vibrate(noResultsVibrateDurationMs); } @@ -498,9 +488,7 @@ Context context = getContext(); return (numberOfMatches > 0) ? context.getResources().getString( - R.string.accessible_find_in_page_count, - activeMatchOrdinal, - numberOfMatches) + R.string.accessible_find_in_page_count, activeMatchOrdinal, numberOfMatches) : context.getResources().getString(R.string.accessible_find_in_page_no_results); } @@ -523,8 +511,7 @@ mFindQuery.announceForAccessibility(announcementText); } }; - mHandler.postDelayed(mAccessibleAnnouncementRunnable, - ACCESSIBLE_ANNOUNCEMENT_DELAY_MILLIS); + mHandler.postDelayed(mAccessibleAnnouncementRunnable, ACCESSIBLE_ANNOUNCEMENT_DELAY_MILLIS); } /** The find toolbar's container must provide access to its TabModel. */ @@ -544,8 +531,7 @@ * Handles updating any visual elements of the find toolbar based on changes to the tab model. * @param isIncognito Whether the current tab model is incognito or not. */ - protected void updateVisualsForTabModel(boolean isIncognito) { - } + protected void updateVisualsForTabModel(boolean isIncognito) {} /** * Sets a custom ActionMode.Callback instance to the FindQuery. This lets us
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarManager.java similarity index 98% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarManager.java index 582c6dd..3682148 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarManager.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.view.ActionMode; import android.view.View;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarObserver.java similarity index 89% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarObserver.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarObserver.java index f0c0e1d..9dd31f6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarObserver.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; /** * Observer for find in page actions.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java similarity index 98% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java index 7602a33..f42ec6b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.content.Context; import android.content.res.ColorStateList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarTablet.java similarity index 96% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java rename to chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarTablet.java index d475c0d..978475a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarTablet.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -116,8 +116,9 @@ boolean makeRoom = false; float density = getContext().getResources().getDisplayMetrics().density; - if (rect != null && rect.intersects((int) (getLeft() / density), 0, - (int) (getRight() / density), (int) (getHeight() / density))) { + if (rect != null + && rect.intersects((int) (getLeft() / density), 0, (int) (getRight() / density), + (int) (getHeight() / density))) { makeRoom = true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java index 3853ce1..1b7b1ff6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java
@@ -39,10 +39,10 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; import org.chromium.chrome.browser.tabmodel.TabSelectionType; +import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.vr.VrModeObserver; import org.chromium.chrome.browser.vr.VrModuleProvider; -import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.components.embedder_support.view.ContentView; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.SelectionPopupController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java index 190147b..a0f0ab6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java
@@ -17,6 +17,8 @@ import org.chromium.chrome.browser.favicon.FaviconHelper; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.util.UrlConstants; +import org.chromium.chrome.browser.util.ViewUtils; +import org.chromium.chrome.browser.widget.RoundedIconGenerator; import org.chromium.chrome.browser.widget.TintedDrawable; import org.chromium.content_public.browser.NavigationEntry; import org.chromium.content_public.browser.NavigationHistory; @@ -34,15 +36,14 @@ * Mediattor class for navigation sheet. */ class NavigationSheetMediator { - private final Context mContext; private final ClickListener mClickListener; private final FaviconHelper mFaviconHelper; + private final RoundedIconGenerator mIconGenerator; private final int mFaviconSize; private final ModelList mModelList; private final Drawable mHistoryIcon; private NavigationHistory mHistory; - private FaviconHelper.DefaultFaviconHelper mDefaultFaviconHelper; /** * Performs an action when a navigation item is clicked. @@ -72,10 +73,10 @@ } NavigationSheetMediator(Context context, ModelList modelList, ClickListener listener) { - mContext = context; mModelList = modelList; mClickListener = listener; mFaviconHelper = new FaviconHelper(); + mIconGenerator = ViewUtils.createDefaultRoundedIconGenerator(context.getResources(), true); mFaviconSize = context.getResources().getDimensionPixelSize(R.dimen.default_favicon_size); mHistoryIcon = TintedDrawable.constructTintedDrawable( context, R.drawable.ic_history_googblue_24dp, R.color.default_icon_color); @@ -117,7 +118,6 @@ */ void clear() { mModelList.clear(); - if (mDefaultFaviconHelper != null) mDefaultFaviconHelper.clearCache(); } /** @@ -129,14 +129,9 @@ // This callback can come after the sheet is hidden (which clears modelList). // Do nothing if that happens. if (mModelList.size() == 0) return; - if (favicon == null) { - if (mDefaultFaviconHelper == null) { - mDefaultFaviconHelper = new FaviconHelper.DefaultFaviconHelper(); - } - favicon = mDefaultFaviconHelper.getDefaultFaviconBitmap(mContext, pageUrl, true); - } for (int i = 0; i < mHistory.getEntryCount(); i++) { if (TextUtils.equals(pageUrl, mHistory.getEntryAtIndex(i).getUrl())) { + if (favicon == null) favicon = mIconGenerator.generateIconForUrl(pageUrl); mModelList.get(i).model.set(ItemProperties.ICON, new BitmapDrawable(favicon)); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SafetyTipInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SafetyTipInfoBar.java index 3c83bc11..b265fb3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SafetyTipInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SafetyTipInfoBar.java
@@ -55,6 +55,7 @@ @Override public void createContent(InfoBarLayout layout) { super.createContent(layout); + layout.setIsUsingBigIcon(); layout.getMessageLayout().addDescription(mDescription); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java new file mode 100644 index 0000000..91610e9 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java
@@ -0,0 +1,98 @@ +// 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. + +package org.chromium.chrome.browser.night_mode; + +import static org.chromium.chrome.browser.preferences.ChromePreferenceManager.DARKEN_WEBSITES_ENABLED_KEY; + +import android.text.TextUtils; + +import org.chromium.base.ApplicationState; +import org.chromium.base.ApplicationStatus; +import org.chromium.base.ApplicationStatus.ApplicationStateListener; +import org.chromium.chrome.browser.preferences.ChromePreferenceManager; +import org.chromium.chrome.browser.preferences.PrefServiceBridge; + +/** + * A controller class could enable or disable web content dark mode feature based on the night mode + * and the user preference + */ +public class WebContentsDarkModeController implements ApplicationStateListener { + private NightModeStateProvider.Observer mNightModeObserver; + private ChromePreferenceManager.Observer mPreferenceObserver; + + private static WebContentsDarkModeController sController; + + private WebContentsDarkModeController() { + enableWebContentsDarkMode(shouldEnableWebContentsDarkMode()); + final int applicationState = ApplicationStatus.getStateForApplication(); + if (applicationState == ApplicationState.HAS_RUNNING_ACTIVITIES + || applicationState == ApplicationState.HAS_PAUSED_ACTIVITIES) { + start(); + } + ApplicationStatus.registerApplicationStateListener(this); + } + + /** + * @return The instance can enable or disable the feature. Call the start method to listen + * the user setting and app night mode change so that the instance can automatically apply the + * change. Call the stop method to stop the listening. + */ + public static WebContentsDarkModeController createInstance() { + if (sController == null) { + sController = new WebContentsDarkModeController(); + } + return sController; + } + + /** + * Enable or Disable web content dark mode + * @param enabled the new state of the web content dark mode + */ + private static void enableWebContentsDarkMode(boolean enabled) { + PrefServiceBridge.getInstance().setForceWebContentsDarkModeEnabled(enabled); + } + + private static boolean shouldEnableWebContentsDarkMode() { + return GlobalNightModeStateProviderHolder.getInstance().isInNightMode() + && ChromePreferenceManager.getInstance().readBoolean( + DARKEN_WEBSITES_ENABLED_KEY, false); + } + + /** + * start listening to any event can enable or disable web content dark mode + */ + private void start() { + if (mNightModeObserver != null) return; + mNightModeObserver = () -> enableWebContentsDarkMode(shouldEnableWebContentsDarkMode()); + mPreferenceObserver = (key) -> { + if (TextUtils.equals(key, DARKEN_WEBSITES_ENABLED_KEY)) { + enableWebContentsDarkMode(shouldEnableWebContentsDarkMode()); + } + }; + enableWebContentsDarkMode(shouldEnableWebContentsDarkMode()); + GlobalNightModeStateProviderHolder.getInstance().addObserver(mNightModeObserver); + ChromePreferenceManager.getInstance().addObserver(mPreferenceObserver); + } + + /** + * stop listening to any event can enable or disable web content dark mode + */ + private void stop() { + if (mNightModeObserver == null) return; + GlobalNightModeStateProviderHolder.getInstance().removeObserver(mNightModeObserver); + ChromePreferenceManager.getInstance().removeObserver(mPreferenceObserver); + mNightModeObserver = null; + mPreferenceObserver = null; + } + + @Override + public void onApplicationStateChange(int newState) { + if (newState == ApplicationState.HAS_RUNNING_ACTIVITIES) { + start(); + } else if (newState == ApplicationState.HAS_STOPPED_ACTIVITIES) { + stop(); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java index 1c0cd6a..9f45d0f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java
@@ -229,6 +229,12 @@ public static final String UI_THEME_SETTING_KEY = "ui_theme_setting"; /** + * Whether or not darken websites is enabled. + * Default value is false. + */ + public static final String DARKEN_WEBSITES_ENABLED_KEY = "darken_websites_enabled"; + + /** * Whether or not the download auto-resumption is enabled in native. * Default value is true. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java index 21efc60d..325e95f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -1107,6 +1107,14 @@ PrefServiceBridgeJni.get().setExplicitLanguageAskPromptShown(PrefServiceBridge.this, shown); } + /** + * @param enabled The value to set whether or not ForceWebContentsDarkMode is enabled. + */ + public void setForceWebContentsDarkModeEnabled(boolean enabled) { + PrefServiceBridgeJni.get().setForceWebContentsDarkModeEnabled( + PrefServiceBridge.this, enabled); + } + @VisibleForTesting public static void setInstanceForTesting(@Nullable PrefServiceBridge instanceForTesting) { sInstance = instanceForTesting; @@ -1246,5 +1254,6 @@ void setPromptForDownloadAndroid(PrefServiceBridge caller, int status); boolean getExplicitLanguageAskPromptShown(PrefServiceBridge caller); void setExplicitLanguageAskPromptShown(PrefServiceBridge caller, boolean shown); + void setForceWebContentsDarkModeEnabled(PrefServiceBridge caller, boolean enabled); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java index b50537143..171ff17f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java
@@ -8,10 +8,14 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; +import android.view.View; +import android.widget.CheckBox; +import android.widget.LinearLayout; import org.chromium.base.BuildInfo; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.night_mode.NightModeMetrics; import org.chromium.chrome.browser.preferences.themes.ThemePreferences.ThemeSetting; import org.chromium.chrome.browser.widget.RadioButtonWithDescription; @@ -27,6 +31,10 @@ extends Preference implements RadioButtonWithDescription.OnCheckedChangeListener { private @ThemeSetting int mSetting; private ArrayList<RadioButtonWithDescription> mButtons; + private boolean mDarkenWebsitesEnabled; + private CheckBox mCheckBox; + private LinearLayout mLayoutContainer; + private LinearLayout mCheckboxContainer; public RadioButtonGroupThemePreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -41,13 +49,24 @@ /** * @param setting The initial setting for this Preference */ - public void initialize(@ThemeSetting int setting) { + public void initialize(@ThemeSetting int setting, boolean darkenWebsitesEnabled) { mSetting = setting; + mDarkenWebsitesEnabled = darkenWebsitesEnabled; } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); + mCheckboxContainer = (LinearLayout) holder.findViewById(R.id.checkbox_container); + mCheckBox = (CheckBox) holder.findViewById(R.id.darken_websites); + mLayoutContainer = (LinearLayout) holder.itemView; + + mCheckboxContainer.setOnClickListener(x -> { + mCheckBox.setChecked(!mCheckBox.isChecked()); + callChangeListener(mSetting); + }); + + mCheckBox.setChecked(mDarkenWebsitesEnabled); assert ThemeSetting.NUM_ENTRIES == 3; mButtons.set(ThemeSetting.SYSTEM_DEFAULT, @@ -68,6 +87,23 @@ } mButtons.get(mSetting).setChecked(true); + positionCheckbox(); + } + + /** + * Remove and insert the checkbox to the view, based on the value of mSetting + */ + private void positionCheckbox() { + if (ChromeFeatureList.isEnabled( + ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) { + if (mSetting == ThemeSetting.SYSTEM_DEFAULT || mSetting == ThemeSetting.DARK) { + mLayoutContainer.removeView(mCheckboxContainer); + mCheckboxContainer.setVisibility(View.VISIBLE); + mLayoutContainer.addView(mCheckboxContainer, mSetting + 1); + } else { + mCheckboxContainer.setVisibility(View.GONE); + } + } } @Override @@ -78,10 +114,15 @@ break; } } + positionCheckbox(); callChangeListener(mSetting); NightModeMetrics.recordThemePreferencesChanged(mSetting); } + public boolean isDarkenWebsitesEnabled() { + return mCheckBox.isChecked(); + } + @VisibleForTesting public int getSetting() { return mSetting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java index c39a288..34d0cb1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.preferences.themes; +import static org.chromium.chrome.browser.preferences.ChromePreferenceManager.DARKEN_WEBSITES_ENABLED_KEY; import static org.chromium.chrome.browser.preferences.ChromePreferenceManager.UI_THEME_SETTING_KEY; import android.os.Build; @@ -14,6 +15,7 @@ import androidx.annotation.Nullable; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.PreferenceUtils; import org.chromium.ui.UiUtils; @@ -47,13 +49,20 @@ PreferenceUtils.addPreferencesFromResource(this, R.xml.theme_preferences); getActivity().setTitle(getResources().getString(R.string.prefs_themes)); + ChromePreferenceManager chromePreferenceManager = ChromePreferenceManager.getInstance(); RadioButtonGroupThemePreference radioButtonGroupThemePreference = (RadioButtonGroupThemePreference) findPreference(PREF_UI_THEME_PREF); radioButtonGroupThemePreference.initialize( - ChromePreferenceManager.getInstance().readInt(UI_THEME_SETTING_KEY)); + chromePreferenceManager.readInt(UI_THEME_SETTING_KEY), + chromePreferenceManager.readBoolean(DARKEN_WEBSITES_ENABLED_KEY, false)); radioButtonGroupThemePreference.setOnPreferenceChangeListener((preference, newValue) -> { + if (ChromeFeatureList.isEnabled( + ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) { + chromePreferenceManager.writeBoolean(DARKEN_WEBSITES_ENABLED_KEY, + radioButtonGroupThemePreference.isDarkenWebsitesEnabled()); + } int theme = (int) newValue; - ChromePreferenceManager.getInstance().writeInt(UI_THEME_SETTING_KEY, theme); + chromePreferenceManager.writeInt(UI_THEME_SETTING_KEY, theme); return true; }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java index 86f6566a..f34af1ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java
@@ -15,6 +15,7 @@ import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.IntentHandler; +import org.chromium.components.signin.ChromeSigninController; /** * This class provides utilities for intenting into Google Lens. @@ -22,6 +23,8 @@ public class LensUtils { private static final String LENS_CONTRACT_URI = "googleapp://lens"; private static final String LENS_BITMAP_URI_KEY = "LensBitmapUriKey"; + private static final String ACCOUNT_NAME_URI_KEY = "AccountNameUriKey"; + private static final String INCOGNITO_URI_KEY = "IncognitoUriKey"; private static final String MIN_AGSA_VERSION_FEATURE_PARAM_NAME = "minAgsaVersionName"; private static final String MIN_AGSA_VERSION_NAME_FOR_LENS_POSTCAPTURE = "8.19"; @@ -35,7 +38,8 @@ public static String getLensActivityVersionNameIfAvailable(Context context) { try { PackageManager pm = context.getPackageManager(); - Intent lensIntent = getShareWithGoogleLensIntent(Uri.EMPTY); + // No data transmission occurring so safe to assume incognito is false. + Intent lensIntent = getShareWithGoogleLensIntent(Uri.EMPTY, /* isIncognito= */ false); ComponentName lensActivity = lensIntent.resolveActivity(pm); if (lensActivity == null) return ""; PackageInfo packageInfo = pm.getPackageInfo(lensActivity.getPackageName(), 0); @@ -111,14 +115,22 @@ * Get a deeplink intent to Google Lens with an optional content provider image URI. * @param imageUri The content provider URI generated by chrome (or empty URI) * if only resolving the activity. + * @param isIncognito Whether the current tab is in incognito mode. * @return The intent to Google Lens. */ - public static Intent getShareWithGoogleLensIntent(Uri imageUri) { + public static Intent getShareWithGoogleLensIntent(Uri imageUri, boolean isIncognito) { + String signedInAccountName = ChromeSigninController.get().getSignedInAccountName(); + // If incognito do not send the account name to avoid leaking session information to Lens. + if (signedInAccountName == null || isIncognito) signedInAccountName = ""; + Uri lensUri = Uri.parse(LENS_CONTRACT_URI); if (!Uri.EMPTY.equals(imageUri)) { - lensUri = lensUri.buildUpon() - .appendQueryParameter(LENS_BITMAP_URI_KEY, imageUri.toString()) - .build(); + lensUri = + lensUri.buildUpon() + .appendQueryParameter(LENS_BITMAP_URI_KEY, imageUri.toString()) + .appendQueryParameter(ACCOUNT_NAME_URI_KEY, signedInAccountName) + .appendQueryParameter(INCOGNITO_URI_KEY, Boolean.toString(isIncognito)) + .build(); ContextUtils.getApplicationContext().grantUriPermission( IntentHandler.PACKAGE_GSA, imageUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java index 3358aca5..4f6a28ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -316,16 +316,16 @@ } /** - * Trigger the share action for the given image data. + * Generate a temporary URI for a set of JPEG bytes and provide that URI to a callback for + * sharing. * @param activity The activity used to trigger the share action. * @param jpegImageData The image data to be shared in jpeg format. * @param name When this is not null, it will share the image directly with the * {@link ComponentName} - * @param shareWithGoogleLens When this is true activate a special intent - * to Google Lens and ignore the value set in 'name'. + * @param callback A provided callback function which will act on the generated URI. */ - public static void shareImage(final Activity activity, final byte[] jpegImageData, - final ComponentName name, final boolean shareWithGoogleLens) { + public static void generateUriFromData( + final Activity activity, final byte[] jpegImageData, Callback<Uri> callback) { if (jpegImageData.length == 0) { Log.w(TAG, "Share failed -- Received image contains no data."); return; @@ -360,35 +360,53 @@ @Override protected void onPostExecute(Uri imageUri) { - if (imageUri == null) return; - - if (ApplicationStatus.getStateForApplication() - != ApplicationState.HAS_DESTROYED_ACTIVITIES) { - Intent shareIntent; - if (shareWithGoogleLens) { - shareIntent = LensUtils.getShareWithGoogleLensIntent(imageUri); - fireIntent(activity, shareIntent, true); - } else { - shareIntent = getShareImageIntent(imageUri); - if (name == null) { - if (TargetChosenReceiver.isSupported()) { - TargetChosenReceiver.sendChooserIntent( - true, activity, shareIntent, null, null); - } else { - Intent chooserIntent = Intent.createChooser(shareIntent, - activity.getString(R.string.share_link_chooser_title)); - fireIntent(activity, chooserIntent, false); - } - } else { - shareIntent.setComponent(name); - fireIntent(activity, shareIntent, false); - } - } + if (imageUri == null) { + return; } + if (ApplicationStatus.getStateForApplication() + == ApplicationState.HAS_DESTROYED_ACTIVITIES) { + return; + } + + callback.onResult(imageUri); } }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } + /** + * Share an image URI with an activity identified by the provided Component Name. + * @param activity The current activity + * @param name The component name of the activity to share the image with. + * @param imageUri The url to share with the external activity. + */ + public static void shareImage(final Activity activity, final ComponentName name, Uri imageUri) { + Intent shareIntent = getShareImageIntent(imageUri); + if (name == null) { + if (TargetChosenReceiver.isSupported()) { + TargetChosenReceiver.sendChooserIntent(true, activity, shareIntent, null, null); + } else { + Intent chooserIntent = Intent.createChooser( + shareIntent, activity.getString(R.string.share_link_chooser_title)); + fireIntent(activity, chooserIntent, false); + } + } else { + shareIntent.setComponent(name); + fireIntent(activity, shareIntent, false); + } + } + + /** + * Share an image URI with Google Lens. + * @param activity The current activity + * @param imageUri The url to share with the app. + * @param isIncognito Whether the current tab is in incognito mode. + */ + public static void shareImageWithGoogleLens( + final Activity activity, Uri imageUri, boolean isIncognito) { + Intent shareIntent = LensUtils.getShareWithGoogleLensIntent(imageUri, isIncognito); + fireIntent(activity, shareIntent, /* allowIdentification= */ true); + } + private static class ExternallyVisibleUriCallback implements Callback<String> { private Callback<Uri> mComposedCallback; ExternallyVisibleUriCallback(Callback<Uri> cb) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index 12b22e7..430d45d8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -12,7 +12,7 @@ import org.chromium.chrome.browser.lifecycle.NativeInitObserver; import org.chromium.chrome.browser.ui.ImmersiveModeManager; import org.chromium.chrome.browser.ui.RootUiCoordinator; -import org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewWrapper; +import org.chromium.chrome.browser.ui.tablet.emptybackground.EmptyBackgroundViewWrapper; import org.chromium.ui.base.DeviceFormFactor; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java index 9ef61127..4f9a103e8d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java
@@ -59,15 +59,26 @@ * Whether we should display the omnibox on the tab switcher in addition to the * tab switcher toolbar. * - * Depends on tab grid being enabled. - * * @return true if the tab switcher on return and tab grid features are both ON, else false. */ public static boolean shouldShowOmniboxOnTabSwitcher() { return ChromeFeatureList.isInitialized() && (FeatureUtilities.isGridTabSwitcherEnabled() || FeatureUtilities.isTabGroupsAndroidEnabled()) - && ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_SWITCHER_ON_RETURN); + && ChromeFeatureList.isEnabled(ChromeFeatureList.START_SURFACE_ANDROID); + } + + /** + * TODO(mattsimmons): Merge this with the one above once all the surface variations work + * correctly with mv tiles, omnibox, etc. (both should be true when != NO_START_SURFACE) + * @return Whether we show the most visited tiles on the tab switcher. + */ + public static boolean shouldShowMostVisitedOnTabSwitcher() { + return ChromeFeatureList.isInitialized() + && ChromeFeatureList + .getFieldTrialParamByFeature(ChromeFeatureList.START_SURFACE_ANDROID, + "start_surface_variation") + .equals("tasksonly"); } /** @@ -77,6 +88,8 @@ * @param transition The page transition type. * @return true if we have handled the navigation, false otherwise. */ + // TODO(mattsimmons): This needs to be updated for MV tiles to record the correct metrics. + // TODO(mattsimmons): Rename/Refactor since it's not just location bar now. public static boolean willHandleLoadUrlFromLocationBar( String url, @PageTransition int transition) { ChromeActivity chromeActivity = getActivityPresentingOverviewWithOmnibox();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ControlContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java similarity index 92% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/ControlContainer.java rename to chrome/android/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java index eb20282a..68836d17 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ControlContainer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; import android.view.View; import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler; +import org.chromium.chrome.browser.widget.ClipDrawableProgressBar; import org.chromium.ui.resources.dynamics.ViewResourceAdapter; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ProgressAnimationSmooth.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ProgressAnimationSmooth.java similarity index 78% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/ProgressAnimationSmooth.java rename to chrome/android/java/src/org/chromium/chrome/browser/toolbar/ProgressAnimationSmooth.java index 5752248..844ab9d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ProgressAnimationSmooth.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ProgressAnimationSmooth.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; /** * Progress bar animation logic that smoothly accelerates in the beginning and smoothly decelerates @@ -17,10 +17,10 @@ // Precomputed constants private static final float CONSTANT_1 = -1.0f / ACCELERATION; - private static final float CONSTANT_2 = 2.0f * DECELERATION - / ((DECELERATION + ACCELERATION) * ACCELERATION); - private static final float CONSTANT_3 = DECELERATION - / ((DECELERATION + ACCELERATION) * ACCELERATION * ACCELERATION); + private static final float CONSTANT_2 = + 2.0f * DECELERATION / ((DECELERATION + ACCELERATION) * ACCELERATION); + private static final float CONSTANT_3 = + DECELERATION / ((DECELERATION + ACCELERATION) * ACCELERATION * ACCELERATION); private float mProgress; private float mVelocity; @@ -33,8 +33,8 @@ @Override public float updateProgress(float targetProgress, float frameTimeSec, int resolution) { - final float acceleratingDuration = computeAcceleratingDuration( - targetProgress, frameTimeSec); + final float acceleratingDuration = + computeAcceleratingDuration(targetProgress, frameTimeSec); final float deceleratingDuration = frameTimeSec - acceleratingDuration; if (acceleratingDuration > 0.0f) { @@ -74,12 +74,14 @@ * * We want to stop smoothly when it reaches the end. Thus zero velocity at the end: * v_0 + A d_A - D d_D = 0 - * Equation image: http://www.HostMath.com/Show.aspx?Code=v_0%20%2B%20A%20d_A%20-%20D%20d_D%20%3D%200 + * Equation image: + * http://www.HostMath.com/Show.aspx?Code=v_0%20%2B%20A%20d_A%20-%20D%20d_D%20%3D%200 * * The traveled distance should be (targetProgress - mProgress): * targetProgress - mProgress = * \int_0^{d_A} (v_0 + A t) dt + \int_0^{d_D} (v_{0} + A d_A - D t) dt - * Equation image: http://www.HostMath.com/Show.aspx?Code=targetProgress%20-%20mProgress%20%3D%20%5Cint_0%5E%7Bd_A%7D%20(v_0%20%2B%20A%20t)%20dt%20%2B%20%5Cint_0%5E%7Bd_D%7D%20(v_%7B0%7D%20%2B%20A%20d_A%20-%20D%20t)dt + * Equation image: + * http://www.HostMath.com/Show.aspx?Code=targetProgress%20-%20mProgress%20%3D%20%5Cint_0%5E%7Bd_A%7D%20(v_0%20%2B%20A%20t)%20dt%20%2B%20%5Cint_0%5E%7Bd_D%7D%20(v_%7B0%7D%20%2B%20A%20d_A%20-%20D%20t)dt * * This function solves d_A from the above equations. */ @@ -87,8 +89,9 @@ if (targetProgress == 1.0f) { return frameTimeSec; } else { - float maxAcceleratingDuration = CONSTANT_1 * mVelocity + (float) Math.sqrt( - CONSTANT_2 * (targetProgress - mProgress) + CONSTANT_3 * mVelocity * mVelocity); + float maxAcceleratingDuration = CONSTANT_1 * mVelocity + + (float) Math.sqrt(CONSTANT_2 * (targetProgress - mProgress) + + CONSTANT_3 * mVelocity * mVelocity); return Math.max(0, Math.min(frameTimeSec, maxAcceleratingDuration)); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index b998f0c6..df5f020 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -53,6 +53,8 @@ import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.feature_engagement.ScreenshotTabObserver; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.findinpage.FindToolbarManager; +import org.chromium.chrome.browser.findinpage.FindToolbarObserver; import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenOptions; @@ -105,8 +107,6 @@ import org.chromium.chrome.browser.widget.ScrimView.ScrimObserver; import org.chromium.chrome.browser.widget.ScrimView.ScrimParams; import org.chromium.chrome.browser.widget.ViewHighlighter; -import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; -import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; import org.chromium.chrome.browser.widget.textbubble.TextBubble; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.FeatureConstants;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java rename to chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java index 778e7bab8..407760f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; import android.animation.Animator; import android.animation.AnimatorSet; @@ -28,6 +28,7 @@ import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.MathUtils; import org.chromium.chrome.browser.vr.VrModuleProvider; +import org.chromium.chrome.browser.widget.ClipDrawableProgressBar; import org.chromium.ui.UiUtils; import org.chromium.ui.interpolators.BakedBezierInterpolator; @@ -37,7 +38,6 @@ * instead of jumping. */ public class ToolbarProgressBar extends ClipDrawableProgressBar { - /** * Interface for progress bar animation interpolation logics. */ @@ -447,10 +447,10 @@ // The default toolbar has specific colors to use. if ((isDefaultTheme || !ColorUtils.isValidThemeColor(color)) && !isIncognito) { - setForegroundColor(ApiCompatibilityUtils.getColor(getResources(), - R.color.progress_bar_foreground)); - setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), - R.color.progress_bar_background)); + setForegroundColor(ApiCompatibilityUtils.getColor( + getResources(), R.color.progress_bar_foreground)); + setBackgroundColor(ApiCompatibilityUtils.getColor( + getResources(), R.color.progress_bar_background)); return; } @@ -458,20 +458,20 @@ if (mAnimatingView != null && (ColorUtils.shouldUseLightForegroundOnBackground(color) || isIncognito)) { - mAnimatingView.setColor(ColorUtils.getColorWithOverlay(color, Color.WHITE, - ANIMATION_WHITE_FRACTION)); + mAnimatingView.setColor( + ColorUtils.getColorWithOverlay(color, Color.WHITE, ANIMATION_WHITE_FRACTION)); } - setBackgroundColor(ColorUtils.getColorWithOverlay(color, Color.WHITE, - THEMED_BACKGROUND_WHITE_FRACTION)); + setBackgroundColor(ColorUtils.getColorWithOverlay( + color, Color.WHITE, THEMED_BACKGROUND_WHITE_FRACTION)); } @Override public void setForegroundColor(int color) { super.setForegroundColor(color); if (mAnimatingView != null) { - mAnimatingView.setColor(ColorUtils.getColorWithOverlay(color, Color.WHITE, - ANIMATION_WHITE_FRACTION)); + mAnimatingView.setColor( + ColorUtils.getColorWithOverlay(color, Color.WHITE, ANIMATION_WHITE_FRACTION)); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java similarity index 96% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java rename to chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java index 9255bfd..4c2fb6999 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; import android.animation.Animator; import android.animation.Animator.AnimatorListener; @@ -24,7 +24,6 @@ * current length of the progress bar only if the progress bar is static for some amount of time. */ public class ToolbarProgressBarAnimatingView extends ImageView { - /** The drawable inside this ImageView. */ private final ColorDrawable mAnimationDrawable; @@ -179,9 +178,8 @@ mAnimatorSet.start(); // Fade in to look nice on sites that trigger many loads that end quickly. - animate().alpha(1.0f) - .setDuration(500) - .setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); + animate().alpha(1.0f).setDuration(500).setInterpolator( + BakedBezierInterpolator.FADE_IN_CURVE); } } @@ -214,8 +212,8 @@ // Include the width of the animating bar in this computation so it comes from // off-screen. - float animatingWidth = Math.min(ANIMATING_VIEW_MAX_WIDTH_DP * mDpToPx, - mProgressWidth * barScale); + float animatingWidth = + Math.min(ANIMATING_VIEW_MAX_WIDTH_DP * mDpToPx, mProgressWidth * barScale); float animatorCenter = ((mProgressWidth + animatingWidth) * bezierProgress) - animatingWidth / 2.0f;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/Toolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/Toolbar.java index 1dfa4cb..0b44577 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/Toolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/Toolbar.java
@@ -8,7 +8,7 @@ import android.view.View; import android.widget.ProgressBar; -import org.chromium.chrome.browser.widget.ToolbarProgressBar; +import org.chromium.chrome.browser.toolbar.ToolbarProgressBar; /** * An interface for outside packages to interact with the top toolbar. Other than for testing
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java index 47525f1b..f8bed75 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
@@ -19,10 +19,10 @@ import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler; import org.chromium.chrome.browser.compositor.resources.ResourceFactory; import org.chromium.chrome.browser.contextualsearch.SwipeRecognizer; +import org.chromium.chrome.browser.toolbar.ControlContainer; +import org.chromium.chrome.browser.toolbar.ToolbarProgressBar; import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.DrawingInfo; -import org.chromium.chrome.browser.widget.ControlContainer; -import org.chromium.chrome.browser.widget.ToolbarProgressBar; import org.chromium.chrome.browser.widget.ViewResourceFrameLayout; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.resources.dynamics.ViewResourceAdapter; @@ -294,8 +294,9 @@ if (isOnTabStrip(e1)) return false; if (mToolbar != null && mToolbar.shouldIgnoreSwipeGesture()) return false; if (KeyboardVisibilityDelegate.getInstance().isKeyboardShowing( - getContext(), ToolbarControlContainer.this)) + getContext(), ToolbarControlContainer.this)) { return false; + } return true; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 25bed99..6ce467e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -32,6 +32,7 @@ import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.compositor.Invalidator; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; +import org.chromium.chrome.browser.findinpage.FindToolbar; import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.omnibox.LocationBar; @@ -42,11 +43,11 @@ import org.chromium.chrome.browser.toolbar.MenuButton; import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; +import org.chromium.chrome.browser.toolbar.ToolbarProgressBar; import org.chromium.chrome.browser.toolbar.ToolbarTabController; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.ViewUtils; -import org.chromium.chrome.browser.widget.ToolbarProgressBar; import org.chromium.chrome.browser.widget.textbubble.TextBubble; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.ui.UiUtils; @@ -449,7 +450,7 @@ /** * Gives inheriting classes the chance to respond to - * {@link org.chromium.chrome.browser.widget.findinpage.FindToolbar} state changes. + * {@link FindToolbar} state changes. * @param showing Whether or not the {@code FindToolbar} will be showing. */ void handleFindLocationBarStateChange(boolean showing) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 03281378..6d87c99 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.compositor.Invalidator; import org.chromium.chrome.browser.compositor.layouts.LayoutManager; +import org.chromium.chrome.browser.findinpage.FindToolbar; import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; @@ -28,8 +29,8 @@ import org.chromium.chrome.browser.toolbar.MenuButton; import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; +import org.chromium.chrome.browser.toolbar.ToolbarProgressBar; import org.chromium.chrome.browser.toolbar.ToolbarTabController; -import org.chromium.chrome.browser.widget.ToolbarProgressBar; /** * A coordinator for the top toolbar component. @@ -226,7 +227,7 @@ /** * Gives inheriting classes the chance to respond to - * {@link org.chromium.chrome.browser.widget.findinpage.FindToolbar} state changes. + * {@link FindToolbar} state changes. * @param showing Whether or not the {@code FindToolbar} will be showing. */ public void handleFindLocationBarStateChange(boolean showing) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index e811cee..9d2dd23a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -21,13 +21,13 @@ import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.chrome.browser.findinpage.FindToolbarManager; +import org.chromium.chrome.browser.findinpage.FindToolbarObserver; import org.chromium.chrome.browser.lifecycle.Destroyable; import org.chromium.chrome.browser.lifecycle.InflationObserver; import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator; import org.chromium.chrome.browser.vr.VrModeObserver; import org.chromium.chrome.browser.vr.VrModuleProvider; -import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; -import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; import org.chromium.ui.base.DeviceFormFactor; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewTablet.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java rename to chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewTablet.java index a9c4a7d..9387d70 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewTablet.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.emptybackground; +package org.chromium.chrome.browser.ui.tablet.emptybackground; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -20,7 +20,7 @@ import org.chromium.chrome.browser.appmenu.AppMenuHandler; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.widget.incognitotoggle.IncognitoToggleButtonTablet; +import org.chromium.chrome.browser.ui.tablet.emptybackground.incognitotoggle.IncognitoToggleButtonTablet; import org.chromium.ui.KeyboardVisibilityDelegate; /** @@ -120,8 +120,8 @@ } private void buildAnimatorSets() { - TypedArray a = getContext().getTheme().obtainStyledAttributes(R.style.ToolbarButton, - new int[] {android.R.attr.layout_height}); + TypedArray a = getContext().getTheme().obtainStyledAttributes( + R.style.ToolbarButton, new int[] {android.R.attr.layout_height}); int viewHeight = a.getDimensionPixelSize(0, 0); a.recycle(); View view = findViewById(R.id.empty_layout_button_container);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java similarity index 96% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java rename to chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java index e51c095d..99d926c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.emptybackground; +package org.chromium.chrome.browser.ui.tablet.emptybackground; import android.app.Activity; import android.view.View; @@ -142,7 +142,8 @@ if (mBackgroundView != null) return; mBackgroundView = (EmptyBackgroundViewTablet) ((ViewStub) mActivity.findViewById( - R.id.empty_container_stub)).inflate(); + R.id.empty_container_stub)) + .inflate(); mBackgroundView.setTabModelSelector(mTabModelSelector); mBackgroundView.setTabCreator(mTabCreator); if (mMenuHandler != null) mBackgroundView.setMenuOnTouchListener(mMenuHandler); @@ -153,8 +154,7 @@ } @Override - public void onViewAttachedToWindow(View v) { - } + public void onViewAttachedToWindow(View v) {} }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java similarity index 97% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java rename to chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java index 8771680e4..62adb98 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.incognitotoggle; +package org.chromium.chrome.browser.ui.tablet.emptybackground.incognitotoggle; import android.content.Context; import android.support.v7.content.res.AppCompatResources;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButtonTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButtonTablet.java rename to chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java index 10a41db..910d02a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButtonTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget.incognitotoggle; +package org.chromium.chrome.browser.ui.tablet.emptybackground.incognitotoggle; import android.content.Context; import android.util.AttributeSet; @@ -99,8 +99,8 @@ post(new Runnable() { @Override public void run() { - setVisibility(mTabModelSelector.getModel(true).getCount() > 0 - ? View.VISIBLE : View.GONE); + setVisibility( + mTabModelSelector.getModel(true).getCount() > 0 ? View.VISIBLE : View.GONE); } }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java index 1cf5758..a8134ceb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java
@@ -37,7 +37,7 @@ * An observer for visible progress updates. */ @VisibleForTesting - interface ProgressBarObserver { + public interface ProgressBarObserver { /** * A notification that the visible progress has been updated. This may not coincide with * updates from the web page due to animations for the progress bar running. @@ -89,7 +89,7 @@ * @param observer An update observer for the progress bar. */ @VisibleForTesting - void setProgressBarObserver(ProgressBarObserver observer) { + public void setProgressBarObserver(ProgressBarObserver observer) { assert mProgressBarObserver == null; mProgressBarObserver = observer; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java index f578d51..e5912586 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java
@@ -60,7 +60,11 @@ R.dimen.radio_button_with_description_lateral_padding); final int verticalPadding = getResources().getDimensionPixelSize( R.dimen.radio_button_with_description_vertical_padding); - setPaddingRelative(lateralPadding, verticalPadding, lateralPadding, verticalPadding); + // allow override + setPaddingRelative(getPaddingStart() == 0 ? lateralPadding : getPaddingStart(), + getPaddingTop() == 0 ? verticalPadding : getPaddingTop(), + getPaddingEnd() == 0 ? lateralPadding : getPaddingEnd(), + getPaddingBottom() == 0 ? verticalPadding : getPaddingBottom()); // We want RadioButtonWithDescription to handle the clicks itself. setOnClickListener(this);
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index fef95bd..65cdddc2 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -715,6 +715,9 @@ <message name="IDS_THEMES_SYSTEM_DEFAULT_SUMMARY_API_29" desc="Summary for the System Default option (Android Q+)."> Turn on dark theme when your device's dark theme or Battery Saver is on </message> + <message name="IDS_DARKEN_WEBSITES" desc="Title for the Darken websites option. [CHAR-LIMIT=32]"> + Darken websites + </message> <!-- Privacy preferences --> <message name="IDS_PREFS_PRIVACY" desc="Title for the Privacy preferences. [CHAR-LIMIT=32]"> @@ -2408,12 +2411,6 @@ <message name="IDS_PREFETCH_BADGE_NEW" desc="Message on download home to show that there are new prefetched contents"> New </message> - <message name="IDS_DOWNLOAD_SUCCEEDED_MESSAGE" desc="App-based transient message shown when a file download has succeeded." meaning="Android"> - <ph name="FILE_NAME">%1$s<ex>http://abc.com/test.pdf</ex></ph> downloaded in <ph name="PRODUCT_NAME">%2$s<ex>Chrome</ex></ph> - </message> - <message name="IDS_DOWNLOAD_SUCCEEDED_MESSAGE_DEFAULT" desc="Transient message shown when a file download has succeeded." meaning="Android"> - <ph name="FILE_NAME">%1$s<ex>http://abc.com/test.pdf</ex></ph> downloaded - </message> <message name="IDS_FILE_SIZE_DOWNLOADED_KB" desc="Notification message showing how many KBs have been downloaded."> Downloaded <ph name="KBS">%1$.1f<ex>10.1</ex></ph> KB </message>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb index e330cda..3e9bae8f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">সব খুলুন</translation> <translation id="1409426117486808224">খোলা ট্যাবের জন্য সরলীকৃত ভিউ</translation> <translation id="1409879593029778104">ফাইল ইতিমধ্যেই থাকায় <ph name="FILE_NAME" /> ডাউনলোড আটকানো হয়েছে।</translation> +<translation id="1413136574162415971">আপনার পাসওয়ার্ড কোনও ডেটার নিরাপত্তা লঙ্ঘনের অংশ ছিল কিনা তা Google যাচাই করতে পারে। আপনার Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করে সিঙ্ক চালু করলেই এটি চালু হয়ে যাবে।</translation> <translation id="1414981605391750300">Google এর সাথে যোগাযোগ করা হচ্ছে। এতে একটু সময় লাগবে…</translation> <translation id="1416550906796893042">অ্যাপ্লিকেশন ভার্সন</translation> <translation id="1430915738399379752">প্রিন্ট</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">আওয়াজ</translation> <translation id="2096012225669085171">বিভিন্ন ডিভাইস জুড়ে সিঙ্ক এবং ব্যক্তিগতকৃত করুন</translation> <translation id="2100273922101894616">অটো সাইন-ইন</translation> +<translation id="2100314319871056947">টেক্সটটি ছোট ছোট ভাগে ভাগ করে পাঠানোর চেষ্টা করুন</translation> <translation id="2107397443965016585">সাইটকে সুরক্ষিত কন্টেন্ট চালানোর অনুমতি দেওয়ার আগে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation> <translation id="2111511281910874386">এই পৃষ্ঠাতে যান</translation> <translation id="2122601567107267586">অ্যাপটি খোলা যায়নি</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">পূর্ণ স্ক্রিন থেকে বেরিয়ে যেতে পিছনে ফেরার বোতাম স্পর্শ করুন।</translation> <translation id="2842985007712546952">অভিভাবক ফোল্ডার</translation> <translation id="2858138569776157458">সেরা সাইট</translation> +<translation id="2860954141821109167">এই ডিভাইসে ফোন অ্যাপ চালু করা আছে কিনা দেখে নিন</translation> <translation id="2870560284913253234">সাইট</translation> <translation id="2874939134665556319">পূর্ববর্তী ট্র্যাক</translation> <translation id="2876369937070532032">নিরাপত্তা সংক্রান্ত কোনও ঝুঁকি থাকলে, আপনার দেখা কিছু পৃষ্ঠার ইউআরএল Google-কে পাঠায়</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">পাসফ্রেজ তৈরি করুন</translation> <translation id="2996809686854298943">URL প্রয়োজন</translation> <translation id="300526633675317032">এটা ওয়েবসাইট স্টোরেজের <ph name="SIZE_IN_KB" />-এর পুরোটা সাফ করবে।</translation> +<translation id="3016635187733453316">এই ডিভাইসটি ইন্টারনেটে কানেক্ট করা আছে কিনা দেখে নিন</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB ডাউনলোড হয়েছে</translation> <translation id="3029704984691124060">পাসফ্রেজসমূহ মেলে না</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />সহায়তা পান<ph name="END_LINK" /></translation> @@ -843,6 +847,7 @@ <translation id="723171743924126238">ছবি বেছে নিন</translation> <translation id="7233236755231902816">ওয়েবের কন্টেন্ট নিজের ভাষায় পড়তে, Chrome-এর লেটেস্ট ভার্সন ইনস্টল করুন</translation> <translation id="7243308994586599757">স্ক্রীনের প্রায় নীচের দিকে বিকল্পগুলি উপলব্ধ</translation> +<translation id="7248069434667874558">Chrome-এ <ph name="TARGET_DEVICE_NAME" /> সিঙ্ক করার ফিচার চালু করে রেখেছেন কিনা দেখে নিন।</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />টি বেছে নেওয়া হয়েছে</translation> <translation id="7274013316676448362">অবরুদ্ধ সাইট</translation> <translation id="7290209999329137901">আবার নামকরণের বিকল্পটি উপলভ্য নেই</translation> @@ -957,6 +962,7 @@ <translation id="8007176423574883786">এই ডিভাইসের জন্য বন্ধ করা আছে</translation> <translation id="8013372441983637696">এছাড়া এই ডিভাইস থেকে Chrome ডেটা সরিয়ে ফেলুন</translation> <translation id="8015452622527143194">পৃষ্ঠার সবকিছুকে ডিফল্ট আকারে ফিরিয়ে আনুন</translation> +<translation id="8015780634880457457">আপনার পাসওয়ার্ড কোনও ডেটার নিরাপত্তা লঙ্ঘনের অংশ ছিল কিনা তা Google যাচাই করতে পারে</translation> <translation id="802154636333426148">ডাউনলোড করা যায়নি</translation> <translation id="8026334261755873520">ব্রাউজ করা ডেটা সাফ করুন</translation> <translation id="8035133914807600019">নতুন ফোল্ডার...</translation> @@ -1019,6 +1025,7 @@ <translation id="8445448999790540984">পাসওয়ার্ড এক্সপোর্ট করা যাচ্ছে না</translation> <translation id="8447861592752582886">ডিভাইসের অনুমতি প্রত্যাহার করুন</translation> <translation id="8461694314515752532">আপনার নিজস্ব সিঙ্ক পাসফ্রেজ দিয়ে সিঙ্ক করা ডেটা এনক্রিপ্ট করুন</translation> +<translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> ডিভাইসটি ইন্টারনেটের সাথে কানেক্ট করা আছে কিনা দেখে নিন</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">অফলাইনে উপলব্ধ</translation> <translation id="8489271220582375723">ইতিহাস পৃষ্ঠাটি খুলুন</translation> @@ -1109,6 +1116,7 @@ <translation id="9188680907066685419">ম্যানেজ করা অ্যাকাউন্ট থেকে সাইন-আউট করুন</translation> <translation id="9204836675896933765">১টি ফাইল বাকি</translation> <translation id="9206873250291191720">আ</translation> +<translation id="9209888181064652401">কল করা যাচ্ছে না</translation> <translation id="9219103736887031265">ছবিগুলি</translation> <translation id="926205370408745186">ডিজিটাল ওয়েলবিং থেকে আপনার Chrome অ্যাক্টিভিটি সরিয়ে দিন</translation> <translation id="932327136139879170">হোম</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 48ec6d1c..7d23464c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -579,7 +579,7 @@ <translation id="5324858694974489420">Mga Setting para sa Magulang</translation> <translation id="5327248766486351172">Pangalan</translation> <translation id="5335288049665977812">Payagan ang mga site na magpatakbo ng JavaScript (inirerekomenda)</translation> -<translation id="5342314432463739672">Mga kahilingan ng pahintulot</translation> +<translation id="5342314432463739672">Mga kahilingan sa pahintulot</translation> <translation id="5357811892247919462">Natanggap ang tab</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> nakabukas na tab, i-tap para lumipat ng tab}one{<ph name="OPEN_TABS_MANY" /> nakabukas na tab, i-tap para lumipat ng tab}other{<ph name="OPEN_TABS_MANY" /> na nakabukas na tab, i-tap para lumipat ng tab}}</translation> <translation id="5391532827096253100">Hindi secure ang iyong koneksyon sa site na ito. Impormasyon ng site</translation> @@ -749,7 +749,7 @@ <translation id="6532866250404780454">Hindi lalabas ang mga site na binibisita mo sa Chrome. Ide-delete ang lahat ng timer sa site.</translation> <translation id="6534565668554028783">Masyadong matagal bago nakatugon ang Google</translation> <translation id="6538442820324228105"><ph name="GBS" /> GB ang na-download</translation> -<translation id="6539092367496845964">Nagkaproblema. Subukang muli sa ibang pagkakataon.</translation> +<translation id="6539092367496845964">Nagkaproblema. Subukan ulit sa ibang pagkakataon.</translation> <translation id="654446541061731451">Pumili ng tab upang mag-beam</translation> <translation id="6545017243486555795">I-clear ang Lahat ng Data</translation> <translation id="6545864417968258051">Pag-scan ng Bluetooth</translation> @@ -880,7 +880,7 @@ <translation id="7493994139787901920"><ph name="VERSION" /> (Na-update <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7494974237137038751">natipid na data</translation> <translation id="7498271377022651285">Mangyaring maghintay…</translation> -<translation id="7510943789645525906">Nagbibigay sa iyo ng babala kung ang isang password na ginamit mo ay bahagi ng paglabag sa data</translation> +<translation id="7510943789645525906">Nagbibigay sa iyo ng babala kung ang isang password na ginagamit mo ay bahagi ng isang paglabag sa data</translation> <translation id="7514365320538308">I-download</translation> <translation id="751961395872307827">Hindi makakonekta sa site</translation> <translation id="7521387064766892559">JavaScript</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb index 9f05695..17c89ce 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">બધું ખોલો</translation> <translation id="1409426117486808224">ખુલ્લી ટૅબ માટે સરળ દૃશ્ય</translation> <translation id="1409879593029778104"><ph name="FILE_NAME" /> ડાઉનલોડ રોકાયું કારણકે ફાઇલ પહેલેથી અસ્તિત્વ ધરાવે છે.</translation> +<translation id="1413136574162415971">Google તમારા પાસવર્ડ ડેટા ઉલ્લંઘનનો ભાગ હતો કે નહીં તે ચેક કરી શકે છે. જ્યારે તમે તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરશો અને સિંક ચાલુ કરેલું હોય ત્યારે આ ચાલુ થશે.</translation> <translation id="1414981605391750300">Googleનો સંપર્ક કરી રહ્યાં છીએ. આમાં એક મિનિટ લાગી શકે છે…</translation> <translation id="1416550906796893042">ઍપ્લિકેશન વર્ઝન</translation> <translation id="1430915738399379752">પ્રિન્ટ</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">ધ્વનિ</translation> <translation id="2096012225669085171">સમગ્ર ઉપકરણો પર સિંક કરો અને વ્યક્તિગત બનાવો</translation> <translation id="2100273922101894616">સ્વતઃ સાઇન-ઇન</translation> +<translation id="2100314319871056947">ટેક્સ્ટને નાના-નાના ટૂકડામાં શેર કરી જુઓ</translation> <translation id="2107397443965016585">સાઇટને સંરક્ષિત કન્ટેન્ટ ચલાવવાની મંજૂરી આપતા પહેલાંં પૂછો (સુઝાવ આપેલ)</translation> <translation id="2111511281910874386">પૃષ્ઠ પર જાઓ</translation> <translation id="2122601567107267586">ઍપ ખોલી ન શક્યાં</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">પૂર્ણ સ્ક્રીનથી બહાર નીકળવા માટે પાછળ બટન ટચ કરો.</translation> <translation id="2842985007712546952">પેરન્ટ ફોલ્ડર</translation> <translation id="2858138569776157458">લોકપ્રિય સાઇટ</translation> +<translation id="2860954141821109167">ખાતરી કરો કે આ ડિવાઇસ પર ફોન ઍપ ચાલુ કરેલી છે</translation> <translation id="2870560284913253234">સાઇટ</translation> <translation id="2874939134665556319">પાછલું ટ્રૅક</translation> <translation id="2876369937070532032">તમારી સુરક્ષા જોખમમાં હોય ત્યારે, તમે મુલાકાત લેતા હો તે કેટલાક પેજના URLs Googleને મોકલે છે</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">પાસફ્રેઝ બનાવો</translation> <translation id="2996809686854298943">URL આવશ્યક છે</translation> <translation id="300526633675317032">આ <ph name="SIZE_IN_KB" /> નું બધું વેબસાઇટ સ્ટોરેજ સાફ કરશે.</translation> +<translation id="3016635187733453316">ખાતરી કરો કે આ ડિવાઇસ ઇન્ટરનેટ સાથે કનેક્ટ કરેલું છે</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB ડાઉનલોડ કર્યા</translation> <translation id="3029704984691124060">પાસફ્રેઝેસ મેળ ખાતા નથી</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />સહાય મેળવો<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">છબીઓ પસંદ કરો</translation> <translation id="7233236755231902816">વેબ તમારી ભાષામાં જોવા માટે Chromeનું એકદમ નવું વર્ઝન મેળવો</translation> <translation id="7243308994586599757">સ્ક્રીનના તળિયા નજીક વિકલ્પો ઉપલબ્ધ છે</translation> +<translation id="7248069434667874558">ખાતરી કરો કે <ph name="TARGET_DEVICE_NAME" />માં Chromeમાં સિંક ચાલુ કરેલું છે</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />ની પસંદગી કરી</translation> <translation id="7274013316676448362">અવરોધિત સાઇટ</translation> <translation id="7290209999329137901">નામ બદલવું ઉપલબ્ધ નથી</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">આ ઉપકરણ માટે બંધ કર્યું</translation> <translation id="8013372441983637696">આ ડિવાઇસમાંથી તમારો Chrome ડેટા પણ સાફ કરો</translation> <translation id="8015452622527143194">પેજ પરનું બધું કન્ટેન્ટ પાછું ડિફૉલ્ટ કદમાં બદલો</translation> +<translation id="8015780634880457457">Google તમારા પાસવર્ડ ડેટા ઉલ્લંઘનનો ભાગ હતો કે નહીં તે ચેક કરી શકે છે</translation> <translation id="802154636333426148">ડાઉનલોડ નિષ્ફળ થયું</translation> <translation id="8026334261755873520">બ્રાઉઝિંગ ડેટા સાફ કરો</translation> <translation id="8035133914807600019">નવું ફોલ્ડર...</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">બધા પાસવર્ડ નિકાસ કરી શકાતાં નથી</translation> <translation id="8447861592752582886">ઉપકરણની પરવાનગી રદબાતલ કરો</translation> <translation id="8461694314515752532">તમારા પોતાના સિંક પાસફ્રેઝ સાથે સિંક કરેલા ડેટાને એન્ક્રિપ્ટ કરો</translation> +<translation id="8466613982764129868">ખાતરી કરો કે <ph name="TARGET_DEVICE_NAME" />ને ઇન્ટરનેટ સાથે કનેક્ટ કરેલું છે</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">ઑફલાઇન ઉપલબ્ધ</translation> <translation id="8489271220582375723">ઇતિહાસ પૃષ્ઠ ખોલો</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">સંચાલિત એકાઉન્ટમાંથી સાઇન આઉટ કરો</translation> <translation id="9204836675896933765">1 ફાઇલ બાકી છે</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">કૉલ કરી શકતા નથી</translation> <translation id="9219103736887031265">છબીઓ</translation> <translation id="926205370408745186">ડિજિટલ લાઇફસ્ટાઇલમાંથી તમારી Chromeની પ્રવૃત્તિને કેવી રીતે કાઢવી</translation> <translation id="932327136139879170">હોમ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index fe08535..5ce8019 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Buka semua</translation> <translation id="1409426117486808224">Tampilan sederhana untuk tab yang terbuka</translation> <translation id="1409879593029778104">Download <ph name="FILE_NAME" /> dicegah karena file sudah ada.</translation> +<translation id="1413136574162415971">Google dapat memeriksa apakah sandi Anda pernah bocor saat terjadi pelanggaran data. Fitur ini akan diaktifkan ketika Anda login dengan Akun Google dan mengaktifkan sinkronisasi.</translation> <translation id="1414981605391750300">Menghubungi Google. Tindakan ini memerlukan waktu beberapa saat…</translation> <translation id="1416550906796893042">Versi aplikasi</translation> <translation id="1430915738399379752">Cetak</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Suara</translation> <translation id="2096012225669085171">Sinkronkan dan personalisasi di berbagai perangkat</translation> <translation id="2100273922101894616">Login Otomatis</translation> +<translation id="2100314319871056947">Coba bagikan teks dalam potongan yang lebih kecil</translation> <translation id="2107397443965016585">Tanyakan sebelum mengizinkan situs memutar konten yang dilindungi (direkomendasikan)</translation> <translation id="2111511281910874386">Buka halaman</translation> <translation id="2122601567107267586">Tidak dapat membuka aplikasi</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Ketuk tombol kembali untuk keluar dari mode layar penuh.</translation> <translation id="2842985007712546952">Folder induk</translation> <translation id="2858138569776157458">Situs populer</translation> +<translation id="2860954141821109167">Pastikan aplikasi telepon diaktifkan di perangkat ini</translation> <translation id="2870560284913253234">Situs</translation> <translation id="2874939134665556319">Lagu sebelumnya</translation> <translation id="2876369937070532032">Mengirimkan URL beberapa halaman yang Anda kunjungi ke Google, jika keamanan Anda berisiko</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Buat frasa sandi</translation> <translation id="2996809686854298943">Perlu URL</translation> <translation id="300526633675317032">Ini akan menghapus seluruh penyimpanan situs web, sebesar <ph name="SIZE_IN_KB" />.</translation> +<translation id="3016635187733453316">Pastikan perangkat ini tersambung ke internet</translation> <translation id="3029613699374795922">Terdownload <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Frasa sandi tidak cocok</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Dapatkan bantuan<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">Pilih gambar</translation> <translation id="7233236755231902816">Untuk melihat web dalam bahasa Anda, dapatkan versi terbaru Chrome</translation> <translation id="7243308994586599757">Opsi terdapat di dekat bagian bawah layar</translation> +<translation id="7248069434667874558">Pastikan <ph name="TARGET_DEVICE_NAME" /> telah mengaktifkan sinkronisasi di Chrome</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</translation> <translation id="7274013316676448362">Situs yang diblokir</translation> <translation id="7290209999329137901">Ganti nama tidak tersedia</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">Dinonaktifkan untuk perangkat ini</translation> <translation id="8013372441983637696">Hapus juga data Chrome Anda dari perangkat ini</translation> <translation id="8015452622527143194">Mengembalikan semua di halaman ke ukuran default</translation> +<translation id="8015780634880457457">Google dapat memeriksa apakah sandi Anda pernah bocor saat terjadi pelanggaran data.</translation> <translation id="802154636333426148">Download gagal</translation> <translation id="8026334261755873520">Hapus data penjelajahan</translation> <translation id="8035133914807600019">Folder baru…</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">Tidak dapat mengekspor sandi</translation> <translation id="8447861592752582886">Cabut izin perangkat</translation> <translation id="8461694314515752532">Enkripsikan data yang disinkronkan dengan frasa sandi sinkronisasi Anda sendiri</translation> +<translation id="8466613982764129868">Pastikan <ph name="TARGET_DEVICE_NAME" /> tersambung ke internet</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Tersedia secara offline</translation> <translation id="8489271220582375723">Membuka halaman histori</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">Keluar dari akun yang dikelola</translation> <translation id="9204836675896933765">1 file tersisa</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Tidak dapat menelepon</translation> <translation id="9219103736887031265">Gambar</translation> <translation id="926205370408745186">Hapus aktivitas Chrome Anda dari Kesehatan Digital</translation> <translation id="932327136139879170">Beranda</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb index a4f167a..e549ab0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -65,6 +65,7 @@ <translation id="1407135791313364759">എല്ലാം തുറക്കുക</translation> <translation id="1409426117486808224">തുറന്ന ടാബുകൾക്കായി ലളിതവൽക്കരിച്ച കാഴ്ച</translation> <translation id="1409879593029778104">ഫയൽ ഇതിനകം തന്നെ ഉള്ളതിനാൽ <ph name="FILE_NAME" /> ഡൗൺലോഡ് തടഞ്ഞു.</translation> +<translation id="1413136574162415971">നിങ്ങളുടെ പാസ്വേഡുകൾ ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായിട്ടുണ്ടോയെന്ന് പരിശോധിക്കാൻ Google-ന് കഴിയും. നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത് സമന്വയിപ്പിക്കൽ ഓണാക്കുമ്പോൾ ഇത് ഓണാകും.</translation> <translation id="1414981605391750300">Google-നെ ബന്ധപ്പെടുന്നു. ഇതിന് ഒരു മിനിറ്റ് എടുത്തേക്കാം…</translation> <translation id="1416550906796893042">ആപ്പ് പതിപ്പ്</translation> <translation id="1430915738399379752">അച്ചടിക്കുക</translation> @@ -157,6 +158,7 @@ <translation id="2091887806945687916">ശബ്ദം</translation> <translation id="2096012225669085171">ഉപകരണങ്ങളിലുടനീളം സമന്വയിപ്പിക്കലും വ്യക്തിപരമാക്കലും നടത്തുക.</translation> <translation id="2100273922101894616">സ്വയമേവയുള്ള സൈൻ ഇൻ</translation> +<translation id="2100314319871056947">ചെറിയ ഭാഗങ്ങളായി ടെക്സ്റ്റ് പങ്കിടാൻ ശ്രമിക്കൂ</translation> <translation id="2107397443965016585">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുന്നതിന് മുമ്പ് ചോദിക്കുക (ശുപാർശചെയ്തത്)</translation> <translation id="2111511281910874386">പേജിലേക്ക് പോകുക</translation> <translation id="2122601567107267586">ആപ്പ് തുറക്കാനായില്ല</translation> @@ -250,6 +252,7 @@ <translation id="2836148919159985482">പൂർണസ്ക്രീനിൽനിന്ന് പുറത്തുകടക്കാൻ ബാക്ക് ബട്ടണിൽ സ്പർശിക്കുക.</translation> <translation id="2842985007712546952">പാരന്റ് ഫോൾഡർ</translation> <translation id="2858138569776157458">മികച്ച സൈറ്റുകൾ</translation> +<translation id="2860954141821109167">ഈ ഉപകരണത്തിൽ ഫോൺ ആപ്പ് പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="2870560284913253234">സൈറ്റ്</translation> <translation id="2874939134665556319">മുമ്പത്തെ ട്രാക്ക്</translation> <translation id="2876369937070532032">നിങ്ങളുടെ സുരക്ഷ അപകടത്തിലാകുമ്പോൾ നിങ്ങൾ സന്ദർശിക്കുന്ന ചില പേജുകളുടെ URL-കൾ Google-ലേക്ക് അയയ്ക്കുന്നു</translation> @@ -274,6 +277,7 @@ <translation id="2996291259634659425">പാസ്ഫ്രെയ്സ് സൃഷ്ടിക്കുക</translation> <translation id="2996809686854298943">URL ആവശ്യമാണ്</translation> <translation id="300526633675317032">ഇത് വെബ്സൈറ്റ് സ്റ്റോറേജിലെ <ph name="SIZE_IN_KB" /> പൂർണ്ണമായും മായ്ക്കും.</translation> +<translation id="3016635187733453316">ഈ ഉപകരണം ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB ഡൗൺലോഡ് ചെയ്തു</translation> <translation id="3029704984691124060">പാസ്ഫ്രെയ്സുകൾ പൊരുത്തപ്പെടുന്നില്ല</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />സഹായം തേടുക<ph name="END_LINK" /></translation> @@ -834,6 +838,7 @@ <translation id="723171743924126238">ചിത്രങ്ങൾ തിരഞ്ഞെടുക്കുക</translation> <translation id="7233236755231902816">നിങ്ങളുടെ ഭാഷയിൽ വെബ് കാണാൻ Chrome-ൻ്റെ ഏറ്റവും പുതിയ പതിപ്പ് നേടൂ</translation> <translation id="7243308994586599757">സ്ക്രീനിന്റെ ചുവടെ ഓപ്ഷനുകൾ ലഭ്യമാണ്</translation> +<translation id="7248069434667874558">Chrome-ൽ <ph name="TARGET_DEVICE_NAME" /> ഉപകരണത്തിലെ സമന്വയിപ്പിക്കൽ ഓണാക്കിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> എണ്ണം തിരഞ്ഞെടുത്തു</translation> <translation id="7274013316676448362">സൈറ്റ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7290209999329137901">പേര് മാറ്റൽ ലഭ്യമല്ല</translation> @@ -947,6 +952,7 @@ <translation id="8007176423574883786">ഈ ഉപകരണത്തിനായി ഓഫാക്കി</translation> <translation id="8013372441983637696">കൂടാതെ ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome ഡാറ്റ മായ്ക്കുക</translation> <translation id="8015452622527143194">പേജിലുള്ളതെല്ലാം ഡിഫോൾട്ട് വലുപ്പത്തിലേക്ക് മാറ്റുക</translation> +<translation id="8015780634880457457">നിങ്ങളുടെ പാസ്വേഡുകൾ ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായിട്ടുണ്ടോയെന്ന് പരിശോധിക്കാൻ Google-ന് കഴിയും</translation> <translation id="802154636333426148">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> <translation id="8026334261755873520">ബ്രൌസിംഗ് ഡാറ്റ മായ്ക്കുക</translation> <translation id="8035133914807600019">പുതിയ ഫോൾഡർ…</translation> @@ -1009,6 +1015,7 @@ <translation id="8445448999790540984">പാസ്വേഡുകൾ എക്സ്പോർട്ട് ചെയ്യാനാവുന്നില്ല</translation> <translation id="8447861592752582886">ഉപകരണ അനുമതി റദ്ദാക്കുക</translation> <translation id="8461694314515752532">നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് ഉപയോഗിച്ച്, സമന്വയിപ്പിച്ച ഡാറ്റ എൻക്രിപ്റ്റ് ചെയ്യുക</translation> +<translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> ഉപകരണം ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">ഓഫ്ലൈനില് ലഭ്യമാണ്</translation> <translation id="8489271220582375723">ചരിത്ര പേജ് തുറക്കുക</translation> @@ -1099,6 +1106,7 @@ <translation id="9188680907066685419">മാനേജ് ചെയ്ത അക്കൗണ്ടിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുക</translation> <translation id="9204836675896933765">ഒരു ഫയൽ ശേഷിക്കുന്നു</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">കോളുകൾ വിളിക്കാനാവില്ല</translation> <translation id="9219103736887031265">ചിത്രങ്ങൾ</translation> <translation id="926205370408745186">ഡിജിറ്റൽ ആരോഗ്യത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome ആക്റ്റിവിറ്റി നീക്കം ചെയ്യുക</translation> <translation id="932327136139879170">ഹോം</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index f0f87da..4c077c7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Åpne alle</translation> <translation id="1409426117486808224">Forenklet visning for åpne faner</translation> <translation id="1409879593029778104">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt fordi filen finnes allerede.</translation> +<translation id="1413136574162415971">Google kan sjekke om passordene dine har vært en del av et databrudd. Dette blir slått på når du logger på med Google-kontoen din og slår på synkronisering.</translation> <translation id="1414981605391750300">Kontakter Google. Dette kan ta en liten stund.</translation> <translation id="1416550906796893042">Programversjon</translation> <translation id="1430915738399379752">Skriv ut</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Lyd</translation> <translation id="2096012225669085171">Synkronisering og personlig tilpasning på alle enheter</translation> <translation id="2100273922101894616">Automatisk pålogging</translation> +<translation id="2100314319871056947">Prøv å dele teksten i mindre deler</translation> <translation id="2107397443965016585">Spør før nettsteder får tillatelse til å spille beskyttet innhold (anbefalt)</translation> <translation id="2111511281910874386">Gå til side</translation> <translation id="2122601567107267586">Kunne ikke åpne appen</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Trykk på tilbakeknappen for å avslutte fullskjerm.</translation> <translation id="2842985007712546952">Overordnet mappe</translation> <translation id="2858138569776157458">Populært</translation> +<translation id="2860954141821109167">Kontrollér at en telefon-app er påslått på denne enheten</translation> <translation id="2870560284913253234">Nettsted</translation> <translation id="2874939134665556319">Forrige spor</translation> <translation id="2876369937070532032">Sender Google nettadressene til noen av sidene du besøker, når sikkerheten din står i fare</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Opprett en passordfrase</translation> <translation id="2996809686854298943">Nettadresse kreves</translation> <translation id="300526633675317032">Dette sletter alle dataene (<ph name="SIZE_IN_KB" />) fra nettstedslagringen.</translation> +<translation id="3016635187733453316">Kontrollér at enheten er koblet til internett</translation> <translation id="3029613699374795922"><ph name="KBS" /> kB er lastet ned</translation> <translation id="3029704984691124060">Passordfrasene stemmer ikke overens</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">Velg bilder</translation> <translation id="7233236755231902816">For å se nettet på ditt eget språk, skaff den nyeste versjonen av Chrome</translation> <translation id="7243308994586599757">Du finner alternativer ved bunnen av skjermen</translation> +<translation id="7248069434667874558">Kontrollér at <ph name="TARGET_DEVICE_NAME" /> har synkronisering påslått i Chrome</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er valgt</translation> <translation id="7274013316676448362">Blokkert nettsted</translation> <translation id="7290209999329137901">Du kan ikke endre navn</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">Slått av for denne enheten</translation> <translation id="8013372441983637696">Fjern også Chrome-dataene dine fra denne enheten</translation> <translation id="8015452622527143194">Tilbakestill alt på siden til standardstørrelsen</translation> +<translation id="8015780634880457457">Google kan sjekke om passordene dine har vært en del av et databrudd</translation> <translation id="802154636333426148">Nedlastingen mislyktes</translation> <translation id="8026334261755873520">Slett nettleserdata</translation> <translation id="8035133914807600019">Ny mappe</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">Kan ikke eksportere passordene</translation> <translation id="8447861592752582886">Opphev tillatelsen til enhetstilgang</translation> <translation id="8461694314515752532">Kryptér synkroniserte data med din egen passordfrase for synkronisering</translation> +<translation id="8466613982764129868">Kontrollér at <ph name="TARGET_DEVICE_NAME" /> er koblet til internett</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Tilgjengelig utenfor nettet</translation> <translation id="8489271220582375723">Åpne loggsiden</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">Logg av administrert konto</translation> <translation id="9204836675896933765">1 fil gjenstår</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Kan ikke ringe</translation> <translation id="9219103736887031265">Bilder</translation> <translation id="926205370408745186">Fjerne Chrome-aktiviteten din fra Digital balanse</translation> <translation id="932327136139879170">Gå til startsiden</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 96f6d12..0260edd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -310,7 +310,7 @@ <translation id="3269093882174072735">Загрузить изображение</translation> <translation id="3269956123044984603">Чтобы получить доступ к вкладкам на всех своих устройствах, включите автосинхронизацию данных в настройках аккаунта на устройстве Android.</translation> <translation id="3277252321222022663">Предоставить сайтам доступ к датчикам (рекомендуется)</translation> -<translation id="3282568296779691940">Войдите в Chrome</translation> +<translation id="3282568296779691940">Войти в Chrome</translation> <translation id="3288003805934695103">Обновите страницу.</translation> <translation id="32895400574683172">Может отправлять уведомления</translation> <translation id="3295530008794733555">Быстрый просмотр сайтов и экономия трафика</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index d1b4213..77e9de7d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Öppna alla</translation> <translation id="1409426117486808224">Förenklad vy för öppna flikar</translation> <translation id="1409879593029778104">Nedladdningen av <ph name="FILE_NAME" /> hindrades eftersom filen redan finns.</translation> +<translation id="1413136574162415971">Google kan kontrollera om dina lösenord har läckt ut vid ett dataintrång. Detta aktiveras när du är inloggad med ditt Google-konto och har aktiverat synkronisering.</translation> <translation id="1414981605391750300">Kontaktar Google. Det här kan ta någon minut …</translation> <translation id="1416550906796893042">Appversion</translation> <translation id="1430915738399379752">Skriv ut</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Ljud</translation> <translation id="2096012225669085171">Synkronisera och anpassa på alla enheter</translation> <translation id="2100273922101894616">Automatisk inloggning</translation> +<translation id="2100314319871056947">Testa att dela upp texten i mindre bitar</translation> <translation id="2107397443965016585">Fråga innan webbplatser tillåts att spela upp skyddat innehåll (rekommenderas)</translation> <translation id="2111511281910874386">Öppna sida</translation> <translation id="2122601567107267586">Det gick inte att öppna appen</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Tryck på bakåtknappen för att lämna helskärmsläget.</translation> <translation id="2842985007712546952">Överordnad mapp</translation> <translation id="2858138569776157458">Populärt</translation> +<translation id="2860954141821109167">Kontrollera att en telefonapp har aktiverats på enheten</translation> <translation id="2870560284913253234">Webbplats</translation> <translation id="2874939134665556319">Föregående spår</translation> <translation id="2876369937070532032">Webbadresser till vissa sidor som du besöker skickas till Google när din säkerhet är utsatt för risk.</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Skapa lösenfras</translation> <translation id="2996809686854298943">En webbadress måste anges.</translation> <translation id="300526633675317032">Det här alternativet tar bort alla <ph name="SIZE_IN_KB" /> webbplatslagring.</translation> +<translation id="3016635187733453316">Kontrollera att enheten är ansluten till internet</translation> <translation id="3029613699374795922"><ph name="KBS" /> kB har laddats ned</translation> <translation id="3029704984691124060">Lösenfraserna matchar inte</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">Välj bilder</translation> <translation id="7233236755231902816">Skaffa den senaste versionen av Chrome och få webben översatt till ditt språk</translation> <translation id="7243308994586599757">Alternativ visas nära skärmens nedre kant</translation> +<translation id="7248069434667874558">Kontrollera att synkronisering har aktiverats i Chrome på <ph name="TARGET_DEVICE_NAME" /></translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> har valts</translation> <translation id="7274013316676448362">Blockerad webbplats</translation> <translation id="7290209999329137901">Det går inte att byta namn</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">Inaktiverad för den här enheten</translation> <translation id="8013372441983637696">Rensa även Chrome-data från enheten</translation> <translation id="8015452622527143194">Återställ allt på sidan till standardstorlek</translation> +<translation id="8015780634880457457">Google kan kontrollera om dina lösenord har läckt ut vid ett dataintrång</translation> <translation id="802154636333426148">Nedladdningen misslyckades</translation> <translation id="8026334261755873520">Rensa webbinformation</translation> <translation id="8035133914807600019">Ny mapp …</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">Det gick inte att exportera lösenord</translation> <translation id="8447861592752582886">Återkalla enhetsbehörighet</translation> <translation id="8461694314515752532">Kryptera synkroniserad data med en egen lösenfras för synkronisering</translation> +<translation id="8466613982764129868">Kontrollera att <ph name="TARGET_DEVICE_NAME" /> är ansluten till internet</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Tillgänglig offline</translation> <translation id="8489271220582375723">Öppna historiksidan</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">Logga ut från hanterat konto</translation> <translation id="9204836675896933765">1 fil återstår</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Det går inte att ringa</translation> <translation id="9219103736887031265">Bilder</translation> <translation id="926205370408745186">Ta bort din aktivitet i Chrome från Digitalt välmående</translation> <translation id="932327136139879170">Startsida</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index dbedc44..faad9d1b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Fungua zote</translation> <translation id="1409426117486808224">Mwonekano uliorahisishwa kwa ajili ya vichupo vilivyofunguliwa</translation> <translation id="1409879593029778104">Kipakuliwa cha <ph name="FILE_NAME" /> kimezuiwa kwa sababu faili tayari ipo.</translation> +<translation id="1413136574162415971">Google inaweza kukagua iwapo manenosiri yako yaliathiriwa na ufichuzi haramu wa data. Hii itawashwa ukiingia kwa kutumia Akaunti yako ya Google na ukiwasha kipengele cha usawazishaji.</translation> <translation id="1414981605391750300">Inawasiliana na Google. Huenda ikachukua dakika moja…</translation> <translation id="1416550906796893042">Toleo la programu</translation> <translation id="1430915738399379752">Chapisha</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Sauti</translation> <translation id="2096012225669085171">Sawazisha na uweke mapendeleo kwenye vifaa vyote</translation> <translation id="2100273922101894616">Ingia katika Akaunti Kiotomatiki</translation> +<translation id="2100314319871056947">Jaribu kushiriki maandishi katika sehemu ndogo ndogo</translation> <translation id="2107397443965016585">Iulize kabla ya kuruhusu tovuti kucheza maudhui yanayolindwa (inapendekezwa)</translation> <translation id="2111511281910874386">Nenda kwenye ukurasa</translation> <translation id="2122601567107267586">Imeshindwa kufungua programu</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Gusa kitufe cha kurudi nyuma ili uondoke kwenye skrini nzima.</translation> <translation id="2842985007712546952">Folda kuu</translation> <translation id="2858138569776157458">Tovuti maarufu</translation> +<translation id="2860954141821109167">Hakikisha kuwa programu ya simu imewashwa kwenye kifaa hiki</translation> <translation id="2870560284913253234">Tovuti</translation> <translation id="2874939134665556319">Wimbo uliotangulia</translation> <translation id="2876369937070532032">Hutuma kwa Google URL za baadhi ya kurasa ambazo umetembelea wakati usalama wako uko hatarini</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Unda kauli ya siri</translation> <translation id="2996809686854298943">URL inahitajika</translation> <translation id="300526633675317032">Hatua hii itafuta <ph name="SIZE_IN_KB" /> yote ya hifadhi ya tovuti.</translation> +<translation id="3016635187733453316">Hakikisha kwamba kifaa hiki kimeunganishwa kwenye intaneti</translation> <translation id="3029613699374795922">Umepakua KB <ph name="KBS" /></translation> <translation id="3029704984691124060">Kaulisiri hazilingani</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Pata usaidizi<ph name="END_LINK" /></translation> @@ -840,6 +844,7 @@ <translation id="723171743924126238">Chagua picha</translation> <translation id="7233236755231902816">Ili uone tovuti katika lugha unayotumia, pata toleo jipya la Chrome</translation> <translation id="7243308994586599757">Chaguo zinapatikana karibu na sehemu ya chini ya skrini</translation> +<translation id="7248069434667874558">Hakikisha kuwa umewasha kipengele cha usawazishaji katika <ph name="TARGET_DEVICE_NAME" /> kwenye Chrome</translation> <translation id="7250468141469952378">Imechagua <ph name="ITEM_COUNT" /></translation> <translation id="7274013316676448362">Tovuti imezuiwa</translation> <translation id="7290209999329137901">Huwezi kubadilisha jina</translation> @@ -953,6 +958,7 @@ <translation id="8007176423574883786">Imezimwa kwa kifaa hiki</translation> <translation id="8013372441983637696">Pia, futa data yako ya Chrome kwenye kifaa hiki</translation> <translation id="8015452622527143194">Rejesha kila kitu katika ukubwa wa kawaida</translation> +<translation id="8015780634880457457">Google inaweza kuangalia iwapo manenosiri yako yaliathiriwa na ufichuzi haramu wa data</translation> <translation id="802154636333426148">Haikuweza kupakua</translation> <translation id="8026334261755873520">Futa data ya kuvinjari</translation> <translation id="8035133914807600019">Folda mpya…</translation> @@ -1015,6 +1021,7 @@ <translation id="8445448999790540984">Haiwezi kuhamisha manenosiri</translation> <translation id="8447861592752582886">Batilisha ruhusa ya kifaa</translation> <translation id="8461694314515752532">Simba data iliyosawazishwa kwa njia fiche ukitumia kauli yako ya siri ya usawazishaji</translation> +<translation id="8466613982764129868">Hakikisha kwamba <ph name="TARGET_DEVICE_NAME" /> imeunganishwa kwenye intaneti</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Kinapatikana nje ya mtandao</translation> <translation id="8489271220582375723">Fungua ukurasa wa historia</translation> @@ -1105,6 +1112,7 @@ <translation id="9188680907066685419">Ondoka kwenye akaunti inayodhibitiwa</translation> <translation id="9204836675896933765">Imesalia faili 1</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Imeshindwa kupiga simu</translation> <translation id="9219103736887031265">Picha</translation> <translation id="926205370408745186">Ondoa shughuli zako za Chrome kwenye mpango wa Nidhamu Dijitali</translation> <translation id="932327136139879170">Mwanzo</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index deda8450..29a7fcdf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Tümünü aç</translation> <translation id="1409426117486808224">Açık sekmeler için basitleştirilmiş görünüm</translation> <translation id="1409879593029778104"><ph name="FILE_NAME" /> dosyası zaten var olduğu için indirme işlemi engellendi.</translation> +<translation id="1413136574162415971">Google, şifrelerinizin bir veri ihlaline dahil olup olmadığını kontrol edebilir. Bu, Google Hesabınızla oturum açıp Chrome'da senkronizasyonu etkinleştirdiğinizde açılacaktır.</translation> <translation id="1414981605391750300">Google ile bağlantı kuruluyor. Bu işlem bir dakika sürebilir…</translation> <translation id="1416550906796893042">Uygulama sürümü</translation> <translation id="1430915738399379752">Yazdır</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Ses</translation> <translation id="2096012225669085171">Cihazlar arasında senkronizasyon ve kişiselleştirme</translation> <translation id="2100273922101894616">Otomatik Oturum Aç</translation> +<translation id="2100314319871056947">Metni daha küçük parçalar halinde paylaşmayı deneyin</translation> <translation id="2107397443965016585">Sitelerin korumalı içeriği oynatmasına izin vermeden önce sor (önerilir)</translation> <translation id="2111511281910874386">Sayfaya gidin</translation> <translation id="2122601567107267586">Uygulama açılamadı</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Tam ekrandan çıkmak için geri düğmesine dokunun.</translation> <translation id="2842985007712546952">Ana klasör</translation> <translation id="2858138569776157458">Popüler siteler</translation> +<translation id="2860954141821109167">Bu cihazda bir telefon uygulamasının etkinleştirildiğinden emin olun</translation> <translation id="2870560284913253234">Site</translation> <translation id="2874939134665556319">Önceki parça</translation> <translation id="2876369937070532032">Güvenliğiniz risk altında olduğunda ziyaret ettiğiniz bazı sayfaların URL'lerini Google'a gönderir</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Parola oluşturun</translation> <translation id="2996809686854298943">URL gerekli</translation> <translation id="300526633675317032">Bu işlem <ph name="SIZE_IN_KB" /> olan web sitesi depolama alanının tamamını temizleyecek.</translation> +<translation id="3016635187733453316">Bu cihazın internete bağlı olduğundan emin olun</translation> <translation id="3029613699374795922"><ph name="KBS" /> KB indirildi</translation> <translation id="3029704984691124060">Parolalar eşleşmiyor</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Yardım alın<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">Resim seç</translation> <translation id="7233236755231902816">Web'i kendi dilinizde görmek için Chrome'un en son sürümünü edinin</translation> <translation id="7243308994586599757">Sayfanın altına yakın bir yerde kullanılabilen seçenekler</translation> +<translation id="7248069434667874558"><ph name="TARGET_DEVICE_NAME" /> cihazının Chrome'da senkronizasyonunun açık olduğundan emin olun</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> öğe seçildi</translation> <translation id="7274013316676448362">Engellenmiş site</translation> <translation id="7290209999329137901">Yeniden adlandırma yapılamıyor</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">Bu cihaz için kapatıldı</translation> <translation id="8013372441983637696">Chrome verilerinizi de bu cihazdan temizleyin</translation> <translation id="8015452622527143194">Sayfadaki her şeyi varsayılan boyutuna döndürür</translation> +<translation id="8015780634880457457">Google, şifrelerinizin bir veri ihlaline dahil olup olmadığını kontrol edebilir</translation> <translation id="802154636333426148">İndirilemedi</translation> <translation id="8026334261755873520">Tarama verilerini temizle</translation> <translation id="8035133914807600019">Yeni klasör…</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">Şifreler dışa aktarılamıyor</translation> <translation id="8447861592752582886">Cihaz iznini iptal et</translation> <translation id="8461694314515752532">Senkronize edilen verileri senkronizasyon parolanızı kullanarak şifrele</translation> +<translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> cihazının internete bağlı olduğundan emin olun</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Çevrimdışı kullanılabilir</translation> <translation id="8489271220582375723">Geçmiş sayfasını açar</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">Yönetilen hesabın oturumunu kapat</translation> <translation id="9204836675896933765">1 dosya kaldı</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Arama yapılamıyor</translation> <translation id="9219103736887031265">Resimler</translation> <translation id="926205370408745186">Chrome etkinliğinizi Dijital Denge'den kaldırma</translation> <translation id="932327136139879170">Ana Sayfa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index 59e25a9..a592ee7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">Mở tất cả</translation> <translation id="1409426117486808224">Chế độ xem đơn giản cho tab đang mở</translation> <translation id="1409879593029778104">Đã ngăn tải xuống <ph name="FILE_NAME" /> do tệp này đã tồn tại.</translation> +<translation id="1413136574162415971">Google có thể kiểm tra xem mật khẩu của bạn có bị ảnh hưởng trong một vụ rò rỉ dữ liệu không. Tùy chọn này sẽ được bật khi bạn đăng nhập bằng Tài khoản Google của mình và bật tính năng đồng bộ hóa.</translation> <translation id="1414981605391750300">Đang liên hệ với Google. Quá trình này có thể mất ít phút…</translation> <translation id="1416550906796893042">Phiên bản ứng dụng</translation> <translation id="1430915738399379752">In</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">Âm thanh</translation> <translation id="2096012225669085171">Đồng bộ hóa và cá nhân hóa trên các thiết bị</translation> <translation id="2100273922101894616">Tự động đăng nhập</translation> +<translation id="2100314319871056947">Hãy thử chia sẻ văn bản theo các đoạn nhỏ hơn</translation> <translation id="2107397443965016585">Hỏi trước khi cho phép trang web phát nội dung được bảo vệ (khuyên dùng)</translation> <translation id="2111511281910874386">Chuyển đến trang</translation> <translation id="2122601567107267586">Không thể mở ứng dụng</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">Chạm vào nút quay lại để thoát khỏi chế độ toàn màn hình.</translation> <translation id="2842985007712546952">Thư mục mẹ</translation> <translation id="2858138569776157458">Trang web hàng đầu</translation> +<translation id="2860954141821109167">Hãy đảm bảo bạn đã bật ứng dụng điện thoại trên thiết bị này</translation> <translation id="2870560284913253234">Trang web</translation> <translation id="2874939134665556319">Bản nhạc trước</translation> <translation id="2876369937070532032">Gửi URL của một số trang mà bạn truy cập cho Google khi bạn gặp rủi ro về bảo mật</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">Tạo cụm mật khẩu</translation> <translation id="2996809686854298943">Cần có URL</translation> <translation id="300526633675317032">Thao tác này sẽ xóa tất cả <ph name="SIZE_IN_KB" /> bộ nhớ trang web.</translation> +<translation id="3016635187733453316">Hãy đảm bảo thiết bị này có kết nối Internet</translation> <translation id="3029613699374795922">Đã tải xuống <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">Cụm mật khẩu không khớp</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Nhận trợ giúp<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">Chọn hình ảnh</translation> <translation id="7233236755231902816">Để duyệt web bằng ngôn ngữ của bạn, hãy tải phiên bản Chrome mới nhất</translation> <translation id="7243308994586599757">Có các tùy chọn ở gần cuối màn hình</translation> +<translation id="7248069434667874558">Hãy đảm bảo <ph name="TARGET_DEVICE_NAME" /> đã bật tính năng đồng bộ hóa trên Chrome</translation> <translation id="7250468141469952378">Đã chọn <ph name="ITEM_COUNT" /></translation> <translation id="7274013316676448362">Trang web bị chặn</translation> <translation id="7290209999329137901">Không đổi tên được</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">Tắt cho thiết bị này</translation> <translation id="8013372441983637696">Xóa cả dữ liệu của bạn trên Chrome khỏi thiết bị này</translation> <translation id="8015452622527143194">Trả lại mọi nội dung trên trang về kích thước mặc định</translation> +<translation id="8015780634880457457">Google có thể kiểm tra xem mật khẩu của bạn có bị ảnh hưởng trong một vụ rò rỉ dữ liệu không</translation> <translation id="802154636333426148">Tải xuống không thành công</translation> <translation id="8026334261755873520">Xóa dữ liệu duyệt web</translation> <translation id="8035133914807600019">Thư mục mới...</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">Không xuất được mật khẩu</translation> <translation id="8447861592752582886">Thu hồi quyền truy cập thiết bị</translation> <translation id="8461694314515752532">Mã hóa dữ liệu đã đồng bộ hóa bằng cụm mật khẩu đồng bộ hóa của riêng bạn</translation> +<translation id="8466613982764129868">Hãy đảm bảo <ph name="TARGET_DEVICE_NAME" /> có kết nối Internet</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">Khả dụng ngoại tuyến</translation> <translation id="8489271220582375723">Mở trang lịch sử</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">Đăng xuất khỏi tài khoản được quản lý</translation> <translation id="9204836675896933765">Còn lại 1 tệp</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">Không thể gọi điện</translation> <translation id="9219103736887031265">Hình ảnh</translation> <translation id="926205370408745186">Xóa hoạt động của bạn trên Chrome khỏi Digital Wellbeing</translation> <translation id="932327136139879170">Trang chủ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index 676eed01..5e1de8e4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">全部打开</translation> <translation id="1409426117486808224">使用简化版视图查看打开的标签页</translation> <translation id="1409879593029778104">系统已阻止下载 <ph name="FILE_NAME" />,因为文件已存在。</translation> +<translation id="1413136574162415971">Google 可检查您的密码是否曾遭遇过数据泄露。当您登录了自己的 Google 帐号并开启了同步功能时,系统即会开启此服务。</translation> <translation id="1414981605391750300">正在连接到 Google,请稍等片刻…</translation> <translation id="1416550906796893042">应用版本</translation> <translation id="1430915738399379752">打印</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">声音</translation> <translation id="2096012225669085171">在所有设备上保持同步并进行个性化设置</translation> <translation id="2100273922101894616">自动登录</translation> +<translation id="2100314319871056947">请尝试使用较小的文本块进行分享</translation> <translation id="2107397443965016585">网站需先询问并得到许可才能播放受保护内容 (推荐)</translation> <translation id="2111511281910874386">转至相关网页</translation> <translation id="2122601567107267586">无法打开此应用</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">触摸“返回”按钮即可退出全屏模式。</translation> <translation id="2842985007712546952">父文件夹</translation> <translation id="2858138569776157458">热门网站</translation> +<translation id="2860954141821109167">请确保已在此设备上启用了一款电话应用</translation> <translation id="2870560284913253234">网站</translation> <translation id="2874939134665556319">上一曲</translation> <translation id="2876369937070532032">当您面临安全风险时,将您所访问的部分网页的网址发送给 Google</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">创建密码</translation> <translation id="2996809686854298943">必须提供网址</translation> <translation id="300526633675317032">这会清除全部的网站存储数据 (<ph name="SIZE_IN_KB" />)。</translation> +<translation id="3016635187733453316">请确保此设备已连接到互联网。</translation> <translation id="3029613699374795922">已下载 <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">密码不匹配</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">选择图片</translation> <translation id="7233236755231902816">若要使用您的语言查看网页,请获取最新版本的 Chrome</translation> <translation id="7243308994586599757">选项在靠近屏幕底部的位置</translation> +<translation id="7248069434667874558">请确保<ph name="TARGET_DEVICE_NAME" />已在 Chrome 中开启同步功能</translation> <translation id="7250468141469952378">已选择 <ph name="ITEM_COUNT" /> 项</translation> <translation id="7274013316676448362">禁止访问的网站</translation> <translation id="7290209999329137901">不可重命名</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">已对此设备停用</translation> <translation id="8013372441983637696">同时从此设备中清除您的 Chrome 数据</translation> <translation id="8015452622527143194">将网页上的所有内容恢复到默认大小</translation> +<translation id="8015780634880457457">Google 可检查您的密码是否曾遭遇过数据泄露</translation> <translation id="802154636333426148">下载失败</translation> <translation id="8026334261755873520">清除浏览数据</translation> <translation id="8035133914807600019">新建文件夹…</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">无法导出密码</translation> <translation id="8447861592752582886">撤消设备权限</translation> <translation id="8461694314515752532">使用您自己的同步密码加密已同步的数据</translation> +<translation id="8466613982764129868">请确保<ph name="TARGET_DEVICE_NAME" />已连接到互联网</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">可离线使用</translation> <translation id="8489271220582375723">打开历史记录页</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">退出受管理的帐号</translation> <translation id="9204836675896933765">还剩 1 个文件</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">无法致电</translation> <translation id="9219103736887031265">图片</translation> <translation id="926205370408745186">从“数字健康”应用中移除您的 Chrome 活动记录</translation> <translation id="932327136139879170">首页</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index b4c5ab1f..cb7c20b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -66,6 +66,7 @@ <translation id="1407135791313364759">全部開啟</translation> <translation id="1409426117486808224">使用簡易檢視模式查看開啟的分頁</translation> <translation id="1409879593029778104"><ph name="FILE_NAME" /> 檔案已存在,因此無法下載。</translation> +<translation id="1413136574162415971">Google 可以檢查你的密碼資料是否外洩。當你使用 Google 帳戶登入並開啟同步功能時,系統會開啟這項功能。</translation> <translation id="1414981605391750300">正在連線至 Google。可能需要一分鐘…</translation> <translation id="1416550906796893042">應用程式版本</translation> <translation id="1430915738399379752">列印</translation> @@ -160,6 +161,7 @@ <translation id="2091887806945687916">音訊</translation> <translation id="2096012225669085171">讓多部裝置保持同步,並提供人化體驗</translation> <translation id="2100273922101894616">自動登入</translation> +<translation id="2100314319871056947">請嘗試將要分享的文字分成多個片段</translation> <translation id="2107397443965016585">允許網站播放受保護的內容前,必須先詢問你 (建議)</translation> <translation id="2111511281910874386">前往指定頁面</translation> <translation id="2122601567107267586">無法開啟應用程式</translation> @@ -253,6 +255,7 @@ <translation id="2836148919159985482">輕觸返回按鈕即可結束全螢幕模式。</translation> <translation id="2842985007712546952">上層資料夾</translation> <translation id="2858138569776157458">熱門網站</translation> +<translation id="2860954141821109167">請確認此裝置已啟用手機應用程式</translation> <translation id="2870560284913253234">網站</translation> <translation id="2874939134665556319">上一首曲目</translation> <translation id="2876369937070532032">當網站具有安全性風險時,Chrome 會將你造訪的部分網頁網址傳送給 Google</translation> @@ -277,6 +280,7 @@ <translation id="2996291259634659425">建立通關密語</translation> <translation id="2996809686854298943">必須要有網址</translation> <translation id="300526633675317032">這會將網站儲存的資料全部清除 (共 <ph name="SIZE_IN_KB" />)。</translation> +<translation id="3016635187733453316">請確認此裝置已連上網際網路</translation> <translation id="3029613699374795922">已下載 <ph name="KBS" /> KB</translation> <translation id="3029704984691124060">通關密語不符</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />取得說明<ph name="END_LINK" /></translation> @@ -841,6 +845,7 @@ <translation id="723171743924126238">選取圖片</translation> <translation id="7233236755231902816">如要以你偏好的語言查看網頁,請取得最新版本的 Chrome</translation> <translation id="7243308994586599757">選項在接近畫面底部的位置</translation> +<translation id="7248069434667874558">請確認「<ph name="TARGET_DEVICE_NAME" />」的 Chrome 同步功能已開啟</translation> <translation id="7250468141469952378">已選取 <ph name="ITEM_COUNT" /> 個項目</translation> <translation id="7274013316676448362">已封鎖網站</translation> <translation id="7290209999329137901">無法重新命名</translation> @@ -955,6 +960,7 @@ <translation id="8007176423574883786">已在這個裝置上關閉</translation> <translation id="8013372441983637696">一併清除你在這個裝置上的 Chrome 資料</translation> <translation id="8015452622527143194">將網頁上的所有內容都回復為預設大小</translation> +<translation id="8015780634880457457">Google 可以檢查你的密碼資料是否外洩</translation> <translation id="802154636333426148">下載失敗</translation> <translation id="8026334261755873520">清除瀏覽資料</translation> <translation id="8035133914807600019">新資料夾…</translation> @@ -1017,6 +1023,7 @@ <translation id="8445448999790540984">無法匯出密碼</translation> <translation id="8447861592752582886">撤銷裝置權限</translation> <translation id="8461694314515752532">使用你自己的同步通關密語,加密保護同步資料</translation> +<translation id="8466613982764129868">請確認「<ph name="TARGET_DEVICE_NAME" />」已連上網際網路</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8487700953926739672">可離線使用</translation> <translation id="8489271220582375723">開啟記錄頁面</translation> @@ -1107,6 +1114,7 @@ <translation id="9188680907066685419">登出受管理的帳戶</translation> <translation id="9204836675896933765">還剩 1 個檔案</translation> <translation id="9206873250291191720">A</translation> +<translation id="9209888181064652401">無法撥打電話</translation> <translation id="9219103736887031265">圖片</translation> <translation id="926205370408745186">將你的 Chrome 活動記錄從數位健康中移除</translation> <translation id="932327136139879170">首頁</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS new file mode 100644 index 0000000..316acda --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS
@@ -0,0 +1 @@ +file://chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java similarity index 98% rename from chrome/android/javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java index 59db187..2bccbb97 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.accessibility_tab_switcher; import android.os.SystemClock; import android.support.design.widget.TabLayout; @@ -30,8 +30,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModel; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem; -import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWrapper; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index f38f5c2d..63c1a18 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -66,6 +66,7 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchInternalStateController.InternalState; import org.chromium.chrome.browser.contextualsearch.ResolvedSearchTerm.CardTag; import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler; +import org.chromium.chrome.browser.findinpage.FindToolbar; import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.gsa.GSAContextDisplaySelection; import org.chromium.chrome.browser.locale.LocaleManager; @@ -74,7 +75,6 @@ import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelUtils; -import org.chromium.chrome.browser.widget.findinpage.FindToolbar; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeTabUtils; @@ -159,7 +159,7 @@ * @return The name of the outcome if the give parameter is an outcome, or {@code null} if it's * not. */ - private final static String expectedOutcomeName( + private static final String expectedOutcomeName( @ContextualSearchInteractionRecorder.Feature int feature) { switch (feature) { // We don't log whether the quick action was clicked unless we actually have a @@ -177,7 +177,7 @@ * @return The name of the outcome if it's expected to be logged, or {@code null} if it's not * expected to be logged. */ - private final static String expectedFeatureName( + private static final String expectedFeatureName( @ContextualSearchInteractionRecorder.Feature int feature) { switch (feature) { // We don't log previous user impressions and CTR if not available for the
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java index bfc465a..afe89ac 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.embedder_support.view.ContentView; import org.chromium.content_public.browser.SelectionClient; import org.chromium.content_public.browser.SelectionPopupController; @@ -320,6 +321,7 @@ @SmallTest @Feature({"ContextualSearch"}) @Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) + @Features.DisableFeatures("ContextualSearchLongpressResolve") public void testTapProcessIsRobustWhenSelectionGetsCleared() throws InterruptedException { Assert.assertEquals(mPanelManager.getRequestPanelShowCount(), 0);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java index e5bfb8c..17ee83a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
@@ -176,36 +176,6 @@ } /** - * Mock implementation of the DownloadSnackbarController. - */ - static class MockDownloadSnackbarController extends DownloadSnackbarController { - private boolean mSucceeded; - private boolean mFailed; - - public void waitForSnackbarControllerToFinish(final boolean success) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed while waiting for all calls to complete.") { - @Override - public boolean isSatisfied() { - return success ? mSucceeded : mFailed; - } - }); - } - - @Override - public void onDownloadSucceeded( - DownloadInfo downloadInfo, int notificationId, long downloadId, - boolean canBeResolved, boolean usesAndroidDownloadManager) { - mSucceeded = true; - } - - @Override - public void onDownloadFailed(String errorMessage, boolean showAllDownloads) { - mFailed = true; - } - } - - /** * A set that each object can be matched ^only^ once. Once matched, the object * will be removed from the set. This is useful to write expectations * for a sequence of calls where order of calls is not defined. Client can @@ -251,7 +221,6 @@ private static class DownloadManagerServiceForTest extends DownloadManagerService { boolean mResumed; - DownloadSnackbarController mDownloadSnackbarController; public DownloadManagerServiceForTest( MockDownloadNotifier mockNotifier, long updateDelayInMillis) { @@ -271,18 +240,6 @@ TestThreadUtils.runOnUiThreadBlocking( () -> DownloadManagerServiceForTest.super.scheduleUpdateIfNeeded()); } - - @Override - protected void setDownloadSnackbarController( - DownloadSnackbarController downloadSnackbarController) { - mDownloadSnackbarController = downloadSnackbarController; - super.setDownloadSnackbarController(downloadSnackbarController); - } - - @Override - protected void onDownloadFailed(DownloadItem downloadItem, int reason) { - mDownloadSnackbarController.onDownloadFailed("", false); - } } private DownloadManagerServiceForTest mService; @@ -402,18 +359,16 @@ public void testDownloadCompletedIsCalled() throws InterruptedException { if (useDownloadOfflineContentProvider()) return; MockDownloadNotifier notifier = new MockDownloadNotifier(); - MockDownloadSnackbarController snackbarController = new MockDownloadSnackbarController(); createDownloadManagerService(notifier, UPDATE_DELAY_FOR_TEST); TestThreadUtils.runOnUiThreadBlocking( (Runnable) () -> DownloadManagerService.setDownloadManagerService(mService)); - mService.setDownloadSnackbarController(snackbarController); + DownloadInfoBarController infoBarController = mService.getInfoBarController(false); // Try calling download completed directly. DownloadInfo successful = getDownloadInfo(); notifier.expect(MethodID.DOWNLOAD_SUCCESSFUL, successful); mService.onDownloadCompleted(successful); notifier.waitTillExpectedCallsComplete(); - snackbarController.waitForSnackbarControllerToFinish(true); // Now check that a successful notification appears after a download progress. DownloadInfo progress = getDownloadInfo(); @@ -423,7 +378,6 @@ Thread.sleep(DELAY_BETWEEN_CALLS); mService.onDownloadCompleted(progress); notifier.waitTillExpectedCallsComplete(); - snackbarController.waitForSnackbarControllerToFinish(true); } @Test @@ -431,11 +385,9 @@ @Feature({"Download"}) public void testDownloadFailedIsCalled() throws InterruptedException { MockDownloadNotifier notifier = new MockDownloadNotifier(); - MockDownloadSnackbarController snackbarController = new MockDownloadSnackbarController(); createDownloadManagerService(notifier, UPDATE_DELAY_FOR_TEST); TestThreadUtils.runOnUiThreadBlocking( (Runnable) () -> DownloadManagerService.setDownloadManagerService(mService)); - mService.setDownloadSnackbarController(snackbarController); // Check that if an interrupted download cannot be resumed, it will trigger a download // failure. DownloadInfo failure = @@ -443,7 +395,6 @@ notifier.expect(MethodID.DOWNLOAD_FAILED, failure); mService.onDownloadInterrupted(failure, false); notifier.waitTillExpectedCallsComplete(); - snackbarController.waitForSnackbarControllerToFinish(false); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java index 1fc15f9..2ac3685 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java
@@ -95,42 +95,12 @@ } } - /** - * Mock implementation of the DownloadSnackbarController. - */ - static class MockDownloadSnackbarController extends DownloadSnackbarController { - public boolean mSucceeded; - public boolean mFailed; - - public void waitForSnackbarControllerToFinish(final boolean success) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed while waiting for all calls to complete.") { - @Override - public boolean isSatisfied() { - return success ? mSucceeded : mFailed; - } - }); - } - - @Override - public void onDownloadSucceeded(DownloadInfo downloadInfo, int notificationId, - long downloadId, boolean canBeResolved, boolean usesAndroidDownloadManager) { - mSucceeded = true; - } - - @Override - public void onDownloadFailed(String errorMessage, boolean showAllDownloads) { - mFailed = true; - } - } - private static class OMADownloadHandlerForTest extends OMADownloadHandler { public String mNofityURI; public long mDownloadId; - public OMADownloadHandlerForTest( - Context context, DownloadSnackbarController downloadSnackbarController) { - super(context, downloadSnackbarController); + public OMADownloadHandlerForTest(Context context) { + super(context); addObserverForTest(downloadId -> { mDownloadId = downloadId; }); } @@ -350,10 +320,7 @@ UrlUtils.getIsolatedTestFilePath("chrome/test/data/android/download/download.txt"), 4, true); - final MockDownloadSnackbarController snackbarController = - new MockDownloadSnackbarController(); - final OMADownloadHandlerForTest omaHandler = - new OMADownloadHandlerForTest(context, snackbarController); + final OMADownloadHandlerForTest omaHandler = new OMADownloadHandlerForTest(context); // Write a few pending downloads into shared preferences. Set<String> pendingOmaDownloads = new HashSet<>(); @@ -406,10 +373,7 @@ try { DownloadInfo info = new DownloadInfo.Builder().build(); - final MockDownloadSnackbarController snackbarController = - new MockDownloadSnackbarController(); - final OMADownloadHandlerForTest omaHandler = new OMADownloadHandlerForTest( - context, snackbarController) { + final OMADownloadHandlerForTest omaHandler = new OMADownloadHandlerForTest(context) { @Override public void onReceive(Context context, Intent intent) { // Ignore all the broadcasts.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java similarity index 97% rename from chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java index ebb5cf33..fd724c71 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java
@@ -8,7 +8,7 @@ * information on how to write and extend Application tests. */ -package org.chromium.chrome.browser.widget.findinpage; +package org.chromium.chrome.browser.findinpage; import android.content.ClipData; import android.content.ClipboardManager; @@ -83,13 +83,12 @@ (TextView) mActivityTestRule.getActivity().findViewById(R.id.find_status); Assert.assertNotNull(expectedResult); Assert.assertNotNull(findResults); - CriteriaHelper.pollUiThread( - Criteria.equals(expectedResult, new Callable<CharSequence>() { - @Override - public CharSequence call() { - return findResults.getText(); - } - })); + CriteriaHelper.pollUiThread(Criteria.equals(expectedResult, new Callable<CharSequence>() { + @Override + public CharSequence call() { + return findResults.getText(); + } + })); return findResults.getText().toString(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java index 2e03983..d3b99a5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java
@@ -19,6 +19,8 @@ import org.chromium.chrome.test.ChromeBrowserTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; +import org.chromium.components.signin.ChromeSigninController; /** * Tests of {@link LensUtils}. @@ -95,19 +97,86 @@ } /** - * Test {@link LensUtils#getShareWithGoogleLensIntent()} method. + * Test {@link LensUtils#getShareWithGoogleLensIntent()} method when user is signed in. */ @Test @SmallTest - public void getShareWithGoogleLensIntentTest() { - Intent intentNoUri = LensUtils.getShareWithGoogleLensIntent(Uri.EMPTY); - Assert.assertEquals("googleapp://lens", intentNoUri.getData().toString()); - Assert.assertEquals(Intent.ACTION_VIEW, intentNoUri.getAction()); + public void getShareWithGoogleLensIntentSignedInTest() { + SigninTestUtil.addAndSignInTestAccount(); + Assert.assertEquals("Chrome should be signed into the test account", "test@gmail.com", + ChromeSigninController.get().getSignedInAccountName()); + + Intent intentNoUri = + LensUtils.getShareWithGoogleLensIntent(Uri.EMPTY, /* isIncognito= */ false); + Assert.assertEquals("Intent without image has incorrect URI", "googleapp://lens", + intentNoUri.getData().toString()); + Assert.assertEquals("Intent without image has incorrect action", Intent.ACTION_VIEW, + intentNoUri.getAction()); final String contentUrl = "content://image-url"; - Intent intentWithContentUri = LensUtils.getShareWithGoogleLensIntent(Uri.parse(contentUrl)); - Assert.assertEquals("googleapp://lens?LensBitmapUriKey=content%3A%2F%2Fimage-url", + Intent intentWithContentUri = LensUtils.getShareWithGoogleLensIntent( + Uri.parse(contentUrl), /* isIncognito= */ false); + Assert.assertEquals("Intent with image has incorrect URI", + "googleapp://lens?LensBitmapUriKey=content%3A%2F%2Fimage-url&AccountNameUriKey=" + + "test%40gmail.com&IncognitoUriKey=false", intentWithContentUri.getData().toString()); - Assert.assertEquals(Intent.ACTION_VIEW, intentWithContentUri.getAction()); + Assert.assertEquals("Intent with image has incorrect action", Intent.ACTION_VIEW, + intentWithContentUri.getAction()); + } + + /** + * Test {@link LensUtils#getShareWithGoogleLensIntent()} method when user is incognito. + */ + @Test + @SmallTest + public void getShareWithGoogleLensIntentIncognitoTest() { + SigninTestUtil.addAndSignInTestAccount(); + Assert.assertEquals("Chrome should be signed into the test account", "test@gmail.com", + ChromeSigninController.get().getSignedInAccountName()); + + Intent intentNoUri = + LensUtils.getShareWithGoogleLensIntent(Uri.EMPTY, /* isIncognito= */ true); + Assert.assertEquals("Intent without image has incorrect URI", "googleapp://lens", + intentNoUri.getData().toString()); + Assert.assertEquals("Intent without image has incorrect action", Intent.ACTION_VIEW, + intentNoUri.getAction()); + + final String contentUrl = "content://image-url"; + Intent intentWithContentUri = LensUtils.getShareWithGoogleLensIntent( + Uri.parse(contentUrl), /* isIncognito= */ true); + // The account name should not be included in the intent because the uesr is incognito. + Assert.assertEquals("Intent with image has incorrect URI", + "googleapp://lens?LensBitmapUriKey=content%3A%2F%2Fimage-url&AccountNameUriKey=" + + "&IncognitoUriKey=true", + intentWithContentUri.getData().toString()); + Assert.assertEquals("Intent with image has incorrect action", Intent.ACTION_VIEW, + intentWithContentUri.getAction()); + } + + /** + * Test {@link LensUtils#getShareWithGoogleLensIntent()} method when user is not signed in. + */ + @Test + @SmallTest + public void getShareWithGoogleLensIntentNotSignedInTest() { + Assert.assertNull("Chrome should not be signed in", + ChromeSigninController.get().getSignedInAccountName()); + + Intent intentNoUri = + LensUtils.getShareWithGoogleLensIntent(Uri.EMPTY, /* isIncognito= */ false); + Assert.assertEquals("Intent without image has incorrect URI", "googleapp://lens", + intentNoUri.getData().toString()); + Assert.assertEquals("Intent without image has incorrect action", Intent.ACTION_VIEW, + intentNoUri.getAction()); + + final String contentUrl = "content://image-url"; + Intent intentWithContentUri = LensUtils.getShareWithGoogleLensIntent( + Uri.parse(contentUrl), /* isIncognito= */ false); + Assert.assertEquals("Intent with image has incorrect URI", + "googleapp://lens?LensBitmapUriKey=content%3A%2F%2Fimage-url&AccountNameUriKey=" + + "&IncognitoUriKey=false", + intentWithContentUri.getData().toString()); + Assert.assertEquals("Intent with image has incorrect action", Intent.ACTION_VIEW, + intentWithContentUri.getAction()); } } \ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index d20618a..1c0d4f03 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -28,6 +28,7 @@ import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.snackbar.undo.UndoBarController; @@ -39,7 +40,6 @@ import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabModelSelectorMetadata; import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver; import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabModelMetaDataInfo; -import org.chromium.chrome.browser.widget.OverviewListLayout; import org.chromium.chrome.test.ChromeBrowserTestRule; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; import org.chromium.content_public.browser.LoadUrlParams;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java similarity index 98% rename from chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarIntegrationTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java index dab959b5..38e3e5bd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; import static org.junit.Assert.assertEquals;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java similarity index 99% rename from chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java index 18183abe..19825b8e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.widget; +package org.chromium.chrome.browser.toolbar; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java index 2d52224..105442a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
@@ -19,10 +19,10 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.findinpage.FindToolbar; import org.chromium.chrome.browser.omnibox.UrlBar; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.UrlConstants; -import org.chromium.chrome.browser.widget.findinpage.FindToolbar; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.MenuUtils;
diff --git a/chrome/android/modules/chrome_feature_module_tmpl.gni b/chrome/android/modules/chrome_feature_module_tmpl.gni index 7d7a128..e8dd3f5 100644 --- a/chrome/android/modules/chrome_feature_module_tmpl.gni +++ b/chrome/android/modules/chrome_feature_module_tmpl.gni
@@ -33,6 +33,7 @@ "base_module_target", "manifest_package", "min_sdk_version", + "package_id", "uncompress_shared_libraries", "version_code", "version_name", @@ -54,7 +55,6 @@ proguard_enabled = !is_java_debug package_name = _module_desc.name - package_name_to_id_mapping = resource_packages_id_mapping _loadable_modules_32_bit = [] _loadable_modules_64_bit = []
diff --git a/chrome/android/modules/chrome_feature_modules.gni b/chrome/android/modules/chrome_feature_modules.gni index 7912a15..b311304 100644 --- a/chrome/android/modules/chrome_feature_modules.gni +++ b/chrome/android/modules/chrome_feature_modules.gni
@@ -18,18 +18,6 @@ import("//chrome/android/features/ar/ar_module.gni") } -# Mapping that controls package IDs assigned to modules. The package IDs have to -# be unique and lower than 0x7f. -# TODO(crbug.com/984158): Autogenerate instead of explicit list. -resource_packages_id_mapping = [ - "ar=0x7e", - "vr=0x7d", - "tab_ui=0x7c", - "autofill_assistant=0x7b", - "dev_ui=0x7a", - "test_dummy=0x79", -] - # List of feature module descs for each Chrome flavor. These lists are used to # autogenerate the relevant module targets and bundles. A feature module desc # is a GN scope with the following fields:
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni index 27be13f..04977b6 100644 --- a/chrome/android/webapk/shell_apk/current_version/current_version.gni +++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@ # //chrome/android/webapk/shell_apk:webapk is changed. This includes # Java files, Android resource files and AndroidManifest.xml. Does not affect # Chrome.apk -current_shell_apk_version = 105 +current_shell_apk_version = 106
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java index 3afe393..701e4f1 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -13,6 +13,7 @@ import android.graphics.Color; import android.os.Build; import android.os.Bundle; +import android.util.Pair; import android.view.View; import android.view.ViewTreeObserver; @@ -213,44 +214,52 @@ /** * Launches the host browser on top of {@link SplashActivity}. - * @param splashPngEncoded PNG-encoded screenshot of {@link mSplashView}. + * @param splashEncoded Encoded screenshot of {@link mSplashView}. + * @param encodingFormat The screenshot's encoding format. */ - private void launch(byte[] splashPngEncoded) { - SplashContentProvider.cache( - this, splashPngEncoded, mSplashView.getWidth(), mSplashView.getHeight()); + private void launch(byte[] splashEncoded, Bitmap.CompressFormat encodingFormat) { + SplashContentProvider.cache(this, splashEncoded, encodingFormat, mSplashView.getWidth(), + mSplashView.getHeight()); H2OLauncher.launch(this, mParams); mParams = null; } /** - * Screenshots and PNG-encodes {@link mSplashView} on a background thread. + * Screenshots and encodes {@link mSplashView} on a background thread. */ @SuppressWarnings("NoAndroidAsyncTaskCheck") private void screenshotAndEncodeSplashInBackground() { final Bitmap bitmap = SplashUtils.screenshotView( mSplashView, SplashContentProvider.MAX_TRANSFER_SIZE_BYTES); if (bitmap == null) { - launch(null); + launch(null, Bitmap.CompressFormat.PNG); return; } mScreenshotSplashTask = new android.os - .AsyncTask<Void, Void, byte[]>() { + .AsyncTask<Void, Void, Pair<byte[], Bitmap.CompressFormat>>() { @Override - protected byte[] doInBackground(Void... args) { + protected Pair<byte[], Bitmap.CompressFormat> doInBackground( + Void... args) { try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); - return out.toByteArray(); + Bitmap.CompressFormat encodingFormat = + SplashUtils.selectBitmapEncoding( + bitmap.getWidth(), bitmap.getHeight()); + bitmap.compress(encodingFormat, 100, out); + return Pair.create(out.toByteArray(), encodingFormat); } catch (IOException e) { } return null; } @Override - protected void onPostExecute(byte[] splashPngEncoded) { + protected void onPostExecute( + Pair<byte[], Bitmap.CompressFormat> splashEncoded) { mScreenshotSplashTask = null; - launch(splashPngEncoded); + launch((splashEncoded == null) ? null : splashEncoded.first, + (splashEncoded == null) ? Bitmap.CompressFormat.PNG + : splashEncoded.second); } // Do nothing if task was cancelled.
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java index 1700de3a..100080c 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java
@@ -54,12 +54,14 @@ * downsampled to fit. Capping the maximum size of the screenshot decreases bitmap encoding * time and image transfer time. */ - public static final int MAX_TRANSFER_SIZE_BYTES = 1024 * 1024 * 4; + public static final int MAX_TRANSFER_SIZE_BYTES = 1024 * 1024 * 12; - /** Mime type of transferred screenshot. */ - private static final String SPLASH_MIME_TYPE = "image/png"; + /** + * The encoding type of the last image vended by the ContentProvider. + */ + private static Bitmap.CompressFormat sEncodingFormat; - private static AtomicReference<ExpiringData> sCachedSplashPngBytes = new AtomicReference<>(); + private static AtomicReference<ExpiringData> sCachedSplashBytes = new AtomicReference<>(); /** The URI handled by this content provider. */ private String mContentProviderUri; @@ -68,14 +70,15 @@ * Temporarily caches the passed-in splash screen screenshot. To preserve memory, the cached * data is cleared after a delay. */ - public static void cache( - Context context, byte[] splashPngBytes, int splashWidth, int splashHeight) { + public static void cache(Context context, byte[] splashBytes, + Bitmap.CompressFormat encodingFormat, int splashWidth, int splashHeight) { SharedPreferences.Editor editor = WebApkSharedPreferences.getPrefs(context).edit(); editor.putInt(WebApkSharedPreferences.PREF_SPLASH_WIDTH, splashWidth); editor.putInt(WebApkSharedPreferences.PREF_SPLASH_HEIGHT, splashHeight); editor.apply(); - getAndSetCachedData(splashPngBytes); + sEncodingFormat = encodingFormat; + getAndSetCachedData(splashBytes); } public static void clearCache() { @@ -86,12 +89,12 @@ * Sets the cached splash screen screenshot and returns the old one. * Thread safety: Can be called from any thread. */ - private static byte[] getAndSetCachedData(byte[] newSplashPngBytes) { + private static byte[] getAndSetCachedData(byte[] newSplashBytes) { ExpiringData newData = null; - if (newSplashPngBytes != null) { - newData = new ExpiringData(newSplashPngBytes, SplashContentProvider::clearCache); + if (newSplashBytes != null) { + newData = new ExpiringData(newSplashBytes, SplashContentProvider::clearCache); } - ExpiringData oldCachedData = sCachedSplashPngBytes.getAndSet(newData); + ExpiringData oldCachedData = sCachedSplashBytes.getAndSet(newData); if (oldCachedData == null) return null; oldCachedData.removeCallbacks(); @@ -117,16 +120,18 @@ public void writeDataToPipe( ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts, Void unused) { try (OutputStream out = new FileOutputStream(output.getFileDescriptor())) { - byte[] cachedSplashPngBytes = getAndSetCachedData(null); - if (cachedSplashPngBytes != null) { - out.write(cachedSplashPngBytes); + byte[] cachedSplashBytes = getAndSetCachedData(null); + if (cachedSplashBytes != null) { + out.write(cachedSplashBytes); } else { // One way that this case gets hit is when the WebAPK is brought to the foreground // via Android Recents after the Android OOM killer has killed the host browser but // not SplashActivity. Bitmap splashScreenshot = recreateAndScreenshotSplash(); if (splashScreenshot != null) { - splashScreenshot.compress(Bitmap.CompressFormat.PNG, 100, out); + sEncodingFormat = SplashUtils.selectBitmapEncoding( + splashScreenshot.getWidth(), splashScreenshot.getHeight()); + splashScreenshot.compress(sEncodingFormat, 100, out); } } out.flush(); @@ -137,7 +142,18 @@ @Override public String getType(Uri uri) { if (uri != null && uri.toString().equals(mContentProviderUri)) { - return SPLASH_MIME_TYPE; + if (sEncodingFormat == null) { + Context context = getContext().getApplicationContext(); + SharedPreferences prefs = WebApkSharedPreferences.getPrefs(context); + int splashWidth = prefs.getInt(WebApkSharedPreferences.PREF_SPLASH_WIDTH, -1); + int splashHeight = prefs.getInt(WebApkSharedPreferences.PREF_SPLASH_HEIGHT, -1); + sEncodingFormat = SplashUtils.selectBitmapEncoding(splashWidth, splashHeight); + } + if (sEncodingFormat == Bitmap.CompressFormat.PNG) { + return "image/png"; + } else if (sEncodingFormat == Bitmap.CompressFormat.JPEG) { + return "image/jpeg"; + } } return null; }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java index 9c130821..b206d18 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java
@@ -18,6 +18,12 @@ /** Contains splash screen related utility methods. */ public class SplashUtils { + /** + * The maximum image size to PNG-encode. JPEG encoding is > 2 times faster on large bitmaps. + * JPEG encoding is preferable to downscaling the screenshot. + */ + private static final int MAX_SIZE_ENCODE_PNG = 1024 * 1024; + /** Creates view with splash screen. */ public static View createSplashView(Context context) { Resources resources = context.getResources(); @@ -28,6 +34,7 @@ SplashLayout.createLayout(context, layout, icon, false /* isIconAdaptive */, false /* isIconGenerated */, resources.getString(R.string.name), WebApkUtils.shouldUseLightForegroundOnBackground(backgroundColor)); + layout.setBackgroundColor(backgroundColor); return layout; } @@ -57,6 +64,12 @@ return bitmap; } + /** Selects encoding for the bitmap based on its size. */ + public static Bitmap.CompressFormat selectBitmapEncoding(int width, int height) { + return (width * height <= MAX_SIZE_ENCODE_PNG) ? Bitmap.CompressFormat.PNG + : Bitmap.CompressFormat.JPEG; + } + /** Creates splash view with the passed-in dimensions and screenshots it. */ public static Bitmap createAndImmediatelyScreenshotSplashView( Context context, int splashWidth, int splashHeight, int maxSizeBytes) {
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 772489c9..10d8608 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1815,11 +1815,8 @@ <message name="IDS_LOGIN_ERROR_OFFLINE_FAILED_NETWORK_NOT_CONNECTED" desc="Couldn't sign in because offline sign-in has failed and network is not connected"> Sorry, your email or password could not be verified. Try connecting to a network first. </message> - <message name="IDS_LOGIN_ERROR_KEYBOARD_SWITCH_HINT" desc="A hint text for the login and lock screens about layout switching"> - Hit Control-Shift-Space to switch keyboard layout. - </message> - <message name="IDS_LOGIN_ERROR_CAPS_LOCK_HINT" desc="A hint text for the login and lock screens that Caps Lock is on"> - Caps Lock is on. + <message name="IDS_LOGIN_ERROR_KEYBOARD_SWITCH_HINT" desc="A hint text for the login and lock screens about correct layout"> + Check your keyboard layout and try again. </message> <message name="IDS_LOGIN_ERROR_CAPTIVE_PORTAL" desc="An error message shown when we suggest that user may be behind the captive portal."> Before signing in, please enter as Guest to activate the network <ph name="NETWORK_ID">$1<ex>Public Wifi</ex></ph> @@ -3068,31 +3065,25 @@ <message name="IDS_ARC_USB_ACCESS_PERMISSION_HEADING" desc="Heading text in the content area of the Android app USB device access permission prompt. Tells the user the app will be able to access the usb device if confirmed."> Allow "<ph name="APP_NAME">$1<ex>Gmail Checker</ex></ph>" to access: </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_LOADING" desc="Loading message of the voice interaction value prop dialog."> + <message name="IDS_ASSISTANT_VALUE_PROP_LOADING" desc="Loading message of the voice interaction value prop dialog."> Loading Google Assistant... </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_TITLE" desc="Load error title of the voice interaction value prop dialog."> + <message name="IDS_ASSISTANT_VALUE_PROP_LOAD_ERROR_TITLE" desc="Load error title of the voice interaction value prop dialog."> Google Assistant </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_MESSAGE" desc="Load error message of the voice interaction value prop dialog."> + <message name="IDS_ASSISTANT_VALUE_PROP_LOAD_ERROR_MESSAGE" desc="Load error message of the voice interaction value prop dialog."> Google Assistant was unable to load, please check your network connection and retry. </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_SKIP_BUTTON" desc="Button label for skipping voice interaction value prop upon error."> + <message name="IDS_ASSISTANT_VALUE_PROP_SKIP_BUTTON" desc="Button label for skipping voice interaction value prop upon error."> Skip </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_RETRY_BUTTON" desc="Button label for retry loading voice interaction value prop."> + <message name="IDS_ASSISTANT_VALUE_PROP_RETRY_BUTTON" desc="Button label for retry loading voice interaction value prop."> Retry </message> - <message name="IDS_VOICE_INTERACTION_VALUE_PROP_NEXT_BUTTION" desc="Button label for accepting voice interaction value proposition."> - Next - </message> - <message name="IDS_WAIT_FOR_CONTAINER_READY_TITLE" desc="Title of the wait for container ready OOBE screen."> - Just a sec - </message> <message name="IDS_WAIT_FOR_CONTAINER_READY_INTRO_MESSAGE" desc="Introduction message for the wait for container ready OOBE screen"> Ask it questions. Tell it to do things. It's your personal Google, always ready to help. </message> - <message name="IDS_VOICE_INTERACTION_LOGO" desc="Logo label for voice interaction."> + <message name="IDS_ASSISTANT_LOGO" desc="Logo label for voice interaction."> Google assistant logo </message> <message name="IDS_ASSISTANT_SCREEN_CONTEXT_TITLE" desc="Title for assistant screen context optin. This is also used as the title for a toggle that lets the assistant use whats on the screen in Assistant settings page.">
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 79ac0d06..33e0ddc1 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">এই অ্যাকাউন্টে আপনার Chromium ডেটা লিঙ্ক করবেন?</translation> <translation id="4271805377592243930">Chromium বিষয়ে সাহায্য পান</translation> <translation id="4285930937574705105">অনির্দিষ্ট ত্রুটির কারণে ইনস্টলেশন ব্যর্থ৷ বর্তমানে Chromium চালু থাকলেও, দয়া করে এটি বন্ধ করুন এবং আবার চেষ্টা করুন৷</translation> +<translation id="4371648796594901282">Chromium OS-এর বিশদ বিবরণ পেতে <ph name="LINK_BEGIN" /> + Chromium OS সম্পর্কে<ph name="LINK_END" /> পৃষ্ঠা দেখুন</translation> <translation id="4407044323746248786">তা স্বত্তেও Chromium ছেড়ে যাবেন?</translation> <translation id="4415566066719264597">Chromium-কে ব্যাকগ্রাউন্ডে চলতে দিন</translation> <translation id="4423735387467980091">Chromium কাস্টমাইজ ও নিয়ন্ত্রণ করুন</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{Chromium-এর একটি আপডেট উপলভ্য আছে}=1{Chromium-এর একটি আপডেট উপলভ্য আছে}one{Chromium-এর একটি আপডেট # দিন ধরে উপলভ্য আছে}other{Chromium-এর একটি আপডেট # দিন ধরে উপলভ্য আছে}}</translation> <translation id="5631814766731275228">Chromium এর নাম এবং ছবি</translation> <translation id="5634636535844844681">Chromium এর জন্য Windows 7 বা উচ্চতর সংস্করণ প্রয়োজন।</translation> +<translation id="5653831366781983928">এখনই Chromium রিস্টার্ট করুন</translation> <translation id="5680901439334282664">Chromium-এ সাইন-ইন করুন</translation> <translation id="5698481217667032250">এই ভাষায় Chromium প্রদর্শন করুন</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -162,6 +165,7 @@ <translation id="6734080038664603509">&Chromium আপডেট করুন</translation> <translation id="6734291798041940871">Chromium ইতোমধ্যে আপনার কম্পিউটারের সকল ব্যবহারকারীর জন্য ইনস্টল করা হয়েছে।</translation> <translation id="6810143991807788455">বর্তমান সেটিংসের রিপোর্ট করার মাধ্যমে Chromium-কে আরও ভালো করতে সাহায্য করুন</translation> +<translation id="6847869444787758381">আপনার পাসওয়ার্ড কখনও চুরি হলে তা Chromium আপনাকে জানিয়ে দেবে</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (Chromium এ কপি করা হয়েছে)</translation> <translation id="6868056391275687737">Chromium-এর অন্যান্য কপি চলছে। আপডেট করতে, সেগুলি বন্ধ করুন।</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 0c52d9f7..df9fec5 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -190,7 +190,7 @@ <translation id="7451052299415159299">Chromium necesita permiso para acceder a tu cámara para este sitio</translation> <translation id="7483335560992089831">No es posible instalar la misma versión de Chromium que se está ejecutando. Cierra Chromium y vuelve a intentarlo.</translation> <translation id="753534427205733210">{0,plural, =1{Se reiniciará Chromium en 1 minuto}other{Se reiniciará Chromium en # minutos}}</translation> -<translation id="7549178288319965365">Acerca de Chromium OS</translation> +<translation id="7549178288319965365">Acerca del Sistema operativo Chromium</translation> <translation id="7561906087460245826">También borrar los datos de Chromium (<ph name="URL" />)</translation> <translation id="7585853947355360626">Si no ves una opción de configuración en esta página, consulta la <ph name="LINK_BEGIN" /> configuración del Sistema operativo Chromium<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index c3694e5c..00794836 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -196,7 +196,8 @@ <translation id="753534427205733210">{0,plural, =1{Muling ilulunsad ang Chromium sa loob ng 1 minuto}one{Muling ilulunsad ang Chromium sa loob ng # minuto}other{Muling ilulunsad ang Chromium sa loob ng # na minuto}}</translation> <translation id="7549178288319965365">Tungkol sa Chromium OS</translation> <translation id="7561906087460245826">I-clear din ang data sa Chromium (<ph name="URL" />)</translation> -<translation id="7585853947355360626">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" />mga setting ng Chromium OS<ph name="LINK_END" /></translation> +<translation id="7585853947355360626">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" /> + mga setting ng Chromium OS<ph name="LINK_END" /></translation> <translation id="761356813943268536">Ginagamit ng Chromium ang iyong camera at mikropono.</translation> <translation id="7617377681829253106">Mas mahusay na ang Chromium</translation> <translation id="7686590090926151193">Hindi Chromium ang iyong default na browser</translation> @@ -230,7 +231,8 @@ <translation id="8619360774459241877">Inilulunsad ang Chromium...</translation> <translation id="8621669128220841554">Nabigo ang pag-install dahil sa hindi natukoy na error. Mangyaring i-download muli ang Chromium.</translation> <translation id="8667808506758191620">Napapanahon ang iyong <ph name="DEVICE_TYPE" />.</translation> -<translation id="8682540261359803721">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" />mga setting ng Chromium browser<ph name="LINK_END" /></translation> +<translation id="8682540261359803721">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" /> + mga setting ng Chromium browser<ph name="LINK_END" /></translation> <translation id="8697124171261953979">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chromium o naghanap mula sa Omnibox.</translation> <translation id="8704119203788522458">Ito ang iyong Chromium</translation> <translation id="8739167630197873875">Maki-clear mo ang cookies kapag umalis ka sa Chromium. Para patuloy na mag-sync, baguhin ang <ph name="COOKIE_SETTINGS_LINK" /> na ito.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 0ced54bc..2a4e0f73 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -92,6 +92,8 @@ <translation id="4230135487732243613">તમારા Chromium ડેટાને આ એકાઉન્ટ સાથે લિંક કરીએ?</translation> <translation id="4271805377592243930">Chromium સાથે સહાય મેળવો</translation> <translation id="4285930937574705105">અમઉલ્લેખિત ભૂલને કારણે ઇન્સ્ટોલેશન નિષ્ફળ થયું. જો Chromium હાલમાં ચાલી રહ્યું હોય, તો તેને બંધ કરો અને ફરી પ્રયાસ કરો.</translation> +<translation id="4371648796594901282">Chromium OSની વિગતો માટે, કૃપા કરીને <ph name="LINK_BEGIN" /> + Chromium OS વિશે<ph name="LINK_END" /> જુઓ</translation> <translation id="4407044323746248786">છતાં પણ Chromiumમાંથી બહાર નિકળવું છે?</translation> <translation id="4415566066719264597">Chromiumને બૅકગ્રાઉન્ડમાં ચાલવા દો</translation> <translation id="4423735387467980091">Chromium ને કસ્ટમાઇઝ અને નિયંત્રિત કરો</translation> @@ -124,6 +126,7 @@ <translation id="5623402015214259806">{0,plural, =0{Chromium અપડેટ ઉપલબ્ધ છે}=1{Chromium અપડેટ ઉપલબ્ધ છે}one{Chromium અપડેટ # દિવસ માટે ઉપલબ્ધ છે}other{Chromium અપડેટ # દિવસ માટે ઉપલબ્ધ છે}}</translation> <translation id="5631814766731275228">Chromiumમાંનું નામ અને ફોટો</translation> <translation id="5634636535844844681">Chromium માટે Windows 7 અથવા તે પછીનું સંસ્કરણ આવશ્યક છે.</translation> +<translation id="5653831366781983928">કૃપા કરીને હવે Chromium ફરી શરૂ કરો</translation> <translation id="5680901439334282664">Chromium માં સાઇન ઇન કરો</translation> <translation id="5698481217667032250">આ ભાષામાં Chromium બતાવો</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -166,6 +169,7 @@ <translation id="6734080038664603509">&Chromium ને અપડેટ કરો</translation> <translation id="6734291798041940871">Chromium, તમારા કમ્પ્યુટર પર તમામ વપરાશકર્તાઓ માટે પહેલાંથી ઇન્સ્ટૉલ કરેલ છે.</translation> <translation id="6810143991807788455">વર્તમાન સેટિંગ્સની જાણ કરીને Chromium ને વધુ સારું બનાવવામાં સહાય કરો</translation> +<translation id="6847869444787758381">Chromium વડે તમે તમારા પાસવર્ડમાં ક્યારેક ચેડાં થાય તો તેના વિશે જાણકારી મેળવી શકો છો</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (Chromium પર કૉપિ કરેલું છે)</translation> <translation id="6868056391275687737">Chromiumની બીજી કૉપિ ચાલી રહી છે. અપડેટ કરવા માટે, એ કૉપિ બંધ કરો.</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index fe5db1e..5aa7297 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">Tautkan data Chromium Anda ke akun ini?</translation> <translation id="4271805377592243930">Dapatkan bantuan Chromium</translation> <translation id="4285930937574705105">Pemasangan gagal karena kesalahan yang tidak diketahui. Jika Chromium sedang berjalan, tutup, lalu ulang kembali.</translation> +<translation id="4371648796594901282">Untuk detail Chromium OS, lihat <ph name="LINK_BEGIN" /> + Tentang Chromium OS<ph name="LINK_END" /></translation> <translation id="4407044323746248786">Tetap keluar dari Chromium?</translation> <translation id="4415566066719264597">Jalankan Chromium di Background</translation> <translation id="4423735387467980091">Menyesuaikan dan mengontrol Chromium</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{Update Chromium tersedia}=1{Update Chromium tersedia}other{Update Chromium telah tersedia selama # hari}}</translation> <translation id="5631814766731275228">Nama dan gambar Chromium</translation> <translation id="5634636535844844681">Chromium memerlukan Windows 7 atau lebih tinggi.</translation> +<translation id="5653831366781983928">Mulai ulang Chromium sekarang</translation> <translation id="5680901439334282664">masuk ke Chromium</translation> <translation id="5698481217667032250">Tampilkan Chromium dalam bahasa ini</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -164,6 +167,7 @@ <translation id="6734080038664603509">Pembaruan &Chromium</translation> <translation id="6734291798041940871">Chromium sudah terpasang untuk semua pengguna di komputer Anda.</translation> <translation id="6810143991807788455">Bantu menjadikan Chromium lebih baik dengan melaporkan setelan saat ini</translation> +<translation id="6847869444787758381">Chromium akan memberi tahu jika sandi Anda disusupi</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (disalin ke Chromium)</translation> <translation id="6868056391275687737">Salinan Chromium lain sedang berjalan. Untuk menjalankan update, tutup salinan tersebut.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 1d43268..52be6d59 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -92,6 +92,8 @@ <translation id="4230135487732243613">നിങ്ങളുടെ Chromium ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്ക് ചെയ്യണോ?</translation> <translation id="4271805377592243930">Chromium ഉപയോഗിക്കുന്നതിനുള്ള സഹായം തേടുക</translation> <translation id="4285930937574705105">അവ്യക്തമായ പിശകിനാൽ ഇൻസ്റ്റാൾ ചെയ്യൽ പരാജയപ്പെട്ടു. Chromium നിലവിൽ പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, അത് അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="4371648796594901282">Chromium OS വിശദാംശങ്ങൾക്ക് <ph name="LINK_BEGIN" /> + Chromium OS-നെക്കുറിച്ച്<ph name="LINK_END" /> എന്ന പേജ് കാണുക</translation> <translation id="4407044323746248786">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="4415566066719264597">Chromium-ത്തെ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കാൻ അനുവദിക്കുക</translation> <translation id="4423735387467980091">Chromium ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> @@ -124,6 +126,7 @@ <translation id="5623402015214259806">{0,plural, =0{Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> <translation id="5631814766731275228">Chromium പേരും ചിത്രവും</translation> <translation id="5634636535844844681">Chromium-ത്തിന് Windows 7 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്.</translation> +<translation id="5653831366781983928">Chromium ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="5680901439334282664">Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="5698481217667032250">ഈ ഭാഷയിൽ Chromium പ്രദർശിപ്പിക്കുക</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -166,6 +169,7 @@ <translation id="6734080038664603509">&Chromium അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="6734291798041940871">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ എല്ലാ ഉപയോക്താക്കൾക്കുമായി നിലവിൽ Chromium ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്.</translation> <translation id="6810143991807788455">നിലവിലെ ക്രമീകരണങ്ങൾ റിപ്പോർട്ട് ചെയ്യുന്നതിലൂടെ Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation> +<translation id="6847869444787758381">നിങ്ങളുടെ പാസ്വേഡുകൾ എപ്പോഴെങ്കിലും അപഹരിക്കപ്പെട്ടിട്ടുണ്ടെങ്കിൽ അക്കാര്യം Chromium നിങ്ങളെ അറിയിക്കും</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (Chromium-ത്തിലേക്ക് പകർത്തി)</translation> <translation id="6868056391275687737">Chromium-ത്തിൻ്റെ മറ്റ് പകർപ്പുകൾ റൺ ചെയ്യുന്നുണ്ട്. അപ്ഡേറ്റ് ചെയ്യാൻ അവ അടയ്ക്കുക.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index 9f9f399..fb787d0 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">Vil du koble Chromium-dataene dine til denne kontoen?</translation> <translation id="4271805377592243930">Få hjelp med Chromium</translation> <translation id="4285930937574705105">Installeringen mislyktes på grunn av en uspesifisert feil. Lukk Chromium hvis nettleseren kjører, og prøv på nytt.</translation> +<translation id="4371648796594901282">For detaljer om Chromium OS, se <ph name="LINK_BEGIN" /> + Om Chromium OS<ph name="LINK_END" /></translation> <translation id="4407044323746248786">Vil du avslutte Chromium likevel?</translation> <translation id="4415566066719264597">La Chromium kjøre i bakgrunnen</translation> <translation id="4423735387467980091">Tilpass og kontrollér Chromium</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{En Chromium-oppdatering er tilgjengelig}=1{En Chromium-oppdatering er tilgjengelig}other{En Chromium-oppdatering har vært tilgjengelig i # dager}}</translation> <translation id="5631814766731275228">Navn og bilde i Chromium</translation> <translation id="5634636535844844681">Chromium krever Windows 7 eller nyere.</translation> +<translation id="5653831366781983928">Start Chromium på nytt nå</translation> <translation id="5680901439334282664">logg på Chromium</translation> <translation id="5698481217667032250">Vis Chromium på dette språket</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -164,6 +167,7 @@ <translation id="6734080038664603509">Oppdater &Chromium</translation> <translation id="6734291798041940871">Chromium er allerede installert for alle brukerne på datamaskinen din.</translation> <translation id="6810143991807788455">Bidra til å gjøre Chromium bedre ved å rapportere inn de gjeldende innstillingene</translation> +<translation id="6847869444787758381">Med Chromium får du beskjed hvis passordene dine noensinne utsettes for sikkerhetsbrudd</translation> <translation id="6857782730669500492">Chromium – <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (kopiert til Chromium)</translation> <translation id="6868056391275687737">Andre kopier av Chromium kjører. For å oppdatere må du lukke dem.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index caa3574..740c297 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -92,6 +92,8 @@ <translation id="4230135487732243613">Vill du koppla dina uppgifter i Chromium till det här kontot?</translation> <translation id="4271805377592243930">Få hjälp med Chromium</translation> <translation id="4285930937574705105">Installationen misslyckades på grund av ett ospecificerat fel. Stäng Chromium om det är igång och försök sedan igen.</translation> +<translation id="4371648796594901282">Mer information om Chromium OS finns under <ph name="LINK_BEGIN" /> + Om Chromium OS<ph name="LINK_END" /></translation> <translation id="4407044323746248786">Vill du avsluta Chromium ändå?</translation> <translation id="4415566066719264597">Låt Chromium köras i bakgrunden</translation> <translation id="4423735387467980091">Anpassa och kontrollera Chromium</translation> @@ -124,6 +126,7 @@ <translation id="5623402015214259806">{0,plural, =0{Det finns en uppdatering för Chromium}=1{Det finns en uppdatering för Chromium}other{Det finns en uppdatering för Chromium sedan # dagar}}</translation> <translation id="5631814766731275228">Namn och bild i Chromium</translation> <translation id="5634636535844844681">För Chromium krävs Windows 7 eller senare.</translation> +<translation id="5653831366781983928">Starta om Chromium nu</translation> <translation id="5680901439334282664">Logga in i Chromium</translation> <translation id="5698481217667032250">Visa Chromium på det här språket</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -166,6 +169,7 @@ <translation id="6734080038664603509">Uppdatera &Chromium</translation> <translation id="6734291798041940871">Chromium har redan installerats för alla användare på datorn.</translation> <translation id="6810143991807788455">Hjälp oss att förbättra Chromium genom att rapportera dina aktuella inställningar</translation> +<translation id="6847869444787758381">Om dina lösenord någonsin skulle läcka ut får du veta det i Chromium</translation> <translation id="6857782730669500492">Chromium – <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (har kopierats till Chromium)</translation> <translation id="6868056391275687737">Andra kopior av Chromium körs. Stäng dem om du vill uppdatera.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index e812162..009a077c 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -92,6 +92,8 @@ <translation id="4230135487732243613">Ungependa kuunganisha data yako ya Chromium kwenye akaunti hii?</translation> <translation id="4271805377592243930">Pata usaidizi wa kutumia Chromium</translation> <translation id="4285930937574705105">Usanidi umeshindwa kwa sababu ya hitilafu isiyojulikana. Ikiwa Chromium inaendesha sasa, tafadhali ifunge na ujaribu tena.</translation> +<translation id="4371648796594901282">Ili upate maelezo kuhusu Mfumo wa Uendeshaji wa Chromium, tafadhali angalia <ph name="LINK_BEGIN" /> + Kuhusu Mfumo wa Uendeshaji wa Chromium<ph name="LINK_END" /></translation> <translation id="4407044323746248786">Ungependa kufunga Chromium?</translation> <translation id="4415566066719264597">Ruhusu Chromium itumike Chinichini</translation> <translation id="4423735387467980091">Dhibiti na ugeuze Chromium ikufae</translation> @@ -124,6 +126,7 @@ <translation id="5623402015214259806">{0,plural, =0{Sasisho la Chromium linapatikana}=1{Sasisho la Chromium linapatikana}other{Sasisho la Chromium limekuwepo kwa siku #}}</translation> <translation id="5631814766731275228">Jina na picha kwenye Chromium</translation> <translation id="5634636535844844681">Chromium inahitaji Windows 7 au toleo jipya zaidi.</translation> +<translation id="5653831366781983928">Tafadhali zima kisha uwashe Chromium sasa</translation> <translation id="5680901439334282664">ingia katika Chromium</translation> <translation id="5698481217667032250">Onyesha Chromium katika lugha hii</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -166,6 +169,7 @@ <translation id="6734080038664603509">Sasisha &Chromium</translation> <translation id="6734291798041940871">Tayari Chromium imesakinishwa kwa watumiaji wote kwenye kompyuta yako.</translation> <translation id="6810143991807788455">Saidia kuboresha Chromium kwa kuripoti mipangilio ya sasa</translation> +<translation id="6847869444787758381">Chromium hukuruhusu ujue iwapo manenosiri yako yameathiriwa</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (imenakiliwa kwenye Chromium)</translation> <translation id="6868056391275687737">Nakala nyingine za Chromium zinatumika. Zifunge ili usasishe.</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index a7e63fe..acd8b42 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -88,6 +88,8 @@ <translation id="4230135487732243613">Chromium verileriniz bu hesaba bağlansın mı?</translation> <translation id="4271805377592243930">Chromium'la ilgili yardım alın</translation> <translation id="4285930937574705105">Belirlenemeyen bir hata nedeniyle yükleme başarısız oldu. Chromium şu anda çalışır durumdaysa kapatıp yeniden deneyin.</translation> +<translation id="4371648796594901282">Chromium OS ayrıntıları için lütfen <ph name="LINK_BEGIN" /> + Chromium OS Hakkında<ph name="LINK_END" /> sayfasına bakın</translation> <translation id="4407044323746248786">Yine de Chromium'dan çıkılsın mı?</translation> <translation id="4415566066719264597">Chromium'un Arka Planda Çalışmasına İzin Ver</translation> <translation id="4423735387467980091">Chromium'u özelleştirin ve kontrol edin</translation> @@ -120,6 +122,7 @@ <translation id="5623402015214259806">{0,plural, =0{Bir Chromium güncellemesi var}=1{Bir Chromium güncellemesi var}other{# gün önce kullanıma sunulmuş bir Chromium güncellemesi var}}</translation> <translation id="5631814766731275228">Chromium adı ve resmi</translation> <translation id="5634636535844844681">Chromium, Windows 7 veya daha sonraki bir sürümü gerektirir.</translation> +<translation id="5653831366781983928">Lütfen Chromium'u şimdi yeniden başlatın</translation> <translation id="5680901439334282664">Chromium'da oturum açın</translation> <translation id="5698481217667032250">Chromium'u bu dilde görüntüle</translation> <translation id="5820394555380036790">Chromium OS</translation> @@ -162,6 +165,7 @@ <translation id="6734080038664603509">&Chromium'u güncelle</translation> <translation id="6734291798041940871">Chromium zaten bilgisayarınızdaki tüm kullanıcılar için yüklendi.</translation> <translation id="6810143991807788455">Mevcut ayarlarınızı bildirerek Chromium'u daha iyi hale getirmemize yardımcı olun</translation> +<translation id="6847869444787758381">Chromium, şifrelerinizin güvenliğinin ihlal edilip edilmediğini size bildirir</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (Chromium'a kopyalandı)</translation> <translation id="6868056391275687737">Chromium'un açık olan kopyaları var. Güncellemek için bunları kapatın.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index 378af68..8dc33ec8 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">Bạn muốn liên kết dữ liệu Chromium của bạn với tài khoản này?</translation> <translation id="4271805377592243930">Nhận trợ giúp về Chromium</translation> <translation id="4285930937574705105">Không thể cài đặt do lỗi chưa xác định. Nếu Chromium hiện đang chạy, hãy đóng Chromium và thử lại.</translation> +<translation id="4371648796594901282">Để biết thông tin chi tiết về Chromium OS, vui lòng xem phần <ph name="LINK_BEGIN" /> + Giới thiệu về Chromium OS<ph name="LINK_END" /></translation> <translation id="4407044323746248786">Bạn vẫn muốn thoát khỏi Chromium?</translation> <translation id="4415566066719264597">Cho phép Chromium chạy trong nền</translation> <translation id="4423735387467980091">Tùy chỉnh và điều khiển Chromium</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{Đã có bản cập nhật Chromium}=1{Đã có bản cập nhật Chromium}other{Đã có bản cập nhật Chromium từ # ngày trước}}</translation> <translation id="5631814766731275228">Tên và ảnh trên Chromium</translation> <translation id="5634636535844844681">Chromium yêu cầu Windows 7 trở lên.</translation> +<translation id="5653831366781983928">Vui lòng khởi động lại Chromium ngay bây giờ</translation> <translation id="5680901439334282664">đăng nhập vào Chromium</translation> <translation id="5698481217667032250">Hiển thị Chromium bằng ngôn ngữ này</translation> <translation id="5820394555380036790">Hệ điều hành Chromium</translation> @@ -164,6 +167,7 @@ <translation id="6734080038664603509">Cập nhật &Chromium</translation> <translation id="6734291798041940871">Chromium đã được cài đặt cho tất cả người dùng trên máy tính của bạn.</translation> <translation id="6810143991807788455">Giúp cải thiện Chromium bằng cách báo cáo cài đặt hiện tại</translation> +<translation id="6847869444787758381">Chromium cho bạn biết mật khẩu của bạn có bị đánh cắp hay không</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (đã sao chép vào Chromium)</translation> <translation id="6868056391275687737">Các bản sao khác của Chromium đang chạy. Để cập nhật, hãy đóng các bản sao này.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 672a309a..635af127d 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">是否将您的 Chromium 数据与此帐号相关联?</translation> <translation id="4271805377592243930">获取有关 Chromium 的帮助</translation> <translation id="4285930937574705105">未知错误导致安装失败。如果 Chromium 正在运行,请将其关闭,然后重试。</translation> +<translation id="4371648796594901282">如需详细了解 Chromium 操作系统,请参阅 <ph name="LINK_BEGIN" /> + Chromium 操作系统简介<ph name="LINK_END" /></translation> <translation id="4407044323746248786">仍要退出 Chromium?</translation> <translation id="4415566066719264597">让 Chromium 在后台运行</translation> <translation id="4423735387467980091">自定义及控制 Chromium</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{有一项可用的 Chromium 更新}=1{有一项可用的 Chromium 更新}other{有一项可用的 Chromium 更新(已发布 # 天)}}</translation> <translation id="5631814766731275228">Chromium 名称和图片</translation> <translation id="5634636535844844681">Chromium 仅支持 Windows 7 或更高版本的操作系统。</translation> +<translation id="5653831366781983928">请立即重启 Chromium</translation> <translation id="5680901439334282664">登录 Chromium</translation> <translation id="5698481217667032250">以这种语言显示 Chromium</translation> <translation id="5820394555380036790">Chromium 操作系统</translation> @@ -164,6 +167,7 @@ <translation id="6734080038664603509">更新 Chromium(&C)</translation> <translation id="6734291798041940871">已为您计算机上的所有用户都安装 Chromium。</translation> <translation id="6810143991807788455">报告当前设置,帮助我们完善 Chromium</translation> +<translation id="6847869444787758381">Chromium 会让您知道您的密码是否曾被泄露</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay(已复制到 Chromium)</translation> <translation id="6868056391275687737">Chromium 的其他副本正在运行。若要更新,请关闭这些副本。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 49ad4c3..39518d6 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -90,6 +90,8 @@ <translation id="4230135487732243613">要將你的 Chromium 資料連結至這個帳戶嗎?</translation> <translation id="4271805377592243930">前往 Chromium 說明頁面</translation> <translation id="4285930937574705105">不明錯誤導致安裝失敗。如果目前 Chromium 正在執行,請關閉 Chromium,然後再試一次。</translation> +<translation id="4371648796594901282">如需 Chromium 作業系統的詳細資料,請參閱<ph name="LINK_BEGIN" /> + 關於 Chromium 作業系統<ph name="LINK_END" /></translation> <translation id="4407044323746248786">確定要結束 Chromium 嗎?</translation> <translation id="4415566066719264597">讓 Chromium 在背景執行</translation> <translation id="4423735387467980091">自訂及控制 Chromium</translation> @@ -122,6 +124,7 @@ <translation id="5623402015214259806">{0,plural, =0{有可用的 Chromium 更新}=1{有可用的 Chromium 更新}other{Chromium 更新已發布 # 天}}</translation> <translation id="5631814766731275228">Chromium 名稱和相片</translation> <translation id="5634636535844844681">Chromium 僅支援 Windows 7 以上版本的作業系統。</translation> +<translation id="5653831366781983928">請立即重新啟動 Chromium</translation> <translation id="5680901439334282664">登入 Chromium</translation> <translation id="5698481217667032250">將 Chromium 的介面文字設為這種語言</translation> <translation id="5820394555380036790">Chromium 作業系統</translation> @@ -164,6 +167,7 @@ <translation id="6734080038664603509">更新 Chromium(&C)</translation> <translation id="6734291798041940871">電腦上的所有使用者都已經安裝 Chromium 了。</translation> <translation id="6810143991807788455">只要回報目前的設定,就能助我們一臂之力,讓 Chromium 更臻完美</translation> +<translation id="6847869444787758381">Chromium 會通知你密碼是否曾遭到盜用</translation> <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation> <translation id="6863361426438995919">Google Pay (已複製到 Chromium)</translation> <translation id="6868056391275687737">有其他 Chromium 瀏覽器正在執行中。如要更新,請關閉這些瀏覽器。</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index c872eec..83f5eafd 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">শুধুমাত্র বর্তমান ছদ্মবেশী সেশন</translation> <translation id="1698650002254827833">সেই সমস্ত অ্যাপের তালিকা যা লোড করা যাবে না। আবার চেষ্টা করুন।</translation> <translation id="1701062906490865540">এই ব্যক্তিকে সরান</translation> +<translation id="1703331064825191675">আপনার পাসওয়ার্ড সম্পর্কে কখনও চিন্তা করবেন না</translation> <translation id="1706586824377653884">আপনার প্রশাসক দ্বারা যোগ করা হয়েছে</translation> <translation id="1706625117072057435">জুম লেভেল</translation> <translation id="1708338024780164500">(নিষ্ক্রিয়)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">বিটা</translation> <translation id="176587472219019965">&নতুন উইন্ডো</translation> <translation id="1766575458646819543">ফুল-স্ক্রিন থেকে বেরিয়ে আসা হয়েছে</translation> +<translation id="1766957085594317166">পাসওয়ার্ডগুলি Google অ্যাকাউন্টে নিরাপদে সেভ করুন এবং আপনাকে এগুলি আর কখনও টাইপ করতে হবে না</translation> <translation id="1768278914020124551">ওহো! লগ-অন সার্ভারের সাথে যোগাযোগ করার সময় একটি সমস্যা হয়েছে। আপনার নেটওয়ার্ক সংযোগ এবং ডোমেন নাম পরীক্ষা করে আবার চেষ্টা করুন।</translation> <translation id="1769104665586091481">নতুন &উইন্ডোতে লিঙ্ক খুলুন</translation> <translation id="1773212559869067373">স্থানীয়ভাবে যাচাইকরণ সার্টিফিকেট বাতিল করা হয়েছে</translation> @@ -1874,6 +1876,7 @@ <translation id="3748026146096797577">সংযুক্ত নয়</translation> <translation id="3752582316358263300">ঠিক আছে...</translation> <translation id="3752673729237782832">আমার ডিভাইসগুলি</translation> +<translation id="3753033997400164841">একবার সেভ করুন। সব জায়গায় ব্যবহার করুন</translation> <translation id="3755411799582650620">এছাড়াও আপনার <ph name="PHONE_NAME" /> এখন এই <ph name="DEVICE_TYPE" /> আনলক করতে পারে৷</translation> <translation id="375636864092143889">সাইটটি আপনার মাইক্রোফোন ব্যবহার করছে</translation> <translation id="3757733214359997190">কোনও সাইট পাওয়া যায়নি</translation> @@ -2205,6 +2208,7 @@ <translation id="4232375817808480934">Kerberos কনফিগার করুন</translation> <translation id="4235200303672858594">সম্পূর্ণ স্ক্রিন</translation> <translation id="4235965441080806197">সাইন-ইন বাতিল করুন</translation> +<translation id="4242145785130247982">একাধিক ক্লায়েন্ট সার্টিফিকেট কাজ করে না</translation> <translation id="4242533952199664413">সেটিংস খুলুন</translation> <translation id="4242577469625748426">ডিভাইসে নীতি সেটিংস ইনস্টল করা যায়নি: <ph name="VALIDATION_ERROR" />৷</translation> <translation id="4244238649050961491">আরও স্টাইলাস স্টাইলাস অ্যাপ খুঁজুন</translation> @@ -2663,6 +2667,7 @@ <translation id="4957949153200969297">শুধুমাত্র <ph name="IDS_SHORT_PRODUCT_NAME" /> সিঙ্ক সম্পর্কিত বৈশিষ্ট্যগুলি চালু করুন</translation> <translation id="4959262764292427323">পাসওয়ার্ডগুলি আপনার Google অ্যাকাউন্টে সেভ করা হয়েছে যাতে আপনি আপনার যেকোনও ডিভাইসে সেগুলি ব্যবহার করতে পারেন</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">এই অ্যাপটি আপনার অ্যাডমিনিস্ট্রেটর ইনস্টল করে দিয়েছেন।</translation> <translation id="4964455510556214366">সাজানোর ব্যবস্থা</translation> <translation id="4964673849688379040">চেক করা হচ্ছে...</translation> <translation id="4965808351167763748">Hangouts Meet চালাতে আপনি এই ডিভাইস সেট-আপ করতে চান?</translation> @@ -2920,6 +2925,7 @@ <translation id="5360150013186312835">টুলবারের মধ্যে দেখুন</translation> <translation id="5362741141255528695">ব্যক্তিগত কী ফাইল নির্বাচন করুন৷</translation> <translation id="5363109466694494651">পাওয়ারওয়াশ এবং প্রত্যাবর্তন করুন</translation> +<translation id="5365716706805792666">আপনার পাসওয়ার্ড কোনও ডেটার নিরাপত্তা লঙ্ঘনের অংশ ছিল কিনা তা Google যাচাই করতে পারে। আপনার Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করলেই এটি চালু হয়ে যাবে।</translation> <translation id="5365881113273618889">আপনি যে ফোল্ডার বেছে নিয়েছেন সেটিতে সংবেদনশীল ফাইল আছে। আপনি কি "<ph name="APP_NAME" />"-কে স্থায়ীভাবে লেখার অ্যাক্সেস দেওয়ার ব্যাপারে নিশ্চিত?</translation> <translation id="5367091008316207019">ফাইল পড়া হচ্ছে..</translation> <translation id="5368720394188453070">আপনার ফোন লক করা আছে৷ লিখতে আনলক করুন৷</translation> @@ -3874,6 +3880,7 @@ <translation id="6769712124046837540">প্রিন্টার যোগ করা হচ্ছে...</translation> <translation id="6770664076092644100">NFC এর মাধ্যমে যাচাই করুন</translation> <translation id="6771503742377376720">একটি শংসাপত্রের কর্তৃপক্ষ</translation> +<translation id="6775163072363532304">উপলভ্য ডিভাইসগুলি এখানে দেখা যাবে।</translation> <translation id="6777817260680419853">রিডাইরেক্ট ব্লক করা হয়েছে</translation> <translation id="6778737459546443941">আপনার পিতামাতা এখনও এটি অনুমোদন করেন নি</translation> <translation id="677965093459947883">অতি ক্ষুদ্র</translation> @@ -4334,6 +4341,7 @@ <translation id="7441830548568730290">অন্যান্য ব্যবহারকারী</translation> <translation id="7442465037756169001">আপনার Hangouts Meet Hardware সেট-আপ করার জন্য প্রস্তুত।</translation> <translation id="744341768939279100">একটি নতুন প্রোফাইল তৈরি করুন</translation> +<translation id="7443806024147773267">Google অ্যাকাউন্টে যেকোনও সময়ে সাইন-ইন করে আপনার পাসওয়ার্ড অ্যাক্সেস করুন</translation> <translation id="7444046173054089907">সাইটটি অবরুদ্ধ</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> বন্ধ করুন</translation> <translation id="7448430327655618736">অ্যাপ অটোমেটিক ইনস্টল করে</translation> @@ -4746,6 +4754,7 @@ <translation id="8014154204619229810">আপডেটার চলছে। আবার চেক করতে মিনিটখানেকের মধ্যে রিফ্রেশ করুন।</translation> <translation id="8014206674403687691">ইনস্টল করা পূর্ববর্তী সংস্করণে <ph name="IDS_SHORT_PRODUCT_NAME" />কে নিয়ে যাওয়া যায়নি৷ দয়া করে আপনার ডিভাইসকে আবার পাওয়ারওয়াশ করার চেষ্টা করুন৷</translation> <translation id="8014210335923519270">Google-এ সিস্টেমের তথ্য এবং ব্যবহারের তথ্য পাঠিয়ে <ph name="IDS_SHORT_PRODUCT_NAME" /> এবং তার নিরাপত্তা উন্নত করুন</translation> +<translation id="8015780634880457457">আপনার পাসওয়ার্ড কোনও ডেটার নিরাপত্তা লঙ্ঘনের অংশ ছিল কিনা তা Google যাচাই করতে পারে</translation> <translation id="8016266267177410919">অস্থায়ী স্টোরেজ</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">শর্টকাট এডিট করা হয়েছে</translation> @@ -4863,6 +4872,7 @@ <translation id="8188389033983459049">আপনার ডিভাইসের সেটিংস চেক করুন এবং চালিয়ে যেতে এটি চালু করুন</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />-তে সংযুক্ত হচ্ছে</translation> <translation id="8191230140820435481">আপনার অ্যাপ্লিকেশন, এক্সটেনশন, এবং থিম পরিচালনা করুন</translation> +<translation id="819464600477418284">এই অ্যাপটি Chrome OS-এর অংশ হওয়ায় এটি আনইনস্টল করা যাচ্ছে না।</translation> <translation id="8195027750202970175">ডিস্কের মাপ</translation> <translation id="8198323535106903877">আপনার জন্য সেই <ph name="NUMBER_OF_APPS" />টি অ্যাপ আমরা ইনস্টল করে দেব</translation> <translation id="8199300056570174101">নেটওয়ার্ক (পরিষেবা) এবং ডিভাইসের বৈশিষ্ট্য</translation> @@ -4923,6 +4933,7 @@ <ph name="BEGIN_PARAGRAPH2" />এই ফিচারটি বন্ধ করে দিলেও এই ডিভাইসটি সিস্টেম আপডেট এবং নিরাপত্তার জন্য প্রয়োজনীয় পরিষেবা সম্পর্কিত তথ্য পাঠাতে পারে।<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />সেটিংস > অ্যাডভান্সড > নিজে থেকে Google-এ ডায়গনস্টিক ও ব্যবহারের ডেটা পাঠান বিকল্পে গিয়ে মালিক এই ফিচারটি নিয়ন্ত্রণ করতে পারেন।<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />যদি আপনার সন্তানের জন্য অতিরিক্ত ওয়েব ও অ্যাপ অ্যাক্টিভিটি সেটিংস চালু করা থাকে তাহলে এই ডেটা তার Google অ্যাকাউন্টে সেভ করা হতে পারে। এই সেটিংস সম্বন্ধে আরও জানুন এবং এগুলিকে families.google.com-এ কীভাবে অ্যাডজাস্ট করবেন তা জানুন।<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">ক্লায়েন্ট সার্টিফিকেটটি সঠিক নয়</translation> <translation id="8270242299912238708">পিডিএফ দস্তাবেজগুলি</translation> <translation id="827097179112817503">হোম বোতাম দেখান</translation> <translation id="8271246892936492311">{COUNT,plural, =1{১টি বুকমার্ক মোছা হয়েছে}one{#টি বুকমার্ক মোছা হয়েছে}other{#টি বুকমার্ক মোছা হয়েছে}}</translation> @@ -5336,6 +5347,7 @@ <translation id="8874184842967597500">সংযুক্ত নয়</translation> <translation id="8876307312329369159">ডেমো সেশনে এই সেটিংটি পরিবর্তন করা যাবে না।</translation> <translation id="8877448029301136595">[parent directory]</translation> +<translation id="8879220587046205278">এক্সটারনাল স্টোরেজ ডিভাইসে ফাইল পড়তে এবং সেভ করতে Google Play থেকে ডাউনলোড করা অ্যাপের সম্পূর্ণ ফাইল সিস্টেমে অ্যাক্সেসের প্রয়োজন হতে পারে। ডিভাইসে তৈরি করা ফাইল এবং ফোল্ডার এক্সটারনাল ড্রাইভ ব্যবহারকারীরা দেখতে পারবেন।</translation> <translation id="8879284080359814990">ট্যাব রূপে &দেখান</translation> <translation id="8879921471468674457">সাইন-ইন সংক্রান্ত তথ্য মনে রাখুন</translation> <translation id="8881020143150461183">আবার চেষ্টা করুন। প্রযুক্তিগত সহায়তা পেতে <ph name="CARRIER_NAME" />-এর সাথে যোগাযোগ করুন।</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 296f64e..008788f 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -302,7 +302,7 @@ <translation id="1444628761356461360">Ang setting na ito ay pinamamahalaan ng may-ari ng device, <ph name="OWNER_EMAIL" />.</translation> <translation id="144518587530125858">Maaaring hindi mai-load ang '<ph name="IMAGE_PATH" />' para sa tema.</translation> <translation id="1445693676523799095">Puwede itong magtagal nang ilang sandali</translation> -<translation id="1450011005989029586">Nailantad ang iyong password dahil sa paglabag sa data sa isang site o app na ginagamit mo. Inirerekomenda ng Chrome na <ph name="BOLD" /> sa <ph name="ORIGIN" /> ngayon.</translation> +<translation id="1450011005989029586">Nailantad ang iyong password dahil sa isang paglabag sa data sa isang site o app na ginagamit mo. Inirerekomenda ng Chrome na <ph name="BOLD" /> sa <ph name="ORIGIN" /> ngayon.</translation> <translation id="1451375123200651445">Webpage, Iisang File</translation> <translation id="1451917004835509682">Magdagdag ng Pinapangasiwaang Tao</translation> <translation id="1454223536435069390">Kumuha ng screenshot</translation> @@ -967,7 +967,7 @@ <translation id="2423578206845792524">I-sa&ve ang larawan bilang...</translation> <translation id="2428510569851653187">Ilarawan ang ginagawa mo noong nag-crash ang tab</translation> <translation id="2431027948063157455">Hindi na-load ang Google Assistant, pakitingnan ang iyong koneksyon sa network at subukang muli.</translation> -<translation id="243242775089461296">Naka-off ang pag-block sa cookie ng third-party para sa site na ito</translation> +<translation id="243242775089461296">Naka-off ang pag-block sa cookie ng third party para sa site na ito</translation> <translation id="2432753757290432042">Kinakailangang i-update ang Linux (Beta)</translation> <translation id="2433452467737464329">Magdagdag ng query param sa URL upang i-auto-refresh ang pahina: chrome://network/?refresh=<sec></translation> <translation id="2433507940547922241">Hitsura</translation> @@ -1279,7 +1279,7 @@ <translation id="2849936225196189499">Kritikal</translation> <translation id="2850541429955027218">Magdagdag ng tema</translation> <translation id="2851634818064021665">Kailangan mo ng pahintulot upang mabisita ang site na ito</translation> -<translation id="2854896010770911740">Alising ang Cookies ng Third-Party</translation> +<translation id="2854896010770911740">Alisin ang Cookies ng Third Party</translation> <translation id="2858138569776157458">Top na sites</translation> <translation id="2859806420264540918">Nagpapakita ang site na ito ng mga nakakasagabal o nakakapanlinlang na ad.</translation> <translation id="2861301611394761800">Kumpleto na ang pag-update ng system. Paki-restart ang system.</translation> @@ -1668,7 +1668,7 @@ <translation id="346431825526753">Isa itong account para sa mga bata na pinamamahalaan ni <ph name="CUSTODIAN_EMAIL" />.</translation> <translation id="3468999815377931311">Android phone</translation> <translation id="3470442499439619530">Alisin ang User na Ito</translation> -<translation id="3471876058939596279">Hindi magagamot ang HDMI at USB Type-C port para sa video nang sabay. Gumamit ng ibang port para sa video.</translation> +<translation id="3471876058939596279">Hindi magagamit ang HDMI at USB Type-C port para sa video nang sabay. Gumamit ng ibang port para sa video.</translation> <translation id="3473479545200714844">Screen magnifier</translation> <translation id="3475843873335999118">Paumanhin, hindi pa rin nakikilala ang iyong fingerprint. Pakilagay ang password mo.</translation> <translation id="3476303763173086583">Magpadala ng data ng paggamit at diagnostic na data. Tumulong sa pagpapaganda ng karanasan ng iyong anak sa Android sa pamamagitan ng awtomatikong pagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito. Maaaring piliin ng may-aring magpadala ng diagnostic na data at data ng paggamit para sa device na ito sa Google. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google account. <ph name="BEGIN_LINK2" />Matuto Pa<ph name="END_LINK2" /></translation> @@ -1766,7 +1766,7 @@ <translation id="3603622770190368340">Kunin ang certificate ng network</translation> <translation id="3605780360466892872">Bossing</translation> <translation id="3608576286259426129">Preview ng larawan ng user</translation> -<translation id="3610369246614755442">Kailangan ng dock fan ng serbisyo</translation> +<translation id="3610369246614755442">Nangangailangan ng serbisyo ang dock fan</translation> <translation id="361106536627977100">Data sa flash</translation> <translation id="3612673635130633812">Na-download ng <a href="<ph name="URL" />"><ph name="EXTENSION" /></a></translation> <translation id="3613134908380545408">Ipakita ang <ph name="FOLDER_NAME" /></translation> @@ -2229,7 +2229,7 @@ <translation id="4267953847983678297">Awtomatikong kumonekta sa cellular network</translation> <translation id="4268025649754414643">Pag-encipher ng Key</translation> <translation id="4270393598798225102">Bersyon <ph name="NUMBER" /></translation> -<translation id="4270615291506829403">pinapalitan ang iyong password</translation> +<translation id="4270615291506829403">palitan mo ang iyong password</translation> <translation id="4275663329226226506">Media</translation> <translation id="4275830172053184480">I-restart ang iyong device</translation> <translation id="4278101229438943600">Handa na ang iyong Assistant</translation> @@ -2675,7 +2675,7 @@ <translation id="4973307593867026061">Magdagdag ng mga printer</translation> <translation id="4973325300212422370">{NUM_TABS,plural, =1{I-mute ang site}one{I-mute ang mga site}other{I-mute ang mga site}}</translation> <translation id="4974733135013075877">Lumabas at i-childlock</translation> -<translation id="4976009197147810135">I-split nang vertical</translation> +<translation id="4976009197147810135">I-split nang patayo</translation> <translation id="4976795213394241669">{0,plural, =0{I-update ngayon}=1{I-update sa loob ng 1 segundo}one{I-update sa loob ng # segundo}other{I-update sa loob ng # na segundo}}</translation> <translation id="4977942889532008999">Kumpirmahin ang Pag-access</translation> <translation id="4980805016576257426">May malware ang extension na ito.</translation> @@ -2785,7 +2785,7 @@ <translation id="5142961317498132443">Pag-authenticate</translation> <translation id="5143374789336132547">Binago ng extension na "<ph name="EXTENSION_NAME" />" ang ipinapakitang page kapag na-click mo ang button ng Home.</translation> <translation id="5143712164865402236">Pumasok sa Full Screen</translation> -<translation id="5145461783043820456">Naka-on ang pag-block sa cookie ng third-party</translation> +<translation id="5145461783043820456">Naka-on ang pag-block sa cookie ng third party</translation> <translation id="514575469079499857">Gamitin ang iyong IP address upang matukoy ang lokasyon (default)</translation> <translation id="5146995429444047494">Naka-block ang mga notification para sa <ph name="ORIGIN" /></translation> <translation id="5150254825601720210">Pangalan ng Server ng Netscape Certificate SSL</translation> @@ -3626,7 +3626,7 @@ <translation id="6384275966486438344">Gawing ito ang iyong mga setting ng paghahanap: <ph name="SEARCH_HOST" /></translation> <translation id="6385543213911723544">Maaaring mag-save at magbasa ng data ng cookie ang mga site</translation> <translation id="6386099547750337629">Kung hindi ito inaasahan, makipag-ugnayan sa suporta.</translation> -<translation id="6387674443318562538">I-split nang Vertical</translation> +<translation id="6387674443318562538">I-split nang Patayo</translation> <translation id="6388429472088318283">Maghanap sa mga wika</translation> <translation id="6390799748543157332">Hindi lalabas sa iyong history ng browser ang mga page na tiningnan mo sa window na ito at hindi mag-iiwan ang mga ito ng iba pang mga palatandaan, tulad ng cookies, sa computer pagkatapos mong isara ang lahat ng nakabukas na mga window ng Bisita. Gayunpaman, papanatilihin ang anumang mga file na na-download mo.</translation> <translation id="6390994422085833176">Suriin ang mga feature ng pag-sync at pag-personalize pagkatapos ng pag-set up</translation> @@ -3883,7 +3883,7 @@ <translation id="6786747875388722282">Mga Extension</translation> <translation id="6787839852456839824">Mga keyboard shortcut</translation> <translation id="6788210894632713004">Hindi naka-pack na extension</translation> -<translation id="6789592661892473991">I-split nang Horizontal</translation> +<translation id="6789592661892473991">I-split nang Pahalang</translation> <translation id="6790428901817661496">I-play</translation> <translation id="6790497603648687708">Naidagdag mula sa malayo ang <ph name="EXTENSION_NAME" /></translation> <translation id="6790820461102226165">Magdagdag ng Tao...</translation> @@ -4265,7 +4265,7 @@ <translation id="7334190995941642545">Kasalukuyang hindi available ang Smart Lock. Pakisubukang muli sa ibang pagkakataon.</translation> <translation id="7334274148831027933">I-enable ang naka-dock na magnifier</translation> <translation id="7335974957018254119">Gumamit ng pang-check ng pagbabaybay para sa</translation> -<translation id="7336799713063880535">Naka-block ang mga notification.</translation> +<translation id="7336799713063880535">Naka-block ang notifications.</translation> <translation id="7338630283264858612">Invalid ang serial number ng device</translation> <translation id="7339763383339757376">PKCS #7, isahang certificate</translation> <translation id="7339785458027436441">Check Spelling While Typing</translation> @@ -4378,7 +4378,7 @@ <translation id="7506541170099744506">Matagumpay na na-enroll ang iyong <ph name="DEVICE_TYPE" /> para sa pamamahala ng enterprise.</translation> <translation id="7507930499305566459">Certificate sa Katayuan ng Responder</translation> <translation id="7508054832109420082">Magbigay ng access sa mga printer</translation> -<translation id="7510943789645525906">Nagbibigay sa iyo ng babala kung ang isang password na ginamit mo ay bahagi ng paglabag sa data</translation> +<translation id="7510943789645525906">Nagbibigay sa iyo ng babala kung ang isang password na ginagamit mo ay bahagi ng isang paglabag sa data</translation> <translation id="7513029293694390567">Awtomatikong mag-sign in sa mga website gamit ang mga naka-store na kredensyal. Kung naka-disable, hihingan ka ng kumpirmasyon sa bawat pagkakataon bago ka mag-sign in sa isang website.</translation> <translation id="7514365320538308">I-download</translation> <translation id="7521387064766892559">JavaScript</translation> @@ -4607,7 +4607,7 @@ <ph name="BR" /> <ph name="BR" /> <ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" /> Mare-reboot ang system sa panahon ng proseso.</translation> -<translation id="7828731929332799387">Ide-delete nito ang lahat ng cookies at data ng site data na available sa mga konteksto ng third-party. Gusto mo bang magpatuloy?</translation> +<translation id="7828731929332799387">Ide-delete nito ang lahat ng cookies at data ng site na available sa mga konteksto ng third party. Gusto mo bang magpatuloy?</translation> <translation id="7829298379596169484">Ina-access ang input ng audio</translation> <translation id="7830594666202422257">Ikonekta sa Linux</translation> <translation id="7831491651892296503">Nagkaroon ng error sa pag-configure sa network</translation> @@ -4812,7 +4812,7 @@ <translation id="810875025413331850">Walang nakitang device na nasa malapit.</translation> <translation id="8111155949205007504">Ibahagi ang password na ito sa iyong iPhone</translation> <translation id="8113043281354018522">Pumili ng uri ng lisensya</translation> -<translation id="8114875720387900039">I-split nang horizontal</translation> +<translation id="8114875720387900039">I-split nang pahalang</translation> <translation id="8116972784401310538">&Tagapangasiwa ng bookmark</translation> <translation id="8117620576188476503">Pamahalaan ang mga koneksyon, update, at setting gamit ang status tray. Upang makapunta rito sa pamamagitan ng keyboard, pindutin ang Alt + Shift + S.</translation> <translation id="8118076340394175570">Kinakailangan ng iyong organisasyon ng update sa device na ito</translation> @@ -5231,7 +5231,7 @@ <translation id="8732212173949624846">Basahin at baguhin ang iyong history ng pag-browse sa lahat ng iyong naka-sign in na device</translation> <translation id="8732844209475700754">Higit pang setting na may kaugnayan sa privacy, seguridad, at pangongolekta ng data</translation> <translation id="8734073480934656039">Pinapayagan ng pag-enable sa setting na ito na awtomatikong ilunsad ang mga kiosk application sa startup.</translation> -<translation id="8734674662128056360">Pag-block sa cookie ng third-party</translation> +<translation id="8734674662128056360">Pag-block sa cookie ng third party</translation> <translation id="873545264931343897">Kapag natapos nang ma-update ang <ph name="PLUGIN_NAME" />, i-reload ang page upang i-activate ito</translation> <translation id="8736288397686080465">Na-update ang site na ito sa background.</translation> <translation id="8737685506611670901">Buksan ang mga link ng <ph name="PROTOCOL" /> sa halip na ang <ph name="REPLACED_HANDLER_TITLE" /></translation> @@ -5309,7 +5309,7 @@ <translation id="8828933418460119530">Pangalan ng DNS</translation> <translation id="883062543841130884">Mga Kahalili</translation> <translation id="8830796635868321089">Nabigo ang pagsusuri sa update gamit ang mga kasalukuyang setting ng proxy. Mangyaring isaayos ang iyong <ph name="PROXY_SETTINGS_LINK_START" />mga setting ng proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> -<translation id="8831140208248705279">Mas maayos na gagana ang iyong <ph name="DEVICE_TYPE" /> at Android phone nang magkasama. Ikonekta ang mga ito para makapag-text ka mula sa computer mo, maibahagi ang iyong koneksyon sa internet, at ma-unlock ang <ph name="DEVICE_TYPE" /> mo gamit ang iyong telepono.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="8831140208248705279">Mas maayos na gagana ang iyong <ph name="DEVICE_TYPE" /> at Android phone nang magkasama. Ikonekta ang mga ito para makapag-text ka mula sa iyong computer, maibahagi mo ang iyong koneksyon sa internet, at ma-unlock mo ang iyong <ph name="DEVICE_TYPE" /> gamit ang telepono mo.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="8831664945713891930">Buksan ang mga setting ng Mga Extension</translation> <translation id="8834039744648160717">Ang configuration ng network ay kinokontrol ng <ph name="USER_EMAIL" />.</translation> <translation id="8838770651474809439">Hamburger</translation> @@ -5342,7 +5342,7 @@ <translation id="8877448029301136595">[parent directory]</translation> <translation id="8879284080359814990">&Ipakita Bilang Tab</translation> <translation id="8879921471468674457">Tandaan ang impormasyon sa pag-sign in</translation> -<translation id="8881020143150461183">Pakisubukang muli. Para sa technical support, makipag-ugnayan sa <ph name="CARRIER_NAME" />.</translation> +<translation id="8881020143150461183">Pakisubukan ulit. Para sa technical support, makipag-ugnayan sa <ph name="CARRIER_NAME" />.</translation> <translation id="8884570509232205463">Nagla-lock na ngayon ang iyong device sa ganap na <ph name="UNLOCK_TIME" />.</translation> <translation id="8885197664446363138">Hindi available ang Smart Lock</translation> <translation id="8888253246822647887">Bubukas ang iyong app kapag tapos na ang pag-upgrade. Maaaring tumagal nang ilang minuto ang mga pag-upgrade.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 9bbab48c..9c58480 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -475,6 +475,7 @@ <translation id="1698122934742150150">ફક્ત વર્તમાન છૂપું સત્ર</translation> <translation id="1698650002254827833">ઍપની સૂચિ લોડ કરી શકાતી નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="1701062906490865540">આ વ્યક્તિને દૂર કરો</translation> +<translation id="1703331064825191675">તમારા પાસવર્ડ વિશે ક્યારેય ચિંતા કરશો નહીં</translation> <translation id="1706586824377653884">તમારા વ્યવસ્થાપક દ્વારા ઉમેરાયેલ</translation> <translation id="1706625117072057435">ઝૂમના સ્તર</translation> <translation id="1708338024780164500">(નિષ્ક્રિય)</translation> @@ -524,6 +525,7 @@ <translation id="1764226536771329714">બીટા</translation> <translation id="176587472219019965">&નવી વિંડો</translation> <translation id="1766575458646819543">પૂર્ણ-સ્ક્રીનથી બહાર નીકળ્યાં</translation> +<translation id="1766957085594317166">તમારા Google એકાઉન્ટમાં પાસવર્ડને સુરક્ષિત રીતે સાચવો અને પછી તમારે તેને ક્યારેય ટાઇપ કરવા પડશે નહીં</translation> <translation id="1768278914020124551">અરેરે! લૉગઑન સર્વરનો સંપર્ક કરવામાં સમસ્યા આવી હતી. કૃપા કરીને તમારું નેટવર્ક કનેક્શન અને ડોમેન નામ તપાસો, ત્યાર બાદ ફરીથી પ્રયાસ કરો.</translation> <translation id="1769104665586091481">નવી &વિંડોમાં લિંક ખોલો</translation> <translation id="1773212559869067373">પ્રમાણીકરણ પ્રમાણપત્રને સ્થાનિક રૂપે નકારવામાં આવ્યું છે</translation> @@ -1871,6 +1873,7 @@ <translation id="3748026146096797577">કનેક્ટેડ નથી</translation> <translation id="3752582316358263300">બરાબર, સમજાઇ ગયું...</translation> <translation id="3752673729237782832">મારા ઉપકરણો</translation> +<translation id="3753033997400164841">એકવાર સ્ટોર કરો. ગમે ત્યાં ઉપયોગ કરો</translation> <translation id="3755411799582650620">તમારો <ph name="PHONE_NAME" /> હવે આ <ph name="DEVICE_TYPE" /> ને પણ અનલૉક કરી શકે છે.</translation> <translation id="375636864092143889">સાઇટ તમારા માઇક્રોફોનનો ઉપયોગ કરી રહી છે</translation> <translation id="3757733214359997190">કોઈ સાઇટ મળી નથી</translation> @@ -2203,6 +2206,7 @@ <translation id="4232375817808480934">Kerberosની ગોઠવણી કરો</translation> <translation id="4235200303672858594">સમગ્ર સ્ક્રીન</translation> <translation id="4235965441080806197">સાઇન ઇન રદ કરો</translation> +<translation id="4242145785130247982">એકથી વધુ ક્લાયન્ટ પ્રમાણપત્રોને સપોર્ટ આપવામાં આવતો નથી</translation> <translation id="4242533952199664413">સેટિંગ્સ ખોલો</translation> <translation id="4242577469625748426">આ ઉપકરણ પર નીતિ સેટિંગ્સ ઇન્સ્ટોલ કરવામાં નિષ્ફળ ગયું: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">વધુ સ્ટાઇલસ ઍપ મેમરીનો શોધો</translation> @@ -2661,6 +2665,7 @@ <translation id="4957949153200969297">માત્ર <ph name="IDS_SHORT_PRODUCT_NAME" /> સિંક સંબંધિત સુવિધાઓ ચાલુ કરો</translation> <translation id="4959262764292427323">પાસવર્ડ તમારા Google એકાઉન્ટમાં સાચવવામાં આવે છે, જેથી તમે કોઈપણ ઉપકરણ પર તેનો ઉપયોગ કરી શકો</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">આ ઍપ તમારા વ્યવસ્થાપક દ્વારા બનાવવામાં આવી હતી.</translation> <translation id="4964455510556214366">ગોઠવણી</translation> <translation id="4964673849688379040">તપાસી રહ્યું છે...</translation> <translation id="4965808351167763748">શું તમે ખરેખર આ ઉપકરણને Hangouts Meet ચલાવવા માટે સેટ કરવા માગો છો?</translation> @@ -2918,6 +2923,7 @@ <translation id="5360150013186312835">ટુલબારમાં દર્શાવો</translation> <translation id="5362741141255528695">ખાનગી કી ફાઇલ પસંદ કરો.</translation> <translation id="5363109466694494651">Powerwash કરો અને ઉલટાવો</translation> +<translation id="5365716706805792666">Google તમારા પાસવર્ડ ડેટા ઉલ્લંઘનનો ભાગ હતો કે નહીં તે ચેક કરી શકે છે. જ્યારે તમે તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરશો ત્યારે આ ચાલુ થશે.</translation> <translation id="5365881113273618889">તમે પસંદ કરેલું ફોલ્ડર સંવેદનશીલ ફાઇલો ધરાવે છે. શું તમે ખરેખર "<ph name="APP_NAME" />"ને આ ફોલ્ડરની કાયમી લખવાનો ઍક્સેસ આપવા માંગો છો?</translation> <translation id="5367091008316207019">ફાઇલ વાંચી રહ્યાં છીએ..</translation> <translation id="5368720394188453070">તમારો ફોન લૉક કરેલો છે. દાખલ કરવા માટે તેને અનલૉક કરો.</translation> @@ -3872,6 +3878,7 @@ <translation id="6769712124046837540">પ્રિન્ટર ઉમેરી રહ્યું છે...</translation> <translation id="6770664076092644100">NFC મારફતે ચકાસો</translation> <translation id="6771503742377376720">એ એક પ્રમાણન અધિકારી છે</translation> +<translation id="6775163072363532304">ઉપલબ્ધ ડિવાઇસ અહીં દેખાશે.</translation> <translation id="6777817260680419853">રીડાયરેક્ટ કરવાનું બ્લૉક કર્યું</translation> <translation id="6778737459546443941">તમારા માતાપિતાએ હજી સુધી તેને મંજૂર કરેલ નથી</translation> <translation id="677965093459947883">ખૂબ નાનું</translation> @@ -4332,6 +4339,7 @@ <translation id="7441830548568730290">અન્ય વપરાશકર્તાઓ</translation> <translation id="7442465037756169001">તમારું Hangouts Meet hardware સેટ કરવા માટે તૈયાર છે.</translation> <translation id="744341768939279100">એક નવી પ્રોફાઇલ બનાવો</translation> +<translation id="7443806024147773267">તમે જ્યારે પણ તમારા Google એકાઉન્ટમાં સાઇન ઇન કરેલું હોય ત્યારે તમારા પાસવર્ડને ઍક્સેસ કરો</translation> <translation id="7444046173054089907">આ સાઇટ અવરોધિત છે</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> બંધ કરો</translation> <translation id="7448430327655618736">ઍપ ઑટોમૅટિક રીતે ઇન્સ્ટૉલ કરો</translation> @@ -4739,6 +4747,7 @@ <translation id="8014154204619229810">અપડેટ કરનાર હાલમાં ચાલી રહ્યું છે. ફરીથી તપાસવા માટે થોડીવારમાં રિફ્રેશ કરો.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" />, પૂર્વમાં ઇન્સ્ટૉલ કરેલ વર્ઝન પર પાછા ફરવામાં અસમર્થ છે. કૃપા કરીને તમારા ડિવાઇસને Powerwash કરવાનો ફરી પ્રયાસ કરો.</translation> <translation id="8014210335923519270">Googleને સિસ્ટમ માહિતી અને ઉપયોગ મોકલીને <ph name="IDS_SHORT_PRODUCT_NAME" />ને અને તેની સુરક્ષા બહેતર બનાવો</translation> +<translation id="8015780634880457457">Google તમારા પાસવર્ડ ડેટા ઉલ્લંઘનનો ભાગ હતો કે નહીં તે ચેક કરી શકે છે</translation> <translation id="8016266267177410919">અસ્થાયી સ્ટોરેજ</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">શૉર્ટકટમાં ફેરફાર કર્યો</translation> @@ -4857,6 +4866,7 @@ <translation id="8188389033983459049">તમારા ઉપકરણની સેટિંગ તપાસો અને ચાલુ રાખવા માટે તેને ચાલુ કરો</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> થી કનેક્ટ કરે છે</translation> <translation id="8191230140820435481">તમારી ઍપ્લિકેશનો, એક્સ્ટેન્શન અને થીમ્સ મેનેજ કરો</translation> +<translation id="819464600477418284">આ ઍપ Chrome OSનો ભાગ હોવાથી તેને અનઇન્સ્ટૉલ કરી શકાતી નથી.</translation> <translation id="8195027750202970175">ડિસ્ક પર કદ</translation> <translation id="8198323535106903877">અમે તમારા માટે તે <ph name="NUMBER_OF_APPS" /> ઍપ ઇન્સ્ટૉલ કરીશું</translation> <translation id="8199300056570174101">નેટવર્ક (સેવા) અને ઉપકરણના ગુણધર્મો</translation> @@ -4917,6 +4927,7 @@ <ph name="BEGIN_PARAGRAPH2" />આ સુવિધાને બંધ કરવાથી સિસ્ટમ અપડેટ અને સુરક્ષા જેવી આવશ્યક સેવાઓ માટે આવશ્યક માહિતી મોકલવાની આ ડિવાઇસની ક્ષમતાને અસર થતી નથી.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />સેટિંગ > વિગતવાર > 'Googleને ઑટોમૅટિક રીતે ડાયગ્નોસ્ટિક અને વપરાશ ડેટા મોકલો' પરથી ડિવાઇસના માલિક આ સુવિધાનું નિયંત્રણ કરી શકે છે.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />જો તમારા બાળક માટે વધારાની વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ કરવામાં આવી હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. તમે આ સેટિંગ વિશે અને તેની કેવી રીતે ગોઠવણ કરવી તે family.google.com પર વધુ જાણો.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">અમાન્ય ક્લાયન્ટ પ્રમાણપત્ર</translation> <translation id="8270242299912238708">PDF દસ્તાવેજો</translation> <translation id="827097179112817503">હોમ બટન દર્શાવો</translation> <translation id="8271246892936492311">{COUNT,plural, =1{1 બુકમાર્ક કાઢી નાખ્યું}one{# બુકમાર્ક કાઢી નાખ્યા}other{# બુકમાર્ક કાઢી નાખ્યા}}</translation> @@ -5330,6 +5341,7 @@ <translation id="8874184842967597500">કનેક્ટેડ નથી</translation> <translation id="8876307312329369159">ડેમો સત્રમાં આ સેટિંગ બદલી શકાતી નથી.</translation> <translation id="8877448029301136595">[માતાપિતાની ડિરેક્ટરી]</translation> +<translation id="8879220587046205278">Google Play પરની ઍપને બાહ્ય સ્ટોરેજ ડિવાઇસ પરની ફાઇલો તથા ફોલ્ડરો વાંચવા અને લખવા માટે ફાઇલ સિસ્ટમનો સંપૂર્ણ ઍક્સેસ હોવો જરૂરી હોઈ શકે છે. બાહ્ય ડ્રાઇવનો ઉપયોગ કરનાર કોઈપણ વ્યક્તિ ડિવાઇસ પર બનાવેલી ફાઇલો તથા ફોલ્ડરોને જોઈ શકે છે.</translation> <translation id="8879284080359814990">ટૅબ તરીકે &બતાવો</translation> <translation id="8879921471468674457">સાઇન ઇન માહિતી યાદ રાખો</translation> <translation id="8881020143150461183">કૃપા કરીને ફરી પ્રયાસ કરો. ટેક્નિકલ સપોર્ટ માટે, <ph name="CARRIER_NAME" />નો સંપર્ક કરો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 9b90ef3..d93fa0938 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -2504,7 +2504,7 @@ <translation id="4722920479021006856"><ph name="APP_NAME" /> आपकी स्क्रीन शेयर कर रहा है.</translation> <translation id="4724450788351008910">संबंध परिवर्तित</translation> <translation id="4725511304875193254">कॉर्गी</translation> -<translation id="4725851834065990915">आप जो साइट या ऐप्लिकेशन इस्तेमाल करते हैं, उसमें डेटा का उल्लंघन होने पर आपका पासवर्ड उजागर हो सकता है. Chrome सुझाव देता है कि आप अपने सेव किए हुए पासवर्ड की अभी जांच करें.</translation> +<translation id="4725851834065990915">आप जो साइट या ऐप्लिकेशन इस्तेमाल करते हैं उसमें डेटा का उल्लंघन होने पर आपका पासवर्ड उजागर हो सकता है. Chrome सुझाव देता है कि आप अपने सेव किए हुए पासवर्ड की अभी जांच करें.</translation> <translation id="4726710629007580002">इस एक्सटेंशन को इंस्टॉल करने का प्रयास करते समय चेतावनियां आई थीं:</translation> <translation id="4727847987444062305">मेहमान के तौर पर ब्राउज़ करने का प्रबंधित सेशन</translation> <translation id="4728558894243024398">प्लेटफ़ॉर्म</translation> @@ -2941,7 +2941,7 @@ <translation id="5390100381392048184">साइटों को आवाज़ चलाने दें</translation> <translation id="5390677308841849479">गहरा लाल और नारंगी</translation> <translation id="5390743329570580756">इसके लिए भेजें</translation> -<translation id="5397361543868847016">{COUNT,plural, =0{यह साइट कई साइट के डेटा को ट्रैक करने के लिए कुकी इस्तेमाल नहीं करती}=1{Chrome 1 साइट की कुकी ब्लॉक कर रहा है}one{Chrome # साइटों की कुकी ब्लॉक कर रहा है}other{Chrome # साइटों की कुकी ब्लॉक कर रहा है}}</translation> +<translation id="5397361543868847016">{COUNT,plural, =0{यह साइट, कई साइट के डेटा को ट्रैक करने के लिए कुकी इस्तेमाल नहीं करती}=1{Chrome 1 साइट की कुकी ब्लॉक कर रहा है}one{Chrome # साइटों की कुकी ब्लॉक कर रहा है}other{Chrome # साइटों की कुकी ब्लॉक कर रहा है}}</translation> <translation id="5397794290049113714">आप</translation> <translation id="5398572795982417028">सीमा से बाहर के पेज का संदर्भ, सीमा <ph name="MAXIMUM_PAGE" /> की है</translation> <translation id="5398772614898833570">विज्ञापन ब्लॉक हैं</translation> @@ -3905,7 +3905,7 @@ <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> को रूट की तरह नहीं चलाया जा सकता.</translation> <translation id="6812841287760418429">बदलावों को बनाए रखें</translation> <translation id="6817174620439930047">जब साइट MIDI डिवाइस को एक्सेस करने के लिए सिस्टम के खास संदेशों का इस्तेमाल करना चाहे, तो इसके लिए पूछें (सुझाया गया)</translation> -<translation id="6819440013020405090">आप जो साइट या ऐप्लिकेशन इस्तेमाल करते हैं, उसमें डेटा का उल्लंघन होने पर आपका पासवर्ड उजागर हो सकता है. Chrome सुझाव देता है कि आप अपने सेव किए हुए पासवर्ड की जांच करते रहें और उसे <ph name="ORIGIN" /> पर बदलते रहें.</translation> +<translation id="6819440013020405090">आप जो साइट या ऐप्लिकेशन इस्तेमाल करते हैं उसमें डेटा का उल्लंघन होने पर आपका पासवर्ड उजागर हो सकता है. Chrome सुझाव देता है कि आप अपने सेव किए हुए पासवर्ड की जांच करते रहें और उसे <ph name="ORIGIN" /> पर बदलते रहें.</translation> <translation id="682123305478866682">डेस्कटॉप कास्ट करें</translation> <translation id="6823506025919456619">आपको अपने डिवाइस को देखने के लिए Chrome में साइन इन करने की ज़रुरत है</translation> <translation id="6824564591481349393">&ईमेल पते की कॉपी बनाएं</translation> @@ -4148,7 +4148,7 @@ <translation id="7168109975831002660">कम से कम अक्षरों का आकार</translation> <translation id="7170041865419449892">सीमा से बाहर</translation> <translation id="7171559745792467651">अपने दूसरे डिवाइस से ऐप्लिकेशन इंस्टॉल करें</translation> -<translation id="7174199383876220879">नया! अपना संगीत, वीडियो, और दूसरी चीज़ें नियंत्रित करें.</translation> +<translation id="7174199383876220879">नया! अपने संगीत, वीडियो, और दूसरी चीज़ें नियंत्रित करें.</translation> <translation id="7175037578838465313"><ph name="NAME" /> को कॉन्फ़िगर करें</translation> <translation id="7175353351958621980">यहां से लोड किया गया:</translation> <translation id="7180611975245234373">रीफ्रेश करें</translation> @@ -4646,7 +4646,7 @@ <translation id="7887334752153342268">डुप्लीकेट</translation> <translation id="7887864092952184874">ब्लूटूथ माउस युग्मित किया गया</translation> <translation id="7889565820482017512">डिसप्ले का आकार</translation> -<translation id="7892963120252479610">जब तक आप यह टैब बंद नहीं कर देते, <ph name="ORIGIN" /> को फ़ाइलें <ph name="FOLDERNAME" /> में दिखती रहेंगी</translation> +<translation id="7892963120252479610">आप जब तक यह टैब बंद नहीं कर देते, <ph name="ORIGIN" /> को फ़ाइलें <ph name="FOLDERNAME" /> में दिखती रहेंगी</translation> <translation id="7893008570150657497">आपके कंप्यूटर के फ़ोटो, संगीत, और दूसरे मीडिया को एक्सेस करने दें</translation> <translation id="7893153962594818789">इस <ph name="DEVICE_TYPE" /> पर ब्लूटूथ बंद है. अपना पासवर्ड डालें और ब्लूटूथ चालू करें.</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (सामान्य)</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index a2432199..f59434e 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">Sesi samaran saat ini saja</translation> <translation id="1698650002254827833">Daftar aplikasi tidak dapat dimuat. Coba lagi.</translation> <translation id="1701062906490865540">Hapus orang ini</translation> +<translation id="1703331064825191675">Tidak perlu mengkhawatirkan sandi Anda</translation> <translation id="1706586824377653884">Ditambahkan oleh administrator Anda</translation> <translation id="1706625117072057435">Tingkat perbesar/perkecil</translation> <translation id="1708338024780164500">(Tidak aktif)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">Je&ndela Baru</translation> <translation id="1766575458646819543">Layar penuh ditutup</translation> +<translation id="1766957085594317166">Simpan sandi dengan aman di Akun Google Anda, dan Anda tidak perlu lagi mengetikkannya</translation> <translation id="1768278914020124551">Maaf. Terjadi masalah saat menghubungi server login. Harap periksa koneksi jaringan dan nama domain, lalu coba lagi.</translation> <translation id="1769104665586091481">Buka Tautan di &Jendela Baru</translation> <translation id="1773212559869067373">Sertifikat autentikasi ditolak secara lokal</translation> @@ -1873,6 +1875,7 @@ <translation id="3748026146096797577">Tidak Tersambung</translation> <translation id="3752582316358263300">Oke...</translation> <translation id="3752673729237782832">Perangkat saya</translation> +<translation id="3753033997400164841">Simpan sekali. Gunakan di mana saja</translation> <translation id="3755411799582650620"><ph name="PHONE_NAME" /> Anda sekarang dapat membuka kunci <ph name="DEVICE_TYPE" /> ini juga.</translation> <translation id="375636864092143889">Situs sedang menggunakan mikrofon</translation> <translation id="3757733214359997190">Tidak ada situs yang ditemukan</translation> @@ -2205,6 +2208,7 @@ <translation id="4232375817808480934">Konfigurasikan Kerberos</translation> <translation id="4235200303672858594">Seluruh layar</translation> <translation id="4235965441080806197">Batalkan proses masuk</translation> +<translation id="4242145785130247982">Beberapa sertifikat klien tidak didukung</translation> <translation id="4242533952199664413">Buka setelan</translation> <translation id="4242577469625748426">Gagal memasang setelan kebijakan di perangkat: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Temukan aplikasi stilus lainnya</translation> @@ -2663,6 +2667,7 @@ <translation id="4957949153200969297">Hanya mengaktifkan fitur yang terkait dengan Sinkronisasi <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="4959262764292427323">Sandi disimpan di Akun Google agar Anda dapat menggunakannya di perangkat mana pun</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Aplikasi ini telah diinstal oleh administrator Anda.</translation> <translation id="4964455510556214366">Pengaturan</translation> <translation id="4964673849688379040">Memeriksa...</translation> <translation id="4965808351167763748">Yakin ingin menyiapkan perangkat ini untuk menjalankan Hangouts Meet?</translation> @@ -2920,6 +2925,7 @@ <translation id="5360150013186312835">Tampilkan di Bilah Alat</translation> <translation id="5362741141255528695">Pilih file kunci pribadi.</translation> <translation id="5363109466694494651">Powerwash dan Kembalikan</translation> +<translation id="5365716706805792666">Google dapat memeriksa apakah sandi Anda pernah bocor saat terjadi pelanggaran data. Fitur ini akan diaktifkan ketika Anda login dengan Akun Google.</translation> <translation id="5365881113273618889">Folder yang Anda pilih berisi file sensitif. Yakin ingin memberi "<ph name="APP_NAME" />" akses tulis permanen ke folder ini?</translation> <translation id="5367091008316207019">Membaca file..</translation> <translation id="5368720394188453070">Ponsel terkunci. Buka kunci untuk masuk.</translation> @@ -3872,6 +3878,7 @@ <translation id="6769712124046837540">Menambahkan printer...</translation> <translation id="6770664076092644100">Verifikasi melalui NFC</translation> <translation id="6771503742377376720">Adalah Otoritas Sertifikasi</translation> +<translation id="6775163072363532304">Perangkat yang tersedia akan muncul di sini.</translation> <translation id="6777817260680419853">Pengalihan diblokir</translation> <translation id="6778737459546443941">Orang tuamu belum menyetujuinya</translation> <translation id="677965093459947883">Sangat kecil</translation> @@ -4332,6 +4339,7 @@ <translation id="7441830548568730290">Pengguna lainnya</translation> <translation id="7442465037756169001">Hangouts Meet Hardware sudah bisa disiapkan.</translation> <translation id="744341768939279100">Buat profil baru</translation> +<translation id="7443806024147773267">Akses sandi kapan pun Anda login ke Akun Google Anda</translation> <translation id="7444046173054089907">Situs ini diblokir</translation> <translation id="7444983668544353857">Nonaktifkan <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Otomatis menginstal aplikasi</translation> @@ -4745,6 +4753,7 @@ <translation id="8014154204619229810">Alat pembaru sedang berjalan. Segarkan dalam satu menit untuk memeriksa lagi.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> tidak dapat mengembalikan ke versi yang terpasang sebelumnya. Coba lagi untuk melakukan Powerwash perangkat Anda.</translation> <translation id="8014210335923519270">Sempurnakan <ph name="IDS_SHORT_PRODUCT_NAME" /> dan keamanannya dengan mengirimkan informasi dan penggunaan sistem ke Google</translation> +<translation id="8015780634880457457">Google dapat memeriksa apakah sandi Anda pernah bocor saat terjadi pelanggaran data.</translation> <translation id="8016266267177410919">Penyimpanan sementara</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Pintasan diedit</translation> @@ -4863,6 +4872,7 @@ <translation id="8188389033983459049">Periksa setelan perangkat Anda dan aktifkan untuk melanjutkan</translation> <translation id="8190193592390505034">Menyambung ke <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Mengelola aplikasi, ekstensi, dan tema Anda</translation> +<translation id="819464600477418284">Aplikasi ini tidak dapat di-uninstal karena merupakan bagian dari Chrome OS.</translation> <translation id="8195027750202970175">Ukuran di disk</translation> <translation id="8198323535106903877">Kami akan menginstal <ph name="NUMBER_OF_APPS" /> aplikasi tersebut untuk Anda</translation> <translation id="8199300056570174101">Properti Perangkat dan Jaringan (Layanan)</translation> @@ -4923,6 +4933,7 @@ <ph name="BEGIN_PARAGRAPH2" />Menonaktifkan fitur ini tidak memengaruhi kemampuan perangkat ini dalam mengirim informasi yang diperlukan untuk layanan penting seperti keamanan dan update sistem.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Pemilik dapat mengontrol fitur ini dari Setelan > Lanjutan > Otomatis kirimkan data diagnostik dan penggunaan ke Google.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Jika setelan Aktivitas Web & Aplikasi tambahan diaktifkan untuk anak Anda, data ini dapat disimpan ke Akun Google-nya. Pelajari lebih lanjut setelan ini dan cara menyesuaikannya di families.google.com.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Sertifikat klien tidak valid</translation> <translation id="8270242299912238708">Dokumen PDF</translation> <translation id="827097179112817503">Tampilkan tombol beranda</translation> <translation id="8271246892936492311">{COUNT,plural, =1{1 bookmark dihapus}other{# bookmark dihapus}}</translation> @@ -5336,6 +5347,7 @@ <translation id="8874184842967597500">Tidak tersambung</translation> <translation id="8876307312329369159">Setelan ini tidak dapat diubah dalam sesi demo.</translation> <translation id="8877448029301136595">[direktori induk]</translation> +<translation id="8879220587046205278">Aplikasi dari Google Play mungkin meminta akses sistem penuh untuk membaca dan menulis file di perangkat penyimpanan eksternal. File dan folder yang dibuat di perangkat dapat dilihat oleh siapa saja yang menggunakan drive eksternal.</translation> <translation id="8879284080359814990">Tampilkan &Sebagai Tab</translation> <translation id="8879921471468674457">Ingat info login</translation> <translation id="8881020143150461183">Coba lagi. Untuk dukungan teknis, hubungi <ph name="CARRIER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 67e4fdfe..8cbd490 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2277,7 +2277,7 @@ <translation id="4351060348582610152"><ph name="ORIGIN" /> が近くの Bluetooth デバイスのスキャンを求めています。検出済みのデバイスは次のとおりです。</translation> <translation id="4354344420232759511">アクセスしたサイトがここに表示されます</translation> <translation id="435527878592612277">写真を選択</translation> -<translation id="4358313196493694334">クリック位置を補正します</translation> +<translation id="4358313196493694334">クリック位置のぶれを補正する</translation> <translation id="4359408040881008151">依存関係にある拡張機能によってインストールされました。</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">このクライアント証明書には秘密鍵がないか、秘密鍵が無効です</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index dcc4eb4a..ffa9cd2 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -474,6 +474,7 @@ <translation id="1698122934742150150">നിലവിലെ അദൃശ്യ സെഷന് മാത്രം</translation> <translation id="1698650002254827833">ആപ്പുകളുടെ ലിസ്റ്റ് ലോഡ് ചെയ്യാനാവില്ല. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="1701062906490865540">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation> +<translation id="1703331064825191675">നിങ്ങളുടെ പാസ്വേഡുകളെക്കുറിച്ച് ഇനി ആശങ്ക വേണ്ട</translation> <translation id="1706586824377653884">നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ ചേർത്തത്</translation> <translation id="1706625117072057435">സൂം നിലകൾ</translation> <translation id="1708338024780164500">(നിഷ്ക്രിയം)</translation> @@ -523,6 +524,7 @@ <translation id="1764226536771329714">ബീറ്റ</translation> <translation id="176587472219019965">&പുതിയ വിൻഡോ</translation> <translation id="1766575458646819543">പൂർണ്ണ സ്ക്രീനിൽ നിന്ന് പുറത്തുകടന്നു</translation> +<translation id="1766957085594317166">Google അക്കൗണ്ടിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ സുരക്ഷിതമായി സംരക്ഷിക്കുകയാണെങ്കിൽ ഒരിക്കലും അവ വീണ്ടും ടൈപ്പ് ചെയ്യേണ്ടി വരില്ല</translation> <translation id="1768278914020124551">ക്ഷമിക്കണം! ലോഗോൺ സെർവറുമായി ബന്ധപ്പെടുന്നതിൽ പ്രശ്നമുണ്ടായി. നിങ്ങളുടെ നെറ്റ്വർക്ക് കണക്ഷനും ഡൊമെയ്ൻ നാമവും പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="1769104665586091481">പുതിയ &വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="1773212559869067373">പരിശോധിച്ചുറപ്പിക്കൽ സർട്ടിഫിക്കറ്റ് പ്രാദേശികമായി നിരസിച്ചു</translation> @@ -1857,6 +1859,7 @@ <translation id="3748026146096797577">കണക്റ്റുചെയ്തിട്ടില്ല</translation> <translation id="3752582316358263300">ശരി...</translation> <translation id="3752673729237782832">എന്റെ ഉപകരണങ്ങൾ</translation> +<translation id="3753033997400164841">ഒരു തവണ സംഭരിക്കൂ. എല്ലായിടത്തും ഉപയോഗിക്കൂ</translation> <translation id="3755411799582650620"><ph name="PHONE_NAME" /> എന്നതിന് ഇപ്പോൾ <ph name="DEVICE_TYPE" /> എന്നതും അൺലോക്ക് ചെയ്യാനാവും.</translation> <translation id="375636864092143889">സൈറ്റ് നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> <translation id="3757733214359997190">സൈറ്റുകളൊന്നും കണ്ടെത്തിയില്ല</translation> @@ -2188,6 +2191,7 @@ <translation id="4232375817808480934">Kerberos കോൺഫിഗർ ചെയ്യുക</translation> <translation id="4235200303672858594">പൂർണ്ണ സ്ക്രീൻ</translation> <translation id="4235965441080806197">സൈൻ ഇൻ റദ്ദാക്കുക</translation> +<translation id="4242145785130247982">ഒന്നിലധികം ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകൾ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="4242533952199664413">ക്രമീകരണം തുറക്കുക</translation> <translation id="4242577469625748426">ഉപകരണത്തിൽ നയ ക്രമീകരണങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">കൂടുതൽ സ്റ്റൈലസ് ആപ്പുകൾ കാണുക</translation> @@ -2643,6 +2647,7 @@ <translation id="4957949153200969297"><ph name="IDS_SHORT_PRODUCT_NAME" /> സമന്വയവുമായി ബന്ധപ്പെട്ട ഫീച്ചറുകൾ മാത്രം പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="4959262764292427323">പാസ്വേഡുകൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കുന്നതിനാൽ, ഏത് ഉപകരണത്തിലും അവ നിങ്ങൾക്ക് ഉപയോഗിക്കാനാവും</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">ഈ ആപ്പ് നിങ്ങളുടെ അഡ്മിൻ ഇൻസ്റ്റാൾ ചെയ്തതാണ്.</translation> <translation id="4964455510556214366">ക്രമീകരണം</translation> <translation id="4964673849688379040">പരിശോധിക്കുന്നു...</translation> <translation id="4965808351167763748">Hangouts Meet റൺ ചെയ്യാനായി ഈ ഉപകരണം സജ്ജമാക്കണോ?</translation> @@ -2897,6 +2902,7 @@ <translation id="5360150013186312835">ടൂൾബാറിൽ കാണിക്കുക</translation> <translation id="5362741141255528695">സ്വകാര്യ കീ ഫയല് തിരഞ്ഞെടുക്കുക.</translation> <translation id="5363109466694494651">പവർവാഷുചെയ്ത് പഴയപടിയാക്കുക</translation> +<translation id="5365716706805792666">നിങ്ങളുടെ പാസ്വേഡുകൾ ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായിട്ടുണ്ടോയെന്ന് പരിശോധിക്കാൻ Google-ന് കഴിയും. നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുമ്പോൾ ഇത് ഓണാകും.</translation> <translation id="5365881113273618889">നിങ്ങൾ തിരഞ്ഞെടുത്ത ഫോൾഡറിൽ സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഫയലുകൾ അടങ്ങിയിരിക്കുന്നു. ഈ ഫോൾഡറിലേക്ക് "<ph name="APP_NAME" />" എന്നതിന് റൈറ്റ് ചെയ്യാനുള്ള ശാശ്വതമായ ആക്സസ് അനുവദിക്കണമെന്ന് ഉറപ്പാണോ?</translation> <translation id="5367091008316207019">ഫയൽ റീഡുചെയ്യുന്നു..</translation> <translation id="5368720394188453070">നിങ്ങളുടെ ഫോൺ ലോക്കായിരിക്കുമ്പോൾ. പ്രവേശിക്കുന്നതിന് അത് അൺലോക്ക് ചെയ്യുക.</translation> @@ -3847,6 +3853,7 @@ <translation id="6769712124046837540">പ്രിന്റർ ചേർക്കുന്നു...</translation> <translation id="6770664076092644100">NFC വഴി പരിശോധിച്ചുറപ്പിക്കുക</translation> <translation id="6771503742377376720">ഒരു സര്ട്ടിഫിക്കറ്റ് അതോറിറ്റി ആണ്</translation> +<translation id="6775163072363532304">ലഭ്യമായ ഉപകരണങ്ങൾ ഇവിടെ ദൃശ്യമാകും.</translation> <translation id="6777817260680419853">റീഡയറക്ട് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="6778737459546443941">നിങ്ങളുടെ രക്ഷിതാവ് ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation> <translation id="677965093459947883">വളരെ ചെറുത്</translation> @@ -4305,6 +4312,7 @@ <translation id="7441830548568730290">മറ്റ് ഉപയോക്താക്കൾ</translation> <translation id="7442465037756169001">നിങ്ങളുടെ Hangouts Meet hardware സജ്ജമാക്കാൻ തയ്യാറാണ്.</translation> <translation id="744341768939279100">ഒരു പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> +<translation id="7443806024147773267">Google അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്തിരിക്കുമ്പോഴെല്ലാം നിങ്ങളുടെ പാസ്വേഡുകൾ ആക്സസ് ചെയ്യുക</translation> <translation id="7444046173054089907">ഈ സൈറ്റ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> അപ്രാപ്തമാക്കുക</translation> <translation id="7448430327655618736">സ്വയമേവ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക</translation> @@ -4715,6 +4723,7 @@ <translation id="8014154204619229810">അപ്ഡേറ്റർ നിലവിൽ പ്രവർത്തിക്കുന്നു. വീണ്ടും പരിശോധിക്കാൻ ഒരു മിനിറ്റിനുള്ളിൽ പുതുക്കുക.</translation> <translation id="8014206674403687691">മുമ്പ് ഇൻസ്റ്റാൾ ചെയ്ത പതിപ്പിലേക്ക് <ph name="IDS_SHORT_PRODUCT_NAME" /> എന്നത് പഴയപടിയാക്കാനായില്ല. നിങ്ങളുടെ ഉപകരണം പവർവാഷ് ചെയ്യാൻ വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8014210335923519270">സിസ്റ്റം വിവരവും ഉപയോഗവും Google-ന് അയച്ച്, <ph name="IDS_SHORT_PRODUCT_NAME" />-ഉം അതിൻ്റെ സുരക്ഷയും മെച്ചപ്പെടുത്തുക</translation> +<translation id="8015780634880457457">നിങ്ങളുടെ പാസ്വേഡുകൾ ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായിട്ടുണ്ടോയെന്ന് പരിശോധിക്കാൻ Google-ന് കഴിയും</translation> <translation id="8016266267177410919">താൽക്കാലിക സ്റ്റോറേജ്</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">കുറുക്കുവഴി എഡിറ്റ് ചെയ്തു</translation> @@ -4832,6 +4841,7 @@ <translation id="8188389033983459049">നിങ്ങളുടെ ഉപകരണ ക്രമീകരണം പരിശോധിച്ച്, തുടരാനായി അത് ഓണാക്കുക</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ലേക്ക് ബന്ധിപ്പിക്കുന്നു</translation> <translation id="8191230140820435481">നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ, വിപുലീകരണങ്ങൾ, തീമുകൾ എന്നിവ നിയന്ത്രിക്കുക</translation> +<translation id="819464600477418284">Chrome OS-ന്റെ ഭാഗമായതിനാൽ ഈ ആപ്പ് അൺഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല.</translation> <translation id="8195027750202970175">ഡിസ്കിലെ വലുപ്പം</translation> <translation id="8198323535106903877">നിങ്ങൾക്കായി ആ <ph name="NUMBER_OF_APPS" /> ആപ്പുകൾ ഞങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യും</translation> <translation id="8199300056570174101">നെറ്റ്വർക്കും (സേവനം) ഉപകരണ പ്രോപ്പർട്ടികളും</translation> @@ -4892,6 +4902,7 @@ <ph name="BEGIN_PARAGRAPH2" />ഈ ഫീച്ചർ ഓഫാക്കുന്നത്, സിസ്റ്റം അപ്ഡേറ്റുകളും സുരക്ഷയും പോലുള്ള അത്യാവശ്യ സേവനങ്ങൾക്ക് ആവശ്യമായ വിവരങ്ങൾ അയയ്ക്കാനുള്ള ഈ ഉപകരണത്തിന്റെ കഴിവിനെ ബാധിക്കില്ല.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />ഈ ഫീച്ചർ, ക്രമീകരണം > വിപുലമായത് >ഡയഗ്നോസ്റ്റിക് ഡാറ്റയും ഉപയോഗ ഡാറ്റയും Google-ലേക്ക് അയയ്ക്കുക എന്നതിൽ ഉടമയ്ക്ക് നിയന്ത്രിക്കാം.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />നിങ്ങളുടെ കുട്ടിയുടെ അധിക 'വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി' ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ നിങ്ങളുടെ കുട്ടിയുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിച്ചിട്ടുണ്ടാകാം. ഈ ക്രമീകരണത്തെക്കുറിച്ചും അത് എങ്ങനെ മാറ്റാമെന്നും families.google.com എന്നതിൽ അറിയുക.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് അസാധുവാണ്</translation> <translation id="8270242299912238708">PDF ഡോക്യുമെന്റുകൾ</translation> <translation id="827097179112817503">ഹോം ബട്ടൺ കാണിക്കുക</translation> <translation id="8271246892936492311">{COUNT,plural, =1{ഒരു ബുക്ക്മാർക്ക് ഇല്ലാതാക്കി}other{# ബുക്ക്മാർക്കുകൾ ഇല്ലാതാക്കി}}</translation> @@ -5300,6 +5311,7 @@ <translation id="8874184842967597500">കണക്റ്റുചെയ്തിട്ടില്ല</translation> <translation id="8876307312329369159">ഒരു ഡെമോ സെഷനിൽ ഈ ക്രമീകരണം മാറ്റാനാകില്ല.</translation> <translation id="8877448029301136595">[രക്ഷാകര്തൃ ഡയറക്റ്ററി]</translation> +<translation id="8879220587046205278">ബാഹ്യ സ്റ്റോറേജ് ഉപകരണങ്ങളിൽ ഫയലുകൾ റീഡ് ചെയ്യാനും റൈറ്റ് ചെയ്യാനും Google Play-ലെ ആപ്പുകൾക്ക് പൂർണ്ണ ഫയൽ സിസ്റ്റം ആക്സസ് ആവശ്യമായേക്കാം. ഉപകരണത്തിൽ സൃഷ്ടിച്ച ഫയലുകളും ഫോൾഡറുകളും ബാഹ്യ ഡ്രൈവ് ഉപയോഗിക്കുന്ന ആര്ക്കും ദൃശ്യമാകും.</translation> <translation id="8879284080359814990">&ടാബായി കാണിക്കുക</translation> <translation id="8879921471468674457">സൈൻ ഇൻ വിവരം ഓർക്കുക</translation> <translation id="8884570509232205463">നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ <ph name="UNLOCK_TIME" />-ന് ലോക്ക് ആകുന്നു.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 627d7b3..a6128e9 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -476,6 +476,7 @@ <translation id="1698122934742150150">Bare denne inkognitoøkten</translation> <translation id="1698650002254827833">Listen over apper kan ikke lastes inn. Prøv på nytt.</translation> <translation id="1701062906490865540">Fjern denne personen</translation> +<translation id="1703331064825191675">Slutt å bekymre deg for passordene dine</translation> <translation id="1706586824377653884">Lagt til av administratoren din</translation> <translation id="1706625117072057435">Zoomnivåer</translation> <translation id="1708338024780164500">(Inaktiv)</translation> @@ -525,6 +526,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">&Nytt vindu</translation> <translation id="1766575458646819543">Gikk ut av fullskjerm</translation> +<translation id="1766957085594317166">Lagre passordene sikkert i Google-kontoen, så trenger du aldri å skrive dem inn igjen</translation> <translation id="1768278914020124551">Beklager. Det oppsto et problem ved forsøket på å kontakte påloggingstjeneren. Sjekk nettverkstilkoblingen din og domenenavnet, og prøv på nytt.</translation> <translation id="1769104665586091481">&Åpne link i nytt vindu</translation> <translation id="1773212559869067373">Autentiseringssertifikatet ble avvist lokalt</translation> @@ -1872,6 +1874,7 @@ <translation id="3748026146096797577">Ikke tilkoblet</translation> <translation id="3752582316358263300">OK</translation> <translation id="3752673729237782832">Mine enheter</translation> +<translation id="3753033997400164841">Lagre én gang. Bruk overalt</translation> <translation id="3755411799582650620">Du kan nå også låse opp <ph name="DEVICE_TYPE" /> med <ph name="PHONE_NAME" />.</translation> <translation id="375636864092143889">Nettstedet bruker mikrofonen din</translation> <translation id="3757733214359997190">Fant ingen nettsteder</translation> @@ -2202,6 +2205,7 @@ <translation id="4232375817808480934">Konfigurer Kerberos</translation> <translation id="4235200303672858594">Hele skjermen</translation> <translation id="4235965441080806197">Avbryt påloggingen</translation> +<translation id="4242145785130247982">Flere klientsertifikater støttes ikke</translation> <translation id="4242533952199664413">Åpne innstillingene</translation> <translation id="4242577469625748426">Kunne ikke installere angivelse av innstillinger på enheten: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Finn flere pekepennapper</translation> @@ -2660,6 +2664,7 @@ <translation id="4957949153200969297">Slår bare på funksjoner knyttet til <ph name="IDS_SHORT_PRODUCT_NAME" />-synkronisering</translation> <translation id="4959262764292427323">Passordene er lagret i Google-kontoen din, slik at du kan bruke dem på alle enheter</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Denne appen er installert av administratoren.</translation> <translation id="4964455510556214366">Oppsett</translation> <translation id="4964673849688379040">Kontrollerer …</translation> <translation id="4965808351167763748">Er du sikker på at du vil konfigurere Hangouts Meet på denne enheten?</translation> @@ -2917,6 +2922,7 @@ <translation id="5360150013186312835">Vis i verktøyraden</translation> <translation id="5362741141255528695">Velg privat nøkkelfil.</translation> <translation id="5363109466694494651">Powerwash og tilbakestill</translation> +<translation id="5365716706805792666">Google kan sjekke om passordene dine har vært en del av et databrudd. Dette blir slått på når du logger på med Google-kontoen din.</translation> <translation id="5365881113273618889">Mappen du valgte, inneholder sensitive filer. Er du sikker på at du vil gi «<ph name="APP_NAME" />» permanent skrivetilgang til denne mappen?</translation> <translation id="5367091008316207019">Leser filen …</translation> <translation id="5368720394188453070">Telefonen er låst. Lås den opp for å få tilgang.</translation> @@ -3869,6 +3875,7 @@ <translation id="6769712124046837540">Legger til skriver …</translation> <translation id="6770664076092644100">Bekreft via NFC</translation> <translation id="6771503742377376720">Er en sertifiseringsinstans</translation> +<translation id="6775163072363532304">Tilgjengelige enheter vises her.</translation> <translation id="6777817260680419853">Viderekobling er blokkert</translation> <translation id="6778737459546443941">Forelderen din har ikke godkjent det ennå</translation> <translation id="677965093459947883">Veldig liten</translation> @@ -4329,6 +4336,7 @@ <translation id="7441830548568730290">Andre brukere</translation> <translation id="7442465037756169001">Hangouts Meet hardware er klar til å konfigureres.</translation> <translation id="744341768939279100">Opprett en ny profil</translation> +<translation id="7443806024147773267">Få tilgang til passordene dine når du er logget på Google-kontoen</translation> <translation id="7444046173054089907">Dette nettstedet er blokkert</translation> <translation id="7444983668544353857">Slå av <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installer apper automatisk</translation> @@ -4742,6 +4750,7 @@ <translation id="8014154204619229810">Oppdateringsprogrammet kjører. Last inn siden på nytt om en liten stund for å sjekke igjen.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> kunne ikke tilbakestilles til forrige versjon. Prøv å utføre en powerwash av enheten på nytt.</translation> <translation id="8014210335923519270">Gjør <ph name="IDS_SHORT_PRODUCT_NAME" /> bedre og sikrere ved å sende systeminformasjon og bruk til Google</translation> +<translation id="8015780634880457457">Google kan sjekke om passordene dine har vært en del av et databrudd</translation> <translation id="8016266267177410919">Midlertidig lagring</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Snarveien er endret</translation> @@ -4860,6 +4869,7 @@ <translation id="8188389033983459049">Sjekk enhetsinnstillingene dine og slå det på for å fortsette</translation> <translation id="8190193592390505034">Kobler til <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Administrering av programmer, utvidelser og temaer</translation> +<translation id="819464600477418284">Denne appen kan ikke avinstalleres, da den er en del av Chrome OS.</translation> <translation id="8195027750202970175">Lagringsstørrelse</translation> <translation id="8198323535106903877">Vi installerer de <ph name="NUMBER_OF_APPS" /> appene for deg</translation> <translation id="8199300056570174101">Egenskaper for nettverk (tjeneste) og enhet</translation> @@ -4920,6 +4930,7 @@ <ph name="BEGIN_PARAGRAPH2" />Selv om denne funksjonen slås av, kan enheten fortsatt sende informasjonen den trenger for å motta nødvendige tjenester, som systemoppdateringer og sikkerhet.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Eieren kan kontrollere funksjonen fra Innstillinger > Avansert > Send diagnostikk og bruksdata til Google automatisk.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Hvis ytterligere nett- og appaktivitet er slått på for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. Finn ut mer om disse innstillingene og hvordan du justerer dem, på families.google.com.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Ugyldig klientsertifikat</translation> <translation id="8270242299912238708">PDF-dokumenter</translation> <translation id="827097179112817503">Vis startsideknapp</translation> <translation id="8271246892936492311">{COUNT,plural, =1{1 bokmerke er slettet}other{# bokmerker er slettet}}</translation> @@ -5333,6 +5344,7 @@ <translation id="8874184842967597500">Ikke tilkoblet</translation> <translation id="8876307312329369159">Denne innstillingen kan ikke endres under en demonstrasjonsøkt.</translation> <translation id="8877448029301136595">[overordnet katalog]</translation> +<translation id="8879220587046205278">Apper fra Google Play trenger kanskje full tilgang til filsystemet for å kunne lese og skrive til filer på eksterne lagringsenheter. Filer og mapper som opprettes på enheten, er synlige for alle som bruker den eksterne stasjonen.</translation> <translation id="8879284080359814990">Vi&s som fane</translation> <translation id="8879921471468674457">Husk påloggingsinfo</translation> <translation id="8881020143150461183">Prøv på nytt. For teknisk brukerstøtte, kontakt <ph name="CARRIER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 1cdd27b4..52feedb 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1546,7 +1546,7 @@ <translation id="3280237271814976245">Сохранить &как...</translation> <translation id="3280243678470289153">Продолжить в Chrome</translation> <translation id="3281892622610078515">Файлы и программы, которые будут отправлены в карантин:</translation> -<translation id="3282568296779691940">Войдите в Chrome</translation> +<translation id="3282568296779691940">Войти в Chrome</translation> <translation id="3285322247471302225">Новая вкладка</translation> <translation id="328571385944182268">Сохранить пароли?</translation> <translation id="3286737518123001369">Просмотр и удаление учетных данных, которые хранятся на электронном ключе.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 6c9cc1e1..a31ffc0 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">Endast nuvarande inkognitosession</translation> <translation id="1698650002254827833">Det gick inte att läsa in listan med appar. Försök igen.</translation> <translation id="1701062906490865540">Ta bort personen</translation> +<translation id="1703331064825191675">Tänk inte mer på dina lösenord</translation> <translation id="1706586824377653884">Lades till av administratören</translation> <translation id="1706625117072057435">Zoomnivåer</translation> <translation id="1708338024780164500">(Inaktiv)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">&Nytt fönster</translation> <translation id="1766575458646819543">Helskärmsläget avslutades</translation> +<translation id="1766957085594317166">Spara lösenord säkert i Google-kontot så att du aldrig mer behöver skriva dem</translation> <translation id="1768278914020124551">Hoppsan. Det gick inte att kontakta inloggningsservern. Kontrollera nätverksanslutningen och domännamnet och försök igen.</translation> <translation id="1769104665586091481">Öppna länk i nytt f&önster</translation> <translation id="1773212559869067373">Autentiseringscertifikatet godkändes inte lokalt</translation> @@ -1875,6 +1877,7 @@ <translation id="3748026146096797577">Ej ansluten</translation> <translation id="3752582316358263300">OK ...</translation> <translation id="3752673729237782832">Mina enheter</translation> +<translation id="3753033997400164841">Spara dem en gång. Använd dem överallt</translation> <translation id="3755411799582650620"><ph name="PHONE_NAME" /> kan nu även låsa upp <ph name="DEVICE_TYPE" />.</translation> <translation id="375636864092143889">Webbplatsen använder din mikrofon</translation> <translation id="3757733214359997190">Inga webbplatser hittades</translation> @@ -2207,6 +2210,7 @@ <translation id="4232375817808480934">Konfigurera Kerberos</translation> <translation id="4235200303672858594">Helskärm</translation> <translation id="4235965441080806197">Avbryt inloggningen</translation> +<translation id="4242145785130247982">Flera klientcertifikat stöds inte</translation> <translation id="4242533952199664413">Öppna Inställningar</translation> <translation id="4242577469625748426">Det gick inte att installera policyinställningar på enheten: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Hitta fler appar för e-penna</translation> @@ -2665,6 +2669,7 @@ <translation id="4957949153200969297">Aktivera enbart funktioner som har att göra med synkronisering i <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="4959262764292427323">Lösenorden sparas i Google-kontot så att du kan använda dem på vilken enhet som helst</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Den här appen har installerats av administratören.</translation> <translation id="4964455510556214366">Ordning</translation> <translation id="4964673849688379040">Kontrollerar …</translation> <translation id="4965808351167763748">Vill du konfigurera den här enheten för Hangouts Meet?</translation> @@ -2922,6 +2927,7 @@ <translation id="5360150013186312835">Visa i verktygsfältet</translation> <translation id="5362741141255528695">Välj privat nyckelfil.</translation> <translation id="5363109466694494651">Använd Powerwash och återställ</translation> +<translation id="5365716706805792666">Google kan kontrollera om dina lösenord har läckt ut vid ett dataintrång. Detta aktiveras när du loggar in med Google-kontot.</translation> <translation id="5365881113273618889">Mappen som du valde innehåller känsliga filer. Vill du bevilja <ph name="APP_NAME" /> permanent skrivåtkomst till den här mappen?</translation> <translation id="5367091008316207019">Läser fil ...</translation> <translation id="5368720394188453070">Din mobil är låst. Lås upp den.</translation> @@ -3874,6 +3880,7 @@ <translation id="6769712124046837540">Lägger till skrivare ...</translation> <translation id="6770664076092644100">Verifiera via NFC</translation> <translation id="6771503742377376720">Är en certifikatutfärdare</translation> +<translation id="6775163072363532304">Tillgängliga enheter visas här.</translation> <translation id="6777817260680419853">Omdirigeringen blockerades</translation> <translation id="6778737459546443941">Din förälder har inte godkänt den ännu</translation> <translation id="677965093459947883">Mycket liten</translation> @@ -4334,6 +4341,7 @@ <translation id="7441830548568730290">Andra användare</translation> <translation id="7442465037756169001">Hangouts Meet hardware är klar att konfigurera.</translation> <translation id="744341768939279100">Skapa en ny profil</translation> +<translation id="7443806024147773267">Få tillgång till dina lösenord när du är inloggad på Google-kontot</translation> <translation id="7444046173054089907">Webbplatsen är blockerad</translation> <translation id="7444983668544353857">Inaktivera <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installera appar automatiskt</translation> @@ -4747,6 +4755,7 @@ <translation id="8014154204619229810">Uppdateringsprogrammet körs. Uppdatera sidan om en minut och kolla igen.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> kan inte återställas till den föregående installerade versionen. Försök använda Powerwash på enheten igen.</translation> <translation id="8014210335923519270">Gör <ph name="IDS_SHORT_PRODUCT_NAME" /> bättre och säkrare genom att skicka information om system och användning till Google</translation> +<translation id="8015780634880457457">Google kan kontrollera om dina lösenord har läckt ut vid ett dataintrång</translation> <translation id="8016266267177410919">Tillfällig lagring</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Genvägen har ändrats</translation> @@ -4865,6 +4874,7 @@ <translation id="8188389033983459049">Kontrollera enhetsinställningarna och aktivera Bluetooth om du vill fortsätta</translation> <translation id="8190193592390505034">Ansluter till <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Hantera dina appar, tillägg och teman</translation> +<translation id="819464600477418284">Den här appen går inte att avinstallera eftersom den är en del av Chrome OS.</translation> <translation id="8195027750202970175">Storlek på disk</translation> <translation id="8198323535106903877">Vi installerar de <ph name="NUMBER_OF_APPS" /> apparna åt dig</translation> <translation id="8199300056570174101">Nätverkstjänst och enhetsegenskaper</translation> @@ -4925,6 +4935,7 @@ <ph name="BEGIN_PARAGRAPH2" />Möjligheten att skicka information som behövs för viktiga tjänster, t.ex. systemuppdateringar och säkerhetstjänster, påverkas inte av att den här funktionen inaktiveras.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Ägaren kan styra denna funktion via Inställningar > Avancerat > Skicka diagnostik- och användningsdata automatiskt till Google.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Om tillvalsinställningen Webb- och appaktivitet har aktiverats för ditt barn kan denna data sparas i barnets Google-konto. Läs mer om de här inställningarna och hur du kan ändra dem på families.google.com.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Ogiltigt klientcertifikat</translation> <translation id="8270242299912238708">PDF-dokument</translation> <translation id="827097179112817503">Visa hemknappen</translation> <translation id="8271246892936492311">{COUNT,plural, =1{Bokmärket har raderats}other{# bokmärken har raderats}}</translation> @@ -5338,6 +5349,7 @@ <translation id="8874184842967597500">Inte ansluten</translation> <translation id="8876307312329369159">Inställningen kan inte ändras i demoläget.</translation> <translation id="8877448029301136595">[överordnad katalog]</translation> +<translation id="8879220587046205278">Appar från Google Play kan behöva fullständig åtkomst till filsystemet för att kunna läsa och skriva filer på externa lagringsenheter. Alla som använder den externa enheten kan se filer och mappar som skapats på den.</translation> <translation id="8879284080359814990">&Visa som flik</translation> <translation id="8879921471468674457">Kom ihåg inloggningsuppgifter</translation> <translation id="8881020143150461183">Försök igen. Kontakta <ph name="CARRIER_NAME" /> om du behöver teknisk support.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 60ac3187..817ffe0e 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -476,6 +476,7 @@ <translation id="1698122934742150150">Kipindi cha sasa cha hali fiche pekee</translation> <translation id="1698650002254827833">Imeshindwa kupakia orodha ya programu. Tafadhali jaribu tena.</translation> <translation id="1701062906490865540">Ondoa mtumiaji huyu</translation> +<translation id="1703331064825191675">Usiwe na wasiwasi kuhusu manenosiri yako</translation> <translation id="1706586824377653884">Imeongezwa na msimamizi wako</translation> <translation id="1706625117072057435">Viwango vya kukuza</translation> <translation id="1708338024780164500">(Sio amilifu)</translation> @@ -525,6 +526,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">&Dirisha Jipya</translation> <translation id="1766575458646819543">Umefunga hali ya skrini nzima</translation> +<translation id="1766957085594317166">Hifadhi manenosiri kwa usalama kwenye Akaunti yako ya Google na hutawahi kuyaandika tena</translation> <translation id="1768278914020124551">Lo! Tatizo limetokea wakati wa kuwasiliana na seva ya kuingia katika akaunti. Tafadhali kagua muunganisho wa mtandao na jina la kikoa, kisha ujaribu tena.</translation> <translation id="1769104665586091481">Fungua Kiungo katika &Dirisha Jipya</translation> <translation id="1773212559869067373">Cheti cha uthibitishaji kimekataliwa kindani</translation> @@ -1872,6 +1874,7 @@ <translation id="3748026146096797577">Haujaunganishwa</translation> <translation id="3752582316358263300">Sawa...</translation> <translation id="3752673729237782832">Vifaa vyangu</translation> +<translation id="3753033997400164841">Hifadhi mara moja. Tumia kila mahali</translation> <translation id="3755411799582650620"><ph name="PHONE_NAME" /> yako sasa inaweza kufungua <ph name="DEVICE_TYPE" /> hii pia.</translation> <translation id="375636864092143889">Tovuti inatumia maikrofoni yako</translation> <translation id="3757733214359997190">Hakuna tovuti zilizopatikana</translation> @@ -2202,6 +2205,7 @@ <translation id="4232375817808480934">Weka Mipangilio ya Kerberos</translation> <translation id="4235200303672858594">Skrini Nzima</translation> <translation id="4235965441080806197">Ghairi kuingia katika akaunti</translation> +<translation id="4242145785130247982">Vyeti vingi vya kiteja havitumiki</translation> <translation id="4242533952199664413">Fungua mipangilio</translation> <translation id="4242577469625748426">Imeshindwa kusakinisha mipangilio ya sera kwenye kifaa: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Pata programu zaidi za stylus</translation> @@ -2660,6 +2664,7 @@ <translation id="4957949153200969297">Washa tu vipengele vinavyohusiana na Usawazishaji wa <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="4959262764292427323">Manenosiri yanahifadhiwa kwenye Akaunti yako ya Google ili uweze kuyatumia kwenye kifaa chochote</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Programu hii imesakinishwa na msimamizi wako.</translation> <translation id="4964455510556214366">Mpangilio</translation> <translation id="4964673849688379040">Inakagua...</translation> <translation id="4965808351167763748">Una uhakika ungependa kuweka mipangilio kwenye kifaa hiki ili utumie Hangouts Meet?</translation> @@ -2916,6 +2921,7 @@ <translation id="5360150013186312835">Onyesha katika Upau wa Vidhibiti</translation> <translation id="5362741141255528695">Chagua faili ya ufunguo binafsi.</translation> <translation id="5363109466694494651">Powerwash na Urejeshe nakala ya awali</translation> +<translation id="5365716706805792666">Google inaweza kukagua iwapo manenosiri yako yaliathiriwa na ufichuzi haramu wa data. Kipengele hiki kitawashwa ukiingia kwa kutumia Akaunti yako ya Google.</translation> <translation id="5365881113273618889">Folda uliyochagua ina faili nyeti. Je, una uhakika, ungependa kuipa "<ph name="APP_NAME" />" idhini ya kuandika kwenye folda hii?</translation> <translation id="5367091008316207019">Inasoma faili..</translation> <translation id="5368720394188453070">Simu yako imefungwa. Ifungue ili kuingia.</translation> @@ -3867,6 +3873,7 @@ <translation id="6769712124046837540">Inaongeza printa...</translation> <translation id="6770664076092644100">Thibitisha kupitia NFC</translation> <translation id="6771503742377376720">Ni Idhini ya Cheti</translation> +<translation id="6775163072363532304">Vifaa vinavyopatikana vitaonekana hapa.</translation> <translation id="6777817260680419853">Imezuia shughuli ya kuelekeza kwingine</translation> <translation id="6778737459546443941">Mzazi wako bado hajaiidhinisha</translation> <translation id="677965093459947883">Ndogo sana</translation> @@ -4327,6 +4334,7 @@ <translation id="7441830548568730290">Watumiaji wengine</translation> <translation id="7442465037756169001">Maunzi yako ya Hangouts Meet yako tayari kuwekwa.</translation> <translation id="744341768939279100">Unda wasifu mpya</translation> +<translation id="7443806024147773267">Fikia manenosiri yako kila unapoingia katika Akaunti yako ya Google</translation> <translation id="7444046173054089907">Tovuti hii imezuiwa</translation> <translation id="7444983668544353857">Zima <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Husakinisha programu kiotomatiki</translation> @@ -4742,6 +4750,7 @@ <translation id="8014154204619229810">Programu ya kusasisha inatekeleza kwa sasa. Onyesha upya baada ya dakika moja ili uangalie tena.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> haiwezi kurejesha toleo lililokuwa limesakinishwa. Tafadhali jaribu kutumia tena Powerwash kwenye kifaa chako.</translation> <translation id="8014210335923519270">Boresha <ph name="IDS_SHORT_PRODUCT_NAME" /> na usalama wake kwa kutuma maelezo na matumizi ya mfumo kwa Google</translation> +<translation id="8015780634880457457">Google inaweza kuangalia iwapo manenosiri yako yaliathiriwa na ufichuzi haramu wa data</translation> <translation id="8016266267177410919">Hifadhi ya muda</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Umebadilisha njia ya mkato</translation> @@ -4860,6 +4869,7 @@ <translation id="8188389033983459049">Angalia mipangilio ya kifaa chako na uiwashe ili uendelee</translation> <translation id="8190193592390505034">Inaunganisha kwenye <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Kudhibiti programu, viendelezi na mandhari yako</translation> +<translation id="819464600477418284">Huruhusiwi kuondoa programu hii kwa sababu ni sehemu ya Mfumo wa Uendeshaji wa Chrome.</translation> <translation id="8195027750202970175">Ukubwa kwenye diski</translation> <translation id="8198323535106903877">Tutakusakinishia programu hizo <ph name="NUMBER_OF_APPS" /></translation> <translation id="8199300056570174101">Sifa za Kifaa na Mtandao (Huduma)</translation> @@ -4920,6 +4930,7 @@ <ph name="BEGIN_PARAGRAPH2" />Hatua ya kuzima kipengele hiki haitaathiri uwezo wa kifaa chako kutuma maelezo yanayohitajika katika huduma za msingi kama vile usalama na masasisho ya mfumo.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Mmiliki anaweza kudhibiti kipengele hiki katika Mipangilio > Mipangilio ya Kina > Tuma kiotomatiki data ya uchunguzi na matumizi kwa Google.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Ikiwa umewasha mipangilio ya ziada ya Historia ya Shughuli kwenye Wavuti na Programu kwa ajili ya mtoto wako, data hii inaweza kuhifadhiwa katika Akaunti yake ya Google. Pata maelezo zaidi kuhusu mipangilio hii na jinsi ya kuirekebisha katika families.google.com.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Cheti cha kiteja si sahihi</translation> <translation id="8270242299912238708">Hati za PDF</translation> <translation id="827097179112817503">Onyesha kitufe cha mwanzo</translation> <translation id="8271246892936492311">{COUNT,plural, =1{Alamisho 1 imefutwa}other{Alamisho # zimefutwa}}</translation> @@ -5333,6 +5344,7 @@ <translation id="8874184842967597500">Haijaunganishwa</translation> <translation id="8876307312329369159">Mipangilio hii haiwezi kubadilishwa katika hali ya onyesho</translation> <translation id="8877448029301136595">[saraka kuu]</translation> +<translation id="8879220587046205278">Huenda programu kwenye Google Play zikahitaji ufikiaji kamili wa mfumo wa faili ili kusoma na kuandika faili kwenye vifaa vya hifadhi ya nje. Faili na folda zinazotengenezwa kwenye kifaa huonekana kwa mtu yeyote anayetumia hifadhi ya nje.</translation> <translation id="8879284080359814990">Onye&sha kama Kichupo</translation> <translation id="8879921471468674457">Kumbuka maelezo ya kuingia katika akaunti</translation> <translation id="8881020143150461183">Tafadhali jaribu tena. Kwa usaidizi wa kiufundi, wasiliana na <ph name="CARRIER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 88c85408..3bdb8326 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">Yalnızca geçerli gizli oturum</translation> <translation id="1698650002254827833">Uygulama listesi yüklenemiyor. Lütfen tekrar deneyin.</translation> <translation id="1701062906490865540">Bu kişiyi kaldır</translation> +<translation id="1703331064825191675">Şifreleriniz için hiç kaygılanmayın</translation> <translation id="1706586824377653884">Yöneticiniz tarafından eklendi</translation> <translation id="1706625117072057435">Yakınlaştırma seviyeleri</translation> <translation id="1708338024780164500">(Etkin değil)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">&Yeni Pencere</translation> <translation id="1766575458646819543">Tam ekrandan çıkıldı</translation> +<translation id="1766957085594317166">Şifrelerinizi Google Hesabınızda güvenle kaydederek bir daha hiç yazmak zorunda kalmayın</translation> <translation id="1768278914020124551">Tüh! Oturum açma sunucusuyla bağlantı kurulurken bir sorun oluştu. Lütfen ağ bağlantınızı ve alan adınızı kontrol edip tekrar deneyin.</translation> <translation id="1769104665586091481">Bağlantıyı Yeni &Pencerede Aç</translation> <translation id="1773212559869067373">Kimlik doğrulama sertifikası yerel olarak reddedildi</translation> @@ -1875,6 +1877,7 @@ <translation id="3748026146096797577">Bağlı Değil</translation> <translation id="3752582316358263300">Tamam...</translation> <translation id="3752673729237782832">Cihazlarım</translation> +<translation id="3753033997400164841">Bir kere depolayın. Her yerde kullanın</translation> <translation id="3755411799582650620"><ph name="PHONE_NAME" /> cihazınız bu <ph name="DEVICE_TYPE" /> cihazın kilidini de açabilir.</translation> <translation id="375636864092143889">Site, mikrofonunuzu kullanıyor</translation> <translation id="3757733214359997190">Hiç site bulunamadı</translation> @@ -2207,6 +2210,7 @@ <translation id="4232375817808480934">Kerberos'u yapılandırın</translation> <translation id="4235200303672858594">Tüm ekran</translation> <translation id="4235965441080806197">Oturum açmayı iptal et</translation> +<translation id="4242145785130247982">Birden fazla istemci sertifikası desteklenmiyor</translation> <translation id="4242533952199664413">Ayarları aç</translation> <translation id="4242577469625748426">Politika ayarları cihaza yüklenemedi: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Daha fazla ekran kalemi uygulaması bul</translation> @@ -2665,6 +2669,7 @@ <translation id="4957949153200969297">Yalnızca <ph name="IDS_SHORT_PRODUCT_NAME" /> Senkronizasyonu ile ilişkili özellikleri etkinleştirin</translation> <translation id="4959262764292427323">Şifreler Google Hesabınıza kaydedildiğinden bunları herhangi bir cihazda kullanabilirsiniz</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Bu uygulama, yöneticiniz tarafından yüklendi.</translation> <translation id="4964455510556214366">Düzenleme</translation> <translation id="4964673849688379040">Denetleniyor...</translation> <translation id="4965808351167763748">Bu cihazı Hangouts Meet'i çalıştırmak üzere ayarlamak istediğinizden emin misiniz?</translation> @@ -2922,6 +2927,7 @@ <translation id="5360150013186312835">Araç Çubuğunda Göster</translation> <translation id="5362741141255528695">Özel anahtar dosyası seçin.</translation> <translation id="5363109466694494651">Powerwash Uygula ve Geri Al</translation> +<translation id="5365716706805792666">Google, şifrelerinizin bir veri ihlaline dahil olup olmadığını kontrol edebilir. Bu, Google Hesabınızla oturum açtığınızda etkinleştirilecektir.</translation> <translation id="5365881113273618889">Seçtiğiniz klasör hassas dosyalar içeriyor. "<ph name="APP_NAME" />" uygulamasına bu klasör için kalıcı yazma erişimi vermek istediğinizden emin misiniz?</translation> <translation id="5367091008316207019">Dosya okunuyor..</translation> <translation id="5368720394188453070">Telefonunuz kilitli. Giriş yapmak için kilidini açın.</translation> @@ -3875,6 +3881,7 @@ <translation id="6769712124046837540">Yazıcı ekleniyor...</translation> <translation id="6770664076092644100">NFC kullanarak doğrula</translation> <translation id="6771503742377376720">Sertifika Yetkilisidir</translation> +<translation id="6775163072363532304">Kullanılabilir cihazlar burada görünür.</translation> <translation id="6777817260680419853">Yönlendirme engellendi</translation> <translation id="6778737459546443941">Ebeveyniniz henüz onaylamadı</translation> <translation id="677965093459947883">Çok küçük</translation> @@ -4335,6 +4342,7 @@ <translation id="7441830548568730290">Diğer kullanıcılar</translation> <translation id="7442465037756169001">Hangouts Meet hardware cihazınız kuruluma hazır.</translation> <translation id="744341768939279100">Yeni profil oluştur</translation> +<translation id="7443806024147773267">Google Hesabınıza her giriş yaptığınızda şifrelerinize erişin</translation> <translation id="7444046173054089907">Bu site engellenmiş</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ağ cihazını devre dışı bırak</translation> <translation id="7448430327655618736">Uygulamaları otomatik olarak yükle</translation> @@ -4747,6 +4755,7 @@ <translation id="8014154204619229810">Güncelleyici şu anda çalışıyor. Tekrar kontrol etmek için bir dakika içinde yenileyin.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> daha önce yüklü olan sürümü geri yükleyemiyor. Lütfen cihazınıza tekrar Powerwash uygulayın.</translation> <translation id="8014210335923519270">Google'a sistem ve kullanım bilgilerini göndererek <ph name="IDS_SHORT_PRODUCT_NAME" /> ürününü ve güvenliğini iyileştirin</translation> +<translation id="8015780634880457457">Google, şifrelerinizin bir veri ihlaline dahil olup olmadığını kontrol edebilir</translation> <translation id="8016266267177410919">Geçici depolama</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Kısayol düzenlendi</translation> @@ -4865,6 +4874,7 @@ <translation id="8188389033983459049">Cihaz ayarlarınızı kontrol edin ve devam etmek için açın</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ağına bağlanılıyor</translation> <translation id="8191230140820435481">Uygulamalarınızı, uzantılarınızı ve temalarınızı yönetme</translation> +<translation id="819464600477418284">Chrome OS'un parçası olduğundan bu uygulamanın yüklemesi kaldırılamaz.</translation> <translation id="8195027750202970175">Diskteki boyut</translation> <translation id="8198323535106903877">Bu <ph name="NUMBER_OF_APPS" /> uygulamayı sizin için yükleyeceğiz</translation> <translation id="8199300056570174101">Ağ (Hizmet) ve Cihaz özellikleri</translation> @@ -4925,6 +4935,7 @@ <ph name="BEGIN_PARAGRAPH2" />Bu özelliğin kapatılması, bu cihazın, sistem güncellemeleri ve güvenlik gibi önemli hizmetleri almak için ihtiyaç duyduğu bilgileri gönderme yeteneğini etkilemez.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Cihaz sahibi bu özelliği Ayarlar > Gelişmiş > Teşhis ve kullanım verilerini Google'a otomatik olarak gönder seçeneğinden kontrol edebilir.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu bilgiler çocuğunuzun Google Hesabına kaydedilebilir. Bu ayarlar hakkında daha fazla bilgiyi ve nasıl düzenleneceklerini families.google.com sayfasında bulabilirsiniz.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Geçersiz istemci sertifikası</translation> <translation id="8270242299912238708">PDF dokümanları</translation> <translation id="827097179112817503">Ana Sayfa düğmesini göster</translation> <translation id="8271246892936492311">{COUNT,plural, =1{1 yer işareti silindi}other{# yer işareti silindi}}</translation> @@ -5338,6 +5349,7 @@ <translation id="8874184842967597500">Bağlı değil</translation> <translation id="8876307312329369159">Bu ayar demo oturumunda değiştirilemez.</translation> <translation id="8877448029301136595">[üst dizin]</translation> +<translation id="8879220587046205278">Google Play uygulamaları, harici depolama cihazlarında bulunan dosyaları ve klasörleri okuyup yazmak için tam dosya sistemi erişim izni gerektirebilir. Cihazda oluşturulan dosyalar ve klasörler, harici sürücüyü kullanan herkes tarafından görülebilir.</translation> <translation id="8879284080359814990">&Sekme Olarak Göster</translation> <translation id="8879921471468674457">Oturum açma bilgilerini hatırla.</translation> <translation id="8881020143150461183">Lütfen tekrar deneyin. Teknik destek için <ph name="CARRIER_NAME" /> ile iletişime geçin.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 93534c5..0aa5624 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">Chỉ phiên ẩn danh hiện tại</translation> <translation id="1698650002254827833">Không tải được danh sách ứng dụng. Vui lòng thử lại.</translation> <translation id="1701062906490865540">Xóa người này</translation> +<translation id="1703331064825191675">Không bao giờ phải lo lắng về mật khẩu của bạn</translation> <translation id="1706586824377653884">Do quản trị viên thêm</translation> <translation id="1706625117072057435">Mức thu phóng</translation> <translation id="1708338024780164500">(Không hoạt động)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">beta</translation> <translation id="176587472219019965">Cửa sổ &Mới</translation> <translation id="1766575458646819543">Đã thoát chế độ toàn màn hình</translation> +<translation id="1766957085594317166">Lưu các mật khẩu vào Tài khoản Google của bạn một cách an toàn để bạn không phải nhập lại mật khẩu nữa</translation> <translation id="1768278914020124551">Rất tiếc! Đã xảy ra lỗi khi liên hệ với máy chủ đăng nhập. Vui lòng kiểm tra kết nối mạng của bạn và tên miền, sau đó thử lại.</translation> <translation id="1769104665586091481">Mở Liên kết bằng Cửa sổ &Mới</translation> <translation id="1773212559869067373">Chứng chỉ xác thực bị từ chối cục bộ</translation> @@ -1875,6 +1877,7 @@ <translation id="3748026146096797577">Chưa được kết nối</translation> <translation id="3752582316358263300">OK...</translation> <translation id="3752673729237782832">Thiết bị của tôi</translation> +<translation id="3753033997400164841">Lưu trữ một lần. Dùng ở mọi nơi</translation> <translation id="3755411799582650620">Giờ đây, <ph name="PHONE_NAME" /> của bạn cũng có thể mở khóa <ph name="DEVICE_TYPE" /> này.</translation> <translation id="375636864092143889">Trang web đang sử dụng micrô của bạn</translation> <translation id="3757733214359997190">Không tìm thấy trang web nào</translation> @@ -2207,6 +2210,7 @@ <translation id="4232375817808480934">Định cấu hình Kerberos</translation> <translation id="4235200303672858594">Toàn màn hình</translation> <translation id="4235965441080806197">Hủy đăng nhập</translation> +<translation id="4242145785130247982">Không hỗ trợ nhiều chứng chỉ ứng dụng khách</translation> <translation id="4242533952199664413">Mở phần cài đặt</translation> <translation id="4242577469625748426">Không thể cài đặt các cài đặt chính sách trên thiết bị: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Tìm thêm ứng dụng bút cảm ứng</translation> @@ -2665,6 +2669,7 @@ <translation id="4957949153200969297">Chỉ bật các tính năng liên quan đến <ph name="IDS_SHORT_PRODUCT_NAME" /> Sync</translation> <translation id="4959262764292427323">Các mật khẩu được lưu trong Tài khoản Google của bạn, vì vậy, bạn có thể sử dụng các mật khẩu đó trên bất cứ thiết bị nào</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">Quản trị viên của bạn đã cài đặt ứng dụng này.</translation> <translation id="4964455510556214366">Sắp xếp</translation> <translation id="4964673849688379040">Đang kiểm tra...</translation> <translation id="4965808351167763748">Bạn có chắc chắn muốn thiết lập thiết bị này để chạy Hangouts Meet không?</translation> @@ -2922,6 +2927,7 @@ <translation id="5360150013186312835">Hiển thị trên thanh công cụ</translation> <translation id="5362741141255528695">Chọn tệp khóa cá nhân.</translation> <translation id="5363109466694494651">Powerwash và hoàn nguyên</translation> +<translation id="5365716706805792666">Google có thể kiểm tra xem mật khẩu của bạn có bị ảnh hưởng trong một vụ rò rỉ dữ liệu không. Tùy chọn này sẽ được bật khi bạn đăng nhập bằng Tài khoản Google của mình.</translation> <translation id="5365881113273618889">Thư mục bạn đã chọn chứa các tệp nhạy cảm. Bạn có chắc chắn muốn cấp cho "<ph name="APP_NAME" />" quyền ghi vào thư mục này vĩnh viễn không?</translation> <translation id="5367091008316207019">Đang đọc tệp..</translation> <translation id="5368720394188453070">Điện thoại của bạn bị khóa. Hãy mở khóa điện thoại để truy cập.</translation> @@ -3874,6 +3880,7 @@ <translation id="6769712124046837540">Đang thêm máy in...</translation> <translation id="6770664076092644100">Xác minh qua NFC</translation> <translation id="6771503742377376720">Là Tổ chức phát hành chứng chỉ</translation> +<translation id="6775163072363532304">Các thiết bị hiện có sẽ xuất hiện ở đây.</translation> <translation id="6777817260680419853">Đã chặn chuyển hướng</translation> <translation id="6778737459546443941">Cha mẹ của bạn chưa phê duyệt trang web</translation> <translation id="677965093459947883">Rất nhỏ</translation> @@ -4334,6 +4341,7 @@ <translation id="7441830548568730290">Người dùng khác</translation> <translation id="7442465037756169001">Bạn hiện có thể thiết lập phần cứng Hangouts Meet.</translation> <translation id="744341768939279100">Tạo cấu hình mới</translation> +<translation id="7443806024147773267">Sử dụng mật khẩu mỗi khi bạn đăng nhập vào Tài khoản Google của mình</translation> <translation id="7444046173054089907">Trang web này bị chặn</translation> <translation id="7444983668544353857">Vô hiệu hóa <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Tự động cài đặt ứng dụng</translation> @@ -4747,6 +4755,7 @@ <translation id="8014154204619229810">Trình cập nhật hiện đang chạy. Hãy làm mới sau một phút nữa để kiểm tra lại.</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> không thể hoàn nguyên về phiên bản được cài đặt trước. Vui lòng thử lại để Powerwash thiết bị của bạn.</translation> <translation id="8014210335923519270">Cải tiến <ph name="IDS_SHORT_PRODUCT_NAME" /> và tăng cường bảo mật cho sản phẩm bằng cách gửi thông tin hệ thống và việc sử dụng cho Google</translation> +<translation id="8015780634880457457">Google có thể kiểm tra xem mật khẩu của bạn có bị ảnh hưởng trong một vụ rò rỉ dữ liệu không</translation> <translation id="8016266267177410919">Bộ nhớ tạm thời</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">Đã chỉnh sửa phím tắt</translation> @@ -4865,6 +4874,7 @@ <translation id="8188389033983459049">Kiểm tra mục cài đặt thiết bị và bật Bluetooth để tiếp tục</translation> <translation id="8190193592390505034">Đang kết nối đến <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Quản lý ứng dụng, tiện ích và chủ đề của bạn</translation> +<translation id="819464600477418284">Không thể gỡ cài đặt ứng dụng này vì đây là một phần của Chrome OS.</translation> <translation id="8195027750202970175">Dung lượng trên đĩa</translation> <translation id="8198323535106903877">Chúng tôi sẽ cài đặt <ph name="NUMBER_OF_APPS" /> ứng dụng đó cho bạn</translation> <translation id="8199300056570174101">Thuộc tính của thiết bị và mạng (dịch vụ)</translation> @@ -4925,6 +4935,7 @@ <ph name="BEGIN_PARAGRAPH2" />Việc tắt tính năng này không ảnh hưởng đến khả năng thiết bị này gửi thông tin cần thiết cho các dịch vụ thiết yếu như bảo mật và bản cập nhật hệ thống.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Chủ sở hữu có thể kiểm soát tính năng này trong mục Cài đặt > Nâng cao > Tự động gửi dữ liệu chẩn đoán và dữ liệu sử dụng cho Google.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Nếu bạn bật tùy chọn cài đặt Hoạt động web và ứng dụng bổ sung cho con bạn, thì dữ liệu này có thể được lưu vào Tài khoản Google của con. Bạn có thể tìm hiểu thêm về các tùy chọn cài đặt này cùng cách điều chỉnh tại families.google.com.<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">Chứng chỉ ứng dụng khách không hợp lệ</translation> <translation id="8270242299912238708">Tài liệu PDF</translation> <translation id="827097179112817503">Hiển thị nút trang chủ</translation> <translation id="8271246892936492311">{COUNT,plural, =1{Đã xóa 1 dấu trang}other{Đã xóa # dấu trang}}</translation> @@ -5338,6 +5349,7 @@ <translation id="8874184842967597500">Chưa kết nối</translation> <translation id="8876307312329369159">Không thể thay đổi tùy chọn cài đặt này trong phiên minh họa.</translation> <translation id="8877448029301136595">[thư mục cha]</translation> +<translation id="8879220587046205278">Các ứng dụng trên Google Play có thể yêu cầu quyền truy cập vào toàn bộ hệ thống tệp để đọc và ghi tệp trên các thiết bị lưu trữ bên ngoài. Bất cứ ai dùng ổ đĩa bên ngoài sẽ nhìn thấy các tệp và thư mục tạo trên thiết bị này.</translation> <translation id="8879284080359814990">&Hiển thị Dưới dạng Tab</translation> <translation id="8879921471468674457">Ghi nhớ thông tin đăng nhập</translation> <translation id="8881020143150461183">Vui lòng thử lại. Nếu cần hỗ trợ kỹ thuật, hãy liên hệ với <ph name="CARRIER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 994328b..94568ef 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -476,6 +476,7 @@ <translation id="1698122934742150150">仅限当前的隐身会话</translation> <translation id="1698650002254827833">无法加载应用列表,请重试。</translation> <translation id="1701062906490865540">移除此用户</translation> +<translation id="1703331064825191675">再也不必费心记住您的密码</translation> <translation id="1706586824377653884">此图标是由管理员添加的</translation> <translation id="1706625117072057435">缩放级别</translation> <translation id="1708338024780164500">(无效)</translation> @@ -525,6 +526,7 @@ <translation id="1764226536771329714">测试版</translation> <translation id="176587472219019965">打开新的窗口(&N)</translation> <translation id="1766575458646819543">已退出全屏模式</translation> +<translation id="1766957085594317166">将密码安全地保存到您的 Google 帐号中,彻底为您免除再次输入的麻烦</translation> <translation id="1768278914020124551">糟糕!联系登录服务器时出现了问题。请检查您的网络连接和域名,然后重试。</translation> <translation id="1769104665586091481">在新窗口中打开链接(&W)</translation> <translation id="1773212559869067373">身份验证证书遭到本地拒绝</translation> @@ -1871,6 +1873,7 @@ <translation id="3748026146096797577">未建立连接</translation> <translation id="3752582316358263300">确定...</translation> <translation id="3752673729237782832">我的设备</translation> +<translation id="3753033997400164841">一次储存,随时随地使用</translation> <translation id="3755411799582650620">您的“<ph name="PHONE_NAME" />”现在也可用来为此 <ph name="DEVICE_TYPE" /> 解锁。</translation> <translation id="375636864092143889">该网站正在使用您的麦克风</translation> <translation id="3757733214359997190">未找到任何网站</translation> @@ -2202,6 +2205,7 @@ <translation id="4232375817808480934">配置 Kerberos</translation> <translation id="4235200303672858594">整个屏幕</translation> <translation id="4235965441080806197">取消登录</translation> +<translation id="4242145785130247982">有多个客户端证书不受支持</translation> <translation id="4242533952199664413">打开“设置”</translation> <translation id="4242577469625748426">无法在设备上安装策略设置:<ph name="VALIDATION_ERROR" />。</translation> <translation id="4244238649050961491">查找更多触控笔应用</translation> @@ -2660,6 +2664,7 @@ <translation id="4957949153200969297">仅启用与 <ph name="IDS_SHORT_PRODUCT_NAME" /> 同步相关的功能</translation> <translation id="4959262764292427323">系统会将密码保存在您的 Google 帐号中,以便您在任意设备上使用密码</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">您的管理员已安装此应用。</translation> <translation id="4964455510556214366">排列方式</translation> <translation id="4964673849688379040">正在检查…</translation> <translation id="4965808351167763748">确定要将此设备设为运行 Hangouts Meet 吗?</translation> @@ -2917,6 +2922,7 @@ <translation id="5360150013186312835">在工具栏中显示</translation> <translation id="5362741141255528695">选择私有密钥文件。</translation> <translation id="5363109466694494651">执行 Powerwash 操作并还原</translation> +<translation id="5365716706805792666">Google 可检查您的密码是否曾遭遇过数据泄露。当您登录了自己的 Google 帐号时,系统即会开启此服务。</translation> <translation id="5365881113273618889">您所选的文件夹中包含敏感文件。确定要向“<ph name="APP_NAME" />”授予对此文件夹的永久写入权限吗?</translation> <translation id="5367091008316207019">正在读取文件...</translation> <translation id="5368720394188453070">配对手机已锁定,需将其解锁才能进入。</translation> @@ -3869,6 +3875,7 @@ <translation id="6769712124046837540">添加打印机…</translation> <translation id="6770664076092644100">通过 NFC 进行验证</translation> <translation id="6771503742377376720">是证书授权中心</translation> +<translation id="6775163072363532304">可用设备将会显示在此处。</translation> <translation id="6777817260680419853">已禁止重定向</translation> <translation id="6778737459546443941">您的父亲/母亲尚未批准此网站</translation> <translation id="677965093459947883">特小</translation> @@ -4329,6 +4336,7 @@ <translation id="7441830548568730290">其他用户</translation> <translation id="7442465037756169001">您的 Hangouts Meet 设备现已可供设置了。</translation> <translation id="744341768939279100">创建新的个人资料</translation> +<translation id="7443806024147773267">只要您登录自己的 Google 帐号,即可获取您的密码</translation> <translation id="7444046173054089907">此网站已被屏蔽</translation> <translation id="7444983668544353857">停用<ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">自动安装应用</translation> @@ -4742,6 +4750,7 @@ <translation id="8014154204619229810">更新程序正在运行,请稍后刷新并再次查看。</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" />无法还原到之前安装的版本。请重新尝试对您的设备执行 Powerwash 操作。</translation> <translation id="8014210335923519270">将系统信息和使用情况数据发送给 Google,帮助改进 <ph name="IDS_SHORT_PRODUCT_NAME" /> 并提高其安全性</translation> +<translation id="8015780634880457457">Google 可检查您的密码是否曾遭遇过数据泄露</translation> <translation id="8016266267177410919">临时存储</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">已修改快捷方式</translation> @@ -4859,6 +4868,7 @@ <translation id="8188389033983459049">请检查您的设备设置,并开启蓝牙以继续</translation> <translation id="8190193592390505034">正在连接到<ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理您的应用、扩展程序和主题背景</translation> +<translation id="819464600477418284">无法卸载此应用,因为它是 Chrome 操作系统的一部分。</translation> <translation id="8195027750202970175">占用的存储空间</translation> <translation id="8198323535106903877">我们将为您安装这 <ph name="NUMBER_OF_APPS" /> 款应用</translation> <translation id="8199300056570174101">网络(服务)和设备属性</translation> @@ -4919,6 +4929,7 @@ <ph name="BEGIN_PARAGRAPH2" />关闭这项功能并不会影响此设备发送基本服务(例如系统更新和安全防护)所需的信息。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />所有者可以通过“设置”>“高级”>“自动向 Google 发送诊断数据和使用情况数据”来控制这项功能。<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />如果您已为孩子开启了“其他网络与应用活动记录”设置,这些数据可能会保存在您孩子的 Google 帐号中。您可以前往 families.google.com 详细了解这些设置以及对应的调整方式。<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">客户端证书无效</translation> <translation id="8270242299912238708">PDF 文档</translation> <translation id="827097179112817503">显示“主页”按钮</translation> <translation id="8271246892936492311">{COUNT,plural, =1{已删除 1 个书签}other{已删除 # 个书签}}</translation> @@ -5332,6 +5343,7 @@ <translation id="8874184842967597500">未连接</translation> <translation id="8876307312329369159">在演示会话中,此设置无法更改。</translation> <translation id="8877448029301136595">[上级目录]</translation> +<translation id="8879220587046205278">Google Play 中的应用可能需要获得完整的文件系统访问权限,以便在外部存储设备上读取和写入文件。任何使用外部驱动器的人员都能看到在此设备上创建的文件和文件夹。</translation> <translation id="8879284080359814990">显示为标签页(&S)</translation> <translation id="8879921471468674457">记住登录信息</translation> <translation id="8881020143150461183">请重试。如需技术支持,请联系<ph name="CARRIER_NAME" />。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index aae1b70d..650fe89 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -479,6 +479,7 @@ <translation id="1698122934742150150">僅適用於目前的無痕模式工作階段</translation> <translation id="1698650002254827833">無法載入應用程式清單,請再試一次。</translation> <translation id="1701062906490865540">移除這個使用者</translation> +<translation id="1703331064825191675">再也不必費心記住你的密碼</translation> <translation id="1706586824377653884">由管理員新增</translation> <translation id="1706625117072057435">縮放等級</translation> <translation id="1708338024780164500">(無法使用)</translation> @@ -528,6 +529,7 @@ <translation id="1764226536771329714">測試版</translation> <translation id="176587472219019965">開新視窗(&N)</translation> <translation id="1766575458646819543">已結束全螢幕模式</translation> +<translation id="1766957085594317166">你可以將密碼妥善儲存在 Google 帳戶中,不僅安全無虞,日後也不須手動輸入密碼</translation> <translation id="1768278914020124551">糟糕!連線至登入伺服器時發生問題。請檢查網路連線狀態和網域名稱,然後再試一次。</translation> <translation id="1769104665586091481">在新視窗中開啟連結(&W)</translation> <translation id="1773212559869067373">本機已拒絕驗證憑證</translation> @@ -1874,6 +1876,7 @@ <translation id="3748026146096797577">尚未連線</translation> <translation id="3752582316358263300">確定...</translation> <translation id="3752673729237782832">我的裝置</translation> +<translation id="3753033997400164841">只要儲存一次,即可在所有裝置上使用</translation> <translation id="3755411799582650620">你的 <ph name="PHONE_NAME" /> 現在也可以解鎖這台 <ph name="DEVICE_TYPE" />。</translation> <translation id="375636864092143889">網站正在使用你的麥克風</translation> <translation id="3757733214359997190">找不到任何網站</translation> @@ -2205,6 +2208,7 @@ <translation id="4232375817808480934">設定 Kerberos</translation> <translation id="4235200303672858594">整個畫面</translation> <translation id="4235965441080806197">取消登入</translation> +<translation id="4242145785130247982">不支援多個用戶端憑證</translation> <translation id="4242533952199664413">開啟設定</translation> <translation id="4242577469625748426">無法在裝置上安裝政策設定:<ph name="VALIDATION_ERROR" />。</translation> <translation id="4244238649050961491">尋找其他觸控筆應用程式</translation> @@ -2663,6 +2667,7 @@ <translation id="4957949153200969297">僅啟用與 <ph name="IDS_SHORT_PRODUCT_NAME" /> 同步相關的功能</translation> <translation id="4959262764292427323">系統會將密碼儲存在你的 Google 帳戶中,方便你在任何裝置上使用密碼</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> +<translation id="496185450405387901">你的系統管理員已安裝此應用程式。</translation> <translation id="4964455510556214366">排列</translation> <translation id="4964673849688379040">檢查中...</translation> <translation id="4965808351167763748">你確定要設定這個裝置以執行 Hangouts Meet 嗎?</translation> @@ -2920,6 +2925,7 @@ <translation id="5360150013186312835">顯示在工具列中</translation> <translation id="5362741141255528695">選取秘密金鑰檔案。</translation> <translation id="5363109466694494651">執行 Powerwash 並恢復原廠設定</translation> +<translation id="5365716706805792666">Google 可以檢查你的密碼資料是否外洩。系統會在你使用 Google 帳戶登入時開啟這項功能。</translation> <translation id="5365881113273618889">你選取的資料夾包含敏感檔案。你確定要將這個資料夾的寫入權限永久授予「<ph name="APP_NAME" />」嗎?</translation> <translation id="5367091008316207019">正在讀取檔案...</translation> <translation id="5368720394188453070">你的手機已鎖定,必須解鎖才能繼續操作。</translation> @@ -3872,6 +3878,7 @@ <translation id="6769712124046837540">新增印表機...</translation> <translation id="6770664076092644100">透過 NFC 進行驗證</translation> <translation id="6771503742377376720">這是憑證授權單位</translation> +<translation id="6775163072363532304">可用的裝置會顯示在這裡。</translation> <translation id="6777817260680419853">已禁止重新導向</translation> <translation id="6778737459546443941">你的家長尚未核准這個網站</translation> <translation id="677965093459947883">非常小</translation> @@ -4332,6 +4339,7 @@ <translation id="7441830548568730290">其他使用者</translation> <translation id="7442465037756169001">現在可以開始設定你的 Hangouts Meet 設備了。</translation> <translation id="744341768939279100">建立新的設定檔</translation> +<translation id="7443806024147773267">系統會在你每次登入 Google 帳戶時存取你的密碼</translation> <translation id="7444046173054089907">這個網站遭到封鎖</translation> <translation id="7444983668544353857">停用 <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">自動安裝應用程式</translation> @@ -4745,6 +4753,7 @@ <translation id="8014154204619229810">正在執行更新程式。請稍後片刻,重新整理之後再試一次。</translation> <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> 無法還原至先前安裝的版本,請嘗試再次為你的裝置執行 Powerwash。</translation> <translation id="8014210335923519270">傳送系統資訊和使用情形資料給 Google,協助改善 <ph name="IDS_SHORT_PRODUCT_NAME" /> 及其安全性。</translation> +<translation id="8015780634880457457">Google 可以檢查你的密碼資料是否外洩</translation> <translation id="8016266267177410919">暫時儲存空間</translation> <translation id="8017335670460187064"><ph name="LABEL" /></translation> <translation id="8017679124341497925">已編輯捷徑</translation> @@ -4862,6 +4871,7 @@ <translation id="8188389033983459049">檢查裝置設定並開啟藍牙功能,以便繼續操作</translation> <translation id="8190193592390505034">正在連線至 <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理你的應用程式、擴充功能和主題</translation> +<translation id="819464600477418284">這個應用程式是 Chrome 作業系統的一部分,因此無法解除安裝。</translation> <translation id="8195027750202970175">佔磁碟容量</translation> <translation id="8198323535106903877">系統將為你安裝這 <ph name="NUMBER_OF_APPS" /> 個應用程式</translation> <translation id="8199300056570174101">網路 (服務) 與裝置屬性</translation> @@ -4922,6 +4932,7 @@ <ph name="BEGIN_PARAGRAPH2" />即使關閉這項功能,這個裝置仍然可以傳送基本服務 (例如系統更新與安全服務) 所需的資訊。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />裝置擁有者如要管理這項功能,可依序前往 [設定] > [進階] > [自動將診斷資料和使用情況資料傳送給 Google]。<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />如果你另外為子女開啟了「網路和應用程式活動」設定,這項資料可能會儲存在他們的 Google 帳戶中。如要進一步瞭解這些設定及其調整方式,請前往 families.google.com。<ph name="END_PARAGRAPH4" /></translation> +<translation id="826905130698769948">用戶端憑證無效</translation> <translation id="8270242299912238708">PDF 文件</translation> <translation id="827097179112817503">顯示 [首頁] 按鈕</translation> <translation id="8271246892936492311">{COUNT,plural, =1{已刪除 1 個書籤}other{已刪除 # 個書籤}}</translation> @@ -5335,6 +5346,7 @@ <translation id="8874184842967597500">未連線</translation> <translation id="8876307312329369159">這項設定無法在示範工作階段中變更。</translation> <translation id="8877448029301136595">[父目錄]</translation> +<translation id="8879220587046205278">透過 Google Play 下載的應用程式可能會要求取得檔案系統的完整存取權,以讀取和寫入外部儲存裝置上的檔案。外接式磁碟的任何使用者都能看見在此裝置上建立的檔案和資料夾。</translation> <translation id="8879284080359814990">以分頁顯示(&S)</translation> <translation id="8879921471468674457">記住登入資訊</translation> <translation id="8881020143150461183">請再試一次。如需技術支援,請聯絡「<ph name="CARRIER_NAME" />」。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 7053fae..7cd143b 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -53,6 +53,9 @@ <translation id="2094919256425865063">তা স্বত্তেও Chrome বন্ধ করবেন?</translation> <translation id="2120620239521071941">এটি এই ডিভাইস থেকে <ph name="ITEMS_COUNT" />টি আইটেম মুছে দেবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome-এ <ph name="USER_EMAIL" /> হিসেবে সাইন-ইন করুন।</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />বর্তমান সেটিংস<ph name="END_LINK" />-এর রিপোর্ট করে Chrome-কে আরও ভাল করে তুলতে সাহায্য করুন</translation> +<translation id="2128103434102193461">Chrome OS-এর বিশদ বিবরণ পেতে <ph name="LINK_BEGIN" /> + Chrome OS সম্পর্কে<ph name="LINK_END" /> পৃষ্ঠা দেখুন</translation> +<translation id="2151406531797534936">এখনই Chrome রিস্টার্ট করুন</translation> <translation id="216054706567564023">আপনার ফোনে Chrome ইনস্টল করুন। আমরা আপনার অ্যাকাউন্ট ফিরিয়ে আনার ফোন নম্বরে একটি এসএমএস পাঠাব।</translation> <translation id="2246246234298806438">বিলট-ইন PDF viewer অনুপস্থিত থাকার সময়ে Google Chrome প্রিন্ট প্রিভিউ দেখাতে পারে না৷</translation> <translation id="2252923619938421629">বর্তমান সেটিংস রিপোর্ট করে Google Chrome আরও ভালো করে তুলতে সাহায্য করুন</translation> @@ -223,6 +226,7 @@ <translation id="7589360514048265910">এই কম্পিউটারটি আর Google Chrome এর আপডেট গ্রহণ করবে না কারণ এই Mac OS X 10.9 আর সমর্থিত নয়৷</translation> <translation id="7592736734348559088">Google Chrome আপনার অ্যাকাউন্ট সাইন-ইন বিশদ বিবরণটি পুরনো হওয়ার কারণে সিঙ্ক করতে পারেনি৷</translation> <translation id="7626032353295482388">Chrome এ স্বাগতম</translation> +<translation id="7629695634924605473">আপনার পাসওয়ার্ড কখনও চুরি হলে তা Chrome আপনাকে জানিয়ে দেবে</translation> <translation id="7641148173327520642"><ph name="TARGET_URL_HOSTNAME" /> অ্যাক্সেস করতে <ph name="ALTERNATIVE_BROWSER_NAME" /> ব্যবহার করার জন্য আপনার সিস্টেম অ্যাডমিনিস্ট্রেটর Google Chrome কনফিগার করেছে।</translation> <translation id="7651907282515937834">Chrome এন্টারপ্রাইজ লোগো</translation> <translation id="7747138024166251722">ইনস্টলারটি অস্থায়ী ডাইরেক্টরি তৈরি করতে পারে নি৷ অনুগ্রহ করে খালি ডিস্ক স্পেশ এবং সফটওয়্যারটি ইনস্টল করার অনুমতি যাচাই করে নিন৷</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 6931de7..543d60c0 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -167,7 +167,7 @@ <translation id="5686916850681061684">Personaliza y controla Google Chrome. Una alerta necesita tu atención. Haz clic para ver los detalles.</translation> <translation id="5690427481109656848">Google LLC</translation> <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome se reiniciará en 1 segundo}other{Google Chrome se reiniciará en # segundos}}</translation> -<translation id="573759479754913123">Acerca de Chrome OS</translation> +<translation id="573759479754913123">Acerca del sistema operativo Chrome</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" />: Google Chrome Canary</translation> <translation id="5804318322022881572">No se pudo iniciar Chrome. Vuelve a intentarlo.</translation> <translation id="5877064549588274448">Se cambió el canal. Reinicia el dispositivo para aplicar los cambios.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index 5de8ecc4..1ba665a 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -47,7 +47,8 @@ <translation id="1873233029667955273">Hindi Google Chrome ang iyong default na browser</translation> <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation> <translation id="1877026089748256423">Luma na ang Chrome</translation> -<translation id="1900795423379050516">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" />mga setting ng Chrome browser<ph name="LINK_END" /></translation> +<translation id="1900795423379050516">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" /> + mga setting ng Chrome browser<ph name="LINK_END" /></translation> <translation id="1915828456209461693">May available na bagong update para sa Chrome at ilalapat ito sa sandaling muli kang maglunsad.</translation> <translation id="1919130412786645364">Pagayan ang pag-sign in sa Chrome</translation> <translation id="2063848847527508675">Kailangang ma-restart ang Chrome OS upang mailapat ang update.</translation> @@ -165,7 +166,8 @@ <translation id="5543953544073077331">May tumatakbong iba pang kopya ng Chrome. Para i-update, isara ang mga ito.</translation> <translation id="556024056938947818">Sinusubukan ng Google Chrome na magpakita ng mga password.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5657226924540934362">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" />mga setting ng Chrome OS<ph name="LINK_END" /></translation> +<translation id="5657226924540934362">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" /> + mga setting ng Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Maaaring mapanganib ang <ph name="FILE_NAME" />, kaya na-block ito ng Chrome.</translation> <translation id="5686916850681061684">I-customize at kontrolin ang Google Chrome. May kailangan kang pagtuunan ng pansin - mag-click para sa mga detalye.</translation> <translation id="5690427481109656848">Google LLC</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index cddc9aa6..9abfe1a1 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -55,6 +55,9 @@ <translation id="2094919256425865063">છતાં પણ Chrome બંધ કરવું છે?</translation> <translation id="2120620239521071941">આ, <ph name="ITEMS_COUNT" /> આઇટમને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromeમાં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />વર્તમાન સેટિંગ્સ<ph name="END_LINK" />ની જાણ કરીને Chrome ને બહેતર બનાવવામાં સહાય કરો</translation> +<translation id="2128103434102193461">Chrome OSની વિગતો માટે, કૃપા કરીને <ph name="LINK_BEGIN" /> + Chrome OS વિશે<ph name="LINK_END" /> જુઓ</translation> +<translation id="2151406531797534936">કૃપા કરીને હવે Chrome ફરી શરૂ કરો</translation> <translation id="216054706567564023">તમારા ફોન પર Chrome ઇન્સ્ટૉલ કરો. અમે તમારા એકાઉન્ટને પાછું મેળવવા ફોન નંબર પર એક SMS મોકલીશું.</translation> <translation id="2246246234298806438">જ્યારે બિલ્ટ-ઇન PDF વ્યૂઅર ગૂમ હોય ત્યારે Google Chrome પ્રિન્ટ પ્રીવ્યૂ બતાવી શકતું નથી.</translation> <translation id="2252923619938421629">વર્તમાન સેટિંગ્સની જાણ કરીને Google Chrome ને વધુ સારું બનાવવામાં સહાય કરો</translation> @@ -227,6 +230,7 @@ <translation id="7589360514048265910">આ કમ્પ્યુટર હવેથી Google Chrome અપડેટ મેળવી શકશે નહીં, કારણ કે હવેથી Mac OS X 10.9 સપોર્ટ નથી કરતી.</translation> <translation id="7592736734348559088">સાઇન ઇન વિગતો જૂની હોવાને કારણે Google Chrome તમારા ડેટાને સિંક કરી શક્યું નથી.</translation> <translation id="7626032353295482388">Chrome પર આપનું સ્વાગત છે</translation> +<translation id="7629695634924605473">Chrome વડે તમે તમારા પાસવર્ડમાં ક્યારેક ચેડાં થાય તો તેના વિશે જાણકારી મેળવી શકો છો</translation> <translation id="7641148173327520642">તમારા સિસ્ટમ વ્યવસ્થાપકે <ph name="TARGET_URL_HOSTNAME" />ને ઍક્સેસ કરવા Google Chromeને <ph name="ALTERNATIVE_BROWSER_NAME" /> ખોલવા માટે ગોઠવેલું છે.</translation> <translation id="7651907282515937834">Chrome એન્ટરપ્રાઇઝ લૉગો</translation> <translation id="7747138024166251722">ઇન્સ્ટૉલર અસ્થાયી ડિરેક્ટરી બનાવી શક્યું નથી. કૃપા કરીને ખાલી ડિસ્ક સ્પેસ માટે અને સૉફ્ટવેર ઇન્સ્ટૉલ કરવાની પરવાનગી માટે તપાસો.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index fb310213..e09704a 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -51,6 +51,9 @@ <translation id="2094919256425865063">Tetap tutup Chrome?</translation> <translation id="2120620239521071941">Tindakan ini akan menghapus <ph name="ITEMS_COUNT" /> item dari perangkat ini. Untuk mengambil data nanti, login ke Chrome sebagai <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Bantu Chrome jadi lebih baik dengan melaporkan <ph name="BEGIN_LINK" />setelan saat ini<ph name="END_LINK" /></translation> +<translation id="2128103434102193461">Untuk detail Chrome OS, lihat <ph name="LINK_BEGIN" /> + Tentang Chrome OS<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">Mulai ulang Chrome sekarang</translation> <translation id="216054706567564023">Instal Chrome di ponsel. Kami akan mengirimkan SMS ke nomor telepon pemulihan akun Anda.</translation> <translation id="2246246234298806438">Google Chrome tidak dapat menampilkan pratinjau cetak jika penampil PDF default hilang.</translation> <translation id="2252923619938421629">Bantu menjadikan Google Chrome lebih baik dengan melaporkan setelan saat ini</translation> @@ -219,6 +222,7 @@ <translation id="7589360514048265910">Komputer ini tidak akan menerima update Google Chrome lagi karena Mac OS X 10.9 sudah tidak didukung.</translation> <translation id="7592736734348559088">Google Chrome tidak dapat menyinkronkan data karena detail ID masuk akun Anda belum diperbarui.</translation> <translation id="7626032353295482388">Selamat Datang di Chrome</translation> +<translation id="7629695634924605473">Chrome akan memberi tahu jika sandi Anda disusupi</translation> <translation id="7641148173327520642">Administrator sistem Anda telah mengonfigurasi Google Chrome untuk membuka <ph name="ALTERNATIVE_BROWSER_NAME" /> guna mengakses <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="7651907282515937834">Logo Chrome Enterprise</translation> <translation id="7747138024166251722">Pemasang tidak dapat membuat direktori sementara. Periksa kapasitas kosong pada disk dan izin untuk memasang software.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index bc1a30c..b50ba0f 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -53,6 +53,9 @@ <translation id="2094919256425865063">എന്തായാലും Chrome-ൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="2120620239521071941">ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് <ph name="ITEMS_COUNT" /> ഇനങ്ങൾ ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />നിലവിലെ ക്രമീകരണം<ph name="END_LINK" /> റിപ്പോർട്ട് ചെയ്തുകൊണ്ട് Chrome മികച്ചതാക്കാൻ സഹായിക്കുക</translation> +<translation id="2128103434102193461">Chrome OS-ന്റെ വിശദാംശങ്ങൾക്ക് <ph name="LINK_BEGIN" /> + Chrome OS-നെക്കുറിച്ച്<ph name="LINK_END" /> എന്ന പേജ് കാണുക</translation> +<translation id="2151406531797534936">Chrome ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="216054706567564023">നിങ്ങളുടെ ഫോണിൽ Chrome ഇൻസ്റ്റാൾ ചെയ്യുക. അക്കൗണ്ട് വീണ്ടെടുക്കൽ ഫോൺ നമ്പറിലേക്ക് ഞങ്ങളൊരു SMS അയയ്ക്കും.</translation> <translation id="2246246234298806438">ബിൽറ്റ്-ഇൻ PDF വ്യൂവർ കാണുന്നില്ലെങ്കിൽ Google Chrome-ന് പ്രിന്റ് പ്രിവ്യു കാണിക്കാൻ കഴിയില്ല.</translation> <translation id="2252923619938421629">നിലവിലെ ക്രമീകരണങ്ങൾ റിപ്പോർട്ട് ചെയ്യുന്നതിലൂടെ Google Chrome-നെ മികച്ചതാക്കാൻ സഹായിക്കുക</translation> @@ -223,6 +226,7 @@ <translation id="7589360514048265910">Mac OS X 10.9 ഇനി പിന്തുണയ്ക്കാത്തതിനാൽ ഈ കമ്പ്യൂട്ടറിന് ഇനി Google Chrome അപ്ഡേറ്റുകൾ സ്വീകരിക്കാനാവില്ല.</translation> <translation id="7592736734348559088">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടതിനാൽ Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="7626032353295482388">Chrome-ലേക്ക് സ്വാഗതം</translation> +<translation id="7629695634924605473">നിങ്ങളുടെ പാസ്വേഡുകൾ എപ്പോഴെങ്കിലും അപഹരിക്കപ്പെട്ടിട്ടുണ്ടെങ്കിൽ അക്കാര്യം Chrome നിങ്ങളെ അറിയിക്കും</translation> <translation id="7641148173327520642"><ph name="TARGET_URL_HOSTNAME" /> ആക്സസ് ചെയ്യാൻ <ph name="ALTERNATIVE_BROWSER_NAME" /> തുറക്കുന്നതിനായി നിങ്ങളുടെ സിസ്റ്റം അഡ്മിൻ Google Chrome കോൺഫിഗർ ചെയ്തു.</translation> <translation id="7651907282515937834">Chrome എന്റർപ്രൈസ് ലോഗോ</translation> <translation id="7747138024166251722">ഇൻസ്റ്റാളറിന് താൽക്കാലിക ഡയറക്റ്ററി സൃഷ്ടിക്കാനായില്ല. ശൂന്യമായ ഡിസ്ക് സ്പെയിസും സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്യാനുള്ള അനുമതിയും പരിശോധിക്കുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 0a71c52..b08206a8 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -51,6 +51,9 @@ <translation id="2094919256425865063">Vil du avslutte Chrome likevel?</translation> <translation id="2120620239521071941">Dette sletter <ph name="ITEMS_COUNT" /> elementer fra denne enheten. For å hente dataene dine igjen senere må du logge på Chrome som <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Bidra til å gjøre Chrome bedre ved å rapportere de <ph name="BEGIN_LINK" />nåværende innstillingene<ph name="END_LINK" /></translation> +<translation id="2128103434102193461">For detaljer om Chrome OS, se <ph name="LINK_BEGIN" /> + Om Chrome OS<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">Start Chrome på nytt nå</translation> <translation id="216054706567564023">Installer Chrome på telefonen din. Vi sender en SMS til telefonnummeret ditt for kontogjenoppretting.</translation> <translation id="2246246234298806438">Google Chrome kan ikke vise forhåndsvisningen av utskrift når det innebygde PDF-visningsprogrammet mangler.</translation> <translation id="2252923619938421629">Bidra til å gjøre Google Chrome bedre ved å rapportere gjeldende innstillinger</translation> @@ -219,6 +222,7 @@ <translation id="7589360514048265910">Denne datamaskinen kommer ikke til å motta oppdateringer av Google Chrome lenger fordi Mac OS X 10.9 ikke støttes lenger.</translation> <translation id="7592736734348559088">Google Chrome kunne ikke synkronisere dataene dine. Dette skyldes at påloggingsopplysningene for kontoen din er foreldede.</translation> <translation id="7626032353295482388">Velkommen til Chrome</translation> +<translation id="7629695634924605473">Med Chrome får du beskjed hvis passordene dine noensinne utsettes for sikkerhetsbrudd</translation> <translation id="7641148173327520642">Systemadministratoren din har konfigurert Google Chrome til å åpne <ph name="ALTERNATIVE_BROWSER_NAME" /> for å få tilgang til <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="7651907282515937834">Chrome Enterprise-logo</translation> <translation id="7747138024166251722">Installasjonsprogrammet kunne ikke opprette en midlertidig katalog. Kontroller at du har nok ledig diskplass og tillatelse til å installere programvare.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 7fcfca6..e951a8343 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -89,7 +89,7 @@ <translation id="3080151273017101988">Не отключать работающие в фоновом режиме сервисы при закрытии браузера</translation> <translation id="3089968997497233615">Доступна новая, более безопасная версия Google Chrome.</translation> <translation id="3149510190863420837">Приложения Chrome</translation> -<translation id="3282568296779691940">Войдите в Chrome</translation> +<translation id="3282568296779691940">Войти в Chrome</translation> <translation id="3340978935015468852">настройках</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome перезапускается}=1{Chrome перезапустится через 1 секунду}one{Chrome перезапустится через # секунду}few{Chrome перезапустится через # секунды}many{Chrome перезапустится через # секунд}other{Chrome перезапустится через # секунды}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 410bc6f..6cc94106 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -55,6 +55,9 @@ <translation id="2094919256425865063">Vill du avsluta Chrome ändå?</translation> <translation id="2120620239521071941"><ph name="ITEMS_COUNT" /> tas bort från enheten. Logga in i Chrome som <ph name="USER_EMAIL" /> om du vill kunna återställa datan senare.</translation> <translation id="2123055963409958220">Hjälp oss att förbättra Chrome genom att rapportera <ph name="BEGIN_LINK" />dina aktuella inställningar<ph name="END_LINK" /></translation> +<translation id="2128103434102193461">Mer information om Chrome OS finns under <ph name="LINK_BEGIN" /> + Om Chrome OS<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">Starta om Chrome nu</translation> <translation id="216054706567564023">Installera Chrome på mobilen. Vi skickar ett sms till ditt telefonnummer för kontoåterställning.</translation> <translation id="2246246234298806438">Förhandsgranskningen av utskriften kan inte visas i Google Chrome eftersom den inbyggda PDF-läsaren saknas.</translation> <translation id="2252923619938421629">Hjälp oss att förbättra Google Chrome genom att rapportera dina aktuella inställningar</translation> @@ -227,6 +230,7 @@ <translation id="7589360514048265910">Den här datorn får inte längre uppdateringar för Google Chrome eftersom Mac OS X 10.9 inte längre stöds.</translation> <translation id="7592736734348559088">Google Chrome kunde inte synkronisera data eftersom inloggningsuppgifterna för kontot är inaktuella.</translation> <translation id="7626032353295482388">Välkommen till Chrome</translation> +<translation id="7629695634924605473">Om dina lösenord någonsin skulle läcka ut får du veta det i Chrome</translation> <translation id="7641148173327520642">Systemadministratören har konfigurerat Google Chrome så att <ph name="TARGET_URL_HOSTNAME" /> öppnas i <ph name="ALTERNATIVE_BROWSER_NAME" />.</translation> <translation id="7651907282515937834">Logotyp för Chrome Enterprise</translation> <translation id="7747138024166251722">Det gick inte att skapa en tillfällig katalog för installationsfilen. Kontrollera diskutrymmet och att du har behörighet att installera program.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 692d8a0..d6daf37 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -54,6 +54,8 @@ <translation id="2094919256425865063">Ungependa kufunga Chrome?</translation> <translation id="2120620239521071941">Hatua hii itafuta vipengee <ph name="ITEMS_COUNT" /> kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chrome ukitumia <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Saidia kuboresha Chrome kwa kuripoti kuhusu <ph name="BEGIN_LINK" />mipangilio ya sasa<ph name="END_LINK" /></translation> +<translation id="2128103434102193461">Ili upate maelezo kuhusu Mfumo wa Uendeshaji wa Chrome, tafadhali angalia <ph name="LINK_BEGIN" />Kuhusu Mfumo wa Uendeshaji wa Chrome<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">Tafadhali zima kisha uwashe Chrome sasa</translation> <translation id="216054706567564023">Sakinisha Chrome kwenye simu yako. Tutatuma SMS kwenye nambari yako ya simu ya mbinu za kurejesha uwezo wa kufikia akaunti.</translation> <translation id="2246246234298806438">Google Chrome haiwezi kuonyesha uhakiki wa kuchapisha wakati kionyeshi kilichojengewa ndani cha PDF kinakosekana.</translation> <translation id="2252923619938421629">Saidia kuboresha Google Chrome kwa kuripoti mipangilio ya sasa</translation> @@ -226,6 +228,7 @@ <translation id="7589360514048265910">Kompyuta hii haitapokea tena masasisho ya Google Chrome kwa sababu Mac OS X 10.9 haitumiki tena.</translation> <translation id="7592736734348559088">Google Chrome haikuweza kusawazisha data yako kwa sababu maelezo yako ya kuingia katika akaunti yanahitaji kusasishwa.</translation> <translation id="7626032353295482388">Karibu kwenye Chrome</translation> +<translation id="7629695634924605473">Chrome hukuruhusu ujue iwapo manenosiri yako yameathiriwa</translation> <translation id="7641148173327520642">Msimamizi wa mfumo unaotumia ameweka mipangilio ya Google Chrome ifungue <ph name="ALTERNATIVE_BROWSER_NAME" /> ili kufikia <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="7651907282515937834">Nembo ya Chrome Enterprise</translation> <translation id="7747138024166251722">Kisakinishi hakikuweza kuunda saraka la muda. Tafadhali chunguza nafasi iliyo wazi kwenye diski na ruhusa ya kusakinisha programu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 7e9f8f2..01b3634 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -51,6 +51,9 @@ <translation id="2094919256425865063">Yine de Chrome'dan çıkılsın mı?</translation> <translation id="2120620239521071941">Bu işlem, <ph name="ITEMS_COUNT" /> öğeyi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chrome'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> <translation id="2123055963409958220"><ph name="BEGIN_LINK" />Mevcut ayarlarınızı<ph name="END_LINK" /> bildirerek Chrome'u daha iyi hale getirmemize yardımcı olun</translation> +<translation id="2128103434102193461">Chrome OS ayrıntıları için lütfen <ph name="LINK_BEGIN" /> + Chrome OS Hakkında<ph name="LINK_END" /> sayfasına bakın</translation> +<translation id="2151406531797534936">Lütfen Chrome'u şimdi yeniden başlatın</translation> <translation id="216054706567564023">Chrome'u telefonunuza yükleyin. Hesap kurtarma telefon numaranıza SMS göndereceğiz.</translation> <translation id="2246246234298806438">Google Chrome, dahili PDF görüntüleyici yokken baskı önizlemeyi gösteremez.</translation> <translation id="2252923619938421629">Mevcut ayarlarınızı bildirerek Google Chrome'u daha iyi hale getirmemize yardımcı olun</translation> @@ -221,6 +224,7 @@ <translation id="7589360514048265910">Mac OS X 10.9 artık desteklenmediğinden, bu bilgisayar artık Google Chrome güncellemelerini almayacak.</translation> <translation id="7592736734348559088">Hesap oturum açma ayrıntılarınız güncel olmadığından Google Chrome, verilerinizi senkronize edemedi.</translation> <translation id="7626032353295482388">Chrome'a Hoş Geldiniz</translation> +<translation id="7629695634924605473">Chrome, şifrelerinizin güvenliğinin ihlal edilip edilmediğini size bildirir</translation> <translation id="7641148173327520642">Sistem yöneticiniz Google Chrome'u <ph name="TARGET_URL_HOSTNAME" /> adresine erişmek için <ph name="ALTERNATIVE_BROWSER_NAME" /> tarayıcısını açacak şekilde yapılandırmış.</translation> <translation id="7651907282515937834">Chrome Enterprise logosu</translation> <translation id="7747138024166251722">Yükleyici geçici bir dizin oluşturamadı. Lütfen, kullanılabilir disk alanını ve yazılım yükleme iznini kontrol edin.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index 4f0adfd..f5adb542 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -53,6 +53,9 @@ <translation id="2094919256425865063">Bạn vẫn muốn thoát khỏi Chrome?</translation> <translation id="2120620239521071941">Thao tác này sẽ xóa <ph name="ITEMS_COUNT" /> mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng <ph name="USER_EMAIL" />.</translation> <translation id="2123055963409958220">Giúp cải thiện Chrome bằng cách báo cáo <ph name="BEGIN_LINK" />cài đặt hiện tại<ph name="END_LINK" /></translation> +<translation id="2128103434102193461">Để biết thông tin chi tiết về Chrome OS, vui lòng xem phần <ph name="LINK_BEGIN" /> + Giới thiệu về Chrome OS<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">Vui lòng khởi động lại Chrome ngay bây giờ</translation> <translation id="216054706567564023">Cài đặt Chrome trên điện thoại của bạn. Chúng tôi sẽ gửi SMS tới số điện thoại khôi phục tài khoản của bạn.</translation> <translation id="2246246234298806438">Google Chrome không thể hiển thị xem trước bản in khi thiếu trình xem PDF được cài sẵn.</translation> <translation id="2252923619938421629">Giúp cải thiện Google Chrome bằng cách báo cáo cài đặt hiện tại</translation> @@ -223,6 +226,7 @@ <translation id="7589360514048265910">Máy tính này sẽ không còn nhận được bản cập nhật của Google Chrome do hệ điều hành Mac OS X 10.9 không được hỗ trợ nữa.</translation> <translation id="7592736734348559088">Google Chrome không thể đồng bộ hóa dữ liệu của bạn vì chi tiết đăng nhập tài khoản của bạn đã cũ.</translation> <translation id="7626032353295482388">Chào mừng bạn đến với Chrome</translation> +<translation id="7629695634924605473">Chrome cho bạn biết mật khẩu của bạn có bị đánh cắp hay không</translation> <translation id="7641148173327520642">Quản trị viên hệ thống đã định cấu hình Google Chrome để mở <ph name="ALTERNATIVE_BROWSER_NAME" /> khi truy cập vào <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="7651907282515937834">Biểu trưng Chrome Enterprise</translation> <translation id="7747138024166251722">Trình cài đặt không thể tạo thư mục tạm thời. Vui lòng kiểm tra dung lượng ổ đĩa còn trống và quyền cài đặt phần mềm.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 4d7f24b..e68a2c65 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -51,6 +51,9 @@ <translation id="2094919256425865063">仍要退出 Chrome?</translation> <translation id="2120620239521071941">这会从这台设备上删除 <ph name="ITEMS_COUNT" /> 项内容。如果日后想要检索您的数据,届时请以 <ph name="USER_EMAIL" /> 的身份登录 Chrome。</translation> <translation id="2123055963409958220">报告<ph name="BEGIN_LINK" />当前设置<ph name="END_LINK" />,协助我们改进 Chrome</translation> +<translation id="2128103434102193461">如需详细了解 Chrome 操作系统,请参阅<ph name="LINK_BEGIN" /> + Chrome 操作系统简介<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">请立即重启 Chrome</translation> <translation id="216054706567564023">请在您的手机上安装 Chrome。我们会将一条短信发送到您帐号的辅助电话号码。</translation> <translation id="2246246234298806438">在缺少内置 PDF 查看器的情况下,Google Chrome 浏览器无法显示打印预览。</translation> <translation id="2252923619938421629">报告当前设置,帮助我们改进 Google Chrome</translation> @@ -219,6 +222,7 @@ <translation id="7589360514048265910">此计算机将不会再收到 Google Chrome 更新,因为 Mac OS X 10.9 不再受支持。</translation> <translation id="7592736734348559088">由于您的帐号登录详细信息已过期,Google Chrome无法同步您的数据。</translation> <translation id="7626032353295482388">欢迎使用 Chrome</translation> +<translation id="7629695634924605473">Chrome 会让您知道您的密码是否曾被泄露</translation> <translation id="7641148173327520642">您的系统管理员已将 Google Chrome 配置为使用<ph name="ALTERNATIVE_BROWSER_NAME" />访问 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="7651907282515937834">Chrome 企业版徽标</translation> <translation id="7747138024166251722">安装程序无法创建临时目录。请检查您是否有足够的磁盘空间和权限来安装该软件。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index ed8ca4f..c0ee06d5 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -51,6 +51,9 @@ <translation id="2094919256425865063">確定要關閉 Chrome 嗎?</translation> <translation id="2120620239521071941">登出後,系統會將 <ph name="ITEMS_COUNT" /> 個項目從這個裝置上刪除。日後如要重新取得你的資料,請以 <ph name="USER_EMAIL" /> 身分登入 Chrome。</translation> <translation id="2123055963409958220">只要回報<ph name="BEGIN_LINK" />目前的設定<ph name="END_LINK" />,就能助我們一臂之力,讓 Chrome 更臻完美</translation> +<translation id="2128103434102193461">如需 Chrome 作業系統的詳細資料,請參閱<ph name="LINK_BEGIN" /> + 關於 Chrome 作業系統<ph name="LINK_END" /></translation> +<translation id="2151406531797534936">請立即重新啟動 Chrome</translation> <translation id="216054706567564023">在手機上安裝 Chrome。我們會傳送簡訊到你的帳戶備援電話號碼。</translation> <translation id="2246246234298806438">缺乏內建的 PDF 檢視器時,Google Chrome 無法顯示列印預覽。</translation> <translation id="2252923619938421629">只要回報目前的設定,就能助我們一臂之力,讓 Google Chrome 更臻完美</translation> @@ -221,6 +224,7 @@ <translation id="7589360514048265910">我們已不支援 Mac OS X 10.9,因此這部電腦不會再收到 Google Chrome 更新。</translation> <translation id="7592736734348559088">你的帳戶登入詳細資料尚未更新,因此 Google Chrome 無法同步處理你的資料。</translation> <translation id="7626032353295482388">歡迎使用 Chrome</translation> +<translation id="7629695634924605473">Chrome 會通知你密碼是否曾遭到盜用</translation> <translation id="7641148173327520642">你的系統管理員已設定由 Google Chrome 開啟 <ph name="ALTERNATIVE_BROWSER_NAME" /> 以存取 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="7651907282515937834">Chrome Enterprise 標誌</translation> <translation id="7747138024166251722">安裝程式無法建立暫時目錄,請檢查可用磁碟空間與權限,以順利安裝軟體。</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 1bc87f3..2aaedda5 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1221,13 +1221,18 @@ const FeatureEntry::FeatureParam kStartSurfaceAndroid_Toolbar[] = { {"start_surface_variation", "toolbar"}}; +const FeatureEntry::FeatureParam kStartSurfaceAndroid_TasksOnly[] = { + {"start_surface_variation", "tasksonly"}}; + const FeatureEntry::FeatureVariation kStartSurfaceAndroidVariations[] = { {"Single Surface", kStartSurfaceAndroid_SingleSurface, base::size(kStartSurfaceAndroid_SingleSurface), nullptr}, {"Two Panes Surface", kStartSurfaceAndroid_TwoPanesSurface, base::size(kStartSurfaceAndroid_TwoPanesSurface), nullptr}, {"Start Surface Toolbar", kStartSurfaceAndroid_Toolbar, - base::size(kStartSurfaceAndroid_Toolbar), nullptr}}; + base::size(kStartSurfaceAndroid_Toolbar), nullptr}, + {"Tasks Only", kStartSurfaceAndroid_TasksOnly, + base::size(kStartSurfaceAndroid_TasksOnly), nullptr}}; #endif // OS_ANDROID #if defined(OS_ANDROID) @@ -1696,6 +1701,10 @@ {"shelf-scrollable", flag_descriptions::kShelfScrollableName, flag_descriptions::kShelfScrollableDescription, kOsCrOS, SINGLE_VALUE_TYPE(chromeos::switches::kShelfScrollable)}, + {"show-bluetooth-debug-log-toggle", + flag_descriptions::kShowBluetoothDebugLogToggleName, + flag_descriptions::kShowBluetoothDebugLogToggleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kShowBluetoothDebugLogToggle)}, {"show-bluetooth-device-battery", flag_descriptions::kShowBluetoothDeviceBatteryName, flag_descriptions::kShowBluetoothDeviceBatteryDescription, kOsCrOS, @@ -4437,6 +4446,15 @@ flag_descriptions::kBundledHTTPExchangesDescription, kOsAll, FEATURE_VALUE_TYPE(features::kBundledHTTPExchanges)}, +#if defined(OS_ANDROID) + {"darken-websites-checkbox-in-themes-setting", + flag_descriptions::kDarkenWebsitesCheckboxInThemesSettingName, + flag_descriptions::kDarkenWebsitesCheckboxInThemesSettingDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kDarkenWebsitesCheckboxInThemesSetting)}, +#endif // defined(OS_ANDROID) + #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) {"profile-menu-revamp", flag_descriptions::kProfileMenuRevampName, flag_descriptions::kProfileMenuRevampDescription,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index d058fc8..422e73d 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -113,6 +113,7 @@ &kCCTTargetTranslateLanguage, &kChromeDuetFeature, &kChromeDuetAdaptive, + &kDarkenWebsitesCheckboxInThemesSetting, &kDontAutoHideBrowserControls, &kChromeDuetLabeled, &kChromeSmartSelection, @@ -386,6 +387,9 @@ const base::Feature kContextualSearchTranslationModel{ "ContextualSearchTranslationModel", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kDarkenWebsitesCheckboxInThemesSetting{ + "DarkenWebsitesCheckboxInThemesSetting", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kDirectActions{"DirectActions", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 994c736..dfed0f4 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -59,6 +59,7 @@ extern const base::Feature kContextualSearchSimplifiedServer; extern const base::Feature kContextualSearchTapDisableOverride; extern const base::Feature kContextualSearchTranslationModel; +extern const base::Feature kDarkenWebsitesCheckboxInThemesSetting; extern const base::Feature kDirectActions; extern const base::Feature kDontPrefetchLibraries; extern const base::Feature kDownloadAutoResumptionThrottling;
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc index e50c1af..e016333 100644 --- a/chrome/browser/android/preferences/pref_service_bridge.cc +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -1395,3 +1395,10 @@ DCHECK_LT(pref_index, Pref::PREF_NUM_PREFS); return kPrefsExposedToJava[pref_index]; } + +static void JNI_PrefServiceBridge_SetForceWebContentsDarkModeEnabled( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + jboolean enabled) { + GetPrefService()->SetBoolean(prefs::kWebKitForceDarkModeEnabled, enabled); +}
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h index 9051f82..7299154 100644 --- a/chrome/browser/android/resource_id.h +++ b/chrome/browser/android/resource_id.h
@@ -55,10 +55,10 @@ R.drawable.infobar_chrome) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_PROTECTED_MEDIA_IDENTIFIER, R.drawable.infobar_protected_media_identifier) +DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_SAFETYTIP_SHIELD, + R.drawable.safetytip_shield) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_SAVE_PASSWORD, R.drawable.ic_vpn_key_blue) -DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_TIP, - R.drawable.ic_lightbulb_outline_googblue_24dp) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_TRANSLATE, R.drawable.infobar_translate) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_WARNING, R.drawable.infobar_warning) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_PHONE_ICON,
diff --git a/chrome/browser/apps/app_service/arc_apps.cc b/chrome/browser/apps/app_service/arc_apps.cc index be844b1..35d60f1 100644 --- a/chrome/browser/apps/app_service/arc_apps.cc +++ b/chrome/browser/apps/app_service/arc_apps.cc
@@ -244,6 +244,9 @@ case apps::mojom::LaunchSource::kFromParentalControls: uit = arc::UserInteractionType::APP_STARTED_FROM_SETTINGS; break; + case apps::mojom::LaunchSource::kFromShelf: + uit = arc::UserInteractionType::APP_STARTED_FROM_SHELF; + break; } arc::LaunchApp(profile_, app_id, event_flags, uit, display_id);
diff --git a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc index 1fe0480d..79afc3a 100644 --- a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc +++ b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
@@ -157,6 +157,7 @@ switch (launch_source) { case apps::mojom::LaunchSource::kUnknown: case apps::mojom::LaunchSource::kFromParentalControls: + case apps::mojom::LaunchSource::kFromShelf: break; case apps::mojom::LaunchSource::kFromAppListGrid: case apps::mojom::LaunchSource::kFromAppListGridContextMenu:
diff --git a/chrome/browser/apps/app_service/extension_apps.cc b/chrome/browser/apps/app_service/extension_apps.cc index df358ac3..8672e75 100644 --- a/chrome/browser/apps/app_service/extension_apps.cc +++ b/chrome/browser/apps/app_service/extension_apps.cc
@@ -94,6 +94,8 @@ case apps::mojom::LaunchSource::kFromAppListQueryContextMenu: case apps::mojom::LaunchSource::kFromAppListRecommendation: return ash::LAUNCH_FROM_APP_LIST_SEARCH; + case apps::mojom::LaunchSource::kFromShelf: + return ash::LAUNCH_FROM_SHELF; } } @@ -255,6 +257,7 @@ extensions::RecordAppListSearchLaunch(extension); break; case apps::mojom::LaunchSource::kFromAppListRecommendation: + case apps::mojom::LaunchSource::kFromShelf: break; }
diff --git a/chrome/browser/apps/app_service/launch_util.cc b/chrome/browser/apps/app_service/launch_util.cc index a55ee1e..c373cc4 100644 --- a/chrome/browser/apps/app_service/launch_util.cc +++ b/chrome/browser/apps/app_service/launch_util.cc
@@ -22,6 +22,8 @@ case apps::mojom::LaunchSource::kFromAppListQueryContextMenu: case apps::mojom::LaunchSource::kFromAppListRecommendation: return ash::LAUNCH_FROM_APP_LIST_SEARCH; + case apps::mojom::LaunchSource::kFromShelf: + return ash::LAUNCH_FROM_SHELF; } }
diff --git a/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc b/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc index ad5edf9..0a8fc6ff 100644 --- a/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc +++ b/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc
@@ -15,6 +15,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" +#include "build/build_config.h" #include "chrome/browser/autofill/mock_address_accessory_controller.h" #include "chrome/browser/autofill/mock_credit_card_accessory_controller.h" #include "chrome/browser/autofill/mock_manual_filling_view.h" @@ -28,6 +29,9 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +// TODO(crbug/1004585) Crashes on Android +#if !defined(OS_ANDROID) + namespace { using autofill::AccessoryAction; using autofill::AccessorySheetData; @@ -345,3 +349,5 @@ base::RunLoop().RunUntilIdle(); } + +#endif // !defined(OS_ANDROID)
diff --git a/chrome/browser/banners/app_banner_manager.cc b/chrome/browser/banners/app_banner_manager.cc index 793cea1f..735fb1b 100644 --- a/chrome/browser/banners/app_banner_manager.cc +++ b/chrome/browser/banners/app_banner_manager.cc
@@ -436,10 +436,13 @@ } void AppBannerManager::ResetCurrentPageData() { + load_finished_ = false; + has_sufficient_engagement_ = false; active_media_players_.clear(); manifest_ = blink::Manifest(); manifest_url_ = GURL(); validated_url_ = GURL(); + UpdateState(State::INACTIVE); SetInstallableWebAppCheckResult(InstallableWebAppCheckResult::kUnknown); } @@ -546,22 +549,14 @@ state_ = state; } -void AppBannerManager::DidStartNavigation(content::NavigationHandle* handle) { - if (!handle->IsInMainFrame() || handle->IsSameDocument()) +void AppBannerManager::DidFinishNavigation(content::NavigationHandle* handle) { + if (!handle->IsInMainFrame() || !handle->HasCommitted() || + handle->IsSameDocument()) { return; - + } if (state_ != State::COMPLETE && state_ != State::INACTIVE) Terminate(); - UpdateState(State::INACTIVE); - load_finished_ = false; - has_sufficient_engagement_ = false; -} - -void AppBannerManager::DidFinishNavigation(content::NavigationHandle* handle) { - if (handle->IsInMainFrame() && handle->HasCommitted() && - !handle->IsSameDocument()) { - ResetCurrentPageData(); - } + ResetCurrentPageData(); } void AppBannerManager::DidFinishLoad(
diff --git a/chrome/browser/banners/app_banner_manager.h b/chrome/browser/banners/app_banner_manager.h index b17aa4c7..9e9a3ad 100644 --- a/chrome/browser/banners/app_banner_manager.h +++ b/chrome/browser/banners/app_banner_manager.h
@@ -284,7 +284,6 @@ virtual void UpdateState(State state); // content::WebContentsObserver overrides. - void DidStartNavigation(content::NavigationHandle* handle) override; void DidFinishNavigation(content::NavigationHandle* handle) override; void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) override;
diff --git a/chrome/browser/browser_switcher/browser_switcher_service.cc b/chrome/browser/browser_switcher/browser_switcher_service.cc index ce4f938..7a0ffaf0 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service.cc +++ b/chrome/browser/browser_switcher/browser_switcher_service.cc
@@ -38,38 +38,41 @@ // How many times to re-try fetching the XML file for the sitelist. const int kFetchNumRetries = 1; -// TODO(nicolaso): Add chrome_policy for this annotation once the policy is -// implemented. constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("browser_switcher_ieem_sitelist", R"( semantics { - sender: "Browser Switcher" + sender: "Legacy Browser Support " description: - "BrowserSwitcher may download Internet Explorer's Enterprise Mode " - "SiteList XML, to load the list of URLs to open in an alternative " - "browser. This is often on the organization's intranet.For more " - "information on Internet Explorer's Enterprise Mode, see: " + "Legacy Browser Support may download Internet Explorer's " + "Enterprise Mode SiteList XML, to load the list of URLs to open in " + "an alternative browser. This is often on the organization's " + "intranet. For more information on Internet Explorer's Enterprise " + "Mode, see: " "https://docs.microsoft.com/internet-explorer/ie11-deploy-guide" "/what-is-enterprise-mode" trigger: - "This happens only once per profile, 60s after the first page " - "starts loading. The request may be retried once if it failed the " - "first time." + "1 minute after browser startup, and then refreshes every 30 " + "minutes afterwards. Only happens if Legacy Browser Support is " + "enabled via enterprise policies." data: - "Up to 2 (plus retries) HTTP or HTTPS GET requests to the URLs " + "Up to 3 (plus retries) HTTP or HTTPS GET requests to the URLs " "configured in Internet Explorer's SiteList policy, and Chrome's " - "BrowserSwitcherExternalSitelistUrl policy." + "BrowserSwitcherExternalSitelistUrl and " + "BrowserSwitcherExternalGreylistUrl policies." destination: OTHER destination_other: - "URL configured in Internet Explorer's SiteList policy, and URL " - "configured in Chrome's BrowserSwitcherExternalSitelistUrl policy. " + "URL configured in Internet Explorer's SiteList policy, and URLs " + "configured in Chrome's BrowserSwitcherExternalSitelistUrl and " + "BrowserSwitcherExternalGreylistUrl policies." } policy { cookies_allowed: NO setting: "This feature cannot be disabled by settings." - policy_exception_justification: - "This feature still in development, and is disabled by default. " - "It needs to be enabled through policies." + chrome_policy: { + BrowserSwitcherEnabled: { + BrowserSwitcherEnabled: false + } + } })"); } // namespace
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc index 23e769cc..eabfad92 100644 --- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "base/memory/singleton.h" +#include "base/metrics/histogram_functions.h" #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_throttle_observer.h" #include "components/arc/arc_browser_context_keyed_service_factory_base.h" @@ -25,6 +26,14 @@ SetArcCpuRestriction(restrict); } + void RecordCpuRestrictionDisabledUMA(const std::string& observer_name, + base::TimeDelta delta) override { + DVLOG(2) << "ARC throttling was disabled for " + << delta.InMillisecondsRoundedUp() + << " ms due to: " << observer_name; + UmaHistogramLongTimes("Arc.CpuRestrictionDisabled." + observer_name, delta); + } + private: DISALLOW_COPY_AND_ASSIGN(DefaultDelegateImpl); }; @@ -85,16 +94,33 @@ void ArcInstanceThrottle::OnObserverStateChanged() { ArcThrottleObserver::PriorityLevel max_level = ArcThrottleObserver::PriorityLevel::LOW; + ArcThrottleObserver* effective_observer = nullptr; std::string active_observers; + for (auto* observer : GetAllObservers()) { if (!observer->active()) continue; active_observers += (" " + observer->GetDebugDescription()); - if (max_level < observer->level()) + if (observer->level() >= max_level) { max_level = observer->level(); + effective_observer = observer; + } } - if (!active_observers.empty()) - VLOG(1) << "Active Throttle Observers: " << active_observers; + + DVLOG_IF(1, !active_observers.empty()) + << "Active Throttle Observers: " << active_observers; + + if (effective_observer != last_effective_observer_) { + // If there is a new effective observer, record the duration that the last + // effective observer was active. + if (last_effective_observer_) + delegate_->RecordCpuRestrictionDisabledUMA( + last_effective_observer_->name(), + base::TimeTicks::Now() - last_throttle_transition_); + last_throttle_transition_ = base::TimeTicks::Now(); + last_effective_observer_ = effective_observer; + } + ThrottleInstance(max_level); }
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h index e31cebf..c1cc998 100644 --- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/time/time.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_active_window_throttle_observer.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_throttle_observer.h" @@ -34,6 +35,9 @@ virtual ~Delegate() = default; virtual void SetCpuRestriction(bool) = 0; + virtual void RecordCpuRestrictionDisabledUMA( + const std::string& observer_name, + base::TimeDelta delta) = 0; private: DISALLOW_COPY_AND_ASSIGN(Delegate); @@ -73,6 +77,8 @@ std::unique_ptr<Delegate> delegate_; ArcThrottleObserver::PriorityLevel level_{ ArcThrottleObserver::PriorityLevel::UNKNOWN}; + ArcThrottleObserver* last_effective_observer_ = nullptr; + base::TimeTicks last_throttle_transition_; // Throttle Observers ArcActiveWindowThrottleObserver active_window_throttle_observer_;
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc index abc853e4..4f91a2038 100644 --- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
@@ -36,7 +36,8 @@ base::BindRepeating(FakeArcSession::Create)))), testing_profile_(std::make_unique<TestingProfile>()), disable_cpu_restriction_counter_(0), - enable_cpu_restriction_counter_(0) { + enable_cpu_restriction_counter_(0), + record_uma_counter_(0) { SetArcAvailableCommandLineForTesting( base::CommandLine::ForCurrentProcess()); @@ -68,6 +69,10 @@ ArcThrottleObserver* critical_observer() { return &critical_observer_; } ArcThrottleObserver* low_observer() { return &low_observer_; } + const std::string& last_recorded_observer_name() const { + return last_recorded_observer_name_; + } + size_t uma_count() const { return record_uma_counter_; } private: class TestDelegateImpl : public ArcInstanceThrottle::Delegate { @@ -80,6 +85,11 @@ else ++(test_->enable_cpu_restriction_counter_); } + void RecordCpuRestrictionDisabledUMA(const std::string& observer_name, + base::TimeDelta delta) override { + ++(test_->record_uma_counter_); + test_->last_recorded_observer_name_ = observer_name; + } private: ArcInstanceThrottleTest* test_; @@ -96,6 +106,8 @@ ArcThrottleObserver::PriorityLevel::CRITICAL, "CriticalObserver"}; ArcThrottleObserver low_observer_{ArcThrottleObserver::PriorityLevel::LOW, "LowObserver"}; + std::string last_recorded_observer_name_; + size_t record_uma_counter_; DISALLOW_COPY_AND_ASSIGN(ArcInstanceThrottleTest); }; @@ -134,4 +146,41 @@ arc_instance_throttle()->SetObserversForTesting({}); } +// Tests that ArcInstanceThrottle records the duration that the effective +// observer is active. +TEST_F(ArcInstanceThrottleTest, RecordCpuRestrictionDisabledUMA) { + std::vector<ArcThrottleObserver*> observers = {critical_observer(), + low_observer()}; + arc_instance_throttle()->SetObserversForTesting(observers); + EXPECT_EQ(0U, uma_count()); + + // The effective observer transitions from null to critical_observer; no UMA + // is recorded yet. + critical_observer()->SetActive(true); + EXPECT_EQ(0U, uma_count()); + low_observer()->SetActive(true); + EXPECT_EQ(0U, uma_count()); + + // The effective observer transitions from critical_observer to low_observer; + // UMA should be recorded for critical_observer. + critical_observer()->SetActive(false); + EXPECT_EQ(1U, uma_count()); + EXPECT_EQ(critical_observer()->name(), last_recorded_observer_name()); + + // Effective observer transitions from low_observer to critical_observer; UMA + // should be recorded for low_observer. + critical_observer()->SetActive(true); + EXPECT_EQ(2U, uma_count()); + EXPECT_EQ(low_observer()->name(), last_recorded_observer_name()); + + // Effective observer transitions from critical_observer to null; UMA should + // be recorded for critical_observer. + low_observer()->SetActive(false); + critical_observer()->SetActive(false); + EXPECT_EQ(3U, uma_count()); + EXPECT_EQ(critical_observer()->name(), last_recorded_observer_name()); + + arc_instance_throttle()->SetObserversForTesting({}); +} + } // namespace arc
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc index 705d0b71..e1715b9 100644 --- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc +++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc
@@ -178,8 +178,10 @@ // Initial settings applied in case intent helper instance is set before // provisioning. + +// TODO(crbug.com/1004630) Disabled due to flake. TEST_F(ArcSettingsServiceTest, - InitialSettingsAppliedForInstanceBeforeProvisioning) { + DISABLED_InitialSettingsAppliedForInstanceBeforeProvisioning) { arc_session_manager()->RequestEnable(); arc_session_manager()->OnTermsOfServiceNegotiatedForTesting(true); arc_session_manager()->StartArcForTesting();
diff --git a/chrome/browser/chromeos/arc/print_spooler/print_session_impl.cc b/chrome/browser/chromeos/arc/print_spooler/print_session_impl.cc index 3cebc4d..3ee3469 100644 --- a/chrome/browser/chromeos/arc/print_spooler/print_session_impl.cc +++ b/chrome/browser/chromeos/arc/print_spooler/print_session_impl.cc
@@ -25,15 +25,15 @@ namespace arc { // static -arc::mojom::PrintSessionHostPtr PrintSessionImpl::Create( +mojom::PrintSessionHostPtr PrintSessionImpl::Create( std::unique_ptr<content::WebContents> web_contents, std::unique_ptr<ash::ArcCustomTab> custom_tab, - arc::mojom::PrintSessionInstancePtr instance) { + mojom::PrintSessionInstancePtr instance) { if (!custom_tab || !instance) return nullptr; // This object will be deleted when the mojo connection is closed. - arc::mojom::PrintSessionHostPtr ptr; + mojom::PrintSessionHostPtr ptr; new PrintSessionImpl(std::move(web_contents), std::move(custom_tab), std::move(instance), mojo::MakeRequest(&ptr)); return ptr; @@ -42,13 +42,14 @@ PrintSessionImpl::PrintSessionImpl( std::unique_ptr<content::WebContents> web_contents, std::unique_ptr<ash::ArcCustomTab> custom_tab, - arc::mojom::PrintSessionInstancePtr instance, - arc::mojom::PrintSessionHostRequest request) + mojom::PrintSessionInstancePtr instance, + mojom::PrintSessionHostRequest request) : ArcCustomTabModalDialogHost(std::move(custom_tab), std::move(web_contents)), - binding_(this, std::move(request)), - instance_(std::move(instance)) { - binding_.set_connection_error_handler( + instance_(std::move(instance)), + print_renderer_binding_(this), + session_binding_(this, std::move(request)) { + session_binding_.set_connection_error_handler( base::BindOnce(&PrintSessionImpl::Close, weak_ptr_factory_.GetWeakPtr())); web_contents_->SetUserData(UserDataKey(), base::WrapUnique(this)); @@ -86,7 +87,10 @@ } void PrintSessionImpl::StartPrintAfterDelay() { - printing::StartPrint(web_contents_.get(), false, false); + printing::mojom::PrintRendererAssociatedPtrInfo print_renderer_ptr_info; + print_renderer_binding_.Bind(mojo::MakeRequest(&print_renderer_ptr_info)); + printing::StartPrint(web_contents_.get(), std::move(print_renderer_ptr_info), + false, false); } WEB_CONTENTS_USER_DATA_KEY_IMPL(PrintSessionImpl)
diff --git a/chrome/browser/chromeos/arc/print_spooler/print_session_impl.h b/chrome/browser/chromeos/arc/print_spooler/print_session_impl.h index 9c6a5a3c..74f7cdf 100644 --- a/chrome/browser/chromeos/arc/print_spooler/print_session_impl.h +++ b/chrome/browser/chromeos/arc/print_spooler/print_session_impl.h
@@ -13,6 +13,7 @@ #include "components/arc/mojom/print_spooler.mojom.h" #include "components/printing/common/print.mojom.h" #include "content/public/browser/web_contents_user_data.h" +#include "mojo/public/cpp/bindings/associated_binding.h" #include "mojo/public/cpp/bindings/binding.h" namespace ash { @@ -27,15 +28,15 @@ // Implementation of PrintSessionHost interface. Also used by other classes to // send print-related messages to ARC. -class PrintSessionImpl : public arc::mojom::PrintSessionHost, +class PrintSessionImpl : public mojom::PrintSessionHost, public ArcCustomTabModalDialogHost, public content::WebContentsUserData<PrintSessionImpl>, public printing::mojom::PrintRenderer { public: - static arc::mojom::PrintSessionHostPtr Create( + static mojom::PrintSessionHostPtr Create( std::unique_ptr<content::WebContents> web_contents, std::unique_ptr<ash::ArcCustomTab> custom_tab, - arc::mojom::PrintSessionInstancePtr instance); + mojom::PrintSessionInstancePtr instance); ~PrintSessionImpl() override; @@ -45,8 +46,8 @@ private: PrintSessionImpl(std::unique_ptr<content::WebContents> web_contents, std::unique_ptr<ash::ArcCustomTab> custom_tab, - arc::mojom::PrintSessionInstancePtr instance, - arc::mojom::PrintSessionHostRequest request); + mojom::PrintSessionInstancePtr instance, + mojom::PrintSessionHostRequest request); friend class content::WebContentsUserData<PrintSessionImpl>; // Used to close the ARC Custom Tab used for printing. If the remote end @@ -57,12 +58,16 @@ // Opens Chrome print preview after waiting for the PDF plugin to load. void StartPrintAfterDelay(); + // Used to send messages to ARC and request a new print document. + mojom::PrintSessionInstancePtr instance_; + + // Binding for PrintRenderer. + mojo::AssociatedBinding<printing::mojom::PrintRenderer> + print_renderer_binding_; + // Used to bind the PrintSessionHost interface implementation to a message // pipe. - mojo::Binding<arc::mojom::PrintSessionHost> binding_; - - // Used to send messages to ARC and request a new print document. - arc::mojom::PrintSessionInstancePtr instance_; + mojo::Binding<mojom::PrintSessionHost> session_binding_; WEB_CONTENTS_USER_DATA_KEY_DECL();
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index bb2a546..8e0f1d6 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -1128,12 +1128,10 @@ request.set_container_name(std::move(container_name)); request.set_owner_id(owner_id_); request.set_async(true); - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - if (auto* integration_service = - drive::DriveIntegrationServiceFactory::GetForProfile(profile_)) { - request.set_drivefs_mount_path( - integration_service->GetMountPointPath().value()); - } + if (auto* integration_service = + drive::DriveIntegrationServiceFactory::GetForProfile(profile_)) { + request.set_drivefs_mount_path( + integration_service->GetMountPointPath().value()); } GetCiceroneClient()->StartLxdContainer( std::move(request),
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.cc b/chrome/browser/chromeos/drive/drive_integration_service.cc index 9e101ff..9ee4fc11 100644 --- a/chrome/browser/chromeos/drive/drive_integration_service.cc +++ b/chrome/browser/chromeos/drive/drive_integration_service.cc
@@ -654,12 +654,10 @@ cache_root_directory_(!test_cache_root.empty() ? test_cache_root : util::GetCacheRootPath(profile)), - drivefs_holder_(base::FeatureList::IsEnabled(chromeos::features::kDriveFs) - ? std::make_unique<DriveFsHolder>( - profile_, - this, - std::move(test_drivefs_mojo_listener_factory)) - : nullptr), + drivefs_holder_(std::make_unique<DriveFsHolder>( + profile_, + this, + std::move(test_drivefs_mojo_listener_factory))), preference_watcher_(preference_watcher), power_manager_observer_(this) { DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 19cb639..acc6d52 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1661,17 +1661,11 @@ if (!err_msg.empty()) return RespondNow(Error(err_msg)); - // There are three possible states for the voice interaction: // |NOT_READY| means service not running; - // |STOPPED| means service running but UI not shown; - // |RUNNING| means service running with UI shown on screen. - // When enabling Assistant, either |STOPPED| or |RUNNING| state could be - // possible depending on whether the UI has been brought up. - auto current_state = ash::AssistantState::Get()->assistant_state(); - const bool not_ready = - (current_state == ash::mojom::AssistantState::NOT_READY); - const bool success = (params->enabled != not_ready); - if (success) + // |STOPPED| means service running; + auto new_state = params->enabled ? ash::mojom::AssistantState::READY + : ash::mojom::AssistantState::NOT_READY; + if (ash::AssistantState::Get()->assistant_state() == new_state) return RespondNow(NoArguments()); // Assistant service has not responded yet, set up a delayed timer to wait for
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc index d750f837..8a68b6a99 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -573,21 +573,7 @@ if (!volume.get()) return RespondNow(Error("Volume not found")); - if (volume->type() == file_manager::VOLUME_TYPE_GOOGLE_DRIVE && - !base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - drive::FileSystemInterface* file_system = - drive::util::GetFileSystemByProfile(chrome_details.GetProfile()); - if (!file_system) { - // |file_system| is NULL if Drive is disabled. - // If stats couldn't be gotten for drive, result should be left - // undefined. See comments in GetDriveAvailableSpaceCallback(). - return RespondNow(NoArguments()); - } - - file_system->GetAvailableSpace(base::BindOnce( - &FileManagerPrivateGetSizeStatsFunction::OnGetDriveAvailableSpace, - this)); - } else if (volume->type() == file_manager::VOLUME_TYPE_MTP) { + if (volume->type() == file_manager::VOLUME_TYPE_MTP) { // Resolve storage_name. storage_monitor::StorageMonitor* storage_monitor = storage_monitor::StorageMonitor::GetInstance();
diff --git a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc index 6d305d4..087994c9a 100644 --- a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc +++ b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
@@ -102,12 +102,7 @@ const base::FilePath::StringType& default_extension, gfx::NativeWindow owning_window, void* params) override { - listener_->FileSelected( - (base::FeatureList::IsEnabled(chromeos::features::kDriveFs) - ? drivefs_root_ - : base::FilePath("/special/drive-user")) - .Append("root/test_dir"), - 0, nullptr); + listener_->FileSelected(drivefs_root_.Append("root/test_dir"), 0, nullptr); } bool IsRunning(gfx::NativeWindow owning_window) const override { @@ -657,30 +652,6 @@ drivefs_helper->CreateFakeDriveFsListenerFactory()); } - void AddTestHostedDocuments() { - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - return; - } - const char kResourceId[] = "unique-id-for-multiprofile-copy-test"; - drive::FakeDriveService* const main_service = - static_cast<drive::FakeDriveService*>( - drive::util::GetDriveServiceByProfile(profile())); - drive::FakeDriveService* const sub_service = - static_cast<drive::FakeDriveService*>( - drive::util::GetDriveServiceByProfile(second_profile_)); - - // Place a hosted document under root/test_dir of the sub profile. - sub_service->AddNewFileWithResourceId( - kResourceId, "application/vnd.google-apps.document", "", "test_dir", - "hosted_doc", true, base::Bind(&IgnoreDriveEntryResult)); - - // Place the hosted document with no parent in the main profile, for - // simulating the situation that the document is shared to the main profile. - main_service->AddNewFileWithResourceId( - kResourceId, "application/vnd.google-apps.document", "", "", - "hosted_doc", true, base::Bind(&IgnoreDriveEntryResult)); - } - base::ScopedTempDir tmp_dir_; DriveIntegrationServiceFactory::FactoryCallback create_drive_integration_service_; @@ -898,7 +869,6 @@ IN_PROC_BROWSER_TEST_F(MultiProfileDriveFileSystemExtensionApiTest, CrossProfileCopy) { - AddTestHostedDocuments(); EXPECT_TRUE(RunFileSystemExtensionApiTest( "file_browser/multi_profile_copy", FILE_PATH_LITERAL("manifest.json"),
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index e99e1982..9afd6f3 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -2357,19 +2357,14 @@ drive::DriveIntegrationService* FileManagerBrowserTestBase::CreateDriveIntegrationService(Profile* profile) { - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - drive_volumes_[profile->GetOriginalProfile()] = - std::make_unique<DriveFsTestVolume>(profile->GetOriginalProfile()); - if (!IsIncognitoModeTest() && !DoesTestStartWithNoVolumesMounted() && - profile->GetPath().BaseName().value() == "user") { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(base::IgnoreResult(&LocalTestVolume::Mount), - base::Unretained(local_volume_.get()), profile)); - } - } else { - drive_volumes_[profile->GetOriginalProfile()] = - std::make_unique<DriveTestVolume>(); + drive_volumes_[profile->GetOriginalProfile()] = + std::make_unique<DriveFsTestVolume>(profile->GetOriginalProfile()); + if (!IsIncognitoModeTest() && !DoesTestStartWithNoVolumesMounted() && + profile->GetPath().BaseName().value() == "user") { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(base::IgnoreResult(&LocalTestVolume::Mount), + base::Unretained(local_volume_.get()), profile)); } if (DoesTestStartWithNoVolumesMounted()) { profile->GetPrefs()->SetBoolean(drive::prefs::kDriveFsPinnedMigrated, true);
diff --git a/chrome/browser/chromeos/file_manager/path_util.cc b/chrome/browser/chromeos/file_manager/path_util.cc index d2cb0a0a..46b024e3 100644 --- a/chrome/browser/chromeos/file_manager/path_util.cc +++ b/chrome/browser/chromeos/file_manager/path_util.cc
@@ -200,8 +200,7 @@ const auto* user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile); auto* integration_service = drive::DriveIntegrationServiceFactory::FindForProfile(profile); - if (!base::FeatureList::IsEnabled(chromeos::features::kDriveFs) || - !integration_service || !integration_service->is_enabled() || !user || + if (!integration_service || !integration_service->is_enabled() || !user || !user->GetAccountId().HasAccountIdKey()) { return false; } @@ -272,8 +271,7 @@ std::string mount_point_name_drive; auto* integration_service = drive::DriveIntegrationServiceFactory::FindForProfile(profile); - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs) && - integration_service) { + if (integration_service) { mount_point_name_drive = integration_service->GetMountPointPath().BaseName().value(); } @@ -375,11 +373,8 @@ bool force_external = false; // Force external URL for DriveFS and Crostini. - drive::DriveIntegrationService* integration_service = nullptr; - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - integration_service = - drive::util::GetIntegrationServiceByProfile(primary_profile); - } + drive::DriveIntegrationService* integration_service = + drive::util::GetIntegrationServiceByProfile(primary_profile); if ((integration_service && integration_service->GetMountPointPath().AppendRelativePath( path, &relative_path)) ||
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc index 9d12e62b..0b87610 100644 --- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -149,85 +149,61 @@ "/media/fuse/crostini_0123456789abcdef_termina_penguin/foo")); EXPECT_EQ("foo", GetPathDisplayTextForSettings(profile_.get(), "/media/removable/foo")); - { - base::test::ScopedFeatureList features; - features.InitAndDisableFeature(chromeos::features::kDriveFs); - drive::DriveIntegrationServiceFactory::GetForProfile(profile_.get()) - ->SetEnabled(true); - EXPECT_EQ("Google Drive \u203a My Drive \u203a foo", - GetPathDisplayTextForSettings( - profile_.get(), "/special/drive-0123456789abcdef/root/foo")); - EXPECT_EQ( - "Google Drive \u203a Shared drives \u203a A Team Drive \u203a foo", - GetPathDisplayTextForSettings( - profile_.get(), - "/special/drive-0123456789abcdef/team_drives/A Team Drive/foo")); - EXPECT_EQ( - "Google Drive \u203a Computers \u203a My Other Computer \u203a bar", - GetPathDisplayTextForSettings( - profile_.get(), - "/special/drive-0123456789abcdef/Computers/My Other Computer/bar")); - } - { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(chromeos::features::kDriveFs); - chromeos::disks::DiskMountManager::InitializeForTesting( - new FakeDiskMountManager); - TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); - chromeos::FakeChromeUserManager user_manager; - user_manager.AddUser( - AccountId::FromUserEmailGaiaId(profile2.GetProfileUserName(), "12345")); - PrefService* prefs = profile2.GetPrefs(); - prefs->SetString(drive::prefs::kDriveFsProfileSalt, "a"); + chromeos::disks::DiskMountManager::InitializeForTesting( + new FakeDiskMountManager); + TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); + chromeos::FakeChromeUserManager user_manager; + user_manager.AddUser( + AccountId::FromUserEmailGaiaId(profile2.GetProfileUserName(), "12345")); + PrefService* prefs = profile2.GetPrefs(); + prefs->SetString(drive::prefs::kDriveFsProfileSalt, "a"); - drive::DriveIntegrationServiceFactory::GetForProfile(&profile2)->SetEnabled( - true); - EXPECT_EQ( - "Google Drive \u203a My Drive \u203a foo", - GetPathDisplayTextForSettings( - &profile2, - "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/root/foo")); - EXPECT_EQ( - "Google Drive \u203a Shared drives \u203a A Team Drive \u203a foo", - GetPathDisplayTextForSettings( - &profile2, - "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" - "team_drives/A Team Drive/foo")); - EXPECT_EQ( - "Google Drive \u203a Computers \u203a My Other Computer \u203a bar", - GetPathDisplayTextForSettings( - &profile2, - "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" - "Computers/My Other Computer/bar")); + drive::DriveIntegrationServiceFactory::GetForProfile(&profile2)->SetEnabled( + true); + EXPECT_EQ( + "Google Drive \u203a My Drive \u203a foo", + GetPathDisplayTextForSettings( + &profile2, + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/root/foo")); + EXPECT_EQ("Google Drive \u203a Shared drives \u203a A Team Drive \u203a foo", + GetPathDisplayTextForSettings( + &profile2, + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" + "team_drives/A Team Drive/foo")); + EXPECT_EQ("Google Drive \u203a Computers \u203a My Other Computer \u203a bar", + GetPathDisplayTextForSettings( + &profile2, + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" + "Computers/My Other Computer/bar")); - EXPECT_EQ("Google Drive \u203a My Drive \u203a foo", - GetPathDisplayTextForSettings( - &profile2, "/special/drive-0123456789abcdef/root/foo")); - EXPECT_EQ( - "Google Drive \u203a Shared drives \u203a A Team Drive \u203a foo", - GetPathDisplayTextForSettings( - &profile2, - "/special/drive-0123456789abcdef/team_drives/A Team Drive/foo")); + EXPECT_EQ("Google Drive \u203a My Drive \u203a foo", + GetPathDisplayTextForSettings( + &profile2, "/special/drive-0123456789abcdef/root/foo")); + EXPECT_EQ( + "Google Drive \u203a Shared drives \u203a A Team Drive \u203a foo", + GetPathDisplayTextForSettings( + &profile2, + "/special/drive-0123456789abcdef/team_drives/A Team Drive/foo")); - EXPECT_EQ( - "Google Drive \u203a Computers \u203a My Other Computer \u203a bar", - GetPathDisplayTextForSettings( - &profile2, - "/special/drive-0123456789abcdef/Computers/My Other Computer/bar")); + EXPECT_EQ( + "Google Drive \u203a Computers \u203a My Other Computer \u203a bar", + GetPathDisplayTextForSettings( + &profile2, + "/special/drive-0123456789abcdef/Computers/My Other Computer/bar")); - TestingProfile guest_profile(base::FilePath("/home/chronos/guest")); - guest_profile.SetGuestSession(true); - guest_profile.set_profile_name("$guest"); - ASSERT_TRUE( - drive::DriveIntegrationServiceFactory::GetForProfile(&guest_profile)); + TestingProfile guest_profile(base::FilePath("/home/chronos/guest")); + guest_profile.SetGuestSession(true); + guest_profile.set_profile_name("$guest"); + ASSERT_TRUE( + drive::DriveIntegrationServiceFactory::GetForProfile(&guest_profile)); - EXPECT_EQ("Downloads", GetPathDisplayTextForSettings( - &guest_profile, "/home/chronos/user/Downloads")); - // Test that a passthrough path doesn't crash on requesting the Drive mount - // path for a guest profile. - EXPECT_EQ("foo", GetPathDisplayTextForSettings(&guest_profile, "foo")); - } + EXPECT_EQ("Downloads", GetPathDisplayTextForSettings( + &guest_profile, "/home/chronos/user/Downloads")); + // Test that a passthrough path doesn't crash on requesting the Drive mount + // path for a guest profile. + EXPECT_EQ("foo", GetPathDisplayTextForSettings(&guest_profile, "foo")); + chromeos::disks::DiskMountManager::Shutdown(); } @@ -331,46 +307,30 @@ base::FilePath my_drive = old_drive.Append("root"); base::FilePath file_in_my_drive = old_drive.Append("root").Append("file.txt"); - // DriveFS disabled, no changes. - base::FilePath result; - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature(chromeos::features::kDriveFs); - drive::DriveIntegrationServiceFactory::GetForProfile(profile_.get()) - ->SetEnabled(true); - EXPECT_FALSE(MigrateToDriveFs(profile_.get(), other, &result)); - EXPECT_FALSE(MigrateToDriveFs(profile_.get(), my_drive, &result)); - } - // DriveFS enabled, migrate paths under old drive mount. - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(chromeos::features::kDriveFs); - TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); - chromeos::FakeChromeUserManager user_manager; - user_manager.AddUser( - AccountId::FromUserEmailGaiaId(profile2.GetProfileUserName(), "12345")); - PrefService* prefs = profile2.GetPrefs(); - prefs->SetString(drive::prefs::kDriveFsProfileSalt, "a"); - drive::DriveIntegrationServiceFactory::GetForProfile(&profile2)->SetEnabled( - true); + // Migrate paths under old drive mount. + TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); + chromeos::FakeChromeUserManager user_manager; + user_manager.AddUser( + AccountId::FromUserEmailGaiaId(profile2.GetProfileUserName(), "12345")); + PrefService* prefs = profile2.GetPrefs(); + prefs->SetString(drive::prefs::kDriveFsProfileSalt, "a"); + drive::DriveIntegrationServiceFactory::GetForProfile(&profile2)->SetEnabled( + true); - EXPECT_FALSE(MigrateToDriveFs(&profile2, other, &result)); - EXPECT_TRUE(MigrateToDriveFs(&profile2, my_drive, &result)); - EXPECT_EQ(base::FilePath( - "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/root"), - result); - EXPECT_TRUE(MigrateToDriveFs(&profile2, file_in_my_drive, &result)); - EXPECT_EQ( - base::FilePath("/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" - "root/file.txt"), - result); - } + base::FilePath result; + EXPECT_FALSE(MigrateToDriveFs(&profile2, other, &result)); + EXPECT_TRUE(MigrateToDriveFs(&profile2, my_drive, &result)); + EXPECT_EQ(base::FilePath( + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/root"), + result); + EXPECT_TRUE(MigrateToDriveFs(&profile2, file_in_my_drive, &result)); + EXPECT_EQ( + base::FilePath("/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" + "root/file.txt"), + result); } TEST_F(FileManagerPathUtilTest, ConvertFileSystemURLToPathInsideCrostini) { - base::test::ScopedFeatureList initial_features; - initial_features.InitAndEnableFeature(chromeos::features::kDriveFs); - storage::ExternalMountPoints* mount_points = storage::ExternalMountPoints::GetSystemInstance(); // Setup for DriveFS. @@ -412,9 +372,6 @@ storage::FileSystemMountOption(), base::FilePath(kRemovableMediaPath)); { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(chromeos::features::kDriveFs); - base::FilePath inside; EXPECT_TRUE(ConvertFileSystemURLToPathInsideCrostini( profile_.get(),
diff --git a/chrome/browser/chromeos/file_manager/url_util.cc b/chrome/browser/chromeos/file_manager/url_util.cc index 37e65f5c..6c4d37c 100644 --- a/chrome/browser/chromeos/file_manager/url_util.cc +++ b/chrome/browser/chromeos/file_manager/url_util.cc
@@ -20,7 +20,6 @@ namespace { const char kAllowedPaths[] = "allowedPaths"; -const char kNativePath[] = "nativePath"; const char kNativeOrDrivePath[] = "nativeOrDrivePath"; const char kAnyPath[] = "anyPath"; const char kAnyPathOrUrl[] = "anyPathOrUrl"; @@ -121,11 +120,6 @@ if (file_types) { switch (file_types->allowed_paths) { case ui::SelectFileDialog::FileTypeInfo::NATIVE_PATH: - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) - arg_value.SetString(kAllowedPaths, kNativeOrDrivePath); - else - arg_value.SetString(kAllowedPaths, kNativePath); - break; case ui::SelectFileDialog::FileTypeInfo::NATIVE_OR_DRIVE_PATH: arg_value.SetString(kAllowedPaths, kNativeOrDrivePath); break; @@ -136,10 +130,8 @@ arg_value.SetString(kAllowedPaths, kAnyPathOrUrl); break; } - } else if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - arg_value.SetString(kAllowedPaths, kNativeOrDrivePath); } else { - arg_value.SetString(kAllowedPaths, kNativePath); + arg_value.SetString(kAllowedPaths, kNativeOrDrivePath); } std::string json_args;
diff --git a/chrome/browser/chromeos/file_manager/url_util_unittest.cc b/chrome/browser/chromeos/file_manager/url_util_unittest.cc index 21cfe4f..8ffbdf6 100644 --- a/chrome/browser/chromeos/file_manager/url_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/url_util_unittest.cc
@@ -59,13 +59,9 @@ EXPECT_TRUE(url.query().find("+") == std::string::npos); EXPECT_TRUE(url.query().find("%20") != std::string::npos); // With DriveFS, Drive is always allowed where native paths are. - std::string allowed_paths = - base::FeatureList::IsEnabled(chromeos::features::kDriveFs) - ? "nativeOrDrivePath" - : "nativePath"; EXPECT_EQ(base::StringPrintf( "{\n" - " \"allowedPaths\": \"%s\",\n" + " \"allowedPaths\": \"nativeOrDrivePath\",\n" " \"currentDirectoryURL\": " "\"filesystem:chrome-extension://abc/Downloads/\",\n" " \"defaultExtension\": \"txt\",\n" @@ -75,8 +71,7 @@ " \"targetName\": \"foo.txt\",\n" " \"title\": \"some title\",\n" " \"type\": \"open-file\"\n" - "}\n", - allowed_paths.c_str()), + "}\n"), PrettyPrintEscapedJson(url.query())); }
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_loader_factory_unittest.cc b/chrome/browser/chromeos/fileapi/external_file_url_loader_factory_unittest.cc index 0a75c91..c21d227 100644 --- a/chrome/browser/chromeos/fileapi/external_file_url_loader_factory_unittest.cc +++ b/chrome/browser/chromeos/fileapi/external_file_url_loader_factory_unittest.cc
@@ -187,26 +187,6 @@ EXPECT_EQ(kExpectedFileContents, response_body); } -TEST_F(ExternalFileURLLoaderFactoryTest, HostedDocument) { - // Hosted documents are never opened via externalfile: URLs with DriveFS. - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - return; - } - // Open a gdoc file. - network::TestURLLoaderClient client; - network::mojom::URLLoaderPtr loader = CreateURLLoaderAndStart( - &client, - CreateRequest("externalfile:drive-test-user-hash/root/Document 1 " - "excludeDir-test.gdoc")); - - client.RunUntilRedirectReceived(); - - // Make sure that a hosted document triggers redirection. - EXPECT_TRUE(client.has_received_redirect()); - EXPECT_TRUE(client.redirect_info().new_url.is_valid()); - EXPECT_TRUE(client.redirect_info().new_url.SchemeIs("https")); -} - TEST_F(ExternalFileURLLoaderFactoryTest, RootDirectory) { network::TestURLLoaderClient client; network::mojom::URLLoaderPtr loader = CreateURLLoaderAndStart(
diff --git a/chrome/browser/chromeos/guest_os/guest_os_share_path.cc b/chrome/browser/chromeos/guest_os/guest_os_share_path.cc index 40da853..1fc261b 100644 --- a/chrome/browser/chromeos/guest_os/guest_os_share_path.cc +++ b/chrome/browser/chromeos/guest_os/guest_os_share_path.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/components/drivefs/mojom/drivefs.mojom.h" -#include "chromeos/constants/chromeos_features.h" #include "chromeos/dbus/concierge/service.pb.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/seneschal_client.h" @@ -211,11 +210,8 @@ vm_tools::seneschal::SharePathRequest request; base::FilePath drivefs_path; base::FilePath relative_path; - drive::DriveIntegrationService* integration_service = nullptr; - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - integration_service = - drive::DriveIntegrationServiceFactory::GetForProfile(profile_); - } + drive::DriveIntegrationService* integration_service = + drive::DriveIntegrationServiceFactory::GetForProfile(profile_); base::FilePath drivefs_mount_point_path; base::FilePath drivefs_mount_name; @@ -225,13 +221,14 @@ file_manager::util::GetMyFilesFolderForProfile(profile_); base::FilePath android_files(file_manager::util::kAndroidFilesPath); base::FilePath removable_media(file_manager::util::kRemovableMediaPath); + base::FilePath linux_files = + file_manager::util::GetCrostiniMountDirectory(profile_); if (my_files == path || my_files.AppendRelativePath(path, &relative_path)) { allowed_path = true; request.set_storage_location( vm_tools::seneschal::SharePathRequest::MY_FILES); request.set_owner_id(crostini::CryptohomeIdForProfile(profile_)); - } else if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs) && - integration_service && + } else if (integration_service && (drivefs_mount_point_path = integration_service->GetMountPointPath()) .AppendRelativePath(path, &drivefs_path) && @@ -287,6 +284,13 @@ allowed_path = true; request.set_storage_location( vm_tools::seneschal::SharePathRequest::REMOVABLE); + } else if (path == linux_files || + linux_files.AppendRelativePath(path, &relative_path)) { + // Allow Linux files and subdirs. + allowed_path = true; + request.set_storage_location( + vm_tools::seneschal::SharePathRequest::LINUX_FILES); + request.set_owner_id(crostini::CryptohomeIdForProfile(profile_)); } if (!allowed_path) {
diff --git a/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc index 515e1bd..58ef53b 100644 --- a/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc +++ b/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc
@@ -347,7 +347,6 @@ } TEST_F(GuestOsSharePathTest, SuccessDriveFsMyDrive) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("root").Append("my"), PERSIST_NO, @@ -359,20 +358,7 @@ run_loop()->Run(); } -TEST_F(GuestOsSharePathTest, FailureDriveFsDisabled) { - features_.InitWithFeatures({}, {chromeos::features::kDriveFs}); - SetUpVolume(); - guest_os_share_path_->SharePath( - "vm-running", drivefs_.Append("root").Append("my"), PERSIST_NO, - base::BindOnce(&GuestOsSharePathTest::SharePathCallback, - base::Unretained(this), "vm-running", Persist::NO, - SeneschalClientCalled::NO, nullptr, "my", Success::NO, - "Path is not allowed")); - run_loop()->Run(); -} - TEST_F(GuestOsSharePathTest, SuccessDriveFsMyDriveRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("root"), PERSIST_NO, @@ -385,7 +371,6 @@ } TEST_F(GuestOsSharePathTest, FailDriveFsRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_, PERSIST_NO, @@ -397,7 +382,6 @@ } TEST_F(GuestOsSharePathTest, SuccessDriveFsTeamDrives) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("team_drives").Append("team"), PERSIST_NO, @@ -411,7 +395,6 @@ // TODO(crbug.com/917920): Enable when DriveFS enforces allowed write paths. TEST_F(GuestOsSharePathTest, DISABLED_SuccessDriveFsComputersGrandRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("Computers"), PERSIST_NO, @@ -425,7 +408,6 @@ // TODO(crbug.com/917920): Remove when DriveFS enforces allowed write paths. TEST_F(GuestOsSharePathTest, Bug917920DriveFsComputersGrandRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("Computers"), PERSIST_NO, @@ -438,7 +420,6 @@ // TODO(crbug.com/917920): Enable when DriveFS enforces allowed write paths. TEST_F(GuestOsSharePathTest, DISABLED_SuccessDriveFsComputerRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("Computers").Append("pc"), PERSIST_NO, @@ -452,7 +433,6 @@ // TODO(crbug.com/917920): Remove when DriveFS enforces allowed write paths. TEST_F(GuestOsSharePathTest, Bug917920DriveFsComputerRoot) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append("Computers").Append("pc"), PERSIST_NO, @@ -464,7 +444,6 @@ } TEST_F(GuestOsSharePathTest, SuccessDriveFsComputersLevel3) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", @@ -479,7 +458,6 @@ } TEST_F(GuestOsSharePathTest, FailDriveFsTrash) { - features_.InitWithFeatures({chromeos::features::kDriveFs}, {}); SetUpVolume(); guest_os_share_path_->SharePath( "vm-running", drivefs_.Append(".Trash").Append("in-the-trash"),
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc index 2d6dc63..d460bfdc 100644 --- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc +++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -827,7 +827,8 @@ &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED}; }; -IN_PROC_BROWSER_TEST_P(EphemeralUserOobeTest, RegularEphemeralUser) { +// TODO(crbug.com/1004561) Disabled due to flake. +IN_PROC_BROWSER_TEST_P(EphemeralUserOobeTest, DISABLED_RegularEphemeralUser) { ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver get_auth_token_observer; WaitForGaiaSignInScreen(test_setup()->arc_state() != ArcState::kNotAvailable);
diff --git a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc index 6774b343..dc00055 100644 --- a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc
@@ -559,9 +559,8 @@ screen_waiter.set_assert_next_screen(); screen_waiter.Wait(); - // Value prop screen will not be sohwn until it receives assistant settings - // config, which is blocked on voice interaction controller - // client getting out of NOT_READY state. + // Value prop screen will not be sohwn until it receives assistant settings + // config, which is blocked on the Assistant state becomes READY state. test::OobeJS().ExpectHiddenPath({"assistant-optin-flow-card", "value-prop"}); test::OobeJS().ExpectVisiblePath({"assistant-optin-flow-card", "loading"});
diff --git a/chrome/browser/chromeos/login/ui/login_display_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_mojo.cc index 98842a2..b732a5b 100644 --- a/chrome/browser/chromeos/login/ui/login_display_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_mojo.cc
@@ -167,15 +167,8 @@ error_msg_id != IDS_LOGIN_ERROR_OWNER_KEY_LOST && error_msg_id != IDS_LOGIN_ERROR_OWNER_REQUIRED && error_msg_id != IDS_LOGIN_ERROR_GOOGLE_ACCOUNT_NOT_ALLOWED) { - // Display a warning if Caps Lock is on. input_method::InputMethodManager* ime_manager = input_method::InputMethodManager::Get(); - if (ime_manager->GetImeKeyboard()->CapsLockIsEnabled()) { - // TODO(ivankr): use a format string instead of concatenation. - error_text += - "\n" + l10n_util::GetStringUTF8(IDS_LOGIN_ERROR_CAPS_LOCK_HINT); - } - // Display a hint to switch keyboards if there are other active input // methods. if (ime_manager->GetActiveIMEState()->GetNumActiveInputMethods() > 1) {
diff --git a/chrome/browser/chromeos/login/ui/login_display_webui.cc b/chrome/browser/chromeos/login/ui/login_display_webui.cc index 44c853d..f0334481 100644 --- a/chrome/browser/chromeos/login/ui/login_display_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_webui.cc
@@ -130,14 +130,8 @@ error_msg_id != IDS_LOGIN_ERROR_OWNER_KEY_LOST && error_msg_id != IDS_LOGIN_ERROR_OWNER_REQUIRED && error_msg_id != IDS_LOGIN_ERROR_GOOGLE_ACCOUNT_NOT_ALLOWED) { - // Display a warning if Caps Lock is on. input_method::InputMethodManager* ime_manager = input_method::InputMethodManager::Get(); - if (ime_manager->GetImeKeyboard()->CapsLockIsEnabled()) { - // TODO(ivankr): use a format string instead of concatenation. - error_text += - "\n" + l10n_util::GetStringUTF8(IDS_LOGIN_ERROR_CAPS_LOCK_HINT); - } // Display a hint to switch keyboards if there are other active input // methods.
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 9f8c77d4..c0666042 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -322,9 +322,6 @@ WizardController::WizardController() : screen_manager_(std::make_unique<ScreenManager>()), network_state_helper_(std::make_unique<login::NetworkStateHelper>()) { - // In session OOBE was initiated from voice interaction keyboard shortcuts. - is_in_session_oobe_ = - session_manager::SessionManager::Get()->IsSessionStarted(); AccessibilityManager* accessibility_manager = AccessibilityManager::Get(); if (accessibility_manager) { // accessibility_manager could be null in Tests. @@ -1054,11 +1051,6 @@ } void WizardController::OnArcTermsOfServiceSkipped() { - if (is_in_session_oobe_) { - OnOobeFlowFinished(); - return; - } - // If the user finished with the PlayStore Terms of Service, advance to the // assistant opt-in flow screen. ShowAssistantOptInFlowScreen(); @@ -1151,13 +1143,6 @@ } void WizardController::OnOobeFlowFinished() { - if (is_in_session_oobe_ && current_screen_->screen_id() != - SupervisionTransitionScreenView::kScreenId) { - GetLoginDisplayHost()->SetStatusAreaVisible(true); - GetLoginDisplayHost()->Finalize(base::OnceClosure()); - return; - } - if (!time_oobe_started_.is_null()) { base::TimeDelta delta = base::Time::Now() - time_oobe_started_; UMA_HISTOGRAM_CUSTOM_TIMES("OOBE.BootToSignInCompleted", delta,
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h index c03d9a05..21557339 100644 --- a/chrome/browser/chromeos/login/wizard_controller.h +++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -299,9 +299,6 @@ // Returns false if timezone has already been resolved. bool SetOnTimeZoneResolvedForTesting(const base::Closure& callback); - // Start voice interaction setup wizard in container - void StartVoiceInteractionSetupWizard(); - // Start the enrollment screen using the config from // |prescribed_enrollment_config_|. If |force_interactive| is true, // the user will be presented with a manual enrollment screen requiring @@ -365,8 +362,6 @@ bool login_screen_started_ = false; - bool is_in_session_oobe_ = false; - // Non-owning pointer to local state used for testing. static PrefService* local_state_for_testing_;
diff --git a/chrome/browser/download/download_core_service_impl.cc b/chrome/browser/download/download_core_service_impl.cc index 7891482..5471b56 100644 --- a/chrome/browser/download/download_core_service_impl.cc +++ b/chrome/browser/download/download_core_service_impl.cc
@@ -80,8 +80,7 @@ // Pass an empty delegate when constructing the DownloadUIController. The // default delegate does all the notifications we need. download_ui_.reset(new DownloadUIController( - manager, std::unique_ptr<DownloadUIController::Delegate>(), - download_provider)); + manager, std::unique_ptr<DownloadUIController::Delegate>())); #if !defined(OS_ANDROID) download_shelf_controller_.reset(new DownloadShelfController(profile_));
diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chrome/browser/download/download_offline_content_provider.cc index b251d5c..be515444 100644 --- a/chrome/browser/download/download_offline_content_provider.cc +++ b/chrome/browser/download/download_offline_content_provider.cc
@@ -456,23 +456,19 @@ return; UpdateDelta update_delta; - if (item->GetState() == DownloadItem::COMPLETE) { - update_delta.state_changed = completed_downloads_.find(item->GetGuid()) == - completed_downloads_.end(); - + auto offline_item = OfflineItemUtils::CreateOfflineItem(name_space_, item); + if (offline_item.state == OfflineItemState::COMPLETE || + offline_item.state == OfflineItemState::FAILED || + offline_item.state == OfflineItemState::CANCELLED) { // TODO(crbug.com/938152): May be move this to DownloadItem. // Never call this for completed downloads from history. - if (completed_downloads_.find(item->GetGuid()) != - completed_downloads_.end()) { - return; - } + item->RemoveObserver(this); - completed_downloads_.insert(item->GetGuid()); - - AddCompletedDownload(item); + update_delta.state_changed = true; + if (item->GetState() == DownloadItem::COMPLETE) + AddCompletedDownload(item); } - auto offline_item = OfflineItemUtils::CreateOfflineItem(name_space_, item); UpdateObservers(offline_item, update_delta); } @@ -489,10 +485,6 @@ observer.OnItemRemoved(contentId); } -void DownloadOfflineContentProvider::OnDownloadDestroyed(DownloadItem* item) { - completed_downloads_.erase(item->GetGuid()); -} - void DownloadOfflineContentProvider::AddCompletedDownload(DownloadItem* item) { #if defined(OS_ANDROID) DownloadManagerBridge::AddCompletedDownload(
diff --git a/chrome/browser/download/download_offline_content_provider.h b/chrome/browser/download/download_offline_content_provider.h index a7be4e8..4b266c8 100644 --- a/chrome/browser/download/download_offline_content_provider.h +++ b/chrome/browser/download/download_offline_content_provider.h
@@ -90,7 +90,6 @@ // DownloadItem::Observer overrides void OnDownloadUpdated(DownloadItem* item) override; void OnDownloadRemoved(DownloadItem* item) override; - void OnDownloadDestroyed(DownloadItem* download) override; private: enum class State { @@ -129,8 +128,6 @@ std::string name_space_; SimpleDownloadManagerCoordinator* manager_; - // Tracks the completed downloads in the current session. - std::set<std::string> completed_downloads_; std::unique_ptr<download::AllDownloadEventNotifier::Observer> all_download_observer_; bool checked_for_externally_removed_downloads_;
diff --git a/chrome/browser/download/download_prefs_unittest.cc b/chrome/browser/download/download_prefs_unittest.cc index aef7348a..7a30998 100644 --- a/chrome/browser/download/download_prefs_unittest.cc +++ b/chrome/browser/download/download_prefs_unittest.cc
@@ -13,11 +13,9 @@ #include "testing/gtest/include/gtest/gtest.h" #if defined(OS_CHROMEOS) -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" -#include "chromeos/constants/chromeos_features.h" #include "components/drive/drive_pref_names.h" #include "content/public/test/test_service_manager_context.h" #endif @@ -221,32 +219,8 @@ parent_reference.value()); EXPECT_EQ(prefs.DownloadPath(), default_dir); - // Drive - { - base::test::ScopedFeatureList features; - features.InitAndDisableFeature(chromeos::features::kDriveFs); - auto* integration_service = - drive::DriveIntegrationServiceFactory::GetForProfile(&profile); - integration_service->SetEnabled(true); - - // My Drive root. - ExpectValidDownloadDir( - &profile, &prefs, - base::FilePath("/special/drive-0123456789abcdef/root")); - // My Drive/foo. - ExpectValidDownloadDir( - &profile, &prefs, - base::FilePath("/special/drive-0123456789abcdef/root/foo")); - // Invalid path without one of the drive roots. - profile.GetPrefs()->SetString(prefs::kDownloadDefaultDirectory, - "/special/drive-0123456789abcdef"); - EXPECT_EQ(prefs.DownloadPath(), default_dir); - } - // DriveFS { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(chromeos::features::kDriveFs); // Create new profile for enabled feature to work. TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); chromeos::FakeChromeUserManager user_manager;
diff --git a/chrome/browser/download/download_ui_controller.cc b/chrome/browser/download/download_ui_controller.cc index fa6aecb..9f444a5f 100644 --- a/chrome/browser/download/download_ui_controller.cc +++ b/chrome/browser/download/download_ui_controller.cc
@@ -111,13 +111,9 @@ DownloadUIController::Delegate::~Delegate() { } -DownloadUIController::DownloadUIController( - content::DownloadManager* manager, - std::unique_ptr<Delegate> delegate, - DownloadOfflineContentProvider* provider) - : download_notifier_(manager, this), - delegate_(std::move(delegate)), - download_provider_(provider) { +DownloadUIController::DownloadUIController(content::DownloadManager* manager, + std::unique_ptr<Delegate> delegate) + : download_notifier_(manager, this), delegate_(std::move(delegate)) { #if defined(OS_ANDROID) if (!delegate_) delegate_.reset(new AndroidUIControllerDelegate()); @@ -207,6 +203,4 @@ DownloadItemModel(item).SetWasUINotified(true); delegate_->OnNewDownloadReady(item); - if (download_provider_) - download_provider_->OnDownloadStarted(item); }
diff --git a/chrome/browser/download/download_ui_controller.h b/chrome/browser/download/download_ui_controller.h index 8500bee..e590dea 100644 --- a/chrome/browser/download/download_ui_controller.h +++ b/chrome/browser/download/download_ui_controller.h
@@ -9,7 +9,6 @@ #include <set> #include "base/macros.h" -#include "chrome/browser/download/download_offline_content_provider.h" #include "components/download/content/public/all_download_item_notifier.h" // This class handles the task of observing a single DownloadManager for @@ -37,8 +36,7 @@ // // Currently explicit delegates are only used for testing. DownloadUIController(content::DownloadManager* manager, - std::unique_ptr<Delegate> delegate, - DownloadOfflineContentProvider* provider); + std::unique_ptr<Delegate> delegate); ~DownloadUIController() override; @@ -51,7 +49,6 @@ download::AllDownloadItemNotifier download_notifier_; std::unique_ptr<Delegate> delegate_; - DownloadOfflineContentProvider* download_provider_; DISALLOW_COPY_AND_ASSIGN(DownloadUIController); };
diff --git a/chrome/browser/download/download_ui_controller_unittest.cc b/chrome/browser/download/download_ui_controller_unittest.cc index debc602..7a1f58d 100644 --- a/chrome/browser/download/download_ui_controller_unittest.cc +++ b/chrome/browser/download/download_ui_controller_unittest.cc
@@ -97,8 +97,6 @@ // delegate results in the DownloadItem* being stored in |notified_item_|. std::unique_ptr<DownloadUIController::Delegate> GetTestDelegate(); - DownloadOfflineContentProvider* GetDownloadProvider() { return nullptr; } - MockDownloadManager* manager() { return manager_.get(); } // Returns the DownloadManager::Observer registered by a test case. This is @@ -274,8 +272,7 @@ // a non-empty path. I.e. once the download target has been determined. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyBasic) { std::unique_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); - DownloadUIController controller(manager(), GetTestDelegate(), - GetDownloadProvider()); + DownloadUIController controller(manager(), GetTestDelegate()); EXPECT_CALL(*item, GetTargetFilePath()) .WillOnce(ReturnRefOfCopy(base::FilePath())); @@ -297,8 +294,7 @@ // A download that's created in an interrupted state should also be displayed. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyBasic_Interrupted) { std::unique_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); - DownloadUIController controller(manager(), GetTestDelegate(), - GetDownloadProvider()); + DownloadUIController controller(manager(), GetTestDelegate()); EXPECT_CALL(*item, GetState()) .WillRepeatedly(Return(download::DownloadItem::INTERRUPTED)); @@ -312,8 +308,7 @@ // additional OnDownloadUpdated() notification. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyReadyOnCreate) { std::unique_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); - DownloadUIController controller(manager(), GetTestDelegate(), - GetDownloadProvider()); + DownloadUIController controller(manager(), GetTestDelegate()); ASSERT_TRUE(manager_observer()); manager_observer()->OnDownloadCreated(manager(), item.get()); @@ -322,8 +317,7 @@ // The UI shouldn't be notified of downloads that were restored from history. TEST_F(DownloadUIControllerTest, DownloadUIController_HistoryDownload) { - DownloadUIController controller(manager(), GetTestDelegate(), - GetDownloadProvider()); + DownloadUIController controller(manager(), GetTestDelegate()); // DownloadHistory should already have been created. It performs a query of // existing downloads upon creation. We'll use the callback to inject a // history download.
diff --git a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc index 095b9e97..b5f3d56b 100644 --- a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc +++ b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
@@ -69,10 +69,10 @@ device3_ = fake_usb_manager_.CreateAndAddDevice(0, 0, "Test Manufacturer", "Test Product", ""); - device::mojom::HidManagerPtr hid_manager_ptr; - fake_hid_manager_.Bind(mojo::MakeRequest(&hid_manager_ptr)); + mojo::PendingRemote<device::mojom::HidManager> hid_manager; + fake_hid_manager_.Bind(hid_manager.InitWithNewPipeAndPassReceiver()); HidDeviceManager::Get(env_->profile()) - ->SetFakeHidManagerForTesting(std::move(hid_manager_ptr)); + ->SetFakeHidManagerForTesting(std::move(hid_manager)); base::RunLoop().RunUntilIdle(); device4_ = fake_hid_manager_.CreateAndAddDevice(
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc index 2b605066..a3eab8e 100644 --- a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc +++ b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -144,16 +144,6 @@ // necessary because the fetch starts lazily upon the first read operation. void SetUpOnMainThread() override { PlatformAppBrowserTest::SetUpOnMainThread(); - - if (!base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - std::unique_ptr<drive::ResourceEntry> entry; - drive::FileError error = drive::FILE_ERROR_FAILED; - integration_service_->file_system()->GetResourceEntry( - base::FilePath::FromUTF8Unsafe("drive/root"), // whatever - google_apis::test_util::CreateCopyResultCallback(&error, &entry)); - content::RunAllTasksUntilIdle(); - ASSERT_EQ(drive::FILE_ERROR_OK, error); - } } void TearDown() override { @@ -161,13 +151,7 @@ PlatformAppBrowserTest::TearDown(); } - base::FilePath GetDriveMountPoint() { - if (base::FeatureList::IsEnabled(chromeos::features::kDriveFs)) { - return drivefs_mount_point_; - } else { - return drive::util::GetDriveMountPointPath(browser()->profile()); - } - } + base::FilePath GetDriveMountPoint() { return drivefs_mount_point_; } private: drive::DriveIntegrationService* CreateDriveIntegrationService(
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index f07d7d2..7931d22 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -265,6 +265,8 @@ IDS_PASSWORDS_VIA_FEDERATION, GetDisplayFederation(*form)))); } + entry.from_account_store = form->IsUsingAccountStore(); + current_entries_.push_back(std::move(entry)); } @@ -292,6 +294,8 @@ current_exception_entry.urls = CreateUrlCollectionFromForm(*form); current_exception_entry.id = exception_id_generator_.GenerateId( password_manager::CreateSortKey(*form)); + + current_exception_entry.from_account_store = form->IsUsingAccountStore(); current_exceptions_.push_back(std::move(current_exception_entry)); }
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 119b800..9e39852 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -481,8 +481,9 @@ << message_; } +// TODO(https://crbug.com/1003598): Flake on multiple platforms. IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest, - WebRequestAuthRequiredAsync) { + DISABLED_WebRequestAuthRequiredAsync) { CancelLoginDialog login_dialog_helper; ASSERT_TRUE(StartEmbeddedTestServer());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index c22041f..1202fda 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -566,6 +566,11 @@ "expiry_milestone": 78 }, { + "name": "darken-websites-checkbox-in-themes-setting", + "owners": [ "lazzzis@google.com", "twellington" ], + "expiry_milestone": 83 + }, + { "name": "data-saver-server-previews", "owners": [ "//components/data_reduction_proxy/OWNERS" ], // This flag is used for frequent manual testing and should not be removed. @@ -2955,6 +2960,14 @@ "expiry_milestone": -1 }, { + "name": "show-bluetooth-debug-log-toggle", + "owners": [ "hansberry", "khorimoto", "yshavit" ], + // This is a debug tool used to help in the field with Bluetooth issues + // caused by specific hardware, noisy environments, etc. Thus, it should not + // expire. + "expiry_milestone": -1 + }, + { "name": "show-bluetooth-device-battery", "owners": [ "hansberry" ], "expiry_milestone": 80
diff --git a/chrome/browser/flag-never-expire-list.json b/chrome/browser/flag-never-expire-list.json index a3f6b9f..dcd980b 100644 --- a/chrome/browser/flag-never-expire-list.json +++ b/chrome/browser/flag-never-expire-list.json
@@ -75,6 +75,7 @@ "overlay-strategies", "set-market-url-for-testing", "show-autofill-type-predictions", + "show-bluetooth-debug-log-toggle", "show-taps", "show-touch-hud", "tint-gl-composited-content",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index df1cca6..74a32eb 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -358,6 +358,13 @@ const char kCreditCardAssistDescription[] = "Enable assisted credit card filling on certain sites."; +const char kDarkenWebsitesCheckboxInThemesSettingName[] = + "Darken websites checkbox in themes setting"; +const char kDarkenWebsitesCheckboxInThemesSettingDescription[] = + "Show a darken websites checkbox in themes settings when system default or " + "dark is selected. The checkbox can toggle the auto-darkening web contents " + "feature"; + const char kDataSaverServerPreviewsName[] = "Data Saver Server Previews"; const char kDataSaverServerPreviewsDescription[] = "Allow the Data Reduction Proxy to serve previews."; @@ -3478,6 +3485,12 @@ const char kSchedulerConfigurationPerformance[] = "Enables Hyper-Threading on relevant CPUs."; +const char kShowBluetoothDebugLogToggleName[] = + "Show Bluetooth debug log toggle"; +const char kShowBluetoothDebugLogToggleDescription[] = + "Enables a toggle which can enable debug (i.e., verbose) logs for " + "Bluetooth"; + const char kShowBluetoothDeviceBatteryName[] = "Show Bluetooth device battery"; const char kShowBluetoothDeviceBatteryDescription[] = "Enables showing the battery level of connected and supported Bluetooth "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 5ce73d1..b69f621d 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -238,6 +238,9 @@ extern const char kCreditCardAssistName[]; extern const char kCreditCardAssistDescription[]; +extern const char kDarkenWebsitesCheckboxInThemesSettingName[]; +extern const char kDarkenWebsitesCheckboxInThemesSettingDescription[]; + extern const char kDataSaverServerPreviewsName[]; extern const char kDataSaverServerPreviewsDescription[]; @@ -2074,6 +2077,9 @@ extern const char kSchedulerConfigurationConservative[]; extern const char kSchedulerConfigurationPerformance[]; +extern const char kShowBluetoothDebugLogToggleName[]; +extern const char kShowBluetoothDebugLogToggleDescription[]; + extern const char kShowBluetoothDeviceBatteryName[]; extern const char kShowBluetoothDeviceBatteryDescription[];
diff --git a/chrome/browser/hid/hid_chooser_context.cc b/chrome/browser/hid/hid_chooser_context.cc index d56893b..3b8b0c045f 100644 --- a/chrome/browser/hid/hid_chooser_context.cc +++ b/chrome/browser/hid/hid_chooser_context.cc
@@ -168,7 +168,7 @@ } void HidChooserContext::SetHidManagerForTesting( - device::mojom::HidManagerPtr manager) { + mojo::PendingRemote<device::mojom::HidManager> manager) { SetUpHidManagerConnection(std::move(manager)); } @@ -180,16 +180,16 @@ if (hid_manager_) return; - device::mojom::HidManagerPtr manager; - content::GetSystemConnector()->BindInterface(device::mojom::kServiceName, - mojo::MakeRequest(&manager)); + mojo::PendingRemote<device::mojom::HidManager> manager; + content::GetSystemConnector()->Connect( + device::mojom::kServiceName, manager.InitWithNewPipeAndPassReceiver()); SetUpHidManagerConnection(std::move(manager)); } void HidChooserContext::SetUpHidManagerConnection( - device::mojom::HidManagerPtr manager) { - hid_manager_ = std::move(manager); - hid_manager_.set_connection_error_handler(base::BindOnce( + mojo::PendingRemote<device::mojom::HidManager> manager) { + hid_manager_.Bind(std::move(manager)); + hid_manager_.set_disconnect_handler(base::BindOnce( &HidChooserContext::OnHidManagerConnectionError, base::Unretained(this))); // TODO(mattreynolds): Register a HidManagerClient to be notified when devices // are disconnected so that ephemeral permissions can be revoked.
diff --git a/chrome/browser/hid/hid_chooser_context.h b/chrome/browser/hid/hid_chooser_context.h index ae531042..bf6ecbc4 100644 --- a/chrome/browser/hid/hid_chooser_context.h +++ b/chrome/browser/hid/hid_chooser_context.h
@@ -15,6 +15,8 @@ #include "base/memory/weak_ptr.h" #include "base/unguessable_token.h" #include "chrome/browser/permissions/chooser_context_base.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/hid.mojom.h" #include "url/origin.h" @@ -55,12 +57,14 @@ device::mojom::HidManager* GetHidManager(); - void SetHidManagerForTesting(device::mojom::HidManagerPtr manager); + void SetHidManagerForTesting( + mojo::PendingRemote<device::mojom::HidManager> manager); base::WeakPtr<HidChooserContext> AsWeakPtr(); private: void EnsureHidManagerConnection(); - void SetUpHidManagerConnection(device::mojom::HidManagerPtr manager); + void SetUpHidManagerConnection( + mojo::PendingRemote<device::mojom::HidManager> manager); void OnHidManagerConnectionError(); const bool is_incognito_; @@ -74,7 +78,7 @@ // Holds information about devices in |ephemeral_devices_|. std::map<std::string, base::Value> device_info_; - device::mojom::HidManagerPtr hid_manager_; + mojo::Remote<device::mojom::HidManager> hid_manager_; base::WeakPtrFactory<HidChooserContext> weak_factory_{this};
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc b/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc index 50d87b4..2c7b3bd 100644 --- a/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc +++ b/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc
@@ -96,7 +96,7 @@ } int SafetyTipInfoBarDelegate::GetIconId() const { - return IDR_ANDROID_INFOBAR_TIP; + return IDR_ANDROID_INFOBAR_SAFETYTIP_SHIELD; } void SafetyTipInfoBarDelegate::InfoBarDismissed() {
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc index 8d1be4a..4e835e4 100644 --- a/chrome/browser/media/encrypted_media_browsertest.cc +++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -611,24 +611,10 @@ #if BUILDFLAG(ENABLE_AV1_DECODER) IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM_AV1) { -#if BUILDFLAG(ENABLE_WIDEVINE) - // TODO(crbug.com/884845): Update Widevine CDM to support AV1. - if (IsWidevine(CurrentKeySystem())) { - DVLOG(0) << "Skipping test - Widevine CDM does not support AV1"; - return; - } -#endif TestSimplePlayback("bear-av1-cenc.webm"); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM_AV1_10bit) { -#if BUILDFLAG(ENABLE_WIDEVINE) - // TODO(crbug.com/884845): Update Widevine CDM to support AV1. - if (IsWidevine(CurrentKeySystem())) { - DVLOG(0) << "Skipping test - Widevine CDM does not support AV1"; - return; - } -#endif TestSimplePlayback("bear-av1-320x180-10bit-cenc.webm"); } @@ -638,13 +624,6 @@ DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE."; return; } -#if BUILDFLAG(ENABLE_WIDEVINE) - // TODO(crbug.com/884845): Update Widevine CDM to support AV1. - if (IsWidevine(CurrentKeySystem())) { - DVLOG(0) << "Skipping test - Widevine CDM does not support AV1"; - return; - } -#endif TestSimplePlayback("bear-av1-cenc.mp4"); } @@ -654,13 +633,6 @@ DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE."; return; } -#if BUILDFLAG(ENABLE_WIDEVINE) - // TODO(crbug.com/884845): Update Widevine CDM to support AV1. - if (IsWidevine(CurrentKeySystem())) { - DVLOG(0) << "Skipping test - Widevine CDM does not support AV1"; - return; - } -#endif TestSimplePlayback("bear-av1-320x180-10bit-cenc.mp4"); } #endif // BUILDFLAG(ENABLE_AV1_DECODER) @@ -992,7 +964,8 @@ // save anything to disk. Instead we are only running the tests that actually // have the CDM do file access. -IN_PROC_BROWSER_TEST_F(ECKIncognitoEncryptedMediaTest, FileIO) { +// TODO(crbug.com/999421) Disabled due to flake on all platforms +IN_PROC_BROWSER_TEST_F(ECKIncognitoEncryptedMediaTest, DISABLED_FileIO) { // Try the FileIO test using the default CDM API while running in incognito. TestNonPlaybackCases(kExternalClearKeyFileIOTestKeySystem, kUnitTestSuccess); }
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc index cacbb5a0..c32de84 100644 --- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc +++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -1002,6 +1002,8 @@ video_webm_codecs())); EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, vp9_profile0_codecs())); + EXPECT_WV_AV1( + IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, av1_codecs())); // Non-video WebM codecs. EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, @@ -1011,8 +1013,6 @@ EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, vp9_profile2_codecs())); EXPECT_UNSUPPORTED( - IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, av1_codecs())); - EXPECT_UNSUPPORTED( IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, invalid_codecs())); EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, audio_mp4_codecs())); @@ -1048,6 +1048,8 @@ IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, video_mp4_codecs())); EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, vp9_profile0_codecs())); + EXPECT_WV_AV1( + IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, av1_codecs())); // High 10-bit Profile is not supported when using Widevine. EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, @@ -1063,8 +1065,6 @@ EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, vp9_profile2_codecs())); EXPECT_UNSUPPORTED( - IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, av1_codecs())); - EXPECT_UNSUPPORTED( IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, invalid_codecs())); EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, audio_webm_codecs()));
diff --git a/chrome/browser/media/media_engagement_contents_observer_unittest.cc b/chrome/browser/media/media_engagement_contents_observer_unittest.cc index cfd2117..0280a8f5 100644 --- a/chrome/browser/media/media_engagement_contents_observer_unittest.cc +++ b/chrome/browser/media/media_engagement_contents_observer_unittest.cc
@@ -33,6 +33,8 @@ #include "services/metrics/public/cpp/ukm_source.h" #include "testing/gtest/include/gtest/gtest.h" +// TODO(crbug/1004580) All these tests crash on Android +#if !defined(OS_ANDROID) class MediaEngagementContentsObserverTest : public ChromeRenderViewHostTestHarness { public: @@ -1391,3 +1393,5 @@ SimulateAudioContextPlaybackTimerFired(); EXPECT_FALSE(WasSignificantAudioContextPlaybackRecorded()); } + +#endif // !defined(OS_ANDROID)
diff --git a/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc b/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc index 3d088e3..582f04f5 100644 --- a/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc
@@ -43,10 +43,12 @@ } }; -// Fails/times out on Windows and Chrome OS. Flaky on Linux. +// Fails/times out on Windows and Chrome OS. Flaky on Mac. // http://crbug.com/452623 +// http://crbug.com/1004546 // MSan reports errors. http://crbug.com/452892 -#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(MEMORY_SANITIZER) +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || \ + defined(MEMORY_SANITIZER) #define MAYBE_TestVgaReturnsTwoSimulcastStreams DISABLED_TestVgaReturnsTwoSimulcastStreams #else #define MAYBE_TestVgaReturnsTwoSimulcastStreams TestVgaReturnsTwoSimulcastStreams
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc index 90b0735..0a76116 100644 --- a/chrome/browser/navigation_predictor/navigation_predictor.cc +++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -95,7 +95,7 @@ const bool is_url_incremented_by_one; // Rank in terms of anchor element area. It starts at 0, a lower rank implies - // a larger area. Capped at 40. + // a larger area. Capped at 100. const size_t area_rank; // Calculated navigation score, based on |area_rank| and other metrics.
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc index a21a9b7..6e3e04ac 100644 --- a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc +++ b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
@@ -702,7 +702,7 @@ WaitForLayout(); histogram_tester.ExpectTotalCount("AnchorElementMetrics.Visible.RatioArea", - 1); + 2); EXPECT_TRUE(content::ExecuteScript( browser()->tab_strip_model()->GetActiveWebContents(), @@ -727,7 +727,7 @@ WaitForLayout(); histogram_tester.ExpectTotalCount("AnchorElementMetrics.Visible.RatioArea", - 1); + 2); EXPECT_TRUE(content::ExecuteScript( browser()->tab_strip_model()->GetActiveWebContents(), @@ -854,9 +854,7 @@ NavigationPredictor::Action::kPrefetch, 1); } -// Tests that the browser only receives anchor elements that are in the -// viewport, and from anchor elements whose target differ from document URL -// by one digit. +// Tests that the browser receives anchors from anywhere on the page. IN_PROC_BROWSER_TEST_F(NavigationPredictorBrowserTest, ViewportOnlyAndUrlIncrementByOne) { base::HistogramTester histogram_tester; @@ -866,8 +864,7 @@ WaitForLayout(); histogram_tester.ExpectUniqueSample( - "AnchorElementMetrics.Visible.NumberOfAnchorElements", 2, 1); - // Same document anchor element should be removed after merge. + "AnchorElementMetrics.Visible.NumberOfAnchorElements", 3, 1); histogram_tester.ExpectUniqueSample( - "AnchorElementMetrics.Visible.NumberOfAnchorElementsAfterMerge", 2, 1); + "AnchorElementMetrics.Visible.NumberOfAnchorElementsAfterMerge", 3, 1); }
diff --git a/chrome/browser/notifications/scheduler/internal/BUILD.gn b/chrome/browser/notifications/scheduler/internal/BUILD.gn index fd22666e..d70613c 100644 --- a/chrome/browser/notifications/scheduler/internal/BUILD.gn +++ b/chrome/browser/notifications/scheduler/internal/BUILD.gn
@@ -89,6 +89,7 @@ "notification_store_unittest.cc", "proto_conversion_unittest.cc", "scheduled_notification_manager_unittest.cc", + "scheduler_config_unittest.cc", "scheduler_utils_unittest.cc", "stats_unittest.cc", ]
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_config.cc b/chrome/browser/notifications/scheduler/internal/scheduler_config.cc index 50f1aca..e3bd1e3 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_config.cc +++ b/chrome/browser/notifications/scheduler/internal/scheduler_config.cc
@@ -4,7 +4,37 @@ #include "chrome/browser/notifications/scheduler/internal/scheduler_config.h" +#include <string> + +#include "base/metrics/field_trial_params.h" +#include "base/strings/string_number_conversions.h" +#include "chrome/browser/notifications/scheduler/public/features.h" + namespace notifications { +namespace { + +// Helper routine to get Finch experiment parameter. If no Finch seed was +// found, +// use the |default_value|. The |name| should match an experiment +// parameter in Finch server configuration. +int GetFinchConfigUInt(const std::string& name, int default_value) { + return base::GetFieldTrialParamByFeatureAsInt( + features::kNotificationScheduleService, name, default_value); +} + +} // namespace + +// Default number of maximum daily shown all type. +constexpr int kDefaultMaxDailyShownAllType = 3; + +// Default number of maximum daily shown per type. +constexpr int kDefaultMaxDailyShownPerType = 10; + +// Default number of initial daily shown per type. +constexpr int kDefaultInitialDailyShownPerType = 2; + +// Default number of dismiss count. +constexpr int kDefaultDismissCount = 3; // The notification data is hold for one week. constexpr base::TimeDelta kDefaultNotificationExpiration = @@ -20,7 +50,8 @@ // Check consecutive notification dismisses in this duration to generate a // dismiss event. -constexpr base::TimeDelta kDefaultDimissDuration = base::TimeDelta::FromDays(7); +constexpr base::TimeDelta kDefaultDismissDuration = + base::TimeDelta::FromDays(7); // Default background task time window duration. constexpr base::TimeDelta kDefaultBackgroundTaskWindowDuration = @@ -31,18 +62,49 @@ return std::make_unique<SchedulerConfig>(); } +std::unique_ptr<SchedulerConfig> SchedulerConfig::CreateFromFinch() { + std::unique_ptr<SchedulerConfig> config = std::make_unique<SchedulerConfig>(); + config->max_daily_shown_all_type = + base::saturated_cast<int>(GetFinchConfigUInt( + kMaxDailyShownAllTypeConfig, kDefaultMaxDailyShownAllType)); + config->max_daily_shown_per_type = + base::saturated_cast<int>(GetFinchConfigUInt( + kMaxDailyShownPerTypeConfig, kDefaultMaxDailyShownPerType)); + config->initial_daily_shown_per_type = + base::saturated_cast<int>(GetFinchConfigUInt( + kInitialDailyShownPerTypeConfig, kDefaultInitialDailyShownPerType)); + config->notification_expiration = + base::TimeDelta::FromDays(base::saturated_cast<int>( + GetFinchConfigUInt(kNotificationExpirationConfig, + kDefaultNotificationExpiration.InDays()))); + config->impression_expiration = + base::TimeDelta::FromDays(base::saturated_cast<int>(GetFinchConfigUInt( + kImpressionExpirationConfig, kDefaultImpressionExpiration.InDays()))); + config->suppression_duration = + base::TimeDelta::FromDays(base::saturated_cast<int>(GetFinchConfigUInt( + kSuppressionDurationConfig, kDefaultSuppressionDuration.InDays()))); + config->dismiss_count = base::saturated_cast<int>( + GetFinchConfigUInt(kDismissCountConfig, kDefaultDismissCount)); + config->dismiss_duration = + base::TimeDelta::FromDays(base::saturated_cast<int>(GetFinchConfigUInt( + kDismissDurationConfig, kDefaultDismissDuration.InDays()))); + config->background_task_window_duration = + base::TimeDelta::FromHours(base::saturated_cast<int>( + GetFinchConfigUInt(kBackgroundTaskWindowDurationConfig, + kDefaultBackgroundTaskWindowDuration.InHours()))); + return config; +} + SchedulerConfig::SchedulerConfig() - : max_daily_shown_all_type(3), - max_daily_shown_per_type(10), - initial_daily_shown_per_type(2), + : max_daily_shown_all_type(kDefaultMaxDailyShownAllType), + max_daily_shown_per_type(kDefaultMaxDailyShownPerType), + initial_daily_shown_per_type(kDefaultInitialDailyShownPerType), notification_expiration(kDefaultNotificationExpiration), impression_expiration(kDefaultImpressionExpiration), suppression_duration(kDefaultSuppressionDuration), - dismiss_count(3), - dismiss_duration(kDefaultDimissDuration), - background_task_window_duration(kDefaultBackgroundTaskWindowDuration) { - // TODO(xingliu): Add constructor using finch data. -} + dismiss_count(kDefaultDismissCount), + dismiss_duration(kDefaultDismissDuration), + background_task_window_duration(kDefaultBackgroundTaskWindowDuration) {} SchedulerConfig::~SchedulerConfig() = default;
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_config.h b/chrome/browser/notifications/scheduler/internal/scheduler_config.h index ba1161e6..12ec96e 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_config.h +++ b/chrome/browser/notifications/scheduler/internal/scheduler_config.h
@@ -12,11 +12,43 @@ namespace notifications { +// Configure the maxmium number of notifications daily shown for all types. +constexpr char kMaxDailyShownAllTypeConfig[] = "max_daily_shown_all_type"; + +// Configure the maxmium number of notifications daily shown per type. +constexpr char kMaxDailyShownPerTypeConfig[] = "max_daily_shown_per_type"; + +// Configure the initial number of notifications daily shown per type. +constexpr char kInitialDailyShownPerTypeConfig[] = + "initial_daily_shown_per_type"; + +// Configure the expiration duration for notifications. +constexpr char kNotificationExpirationConfig[] = + "notification_expiration_in_days"; + +// Configure the expiration duration for impressions. +constexpr char kImpressionExpirationConfig[] = "impression_expiration_in_days"; + +// Configure the expiration duration for suppression. +constexpr char kSuppressionDurationConfig[] = "suppression_duration_in_days"; + +// Configure the number of dismiss count. +constexpr char kDismissCountConfig[] = "dismiss_count"; + +// Configure the duration of a dismiss. +constexpr char kDismissDurationConfig[] = "dismiss_duration_in_days"; + +// Configure the duration of background task window. +constexpr char kBackgroundTaskWindowDurationConfig[] = + "background_task_window_duration_in_hours"; + // Configuration of notification scheduler system. struct SchedulerConfig { // Creates a default scheduler config. static std::unique_ptr<SchedulerConfig> Create(); + static std::unique_ptr<SchedulerConfig> CreateFromFinch(); + SchedulerConfig(); ~SchedulerConfig();
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_config_unittest.cc b/chrome/browser/notifications/scheduler/internal/scheduler_config_unittest.cc new file mode 100644 index 0000000..a82b2e2 --- /dev/null +++ b/chrome/browser/notifications/scheduler/internal/scheduler_config_unittest.cc
@@ -0,0 +1,46 @@ +// 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. + +#include "chrome/browser/notifications/scheduler/internal/scheduler_config.h" + +#include <map> +#include <string> + +#include "base/strings/string_number_conversions.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/notifications/scheduler/public/features.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace notifications { +namespace { + +TEST(SchedulerConfigTest, FinchConfigTest) { + base::test::ScopedFeatureList scoped_feature_list; + std::map<std::string, std::string> parameters = { + {kMaxDailyShownAllTypeConfig, base::NumberToString(123)}, + {kMaxDailyShownPerTypeConfig, base::NumberToString(67)}, + {kInitialDailyShownPerTypeConfig, base::NumberToString(45)}, + {kNotificationExpirationConfig, base::NumberToString(33)}, + {kImpressionExpirationConfig, base::NumberToString(22)}, + {kSuppressionDurationConfig, base::NumberToString(11)}, + {kDismissCountConfig, base::NumberToString(8)}, + {kDismissDurationConfig, base::NumberToString(7)}, + {kBackgroundTaskWindowDurationConfig, base::NumberToString(6)}, + }; + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kNotificationScheduleService, parameters); + std::unique_ptr<SchedulerConfig> config = SchedulerConfig::CreateFromFinch(); + + EXPECT_EQ(config->max_daily_shown_all_type, 123); + EXPECT_EQ(config->max_daily_shown_per_type, 67); + EXPECT_EQ(config->initial_daily_shown_per_type, 45); + EXPECT_EQ(config->notification_expiration.InDays(), 33); + EXPECT_EQ(config->impression_expiration.InDays(), 22); + EXPECT_EQ(config->suppression_duration.InDays(), 11); + EXPECT_EQ(config->dismiss_count, 8); + EXPECT_EQ(config->background_task_window_duration.InHours(), 6); +} + +} // namespace +} // namespace notifications
diff --git a/chrome/browser/platform_util_unittest.cc b/chrome/browser/platform_util_unittest.cc index 498462c..3baf050a 100644 --- a/chrome/browser/platform_util_unittest.cc +++ b/chrome/browser/platform_util_unittest.cc
@@ -213,7 +213,13 @@ EXPECT_EQ(OPEN_FAILED_PATH_NOT_FOUND, CallOpenItem(nowhere_, OPEN_FILE)); } -TEST_F(PlatformUtilTest, OpenFolder) { +// TODO(crbug.com/1004639) Disabled on Linux due to crashes and timeouts. +#if defined(OS_LINUX) +#define MAYBE_OpenFolder DISABLED_OpenFolder +#else +#define MAYBE_OpenFolder OpenFolder +#endif +TEST_F(PlatformUtilTest, MAYBE_OpenFolder) { EXPECT_EQ(OPEN_SUCCEEDED, CallOpenItem(existing_folder_, OPEN_FOLDER)); EXPECT_EQ(OPEN_FAILED_INVALID_TYPE, CallOpenItem(existing_file_, OPEN_FOLDER));
diff --git a/chrome/browser/policy/extension_policy_browsertest.cc b/chrome/browser/policy/extension_policy_browsertest.cc new file mode 100644 index 0000000..ce57bc1c --- /dev/null +++ b/chrome/browser/policy/extension_policy_browsertest.cc
@@ -0,0 +1,1105 @@ +// 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. + +#include "base/test/bind_test_util.h" +#include "build/build_config.h" +#include "chrome/browser/background/background_contents_service.h" +#include "chrome/browser/extensions/extension_management_constants.h" +#include "chrome/browser/extensions/extension_management_test_util.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/forced_extensions/installation_reporter.h" +#include "chrome/browser/extensions/install_verifier.h" +#include "chrome/browser/extensions/shared_module_service.h" +#include "chrome/browser/extensions/unpacked_installer.h" +#include "chrome/browser/policy/policy_test_utils.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/common/extensions/extension_test_util.h" +#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/policy/policy_constants.h" +#include "components/version_info/channel.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/common/result_codes.h" +#include "content/public/test/download_test_observer.h" +#include "content/public/test/url_loader_interceptor.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" +#include "extensions/browser/extension_host.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/browser/notification_types.h" +#include "extensions/browser/test_extension_registry_observer.h" +#include "extensions/common/features/feature_channel.h" +#include "extensions/common/manifest_handlers/shared_module_info.h" +#include "extensions/common/value_builder.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" + +#if defined(OS_WIN) +#include "base/win/win_util.h" +#endif + +using testing::AtLeast; +using testing::Sequence; + +namespace policy { + +namespace { + +const base::FilePath::CharType kGoodCrxName[] = FILE_PATH_LITERAL("good.crx"); +const base::FilePath::CharType kSimpleWithIconCrxName[] = + FILE_PATH_LITERAL("simple_with_icon.crx"); +const base::FilePath::CharType kHostedAppCrxName[] = + FILE_PATH_LITERAL("hosted_app.crx"); + +const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; +const char kSimpleWithIconCrxId[] = "dehdlahnlebladnfleagmjdapdjdcnlp"; +const char kHostedAppCrxId[] = "kbmnembihfiondgfjekmnmcbddelicoi"; + +const base::FilePath::CharType kGoodV1CrxName[] = + FILE_PATH_LITERAL("good_v1.crx"); +const base::FilePath::CharType kSimpleWithPopupExt[] = + FILE_PATH_LITERAL("simple_with_popup"); +const base::FilePath::CharType kAppUnpackedExt[] = FILE_PATH_LITERAL("app"); + +// Registers a handler to respond to requests whose path matches |match_path|. +// The response contents are generated from |template_file|, by replacing all +// "${URL_PLACEHOLDER}" substrings in the file with the request URL excluding +// filename, query values and fragment. +void RegisterURLReplacingHandler(net::EmbeddedTestServer* test_server, + const std::string& match_path, + const base::FilePath& template_file) { + test_server->RegisterRequestHandler(base::Bind( + [](net::EmbeddedTestServer* test_server, const std::string& match_path, + const base::FilePath& template_file, + const net::test_server::HttpRequest& request) + -> std::unique_ptr<net::test_server::HttpResponse> { + GURL url = test_server->GetURL(request.relative_url); + if (url.path() != match_path) + return nullptr; + + std::string contents; + CHECK(base::ReadFileToString(template_file, &contents)); + + GURL url_base = url.GetWithoutFilename(); + base::ReplaceSubstringsAfterOffset(&contents, 0, "${URL_PLACEHOLDER}", + url_base.spec()); + + auto response = std::make_unique<net::test_server::BasicHttpResponse>(); + response->set_content(contents); + response->set_content_type("text/plain"); + return response; + }, + base::Unretained(test_server), match_path, template_file)); +} + +} // namespace + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSelective) { + // Verifies that blacklisted extensions can't be installed. + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + ASSERT_FALSE(registry->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + base::ListValue blacklist; + blacklist.AppendString(kGoodCrxId); + PolicyMap policies; + policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + blacklist.CreateDeepCopy(), nullptr); + UpdateProviderPolicy(policies); + + // "good.crx" is blacklisted. + EXPECT_FALSE(InstallExtension(kGoodCrxName)); + EXPECT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // "simple_with_icon.crx" is not. + const extensions::Extension* simple_with_icon = + InstallExtension(kSimpleWithIconCrxName); + ASSERT_TRUE(simple_with_icon); + EXPECT_EQ(kSimpleWithIconCrxId, simple_with_icon->id()); + EXPECT_EQ( + simple_with_icon, + registry->GetExtensionById(kSimpleWithIconCrxId, + extensions::ExtensionRegistry::COMPATIBILITY)); +} + +// Ensure that bookmark apps are not blocked by the ExtensionInstallBlacklist +// policy. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklist_BookmarkApp) { + const extensions::Extension* bookmark_app = InstallBookmarkApp(); + ASSERT_TRUE(bookmark_app); + EXPECT_TRUE(InstallExtension(kGoodCrxName)); + + extensions::ExtensionService* service = extension_service(); + EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); + + // Now set ExtensionInstallBlacklist policy to block all extensions. + PolicyMap policies; + policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + extensions::ListBuilder().Append("*").Build(), nullptr); + UpdateProviderPolicy(policies); + + // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. + EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); +} + +// Ensure that when INSTALLATION_REMOVED is set +// that blacklisted extensions are removed from the device. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallRemovedPolicy) { + EXPECT_TRUE(InstallExtension(kGoodCrxName)); + + extensions::ExtensionService* service = extension_service(); + EXPECT_TRUE(service->GetInstalledExtension(kGoodCrxId)); + + // Should uninstall good_v1.crx. + base::DictionaryValue dict_value; + dict_value.SetString(std::string(kGoodCrxId) + "." + + extensions::schema_constants::kInstallationMode, + extensions::schema_constants::kRemoved); + PolicyMap policies; + policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + dict_value.CreateDeepCopy(), nullptr); + extensions::TestExtensionRegistryObserver observer(extension_registry()); + UpdateProviderPolicy(policies); + observer.WaitForExtensionUnloaded(); + + EXPECT_FALSE(service->GetInstalledExtension(kGoodCrxId)); +} + +// Ensure that when INSTALLATION_REMOVED is set for wildcard +// that blacklisted extensions are removed from the device. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionWildcardRemovedPolicy) { + EXPECT_TRUE(InstallExtension(kGoodCrxName)); + + extensions::ExtensionService* service = extension_service(); + EXPECT_TRUE(service->GetInstalledExtension(kGoodCrxId)); + + // Should uninstall good_v1.crx. + base::DictionaryValue dict_value; + dict_value.SetString( + std::string("*") + "." + extensions::schema_constants::kInstallationMode, + extensions::schema_constants::kRemoved); + PolicyMap policies; + policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + dict_value.CreateDeepCopy(), nullptr); + extensions::TestExtensionRegistryObserver observer(extension_registry()); + UpdateProviderPolicy(policies); + observer.WaitForExtensionUnloaded(); + + EXPECT_FALSE(service->GetInstalledExtension(kGoodCrxId)); +} + +// Ensure that bookmark apps are not blocked by the ExtensionAllowedTypes +// policy. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes_BookmarkApp) { + const extensions::Extension* bookmark_app = InstallBookmarkApp(); + ASSERT_TRUE(bookmark_app); + EXPECT_TRUE(InstallExtension(kGoodCrxName)); + + extensions::ExtensionService* service = extension_service(); + EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); + + // Now set policy to only allow themes. Note: Bookmark apps are hosted + // apps. + PolicyMap policies; + policies.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + extensions::ListBuilder().Append("theme").Build(), nullptr); + UpdateProviderPolicy(policies); + + // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. + EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); +} + +// Ensure that bookmark apps are not blocked by the ExtensionSettings +// policy. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionSettings_BookmarkApp) { + const extensions::Extension* bookmark_app = InstallBookmarkApp(); + ASSERT_TRUE(bookmark_app); + EXPECT_TRUE(InstallExtension(kGoodCrxName)); + + extensions::ExtensionService* service = extension_service(); + EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); + + // Now set policy to block all extensions. + PolicyMap policies; + policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + extensions::DictionaryBuilder() + .Set("*", extensions::DictionaryBuilder() + .Set("installation_mode", "blocked") + .Build()) + .Build(), + nullptr); + UpdateProviderPolicy(policies); + + // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. + EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); + + // Clear all policies. + policies.Clear(); + UpdateProviderPolicy(policies); + + EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); + + // Now set policy to only allow themes. Note: Bookmark apps are hosted + // apps. + policies.Set( + key::kExtensionSettings, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_CLOUD, + extensions::DictionaryBuilder() + .Set("*", extensions::DictionaryBuilder() + .Set("allowed_types", + extensions::ListBuilder().Append("theme").Build()) + .Build()) + .Build(), + nullptr); + UpdateProviderPolicy(policies); + + // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. + EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); + EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); +} + +// Flaky on windows; http://crbug.com/307994. +#if defined(OS_WIN) +#define MAYBE_ExtensionInstallBlacklistWildcard \ + DISABLED_ExtensionInstallBlacklistWildcard +#else +#define MAYBE_ExtensionInstallBlacklistWildcard \ + ExtensionInstallBlacklistWildcard +#endif +IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallBlacklistWildcard) { + // Verify that a wildcard blacklist takes effect. + EXPECT_TRUE(InstallExtension(kSimpleWithIconCrxName)); + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + ASSERT_TRUE(registry->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + base::ListValue blacklist; + blacklist.AppendString("*"); + PolicyMap policies; + policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + blacklist.CreateDeepCopy(), nullptr); + UpdateProviderPolicy(policies); + + // "simple_with_icon" should be disabled. + EXPECT_TRUE(registry->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + EXPECT_FALSE(service->IsExtensionEnabled(kSimpleWithIconCrxId)); + + // It shouldn't be possible to re-enable "simple_with_icon", until it + // satisfies management policy. + service->EnableExtension(kSimpleWithIconCrxId); + EXPECT_FALSE(service->IsExtensionEnabled(kSimpleWithIconCrxId)); + + // It shouldn't be possible to install good.crx. + EXPECT_FALSE(InstallExtension(kGoodCrxName)); + EXPECT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); +} + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSharedModules) { + // Verifies that shared_modules are not affected by the blacklist. + + base::FilePath base_path; + GetTestDataDirectory(&base_path); + base::FilePath update_xml_template_path = + base_path.Append(kTestExtensionsDir) + .AppendASCII("policy_shared_module") + .AppendASCII("update_template.xml"); + + std::string update_xml_path = + "/" + base::FilePath(kTestExtensionsDir).MaybeAsASCII() + + "/policy_shared_module/gen_update.xml"; + RegisterURLReplacingHandler(embedded_test_server(), update_xml_path, + update_xml_template_path); + ASSERT_TRUE(embedded_test_server()->Start()); + + const char kImporterId[] = "pchakhniekfaeoddkifplhnfbffomabh"; + const char kSharedModuleId[] = "nfgclafboonjbiafbllihiailjlhelpm"; + + // Make sure that "import" and "export" are available to these extension IDs + // by mocking the release channel. + extensions::ScopedCurrentChannel channel(version_info::Channel::DEV); + + // Verify that the extensions are not installed initially. + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kImporterId, extensions::ExtensionRegistry::COMPATIBILITY)); + ASSERT_FALSE(registry->GetExtensionById( + kSharedModuleId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // Mock the webstore update URL. This is where the shared module extension + // will be installed from. + GURL update_xml_url = embedded_test_server()->GetURL(update_xml_path); + extension_test_util::SetGalleryUpdateURL(update_xml_url); + ui_test_utils::NavigateToURL(browser(), update_xml_url); + + // Blacklist "*" but force-install the importer extension. The shared module + // should be automatically installed too. + base::ListValue blacklist; + blacklist.AppendString("*"); + base::ListValue forcelist; + forcelist.AppendString( + base::StringPrintf("%s;%s", kImporterId, update_xml_url.spec().c_str())); + PolicyMap policies; + policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + blacklist.CreateDeepCopy(), nullptr); + policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + forcelist.CreateDeepCopy(), nullptr); + + extensions::TestExtensionRegistryObserver observe_importer(registry, + kImporterId); + extensions::TestExtensionRegistryObserver observe_shared_module( + registry, kSharedModuleId); + UpdateProviderPolicy(policies); + observe_importer.WaitForExtensionLoaded(); + observe_shared_module.WaitForExtensionLoaded(); + + // Verify that both extensions got installed. + const extensions::Extension* importer = registry->GetExtensionById( + kImporterId, extensions::ExtensionRegistry::COMPATIBILITY); + ASSERT_TRUE(importer); + EXPECT_EQ(kImporterId, importer->id()); + const extensions::Extension* shared_module = registry->GetExtensionById( + kSharedModuleId, extensions::ExtensionRegistry::COMPATIBILITY); + ASSERT_TRUE(shared_module); + EXPECT_EQ(kSharedModuleId, shared_module->id()); + EXPECT_TRUE(shared_module->is_shared_module()); + + // Verify the dependency. + std::unique_ptr<extensions::ExtensionSet> set = + service->shared_module_service()->GetDependentExtensions(shared_module); + ASSERT_TRUE(set); + EXPECT_EQ(1u, set->size()); + EXPECT_TRUE(set->Contains(importer->id())); + + std::vector<extensions::SharedModuleInfo::ImportInfo> imports = + extensions::SharedModuleInfo::GetImports(importer); + ASSERT_EQ(1u, imports.size()); + EXPECT_EQ(kSharedModuleId, imports[0].extension_id); +} + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallWhitelist) { + // Verifies that the whitelist can open exceptions to the blacklist. + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + ASSERT_FALSE(registry->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + base::ListValue blacklist; + blacklist.AppendString("*"); + base::ListValue whitelist; + whitelist.AppendString(kGoodCrxId); + PolicyMap policies; + policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + blacklist.CreateDeepCopy(), nullptr); + policies.Set(key::kExtensionInstallWhitelist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + whitelist.CreateDeepCopy(), nullptr); + UpdateProviderPolicy(policies); + // "simple_with_icon.crx" is blacklisted. + EXPECT_FALSE(InstallExtension(kSimpleWithIconCrxName)); + EXPECT_FALSE(registry->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + // "good.crx" has a whitelist exception. + const extensions::Extension* good = InstallExtension(kGoodCrxName); + ASSERT_TRUE(good); + EXPECT_EQ(kGoodCrxId, good->id()); + EXPECT_EQ(good, + registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + // The user can also remove this extension. + UninstallExtension(kGoodCrxId, true); +} + +namespace { + +class ExtensionRequestInterceptor { + public: + ExtensionRequestInterceptor() + : interceptor_( + base::BindRepeating(&ExtensionRequestInterceptor::OnRequest, + base::Unretained(this))) {} + + void set_interceptor_hook( + content::URLLoaderInterceptor::InterceptCallback callback) { + callback_ = std::move(callback); + } + + private: + bool OnRequest(content::URLLoaderInterceptor::RequestParams* params) { + if (callback_ && callback_.Run(params)) + return true; + // Mock out requests to the Web Store. + if (params->url_request.url.host() == "clients2.google.com" && + params->url_request.url.path() == "/service/update2/crx") { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good2_update_manifest.xml", + params->client.get()); + return true; + } + + if (params->url_request.url.path() == "/good_update_manifest.xml") { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good2_update_manifest.xml", + params->client.get()); + return true; + } + if (params->url_request.url.path() == "/extensions/good_v1.crx") { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good_v1.crx", params->client.get()); + return true; + } + if (params->url_request.url.path() == "/extensions/good2.crx") { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good2.crx", params->client.get()); + return true; + } + + return false; + } + + content::URLLoaderInterceptor::InterceptCallback callback_; + content::URLLoaderInterceptor interceptor_; +}; + +class MockedInstallationReporterObserver + : public extensions::InstallationReporter::TestObserver { + public: + explicit MockedInstallationReporterObserver(const Profile* profile) + : profile_(profile) {} + ~MockedInstallationReporterObserver() override = default; + + MOCK_METHOD1(ExtensionStageChanged, + void(extensions::InstallationReporter::Stage)); + + void OnExtensionDataChanged( + const extensions::ExtensionId& id, + const Profile* profile, + const extensions::InstallationReporter::InstallationData& data) override { + // For simplicity policies are pushed into all profiles, so we need to track + // only one here. + if (profile != profile_) { + return; + } + if (data.install_stage && stage_ != data.install_stage.value()) { + stage_ = data.install_stage.value(); + ExtensionStageChanged(stage_); + } + } + + private: + extensions::InstallationReporter::Stage stage_ = + extensions::InstallationReporter::Stage::CREATED; + const Profile* profile_; +}; + +} // namespace + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) { + // Verifies that extensions that are force-installed by policies are + // installed and can't be uninstalled. + + ExtensionRequestInterceptor interceptor; + + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // Extensions that are force-installed come from an update URL, which defaults + // to the webstore. Use a test URL for this test with an update manifest + // that includes "good_v1.crx". + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url = + embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); + + // Setting the forcelist extension should install "good_v1.crx". + base::ListValue forcelist; + forcelist.AppendString( + base::StringPrintf("%s;%s", kGoodCrxId, url.spec().c_str())); + PolicyMap policies; + policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + forcelist.CreateDeepCopy(), nullptr); + extensions::TestExtensionRegistryObserver observer(extension_registry()); + MockedInstallationReporterObserver reporter_observer(browser()->profile()); + // CREATED is the default stage in MockedInstallationReporterObserver, so it + // wouldn't be reported here. + Sequence sequence; + EXPECT_CALL( + reporter_observer, + ExtensionStageChanged( + extensions::InstallationReporter::Stage::NOTIFIED_FROM_MANAGEMENT)) + .InSequence(sequence); + EXPECT_CALL( + reporter_observer, + ExtensionStageChanged( + extensions::InstallationReporter::Stage::SEEN_BY_POLICY_LOADER)) + .InSequence(sequence); + EXPECT_CALL( + reporter_observer, + ExtensionStageChanged( + extensions::InstallationReporter::Stage::SEEN_BY_EXTERNAL_PROVIDER)) + .InSequence(sequence); + EXPECT_CALL( + reporter_observer, + ExtensionStageChanged(extensions::InstallationReporter::Stage::PENDING)) + .InSequence(sequence); + EXPECT_CALL(reporter_observer, + ExtensionStageChanged( + extensions::InstallationReporter::Stage::DOWNLOADING)) + .InSequence(sequence); + EXPECT_CALL(reporter_observer, + ExtensionStageChanged( + extensions::InstallationReporter::Stage::INSTALLING)) + .InSequence(sequence); + EXPECT_CALL( + reporter_observer, + ExtensionStageChanged(extensions::InstallationReporter::Stage::COMPLETE)) + .InSequence(sequence); + extensions::InstallationReporter::SetTestObserver(&reporter_observer); + UpdateProviderPolicy(policies); + observer.WaitForExtensionWillBeInstalled(); + extensions::InstallationReporter::SetTestObserver(nullptr); + // Note: Cannot check that the notification details match the expected + // exception, since the details object has already been freed prior to + // the completion of observer.WaitForExtensionWillBeInstalled(). + + EXPECT_TRUE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // The user is not allowed to uninstall force-installed extensions. + UninstallExtension(kGoodCrxId, false); + + scoped_refptr<extensions::UnpackedInstaller> installer = + extensions::UnpackedInstaller::Create(extension_service()); + + // The user is not allowed to load an unpacked extension with the + // same ID as a force-installed extension. + base::FilePath good_extension_path(ui_test_utils::GetTestFilePath( + base::FilePath(kTestExtensionsDir), base::FilePath(kSimpleWithPopupExt))); + content::WindowedNotificationObserver extension_load_error_observer( + extensions::NOTIFICATION_EXTENSION_LOAD_ERROR, + content::NotificationService::AllSources()); + installer->Load(good_extension_path); + extension_load_error_observer.Wait(); + + // Loading other unpacked extensions are not blocked. + scoped_refptr<const extensions::Extension> extension = + LoadUnpackedExtension(kAppUnpackedExt); + ASSERT_TRUE(extension); + + const std::string old_version_number = + registry + ->GetExtensionById(kGoodCrxId, + extensions::ExtensionRegistry::COMPATIBILITY) + ->version() + .GetString(); + + content::WindowedNotificationObserver new_process_observer( + content::NOTIFICATION_RENDERER_PROCESS_CREATED, + content::NotificationService::AllSources()); + + // Updating the force-installed extension. + extensions::ExtensionUpdater* updater = service->updater(); + extensions::ExtensionUpdater::CheckParams params; + params.install_immediately = true; + extensions::TestExtensionRegistryObserver update_observer( + extension_registry()); + updater->CheckNow(std::move(params)); + update_observer.WaitForExtensionWillBeInstalled(); + + const base::Version& new_version = + registry + ->GetExtensionById(kGoodCrxId, + extensions::ExtensionRegistry::COMPATIBILITY) + ->version(); + ASSERT_TRUE(new_version.IsValid()); + base::Version old_version(old_version_number); + ASSERT_TRUE(old_version.IsValid()); + + EXPECT_EQ(1, new_version.CompareTo(old_version)); + + // Wait for the new extension process to launch. + new_process_observer.Wait(); + + // Wait until any background pages belonging to force-installed extensions + // have been loaded. + extensions::ProcessManager* manager = + extensions::ProcessManager::Get(browser()->profile()); + extensions::ProcessManager::FrameSet all_frames = manager->GetAllFrames(); + for (auto iter = all_frames.begin(); iter != all_frames.end();) { + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(*iter); + ASSERT_TRUE(web_contents); + if (!web_contents->IsLoading()) { + ++iter; + } else { + base::RunLoop().RunUntilIdle(); + + // Test activity may have modified the set of extension processes during + // message processing, so re-start the iteration to catch added/removed + // processes. + all_frames = manager->GetAllFrames(); + iter = all_frames.begin(); + } + } + + // Test policy-installed extensions are reloaded when killed. + { + BackgroundContentsService:: + SetRestartDelayForForceInstalledAppsAndExtensionsForTesting(0); + content::WindowedNotificationObserver extension_crashed_observer( + extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, + content::NotificationService::AllSources()); + extensions::TestExtensionRegistryObserver extension_loaded_observer( + extension_registry(), kGoodCrxId); + extensions::ExtensionHost* extension_host = + extensions::ProcessManager::Get(browser()->profile()) + ->GetBackgroundHostForExtension(kGoodCrxId); + content::RenderProcessHost* process = extension_host->render_process_host(); + content::ScopedAllowRendererCrashes allow_renderer_crashes(process); + process->Shutdown(content::RESULT_CODE_KILLED); + extension_crashed_observer.Wait(); + extension_loaded_observer.WaitForExtensionLoaded(); + } +} + +IN_PROC_BROWSER_TEST_F(PolicyTest, + ExtensionInstallForcelist_DefaultedUpdateUrl) { + // Verifies the ExtensionInstallForcelist policy with an empty (defaulted) + // "update" URL. + + ExtensionRequestInterceptor interceptor; + + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // Setting the forcelist extension should install "good_v1.crx". + base::ListValue forcelist; + forcelist.AppendString(kGoodCrxId); + PolicyMap policies; + policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + forcelist.CreateDeepCopy(), nullptr); + extensions::TestExtensionRegistryObserver observer(registry); + UpdateProviderPolicy(policies); + observer.WaitForExtensionWillBeInstalled(); + + EXPECT_TRUE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); +} + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionRecommendedInstallationMode) { + // Verifies that extensions that are recommended-installed by policies are + // installed, can be disabled but not uninstalled. + + ExtensionRequestInterceptor interceptor; + + // Extensions that are force-installed come from an update URL, which defaults + // to the webstore. Use a test URL for this test with an update manifest + // that includes "good_v1.crx". + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url = + embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); + +// Mark as enterprise managed. +#if defined(OS_WIN) + base::win::ScopedDomainStateForTesting scoped_domain(true); +#endif + + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // Setting the forcelist extension should install "good_v1.crx". + base::DictionaryValue dict_value; + dict_value.SetString(std::string(kGoodCrxId) + "." + + extensions::schema_constants::kInstallationMode, + extensions::schema_constants::kNormalInstalled); + dict_value.SetString( + std::string(kGoodCrxId) + "." + extensions::schema_constants::kUpdateUrl, + url.spec()); + PolicyMap policies; + policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + dict_value.CreateDeepCopy(), nullptr); + extensions::TestExtensionRegistryObserver observer(registry); + UpdateProviderPolicy(policies); + observer.WaitForExtensionWillBeInstalled(); + + EXPECT_TRUE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // The user is not allowed to uninstall recommended-installed extensions. + UninstallExtension(kGoodCrxId, false); + + // Explicitly re-enables the extension. + service->EnableExtension(kGoodCrxId); + + // But the user is allowed to disable them. + EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); + DisableExtension(kGoodCrxId); + EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); +} + +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) { + // Verifies that extensions are blocked if policy specifies an allowed types + // list and the extension's type is not on that list. + extensions::ExtensionRegistry* registry = extension_registry(); + ASSERT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + ASSERT_FALSE(registry->GetExtensionById( + kHostedAppCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + base::ListValue allowed_types; + allowed_types.AppendString("hosted_app"); + PolicyMap policies; + policies.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + allowed_types.CreateDeepCopy(), nullptr); + UpdateProviderPolicy(policies); + + // "good.crx" is blocked. + EXPECT_FALSE(InstallExtension(kGoodCrxName)); + EXPECT_FALSE(registry->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // "hosted_app.crx" is of a whitelisted type. + const extensions::Extension* hosted_app = InstallExtension(kHostedAppCrxName); + ASSERT_TRUE(hosted_app); + EXPECT_EQ(kHostedAppCrxId, hosted_app->id()); + EXPECT_EQ(hosted_app, + registry->GetExtensionById( + kHostedAppCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + + // The user can remove the extension. + UninstallExtension(kHostedAppCrxId, true); +} + +// Checks that a click on an extension CRX download triggers the extension +// installation prompt without further user interaction when the source is +// whitelisted by policy. +// Flaky on windows; http://crbug.com/295729 . +#if defined(OS_WIN) +#define MAYBE_ExtensionInstallSources DISABLED_ExtensionInstallSources +#else +#define MAYBE_ExtensionInstallSources ExtensionInstallSources +#endif +IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallSources) { + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); + extensions::ScopedInstallVerifierBypassForTest install_verifier_bypass; + + ASSERT_TRUE(embedded_test_server()->Start()); + + GURL download_page_url = embedded_test_server()->GetURL( + "/policy/extension_install_sources_test.html"); + ui_test_utils::NavigateToURL(browser(), download_page_url); + + const GURL install_source_url( + embedded_test_server()->GetURL("/extensions/*")); + const GURL referrer_url(embedded_test_server()->GetURL("/policy/*")); + + // As long as the policy is not present, extensions are considered dangerous. + content::DownloadTestObserverTerminal download_observer( + content::BrowserContext::GetDownloadManager(browser()->profile()), 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY); + PerformClick(0, 0); + download_observer.WaitForFinished(); + + // Install the policy and trigger another download. + base::ListValue install_sources; + install_sources.AppendString(install_source_url.spec()); + install_sources.AppendString(referrer_url.spec()); + PolicyMap policies; + policies.Set(key::kExtensionInstallSources, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + install_sources.CreateDeepCopy(), nullptr); + UpdateProviderPolicy(policies); + + extensions::TestExtensionRegistryObserver observer(extension_registry()); + PerformClick(1, 0); + observer.WaitForExtensionWillBeInstalled(); + // Note: Cannot check that the notification details match the expected + // exception, since the details object has already been freed prior to + // the completion of observer.WaitForExtensionWillBeInstalled(). + + // The first extension shouldn't be present, the second should be there. + EXPECT_FALSE(extension_registry()->GetExtensionById( + kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); + EXPECT_TRUE(extension_registry()->GetExtensionById( + kSimpleWithIconCrxId, extensions::ExtensionRegistry::ENABLED)); +} + +// Verifies that extensions with version older than the minimum version required +// by policy will get disabled, and will be auto-updated and/or re-enabled upon +// policy changes as well as regular auto-updater scheduled updates. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequired) { + ExtensionRequestInterceptor interceptor; + + base::AtomicRefCount update_extension_count; + base::RunLoop first_update_extension_runloop; + interceptor.set_interceptor_hook(base::BindLambdaForTesting( + [&](content::URLLoaderInterceptor::RequestParams* params) { + if (params->url_request.url.host() != "update.extension") + return false; + + if (!update_extension_count.IsZero() && !update_extension_count.IsOne()) + return false; + + if (update_extension_count.IsZero()) { + content::URLLoaderInterceptor::WriteResponse( + "400 Bad request", std::string(), params->client.get()); + } else { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good2_update_manifest.xml", + params->client.get()); + } + if (update_extension_count.IsZero()) + first_update_extension_runloop.Quit(); + update_extension_count.Increment(); + return true; + })); + + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + extensions::ExtensionPrefs* extension_prefs = + extensions::ExtensionPrefs::Get(browser()->profile()); + + // Install the extension. + EXPECT_TRUE(InstallExtension(kGoodV1CrxName)); + EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); + + // Update policy to set a minimum version of 1.0.0.0, the extension (with + // version 1.0.0.0) should still be enabled. + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.0"); + } + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); + + // Update policy to set a minimum version of 1.0.0.1, the extension (with + // version 1.0.0.0) should now be disabled. + EXPECT_TRUE(update_extension_count.IsZero()); + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.1"); + } + first_update_extension_runloop.Run(); + EXPECT_TRUE(update_extension_count.IsOne()); + + EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); + EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, + extension_prefs->GetDisableReasons(kGoodCrxId)); + + // Provide a new version (1.0.0.1) which is expected to be auto updated to + // via the update URL in the manifest of the older version. + EXPECT_TRUE(update_extension_count.IsOne()); + { + extensions::TestExtensionRegistryObserver update_observer(registry); + service->updater()->CheckSoon(); + update_observer.WaitForExtensionWillBeInstalled(); + } + EXPECT_EQ(2, update_extension_count.SubtleRefCountForDebug()); + + // The extension should be auto-updated to newer version and re-enabled. + EXPECT_EQ("1.0.0.1", + service->GetInstalledExtension(kGoodCrxId)->version().GetString()); + EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); +} + +// Similar to ExtensionMinimumVersionRequired test, but with different settings +// and orders. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequiredAlt) { + ExtensionRequestInterceptor interceptor; + + base::AtomicRefCount update_extension_count; + interceptor.set_interceptor_hook(base::BindLambdaForTesting( + [&](content::URLLoaderInterceptor::RequestParams* params) { + if (params->url_request.url.host() == "update.extension" && + update_extension_count.IsZero()) { + content::URLLoaderInterceptor::WriteResponse( + "chrome/test/data/extensions/good2_update_manifest.xml", + params->client.get()); + update_extension_count.Increment(); + return true; + } + return false; + })); + + extensions::ExtensionService* service = extension_service(); + extensions::ExtensionRegistry* registry = extension_registry(); + extensions::ExtensionPrefs* extension_prefs = + extensions::ExtensionPrefs::Get(browser()->profile()); + + // Set the policy to require an even higher minimum version this time. + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.2"); + } + base::RunLoop().RunUntilIdle(); + + // Install the 1.0.0.0 version, it should be installed but disabled. + EXPECT_TRUE(InstallExtension(kGoodV1CrxName)); + EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); + EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, + extension_prefs->GetDisableReasons(kGoodCrxId)); + EXPECT_EQ("1.0.0.0", + service->GetInstalledExtension(kGoodCrxId)->version().GetString()); + + // An extension management policy update should trigger an update as well. + EXPECT_TRUE(update_extension_count.IsZero()); + { + extensions::TestExtensionRegistryObserver update_observer(registry); + { + // Set a higher minimum version, just intend to trigger a policy update. + extensions::ExtensionManagementPolicyUpdater management_policy( + &provider_); + management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.3"); + } + base::RunLoop().RunUntilIdle(); + update_observer.WaitForExtensionWillBeInstalled(); + } + EXPECT_TRUE(update_extension_count.IsOne()); + + // It should be updated to 1.0.0.1 but remain disabled. + EXPECT_EQ("1.0.0.1", + service->GetInstalledExtension(kGoodCrxId)->version().GetString()); + EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); + EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, + extension_prefs->GetDisableReasons(kGoodCrxId)); + + // Remove the minimum version requirement. The extension should be re-enabled. + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.UnsetMinimumVersionRequired(kGoodCrxId); + } + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); + EXPECT_FALSE(extension_prefs->HasDisableReason( + kGoodCrxId, + extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY)); +} + +// Verifies that a force-installed extension which does not meet a subsequently +// set minimum version requirement is handled well. +IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionForceInstalled) { + ExtensionRequestInterceptor interceptor; + +// Mark as enterprise managed. +#if defined(OS_WIN) + base::win::ScopedDomainStateForTesting scoped_domain(true); +#endif + extensions::ExtensionRegistry* registry = extension_registry(); + extensions::ExtensionPrefs* extension_prefs = + extensions::ExtensionPrefs::Get(browser()->profile()); + + // Prepare the update URL for force installing. + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url = + embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); + + // Set policy to force-install the extension, it should be installed and + // enabled. + extensions::TestExtensionRegistryObserver install_observer(registry); + EXPECT_FALSE(registry->enabled_extensions().Contains(kGoodCrxId)); + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.SetIndividualExtensionAutoInstalled(kGoodCrxId, + url.spec(), true); + } + base::RunLoop().RunUntilIdle(); + install_observer.WaitForExtensionWillBeInstalled(); + + EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); + + // Set policy a minimum version of "1.0.0.1", the extension now should be + // disabled. + { + extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); + management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.1"); + } + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(registry->enabled_extensions().Contains(kGoodCrxId)); + EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); + EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, + extension_prefs->GetDisableReasons(kGoodCrxId)); +} + +// Similar to PolicyTest but sets the WebAppInstallForceList policy before the +// browser is started. +class WebAppInstallForceListPolicyTest : public PolicyTest { + public: + WebAppInstallForceListPolicyTest() {} + ~WebAppInstallForceListPolicyTest() override {} + + void SetUpInProcessBrowserTestFixture() override { + PolicyTest::SetUpInProcessBrowserTestFixture(); + ASSERT_TRUE(embedded_test_server()->Start()); + + policy_app_url_ = + embedded_test_server()->GetURL("/banners/manifest_test_page.html"); + base::Value url(policy_app_url_.spec()); + base::Value launch_container("window"); + + base::Value item(base::Value::Type::DICTIONARY); + item.SetKey("url", std::move(url)); + item.SetKey("default_launch_container", std::move(launch_container)); + + base::Value list(base::Value::Type::LIST); + list.Append(std::move(item)); + + PolicyMap policies; + SetPolicy(&policies, key::kWebAppInstallForceList, + base::Value::ToUniquePtrValue(std::move(list))); + provider_.UpdateChromePolicy(policies); + } + + protected: + GURL policy_app_url_; + + private: + DISALLOW_COPY_AND_ASSIGN(WebAppInstallForceListPolicyTest); +}; + +IN_PROC_BROWSER_TEST_F(WebAppInstallForceListPolicyTest, StartUpInstallation) { + extensions::TestExtensionRegistryObserver observer(extension_registry()); + const extensions::Extension* installed_extension = + observer.WaitForExtensionWillBeInstalled(); + + ASSERT_TRUE(installed_extension); + const GURL installed_app_url = + extensions::AppLaunchInfo::GetFullLaunchURL(installed_extension); + EXPECT_EQ(policy_app_url_, installed_app_url); +} + +} // namespace policy
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 53016eaa..d45a3a3 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -30,7 +30,6 @@ #include "base/metrics/histogram_base.h" #include "base/metrics/histogram_samples.h" #include "base/metrics/statistics_recorder.h" -#include "base/path_service.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/strcat.h" @@ -48,7 +47,6 @@ #include "base/values.h" #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/background/background_contents_service.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/login/test/session_manager_state_waiter.h" @@ -60,17 +58,6 @@ #include "chrome/browser/devtools/devtools_window_testing.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/extensions/api/chrome_extensions_api_client.h" -#include "chrome/browser/extensions/chrome_test_extension_loader.h" -#include "chrome/browser/extensions/crx_installer.h" -#include "chrome/browser/extensions/extension_management_constants.h" -#include "chrome/browser/extensions/extension_management_test_util.h" -#include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/forced_extensions/installation_reporter.h" -#include "chrome/browser/extensions/install_verifier.h" -#include "chrome/browser/extensions/shared_module_service.h" -#include "chrome/browser/extensions/unpacked_installer.h" -#include "chrome/browser/extensions/updater/extension_cache_fake.h" -#include "chrome/browser/extensions/updater/extension_updater.h" #include "chrome/browser/interstitials/security_interstitial_page_test_utils.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_devices_controller.h" @@ -79,6 +66,7 @@ #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/permissions/permission_request_manager.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" +#include "chrome/browser/policy/policy_test_utils.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" @@ -105,15 +93,11 @@ #include "chrome/browser/usb/usb_chooser_context_factory.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_features.h" -#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_constants.h" -#include "chrome/common/extensions/extension_test_util.h" -#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "chrome/common/net/safe_search_util.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" -#include "chrome/common/web_application_info.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/locale_settings.h" @@ -154,7 +138,6 @@ #include "components/search_engines/template_url_service.h" #include "components/security_interstitials/content/security_interstitial_page.h" #include "components/security_interstitials/content/security_interstitial_tab_helper.h" -#include "components/security_interstitials/core/controller_client.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/strings/grit/components_strings.h" #include "components/unified_consent/pref_names.h" @@ -163,7 +146,6 @@ #include "components/update_client/update_client_errors.h" #include "components/user_prefs/user_prefs.h" #include "components/variations/service/variations_service.h" -#include "components/variations/variations_params_manager.h" #include "components/version_info/version_info.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" @@ -190,7 +172,6 @@ #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" #include "content/public/common/network_service_util.h" -#include "content/public/common/result_codes.h" #include "content/public/common/service_names.mojom.h" #include "content/public/common/url_constants.h" #include "content/public/common/web_preferences.h" @@ -207,21 +188,12 @@ #include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "extensions/browser/api/messaging/messaging_delegate.h" #include "extensions/browser/disable_reason.h" -#include "extensions/browser/extension_dialog_auto_confirm.h" -#include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" -#include "extensions/browser/extension_registry.h" -#include "extensions/browser/extension_system.h" #include "extensions/browser/process_manager.h" -#include "extensions/browser/scoped_ignore_content_verifier_for_test.h" -#include "extensions/browser/test_extension_registry_observer.h" #include "extensions/browser/uninstall_reason.h" #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" -#include "extensions/common/features/feature_channel.h" -#include "extensions/common/manifest_handlers/shared_module_info.h" #include "extensions/common/switches.h" -#include "extensions/common/value_builder.h" #include "media/media_buildflags.h" #include "net/base/hash_value.h" #include "net/base/net_errors.h" @@ -244,7 +216,6 @@ #include "services/network/public/cpp/features.h" #include "services/network/public/cpp/network_switches.h" #include "services/network/public/mojom/network_service.mojom.h" -#include "services/network/public/mojom/network_service_test.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -299,10 +270,6 @@ #include "ui/base/window_open_disposition.h" #endif -#if defined(OS_WIN) -#include "base/win/win_util.h" -#endif - #if !defined(OS_ANDROID) #include "chrome/browser/media/router/media_router_feature.h" #include "chrome/browser/profiles/profile_manager.h" @@ -318,7 +285,6 @@ using testing::AtLeast; using testing::Mock; using testing::Return; -using testing::Sequence; using webrtc_event_logging::WebRtcEventLogManager; namespace policy { @@ -337,25 +303,6 @@ // versions. https://crbug.com/619828 const char kCookieOptions[] = ";expires=Wed Jan 01 2038 00:00:00 GMT"; -const base::FilePath::CharType kTestExtensionsDir[] = - FILE_PATH_LITERAL("extensions"); -const base::FilePath::CharType kGoodCrxName[] = FILE_PATH_LITERAL("good.crx"); -const base::FilePath::CharType kSimpleWithIconCrxName[] = - FILE_PATH_LITERAL("simple_with_icon.crx"); -const base::FilePath::CharType kHostedAppCrxName[] = - FILE_PATH_LITERAL("hosted_app.crx"); - -const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; -const char kSimpleWithIconCrxId[] = "dehdlahnlebladnfleagmjdapdjdcnlp"; -const char kHostedAppCrxId[] = "kbmnembihfiondgfjekmnmcbddelicoi"; - -const base::FilePath::CharType kGoodV1CrxName[] = - FILE_PATH_LITERAL("good_v1.crx"); -const base::FilePath::CharType kSimpleWithPopupExt[] = - FILE_PATH_LITERAL("simple_with_popup"); -const base::FilePath::CharType kAppUnpackedExt[] = - FILE_PATH_LITERAL("app"); - const char kAutoplayTestPageURL[] = "/media/autoplay_iframe.html"; #if !defined(OS_MACOSX) @@ -368,11 +315,6 @@ constexpr size_t kWebAppId = 42; -void GetTestDataDirectory(base::FilePath* test_data_directory) { - ASSERT_TRUE( - base::PathService::Get(chrome::DIR_TEST_DATA, test_data_directory)); -} - content::RenderFrameHost* GetMostVisitedIframe(content::WebContents* tab) { for (content::RenderFrameHost* frame : tab->GetAllFrames()) { if (frame->GetFrameName() == "mv-single") @@ -455,37 +397,6 @@ const std::string host_; }; -// Registers a handler to respond to requests whose path matches |match_path|. -// The response contents are generated from |template_file|, by replacing all -// "${URL_PLACEHOLDER}" substrings in the file with the request URL excluding -// filename, query values and fragment. -void RegisterURLReplacingHandler(net::EmbeddedTestServer* test_server, - const std::string& match_path, - const base::FilePath& template_file) { - test_server->RegisterRequestHandler(base::Bind( - [](net::EmbeddedTestServer* test_server, const std::string& match_path, - const base::FilePath& template_file, - const net::test_server::HttpRequest& request) - -> std::unique_ptr<net::test_server::HttpResponse> { - GURL url = test_server->GetURL(request.relative_url); - if (url.path() != match_path) - return nullptr; - - std::string contents; - CHECK(base::ReadFileToString(template_file, &contents)); - - GURL url_base = url.GetWithoutFilename(); - base::ReplaceSubstringsAfterOffset(&contents, 0, "${URL_PLACEHOLDER}", - url_base.spec()); - - auto response = std::make_unique<net::test_server::BasicHttpResponse>(); - response->set_content(contents); - response->set_content_type("text/plain"); - return response; - }, - base::Unretained(test_server), match_path, template_file)); -} - // Verifies that the given url |spec| can be opened. This assumes that |spec| // points at empty.html in the test data dir. void CheckCanOpenURL(Browser* browser, const std::string& spec) { @@ -658,47 +569,6 @@ }; #endif -// This class waits until either a load stops or the WebContents is destroyed. -class WebContentsLoadedOrDestroyedWatcher - : public content::WebContentsObserver { - public: - explicit WebContentsLoadedOrDestroyedWatcher( - content::WebContents* web_contents); - ~WebContentsLoadedOrDestroyedWatcher() override; - - // Waits until the WebContents's load is done or until it is destroyed. - void Wait(); - - // Overridden WebContentsObserver methods. - void WebContentsDestroyed() override; - void DidStopLoading() override; - - private: - scoped_refptr<content::MessageLoopRunner> message_loop_runner_; - - DISALLOW_COPY_AND_ASSIGN(WebContentsLoadedOrDestroyedWatcher); -}; - -WebContentsLoadedOrDestroyedWatcher::WebContentsLoadedOrDestroyedWatcher( - content::WebContents* web_contents) - : content::WebContentsObserver(web_contents), - message_loop_runner_(new content::MessageLoopRunner) { -} - -WebContentsLoadedOrDestroyedWatcher::~WebContentsLoadedOrDestroyedWatcher() {} - -void WebContentsLoadedOrDestroyedWatcher::Wait() { - message_loop_runner_->Run(); -} - -void WebContentsLoadedOrDestroyedWatcher::WebContentsDestroyed() { - message_loop_runner_->Quit(); -} - -void WebContentsLoadedOrDestroyedWatcher::DidStopLoading() { - message_loop_runner_->Quit(); -} - #if !defined(OS_MACOSX) // Observer used to wait for the creation of a new app window. @@ -775,396 +645,6 @@ } // namespace -class PolicyTest : public InProcessBrowserTest { - protected: - PolicyTest() {} - ~PolicyTest() override {} - - void SetUp() override { - test_extension_cache_.reset(new extensions::ExtensionCacheFake()); - InProcessBrowserTest::SetUp(); - } - - void SetUpInProcessBrowserTestFixture() override { - base::CommandLine::ForCurrentProcess()->AppendSwitch("noerrdialogs"); - EXPECT_CALL(provider_, IsInitializationComplete(_)) - .WillRepeatedly(Return(true)); - BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); - } - - void SetUpOnMainThread() override { - host_resolver()->AddRule("*", "127.0.0.1"); - if (extension_service()->updater()) { - extension_service()->updater()->SetExtensionCacheForTesting( - test_extension_cache_.get()); - } - } - - void SetUpCommandLine(base::CommandLine* command_line) override { - variations::testing::VariationParamsManager::AppendVariationParams( - "ReportCertificateErrors", "ShowAndPossiblySend", - {{"sendingThreshold", "1.0"}}, command_line); - } - - void SetScreenshotPolicy(bool enabled) { - PolicyMap policies; - policies.Set(key::kDisableScreenshots, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - std::make_unique<base::Value>(!enabled), nullptr); - UpdateProviderPolicy(policies); - } - - void SetShouldRequireCTForTesting(bool* required) { - if (content::IsOutOfProcessNetworkService()) { - network::mojom::NetworkServiceTestPtr network_service_test; - content::GetSystemConnector()->BindInterface( - content::mojom::kNetworkServiceName, &network_service_test); - network::mojom::NetworkServiceTest::ShouldRequireCT required_ct; - if (!required) { - required_ct = - network::mojom::NetworkServiceTest::ShouldRequireCT::RESET; - } else { - required_ct = - *required - ? network::mojom::NetworkServiceTest::ShouldRequireCT::REQUIRE - : network::mojom::NetworkServiceTest::ShouldRequireCT:: - DONT_REQUIRE; - } - - mojo::ScopedAllowSyncCallForTesting allow_sync_call; - network_service_test->SetShouldRequireCT(required_ct); - return; - } - - base::PostTask( - FROM_HERE, {BrowserThread::IO}, - base::BindOnce( - &net::TransportSecurityState::SetShouldRequireCTForTesting, - required)); - } - -#if defined(OS_CHROMEOS) - class QuitMessageLoopAfterScreenshot - : public ChromeScreenshotGrabberTestObserver { - public: - explicit QuitMessageLoopAfterScreenshot(base::OnceClosure done) - : done_(std::move(done)) {} - void OnScreenshotCompleted( - ui::ScreenshotResult screenshot_result, - const base::FilePath& screenshot_path) override { - base::PostTaskAndReply(FROM_HERE, {BrowserThread::IO}, base::DoNothing(), - std::move(done_)); - } - - ~QuitMessageLoopAfterScreenshot() override {} - - private: - base::OnceClosure done_; - }; - - void TestScreenshotFile(bool enabled) { - base::RunLoop run_loop; - QuitMessageLoopAfterScreenshot observer_(run_loop.QuitClosure()); - - ChromeScreenshotGrabber* grabber = ChromeScreenshotGrabber::Get(); - grabber->test_observer_ = &observer_; - SetScreenshotPolicy(enabled); - grabber->HandleTakeScreenshotForAllRootWindows(); - run_loop.Run(); - - grabber->test_observer_ = nullptr; - } -#endif // defined(OS_CHROMEOS) - - extensions::ExtensionService* extension_service() { - extensions::ExtensionSystem* system = - extensions::ExtensionSystem::Get(browser()->profile()); - return system->extension_service(); - } - - extensions::ExtensionRegistry* extension_registry() { - return extensions::ExtensionRegistry::Get(browser()->profile()); - } - - const extensions::Extension* InstallExtension( - const base::FilePath::StringType& name) { - base::FilePath extension_path(ui_test_utils::GetTestFilePath( - base::FilePath(kTestExtensionsDir), base::FilePath(name))); - scoped_refptr<extensions::CrxInstaller> installer = - extensions::CrxInstaller::CreateSilent(extension_service()); - installer->set_allow_silent_install(true); - installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); - installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE); - installer->set_off_store_install_allow_reason( - extensions::CrxInstaller::OffStoreInstallAllowReason:: - OffStoreInstallAllowedInTest); - - content::WindowedNotificationObserver observer( - extensions::NOTIFICATION_CRX_INSTALLER_DONE, - content::NotificationService::AllSources()); - installer->InstallCrx(extension_path); - observer.Wait(); - content::Details<const extensions::Extension> details = observer.details(); - return details.ptr(); - } - - const extensions::Extension* InstallBookmarkApp() { - WebApplicationInfo web_app; - web_app.title = base::ASCIIToUTF16("Bookmark App"); - web_app.app_url = GURL("http://www.google.com"); - - scoped_refptr<extensions::CrxInstaller> installer = - extensions::CrxInstaller::CreateSilent(extension_service()); - - content::WindowedNotificationObserver observer( - extensions::NOTIFICATION_CRX_INSTALLER_DONE, - content::NotificationService::AllSources()); - installer->InstallWebApp(web_app); - observer.Wait(); - content::Details<const extensions::Extension> details = observer.details(); - return details.ptr(); - } - - scoped_refptr<const extensions::Extension> LoadUnpackedExtension( - const base::FilePath::StringType& name) { - base::FilePath extension_path(ui_test_utils::GetTestFilePath( - base::FilePath(kTestExtensionsDir), base::FilePath(name))); - extensions::ChromeTestExtensionLoader loader(browser()->profile()); - return loader.LoadExtension(extension_path); - } - - void UninstallExtension(const std::string& id, bool expect_success) { - if (expect_success) { - extensions::TestExtensionRegistryObserver observer(extension_registry()); - extension_service()->UninstallExtension( - id, extensions::UNINSTALL_REASON_FOR_TESTING, NULL); - observer.WaitForExtensionUninstalled(); - } else { - content::WindowedNotificationObserver observer( - extensions::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED, - content::NotificationService::AllSources()); - extension_service()->UninstallExtension( - id, - extensions::UNINSTALL_REASON_FOR_TESTING, - NULL); - observer.Wait(); - } - } - - void DisableExtension(const std::string& id) { - extensions::TestExtensionRegistryObserver observer(extension_registry()); - extension_service()->DisableExtension( - id, extensions::disable_reason::DISABLE_USER_ACTION); - observer.WaitForExtensionUnloaded(); - } - - void UpdateProviderPolicy(const PolicyMap& policy) { - PolicyMap policy_with_defaults; - policy_with_defaults.CopyFrom(policy); -#if defined(OS_CHROMEOS) - SetEnterpriseUsersDefaults(&policy_with_defaults); -#endif - provider_.UpdateChromePolicy(policy_with_defaults); - DCHECK(base::MessageLoopCurrent::Get()); - base::RunLoop loop; - loop.RunUntilIdle(); - } - - // Sends a mouse click at the given coordinates to the current renderer. - void PerformClick(int x, int y) { - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - blink::WebMouseEvent click_event( - blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, - blink::WebInputEvent::GetStaticTimeStampForTests()); - click_event.button = blink::WebMouseEvent::Button::kLeft; - click_event.click_count = 1; - click_event.SetPositionInWidget(x, y); - contents->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(click_event); - click_event.SetType(blink::WebInputEvent::kMouseUp); - contents->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(click_event); - } - - void SetPolicy(PolicyMap* policies, - const char* key, - std::unique_ptr<base::Value> value) { - if (value) { - policies->Set(key, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, - POLICY_SOURCE_CLOUD, std::move(value), nullptr); - } else { - policies->Erase(key); - } - } - - void ApplySafeSearchPolicy(std::unique_ptr<base::Value> legacy_safe_search, - std::unique_ptr<base::Value> google_safe_search, - std::unique_ptr<base::Value> legacy_youtube, - std::unique_ptr<base::Value> youtube_restrict) { - PolicyMap policies; - SetPolicy(&policies, key::kForceSafeSearch, std::move(legacy_safe_search)); - SetPolicy(&policies, key::kForceGoogleSafeSearch, - std::move(google_safe_search)); - SetPolicy(&policies, key::kForceYouTubeSafetyMode, - std::move(legacy_youtube)); - SetPolicy(&policies, key::kForceYouTubeRestrict, - std::move(youtube_restrict)); - UpdateProviderPolicy(policies); - } - -#if defined(OS_CHROMEOS) - void SetEnableFlag(const keyboard::KeyboardEnableFlag& flag) { - auto* keyboard_client = ChromeKeyboardControllerClient::Get(); - keyboard_client->SetEnableFlag(flag); - } - - void ClearEnableFlag(const keyboard::KeyboardEnableFlag& flag) { - auto* keyboard_client = ChromeKeyboardControllerClient::Get(); - keyboard_client->ClearEnableFlag(flag); - } -#endif - - static GURL GetExpectedSearchURL(bool expect_safe_search) { - std::string expected_url("http://google.com/"); - if (expect_safe_search) { - expected_url += "?" + - std::string(safe_search_util::kSafeSearchSafeParameter) + - "&" + safe_search_util::kSafeSearchSsuiParameter; - } - return GURL(expected_url); - } - - static void CheckSafeSearch(Browser* browser, - bool expect_safe_search, - const std::string& url = "http://google.com/") { - content::WebContents* web_contents = - browser->tab_strip_model()->GetActiveWebContents(); - content::TestNavigationObserver observer(web_contents); - ui_test_utils::SendToOmniboxAndSubmit(browser, url); - observer.Wait(); - OmniboxEditModel* model = - browser->window()->GetLocationBar()->GetOmniboxView()->model(); - EXPECT_TRUE(model->CurrentMatch(NULL).destination_url.is_valid()); - EXPECT_EQ(GetExpectedSearchURL(expect_safe_search), web_contents->GetURL()); - } - - static void CheckYouTubeRestricted( - int youtube_restrict_mode, - const std::map<GURL, net::HttpRequestHeaders>& urls_requested, - const GURL& url) { - auto iter = urls_requested.find(url); - ASSERT_TRUE(iter != urls_requested.end()); - std::string header; - iter->second.GetHeader(safe_search_util::kYouTubeRestrictHeaderName, - &header); - if (youtube_restrict_mode == safe_search_util::YOUTUBE_RESTRICT_OFF) { - EXPECT_TRUE(header.empty()); - } else if (youtube_restrict_mode == - safe_search_util::YOUTUBE_RESTRICT_MODERATE) { - EXPECT_EQ(header, safe_search_util::kYouTubeRestrictHeaderValueModerate); - } else if (youtube_restrict_mode == - safe_search_util::YOUTUBE_RESTRICT_STRICT) { - EXPECT_EQ(header, safe_search_util::kYouTubeRestrictHeaderValueStrict); - } - } - - static void CheckAllowedDomainsHeader( - const std::string& allowed_domain, - const std::map<GURL, net::HttpRequestHeaders>& urls_requested, - const GURL& url) { - auto iter = urls_requested.find(url); - ASSERT_TRUE(iter != urls_requested.end()); - if (allowed_domain.empty()) { - EXPECT_TRUE( - !iter->second.HasHeader(safe_search_util::kGoogleAppsAllowedDomains)); - return; - } - - std::string header; - iter->second.GetHeader(safe_search_util::kGoogleAppsAllowedDomains, - &header); - EXPECT_EQ(header, allowed_domain); - } - - static bool FetchSubresource(content::WebContents* web_contents, - const GURL& url) { - std::string script( - "var xhr = new XMLHttpRequest();" - "xhr.open('GET', '"); - script += url.spec() + - "', true);" - "xhr.onload = function (e) {" - " if (xhr.readyState === 4) {" - " window.domAutomationController.send(xhr.status === 200);" - " }" - "};" - "xhr.onerror = function () {" - " window.domAutomationController.send(false);" - "};" - "xhr.send(null)"; - bool xhr_result = false; - bool execute_result = - content::ExecuteScriptAndExtractBool(web_contents, script, &xhr_result); - return xhr_result && execute_result; - } - - bool IsShowingInterstitial(content::WebContents* tab) { - security_interstitials::SecurityInterstitialTabHelper* helper = - security_interstitials::SecurityInterstitialTabHelper::FromWebContents( - tab); - if (!helper) { - return false; - } - return helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() != - nullptr; - } - - void WaitForInterstitial(content::WebContents* tab) { - ASSERT_TRUE(IsShowingInterstitial(tab)); - ASSERT_TRUE(WaitForRenderFrameReady(tab->GetMainFrame())); - } - - int IsExtendedReportingCheckboxVisibleOnInterstitial() { - const std::string command = base::StringPrintf( - "var node = document.getElementById('extended-reporting-opt-in');" - "if (node) {" - " window.domAutomationController.send(node.offsetWidth > 0 || " - " node.offsetHeight > 0 ? %d : %d);" - "} else {" - // The node should be present but not visible, so trigger an error - // by sending false if it's not present. - " window.domAutomationController.send(%d);" - "}", - security_interstitials::CMD_TEXT_FOUND, - security_interstitials::CMD_TEXT_NOT_FOUND, - security_interstitials::CMD_ERROR); - - content::WebContents* tab = - browser()->tab_strip_model()->GetActiveWebContents(); - WaitForInterstitial(tab); - int result = 0; - EXPECT_TRUE(content::ExecuteScriptAndExtractInt(tab->GetMainFrame(), - command, &result)); - return result; - } - - void SendInterstitialCommand( - content::WebContents* tab, - security_interstitials::SecurityInterstitialCommand command) { - security_interstitials::SecurityInterstitialTabHelper* helper = - security_interstitials::SecurityInterstitialTabHelper::FromWebContents( - tab); - helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() - ->CommandReceived(base::NumberToString(command)); - return; - } - - MockConfigurationPolicyProvider provider_; - std::unique_ptr<extensions::ExtensionCacheFake> test_extension_cache_; - extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_; - extensions::ExtensionUpdater::ScopedSkipScheduledCheckForTest - skip_scheduled_extension_checks_; -}; - #if defined(OS_WIN) // This policy only exists on Windows. @@ -2148,24 +1628,8 @@ } #if defined(OS_CHROMEOS) -class DrivePolicyTest : public PolicyTest, - public testing::WithParamInterface<bool> { - public: - void SetUpCommandLine(base::CommandLine* command_line) override { - PolicyTest::SetUpCommandLine(command_line); - if (GetParam()) { - scoped_feature_list_.InitAndEnableFeature(chromeos::features::kDriveFs); - } else { - scoped_feature_list_.InitAndDisableFeature(chromeos::features::kDriveFs); - } - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - // Verifies that the download directory can be forced to Google Drive by policy. -IN_PROC_BROWSER_TEST_P(DrivePolicyTest, DownloadDirectory_Drive) { +IN_PROC_BROWSER_TEST_F(PolicyTest, DownloadDirectory_Drive) { // Override the download directory with the policy. { PolicyMap policies; @@ -2198,971 +1662,8 @@ .DownloadPath() .StripTrailingSeparators()); } - -INSTANTIATE_TEST_SUITE_P(DrivePolicyTestInstance, - DrivePolicyTest, - testing::Bool()); - #endif // !defined(OS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSelective) { - // Verifies that blacklisted extensions can't be installed. - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - ASSERT_FALSE(registry->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - base::ListValue blacklist; - blacklist.AppendString(kGoodCrxId); - PolicyMap policies; - policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - blacklist.CreateDeepCopy(), nullptr); - UpdateProviderPolicy(policies); - - // "good.crx" is blacklisted. - EXPECT_FALSE(InstallExtension(kGoodCrxName)); - EXPECT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // "simple_with_icon.crx" is not. - const extensions::Extension* simple_with_icon = - InstallExtension(kSimpleWithIconCrxName); - ASSERT_TRUE(simple_with_icon); - EXPECT_EQ(kSimpleWithIconCrxId, simple_with_icon->id()); - EXPECT_EQ( - simple_with_icon, - registry->GetExtensionById(kSimpleWithIconCrxId, - extensions::ExtensionRegistry::COMPATIBILITY)); -} - -// Ensure that bookmark apps are not blocked by the ExtensionInstallBlacklist -// policy. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklist_BookmarkApp) { - const extensions::Extension* bookmark_app = InstallBookmarkApp(); - ASSERT_TRUE(bookmark_app); - EXPECT_TRUE(InstallExtension(kGoodCrxName)); - - extensions::ExtensionService* service = extension_service(); - EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); - - // Now set ExtensionInstallBlacklist policy to block all extensions. - PolicyMap policies; - policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - extensions::ListBuilder().Append("*").Build(), nullptr); - UpdateProviderPolicy(policies); - - // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. - EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); -} - -// Ensure that when INSTALLATION_REMOVED is set -// that blacklisted extensions are removed from the device. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallRemovedPolicy) { - EXPECT_TRUE(InstallExtension(kGoodCrxName)); - - extensions::ExtensionService* service = extension_service(); - EXPECT_TRUE(service->GetInstalledExtension(kGoodCrxId)); - - // Should uninstall good_v1.crx. - base::DictionaryValue dict_value; - dict_value.SetString(std::string(kGoodCrxId) + "." + - extensions::schema_constants::kInstallationMode, - extensions::schema_constants::kRemoved); - PolicyMap policies; - policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - dict_value.CreateDeepCopy(), nullptr); - extensions::TestExtensionRegistryObserver observer(extension_registry()); - UpdateProviderPolicy(policies); - observer.WaitForExtensionUnloaded(); - - EXPECT_FALSE(service->GetInstalledExtension(kGoodCrxId)); -} - -// Ensure that when INSTALLATION_REMOVED is set for wildcard -// that blacklisted extensions are removed from the device. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionWildcardRemovedPolicy) { - EXPECT_TRUE(InstallExtension(kGoodCrxName)); - - extensions::ExtensionService* service = extension_service(); - EXPECT_TRUE(service->GetInstalledExtension(kGoodCrxId)); - - // Should uninstall good_v1.crx. - base::DictionaryValue dict_value; - dict_value.SetString( - std::string("*") + "." + extensions::schema_constants::kInstallationMode, - extensions::schema_constants::kRemoved); - PolicyMap policies; - policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - dict_value.CreateDeepCopy(), nullptr); - extensions::TestExtensionRegistryObserver observer(extension_registry()); - UpdateProviderPolicy(policies); - observer.WaitForExtensionUnloaded(); - - EXPECT_FALSE(service->GetInstalledExtension(kGoodCrxId)); -} - -// Ensure that bookmark apps are not blocked by the ExtensionAllowedTypes -// policy. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes_BookmarkApp) { - const extensions::Extension* bookmark_app = InstallBookmarkApp(); - ASSERT_TRUE(bookmark_app); - EXPECT_TRUE(InstallExtension(kGoodCrxName)); - - extensions::ExtensionService* service = extension_service(); - EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); - - // Now set policy to only allow themes. Note: Bookmark apps are hosted - // apps. - PolicyMap policies; - policies.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - extensions::ListBuilder().Append("theme").Build(), nullptr); - UpdateProviderPolicy(policies); - - // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. - EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); -} - -// Ensure that bookmark apps are not blocked by the ExtensionSettings -// policy. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionSettings_BookmarkApp) { - const extensions::Extension* bookmark_app = InstallBookmarkApp(); - ASSERT_TRUE(bookmark_app); - EXPECT_TRUE(InstallExtension(kGoodCrxName)); - - extensions::ExtensionService* service = extension_service(); - EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); - - // Now set policy to block all extensions. - PolicyMap policies; - policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - extensions::DictionaryBuilder() - .Set("*", extensions::DictionaryBuilder() - .Set("installation_mode", "blocked") - .Build()) - .Build(), - nullptr); - UpdateProviderPolicy(policies); - - // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. - EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); - - // Clear all policies. - policies.Clear(); - UpdateProviderPolicy(policies); - - EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); - - // Now set policy to only allow themes. Note: Bookmark apps are hosted - // apps. - policies.Set( - key::kExtensionSettings, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, - POLICY_SOURCE_CLOUD, - extensions::DictionaryBuilder() - .Set("*", extensions::DictionaryBuilder() - .Set("allowed_types", - extensions::ListBuilder().Append("theme").Build()) - .Build()) - .Build(), - nullptr); - UpdateProviderPolicy(policies); - - // The bookmark app should still be enabled, with |kGoodCrxId| being disabled. - EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); - EXPECT_TRUE(service->IsExtensionEnabled(bookmark_app->id())); -} - -// Flaky on windows; http://crbug.com/307994. -#if defined(OS_WIN) -#define MAYBE_ExtensionInstallBlacklistWildcard DISABLED_ExtensionInstallBlacklistWildcard -#else -#define MAYBE_ExtensionInstallBlacklistWildcard ExtensionInstallBlacklistWildcard -#endif -IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallBlacklistWildcard) { - // Verify that a wildcard blacklist takes effect. - EXPECT_TRUE(InstallExtension(kSimpleWithIconCrxName)); - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - ASSERT_TRUE(registry->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - base::ListValue blacklist; - blacklist.AppendString("*"); - PolicyMap policies; - policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - blacklist.CreateDeepCopy(), nullptr); - UpdateProviderPolicy(policies); - - // "simple_with_icon" should be disabled. - EXPECT_TRUE(registry->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - EXPECT_FALSE(service->IsExtensionEnabled(kSimpleWithIconCrxId)); - - // It shouldn't be possible to re-enable "simple_with_icon", until it - // satisfies management policy. - service->EnableExtension(kSimpleWithIconCrxId); - EXPECT_FALSE(service->IsExtensionEnabled(kSimpleWithIconCrxId)); - - // It shouldn't be possible to install good.crx. - EXPECT_FALSE(InstallExtension(kGoodCrxName)); - EXPECT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); -} - -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSharedModules) { - // Verifies that shared_modules are not affected by the blacklist. - - base::FilePath base_path; - GetTestDataDirectory(&base_path); - base::FilePath update_xml_template_path = - base_path.Append(kTestExtensionsDir) - .AppendASCII("policy_shared_module") - .AppendASCII("update_template.xml"); - - std::string update_xml_path = - "/" + base::FilePath(kTestExtensionsDir).MaybeAsASCII() + - "/policy_shared_module/gen_update.xml"; - RegisterURLReplacingHandler(embedded_test_server(), update_xml_path, - update_xml_template_path); - ASSERT_TRUE(embedded_test_server()->Start()); - - const char kImporterId[] = "pchakhniekfaeoddkifplhnfbffomabh"; - const char kSharedModuleId[] = "nfgclafboonjbiafbllihiailjlhelpm"; - - // Make sure that "import" and "export" are available to these extension IDs - // by mocking the release channel. - extensions::ScopedCurrentChannel channel(version_info::Channel::DEV); - - // Verify that the extensions are not installed initially. - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kImporterId, extensions::ExtensionRegistry::COMPATIBILITY)); - ASSERT_FALSE(registry->GetExtensionById( - kSharedModuleId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // Mock the webstore update URL. This is where the shared module extension - // will be installed from. - GURL update_xml_url = embedded_test_server()->GetURL(update_xml_path); - extension_test_util::SetGalleryUpdateURL(update_xml_url); - ui_test_utils::NavigateToURL(browser(), update_xml_url); - - // Blacklist "*" but force-install the importer extension. The shared module - // should be automatically installed too. - base::ListValue blacklist; - blacklist.AppendString("*"); - base::ListValue forcelist; - forcelist.AppendString( - base::StringPrintf("%s;%s", kImporterId, update_xml_url.spec().c_str())); - PolicyMap policies; - policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - blacklist.CreateDeepCopy(), nullptr); - policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - forcelist.CreateDeepCopy(), nullptr); - - extensions::TestExtensionRegistryObserver observe_importer( - registry, kImporterId); - extensions::TestExtensionRegistryObserver observe_shared_module( - registry, kSharedModuleId); - UpdateProviderPolicy(policies); - observe_importer.WaitForExtensionLoaded(); - observe_shared_module.WaitForExtensionLoaded(); - - // Verify that both extensions got installed. - const extensions::Extension* importer = registry->GetExtensionById( - kImporterId, extensions::ExtensionRegistry::COMPATIBILITY); - ASSERT_TRUE(importer); - EXPECT_EQ(kImporterId, importer->id()); - const extensions::Extension* shared_module = registry->GetExtensionById( - kSharedModuleId, extensions::ExtensionRegistry::COMPATIBILITY); - ASSERT_TRUE(shared_module); - EXPECT_EQ(kSharedModuleId, shared_module->id()); - EXPECT_TRUE(shared_module->is_shared_module()); - - // Verify the dependency. - std::unique_ptr<extensions::ExtensionSet> set = - service->shared_module_service()->GetDependentExtensions(shared_module); - ASSERT_TRUE(set); - EXPECT_EQ(1u, set->size()); - EXPECT_TRUE(set->Contains(importer->id())); - - std::vector<extensions::SharedModuleInfo::ImportInfo> imports = - extensions::SharedModuleInfo::GetImports(importer); - ASSERT_EQ(1u, imports.size()); - EXPECT_EQ(kSharedModuleId, imports[0].extension_id); -} - -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallWhitelist) { - // Verifies that the whitelist can open exceptions to the blacklist. - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - ASSERT_FALSE(registry->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - base::ListValue blacklist; - blacklist.AppendString("*"); - base::ListValue whitelist; - whitelist.AppendString(kGoodCrxId); - PolicyMap policies; - policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - blacklist.CreateDeepCopy(), nullptr); - policies.Set(key::kExtensionInstallWhitelist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - whitelist.CreateDeepCopy(), nullptr); - UpdateProviderPolicy(policies); - // "simple_with_icon.crx" is blacklisted. - EXPECT_FALSE(InstallExtension(kSimpleWithIconCrxName)); - EXPECT_FALSE(registry->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - // "good.crx" has a whitelist exception. - const extensions::Extension* good = InstallExtension(kGoodCrxName); - ASSERT_TRUE(good); - EXPECT_EQ(kGoodCrxId, good->id()); - EXPECT_EQ(good, - registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - // The user can also remove this extension. - UninstallExtension(kGoodCrxId, true); -} - -namespace { - -class ExtensionRequestInterceptor { - public: - ExtensionRequestInterceptor() - : interceptor_( - base::BindRepeating(&ExtensionRequestInterceptor::OnRequest, - base::Unretained(this))) {} - - void set_interceptor_hook( - content::URLLoaderInterceptor::InterceptCallback callback) { - callback_ = std::move(callback); - } - - private: - bool OnRequest(content::URLLoaderInterceptor::RequestParams* params) { - if (callback_ && callback_.Run(params)) - return true; - // Mock out requests to the Web Store. - if (params->url_request.url.host() == "clients2.google.com" && - params->url_request.url.path() == "/service/update2/crx") { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good2_update_manifest.xml", - params->client.get()); - return true; - } - - if (params->url_request.url.path() == "/good_update_manifest.xml") { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good2_update_manifest.xml", - params->client.get()); - return true; - } - if (params->url_request.url.path() == "/extensions/good_v1.crx") { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good_v1.crx", params->client.get()); - return true; - } - if (params->url_request.url.path() == "/extensions/good2.crx") { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good2.crx", params->client.get()); - return true; - } - - return false; - } - - content::URLLoaderInterceptor::InterceptCallback callback_; - content::URLLoaderInterceptor interceptor_; -}; - -class MockedInstallationReporterObserver - : public extensions::InstallationReporter::TestObserver { - public: - explicit MockedInstallationReporterObserver(const Profile* profile) - : profile_(profile) {} - ~MockedInstallationReporterObserver() override = default; - - MOCK_METHOD1(ExtensionStageChanged, - void(extensions::InstallationReporter::Stage)); - - void OnExtensionDataChanged( - const extensions::ExtensionId& id, - const Profile* profile, - const extensions::InstallationReporter::InstallationData& data) override { - // For simplicity policies are pushed into all profiles, so we need to track - // only one here. - if (profile != profile_) { - return; - } - if (data.install_stage && stage_ != data.install_stage.value()) { - stage_ = data.install_stage.value(); - ExtensionStageChanged(stage_); - } - } - - private: - extensions::InstallationReporter::Stage stage_ = - extensions::InstallationReporter::Stage::CREATED; - const Profile* profile_; -}; - -} // namespace - -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) { - // Verifies that extensions that are force-installed by policies are - // installed and can't be uninstalled. - - ExtensionRequestInterceptor interceptor; - - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // Extensions that are force-installed come from an update URL, which defaults - // to the webstore. Use a test URL for this test with an update manifest - // that includes "good_v1.crx". - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url = - embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); - - // Setting the forcelist extension should install "good_v1.crx". - base::ListValue forcelist; - forcelist.AppendString( - base::StringPrintf("%s;%s", kGoodCrxId, url.spec().c_str())); - PolicyMap policies; - policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - forcelist.CreateDeepCopy(), nullptr); - extensions::TestExtensionRegistryObserver observer(extension_registry()); - MockedInstallationReporterObserver reporter_observer(browser()->profile()); - // CREATED is the default stage in MockedInstallationReporterObserver, so it - // wouldn't be reported here. - Sequence sequence; - EXPECT_CALL( - reporter_observer, - ExtensionStageChanged( - extensions::InstallationReporter::Stage::NOTIFIED_FROM_MANAGEMENT)) - .InSequence(sequence); - EXPECT_CALL( - reporter_observer, - ExtensionStageChanged( - extensions::InstallationReporter::Stage::SEEN_BY_POLICY_LOADER)) - .InSequence(sequence); - EXPECT_CALL( - reporter_observer, - ExtensionStageChanged( - extensions::InstallationReporter::Stage::SEEN_BY_EXTERNAL_PROVIDER)) - .InSequence(sequence); - EXPECT_CALL( - reporter_observer, - ExtensionStageChanged(extensions::InstallationReporter::Stage::PENDING)) - .InSequence(sequence); - EXPECT_CALL(reporter_observer, - ExtensionStageChanged( - extensions::InstallationReporter::Stage::DOWNLOADING)) - .InSequence(sequence); - EXPECT_CALL(reporter_observer, - ExtensionStageChanged( - extensions::InstallationReporter::Stage::INSTALLING)) - .InSequence(sequence); - EXPECT_CALL( - reporter_observer, - ExtensionStageChanged(extensions::InstallationReporter::Stage::COMPLETE)) - .InSequence(sequence); - extensions::InstallationReporter::SetTestObserver(&reporter_observer); - UpdateProviderPolicy(policies); - observer.WaitForExtensionWillBeInstalled(); - extensions::InstallationReporter::SetTestObserver(nullptr); - // Note: Cannot check that the notification details match the expected - // exception, since the details object has already been freed prior to - // the completion of observer.WaitForExtensionWillBeInstalled(). - - EXPECT_TRUE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // The user is not allowed to uninstall force-installed extensions. - UninstallExtension(kGoodCrxId, false); - - scoped_refptr<extensions::UnpackedInstaller> installer = - extensions::UnpackedInstaller::Create(extension_service()); - - // The user is not allowed to load an unpacked extension with the - // same ID as a force-installed extension. - base::FilePath good_extension_path(ui_test_utils::GetTestFilePath( - base::FilePath(kTestExtensionsDir), base::FilePath(kSimpleWithPopupExt))); - content::WindowedNotificationObserver extension_load_error_observer( - extensions::NOTIFICATION_EXTENSION_LOAD_ERROR, - content::NotificationService::AllSources()); - installer->Load(good_extension_path); - extension_load_error_observer.Wait(); - - // Loading other unpacked extensions are not blocked. - scoped_refptr<const extensions::Extension> extension = - LoadUnpackedExtension(kAppUnpackedExt); - ASSERT_TRUE(extension); - - const std::string old_version_number = - registry - ->GetExtensionById(kGoodCrxId, - extensions::ExtensionRegistry::COMPATIBILITY) - ->version() - .GetString(); - - content::WindowedNotificationObserver new_process_observer( - content::NOTIFICATION_RENDERER_PROCESS_CREATED, - content::NotificationService::AllSources()); - - // Updating the force-installed extension. - extensions::ExtensionUpdater* updater = service->updater(); - extensions::ExtensionUpdater::CheckParams params; - params.install_immediately = true; - extensions::TestExtensionRegistryObserver update_observer( - extension_registry()); - updater->CheckNow(std::move(params)); - update_observer.WaitForExtensionWillBeInstalled(); - - const base::Version& new_version = - registry - ->GetExtensionById(kGoodCrxId, - extensions::ExtensionRegistry::COMPATIBILITY) - ->version(); - ASSERT_TRUE(new_version.IsValid()); - base::Version old_version(old_version_number); - ASSERT_TRUE(old_version.IsValid()); - - EXPECT_EQ(1, new_version.CompareTo(old_version)); - - // Wait for the new extension process to launch. - new_process_observer.Wait(); - - // Wait until any background pages belonging to force-installed extensions - // have been loaded. - extensions::ProcessManager* manager = - extensions::ProcessManager::Get(browser()->profile()); - extensions::ProcessManager::FrameSet all_frames = manager->GetAllFrames(); - for (auto iter = all_frames.begin(); iter != all_frames.end();) { - content::WebContents* web_contents = - content::WebContents::FromRenderFrameHost(*iter); - ASSERT_TRUE(web_contents); - if (!web_contents->IsLoading()) { - ++iter; - } else { - WebContentsLoadedOrDestroyedWatcher(web_contents).Wait(); - - // Test activity may have modified the set of extension processes during - // message processing, so re-start the iteration to catch added/removed - // processes. - all_frames = manager->GetAllFrames(); - iter = all_frames.begin(); - } - } - - // Test policy-installed extensions are reloaded when killed. - { - BackgroundContentsService:: - SetRestartDelayForForceInstalledAppsAndExtensionsForTesting(0); - content::WindowedNotificationObserver extension_crashed_observer( - extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, - content::NotificationService::AllSources()); - extensions::TestExtensionRegistryObserver extension_loaded_observer( - extension_registry(), kGoodCrxId); - extensions::ExtensionHost* extension_host = - extensions::ProcessManager::Get(browser()->profile()) - ->GetBackgroundHostForExtension(kGoodCrxId); - content::RenderProcessHost* process = extension_host->render_process_host(); - content::ScopedAllowRendererCrashes allow_renderer_crashes(process); - process->Shutdown(content::RESULT_CODE_KILLED); - extension_crashed_observer.Wait(); - extension_loaded_observer.WaitForExtensionLoaded(); - } -} - -IN_PROC_BROWSER_TEST_F(PolicyTest, - ExtensionInstallForcelist_DefaultedUpdateUrl) { - // Verifies the ExtensionInstallForcelist policy with an empty (defaulted) - // "update" URL. - - ExtensionRequestInterceptor interceptor; - - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // Setting the forcelist extension should install "good_v1.crx". - base::ListValue forcelist; - forcelist.AppendString(kGoodCrxId); - PolicyMap policies; - policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - forcelist.CreateDeepCopy(), nullptr); - extensions::TestExtensionRegistryObserver observer(registry); - UpdateProviderPolicy(policies); - observer.WaitForExtensionWillBeInstalled(); - - EXPECT_TRUE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); -} - -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionRecommendedInstallationMode) { - // Verifies that extensions that are recommended-installed by policies are - // installed, can be disabled but not uninstalled. - - ExtensionRequestInterceptor interceptor; - - // Extensions that are force-installed come from an update URL, which defaults - // to the webstore. Use a test URL for this test with an update manifest - // that includes "good_v1.crx". - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url = - embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); - -// Mark as enterprise managed. -#if defined(OS_WIN) - base::win::ScopedDomainStateForTesting scoped_domain(true); -#endif - - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // Setting the forcelist extension should install "good_v1.crx". - base::DictionaryValue dict_value; - dict_value.SetString(std::string(kGoodCrxId) + "." + - extensions::schema_constants::kInstallationMode, - extensions::schema_constants::kNormalInstalled); - dict_value.SetString( - std::string(kGoodCrxId) + "." + extensions::schema_constants::kUpdateUrl, - url.spec()); - PolicyMap policies; - policies.Set(key::kExtensionSettings, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - dict_value.CreateDeepCopy(), nullptr); - extensions::TestExtensionRegistryObserver observer(registry); - UpdateProviderPolicy(policies); - observer.WaitForExtensionWillBeInstalled(); - - EXPECT_TRUE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // The user is not allowed to uninstall recommended-installed extensions. - UninstallExtension(kGoodCrxId, false); - - // Explictly re-enables the extension. - service->EnableExtension(kGoodCrxId); - - // But the user is allowed to disable them. - EXPECT_TRUE(service->IsExtensionEnabled(kGoodCrxId)); - DisableExtension(kGoodCrxId); - EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId)); -} - -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) { - // Verifies that extensions are blocked if policy specifies an allowed types - // list and the extension's type is not on that list. - extensions::ExtensionRegistry* registry = extension_registry(); - ASSERT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - ASSERT_FALSE(registry->GetExtensionById( - kHostedAppCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - base::ListValue allowed_types; - allowed_types.AppendString("hosted_app"); - PolicyMap policies; - policies.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - allowed_types.CreateDeepCopy(), nullptr); - UpdateProviderPolicy(policies); - - // "good.crx" is blocked. - EXPECT_FALSE(InstallExtension(kGoodCrxName)); - EXPECT_FALSE(registry->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // "hosted_app.crx" is of a whitelisted type. - const extensions::Extension* hosted_app = InstallExtension(kHostedAppCrxName); - ASSERT_TRUE(hosted_app); - EXPECT_EQ(kHostedAppCrxId, hosted_app->id()); - EXPECT_EQ(hosted_app, - registry->GetExtensionById( - kHostedAppCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - - // The user can remove the extension. - UninstallExtension(kHostedAppCrxId, true); -} - -// Checks that a click on an extension CRX download triggers the extension -// installation prompt without further user interaction when the source is -// whitelisted by policy. -// Flaky on windows; http://crbug.com/295729 . -#if defined(OS_WIN) -#define MAYBE_ExtensionInstallSources DISABLED_ExtensionInstallSources -#else -#define MAYBE_ExtensionInstallSources ExtensionInstallSources -#endif -IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallSources) { - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT); - extensions::ScopedInstallVerifierBypassForTest install_verifier_bypass; - - ASSERT_TRUE(embedded_test_server()->Start()); - - GURL download_page_url = embedded_test_server()->GetURL( - "/policy/extension_install_sources_test.html"); - ui_test_utils::NavigateToURL(browser(), download_page_url); - - const GURL install_source_url( - embedded_test_server()->GetURL("/extensions/*")); - const GURL referrer_url(embedded_test_server()->GetURL("/policy/*")); - - // As long as the policy is not present, extensions are considered dangerous. - content::DownloadTestObserverTerminal download_observer( - content::BrowserContext::GetDownloadManager(browser()->profile()), 1, - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY); - PerformClick(0, 0); - download_observer.WaitForFinished(); - - // Install the policy and trigger another download. - base::ListValue install_sources; - install_sources.AppendString(install_source_url.spec()); - install_sources.AppendString(referrer_url.spec()); - PolicyMap policies; - policies.Set(key::kExtensionInstallSources, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, - install_sources.CreateDeepCopy(), nullptr); - UpdateProviderPolicy(policies); - - extensions::TestExtensionRegistryObserver observer(extension_registry()); - PerformClick(1, 0); - observer.WaitForExtensionWillBeInstalled(); - // Note: Cannot check that the notification details match the expected - // exception, since the details object has already been freed prior to - // the completion of observer.WaitForExtensionWillBeInstalled(). - - // The first extension shouldn't be present, the second should be there. - EXPECT_FALSE(extension_registry()->GetExtensionById( - kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY)); - EXPECT_TRUE(extension_registry()->GetExtensionById( - kSimpleWithIconCrxId, extensions::ExtensionRegistry::ENABLED)); -} - -// Verifies that extensions with version older than the minimum version required -// by policy will get disabled, and will be auto-updated and/or re-enabled upon -// policy changes as well as regular auto-updater scheduled updates. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequired) { - ExtensionRequestInterceptor interceptor; - - base::AtomicRefCount update_extension_count; - base::RunLoop first_update_extension_runloop; - interceptor.set_interceptor_hook(base::BindLambdaForTesting( - [&](content::URLLoaderInterceptor::RequestParams* params) { - if (params->url_request.url.host() != "update.extension") - return false; - - if (!update_extension_count.IsZero() && !update_extension_count.IsOne()) - return false; - - if (update_extension_count.IsZero()) { - content::URLLoaderInterceptor::WriteResponse( - "400 Bad request", std::string(), params->client.get()); - } else { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good2_update_manifest.xml", - params->client.get()); - } - if (update_extension_count.IsZero()) - first_update_extension_runloop.Quit(); - update_extension_count.Increment(); - return true; - })); - - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - extensions::ExtensionPrefs* extension_prefs = - extensions::ExtensionPrefs::Get(browser()->profile()); - - // Install the extension. - EXPECT_TRUE(InstallExtension(kGoodV1CrxName)); - EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); - - // Update policy to set a minimum version of 1.0.0.0, the extension (with - // version 1.0.0.0) should still be enabled. - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.0"); - } - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); - - // Update policy to set a minimum version of 1.0.0.1, the extension (with - // version 1.0.0.0) should now be disabled. - EXPECT_TRUE(update_extension_count.IsZero()); - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.1"); - } - first_update_extension_runloop.Run(); - EXPECT_TRUE(update_extension_count.IsOne()); - - EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); - EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, - extension_prefs->GetDisableReasons(kGoodCrxId)); - - // Provide a new version (1.0.0.1) which is expected to be auto updated to - // via the update URL in the manifest of the older version. - EXPECT_TRUE(update_extension_count.IsOne()); - { - extensions::TestExtensionRegistryObserver update_observer(registry); - service->updater()->CheckSoon(); - update_observer.WaitForExtensionWillBeInstalled(); - } - EXPECT_EQ(2, update_extension_count.SubtleRefCountForDebug()); - - // The extension should be auto-updated to newer version and re-enabled. - EXPECT_EQ("1.0.0.1", - service->GetInstalledExtension(kGoodCrxId)->version().GetString()); - EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); -} - -// Similar to ExtensionMinimumVersionRequired test, but with different settings -// and orders. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequiredAlt) { - ExtensionRequestInterceptor interceptor; - - base::AtomicRefCount update_extension_count; - interceptor.set_interceptor_hook(base::BindLambdaForTesting( - [&](content::URLLoaderInterceptor::RequestParams* params) { - if (params->url_request.url.host() == "update.extension" && - update_extension_count.IsZero()) { - content::URLLoaderInterceptor::WriteResponse( - "chrome/test/data/extensions/good2_update_manifest.xml", - params->client.get()); - update_extension_count.Increment(); - return true; - } - return false; - })); - - extensions::ExtensionService* service = extension_service(); - extensions::ExtensionRegistry* registry = extension_registry(); - extensions::ExtensionPrefs* extension_prefs = - extensions::ExtensionPrefs::Get(browser()->profile()); - - // Set the policy to require an even higher minimum version this time. - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.2"); - } - base::RunLoop().RunUntilIdle(); - - // Install the 1.0.0.0 version, it should be installed but disabled. - EXPECT_TRUE(InstallExtension(kGoodV1CrxName)); - EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); - EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, - extension_prefs->GetDisableReasons(kGoodCrxId)); - EXPECT_EQ("1.0.0.0", - service->GetInstalledExtension(kGoodCrxId)->version().GetString()); - - // An extension management policy update should trigger an update as well. - EXPECT_TRUE(update_extension_count.IsZero()); - { - extensions::TestExtensionRegistryObserver update_observer(registry); - { - // Set a higher minimum version, just intend to trigger a policy update. - extensions::ExtensionManagementPolicyUpdater management_policy( - &provider_); - management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.3"); - } - base::RunLoop().RunUntilIdle(); - update_observer.WaitForExtensionWillBeInstalled(); - } - EXPECT_TRUE(update_extension_count.IsOne()); - - // It should be updated to 1.0.0.1 but remain disabled. - EXPECT_EQ("1.0.0.1", - service->GetInstalledExtension(kGoodCrxId)->version().GetString()); - EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); - EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, - extension_prefs->GetDisableReasons(kGoodCrxId)); - - // Remove the minimum version requirement. The extension should be re-enabled. - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.UnsetMinimumVersionRequired(kGoodCrxId); - } - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); - EXPECT_FALSE(extension_prefs->HasDisableReason( - kGoodCrxId, - extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY)); -} - -// Verifies that a force-installed extension which does not meet a subsequently -// set minimum version requirement is handled well. -IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionForceInstalled) { - ExtensionRequestInterceptor interceptor; - -// Mark as enterprise managed. -#if defined(OS_WIN) - base::win::ScopedDomainStateForTesting scoped_domain(true); -#endif - extensions::ExtensionRegistry* registry = extension_registry(); - extensions::ExtensionPrefs* extension_prefs = - extensions::ExtensionPrefs::Get(browser()->profile()); - - // Prepare the update URL for force installing. - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url = - embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml"); - - // Set policy to force-install the extension, it should be installed and - // enabled. - extensions::TestExtensionRegistryObserver install_observer(registry); - EXPECT_FALSE(registry->enabled_extensions().Contains(kGoodCrxId)); - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.SetIndividualExtensionAutoInstalled(kGoodCrxId, - url.spec(), true); - } - base::RunLoop().RunUntilIdle(); - install_observer.WaitForExtensionWillBeInstalled(); - - EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId)); - - // Set policy a minimum version of "1.0.0.1", the extension now should be - // disabled. - { - extensions::ExtensionManagementPolicyUpdater management_policy(&provider_); - management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.1"); - } - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(registry->enabled_extensions().Contains(kGoodCrxId)); - EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId)); - EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY, - extension_prefs->GetDisableReasons(kGoodCrxId)); -} - IN_PROC_BROWSER_TEST_F(PolicyTest, HomepageLocation) { // Verifies that the homepage can be configured with policies. // Set a default, and check that the home button navigates there. @@ -6955,53 +5456,6 @@ EXPECT_EQ(JSIncrementerFetch(contents), 3); } -// Similar to PolicyTest but sets the WebAppInstallForceList policy before the -// browser is started. -class WebAppInstallForceListPolicyTest : public PolicyTest { - public: - WebAppInstallForceListPolicyTest() {} - ~WebAppInstallForceListPolicyTest() override {} - - void SetUpInProcessBrowserTestFixture() override { - PolicyTest::SetUpInProcessBrowserTestFixture(); - ASSERT_TRUE(embedded_test_server()->Start()); - - policy_app_url_ = - embedded_test_server()->GetURL("/banners/manifest_test_page.html"); - base::Value url(policy_app_url_.spec()); - base::Value launch_container("window"); - - base::Value item(base::Value::Type::DICTIONARY); - item.SetKey("url", std::move(url)); - item.SetKey("default_launch_container", std::move(launch_container)); - - base::Value list(base::Value::Type::LIST); - list.Append(std::move(item)); - - PolicyMap policies; - SetPolicy(&policies, key::kWebAppInstallForceList, - base::Value::ToUniquePtrValue(std::move(list))); - provider_.UpdateChromePolicy(policies); - } - - protected: - GURL policy_app_url_; - - private: - DISALLOW_COPY_AND_ASSIGN(WebAppInstallForceListPolicyTest); -}; - -IN_PROC_BROWSER_TEST_F(WebAppInstallForceListPolicyTest, StartUpInstallation) { - extensions::TestExtensionRegistryObserver observer(extension_registry()); - const extensions::Extension* installed_extension = - observer.WaitForExtensionWillBeInstalled(); - - ASSERT_TRUE(installed_extension); - const GURL installed_app_url = - extensions::AppLaunchInfo::GetFullLaunchURL(installed_extension); - EXPECT_EQ(policy_app_url_, installed_app_url); -} - #if defined(OS_WIN) class ForceNetworkInProcessTest
diff --git a/chrome/browser/policy/policy_test_utils.cc b/chrome/browser/policy/policy_test_utils.cc new file mode 100644 index 0000000..62d87c7a --- /dev/null +++ b/chrome/browser/policy/policy_test_utils.cc
@@ -0,0 +1,445 @@ +// 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. + +#include "chrome/browser/policy/policy_test_utils.h" + +#include "base/path_service.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/post_task.h" +#include "chrome/browser/extensions/chrome_test_extension_loader.h" +#include "chrome/browser/extensions/crx_installer.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/ash/chrome_screenshot_grabber.h" +#include "chrome/browser/ui/ash/chrome_screenshot_grabber_test_observer.h" +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/location_bar/location_bar.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/net/safe_search_util.h" +#include "chrome/common/web_application_info.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/omnibox/browser/omnibox_edit_model.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/policy_constants.h" +#include "components/security_interstitials/content/security_interstitial_page.h" +#include "components/security_interstitials/content/security_interstitial_tab_helper.h" +#include "components/variations/variations_params_manager.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/interstitial_page_delegate.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/system_connector.h" +#include "content/public/browser/web_contents.h" +#include "content/public/common/network_service_util.h" +#include "content/public/common/service_names.mojom.h" +#include "content/public/test/test_navigation_observer.h" +#include "content/public/test/test_utils.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_system.h" +#include "extensions/browser/notification_types.h" +#include "extensions/browser/test_extension_registry_observer.h" +#include "net/dns/mock_host_resolver.h" +#include "net/http/transport_security_state.h" +#include "services/network/public/mojom/network_service_test.mojom.h" + +#if defined(OS_CHROMEOS) +#include "ui/snapshot/screenshot_grabber.h" +#endif + +using content::BrowserThread; +using testing::_; +using testing::Return; + +namespace policy { + +const base::FilePath::CharType kTestExtensionsDir[] = + FILE_PATH_LITERAL("extensions"); + +void GetTestDataDirectory(base::FilePath* test_data_directory) { + ASSERT_TRUE( + base::PathService::Get(chrome::DIR_TEST_DATA, test_data_directory)); +} + +PolicyTest::PolicyTest() = default; + +PolicyTest::~PolicyTest() = default; + +void PolicyTest::SetUp() { + test_extension_cache_.reset(new extensions::ExtensionCacheFake()); + InProcessBrowserTest::SetUp(); +} + +void PolicyTest::SetUpInProcessBrowserTestFixture() { + base::CommandLine::ForCurrentProcess()->AppendSwitch("noerrdialogs"); + EXPECT_CALL(provider_, IsInitializationComplete(_)) + .WillRepeatedly(Return(true)); + BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); +} + +void PolicyTest::SetUpOnMainThread() { + host_resolver()->AddRule("*", "127.0.0.1"); + if (extension_service()->updater()) { + extension_service()->updater()->SetExtensionCacheForTesting( + test_extension_cache_.get()); + } +} + +void PolicyTest::SetUpCommandLine(base::CommandLine* command_line) { + variations::testing::VariationParamsManager::AppendVariationParams( + "ReportCertificateErrors", "ShowAndPossiblySend", + {{"sendingThreshold", "1.0"}}, command_line); +} + +void PolicyTest::SetScreenshotPolicy(bool enabled) { + PolicyMap policies; + policies.Set(key::kDisableScreenshots, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>(!enabled), nullptr); + UpdateProviderPolicy(policies); +} + +void PolicyTest::SetShouldRequireCTForTesting(bool* required) { + if (content::IsOutOfProcessNetworkService()) { + network::mojom::NetworkServiceTestPtr network_service_test; + content::GetSystemConnector()->BindInterface( + content::mojom::kNetworkServiceName, &network_service_test); + network::mojom::NetworkServiceTest::ShouldRequireCT required_ct; + if (!required) { + required_ct = network::mojom::NetworkServiceTest::ShouldRequireCT::RESET; + } else { + required_ct = + *required + ? network::mojom::NetworkServiceTest::ShouldRequireCT::REQUIRE + : network::mojom::NetworkServiceTest::ShouldRequireCT:: + DONT_REQUIRE; + } + + mojo::ScopedAllowSyncCallForTesting allow_sync_call; + network_service_test->SetShouldRequireCT(required_ct); + return; + } + + base::PostTask( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce(&net::TransportSecurityState::SetShouldRequireCTForTesting, + required)); +} + +#if defined(OS_CHROMEOS) +class QuitMessageLoopAfterScreenshot + : public ChromeScreenshotGrabberTestObserver { + public: + explicit QuitMessageLoopAfterScreenshot(base::OnceClosure done) + : done_(std::move(done)) {} + void OnScreenshotCompleted(ui::ScreenshotResult screenshot_result, + const base::FilePath& screenshot_path) override { + base::PostTaskAndReply(FROM_HERE, {BrowserThread::IO}, base::DoNothing(), + std::move(done_)); + } + + ~QuitMessageLoopAfterScreenshot() override {} + + private: + base::OnceClosure done_; +}; + +void PolicyTest::TestScreenshotFile(bool enabled) { + base::RunLoop run_loop; + QuitMessageLoopAfterScreenshot observer_(run_loop.QuitClosure()); + + ChromeScreenshotGrabber* grabber = ChromeScreenshotGrabber::Get(); + grabber->test_observer_ = &observer_; + SetScreenshotPolicy(enabled); + grabber->HandleTakeScreenshotForAllRootWindows(); + run_loop.Run(); + + grabber->test_observer_ = nullptr; +} +#endif // defined(OS_CHROMEOS) + +extensions::ExtensionService* PolicyTest::extension_service() { + extensions::ExtensionSystem* system = + extensions::ExtensionSystem::Get(browser()->profile()); + return system->extension_service(); +} + +extensions::ExtensionRegistry* PolicyTest::extension_registry() { + return extensions::ExtensionRegistry::Get(browser()->profile()); +} + +const extensions::Extension* PolicyTest::InstallExtension( + const base::FilePath::StringType& name) { + base::FilePath extension_path(ui_test_utils::GetTestFilePath( + base::FilePath(kTestExtensionsDir), base::FilePath(name))); + scoped_refptr<extensions::CrxInstaller> installer = + extensions::CrxInstaller::CreateSilent(extension_service()); + installer->set_allow_silent_install(true); + installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); + installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE); + installer->set_off_store_install_allow_reason( + extensions::CrxInstaller::OffStoreInstallAllowReason:: + OffStoreInstallAllowedInTest); + + content::WindowedNotificationObserver observer( + extensions::NOTIFICATION_CRX_INSTALLER_DONE, + content::NotificationService::AllSources()); + installer->InstallCrx(extension_path); + observer.Wait(); + content::Details<const extensions::Extension> details = observer.details(); + return details.ptr(); +} + +const extensions::Extension* PolicyTest::InstallBookmarkApp() { + WebApplicationInfo web_app; + web_app.title = base::ASCIIToUTF16("Bookmark App"); + web_app.app_url = GURL("http://www.google.com"); + + scoped_refptr<extensions::CrxInstaller> installer = + extensions::CrxInstaller::CreateSilent(extension_service()); + + content::WindowedNotificationObserver observer( + extensions::NOTIFICATION_CRX_INSTALLER_DONE, + content::NotificationService::AllSources()); + installer->InstallWebApp(web_app); + observer.Wait(); + content::Details<const extensions::Extension> details = observer.details(); + return details.ptr(); +} + +scoped_refptr<const extensions::Extension> PolicyTest::LoadUnpackedExtension( + const base::FilePath::StringType& name) { + base::FilePath extension_path(ui_test_utils::GetTestFilePath( + base::FilePath(kTestExtensionsDir), base::FilePath(name))); + extensions::ChromeTestExtensionLoader loader(browser()->profile()); + return loader.LoadExtension(extension_path); +} + +void PolicyTest::UninstallExtension(const std::string& id, + bool expect_success) { + if (expect_success) { + extensions::TestExtensionRegistryObserver observer(extension_registry()); + extension_service()->UninstallExtension( + id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr); + observer.WaitForExtensionUninstalled(); + } else { + content::WindowedNotificationObserver observer( + extensions::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED, + content::NotificationService::AllSources()); + extension_service()->UninstallExtension( + id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr); + observer.Wait(); + } +} + +void PolicyTest::DisableExtension(const std::string& id) { + extensions::TestExtensionRegistryObserver observer(extension_registry()); + extension_service()->DisableExtension( + id, extensions::disable_reason::DISABLE_USER_ACTION); + observer.WaitForExtensionUnloaded(); +} + +void PolicyTest::UpdateProviderPolicy(const PolicyMap& policy) { + PolicyMap policy_with_defaults; + policy_with_defaults.CopyFrom(policy); +#if defined(OS_CHROMEOS) + SetEnterpriseUsersDefaults(&policy_with_defaults); +#endif + provider_.UpdateChromePolicy(policy_with_defaults); + DCHECK(base::MessageLoopCurrent::Get()); + base::RunLoop loop; + loop.RunUntilIdle(); +} + +void PolicyTest::PerformClick(int x, int y) { + content::WebContents* contents = + browser()->tab_strip_model()->GetActiveWebContents(); + blink::WebMouseEvent click_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); + click_event.button = blink::WebMouseEvent::Button::kLeft; + click_event.click_count = 1; + click_event.SetPositionInWidget(x, y); + contents->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(click_event); + click_event.SetType(blink::WebInputEvent::kMouseUp); + contents->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(click_event); +} + +void PolicyTest::SetPolicy(PolicyMap* policies, + const char* key, + std::unique_ptr<base::Value> value) { + if (value) { + policies->Set(key, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_CLOUD, std::move(value), nullptr); + } else { + policies->Erase(key); + } +} + +void PolicyTest::ApplySafeSearchPolicy( + std::unique_ptr<base::Value> legacy_safe_search, + std::unique_ptr<base::Value> google_safe_search, + std::unique_ptr<base::Value> legacy_youtube, + std::unique_ptr<base::Value> youtube_restrict) { + PolicyMap policies; + SetPolicy(&policies, key::kForceSafeSearch, std::move(legacy_safe_search)); + SetPolicy(&policies, key::kForceGoogleSafeSearch, + std::move(google_safe_search)); + SetPolicy(&policies, key::kForceYouTubeSafetyMode, std::move(legacy_youtube)); + SetPolicy(&policies, key::kForceYouTubeRestrict, std::move(youtube_restrict)); + UpdateProviderPolicy(policies); +} + +#if defined(OS_CHROMEOS) +void PolicyTest::SetEnableFlag(const keyboard::KeyboardEnableFlag& flag) { + auto* keyboard_client = ChromeKeyboardControllerClient::Get(); + keyboard_client->SetEnableFlag(flag); +} + +void PolicyTest::ClearEnableFlag(const keyboard::KeyboardEnableFlag& flag) { + auto* keyboard_client = ChromeKeyboardControllerClient::Get(); + keyboard_client->ClearEnableFlag(flag); +} +#endif // defined(OS_CHROMEOS) + +// static +GURL PolicyTest::GetExpectedSearchURL(bool expect_safe_search) { + std::string expected_url("http://google.com/"); + if (expect_safe_search) { + expected_url += "?" + + std::string(safe_search_util::kSafeSearchSafeParameter) + + "&" + safe_search_util::kSafeSearchSsuiParameter; + } + return GURL(expected_url); +} + +// static +void PolicyTest::CheckSafeSearch(Browser* browser, + bool expect_safe_search, + const std::string& url) { + content::WebContents* web_contents = + browser->tab_strip_model()->GetActiveWebContents(); + content::TestNavigationObserver observer(web_contents); + ui_test_utils::SendToOmniboxAndSubmit(browser, url); + observer.Wait(); + OmniboxEditModel* model = + browser->window()->GetLocationBar()->GetOmniboxView()->model(); + EXPECT_TRUE(model->CurrentMatch(nullptr).destination_url.is_valid()); + EXPECT_EQ(GetExpectedSearchURL(expect_safe_search), web_contents->GetURL()); +} + +// static +void PolicyTest::CheckYouTubeRestricted( + int youtube_restrict_mode, + const std::map<GURL, net::HttpRequestHeaders>& urls_requested, + const GURL& url) { + auto iter = urls_requested.find(url); + ASSERT_TRUE(iter != urls_requested.end()); + std::string header; + iter->second.GetHeader(safe_search_util::kYouTubeRestrictHeaderName, &header); + if (youtube_restrict_mode == safe_search_util::YOUTUBE_RESTRICT_OFF) { + EXPECT_TRUE(header.empty()); + } else if (youtube_restrict_mode == + safe_search_util::YOUTUBE_RESTRICT_MODERATE) { + EXPECT_EQ(header, safe_search_util::kYouTubeRestrictHeaderValueModerate); + } else if (youtube_restrict_mode == + safe_search_util::YOUTUBE_RESTRICT_STRICT) { + EXPECT_EQ(header, safe_search_util::kYouTubeRestrictHeaderValueStrict); + } +} + +// static +void PolicyTest::CheckAllowedDomainsHeader( + const std::string& allowed_domain, + const std::map<GURL, net::HttpRequestHeaders>& urls_requested, + const GURL& url) { + auto iter = urls_requested.find(url); + ASSERT_TRUE(iter != urls_requested.end()); + if (allowed_domain.empty()) { + EXPECT_TRUE( + !iter->second.HasHeader(safe_search_util::kGoogleAppsAllowedDomains)); + return; + } + + std::string header; + iter->second.GetHeader(safe_search_util::kGoogleAppsAllowedDomains, &header); + EXPECT_EQ(header, allowed_domain); +} + +// static +bool PolicyTest::FetchSubresource(content::WebContents* web_contents, + const GURL& url) { + std::string script( + "var xhr = new XMLHttpRequest();" + "xhr.open('GET', '"); + script += url.spec() + + "', true);" + "xhr.onload = function (e) {" + " if (xhr.readyState === 4) {" + " window.domAutomationController.send(xhr.status === 200);" + " }" + "};" + "xhr.onerror = function () {" + " window.domAutomationController.send(false);" + "};" + "xhr.send(null)"; + bool xhr_result = false; + bool execute_result = + content::ExecuteScriptAndExtractBool(web_contents, script, &xhr_result); + return xhr_result && execute_result; +} + +bool PolicyTest::IsShowingInterstitial(content::WebContents* tab) { + security_interstitials::SecurityInterstitialTabHelper* helper = + security_interstitials::SecurityInterstitialTabHelper::FromWebContents( + tab); + if (!helper) { + return false; + } + return helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() != + nullptr; +} + +void PolicyTest::WaitForInterstitial(content::WebContents* tab) { + ASSERT_TRUE(IsShowingInterstitial(tab)); + ASSERT_TRUE(WaitForRenderFrameReady(tab->GetMainFrame())); +} + +int PolicyTest::IsExtendedReportingCheckboxVisibleOnInterstitial() { + const std::string command = base::StringPrintf( + "var node = document.getElementById('extended-reporting-opt-in');" + "if (node) {" + " window.domAutomationController.send(node.offsetWidth > 0 || " + " node.offsetHeight > 0 ? %d : %d);" + "} else {" + // The node should be present but not visible, so trigger an error + // by sending false if it's not present. + " window.domAutomationController.send(%d);" + "}", + security_interstitials::CMD_TEXT_FOUND, + security_interstitials::CMD_TEXT_NOT_FOUND, + security_interstitials::CMD_ERROR); + + content::WebContents* tab = + browser()->tab_strip_model()->GetActiveWebContents(); + WaitForInterstitial(tab); + int result = 0; + EXPECT_TRUE(content::ExecuteScriptAndExtractInt(tab->GetMainFrame(), command, + &result)); + return result; +} + +void PolicyTest::SendInterstitialCommand( + content::WebContents* tab, + security_interstitials::SecurityInterstitialCommand command) { + security_interstitials::SecurityInterstitialTabHelper* helper = + security_interstitials::SecurityInterstitialTabHelper::FromWebContents( + tab); + helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() + ->CommandReceived(base::NumberToString(command)); + return; +} + +} // namespace policy
diff --git a/chrome/browser/policy/policy_test_utils.h b/chrome/browser/policy/policy_test_utils.h new file mode 100644 index 0000000..575faaa --- /dev/null +++ b/chrome/browser/policy/policy_test_utils.h
@@ -0,0 +1,124 @@ +// 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. + +#ifndef CHROME_BROWSER_POLICY_POLICY_TEST_UTILS_H_ +#define CHROME_BROWSER_POLICY_POLICY_TEST_UTILS_H_ + +#include "ash/public/cpp/keyboard/keyboard_types.h" +#include "base/files/file_path.h" +#include "chrome/browser/extensions/updater/extension_cache_fake.h" +#include "chrome/browser/extensions/updater/extension_updater.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/security_interstitials/core/controller_client.h" +#include "extensions/browser/scoped_ignore_content_verifier_for_test.h" + +namespace extensions { +class Extension; +class ExtensionRegistry; +class ExtensionService; +} // namespace extensions + +namespace policy { + +extern const base::FilePath::CharType kTestExtensionsDir[]; + +class PolicyMap; + +void GetTestDataDirectory(base::FilePath* test_data_directory); + +class PolicyTest : public InProcessBrowserTest { + protected: + PolicyTest(); + ~PolicyTest() override; + + void SetUp() override; + + void SetUpInProcessBrowserTestFixture() override; + + void SetUpOnMainThread() override; + + void SetUpCommandLine(base::CommandLine* command_line) override; + + void SetScreenshotPolicy(bool enabled); + + void SetShouldRequireCTForTesting(bool* required); + + extensions::ExtensionService* extension_service(); + + extensions::ExtensionRegistry* extension_registry(); + + const extensions::Extension* InstallExtension( + const base::FilePath::StringType& name); + + const extensions::Extension* InstallBookmarkApp(); + + scoped_refptr<const extensions::Extension> LoadUnpackedExtension( + const base::FilePath::StringType& name); + + void UninstallExtension(const std::string& id, bool expect_success); + + void DisableExtension(const std::string& id); + + void UpdateProviderPolicy(const PolicyMap& policy); + + // Sends a mouse click at the given coordinates to the current renderer. + void PerformClick(int x, int y); + + void SetPolicy(PolicyMap* policies, + const char* key, + std::unique_ptr<base::Value> value); + + void ApplySafeSearchPolicy(std::unique_ptr<base::Value> legacy_safe_search, + std::unique_ptr<base::Value> google_safe_search, + std::unique_ptr<base::Value> legacy_youtube, + std::unique_ptr<base::Value> youtube_restrict); + +#if defined(OS_CHROMEOS) + void TestScreenshotFile(bool enabled); + + void SetEnableFlag(const keyboard::KeyboardEnableFlag& flag); + + void ClearEnableFlag(const keyboard::KeyboardEnableFlag& flag); +#endif // defined(OS_CHROMEOS) + + static GURL GetExpectedSearchURL(bool expect_safe_search); + + static void CheckSafeSearch(Browser* browser, + bool expect_safe_search, + const std::string& url = "http://google.com/"); + + static void CheckYouTubeRestricted( + int youtube_restrict_mode, + const std::map<GURL, net::HttpRequestHeaders>& urls_requested, + const GURL& url); + + static void CheckAllowedDomainsHeader( + const std::string& allowed_domain, + const std::map<GURL, net::HttpRequestHeaders>& urls_requested, + const GURL& url); + + static bool FetchSubresource(content::WebContents* web_contents, + const GURL& url); + + bool IsShowingInterstitial(content::WebContents* tab); + + void WaitForInterstitial(content::WebContents* tab); + + int IsExtendedReportingCheckboxVisibleOnInterstitial(); + + void SendInterstitialCommand( + content::WebContents* tab, + security_interstitials::SecurityInterstitialCommand command); + + MockConfigurationPolicyProvider provider_; + std::unique_ptr<extensions::ExtensionCacheFake> test_extension_cache_; + extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_; + extensions::ExtensionUpdater::ScopedSkipScheduledCheckForTest + skip_scheduled_extension_checks_; +}; + +} // namespace policy + +#endif // CHROME_BROWSER_POLICY_POLICY_TEST_UTILS_H_
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc index e2a8b92..8760fd7 100644 --- a/chrome/browser/printing/print_browsertest.cc +++ b/chrome/browser/printing/print_browsertest.cc
@@ -195,6 +195,7 @@ PrintPreviewObserver print_preview_observer; StartPrint(browser()->tab_strip_model()->GetActiveWebContents(), + /*print_renderer=*/nullptr, /*print_preview_disabled=*/false, print_only_selection); print_preview_observer.WaitUntilPreviewIsReady(); @@ -281,6 +282,7 @@ PrintPreviewObserver print_preview_observer; StartPrint(browser()->tab_strip_model()->GetActiveWebContents(), + /*print_renderer=*/nullptr, /*print_preview_disabled=*/false, print_only_selection); print_preview_observer.WaitUntilPreviewIsReady();
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index f505219..36cd9fa 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc
@@ -110,24 +110,13 @@ bool PrintViewManager::PrintPreviewNow(content::RenderFrameHost* rfh, bool has_selection) { - // Users can send print commands all they want and it is beyond - // PrintViewManager's control. Just ignore the extra commands. - // See http://crbug.com/136842 for example. - if (print_preview_state_ != NOT_PREVIEWING) - return false; + return PrintPreview(rfh, nullptr, has_selection); +} - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) - return false; - - mojom::PrintRenderFrameAssociatedPtr print_render_frame; - rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame); - print_render_frame->InitiatePrintPreview(has_selection); - - DCHECK(!print_preview_rfh_); - print_preview_rfh_ = rfh; - print_preview_state_ = USER_INITIATED_PREVIEW; - return true; +bool PrintViewManager::PrintPreviewWithPrintRenderer( + content::RenderFrameHost* rfh, + mojom::PrintRendererAssociatedPtrInfo print_renderer) { + return PrintPreview(rfh, std::move(print_renderer), false); } void PrintViewManager::PrintPreviewForWebNode(content::RenderFrameHost* rfh) { @@ -203,6 +192,31 @@ PrintViewManagerBase::RenderFrameDeleted(render_frame_host); } +bool PrintViewManager::PrintPreview( + content::RenderFrameHost* rfh, + mojom::PrintRendererAssociatedPtrInfo print_renderer, + bool has_selection) { + // Users can send print commands all they want and it is beyond + // PrintViewManager's control. Just ignore the extra commands. + // See http://crbug.com/136842 for example. + if (print_preview_state_ != NOT_PREVIEWING) + return false; + + // Don't print / print preview interstitials or crashed tabs. + if (IsInterstitialOrCrashed()) + return false; + + mojom::PrintRenderFrameAssociatedPtr print_render_frame; + rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame); + print_render_frame->InitiatePrintPreview(std::move(print_renderer), + has_selection); + + DCHECK(!print_preview_rfh_); + print_preview_rfh_ = rfh; + print_preview_state_ = USER_INITIATED_PREVIEW; + return true; +} + void PrintViewManager::OnDidShowPrintDialog(content::RenderFrameHost* rfh) { if (rfh != print_preview_rfh_) return;
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h index 8415c9c..4cabe91d 100644 --- a/chrome/browser/printing/print_view_manager.h +++ b/chrome/browser/printing/print_view_manager.h
@@ -7,6 +7,7 @@ #include "base/macros.h" #include "chrome/browser/printing/print_view_manager_base.h" +#include "components/printing/common/print.mojom.h" #include "content/public/browser/web_contents_user_data.h" #include "printing/buildflags/buildflags.h" @@ -33,12 +34,17 @@ // preview dialog. bool BasicPrint(content::RenderFrameHost* rfh); - // Initiate print preview of the current document by first notifying the - // renderer. Since this happens asynchronous, the print preview dialog - // creation will not be completed on the return of this function. Returns - // false if print preview is impossible at the moment. + // Initiate print preview of the current document and specify whether a + // selection or the entire frame is being printed. bool PrintPreviewNow(content::RenderFrameHost* rfh, bool has_selection); + // Initiate print preview of the current document and provide the renderer + // a printing::mojom::PrintRenderer to perform the actual rendering of + // the print document. + bool PrintPreviewWithPrintRenderer( + content::RenderFrameHost* rfh, + mojom::PrintRendererAssociatedPtrInfo print_renderer); + // Notify PrintViewManager that print preview is starting in the renderer for // a particular WebNode. void PrintPreviewForWebNode(content::RenderFrameHost* rfh); @@ -73,6 +79,15 @@ struct FrameDispatchHelper; + // Helper method for PrintPreviewNow() and PrintPreviewWithRenderer(). + // Initiate print preview of the current document by first notifying the + // renderer. Since this happens asynchronously, the print preview dialog + // creation will not be completed on the return of this function. Returns + // false if print preview is impossible at the moment. + bool PrintPreview(content::RenderFrameHost* rfh, + mojom::PrintRendererAssociatedPtrInfo print_renderer, + bool has_selection); + // IPC Message handlers. void OnDidShowPrintDialog(content::RenderFrameHost* rfh); void OnSetupScriptedPrintPreview(content::RenderFrameHost* rfh,
diff --git a/chrome/browser/printing/print_view_manager_common.cc b/chrome/browser/printing/print_view_manager_common.cc index 449b31c3..afc5c7d 100644 --- a/chrome/browser/printing/print_view_manager_common.cc +++ b/chrome/browser/printing/print_view_manager_common.cc
@@ -50,6 +50,7 @@ } // namespace void StartPrint(content::WebContents* contents, + mojom::PrintRendererAssociatedPtrInfo print_renderer, bool print_preview_disabled, bool has_selection) { #if BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -71,7 +72,12 @@ #if BUILDFLAG(ENABLE_PRINT_PREVIEW) if (!print_preview_disabled) { - print_view_manager->PrintPreviewNow(rfh_to_use, has_selection); + if (print_renderer) { + print_view_manager->PrintPreviewWithPrintRenderer( + rfh_to_use, std::move(print_renderer)); + } else { + print_view_manager->PrintPreviewNow(rfh_to_use, has_selection); + } return; } #endif // ENABLE_PRINT_PREVIEW
diff --git a/chrome/browser/printing/print_view_manager_common.h b/chrome/browser/printing/print_view_manager_common.h index b3c34616..edaefc04 100644 --- a/chrome/browser/printing/print_view_manager_common.h +++ b/chrome/browser/printing/print_view_manager_common.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_COMMON_H_ #define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_COMMON_H_ +#include "components/printing/common/print.mojom.h" #include "printing/buildflags/buildflags.h" namespace content { @@ -15,7 +16,10 @@ namespace printing { // Start printing using the appropriate PrintViewManagerBase subclass. +// Optionally provide a printing::mojom::PrintRenderer to render print +// documents. void StartPrint(content::WebContents* web_contents, + mojom::PrintRendererAssociatedPtrInfo print_renderer, bool print_preview_disabled, bool has_selection);
diff --git a/chrome/browser/printing/print_view_manager_unittest.cc b/chrome/browser/printing/print_view_manager_unittest.cc index 0473ba8..bbc20ea 100644 --- a/chrome/browser/printing/print_view_manager_unittest.cc +++ b/chrome/browser/printing/print_view_manager_unittest.cc
@@ -47,7 +47,7 @@ mojom::PrintRenderFrameAssociatedPtr print_render_frame; rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame); - print_render_frame->InitiatePrintPreview(has_selection); + print_render_frame->InitiatePrintPreview(nullptr, has_selection); return true; }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 2262e66..cc4d980f 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2934,7 +2934,7 @@ } printing::StartPrint( - source_web_contents_, + source_web_contents_, nullptr, GetPrefs(browser_context_)->GetBoolean(prefs::kPrintPreviewDisabled), !params_.selection_text.empty()); #endif // BUILDFLAG(ENABLE_PRINTING)
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc index 2e8ddeb..d64fd05d 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" +#include "build/build_config.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/history/history_service_factory.h" @@ -456,8 +457,14 @@ // Test that the favicon update feature usage in background gets detected // properly. +// TODO(crbug.com/1004641): Investigate and reenable. +#if defined(OS_WIN) +#define MAYBE_FaviconUpdateFeatureUsage DISABLED_FaviconUpdateFeatureUsage +#else +#define MAYBE_FaviconUpdateFeatureUsage FaviconUpdateFeatureUsage +#endif IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, - FaviconUpdateFeatureUsage) { + MAYBE_FaviconUpdateFeatureUsage) { TestFeatureUsageDetection( &SiteCharacteristicsDataReader::UpdatesFaviconInBackground, internal::LocalSiteCharacteristicsDataImpl::TrackedBackgroundFeatures::
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc index 9529de9..e8434c0 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
@@ -901,7 +901,9 @@ decision_details.Clear(); } -TEST_F(TabLifecycleUnitTest, CannotFreezeOrDiscardIfConnectedToBluetooth) { +// TODO(crbug.com/1004578) Disabled due to flake +TEST_F(TabLifecycleUnitTest, + DISABLED_CannotFreezeOrDiscardIfConnectedToBluetooth) { TabLifecycleUnit tab_lifecycle_unit(GetTabLifecycleUnitSource(), &observers_, usage_clock_.get(), web_contents_, tab_strip_model_.get());
diff --git a/chrome/browser/resources/chromeos/camera/src/css/main.css b/chrome/browser/resources/chromeos/camera/src/css/main.css index f38b6a7c..73f16b3f 100644 --- a/chrome/browser/resources/chromeos/camera/src/css/main.css +++ b/chrome/browser/resources/chromeos/camera/src/css/main.css
@@ -261,7 +261,7 @@ #modes-group.hide, .mode-item.hide { - display: none; + visibility: hidden; } .mode-item>input {
diff --git a/chrome/browser/resources/chromeos/camera/src/js/models/filesystem.js b/chrome/browser/resources/chromeos/camera/src/js/models/filesystem.js index 6d1b4c0..eee6686 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/models/filesystem.js +++ b/chrome/browser/resources/chromeos/camera/src/js/models/filesystem.js
@@ -321,6 +321,9 @@ // Assuming content of tempfile contains all recorded chunks appended together // and is a well-formed video. The work needed here is just to move the file // to the correct directory and rename as the specified filename. + if (tempfile.name == filename) { + return tempfile; + } return new Promise( (resolve, reject) => tempfile.moveTo(nonNullDir, filename, resolve, reject));
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb index 1bd518f..6592ec15 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">আপনার ক্যামেরা ব্যবহার করে ছবি তুলুন এবং ভিডিও রেকর্ড করুন।</translation> <translation id="2549985041256363841">রেকর্ডিং শুরু করুন</translation> <translation id="2599796128805996109">পিছনের ক্যামেরা</translation> +<translation id="2912439424121107408">এই ডিভাইসে এক্সপার্ট মোড কাজ করে না</translation> <translation id="2968794441791257519">ক্যামেরায় তোলা ফটো ও ভিডিও ডাউনলোড ফোল্ডারে সরিয়ে দেওয়া হবে। আপনি সেগুলি ফাইল থেকে অ্যাক্সেস করতে পারবেন। আপনার ফটো ও ভিডিওতে স্টোরেজ ব্যবহারের অনুমতি আছে এমন অ্যাপের অ্যাক্সেস থাকবে।</translation> @@ -41,10 +42,12 @@ ক্যামেরা ঠিকভাবে কানেক্ট করা আছে কিনা দেখুন।</translation> <translation id="5152121255775685072">গ্যালারিতে যান</translation> <translation id="5671277269877808209">চৌকো</translation> +<translation id="5775960006311140197">বিশেষজ্ঞ মোড</translation> <translation id="5869546221129391014">গ্রিড</translation> <translation id="6040143037577758943">বন্ধ</translation> <translation id="6073451960410192870">রেকর্ডিং বন্ধ করুন</translation> <translation id="6165508094623778733">আরও জানুন</translation> +<translation id="6197807149213783179">মেটাডেটা সেভ করুন</translation> <translation id="6233780560267770709">৩ x ৩</translation> <translation id="6243827288366940320">গোল্ডেন অনুপাত</translation> <translation id="6248749904681914629">এক্সটার্নাল ক্যামেরা</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">মুছুন</translation> <translation id="8428213095426709021">সেটিংস</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">মেটাডেটা প্রিভিউ করুন</translation> <translation id="8815966864175525708">পোর্ট্রেট ফটো তুলতে মোড পাল্টান</translation> <translation id="8870695351537079478">রেকর্ডিং শুরু করা যাচ্ছে না</translation> <translation id="9045155556724273246">১০ সেকেন্ড</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_gu.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_gu.xtb index f896c30..516697f 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_gu.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_gu.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">તમારા કૅમેરા વડે ફોટા લો અને વીડિયો રેકોર્ડ કરો.</translation> <translation id="2549985041256363841">રેકોર્ડિંગ શરૂ કરો</translation> <translation id="2599796128805996109">પાછળનો કૅમેરા</translation> +<translation id="2912439424121107408">આ ડિવાઇસ પર નિષ્ણાત મોડની સુવિધા નથી</translation> <translation id="2968794441791257519">કૅમેરા વડે લીધેલા ફોટા અને વીડિયો ડાઉનલોડ ફોલ્ડરમાં ખસેડવામાં આવશે. તમે તેઓને ફાઇલોમાં ઍક્સેસ કરી શકશો. સ્ટોરેજ માટે પરવાનગી ધરાવતી ઍપ તમારા ફોટા તથા વીડિયોને ઍક્સેસ કરી શકશે.</translation> @@ -41,10 +42,12 @@ કૃપા કરીને તપાસો કે કૅમેરા યોગ્ય રીતે કનેક્ટ થયેલો છે.</translation> <translation id="5152121255775685072">ગૅલેરી પર જાઓ</translation> <translation id="5671277269877808209">ચોરસ</translation> +<translation id="5775960006311140197">નિષ્ણાત મોડ</translation> <translation id="5869546221129391014">ગ્રિડ</translation> <translation id="6040143037577758943">બંધ કરો</translation> <translation id="6073451960410192870">રેકોર્ડિંગ બંધ કરો</translation> <translation id="6165508094623778733">વધુ જાણો</translation> +<translation id="6197807149213783179">મેટાડેટા સાચવો</translation> <translation id="6233780560267770709">3 બાય 3</translation> <translation id="6243827288366940320">ગોલ્ડન રેશિયો</translation> <translation id="6248749904681914629">બાહ્ય કૅમેરો</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">ડિલીટ કરો</translation> <translation id="8428213095426709021">સેટિંગ્સ</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">મેટાડેટાનું પ્રીવ્યૂ કરો</translation> <translation id="8815966864175525708">પોર્ટ્રેટ ફોટો લેવા માટે સ્વિચ કરો</translation> <translation id="8870695351537079478">રેકોર્ડિંગ શરૂ કરી શકતાં નથી</translation> <translation id="9045155556724273246">10 સેકન્ડ</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_id.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_id.xtb index 1a93f32..ad98c3d 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_id.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_id.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Mengambil foto dan merekam video dengan kamera.</translation> <translation id="2549985041256363841">Mulai merekam</translation> <translation id="2599796128805996109">Kamera belakang</translation> +<translation id="2912439424121107408">Mode pakar tidak didukung di perangkat ini</translation> <translation id="2968794441791257519">Foto dan video yang diambil dengan kamera akan dipindahkan ke folder Download. Anda dapat mengaksesnya di File. Aplikasi yang memiliki izin penyimpanan dapat mengakses foto dan video.</translation> @@ -41,10 +42,12 @@ Periksa apakah kamera terhubung dengan benar.</translation> <translation id="5152121255775685072">Buka galeri</translation> <translation id="5671277269877808209">Persegi</translation> +<translation id="5775960006311140197">Mode pakar</translation> <translation id="5869546221129391014">Kisi</translation> <translation id="6040143037577758943">Tutup</translation> <translation id="6073451960410192870">Berhenti merekam</translation> <translation id="6165508094623778733">Pelajari lebih lanjut</translation> +<translation id="6197807149213783179">Simpan metadata</translation> <translation id="6233780560267770709">3 kali 3</translation> <translation id="6243827288366940320">Rasio emas</translation> <translation id="6248749904681914629">Kamera eksternal</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Hapus</translation> <translation id="8428213095426709021">Setelan</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Lihat pratinjau metadata</translation> <translation id="8815966864175525708">Beralih ke mode mengambil foto potret</translation> <translation id="8870695351537079478">Tidak dapat memulai rekaman</translation> <translation id="9045155556724273246">10 detik</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ml.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ml.xtb index 75a76fd..4efa969 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ml.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ml.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിച്ച് ചിത്രങ്ങൾ എടുക്കുക, വീഡിയോകൾ റെക്കോർഡ് ചെയ്യുക.</translation> <translation id="2549985041256363841">റെക്കോർഡിംഗ് ആരംഭിക്കൂ</translation> <translation id="2599796128805996109">പിൻ ക്യാമറ</translation> +<translation id="2912439424121107408">വിദഗ്ദ്ധ മോഡ് ഈ ഉപകരണത്തിൽ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="2968794441791257519">ക്യാമറ ഉപയോഗിച്ച് എടുത്ത ഫോട്ടോകളും വീഡിയോകളും 'ഡൗൺലോഡുകൾ' ഫോൾഡറിലേക്ക് നീക്കും. നിങ്ങൾക്ക് അവ Files-ൽ ആക്സസ് ചെയ്യാനാവും. സ്റ്റോറേജ് അനുമതികളുള്ള ആപ്പുകൾക്ക് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കും വീഡിയോകളിലേക്കും ആക്സസ് ഉണ്ടായിരിക്കും.</translation> @@ -41,10 +42,12 @@ ക്യാമറ ശരിയായി കണക്റ്റ് ചെയ്തിട്ടുണ്ടോയെന്ന് പരിശോധിക്കുക.</translation> <translation id="5152121255775685072">ഗാലറിയിലേക്ക് പോവുക</translation> <translation id="5671277269877808209">ചതുരം</translation> +<translation id="5775960006311140197">വിദഗ്ദ്ധ മോഡ്</translation> <translation id="5869546221129391014">ഗ്രിഡ്</translation> <translation id="6040143037577758943">അടയ്ക്കുക</translation> <translation id="6073451960410192870">റെക്കോർഡിംഗ് നിർത്തുക</translation> <translation id="6165508094623778733">കൂടുതലറിയുക</translation> +<translation id="6197807149213783179">മെറ്റാഡാറ്റ സംരക്ഷിക്കുക</translation> <translation id="6233780560267770709">3 ബൈ 3</translation> <translation id="6243827288366940320">ഗോൾഡൻ റേഷ്യോ</translation> <translation id="6248749904681914629">എക്സ്റ്റേണൽ ക്യാമറ</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">ഇല്ലാതാക്കുക</translation> <translation id="8428213095426709021">ക്രമീകരണങ്ങള്</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">മെറ്റാഡാറ്റ പ്രിവ്യൂ ചെയ്യൂ</translation> <translation id="8815966864175525708">പോർട്രെയ്റ്റ് ഫോട്ടോയെടുക്കൽ മോഡിലേക്ക് മാറുക</translation> <translation id="8870695351537079478">റെക്കോർഡിംഗ് ആരംഭിക്കാനായില്ല</translation> <translation id="9045155556724273246">10 സെക്കൻഡ്</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb index 987691e..c9a87ea 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Ta bilder og ta opp video med kameraet.</translation> <translation id="2549985041256363841">Start opptak</translation> <translation id="2599796128805996109">Bakre kamera</translation> +<translation id="2912439424121107408">Ekspertmodus støttes ikke på denne enheten</translation> <translation id="2968794441791257519">Bilder og videoer som er tatt med kameraet, flyttes til mappen Nedlastinger. Du har tilgang til dem i Filer. Apper med lagringstillatelser har tilgang til bildene og videoene dine.</translation> @@ -41,10 +42,12 @@ Sjekk om kameraet er koblet til riktig.</translation> <translation id="5152121255775685072">Gå til galleriet</translation> <translation id="5671277269877808209">Kvadrat</translation> +<translation id="5775960006311140197">Ekspertmodus</translation> <translation id="5869546221129391014">Rutenett</translation> <translation id="6040143037577758943">Lukk</translation> <translation id="6073451960410192870">Stopp opptaket</translation> <translation id="6165508094623778733">Finn ut mer</translation> +<translation id="6197807149213783179">Lagre metadata</translation> <translation id="6233780560267770709">3 ganger 3</translation> <translation id="6243827288366940320">Det gylne snitt</translation> <translation id="6248749904681914629">Eksternt kamera</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Slett</translation> <translation id="8428213095426709021">Innstillinger</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Forhåndsvis metadata</translation> <translation id="8815966864175525708">Bytt til bilde i stående format</translation> <translation id="8870695351537079478">Kan ikke starte opptak</translation> <translation id="9045155556724273246">10 sekunder</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sv.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sv.xtb index 60dfc49..a4aa033d 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sv.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sv.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Ta foton och spela in video med kameran.</translation> <translation id="2549985041256363841">Börja spela in</translation> <translation id="2599796128805996109">Bakre kamera</translation> +<translation id="2912439424121107408">Expertläget stöds inte på den här enheten</translation> <translation id="2968794441791257519">Videor och foton du tagit med kameran flyttas till mappen Nedladdningar. Du kan öppna dem i Filer. Fotona och videorna blir tillgängliga för appar som har åtkomstbehörighet till lagringsutrymmet.</translation> @@ -41,10 +42,12 @@ Kontrollera kameraanslutningen.</translation> <translation id="5152121255775685072">Besök galleriet</translation> <translation id="5671277269877808209">Kvadratiskt</translation> +<translation id="5775960006311140197">Expertläge</translation> <translation id="5869546221129391014">Rutnät</translation> <translation id="6040143037577758943">Stäng</translation> <translation id="6073451960410192870">Sluta spela in</translation> <translation id="6165508094623778733">Läs mer</translation> +<translation id="6197807149213783179">Spara metadata</translation> <translation id="6233780560267770709">Tre gånger tre</translation> <translation id="6243827288366940320">Gyllene snittet</translation> <translation id="6248749904681914629">Extern kamera</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Radera</translation> <translation id="8428213095426709021">Inställningar</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Förhandsgranska metadata</translation> <translation id="8815966864175525708">Byt till att ta porträttfoto</translation> <translation id="8870695351537079478">Det gick inte att starta inspelningen</translation> <translation id="9045155556724273246">Tio sekunder</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb index b224eda7..c7458440 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Piga picha na urekodi video ukitumia kamera yako.</translation> <translation id="2549985041256363841">Anza kurekodi</translation> <translation id="2599796128805996109">Kamera ya nyuma</translation> +<translation id="2912439424121107408">Hali ya wataalamu haitumiki kwenye kifaa hiki</translation> <translation id="2968794441791257519">Itahamishia picha na video ulizopigwa kwa kamera kwenye folda ya Vipakuliwa. Unaweza kuzifikia kwenye Faili. Programu zilizo na ruhusa za hifadhi zitaweza kufikia picha na video zako.</translation> @@ -41,10 +42,12 @@ Tafadhali hakikisha kuwa umeunganisha kamera vizuri.</translation> <translation id="5152121255775685072">Nenda kwenye matunzio</translation> <translation id="5671277269877808209">Mraba</translation> +<translation id="5775960006311140197">Hali ya wataalamu</translation> <translation id="5869546221129391014">Gridi</translation> <translation id="6040143037577758943">Funga</translation> <translation id="6073451960410192870">Acha kurekodi</translation> <translation id="6165508094623778733">Pata maelezo zaidi</translation> +<translation id="6197807149213783179">Hifadhi metadata</translation> <translation id="6233780560267770709">3 kwa 3</translation> <translation id="6243827288366940320">Uwiano bora zaidi</translation> <translation id="6248749904681914629">Kamera ya nje</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Futa</translation> <translation id="8428213095426709021">Mipangilio</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Kagua kwanza metadata</translation> <translation id="8815966864175525708">Badili ili upige picha ya wima</translation> <translation id="8870695351537079478">Imeshindwa kuanza kurekodi</translation> <translation id="9045155556724273246">Sekunde 10</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_tr.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_tr.xtb index a643981..dc740ca5 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_tr.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_tr.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Kameranızla fotoğraf çekin ve video kaydedin.</translation> <translation id="2549985041256363841">Kaydı başlat</translation> <translation id="2599796128805996109">Arka kamera</translation> +<translation id="2912439424121107408">Uzman modu bu cihazda desteklenmiyor</translation> <translation id="2968794441791257519">Kamerayla çekilen fotoğraflar ve videolar, İndirilenler klasörüne taşınacaktır. Bunlara Dosyalar uygulamasından erişebilirsiniz. Depolama iznine sahip uygulamalar fotoğraflarınıza ve videolarınıza erişebilecektir.</translation> @@ -41,10 +42,12 @@ Lütfen kameranın düzgün bir şekilde bağlanıp bağlanmadığını kontrol edin.</translation> <translation id="5152121255775685072">Galeriye git</translation> <translation id="5671277269877808209">Kare</translation> +<translation id="5775960006311140197">Uzman modu</translation> <translation id="5869546221129391014">Tablo</translation> <translation id="6040143037577758943">Kapat</translation> <translation id="6073451960410192870">Kaydı durdur</translation> <translation id="6165508094623778733">Daha fazla bilgi edinin</translation> +<translation id="6197807149213783179">Meta veriyi kaydet</translation> <translation id="6233780560267770709">3'e 3</translation> <translation id="6243827288366940320">Altın oran</translation> <translation id="6248749904681914629">Harici kamera</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Sil</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Meta veriyi önizle</translation> <translation id="8815966864175525708">Portre fotoğrafı çekme moduna geç</translation> <translation id="8870695351537079478">Kayıt başlatılamıyor</translation> <translation id="9045155556724273246">10 saniye</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_vi.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_vi.xtb index 1c91caf2..8de0b2a 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_vi.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">Chụp ảnh và quay video bằng máy ảnh.</translation> <translation id="2549985041256363841">Bắt đầu ghi</translation> <translation id="2599796128805996109">Máy ảnh mặt sau</translation> +<translation id="2912439424121107408">Thiết bị này không hỗ trợ chế độ Chuyên gia</translation> <translation id="2968794441791257519">Ảnh và video mà bạn chụp và quay bằng máy ảnh sẽ được chuyển đến thư mục Tệp đã tải xuống. Bạn có thể truy cập vào những nội dung này trong ứng dụng Files. Ứng dụng có quyền truy cập vào bộ nhớ sẽ có quyền truy cập vào ảnh và video của bạn.</translation> @@ -41,10 +42,12 @@ Vui lòng kiểm tra xem máy ảnh có được kết nối đúng cách không.</translation> <translation id="5152121255775685072">Truy cập thư viện</translation> <translation id="5671277269877808209">Vuông</translation> +<translation id="5775960006311140197">Chế độ Chuyên gia</translation> <translation id="5869546221129391014">Lưới</translation> <translation id="6040143037577758943">Đóng</translation> <translation id="6073451960410192870">Dừng ghi</translation> <translation id="6165508094623778733">Tìm hiểu thêm</translation> +<translation id="6197807149213783179">Lưu siêu dữ liệu</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">Tỷ lệ vàng</translation> <translation id="6248749904681914629">Máy ảnh gắn ngoài</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">Xóa</translation> <translation id="8428213095426709021">Cài đặt</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">Xem trước siêu dữ liệu</translation> <translation id="8815966864175525708">Chuyển sang chụp ảnh chân dung</translation> <translation id="8870695351537079478">Không thể bắt đầu quay</translation> <translation id="9045155556724273246">10 giây</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-CN.xtb index 58cf6b1..7e1e81a 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-CN.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-CN.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">使用相机拍照和录制视频。</translation> <translation id="2549985041256363841">开始录制</translation> <translation id="2599796128805996109">后置摄像头</translation> +<translation id="2912439424121107408">此设备不支持专家模式</translation> <translation id="2968794441791257519">使用此相机拍摄的照片和视频将被移至“下载内容”文件夹。您可在“文件”中访问它们。 具有存储权限的应用将有权访问您的照片和视频。</translation> @@ -41,10 +42,12 @@ 请检查此摄像头是否连接正确。</translation> <translation id="5152121255775685072">打开图库</translation> <translation id="5671277269877808209">方形</translation> +<translation id="5775960006311140197">专家模式</translation> <translation id="5869546221129391014">网格</translation> <translation id="6040143037577758943">关闭</translation> <translation id="6073451960410192870">停止录制</translation> <translation id="6165508094623778733">了解详情</translation> +<translation id="6197807149213783179">保存元数据</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">黄金比例</translation> <translation id="6248749904681914629">外接摄像头</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">删除</translation> <translation id="8428213095426709021">设置</translation> <translation id="8687491812650032292">高清 <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">预览元数据</translation> <translation id="8815966864175525708">切换到纵向照片拍摄模式</translation> <translation id="8870695351537079478">无法开始录制</translation> <translation id="9045155556724273246">10 秒</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-TW.xtb index 50e24dbe..b36d38b 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-TW.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_zh-TW.xtb
@@ -19,6 +19,7 @@ <translation id="2501953888035679275">使用相機拍攝相片及錄製影片。</translation> <translation id="2549985041256363841">開始錄影</translation> <translation id="2599796128805996109">後置鏡頭</translation> +<translation id="2912439424121107408">此裝置不支援專家模式</translation> <translation id="2968794441791257519">使用相機拍攝的相片和影片將移至「下載內容」資料夾,你可以在「檔案」應用程式中找到這些內容。 具備儲存空間權限的應用程式將可存取你的相片和影片。</translation> @@ -41,10 +42,12 @@ 請檢查相機是否已正確連接。</translation> <translation id="5152121255775685072">前往圖片庫</translation> <translation id="5671277269877808209">正方形</translation> +<translation id="5775960006311140197">專家模式</translation> <translation id="5869546221129391014">格線</translation> <translation id="6040143037577758943">關閉</translation> <translation id="6073451960410192870">停止錄影</translation> <translation id="6165508094623778733">瞭解詳情</translation> +<translation id="6197807149213783179">儲存中繼資料</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">黃金比例</translation> <translation id="6248749904681914629">外接鏡頭</translation> @@ -66,6 +69,7 @@ <translation id="8261506727792406068">刪除</translation> <translation id="8428213095426709021">設定</translation> <translation id="8687491812650032292">HD 高畫質 <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8732462232047530626">預覽中繼資料</translation> <translation id="8815966864175525708">切換為肖像相片拍攝模式</translation> <translation id="8870695351537079478">無法開始錄影</translation> <translation id="9045155556724273246">10 秒</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb index 328138b..5c07086 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">পরবর্তী ফোকাসযোগ্য আইটেমে জাম্প করুন</translation> <translation id="2770781857296573485">গ্রুপ অন্বেষণ প্রবেশ করে</translation> <translation id="2777845298774924149">বের করা হয়েছে</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{আরও #টি}one{আরও #টি}other{আরও #টি}}</translation> <translation id="2784959586797362050">আপনি যথারীতি সার্চ+a এবং তারপর i টিপে আমাদের সরাসরি মতামত পাঠাতে পারেন। আমরা আপনার মতামত শোনার অপেক্ষায় আছি।</translation> <translation id="2800204403141299078">কোনো পৃথক উপাদান নেই৷</translation> <translation id="2800780099804980316">কোনো পূর্ববর্তী স্তর ১ শিরোনাম নেই৷</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">ডায়ালগ</translation> <translation id="5963413905009737549">বিভাগ</translation> <translation id="5968607524793740041">সংশ্লিষ্ট মেনু দেখান</translation> +<translation id="597121107011153418">{COUNT,plural, =1{#টি আইটেম সহ}one{#টি আইটেম সহ}other{#টি আইটেম সহ}}</translation> <translation id="5981446804259161541">হালকা সায়ান</translation> <translation id="5983179082906765664">নেভিগেশন গ্র্যানুলারিটি বাড়ান</translation> <translation id="5992285135956208197">গ্রাফিক্স ডকুমেন্ট</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb index 37c1fc8..6bfffa5 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">આગલી ફોકસ કરવા યોગ્ય આઇટમ પર જમ્પ કરો</translation> <translation id="2770781857296573485">સમૂહ અન્વેષણ દાખલ કરો</translation> <translation id="2777845298774924149">બહાર</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}one{+#}other{+#}}</translation> <translation id="2784959586797362050">હંમેશની જેમ, તમે શોધ+a પછી i દબાવીને અમને સીધો જ પ્રતિસાદ મોકલી શકો છો. અમે તમારો પ્રતિસાદ મેળવવા આતુર છીએ.</translation> <translation id="2800204403141299078">કોઈ વધુ અલગ ઘટકો નથી.</translation> <translation id="2800780099804980316">કોઈ પાછલું લેવલ 1 શીર્ષક નથી.</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">સંવાદ</translation> <translation id="5963413905009737549">સેક્શન</translation> <translation id="5968607524793740041">સંદર્ભ મેનૂ બતાવો</translation> +<translation id="597121107011153418">{COUNT,plural, =1{# આઇટમ સાથે}one{# આઇટમ સાથે}other{# આઇટમ સાથે}}</translation> <translation id="5981446804259161541">આછો સ્યાન</translation> <translation id="5983179082906765664">નેવિગેશન ગ્રેન્યુલેરિટી વધારો</translation> <translation id="5992285135956208197">ગ્રાફિક્સ દસ્તાવેજ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb index cda6c72..fe553e9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">Melompat ke item yang dapat difokuskan berikutnya</translation> <translation id="2770781857296573485">Masukkan penjelajahan grup</translation> <translation id="2777845298774924149">Keluar</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">Seperti biasa, Anda dapat langsung mengirimkan masukan kepada kami dengan menekan tombol Penelusuran+a lalu i. Kami menyambut baik masukan Anda.</translation> <translation id="2800204403141299078">Tidak ada elemen berbeda lainnya.</translation> <translation id="2800780099804980316">Tidak ada judul tingkat 1 sebelumnya.</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">Dialog</translation> <translation id="5963413905009737549">Bagian</translation> <translation id="5968607524793740041">Tampilkan menu konteks</translation> +<translation id="597121107011153418">{COUNT,plural, =1{dengan # item}other{dengan # item}}</translation> <translation id="5981446804259161541">Light Cyan</translation> <translation id="5983179082906765664">Meningkatkan granularitas navigasi</translation> <translation id="5992285135956208197">Dokumen grafis</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb index d767fe2..5572f51 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -232,6 +232,7 @@ <translation id="27527859628328957">ഫോക്കസ് ചെയ്യാനാകുന്ന അടുത്ത ഇനത്തിലേക്ക് പോകുക</translation> <translation id="2770781857296573485">ഗ്രൂപ്പ് പര്യവേക്ഷണം നൽകുക</translation> <translation id="2777845298774924149">പുറത്തുകടന്നു</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">എപ്പോഴും എന്ന പോലെ, തിരയുക+a എന്നതും തുടർന്ന് i എന്നതും അമർത്തിക്കൊണ്ട് നിങ്ങൾക്ക് നേരിട്ട് ഫീഡ്ബാക്ക് അയയ്ക്കാവുന്നതാണ്. നിങ്ങളുടെ അഭിപ്രായമറിയാൻ ഞങ്ങൾ ജിജ്ഞാസയോടെ കാത്തിരിക്കുന്നു.</translation> <translation id="2800204403141299078">മറ്റ് വ്യത്യസ്ത ഘടകങ്ങൾ ഒന്നുമില്ല.</translation> <translation id="2800780099804980316">മുൻ നില 1 ശീർഷകം ഒന്നുമില്ല.</translation> @@ -714,6 +715,7 @@ <translation id="5956928062748260866">ഡയലോഗ്</translation> <translation id="5963413905009737549">വിഭാഗം</translation> <translation id="5968607524793740041">സന്ദർഭ മെനു കാണിക്കുക</translation> +<translation id="597121107011153418">{COUNT,plural, =1{# ഇനമുള്ള}other{# ഇനങ്ങളുള്ള}}</translation> <translation id="5981446804259161541">ഇളം സിയാൻ</translation> <translation id="5983179082906765664">നാവിഗേഷൻ ഗ്രാനുലാരിറ്റി വർദ്ധിപ്പിക്കുക</translation> <translation id="5992285135956208197">ഗ്രാഫിക്സ് ഡോക്യുമെന്റ്</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb index b999c99..a8ca9e8 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">Gå til neste fokuserbare element</translation> <translation id="2770781857296573485">Kjør gruppeutforsking</translation> <translation id="2777845298774924149">Lukket</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">Du kan sende oss tilbakemelding direkte ved å trykke på søketasten+A og deretter I. Vi ser frem til å høre fra deg.</translation> <translation id="2800204403141299078">Det er ingen flere ulike elementer.</translation> <translation id="2800780099804980316">Det finnes ikke tidligere overskrifter på nivå 1.</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">Dialog</translation> <translation id="5963413905009737549">Del</translation> <translation id="5968607524793740041">Vis den kontekstuelle menyen</translation> +<translation id="597121107011153418">{COUNT,plural, =1{med # punkt}other{med # punkter}}</translation> <translation id="5981446804259161541">Lys cyan</translation> <translation id="5983179082906765664">Øk detaljnivået for navigeringen</translation> <translation id="5992285135956208197">Grafikkdokument</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb index eeed030..aeaf5081 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">Hoppa till nästa fokuserbara objekt</translation> <translation id="2770781857296573485">Börja utforska grupper</translation> <translation id="2777845298774924149">Stängdes</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">Du kan som vanligt skicka feedback genom att trycka på söktangenten + A och sedan I. Vi hör gärna av dig.</translation> <translation id="2800204403141299078">Inga flera olika element.</translation> <translation id="2800780099804980316">Det finns ingen föregående rubrik på nivå 1.</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">Dialogruta</translation> <translation id="5963413905009737549">Avsnitt</translation> <translation id="5968607524793740041">Visa snabbmeny</translation> +<translation id="597121107011153418">{COUNT,plural, =1{med # post}other{med # poster}}</translation> <translation id="5981446804259161541">Ljust cyanblå</translation> <translation id="5983179082906765664">Öka navigeringens granularitet</translation> <translation id="5992285135956208197">Grafiskt dokument</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb index 3988756d..654d2dc 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -232,6 +232,7 @@ <translation id="27527859628328957">Ruka hadi kipengee kinachoweza kulengwa kinachofuata</translation> <translation id="2770781857296573485">Ingia ugunduaji wa kikundi</translation> <translation id="2777845298774924149">Imeondoka</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">Kama kawaida, unaweza kututumia maoni moja kwa moja kwa kubonyeza Tafuta+a kisha i. Tunasubiri maoni yako kwa hamu.</translation> <translation id="2800204403141299078">Hakuna vipengee zaidi tofauti.</translation> <translation id="2800780099804980316">Hakuna kichwa cha ngazi ya 1 iliyotangulia.</translation> @@ -714,6 +715,7 @@ <translation id="5956928062748260866">Mazungumzo</translation> <translation id="5963413905009737549">Sehemu</translation> <translation id="5968607524793740041">Onyesha menyu</translation> +<translation id="597121107011153418">{COUNT,plural, =1{na kipengee #}other{na vipengee #}}</translation> <translation id="5981446804259161541">Samawati ya Kijani Hafifu</translation> <translation id="5983179082906765664">Ongeza kiwango cha maelezo unapodurusu</translation> <translation id="5992285135956208197">Hati ya picha</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb index 4fde8598..0282fb481 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -232,6 +232,7 @@ <translation id="27527859628328957">Odaklanabilir sonraki öğeye atla</translation> <translation id="2770781857296573485">Grup keşfine geç</translation> <translation id="2777845298774924149">Çıkıldı</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">Her zaman olduğu gibi Arama+a ve ardından i tuşlarına basarak geri bildiriminizi bize doğrudan gönderebilirsiniz. Düşüncelerinizi öğrenmeyi çok isteriz.</translation> <translation id="2800204403141299078">Başka farklı öğe yok.</translation> <translation id="2800780099804980316">Önceki 1. düzey başlık yok.</translation> @@ -714,6 +715,7 @@ <translation id="5956928062748260866">İletişim Kutusu</translation> <translation id="5963413905009737549">Bölüm</translation> <translation id="5968607524793740041">İçerik menüsünü göster</translation> +<translation id="597121107011153418">{COUNT,plural, =1{# öğeli}other{# öğeli}}</translation> <translation id="5981446804259161541">Açık Camgöbeği</translation> <translation id="5983179082906765664">Gezinme hassasiyetini artır</translation> <translation id="5992285135956208197">Grafik dokümanı</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb index 32f4d43..1beb2d3 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">Nhảy tới mục có thể đặt tiêu điểm tiếp theo</translation> <translation id="2770781857296573485">Nhập thăm dò nhóm</translation> <translation id="2777845298774924149">Đã thoát</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{Hơn # mục}other{Hơn # mục}}</translation> <translation id="2784959586797362050">Như thường lệ, bạn có thể gửi phản hồi trực tiếp cho chúng tôi bằng cách nhấn phím Tìm kiếm+a, sau đó nhấn phím i. Chúng tôi rất mong nhận được ý kiến từ bạn.</translation> <translation id="2800204403141299078">Không có phần tử khác nào nữa.</translation> <translation id="2800780099804980316">Không có tiêu đề cấp 1 trước nào.</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">Hộp thoại</translation> <translation id="5963413905009737549">Phần</translation> <translation id="5968607524793740041">Hiển thị menu ngữ cảnh</translation> +<translation id="597121107011153418">{COUNT,plural, =1{có # mục}other{có # mục}}</translation> <translation id="5981446804259161541">Màu lục lam nhạt</translation> <translation id="5983179082906765664">Tăng mức độ chi tiết của điều hướng</translation> <translation id="5992285135956208197">Tài liệu đồ họa</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb index 2b176aa..85b80df 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -232,6 +232,7 @@ <translation id="27527859628328957">跳转到下一个可设置为焦点的项</translation> <translation id="2770781857296573485">进入群组浏览</translation> <translation id="2777845298774924149">已退出</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">和往常一样,您只需先按搜索键+A 键,然后再按 I 键,即可直接向我们发送反馈。我们非常渴望收到您的反馈。</translation> <translation id="2800204403141299078">没有其他任何元素。</translation> <translation id="2800780099804980316">不存在上一个1级标题。</translation> @@ -714,6 +715,7 @@ <translation id="5956928062748260866">对话框</translation> <translation id="5963413905009737549">章节标记</translation> <translation id="5968607524793740041">显示上下文菜单</translation> +<translation id="597121107011153418">{COUNT,plural, =1{(包含 # 项)}other{(包含 # 项)}}</translation> <translation id="5981446804259161541">亮青色</translation> <translation id="5983179082906765664">提高导航精细度</translation> <translation id="5992285135956208197">图形文档</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb index da4c9d3..6b16a1c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -233,6 +233,7 @@ <translation id="27527859628328957">跳至下一個可選擇的項目</translation> <translation id="2770781857296573485">輸入群組探索</translation> <translation id="2777845298774924149">結束</translation> +<translation id="2783001728278437613">{COUNT,plural, =1{+#}other{+#}}</translation> <translation id="2784959586797362050">和以前一樣,我們竭誠歡迎你提供意見。只要直接按下搜尋鍵 + A 鍵,再按下 I 鍵即可暢所欲言。</translation> <translation id="2800204403141299078">已無其他元素。</translation> <translation id="2800780099804980316">沒有上一個第 1 階標題。</translation> @@ -715,6 +716,7 @@ <translation id="5956928062748260866">對話方塊</translation> <translation id="5963413905009737549">區段</translation> <translation id="5968607524793740041">顯示內容選單</translation> +<translation id="597121107011153418">{COUNT,plural, =1{有 # 個項目}other{有 # 個項目}}</translation> <translation id="5981446804259161541">淺青</translation> <translation id="5983179082906765664">增加導覽精細度</translation> <translation id="5992285135956208197">圖形文件</translation>
diff --git a/chrome/browser/resources/chromeos/drive_internals.css b/chrome/browser/resources/chromeos/drive_internals.css index a2ae770f..65e4fda 100644 --- a/chrome/browser/resources/chromeos/drive_internals.css +++ b/chrome/browser/resources/chromeos/drive_internals.css
@@ -6,10 +6,6 @@ font-size: small; } -#file-system-contents { - font-size: small; -} - #cache-contents { font-size: small; }
diff --git a/chrome/browser/resources/chromeos/drive_internals.html b/chrome/browser/resources/chromeos/drive_internals.html index 884bfe7..2297a6443 100644 --- a/chrome/browser/resources/chromeos/drive_internals.html +++ b/chrome/browser/resources/chromeos/drive_internals.html
@@ -21,14 +21,6 @@ <li>Push notifications enabled: <span id="push-notification-enabled"></span> </li> - <li> - Has refresh token: <span id="has-refresh-token"></span> - <button id="button-clear-refresh-token">clear</button> - </li> - <li> - Has access token: <span id="has-access-token"></span> - <button id="button-clear-access-token">clear</button> - </li> </ul> </section> @@ -89,12 +81,6 @@ </table> </section> - <section id="file-system-contents-section" hidden> - <h2>File System Contents</h2> - <button id="button-show-file-entries">Show</button> - <div id="file-system-contents"></div> - </section> - <section id="path-configurations-section" hidden> <h2>Path Configurations</h2> <ul id="path-configurations">
diff --git a/chrome/browser/resources/chromeos/drive_internals.js b/chrome/browser/resources/chromeos/drive_internals.js index 926ed729..f3a5747 100644 --- a/chrome/browser/resources/chromeos/drive_internals.js +++ b/chrome/browser/resources/chromeos/drive_internals.js
@@ -34,8 +34,6 @@ $('connection-status').textContent = connStatus['status']; $('push-notification-enabled').textContent = connStatus['push-notification-enabled']; - $('has-refresh-token').textContent = connStatus['has-refresh-token']; - $('has-access-token').textContent = connStatus['has-access-token']; } /** @@ -78,17 +76,6 @@ } /** - * Updates the File System Contents section. The function is called from the - * C++ side repeatedly with contents of a directory. - * @param {string} directoryContentsAsText Pre-formatted string representation - * of contents a directory in the file system. - */ -function updateFileSystemContents(directoryContentsAsText) { - var div = $('file-system-contents'); - div.appendChild(createElementFromText('pre', directoryContentsAsText)); -} - -/** * Updates the Cache Contents section. * @param {Object} cacheEntry Dictionary describing a cache entry. * The function is called from the C++ side repeatedly. @@ -302,25 +289,11 @@ updateToc(); - $('button-clear-access-token').addEventListener('click', function() { - chrome.send('clearAccessToken'); - }); - - $('button-clear-refresh-token').addEventListener('click', function() { - chrome.send('clearRefreshToken'); - }); - $('button-reset-drive-filesystem').addEventListener('click', function() { $('reset-status-text').textContent = 'resetting...'; chrome.send('resetDriveFileSystem'); }); - $('button-show-file-entries').addEventListener('click', function() { - var button = $('button-show-file-entries'); - button.parentNode.removeChild(button); - chrome.send('listFileEntries'); - }); - $('button-export-logs').addEventListener('click', function() { $('button-export-logs').setAttribute('disabled', 'true'); chrome.send('zipLogs');
diff --git a/chrome/browser/resources/print_preview/polymer3/demo.js b/chrome/browser/resources/print_preview/polymer3/demo.js index 0f505bc..7474448 100644 --- a/chrome/browser/resources/print_preview/polymer3/demo.js +++ b/chrome/browser/resources/print_preview/polymer3/demo.js
@@ -26,6 +26,7 @@ import 'chrome://resources/js/action_link.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import * as crToastManager from 'chrome://resources/cr_elements/cr_toast/cr_toast_manager.m.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; class HelloPolymer3Element extends PolymerElement { @@ -148,6 +149,13 @@ </div> <a is="action-link">I am an action link</a> + + <div> + <cr-toast-manager></cr-toast-manager> + <cr-button on-click="showToastWithManager_"> + Show toast for 2s + </cr-button> + </div> `; } @@ -176,6 +184,12 @@ type: Array, value: () => (['A', 'B']), }, + + /** @private */ + isFirst_: { + type: Boolean, + value: true, + }, }; } @@ -222,6 +236,15 @@ showActionMenu_(e) { this.shadowRoot.querySelector('cr-action-menu').showAt(e.target); } + + /** @private */ + showToastWithManager_() { + const toastManager = crToastManager.getInstance(); + toastManager.duration = 2000; + toastManager.show( + 'I am toasted ' + (this.isFirst_ ? 'first' : 'second'), false); + this.isFirst_ = !this.isFirst_; + } } // class HelloPolymer3 customElements.define('hello-polymer3', HelloPolymer3Element);
diff --git a/chrome/browser/resources/settings/people_page/setup_pin_dialog.html b/chrome/browser/resources/settings/people_page/setup_pin_dialog.html index ec1fb78..093bace2 100644 --- a/chrome/browser/resources/settings/people_page/setup_pin_dialog.html +++ b/chrome/browser/resources/settings/people_page/setup_pin_dialog.html
@@ -13,6 +13,10 @@ <style include="settings-shared"> #pinKeyboardDiv { justify-content: center; + }; + + #pinKeyboard { + --cr-input-placeholder-letter-spacing: normal; } </style> <cr-dialog id="dialog" on-close="close" @@ -28,7 +32,8 @@ on-set-pin-done="onSetPinDone_" set-modes="{{setModes}}" quick-unlock-private="[[quickUnlockPrivate]]" - write-uma="[[writeUma_]]"> + write-uma="[[writeUma_]]" + enable-placeholder> </setup-pin-keyboard> </div> </div>
diff --git a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html index f5724ca..fac0773 100644 --- a/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html +++ b/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.html
@@ -1,6 +1,5 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_action_menu/anchor_alignment.html"> <link rel="import" href="chrome://resources/cr_elements/cr_action_menu/cr_action_menu.html"> <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html">
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engine_entry.html b/chrome/browser/resources/settings/search_engines_page/search_engine_entry.html index 810cfec3..4469b429 100644 --- a/chrome/browser/resources/settings/search_engines_page/search_engine_entry.html +++ b/chrome/browser/resources/settings/search_engines_page/search_engine_entry.html
@@ -1,6 +1,5 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_action_menu/anchor_alignment.html"> <link rel="import" href="chrome://resources/cr_elements/cr_action_menu/cr_action_menu.html"> <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html">
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h index ed54a2952..75cf802 100644 --- a/chrome/browser/themes/theme_properties.h +++ b/chrome/browser/themes/theme_properties.h
@@ -163,6 +163,7 @@ COLOR_OMNIBOX_RESULTS_BG, COLOR_OMNIBOX_RESULTS_BG_HOVERED, COLOR_OMNIBOX_RESULTS_BG_SELECTED, + COLOR_OMNIBOX_RESULTS_TEXT_DIMMED, COLOR_OMNIBOX_RESULTS_ICON, COLOR_OMNIBOX_RESULTS_URL, COLOR_OMNIBOX_BUBBLE_OUTLINE,
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index 7fc1b8f3..8b0a547 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -1155,6 +1155,9 @@ auto results_bg_selected_color = [&]() { return blend_toward_max_contrast(results_bg_color(), 0x29); }; + auto blend_with_clamped_contrast = [&](OmniboxColor bg) { + return blend_for_min_contrast(fg, fg, blend_for_min_contrast(bg, bg)); + }; auto get_omnibox_color_impl = [&](int id) -> base::Optional<OmniboxColor> { switch (id) { @@ -1179,8 +1182,11 @@ case TP::COLOR_OMNIBOX_BUBBLE_OUTLINE_EXPERIMENTAL_KEYWORD_MODE: return url_color(results_bg_color()); case TP::COLOR_OMNIBOX_TEXT_DIMMED: + return blend_with_clamped_contrast(bg); + case TP::COLOR_OMNIBOX_RESULTS_TEXT_DIMMED: + return blend_with_clamped_contrast(results_bg_selected_color()); case TP::COLOR_OMNIBOX_RESULTS_ICON: - return blend_for_min_contrast(fg, results_bg_color()); + return derive_default_icon_color(fg); case TP::COLOR_OMNIBOX_RESULTS_BG_HOVERED: return blend_toward_max_contrast(results_bg_color(), 0x1A); case TP::COLOR_OMNIBOX_RESULTS_URL:
diff --git a/chrome/browser/ui/app_list/DEPS b/chrome/browser/ui/app_list/DEPS index c2b3271..e823dfc 100644 --- a/chrome/browser/ui/app_list/DEPS +++ b/chrome/browser/ui/app_list/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+chrome/services/app_service/public", + "+chrome/services/app_service", ]
diff --git a/chrome/browser/ui/app_list/app_service/app_service_test.cc b/chrome/browser/ui/app_list/app_service/app_service_test.cc new file mode 100644 index 0000000..8fe6205 --- /dev/null +++ b/chrome/browser/ui/app_list/app_service/app_service_test.cc
@@ -0,0 +1,40 @@ +// 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/ui/app_list/app_service/app_service_test.h" + +#include "base/run_loop.h" +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/common/chrome_features.h" +#include "chrome/services/app_service/app_service.h" +#include "chrome/services/app_service/public/mojom/constants.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +AppServiceTest::AppServiceTest() = default; + +AppServiceTest::~AppServiceTest() = default; + +void AppServiceTest::SetUp(Profile* profile) { + app_service_ = std::make_unique<apps::AppService>( + test_connector_factory_.RegisterInstance(apps::mojom::kServiceName)); + app_service_proxy_connector_ = test_connector_factory_.GetDefaultConnector(); + app_service_proxy_ = apps::AppServiceProxyFactory::GetForProfile(profile); + DCHECK(app_service_proxy_); + app_service_proxy_->ReInitializeForTesting(profile, + app_service_proxy_connector_); + + // Allow async callbacks to run. + WaitForAppService(); +} + +void AppServiceTest::WaitForAppService() { + base::RunLoop().RunUntilIdle(); +} + +void AppServiceTest::FlushMojoCallsForAppService() { + if (app_service_proxy_) { + app_service_proxy_->FlushMojoCallsForTesting(); + } +}
diff --git a/chrome/browser/ui/app_list/app_service/app_service_test.h b/chrome/browser/ui/app_list/app_service/app_service_test.h new file mode 100644 index 0000000..c6e3e980 --- /dev/null +++ b/chrome/browser/ui/app_list/app_service/app_service_test.h
@@ -0,0 +1,50 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_APP_LIST_APP_SERVICE_APP_SERVICE_TEST_H_ +#define CHROME_BROWSER_UI_APP_LIST_APP_SERVICE_APP_SERVICE_TEST_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/macros.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" + +namespace service_manager { +class Connector; +class Service; +} // namespace service_manager + +namespace apps { +class AppServiceProxy; +} + +class Profile; + +// Helper class to initialize AppService in unit tests. +class AppServiceTest { + public: + AppServiceTest(); + ~AppServiceTest(); + + void SetUp(Profile* profile); + + // Allow AppService async callbacks to run. + void WaitForAppService(); + + // Flush mojo calls to allow AppService async callbacks to run. + void FlushMojoCallsForAppService(); + + private: + service_manager::Connector* app_service_proxy_connector_ = nullptr; + apps::AppServiceProxy* app_service_proxy_ = nullptr; + + service_manager::TestConnectorFactory test_connector_factory_; + std::unique_ptr<service_manager::Service> app_service_; + + DISALLOW_COPY_AND_ASSIGN(AppServiceTest); +}; + +#endif // CHROME_BROWSER_UI_APP_LIST_APP_SERVICE_APP_SERVICE_TEST_H_
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc index 738b0fb..4038063 100644 --- a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc +++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
@@ -88,7 +88,7 @@ weak_factory_(this) { task_runner_ = base::CreateSequencedTaskRunner( {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}); EnforceLoggingPolicy(); }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc index 4466209..c72ee81 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -27,6 +27,8 @@ #include "base/test/bind_test_util.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/app/chrome_command_ids.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/apps/launch_service/launch_service.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" @@ -56,6 +58,7 @@ #include "chrome/browser/web_applications/system_web_app_manager.h" #include "chrome/browser/web_applications/test/web_app_install_observer.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "chrome/test/base/ui_test_utils.h" @@ -306,6 +309,50 @@ &index); } + // Flush mojo calls to allow async callbacks to run. + void FlushMojoCallsForAppService() { + if (!base::FeatureList::IsEnabled(features::kAppServiceAsh) || + !base::FeatureList::IsEnabled(features::kAppServiceShelf)) { + return; + } + apps::AppServiceProxy* proxy = + apps::AppServiceProxyFactory::GetForProfile(profile()); + if (proxy) { + proxy->FlushMojoCallsForTesting(); + } + } + + // Launch the app and flush mojo calls to allow async callbacks to run. + void LaunchAppAndFlushMojoCallsForAppService(const ash::ShelfID& id, + ash::ShelfLaunchSource source, + int event_flags, + int64_t display_id) { + controller_->LaunchApp(ash::ShelfID(last_loaded_extension_id()), + ash::LAUNCH_FROM_UNKNOWN, 0, + display::kInvalidDisplayId); + FlushMojoCallsForAppService(); + } + + // Launch and activate the app, and flush mojo calls to allow async callbacks + // to run. + void ActivateAppAndFlushMojoCallsForAppService(const std::string& app_id, + ash::ShelfLaunchSource source, + int event_flags, + int64_t display_id) { + controller_->ActivateApp(app_id, ash::LAUNCH_FROM_UNKNOWN, 0, + display::kInvalidDisplayId); + FlushMojoCallsForAppService(); + } + + // Select an item and flush mojo calls to allow async callbacks to run. + void SelectItemAndFlushMojoCallsForAppService( + const ash::ShelfID& id, + ui::EventType event_type = ui::ET_MOUSE_PRESSED, + int64_t display_id = display::kInvalidDisplayId) { + SelectItem(id, event_type, display_id); + FlushMojoCallsForAppService(); + } + ChromeLauncherController* controller_ = nullptr; private: @@ -773,7 +820,7 @@ int tab_count = tab_strip->count(); ash::ShelfID shortcut_id = CreateShortcut("app1"); EXPECT_EQ(ash::STATUS_CLOSED, shelf_model()->ItemByID(shortcut_id)->status); - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_EQ(++tab_count, tab_strip->count()); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->ItemByID(shortcut_id)->status); WebContents* tab = tab_strip->GetActiveWebContents(); @@ -827,7 +874,8 @@ // Launches an app from the shelf of display 0 and expects a new tab is opened // in the uppermost browser in display 0. ash::ShelfID shortcut_id = CreateShortcut("app1"); - SelectItem(shortcut_id, ui::ET_MOUSE_PRESSED, displays[1].id()); + SelectItemAndFlushMojoCallsForAppService(shortcut_id, ui::ET_MOUSE_PRESSED, + displays[1].id()); EXPECT_EQ(browser0->tab_strip_model()->count(), 1); EXPECT_EQ(browser1->tab_strip_model()->count(), 1); EXPECT_EQ(browser2->tab_strip_model()->count(), 2); @@ -865,7 +913,8 @@ // Launches an app from the shelf of display 0 and expects a new browser with // one tab is opened in display 0. ash::ShelfID shortcut_id = CreateShortcut("app1"); - SelectItem(shortcut_id, ui::ET_MOUSE_PRESSED, displays[1].id()); + SelectItemAndFlushMojoCallsForAppService(shortcut_id, ui::ET_MOUSE_PRESSED, + displays[1].id()); Browser* browser1 = browser_list->GetLastActive(); EXPECT_EQ(browser_list->size(), 2U); EXPECT_NE(browser1, browser0); @@ -917,7 +966,7 @@ browser2->window()->Maximize(); ash::ShelfID shortcut_id = CreateShortcut("app1"); - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_EQ(++tab_count, tab_strip->count()); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->ItemByID(shortcut_id)->status); @@ -926,7 +975,7 @@ EXPECT_FALSE(browser2->window()->IsActive()); // Selecting the shortcut activates the second window. - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_TRUE(browser2->window()->IsActive()); } @@ -936,12 +985,11 @@ int tab_count = tab_strip->count(); const Extension* extension = LoadExtension(test_data_dir_.AppendASCII("app1")); - - controller_->ActivateApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0, - display::kInvalidDisplayId); + ActivateAppAndFlushMojoCallsForAppService( + extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0, display::kInvalidDisplayId); EXPECT_EQ(++tab_count, tab_strip->count()); - controller_->ActivateApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0, - display::kInvalidDisplayId); + ActivateAppAndFlushMojoCallsForAppService( + extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0, display::kInvalidDisplayId); EXPECT_EQ(tab_count, tab_strip->count()); } @@ -950,11 +998,11 @@ TabStripModel* tab_strip = browser()->tab_strip_model(); int tab_count = tab_strip->count(); ash::ShelfID id(LoadExtension(test_data_dir_.AppendASCII("app1"))->id()); - controller_->LaunchApp(id, ash::LAUNCH_FROM_UNKNOWN, 0, - display::kInvalidDisplayId); + LaunchAppAndFlushMojoCallsForAppService(id, ash::LAUNCH_FROM_UNKNOWN, 0, + display::kInvalidDisplayId); EXPECT_EQ(++tab_count, tab_strip->count()); - controller_->LaunchApp(id, ash::LAUNCH_FROM_UNKNOWN, 0, - display::kInvalidDisplayId); + LaunchAppAndFlushMojoCallsForAppService(id, ash::LAUNCH_FROM_UNKNOWN, 0, + display::kInvalidDisplayId); EXPECT_EQ(++tab_count, tab_strip->count()); } @@ -1004,7 +1052,7 @@ IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, Navigation) { ash::ShelfID shortcut_id = CreateShortcut("app1"); EXPECT_EQ(ash::STATUS_CLOSED, shelf_model()->ItemByID(shortcut_id)->status); - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->ItemByID(shortcut_id)->status); // Navigate away. @@ -1033,7 +1081,7 @@ EXPECT_EQ(ash::STATUS_CLOSED, shelf_model()->ItemByID(shortcut_id)->status); // Activate app1 and check its item status. - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_EQ(2, tab_strip_model1->count()); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->items()[browser_index].status); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->ItemByID(shortcut_id)->status); @@ -1080,7 +1128,7 @@ // Activating app should launch new tab, because second tab isn't // in its refocus url path. - SelectItem(shortcut_id); + SelectItemAndFlushMojoCallsForAppService(shortcut_id); EXPECT_EQ(++tab_count, tab_strip->count()); WebContents* second_tab = tab_strip->GetActiveWebContents(); EXPECT_EQ(ash::STATUS_RUNNING, shelf_model()->ItemByID(shortcut_id)->status); @@ -1674,7 +1722,7 @@ EXPECT_EQ(2, shelf_model()->item_count()); // Create and activate a new tab for "app1" and expect an application ShelfID. - SelectItem(app_id); + SelectItemAndFlushMojoCallsForAppService(app_id); EXPECT_EQ(2, browser()->tab_strip_model()->count()); EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); id = ash::ShelfID::Deserialize(window->GetProperty(ash::kShelfIDKey)); @@ -1860,10 +1908,12 @@ shelf_model()->ItemByID(bookmark_app_shelf_id)->status); // Now use the launcher controller to activate the apps. - controller_->ActivateApp(hosted_app->id(), ash::LAUNCH_FROM_APP_LIST, 0, - display::kInvalidDisplayId); - controller_->ActivateApp(bookmark_app->id(), ash::LAUNCH_FROM_APP_LIST, 0, - display::kInvalidDisplayId); + ActivateAppAndFlushMojoCallsForAppService(hosted_app->id(), + ash::LAUNCH_FROM_APP_LIST, 0, + display::kInvalidDisplayId); + ActivateAppAndFlushMojoCallsForAppService(bookmark_app->id(), + ash::LAUNCH_FROM_APP_LIST, 0, + display::kInvalidDisplayId); // There should be two new browsers. EXPECT_EQ(3u, chrome::GetBrowserCount(browser()->profile()));
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc index 7d30b6ca..66981f6 100644 --- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc +++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -24,6 +24,8 @@ #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/app_list/app_service/app_service_test.h" +#include "chrome/browser/ui/app_list/arc/arc_app_icon.h" #include "chrome/browser/ui/app_list/arc/arc_app_test.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h" @@ -73,6 +75,7 @@ void SetUp() override { arc_test_.SetUp(&profile_); + app_service_test_.SetUp(&profile_); session_manager_ = std::make_unique<session_manager::SessionManager>(); ChromeAshTestBase::SetUp(); model_ = std::make_unique<ash::ShelfModel>(); @@ -81,6 +84,7 @@ // Disable safe icon decoding to ensure ArcAppShortcutRequests returns in // the test environment. + ArcAppIcon::DisableSafeDecodingForTesting(); arc::IconDecodeRequest::DisableSafeDecodingForTesting(); } @@ -140,6 +144,8 @@ ArcAppTest& arc_test() { return arc_test_; } + AppServiceTest& app_service_test() { return app_service_test_; } + TestingProfile* profile() { return &profile_; } ChromeLauncherController* controller() { return launcher_controller_.get(); } @@ -149,6 +155,7 @@ private: TestingProfile profile_; ArcAppTest arc_test_; + AppServiceTest app_service_test_; std::unique_ptr<session_manager::SessionManager> session_manager_; std::unique_ptr<ash::ShelfModel> model_; std::unique_ptr<ChromeLauncherController> launcher_controller_;
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc index ea58d32..8213f401 100644 --- a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc +++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
@@ -7,6 +7,8 @@ #include <vector> #include "base/strings/utf_string_conversions.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/apps/launch_service/launch_service.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/arc/arc_session_manager.h" @@ -30,6 +32,7 @@ #include "chrome/browser/ui/extensions/extension_enable_flow.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" #include "chrome/browser/web_applications/extensions/bookmark_app_util.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "components/arc/arc_util.h" #include "components/arc/metrics/arc_metrics_constants.h" @@ -211,6 +214,15 @@ } const std::string& app_id = id.app_id; + if (base::FeatureList::IsEnabled(features::kAppServiceShelf)) { + apps::AppServiceProxy* proxy = + apps::AppServiceProxyFactory::GetForProfile(profile_); + DCHECK(proxy); + proxy->Launch(app_id, event_flags, apps::mojom::LaunchSource::kFromShelf, + display_id); + return; + } + const ArcAppListPrefs* arc_prefs = GetArcAppListPrefs(); if (arc_prefs && arc_prefs->IsRegistered(app_id)) { arc::LaunchApp(profile_, app_id, event_flags,
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 5f45667..1c4beb41 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -971,7 +971,7 @@ #if BUILDFLAG(ENABLE_PRINTING) auto* web_contents = browser->tab_strip_model()->GetActiveWebContents(); printing::StartPrint( - web_contents, + web_contents, nullptr /* print_renderer */, browser->profile()->GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled), false /* has_selection? */); #endif
diff --git a/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc b/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc index a868dbe..5d1a3f85 100644 --- a/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc +++ b/chrome/browser/ui/hid/hid_chooser_controller_unittest.cc
@@ -67,10 +67,10 @@ web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); // Set fake HID manager for HidChooserContext. - device::mojom::HidManagerPtr hid_manager_ptr; - hid_manager_.Bind(mojo::MakeRequest(&hid_manager_ptr)); + mojo::PendingRemote<device::mojom::HidManager> hid_manager; + hid_manager_.Bind(hid_manager.InitWithNewPipeAndPassReceiver()); HidChooserContextFactory::GetForProfile(profile())->SetHidManagerForTesting( - std::move(hid_manager_ptr)); + std::move(hid_manager)); } std::unique_ptr<HidChooserController> CreateHidChooserController(
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.cc b/chrome/browser/ui/omnibox/omnibox_theme.cc index e5d5ac5..a35ba09 100644 --- a/chrome/browser/ui/omnibox/omnibox_theme.cc +++ b/chrome/browser/ui/omnibox/omnibox_theme.cc
@@ -42,8 +42,9 @@ case OmniboxPart::RESULTS_TEXT_DEFAULT: return TP::COLOR_OMNIBOX_TEXT; case OmniboxPart::LOCATION_BAR_TEXT_DIMMED: - case OmniboxPart::RESULTS_TEXT_DIMMED: return TP::COLOR_OMNIBOX_TEXT_DIMMED; + case OmniboxPart::RESULTS_TEXT_DIMMED: + return TP::COLOR_OMNIBOX_RESULTS_TEXT_DIMMED; case OmniboxPart::RESULTS_ICON: return TP::COLOR_OMNIBOX_RESULTS_ICON; case OmniboxPart::RESULTS_TEXT_URL:
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc index 402bb91..262b34c 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.cc +++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -1105,6 +1105,41 @@ AddToNewGroupImpl(indices, group); } +void TabStripModel::UpdateGroupForDragRevert(int index, + base::Optional<TabGroupId> group) { + DCHECK(!reentrancy_guard_); + base::AutoReset<bool> resetter(&reentrancy_guard_, true); + + // Ungroup tab before moving, so that if this is the last tab in the group + // observers can delete that group. + base::Optional<TabGroupId> old_group = UngroupTab(index); + + if (group.has_value()) { + auto add_to_group_and_notify = [&]() { + contents_data_[index]->set_group(group.value()); + group_data_.at(group.value()).TabAdded(); + NotifyGroupChange(index, old_group, group); + }; + + const bool group_exists = base::Contains(group_data_, group.value()); + if (group_exists) { + add_to_group_and_notify(); + } else { + auto data_it = + group_data_.emplace(group.value(), GroupData(TabGroupVisualData())) + .first; + add_to_group_and_notify(); + // Notify observers about the initial visual data. + for (auto& observer : observers_) { + observer.OnTabGroupVisualDataChanged(this, group.value(), + &data_it->second.visual_data()); + } + } + } + + NotifyGroupChange(index, old_group, group); +} + void TabStripModel::RemoveFromGroup(const std::vector<int>& indices) { DCHECK(!reentrancy_guard_); base::AutoReset<bool> resetter(&reentrancy_guard_, true);
diff --git a/chrome/browser/ui/tabs/tab_strip_model.h b/chrome/browser/ui/tabs/tab_strip_model.h index 3bb9e17..116dc65 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.h +++ b/chrome/browser/ui/tabs/tab_strip_model.h
@@ -436,8 +436,15 @@ // Similar to AddToExistingGroup(), but creates a group with id |group| if it // doesn't exist. This is only intended to be called from session restore // code. + // TODO(crbug.com/1004346): Update the group's old metadata (title and color). void AddToGroupForRestore(const std::vector<int>& indices, TabGroupId group); + // Updates the tab group of the tab at |index|. If |group| is nullopt, the tab + // will be removed from the current group. If |group| does not exist, it will + // create the group then add the tab to the group. + // TODO(crbug.com/1004346): Update the group's old metadata (title and color). + void UpdateGroupForDragRevert(int index, base::Optional<TabGroupId> group); + // Removes the set of tabs pointed to by |indices| from the the groups they // are in, if any. The tabs are moved out of the group if necessary. |indices| // must be sorted in ascending order. This feature is in development and gated
diff --git a/chrome/browser/ui/views/confirm_bubble_views_unittest.cc b/chrome/browser/ui/views/confirm_bubble_views_unittest.cc index 1482655..bd26b705 100644 --- a/chrome/browser/ui/views/confirm_bubble_views_unittest.cc +++ b/chrome/browser/ui/views/confirm_bubble_views_unittest.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "build/build_config.h" #include "chrome/browser/ui/confirm_bubble.h" #include "chrome/browser/ui/test/test_confirm_bubble_model.h" #include "chrome/browser/ui/views/chrome_constrained_window_views_client.h" @@ -18,7 +19,13 @@ typedef ChromeViewsTestBase ConfirmBubbleViewsTest; -TEST_F(ConfirmBubbleViewsTest, CreateAndClose) { +// TODO(crbug.com/1004633) Disabled on windows due to flake +#if defined(OS_WIN) +#define MAYBE_CreateAndClose DISABLED_CreateAndClose +#else +#define MAYBE_CreateAndClose CreateAndClose +#endif +TEST_F(ConfirmBubbleViewsTest, MAYBE_CreateAndClose) { SetConstrainedWindowViewsClient(CreateChromeConstrainedWindowViewsClient()); // Create parent widget, as confirm bubble must have an owner.
diff --git a/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.cc b/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.cc index 7988367..e8955ed 100644 --- a/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.cc
@@ -71,7 +71,7 @@ gfx::Size CrostiniAppUninstallerView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.h b/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.h index bb2e431..8f353fa 100644 --- a/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.h +++ b/chrome/browser/ui/views/crostini/crostini_app_uninstaller_view.h
@@ -7,14 +7,14 @@ #include <string> -#include "ui/views/window/dialog_delegate.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" class Profile; // The Crostini application uninstaller. Displays a confirmation prompt, // and kicks off the uninstall if the user confirms that they want the app // uninstalled. Subsequent notifications are handled by CrostiniPackageService. -class CrostiniAppUninstallerView : public views::DialogDelegateView { +class CrostiniAppUninstallerView : public views::BubbleDialogDelegateView { public: // Show the "are you sure?"-style confirmation prompt. |app_id| should be an // ID understood by CrostiniRegistryService::GetRegistration().
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc index 65e0e25..b2b932ff 100644 --- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc
@@ -109,7 +109,7 @@ gfx::Size CrostiniUninstallerView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.h b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.h index a5e8a18..c47fca8 100644 --- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.h +++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UNINSTALLER_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UNINSTALLER_VIEW_H_ -#include "ui/views/window/dialog_delegate.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" namespace views { class Label; @@ -20,7 +20,7 @@ // The Crostini uninstaller. Provides a warning to the user and // uninstalls Crostinin if the user chooses to do so. -class CrostiniUninstallerView : public views::DialogDelegateView { +class CrostiniUninstallerView : public views::BubbleDialogDelegateView { public: // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused.
diff --git a/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.cc b/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.cc index 8f891f81..d22c2c1 100644 --- a/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.cc
@@ -105,7 +105,7 @@ gfx::Size CrostiniUpgradeContainerView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.h b/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.h index 9dc2bbd..015ceec 100644 --- a/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.h +++ b/chrome/browser/ui/views/crostini/crostini_upgrade_container_view.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UPGRADE_CONTAINER_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UPGRADE_CONTAINER_VIEW_H_ -#include "ui/views/window/dialog_delegate.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" class Profile; @@ -15,7 +15,7 @@ // Provides a warning to the user that an upgrade is occurring and Crostini // start will take longer than usual. -class CrostiniUpgradeContainerView : public views::DialogDelegateView { +class CrostiniUpgradeContainerView : public views::BubbleDialogDelegateView { public: static void Show(Profile* profile);
diff --git a/chrome/browser/ui/views/crostini/crostini_upgrade_view.cc b/chrome/browser/ui/views/crostini/crostini_upgrade_view.cc index 421512c2..2bdff275 100644 --- a/chrome/browser/ui/views/crostini/crostini_upgrade_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_upgrade_view.cc
@@ -59,7 +59,7 @@ gfx::Size CrostiniUpgradeView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_upgrade_view.h b/chrome/browser/ui/views/crostini/crostini_upgrade_view.h index 671fa31..dcede6a9 100644 --- a/chrome/browser/ui/views/crostini/crostini_upgrade_view.h +++ b/chrome/browser/ui/views/crostini/crostini_upgrade_view.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UPGRADE_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_UPGRADE_VIEW_H_ -#include "ui/views/window/dialog_delegate.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" namespace crostini { enum class CrostiniResult; @@ -15,7 +15,7 @@ // Provides a warning to the user that an upgrade is required and and internet // connection is needed. -class CrostiniUpgradeView : public views::DialogDelegateView { +class CrostiniUpgradeView : public views::BubbleDialogDelegateView { public: static void Show(Profile* profile);
diff --git a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc index 9ad11d4..17e829c 100644 --- a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc +++ b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc
@@ -108,7 +108,13 @@ input_method->DetachTextInputClient(client2.get()); } -IN_PROC_BROWSER_TEST_F(InputImeApiTest, SendKeyEventsOnNormalPage) { +// TODO(crbug.com/1004628) Flakes on Windows and Linux +#if defined(OS_WIN) || defined(OS_LINUX) +#define MAYBE_SendKeyEventsOnNormalPage DISABLED_SendKeyEventsOnNormalPage +#else +#define MAYBE_SendKeyEventsOnNormalPage SendKeyEventsOnNormalPage +#endif +IN_PROC_BROWSER_TEST_F(InputImeApiTest, MAYBE_SendKeyEventsOnNormalPage) { // Navigates to special page that sendKeyEvents API has limition with. ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)); // Manipulates the focused text input client because the follow cursor
diff --git a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc index 53144625..af5a60db 100644 --- a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc +++ b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
@@ -137,8 +137,14 @@ EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog()); } +// TODO(crbug.com/1004635) Disabled due to flake on Windows and Linux +#if defined(OS_WIN) || defined(OS_LINUX) +#define MAYBE_EphemeralToolbarIconForDialog EphemeralToolbarIconForDialog +#else +#define MAYBE_EphemeralToolbarIconForDialog DISABLED_EphemeralToolbarIconForDialog +#endif IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, - EphemeralToolbarIconForDialog) { + MAYBE_EphemeralToolbarIconForDialog) { MediaRouterDialogController* dialog_controller = GetDialogController(); EXPECT_FALSE(ToolbarIconExists());
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc index 2c49290..04b4a919c 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
@@ -197,7 +197,14 @@ // Without the browser.relaunch_notification preference set, the controller // should not be observing the UpgradeDetector, and should therefore never // attempt to show any notifications. -TEST_F(RelaunchNotificationControllerTest, PolicyUnset) { + +// TODO(1004568) Disabled due to race condition. +#if defined(THREAD_SANATIZER) +#define MAYBE_PolicyUnset DISABLED_PolicyUnset +#else +#define MAYBE_PolicyUnset PolicyUnset +#endif +TEST_F(RelaunchNotificationControllerTest, MAYBE_PolicyUnset) { ::testing::StrictMock<MockControllerDelegate> mock_controller_delegate; FakeRelaunchNotificationController controller(
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc index f83ebd4..c15f2f7 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
@@ -32,8 +32,8 @@ namespace { -const int kContentsBorderThickness = 10; -const float kContentsBorderOpacity = 0.24; +const int kContentsBorderThickness = 5; +const float kContentsBorderOpacity = 0.50; const SkColor kContentsBorderColor = gfx::kGoogleBlue500; void InitContentsBorderWidget(content::WebContents* contents) {
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc index 210ca66..d6908bd 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -633,10 +633,13 @@ void TabDragController::InitTabDragData(Tab* tab, TabDragData* drag_data) { TRACE_EVENT0("views", "TabDragController::InitTabDragData"); - drag_data->source_model_index = source_context_->GetIndexOf(tab); + const int source_model_index = source_context_->GetIndexOf(tab); + drag_data->source_model_index = source_model_index; drag_data->contents = source_context_->GetTabStripModel()->GetWebContentsAt( drag_data->source_model_index); drag_data->pinned = source_context_->IsTabPinned(tab); + drag_data->group_id = source_context_->GetTabStripModel()->GetTabGroupForTab( + source_model_index); } void TabDragController::OnWidgetBoundsChanged(views::Widget* widget, @@ -1669,6 +1672,8 @@ data->source_model_index, std::move(data->owned_contents), (data->pinned ? TabStripModel::ADD_PINNED : 0)); } + source_context_->GetTabStripModel()->UpdateGroupForDragRevert( + data->source_model_index, data->group_id); } void TabDragController::CompleteDrag() {
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.h b/chrome/browser/ui/views/tabs/tab_drag_controller.h index 4b31f0d..d829116 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.h +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.h
@@ -236,6 +236,9 @@ // Is the tab pinned? bool pinned; + // Stores the group the tab is in, or nullopt if tab is not grouped. + base::Optional<TabGroupId> group_id; + private: DISALLOW_COPY_AND_ASSIGN(TabDragData); };
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc index 8c1e2d1..950b96b1 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -856,6 +856,73 @@ EXPECT_THAT(model->ListTabsInGroup(group1), testing::ElementsAre(0, 1, 2, 3)); } +// Creates a browser with four tabs. The first two tabs are in Tab Group 1. +// Dragging the third tab over one to the left will result in the tab joining +// Tab Group 1. While this drag is still in session, pressing escape will revert +// group of the tab to before the drag session started. +IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, + RevertDragSingleTabIntoGroup) { + scoped_feature_list_.InitAndEnableFeature(features::kTabGroups); + + TabStrip* tab_strip = GetTabStripForBrowser(browser()); + TabStripModel* model = browser()->tab_strip_model(); + + AddTabsAndResetBrowser(browser(), 3); + TabGroupId group1 = model->AddToNewGroup({0, 1}); + StopAnimating(tab_strip); + + // Dragging the tab in the second index to the tab in the first index switches + // the tabs and adds the dragged tab to the group. + ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(2)))); + ASSERT_TRUE(DragInputTo(GetCenterInScreenCoordinates(tab_strip->tab_at(1)))); + + EXPECT_EQ("0 2 1 3", IDString(model)); + EXPECT_THAT(model->ListTabsInGroup(group1), testing::ElementsAre(0, 1, 2)); + + ASSERT_TRUE(TabDragController::IsActive()); + + // Pressing escape will revert the tabs to original state before the drag. + ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, + false, false, false)); + EXPECT_EQ("0 1 2 3", IDString(model)); + EXPECT_THAT(model->ListTabsInGroup(group1), testing::ElementsAre(0, 1)); +} + +// Creates a browser with four tabs. The last two tabs are in Tab Group 1. The +// second tab is in Tab Group 2. Dragging the second tab over one to the right +// will result in the tab joining Tab Group 1. While this drag is still in +// session, pressing escape will revert group of the tab to before the drag +// session started. +IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, + RevertDragSingleTabGroupIntoGroup) { + scoped_feature_list_.InitAndEnableFeature(features::kTabGroups); + + TabStrip* tab_strip = GetTabStripForBrowser(browser()); + TabStripModel* model = browser()->tab_strip_model(); + + AddTabsAndResetBrowser(browser(), 3); + TabGroupId group1 = model->AddToNewGroup({2, 3}); + TabGroupId group2 = model->AddToNewGroup({1}); + StopAnimating(tab_strip); + + // Dragging the tab in the first index to the tab in the second index switches + // the tabs and adds the dragged tab to the group. + ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(1)))); + ASSERT_TRUE(DragInputTo(GetCenterInScreenCoordinates(tab_strip->tab_at(2)))); + + EXPECT_EQ("0 2 1 3", IDString(model)); + EXPECT_THAT(model->ListTabsInGroup(group1), testing::ElementsAre(1, 2, 3)); + + ASSERT_TRUE(TabDragController::IsActive()); + + // Pressing escape will revert the tabs to original state before the drag. + ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, + false, false, false)); + EXPECT_EQ("0 1 2 3", IDString(model)); + EXPECT_THAT(model->ListTabsInGroup(group1), testing::ElementsAre(2, 3)); + EXPECT_THAT(model->ListTabsInGroup(group2), testing::ElementsAre(1)); +} + // Drags a tab within the window (without dragging the whole window) then // pressing a key ends the drag. IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest,
diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc index 30eeec76..857d5816 100644 --- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc +++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -29,7 +29,6 @@ #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "chrome/browser/chromeos/drive/debug_info_collector.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/file_manager/path_util.h" @@ -43,13 +42,9 @@ #include "chromeos/constants/chromeos_features.h" #include "components/download/content/public/all_download_item_notifier.h" #include "components/download/public/common/download_item.h" -#include "components/drive/drive.pb.h" -#include "components/drive/drive_api_util.h" #include "components/drive/drive_notification_manager.h" #include "components/drive/drive_pref_names.h" #include "components/drive/event_logger.h" -#include "components/drive/job_list.h" -#include "components/drive/service/drive_service_interface.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -152,74 +147,6 @@ return result; } -// Formats |entry| into text. -std::string FormatEntry(const base::FilePath& path, - const drive::ResourceEntry& entry) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - using base::StringAppendF; - - std::string out; - StringAppendF(&out, "%s\n", path.AsUTF8Unsafe().c_str()); - StringAppendF(&out, " title: %s\n", entry.title().c_str()); - StringAppendF(&out, " local_id: %s\n", entry.local_id().c_str()); - StringAppendF(&out, " resource_id: %s\n", entry.resource_id().c_str()); - StringAppendF(&out, " parent_local_id: %s\n", - entry.parent_local_id().c_str()); - StringAppendF(&out, " shared: %s\n", entry.shared() ? "true" : "false"); - StringAppendF(&out, " shared_with_me: %s\n", - entry.shared_with_me() ? "true" : "false"); - StringAppendF(&out, " alternate_url: %s\n", entry.alternate_url().c_str()); - - const drive::PlatformFileInfoProto& file_info = entry.file_info(); - StringAppendF(&out, " file_info\n"); - StringAppendF(&out, " size: %" PRId64 "\n", file_info.size()); - StringAppendF(&out, " is_directory: %d\n", file_info.is_directory()); - StringAppendF(&out, " is_symbolic_link: %d\n", - file_info.is_symbolic_link()); - - const base::Time last_modified = base::Time::FromInternalValue( - file_info.last_modified()); - const base::Time last_modified_by_me = - base::Time::FromInternalValue(entry.last_modified_by_me()); - const base::Time last_accessed = base::Time::FromInternalValue( - file_info.last_accessed()); - const base::Time creation_time = base::Time::FromInternalValue( - file_info.creation_time()); - StringAppendF(&out, " last_modified: %s\n", - google_apis::util::FormatTimeAsString(last_modified).c_str()); - StringAppendF( - &out, " last_modified_by_me: %s\n", - google_apis::util::FormatTimeAsString(last_modified_by_me).c_str()); - StringAppendF(&out, " last_accessed: %s\n", - google_apis::util::FormatTimeAsString(last_accessed).c_str()); - StringAppendF(&out, " creation_time: %s\n", - google_apis::util::FormatTimeAsString(creation_time).c_str()); - - if (entry.has_file_specific_info()) { - const drive::FileSpecificInfo& file_specific_info = - entry.file_specific_info(); - StringAppendF(&out, " content_mime_type: %s\n", - file_specific_info.content_mime_type().c_str()); - StringAppendF(&out, " file_md5: %s\n", - file_specific_info.md5().c_str()); - StringAppendF(&out, " document_extension: %s\n", - file_specific_info.document_extension().c_str()); - StringAppendF(&out, " is_hosted_document: %d\n", - file_specific_info.is_hosted_document()); - } - - if (entry.has_directory_specific_info()) { - StringAppendF(&out, " directory_info\n"); - const drive::DirectorySpecificInfo& directory_specific_info = - entry.directory_specific_info(); - StringAppendF(&out, " changestamp: %" PRId64 "\n", - directory_specific_info.changestamp()); - } - - return out; -} - // Appends {'key': key, 'value': value, 'class': clazz} dictionary to the // |list|. void AppendKeyValue(base::ListValue* list, @@ -335,22 +262,10 @@ base::BindRepeating(&DriveInternalsWebUIHandler::OnPeriodicUpdate, weak_ptr_factory_.GetWeakPtr())); web_ui()->RegisterMessageCallback( - "clearAccessToken", - base::BindRepeating(&DriveInternalsWebUIHandler::ClearAccessToken, - weak_ptr_factory_.GetWeakPtr())); - web_ui()->RegisterMessageCallback( - "clearRefreshToken", - base::BindRepeating(&DriveInternalsWebUIHandler::ClearRefreshToken, - weak_ptr_factory_.GetWeakPtr())); - web_ui()->RegisterMessageCallback( "resetDriveFileSystem", base::BindRepeating(&DriveInternalsWebUIHandler::ResetDriveFileSystem, weak_ptr_factory_.GetWeakPtr())); web_ui()->RegisterMessageCallback( - "listFileEntries", - base::BindRepeating(&DriveInternalsWebUIHandler::ListFileEntries, - weak_ptr_factory_.GetWeakPtr())); - web_ui()->RegisterMessageCallback( "zipLogs", base::BindRepeating(&DriveInternalsWebUIHandler::ZipDriveFsLogs, weak_ptr_factory_.GetWeakPtr())); @@ -441,224 +356,23 @@ drive_notification_manager ? drive_notification_manager->push_notification_enabled() : false); - auto* drive_service = GetDriveService(); - if (drive_service) { - connection_status.SetBoolean("has-refresh-token", - drive_service->HasRefreshToken()); - connection_status.SetBoolean("has-access-token", - drive_service->HasAccessToken()); - } MaybeCallJavascript("updateConnectionStatus", std::move(connection_status)); } void UpdateAboutResourceSection() { - if (IsDriveFsEnabled()) { - // TODO(crbug.com/896123): Maybe worth implementing. - SetSectionEnabled("account-information-section", false); - return; - } - - SetSectionEnabled("account-information-section", true); - auto* drive_service = GetDriveService(); - if (drive_service) { - drive_service->GetAboutResource( - base::Bind(&DriveInternalsWebUIHandler::OnGetAboutResource, - weak_ptr_factory_.GetWeakPtr())); - } - } - - // Called when GetAboutResource() call to DriveService is complete. - void OnGetAboutResource( - google_apis::DriveApiErrorCode status, - std::unique_ptr<google_apis::AboutResource> about_resource) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (status != google_apis::HTTP_SUCCESS) { - LOG(ERROR) << "Failed to get about resource"; - return; - } - DCHECK(about_resource); - - base::DictionaryValue data; - data.SetDouble("account-quota-total", about_resource->quota_bytes_total()); - data.SetDouble("account-quota-used", - about_resource->quota_bytes_used_aggregate()); - data.SetDouble("account-largest-changestamp-remote", - about_resource->largest_change_id()); - data.SetString("root-resource-id", about_resource->root_folder_id()); - - MaybeCallJavascript("updateAboutResource", std::move(data)); + // TODO(crbug.com/896123): Maybe worth implementing. + SetSectionEnabled("account-information-section", false); } void UpdateDeltaUpdateStatusSection() { - if (IsDriveFsEnabled()) { - // TODO(crbug.com/896123): Maybe worth implementing. - SetSectionEnabled("delta-update-status-section", false); - return; - } - - SetSectionEnabled("delta-update-status-section", true); - auto* debug_info_collector = GetDebugInfoCollector(); - if (debug_info_collector) { - debug_info_collector->GetMetadata(base::Bind( - &DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate, - weak_ptr_factory_.GetWeakPtr())); - } - } - - // Callback for DebugInfoCollector::GetMetadata for delta update. - void OnGetFilesystemMetadataForDeltaUpdate( - const drive::FileSystemMetadata& metadata, - const std::map<std::string, drive::FileSystemMetadata>& - team_drive_metadata) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - auto items = std::make_unique<base::ListValue>(); - // Users default corpus first. - auto app_data = std::make_unique<base::DictionaryValue>(); - app_data->SetString("id", "default corpus"); - app_data->SetString("root_entry_path", metadata.path); - app_data->SetString("start_page_token", metadata.start_page_token); - app_data->SetString("last_check_time", - google_apis::util::FormatTimeAsStringLocaltime( - metadata.last_update_check_time)); - app_data->SetString( - "last_check_result", - drive::FileErrorToString(metadata.last_update_check_error)); - app_data->SetString("refreshing", metadata.refreshing ? "Yes" : "No"); - - items->Append(std::move(app_data)); - - for (const auto& team_drive : team_drive_metadata) { - app_data = std::make_unique<base::DictionaryValue>(); - app_data->SetString("id", team_drive.first); - app_data->SetString("root_entry_path", team_drive.second.path); - app_data->SetString("start_page_token", - team_drive.second.start_page_token); - app_data->SetString("last_check_time", - google_apis::util::FormatTimeAsStringLocaltime( - team_drive.second.last_update_check_time)); - app_data->SetString( - "last_check_result", - drive::FileErrorToString(team_drive.second.last_update_check_error)); - app_data->SetString("refreshing", - team_drive.second.refreshing ? "Yes" : "No"); - items->Append(std::move(app_data)); - } - - base::DictionaryValue delta_update_status; - delta_update_status.Set("items", std::move(items)); - - MaybeCallJavascript("updateDeltaUpdateStatus", - std::move(delta_update_status)); + // TODO(crbug.com/896123): Maybe worth implementing. + SetSectionEnabled("delta-update-status-section", false); } void UpdateInFlightOperationsSection() { - if (IsDriveFsEnabled()) { - // TODO(crbug.com/896123): Maybe worth implementing. - SetSectionEnabled("in-flight-operations-section", false); - return; - } - - SetSectionEnabled("in-flight-operations-section", true); - auto* integration_service = GetIntegrationService(); - if (!integration_service) - return; - drive::JobListInterface* job_list = integration_service->job_list(); - if (!job_list) - return; - std::vector<drive::JobInfo> info_list = job_list->GetJobInfoList(); - - base::ListValue in_flight_operations; - for (size_t i = 0; i < info_list.size(); ++i) { - const drive::JobInfo& info = info_list[i]; - - auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetInteger("id", info.job_id); - dict->SetString("type", drive::JobTypeToString(info.job_type)); - dict->SetString("file_path", info.file_path.AsUTF8Unsafe()); - dict->SetString("state", drive::JobStateToString(info.state)); - dict->SetDouble("progress_current", info.num_completed_bytes); - dict->SetDouble("progress_total", info.num_total_bytes); - in_flight_operations.Append(std::move(dict)); - } - - MaybeCallJavascript("updateInFlightOperations", - std::move(in_flight_operations)); - } - - void UpdateFileSystemContentsSection() { - if (IsDriveFsEnabled()) { - SetSectionEnabled("file-system-contents-section", false); - return; - } - - SetSectionEnabled("file-system-contents-section", true); - drive::DebugInfoCollector* debug_info_collector = GetDebugInfoCollector(); - if (!debug_info_collector) - return; - - // Start rendering the file system tree as text. - const base::FilePath root_path = drive::util::GetDriveGrandRootPath(); - - debug_info_collector->GetResourceEntry( - root_path, - base::BindOnce(&DriveInternalsWebUIHandler::OnGetResourceEntryByPath, - weak_ptr_factory_.GetWeakPtr(), root_path)); - - debug_info_collector->ReadDirectory( - root_path, - base::Bind(&DriveInternalsWebUIHandler::OnReadDirectoryByPath, - weak_ptr_factory_.GetWeakPtr(), root_path)); - } - - // Called when GetResourceEntryByPath() is complete. - void OnGetResourceEntryByPath(const base::FilePath& path, - drive::FileError error, - std::unique_ptr<drive::ResourceEntry> entry) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (error == drive::FILE_ERROR_OK) { - DCHECK(entry.get()); - MaybeCallJavascript("updateFileSystemContents", - base::Value(FormatEntry(path, *entry) + "\n")); - } - } - - // Called when ReadDirectoryByPath() is complete. - void OnReadDirectoryByPath( - const base::FilePath& parent_path, - drive::FileError error, - std::unique_ptr<drive::ResourceEntryVector> entries) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (error == drive::FILE_ERROR_OK) { - DCHECK(entries.get()); - - drive::DebugInfoCollector* debug_info_collector = GetDebugInfoCollector(); - std::string file_system_as_text; - for (size_t i = 0; i < entries->size(); ++i) { - const drive::ResourceEntry& entry = (*entries)[i]; - const base::FilePath current_path = parent_path.Append( - base::FilePath::FromUTF8Unsafe(entry.base_name())); - - file_system_as_text.append(FormatEntry(current_path, entry) + "\n"); - - if (entry.file_info().is_directory()) { - debug_info_collector->ReadDirectory( - current_path, - base::Bind(&DriveInternalsWebUIHandler::OnReadDirectoryByPath, - weak_ptr_factory_.GetWeakPtr(), current_path)); - } - } - - // There may be pending ReadDirectoryByPath() calls, but we can update - // the page with what we have now. This results in progressive - // updates, which is good for a large file system. - MaybeCallJavascript("updateFileSystemContents", - base::Value(file_system_as_text)); - } + // TODO(crbug.com/896123): Maybe worth implementing. + SetSectionEnabled("in-flight-operations-section", false); } void UpdatePathConfigurationsSection() { @@ -727,8 +441,6 @@ PrefService* pref_service = profile()->GetPrefs(); base::ListValue preferences; - AppendKeyValue(&preferences, "DriveFS", - IsDriveFsEnabled() ? "true" : "false"); for (size_t i = 0; i < base::size(kDriveRelatedPreferences); ++i) { const std::string key = kDriveRelatedPreferences[i]; // As of now, all preferences are boolean. @@ -772,10 +484,6 @@ } void UpdateServiceLogSection() { - if (!IsDriveFsEnabled()) { - SetSectionEnabled("service-log-section", false); - return; - } SetSectionEnabled("service-log-section", true); if (service_log_file_is_processing_) @@ -818,36 +526,8 @@ } void UpdateCacheContentsSection() { - if (IsDriveFsEnabled()) { - // TODO(crbug.com/896123): Maybe worth implementing. - SetSectionEnabled("cache-contents-section", false); - return; - } - SetSectionEnabled("cache-contents-section", true); - - auto* debug_info_collector = GetDebugInfoCollector(); - if (debug_info_collector) { - debug_info_collector->IterateFileCache( - base::Bind(&DriveInternalsWebUIHandler::OnUpdateCacheEntry, - weak_ptr_factory_.GetWeakPtr()), - base::DoNothing()); - } - } - - // Called as the iterator for DebugInfoCollector::IterateFileCache(). - void OnUpdateCacheEntry(const std::string& local_id, - const drive::FileCacheEntry& cache_entry) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - // Convert |cache_entry| into a dictionary. - base::DictionaryValue value; - value.SetString("local_id", local_id); - value.SetString("md5", cache_entry.md5()); - value.SetBoolean("is_present", cache_entry.is_present()); - value.SetBoolean("is_pinned", cache_entry.is_pinned()); - value.SetBoolean("is_dirty", cache_entry.is_dirty()); - - MaybeCallJavascript("updateCacheContents", std::move(value)); + // TODO(crbug.com/896123): Maybe worth implementing. + SetSectionEnabled("cache-contents-section", false); } void UpdateGCacheContentsSection() { @@ -873,24 +553,6 @@ } // Called when the corresponding button on the page is pressed. - void ClearAccessToken(const base::ListValue* args) { - AllowJavascript(); - - drive::DriveServiceInterface* drive_service = GetDriveService(); - if (drive_service) - drive_service->ClearAccessToken(); - } - - // Called when the corresponding button on the page is pressed. - void ClearRefreshToken(const base::ListValue* args) { - AllowJavascript(); - - drive::DriveServiceInterface* drive_service = GetDriveService(); - if (drive_service) - drive_service->ClearRefreshToken(); - } - - // Called when the corresponding button on the page is pressed. void ResetDriveFileSystem(const base::ListValue* args) { AllowJavascript(); @@ -903,13 +565,6 @@ } } - // Called when the corresponding button on the page is pressed. - void ListFileEntries(const base::ListValue* args) { - AllowJavascript(); - - UpdateFileSystemContentsSection(); - } - void ZipDriveFsLogs(const base::ListValue* args) { AllowJavascript(); @@ -941,24 +596,6 @@ return service; } - // Returns a DriveService instance. - drive::DriveServiceInterface* GetDriveService() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - return drive::util::GetDriveServiceByProfile(profile()); - } - - // Returns a DebugInfoCollector instance. - drive::DebugInfoCollector* GetDebugInfoCollector() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - drive::DriveIntegrationService* service = GetIntegrationService(); - return service ? service->debug_info_collector() : NULL; - } - - // Whether DriveFS is enabled. - bool IsDriveFsEnabled() { - return base::FeatureList::IsEnabled(chromeos::features::kDriveFs); - } - // The last event sent to the JavaScript side. int last_sent_event_id_;
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc index 49242cca..b6d95cd3 100644 --- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -65,17 +65,16 @@ void AssistantOptInFlowScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { builder->Add("locale", g_browser_process->GetApplicationLocale()); - builder->Add("assistantLogo", IDS_VOICE_INTERACTION_LOGO); - builder->Add("assistantOptinLoading", - IDS_VOICE_INTERACTION_VALUE_PROP_LOADING); + builder->Add("assistantLogo", IDS_ASSISTANT_LOGO); + builder->Add("assistantOptinLoading", IDS_ASSISTANT_VALUE_PROP_LOADING); builder->Add("assistantOptinLoadErrorTitle", - IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_TITLE); + IDS_ASSISTANT_VALUE_PROP_LOAD_ERROR_TITLE); builder->Add("assistantOptinLoadErrorMessage", - IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_MESSAGE); + IDS_ASSISTANT_VALUE_PROP_LOAD_ERROR_MESSAGE); builder->Add("assistantOptinSkipButton", - IDS_VOICE_INTERACTION_VALUE_PROP_SKIP_BUTTON); + IDS_ASSISTANT_VALUE_PROP_SKIP_BUTTON); builder->Add("assistantOptinRetryButton", - IDS_VOICE_INTERACTION_VALUE_PROP_RETRY_BUTTON); + IDS_ASSISTANT_VALUE_PROP_RETRY_BUTTON); builder->Add("assistantVoiceMatchTitle", IDS_ASSISTANT_VOICE_MATCH_TITLE); builder->Add("assistantVoiceMatchMessage", IDS_ASSISTANT_VOICE_MATCH_MESSAGE); builder->Add("assistantVoiceMatchNoDspMessage",
diff --git a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc index 2c97430..03603cd 100644 --- a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc +++ b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc
@@ -5,12 +5,14 @@ #include "chrome/browser/ui/webui/engagement/site_engagement_ui.h" #include <cmath> +#include <memory> #include <utility> #include <vector> #include "base/bind.h" #include "base/callback.h" #include "base/macros.h" +#include "chrome/browser/engagement/site_engagement_details.mojom.h" #include "chrome/browser/engagement/site_engagement_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" @@ -18,7 +20,8 @@ #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 "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace { @@ -30,8 +33,8 @@ // Instance is deleted when the supplied pipe is destroyed. SiteEngagementDetailsProviderImpl( Profile* profile, - mojo::InterfaceRequest<mojom::SiteEngagementDetailsProvider> request) - : profile_(profile), binding_(this, std::move(request)) { + mojo::PendingReceiver<mojom::SiteEngagementDetailsProvider> receiver) + : profile_(profile), receiver_(this, std::move(receiver)) { DCHECK(profile_); } @@ -70,7 +73,7 @@ // The Profile* handed to us in our constructor. Profile* profile_; - mojo::Binding<mojom::SiteEngagementDetailsProvider> binding_; + mojo::Receiver<mojom::SiteEngagementDetailsProvider> receiver_; DISALLOW_COPY_AND_ASSIGN(SiteEngagementDetailsProviderImpl); }; @@ -97,7 +100,7 @@ SiteEngagementUI::~SiteEngagementUI() {} void SiteEngagementUI::BindSiteEngagementDetailsProvider( - mojom::SiteEngagementDetailsProviderRequest request) { + mojo::PendingReceiver<mojom::SiteEngagementDetailsProvider> receiver) { ui_handler_ = std::make_unique<SiteEngagementDetailsProviderImpl>( - Profile::FromWebUI(web_ui()), std::move(request)); + Profile::FromWebUI(web_ui()), std::move(receiver)); }
diff --git a/chrome/browser/ui/webui/engagement/site_engagement_ui.h b/chrome/browser/ui/webui/engagement/site_engagement_ui.h index 1d84444..119a1229 100644 --- a/chrome/browser/ui/webui/engagement/site_engagement_ui.h +++ b/chrome/browser/ui/webui/engagement/site_engagement_ui.h
@@ -7,6 +7,7 @@ #include "base/macros.h" #include "chrome/browser/engagement/site_engagement_details.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "ui/webui/mojo_web_ui_controller.h" // The UI for chrome://site-engagement/. @@ -17,7 +18,7 @@ private: void BindSiteEngagementDetailsProvider( - mojom::SiteEngagementDetailsProviderRequest request); + mojo::PendingReceiver<mojom::SiteEngagementDetailsProvider> receiver); std::unique_ptr<mojom::SiteEngagementDetailsProvider> ui_handler_;
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 26cc936..44eac083 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -11,7 +11,7 @@ source_set("web_applications") { sources = [ - "abstract_web_app_database.h", + "abstract_web_app_sync_bridge.h", "external_web_app_manager.cc", "external_web_app_manager.h", "file_utils_wrapper.cc", @@ -93,10 +93,10 @@ "test/test_pending_app_manager.h", "test/test_system_web_app_manager.cc", "test/test_system_web_app_manager.h", - "test/test_web_app_database.cc", - "test/test_web_app_database.h", "test/test_web_app_database_factory.cc", "test/test_web_app_database_factory.h", + "test/test_web_app_sync_bridge.cc", + "test/test_web_app_sync_bridge.h", "test/test_web_app_ui_manager.cc", "test/test_web_app_ui_manager.h", "test/test_web_app_url_loader.cc",
diff --git a/chrome/browser/web_applications/abstract_web_app_database.h b/chrome/browser/web_applications/abstract_web_app_sync_bridge.h similarity index 66% rename from chrome/browser/web_applications/abstract_web_app_database.h rename to chrome/browser/web_applications/abstract_web_app_sync_bridge.h index c4bb9d7f..9c52de8 100644 --- a/chrome/browser/web_applications/abstract_web_app_database.h +++ b/chrome/browser/web_applications/abstract_web_app_sync_bridge.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_DATABASE_H_ -#define CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_DATABASE_H_ +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_SYNC_BRIDGE_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_SYNC_BRIDGE_H_ #include <map> #include <vector> @@ -18,21 +18,21 @@ using Registry = std::map<AppId, std::unique_ptr<WebApp>>; -// An abstract database for the registry persistence. +// An abstract sync bridge for registry persistence and data updates. // Exclusively used from the UI thread. -class AbstractWebAppDatabase { +class AbstractWebAppSyncBridge { public: - virtual ~AbstractWebAppDatabase() = default; + virtual ~AbstractWebAppSyncBridge() = default; - using OnceRegistryOpenedCallback = - base::OnceCallback<void(Registry registry)>; - // Open existing or create new DB. Read all data and return it via callback. - virtual void OpenDatabase(OnceRegistryOpenedCallback callback) = 0; + using RegistryOpenedCallback = base::OnceCallback<void(Registry registry)>; using CompletionCallback = base::OnceCallback<void(bool success)>; using AppsToWrite = base::flat_set<const WebApp*>; + // Open existing or create new DB. Read all data and return it via callback. + virtual void OpenDatabase(RegistryOpenedCallback callback) = 0; + // |OpenDatabase| must have been called and completed before using any other // methods. Otherwise, it fails with DCHECK. virtual void WriteWebApps(AppsToWrite apps, CompletionCallback callback) = 0; @@ -42,4 +42,4 @@ } // namespace web_app -#endif // CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_DATABASE_H_ +#endif // CHROME_BROWSER_WEB_APPLICATIONS_ABSTRACT_WEB_APP_SYNC_BRIDGE_H_
diff --git a/chrome/browser/web_applications/pending_app_manager_impl.h b/chrome/browser/web_applications/pending_app_manager_impl.h index cbef720..3974f2f 100644 --- a/chrome/browser/web_applications/pending_app_manager_impl.h +++ b/chrome/browser/web_applications/pending_app_manager_impl.h
@@ -79,10 +79,6 @@ void OnUrlLoaded(WebAppUrlLoader::Result result); - void UninstallPlaceholderIfNecessary(); - - void OnPlaceholderUninstalled(bool succeeded); - void OnInstalled(PendingAppInstallTask::Result result); void CurrentInstallationFinished(const base::Optional<std::string>& app_id,
diff --git a/chrome/browser/web_applications/test/test_web_app_database.cc b/chrome/browser/web_applications/test/test_web_app_database.cc deleted file mode 100644 index 1a94c05..0000000 --- a/chrome/browser/web_applications/test/test_web_app_database.cc +++ /dev/null
@@ -1,44 +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/web_applications/test/test_web_app_database.h" - -#include "chrome/browser/web_applications/web_app.h" - -namespace web_app { - -TestWebAppDatabase::TestWebAppDatabase() {} - -TestWebAppDatabase::~TestWebAppDatabase() {} - -void TestWebAppDatabase::OpenDatabase(OnceRegistryOpenedCallback callback) { - open_database_callback_ = std::move(callback); -} - -void TestWebAppDatabase::WriteWebApps(AppsToWrite apps, - CompletionCallback callback) { - for (auto* app : apps) - write_web_app_ids_.push_back(app->app_id()); - - std::move(callback).Run(next_write_web_apps_result_); -} - -void TestWebAppDatabase::DeleteWebApps(std::vector<AppId> app_ids, - CompletionCallback callback) { - delete_web_app_ids_ = std::move(app_ids); - - std::move(callback).Run(next_delete_web_apps_result_); -} - -void TestWebAppDatabase::SetNextWriteWebAppsResult( - bool next_write_web_apps_result) { - next_write_web_apps_result_ = next_write_web_apps_result; -} - -void TestWebAppDatabase::SetNextDeleteWebAppsResult( - bool next_delete_web_apps_result) { - next_delete_web_apps_result_ = next_delete_web_apps_result; -} - -} // namespace web_app
diff --git a/chrome/browser/web_applications/test/test_web_app_database.h b/chrome/browser/web_applications/test/test_web_app_database.h deleted file mode 100644 index 76861c3..0000000 --- a/chrome/browser/web_applications/test/test_web_app_database.h +++ /dev/null
@@ -1,50 +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. - -#ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_DATABASE_H_ -#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_DATABASE_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "chrome/browser/web_applications/abstract_web_app_database.h" - -namespace web_app { - -class TestWebAppDatabase : public AbstractWebAppDatabase { - public: - TestWebAppDatabase(); - ~TestWebAppDatabase() override; - - // AbstractWebAppDatabase: - void OpenDatabase(OnceRegistryOpenedCallback callback) override; - void WriteWebApps(AppsToWrite apps, CompletionCallback callback) override; - void DeleteWebApps(std::vector<AppId> app_ids, - CompletionCallback callback) override; - - OnceRegistryOpenedCallback TakeOpenDatabaseCallback() { - return std::move(open_database_callback_); - } - - void SetNextWriteWebAppsResult(bool next_write_web_apps_result); - void SetNextDeleteWebAppsResult(bool next_delete_web_apps_result); - - using AppIds = std::vector<AppId>; - - const AppIds& write_web_app_ids() const { return write_web_app_ids_; } - const AppIds& delete_web_app_ids() const { return delete_web_app_ids_; } - - private: - OnceRegistryOpenedCallback open_database_callback_; - AppIds write_web_app_ids_; - AppIds delete_web_app_ids_; - - bool next_write_web_apps_result_ = true; - bool next_delete_web_apps_result_ = true; - - DISALLOW_COPY_AND_ASSIGN(TestWebAppDatabase); -}; - -} // namespace web_app - -#endif // CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_DATABASE_H_
diff --git a/chrome/browser/web_applications/test/test_web_app_sync_bridge.cc b/chrome/browser/web_applications/test/test_web_app_sync_bridge.cc new file mode 100644 index 0000000..968c322 --- /dev/null +++ b/chrome/browser/web_applications/test/test_web_app_sync_bridge.cc
@@ -0,0 +1,44 @@ +// 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/web_applications/test/test_web_app_sync_bridge.h" + +#include "chrome/browser/web_applications/web_app.h" + +namespace web_app { + +TestWebAppSyncBridge::TestWebAppSyncBridge() {} + +TestWebAppSyncBridge::~TestWebAppSyncBridge() {} + +void TestWebAppSyncBridge::OpenDatabase(RegistryOpenedCallback callback) { + open_database_callback_ = std::move(callback); +} + +void TestWebAppSyncBridge::WriteWebApps(AppsToWrite apps, + CompletionCallback callback) { + for (auto* app : apps) + write_web_app_ids_.push_back(app->app_id()); + + std::move(callback).Run(next_write_web_apps_result_); +} + +void TestWebAppSyncBridge::DeleteWebApps(AppIds app_ids, + CompletionCallback callback) { + delete_web_app_ids_ = std::move(app_ids); + + std::move(callback).Run(next_delete_web_apps_result_); +} + +void TestWebAppSyncBridge::SetNextWriteWebAppsResult( + bool next_write_web_apps_result) { + next_write_web_apps_result_ = next_write_web_apps_result; +} + +void TestWebAppSyncBridge::SetNextDeleteWebAppsResult( + bool next_delete_web_apps_result) { + next_delete_web_apps_result_ = next_delete_web_apps_result; +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/test/test_web_app_sync_bridge.h b/chrome/browser/web_applications/test/test_web_app_sync_bridge.h new file mode 100644 index 0000000..298ba3e4 --- /dev/null +++ b/chrome/browser/web_applications/test/test_web_app_sync_bridge.h
@@ -0,0 +1,49 @@ +// 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. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_SYNC_BRIDGE_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_SYNC_BRIDGE_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "chrome/browser/web_applications/abstract_web_app_sync_bridge.h" + +namespace web_app { + +class TestWebAppSyncBridge : public AbstractWebAppSyncBridge { + public: + TestWebAppSyncBridge(); + ~TestWebAppSyncBridge() override; + + using AppIds = std::vector<AppId>; + + // AbstractWebAppSyncBridge: + void OpenDatabase(RegistryOpenedCallback callback) override; + void WriteWebApps(AppsToWrite apps, CompletionCallback callback) override; + void DeleteWebApps(AppIds app_ids, CompletionCallback callback) override; + + RegistryOpenedCallback TakeOpenDatabaseCallback() { + return std::move(open_database_callback_); + } + + void SetNextWriteWebAppsResult(bool next_write_web_apps_result); + void SetNextDeleteWebAppsResult(bool next_delete_web_apps_result); + + const AppIds& write_web_app_ids() const { return write_web_app_ids_; } + const AppIds& delete_web_app_ids() const { return delete_web_app_ids_; } + + private: + RegistryOpenedCallback open_database_callback_; + AppIds write_web_app_ids_; + AppIds delete_web_app_ids_; + + bool next_write_web_apps_result_ = true; + bool next_delete_web_apps_result_ = true; + + DISALLOW_COPY_AND_ASSIGN(TestWebAppSyncBridge); +}; + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_WEB_APP_SYNC_BRIDGE_H_
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index 0637faa..7b007972 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -24,7 +24,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -void WebAppDatabase::OpenDatabase(OnceRegistryOpenedCallback callback) { +void WebAppDatabase::OpenDatabase(RegistryOpenedCallback callback) { DCHECK(!store_); syncer::OnceModelTypeStoreFactory store_factory = @@ -201,7 +201,7 @@ return web_app; } -void WebAppDatabase::ReadRegistry(OnceRegistryOpenedCallback callback) { +void WebAppDatabase::ReadRegistry(RegistryOpenedCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(store_); store_->ReadAllData(base::BindOnce(&WebAppDatabase::OnAllDataRead, @@ -235,7 +235,7 @@ } void WebAppDatabase::OnAllDataRead( - OnceRegistryOpenedCallback callback, + RegistryOpenedCallback callback, const base::Optional<syncer::ModelError>& error, std::unique_ptr<syncer::ModelTypeStore::RecordList> data_records) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chrome/browser/web_applications/web_app_database.h b/chrome/browser/web_applications/web_app_database.h index ecb430a0..c67b673 100644 --- a/chrome/browser/web_applications/web_app_database.h +++ b/chrome/browser/web_applications/web_app_database.h
@@ -12,7 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/sequence_checker.h" -#include "chrome/browser/web_applications/abstract_web_app_database.h" +#include "chrome/browser/web_applications/abstract_web_app_sync_bridge.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" #include "components/sync/model/model_type_store.h" @@ -27,23 +27,26 @@ class WebAppProto; // Exclusively used from the UI thread. -class WebAppDatabase : public AbstractWebAppDatabase { +class WebAppDatabase { public: explicit WebAppDatabase(AbstractWebAppDatabaseFactory* database_factory); - ~WebAppDatabase() override; + ~WebAppDatabase(); - // AbstractWebAppDatabase: - void OpenDatabase(OnceRegistryOpenedCallback callback) override; - void WriteWebApps(AppsToWrite apps, CompletionCallback callback) override; - void DeleteWebApps(std::vector<AppId> app_ids, - CompletionCallback callback) override; + using RegistryOpenedCallback = + AbstractWebAppSyncBridge::RegistryOpenedCallback; + using CompletionCallback = AbstractWebAppSyncBridge::CompletionCallback; + using AppsToWrite = AbstractWebAppSyncBridge::AppsToWrite; + + void OpenDatabase(RegistryOpenedCallback callback); + void WriteWebApps(AppsToWrite apps, CompletionCallback callback); + void DeleteWebApps(std::vector<AppId> app_ids, CompletionCallback callback); // Exposed for testing. static std::unique_ptr<WebAppProto> CreateWebAppProto(const WebApp& web_app); // Exposed for testing. static std::unique_ptr<WebApp> CreateWebApp(const WebAppProto& proto); // Exposed for testing. - void ReadRegistry(OnceRegistryOpenedCallback callback); + void ReadRegistry(RegistryOpenedCallback callback); private: void CreateStore(syncer::OnceModelTypeStoreFactory store_factory, @@ -53,7 +56,7 @@ std::unique_ptr<syncer::ModelTypeStore> store); void OnAllDataRead( - OnceRegistryOpenedCallback callback, + RegistryOpenedCallback callback, const base::Optional<syncer::ModelError>& error, std::unique_ptr<syncer::ModelTypeStore::RecordList> data_records);
diff --git a/chrome/browser/web_applications/web_app_database_unittest.cc b/chrome/browser/web_applications/web_app_database_unittest.cc index c569539..0044377 100644 --- a/chrome/browser/web_applications/web_app_database_unittest.cc +++ b/chrome/browser/web_applications/web_app_database_unittest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/web_applications/test/test_web_app_database_factory.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "components/sync/model/model_type_store.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -45,8 +46,8 @@ public: WebAppDatabaseTest() { database_factory_ = std::make_unique<TestWebAppDatabaseFactory>(); - database_ = std::make_unique<WebAppDatabase>(database_factory_.get()); - registrar_ = std::make_unique<WebAppRegistrar>(nullptr, database_.get()); + sync_bridge_ = std::make_unique<WebAppSyncBridge>(database_factory_.get()); + registrar_ = std::make_unique<WebAppRegistrar>(nullptr, sync_bridge_.get()); } void InitRegistrar() { @@ -109,7 +110,7 @@ Registry registry; base::RunLoop run_loop; - database_->ReadRegistry(base::BindLambdaForTesting([&](Registry r) { + sync_bridge().ReadRegistry(base::BindLambdaForTesting([&](Registry r) { registry = std::move(r); run_loop.Quit(); })); @@ -159,7 +160,7 @@ } protected: - WebAppDatabase& database() { return *database_; } + WebAppSyncBridge& sync_bridge() { return *sync_bridge_; } WebAppRegistrar& registrar() { return *registrar_; } private: @@ -167,7 +168,7 @@ base::test::SingleThreadTaskEnvironment task_environment_; std::unique_ptr<TestWebAppDatabaseFactory> database_factory_; - std::unique_ptr<WebAppDatabase> database_; + std::unique_ptr<WebAppSyncBridge> sync_bridge_; std::unique_ptr<WebAppRegistrar> registrar_; }; @@ -216,11 +217,11 @@ { base::RunLoop run_loop; - database().WriteWebApps(std::move(apps_to_write), - base::BindLambdaForTesting([&](bool success) { - EXPECT_TRUE(success); - run_loop.Quit(); - })); + sync_bridge().WriteWebApps(std::move(apps_to_write), + base::BindLambdaForTesting([&](bool success) { + EXPECT_TRUE(success); + run_loop.Quit(); + })); run_loop.Run(); Registry registry_written = ReadRegistry(); @@ -229,11 +230,11 @@ { base::RunLoop run_loop; - database().DeleteWebApps(std::move(apps_to_delete), - base::BindLambdaForTesting([&](bool success) { - EXPECT_TRUE(success); - run_loop.Quit(); - })); + sync_bridge().DeleteWebApps(std::move(apps_to_delete), + base::BindLambdaForTesting([&](bool success) { + EXPECT_TRUE(success); + run_loop.Quit(); + })); run_loop.Run(); Registry registry_deleted = ReadRegistry();
diff --git a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc index 9e7689df..cb150ef 100644 --- a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc +++ b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
@@ -9,7 +9,7 @@ #include "base/test/bind_test_util.h" #include "chrome/browser/web_applications/components/web_app_icon_generator.h" #include "chrome/browser/web_applications/test/test_file_utils.h" -#include "chrome/browser/web_applications/test/test_web_app_database.h" +#include "chrome/browser/web_applications/test/test_web_app_sync_bridge.h" #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h" #include "chrome/browser/web_applications/test/web_app_test.h" #include "chrome/browser/web_applications/web_app.h" @@ -27,8 +27,8 @@ auto file_utils = std::make_unique<TestFileUtils>(); file_utils_ = file_utils.get(); - database_ = std::make_unique<TestWebAppDatabase>(); - registrar_ = std::make_unique<WebAppRegistrar>(nullptr, database_.get()); + sync_bridge_ = std::make_unique<TestWebAppSyncBridge>(); + registrar_ = std::make_unique<WebAppRegistrar>(nullptr, sync_bridge_.get()); icon_manager_ = std::make_unique<WebAppIconManager>(profile(), *registrar_, std::move(file_utils)); } @@ -69,7 +69,7 @@ return icons; } - std::unique_ptr<TestWebAppDatabase> database_; + std::unique_ptr<TestWebAppSyncBridge> sync_bridge_; std::unique_ptr<WebAppRegistrar> registrar_; std::unique_ptr<WebAppIconManager> icon_manager_;
diff --git a/chrome/browser/web_applications/web_app_install_task_unittest.cc b/chrome/browser/web_applications/web_app_install_task_unittest.cc index 0b28abd..90386e5 100644 --- a/chrome/browser/web_applications/web_app_install_task_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_task_unittest.cc
@@ -25,7 +25,7 @@ #include "chrome/browser/web_applications/test/test_data_retriever.h" #include "chrome/browser/web_applications/test/test_file_utils.h" #include "chrome/browser/web_applications/test/test_install_finalizer.h" -#include "chrome/browser/web_applications/test/test_web_app_database.h" +#include "chrome/browser/web_applications/test/test_web_app_sync_bridge.h" #include "chrome/browser/web_applications/test/test_web_app_ui_manager.h" #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h" #include "chrome/browser/web_applications/test/web_app_test.h" @@ -116,8 +116,9 @@ void SetUp() override { WebAppTest::SetUp(); - database_ = std::make_unique<TestWebAppDatabase>(); - registrar_ = std::make_unique<WebAppRegistrar>(profile(), database_.get()); + sync_bridge_ = std::make_unique<TestWebAppSyncBridge>(); + registrar_ = + std::make_unique<WebAppRegistrar>(profile(), sync_bridge_.get()); auto file_utils = std::make_unique<TestFileUtils>(); file_utils_ = file_utils.get(); @@ -312,7 +313,7 @@ } protected: - std::unique_ptr<TestWebAppDatabase> database_; + std::unique_ptr<TestWebAppSyncBridge> sync_bridge_; std::unique_ptr<WebAppRegistrar> registrar_; std::unique_ptr<WebAppIconManager> icon_manager_; std::unique_ptr<WebAppInstallTask> install_task_;
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc index a7fac2c..c528b1f 100644 --- a/chrome/browser/web_applications/web_app_provider.cc +++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/web_applications/file_utils_wrapper.h" #include "chrome/browser/web_applications/pending_app_manager_impl.h" #include "chrome/browser/web_applications/system_web_app_manager.h" -#include "chrome/browser/web_applications/web_app_database.h" #include "chrome/browser/web_applications/web_app_database_factory.h" #include "chrome/browser/web_applications/web_app_file_handler_manager.h" #include "chrome/browser/web_applications/web_app_icon_manager.h" @@ -156,9 +155,8 @@ void WebAppProvider::CreateWebAppsSubsystems(Profile* profile) { database_factory_ = std::make_unique<WebAppDatabaseFactory>(profile); - database_ = std::make_unique<WebAppDatabase>(database_factory_.get()); - registrar_ = std::make_unique<WebAppRegistrar>(profile, database_.get()); - sync_bridge_ = std::make_unique<WebAppSyncBridge>(); + sync_bridge_ = std::make_unique<WebAppSyncBridge>(database_factory_.get()); + registrar_ = std::make_unique<WebAppRegistrar>(profile, sync_bridge_.get()); auto icon_manager = std::make_unique<WebAppIconManager>( profile, *registrar_->AsWebAppRegistrar(), std::make_unique<FileUtilsWrapper>());
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h index 6a896bb5..9abfcdd 100644 --- a/chrome/browser/web_applications/web_app_provider.h +++ b/chrome/browser/web_applications/web_app_provider.h
@@ -42,7 +42,6 @@ // Forward declarations for new extension-independent subsystems. class WebAppDatabaseFactory; -class WebAppDatabase; class WebAppSyncBridge; // Connects Web App features, such as the installation of default and @@ -78,7 +77,6 @@ FileHandlerManager& file_handler_manager() override; AppIconManager& icon_manager() override; - WebAppDatabaseFactory& database_factory() { return *database_factory_; } WebAppSyncBridge& sync_bridge() { return *sync_bridge_; } SystemWebAppManager& system_web_app_manager(); @@ -113,7 +111,6 @@ // New extension-independent subsystems: std::unique_ptr<WebAppDatabaseFactory> database_factory_; - std::unique_ptr<WebAppDatabase> database_; std::unique_ptr<WebAppSyncBridge> sync_bridge_; // Generalized subsystems:
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index 3b4cd57..ab628e3 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -14,7 +14,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/strings/string_util.h" -#include "chrome/browser/web_applications/abstract_web_app_database.h" +#include "chrome/browser/web_applications/abstract_web_app_sync_bridge.h" #include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_registry_update.h" @@ -22,9 +22,9 @@ namespace web_app { WebAppRegistrar::WebAppRegistrar(Profile* profile, - AbstractWebAppDatabase* database) - : AppRegistrar(profile), database_(database) { - DCHECK(database_); + AbstractWebAppSyncBridge* sync_bridge) + : AppRegistrar(profile), sync_bridge_(sync_bridge) { + DCHECK(sync_bridge_); } WebAppRegistrar::~WebAppRegistrar() = default; @@ -37,7 +37,7 @@ DCHECK(!GetAppById(app_id)); // TODO(loyso): Expose CompletionCallback as RegisterApp argument. - database_->WriteWebApps({web_app.get()}, base::DoNothing()); + sync_bridge_->WriteWebApps({web_app.get()}, base::DoNothing()); registry_.emplace(app_id, std::move(web_app)); } @@ -48,7 +48,7 @@ DCHECK(!app_id.empty()); // TODO(loyso): Expose CompletionCallback as UnregisterApp argument. - database_->DeleteWebApps({app_id}, base::DoNothing()); + sync_bridge_->DeleteWebApps({app_id}, base::DoNothing()); auto kv = registry_.find(app_id); DCHECK(kv != registry_.end()); @@ -62,7 +62,7 @@ CountMutation(); // TODO(loyso): Expose CompletionCallback as UnregisterAll argument. - database_->DeleteWebApps(GetAppIds(), base::DoNothing()); + sync_bridge_->DeleteWebApps(GetAppIds(), base::DoNothing()); registry_.clear(); } @@ -92,16 +92,16 @@ DCHECK(GetAppById(app->app_id())); #endif - database_->WriteWebApps( + sync_bridge_->WriteWebApps( std::move(update->apps_to_update_), base::BindOnce(&WebAppRegistrar::OnDataWritten, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void WebAppRegistrar::Init(base::OnceClosure callback) { - database_->OpenDatabase(base::BindOnce(&WebAppRegistrar::OnDatabaseOpened, - weak_ptr_factory_.GetWeakPtr(), - std::move(callback))); + sync_bridge_->OpenDatabase(base::BindOnce(&WebAppRegistrar::OnDatabaseOpened, + weak_ptr_factory_.GetWeakPtr(), + std::move(callback))); } void WebAppRegistrar::OnDatabaseOpened(base::OnceClosure callback,
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index 69d0444..6f0965a 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -14,7 +14,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "chrome/browser/web_applications/abstract_web_app_database.h" +#include "chrome/browser/web_applications/abstract_web_app_sync_bridge.h" #include "chrome/browser/web_applications/components/app_registrar.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" @@ -26,7 +26,8 @@ // A registry. This is a read-only container, which owns WebApp objects. class WebAppRegistrar : public AppRegistrar { public: - explicit WebAppRegistrar(Profile* profile, AbstractWebAppDatabase* database); + explicit WebAppRegistrar(Profile* profile, + AbstractWebAppSyncBridge* sync_bridge); ~WebAppRegistrar() override; void RegisterApp(std::unique_ptr<WebApp> web_app); @@ -128,8 +129,8 @@ Registry registry_; - // An abstract database, not owned by this registrar. - AbstractWebAppDatabase* database_; + // An abstract sync bridge to handle all local changes and persistence. + AbstractWebAppSyncBridge* sync_bridge_; bool is_in_update_ = false;
diff --git a/chrome/browser/web_applications/web_app_registrar_unittest.cc b/chrome/browser/web_applications/web_app_registrar_unittest.cc index 31bd9bc..9bf02e6 100644 --- a/chrome/browser/web_applications/web_app_registrar_unittest.cc +++ b/chrome/browser/web_applications/web_app_registrar_unittest.cc
@@ -16,7 +16,7 @@ #include "base/test/bind_test_util.h" #include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" -#include "chrome/browser/web_applications/test/test_web_app_database.h" +#include "chrome/browser/web_applications/test/test_web_app_sync_bridge.h" #include "chrome/browser/web_applications/test/web_app_test.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_registry_update.h" @@ -52,12 +52,13 @@ void SetUp() override { WebAppTest::SetUp(); - database_ = std::make_unique<TestWebAppDatabase>(); - registrar_ = std::make_unique<WebAppRegistrar>(profile(), database_.get()); + sync_bridge_ = std::make_unique<TestWebAppSyncBridge>(); + registrar_ = + std::make_unique<WebAppRegistrar>(profile(), sync_bridge_.get()); } protected: - TestWebAppDatabase& database() { return *database_; } + TestWebAppSyncBridge& sync_bridge() { return *sync_bridge_; } WebAppRegistrar& registrar() { return *registrar_; } std::set<AppId> RegisterAppsForTesting(Registry registry) { @@ -80,7 +81,7 @@ Registry registry; registry.emplace(app_id, std::move(app)); - database().TakeOpenDatabaseCallback().Run(std::move(registry)); + sync_bridge().TakeOpenDatabaseCallback().Run(std::move(registry)); return app_id; } @@ -94,7 +95,7 @@ for (auto& kv : registry) app_ids.insert(kv.second->app_id()); - database().TakeOpenDatabaseCallback().Run(std::move(registry)); + sync_bridge().TakeOpenDatabaseCallback().Run(std::move(registry)); return app_ids; } @@ -123,11 +124,11 @@ void DestroySubsystems() { registrar_.reset(); - database_.reset(); + sync_bridge_.reset(); } private: - std::unique_ptr<TestWebAppDatabase> database_; + std::unique_ptr<TestWebAppSyncBridge> sync_bridge_; std::unique_ptr<WebAppRegistrar> registrar_; }; @@ -246,7 +247,7 @@ EXPECT_TRUE(registrar().is_empty()); } -TEST_F(WebAppRegistrarTest, AbstractWebAppDatabase) { +TEST_F(WebAppRegistrarTest, AbstractWebAppSyncBridge) { std::set<AppId> ids = InitRegistrarWithApps("https://example.com/path", 100); // Add 1 app after Init. @@ -254,20 +255,20 @@ auto web_app = std::make_unique<WebApp>(app_id); registrar().RegisterApp(std::move(web_app)); - EXPECT_EQ(1UL, database().write_web_app_ids().size()); - EXPECT_EQ(app_id, database().write_web_app_ids()[0]); + EXPECT_EQ(1UL, sync_bridge().write_web_app_ids().size()); + EXPECT_EQ(app_id, sync_bridge().write_web_app_ids()[0]); EXPECT_EQ(101UL, registrar().registry_for_testing().size()); // Remove 1 app after Init. registrar().UnregisterApp(app_id); EXPECT_EQ(100UL, registrar().registry_for_testing().size()); - EXPECT_EQ(1UL, database().delete_web_app_ids().size()); - EXPECT_EQ(app_id, database().delete_web_app_ids()[0]); + EXPECT_EQ(1UL, sync_bridge().delete_web_app_ids().size()); + EXPECT_EQ(app_id, sync_bridge().delete_web_app_ids()[0]); // Remove 100 apps after Init. registrar().UnregisterAll(); - for (auto& app_id : database().delete_web_app_ids()) + for (auto& app_id : sync_bridge().delete_web_app_ids()) ids.erase(app_id); EXPECT_TRUE(ids.empty()); @@ -486,13 +487,13 @@ auto app = CreateWebApp("https://example.com/path"); auto app_id = app->app_id(); - database().SetNextWriteWebAppsResult(false); + sync_bridge().SetNextWriteWebAppsResult(false); registrar().RegisterApp(std::move(app)); // nothing crashes, the production database impl would DLOG an error. EXPECT_FALSE(registrar().is_empty()); - database().SetNextDeleteWebAppsResult(false); + sync_bridge().SetNextDeleteWebAppsResult(false); registrar().UnregisterApp(app_id); // nothing crashes, the production database impl would DLOG an error. @@ -520,9 +521,9 @@ RegistrarCommitUpdate(std::move(update)); // Make sure that all app ids were written to the database. - EXPECT_EQ(ids.size(), database().write_web_app_ids().size()); + EXPECT_EQ(ids.size(), sync_bridge().write_web_app_ids().size()); - for (auto& written_app_id : database().write_web_app_ids()) + for (auto& written_app_id : sync_bridge().write_web_app_ids()) ids.erase(written_app_id); EXPECT_TRUE(ids.empty()); @@ -535,7 +536,7 @@ std::unique_ptr<WebAppRegistryUpdate> update = registrar().BeginUpdate(); RegistrarCommitUpdate(std::move(update)); - EXPECT_TRUE(database().write_web_app_ids().empty()); + EXPECT_TRUE(sync_bridge().write_web_app_ids().empty()); } { @@ -543,7 +544,7 @@ update.reset(); RegistrarCommitUpdate(std::move(update)); - EXPECT_TRUE(database().write_web_app_ids().empty()); + EXPECT_TRUE(sync_bridge().write_web_app_ids().empty()); } { @@ -554,14 +555,14 @@ RegistrarCommitUpdate(std::move(update)); - EXPECT_TRUE(database().write_web_app_ids().empty()); + EXPECT_TRUE(sync_bridge().write_web_app_ids().empty()); } } TEST_F(WebAppRegistrarTest, CommitUpdateFailed) { auto app = CreateWebApp("https://example.com/path"); auto app_id = InitRegistrarWithApp(std::move(app)); - EXPECT_TRUE(database().write_web_app_ids().empty()); + EXPECT_TRUE(sync_bridge().write_web_app_ids().empty()); std::unique_ptr<WebAppRegistryUpdate> update = registrar().BeginUpdate(); @@ -569,7 +570,7 @@ EXPECT_TRUE(update_app); update_app->SetName("New Name"); - database().SetNextWriteWebAppsResult(false); + sync_bridge().SetNextWriteWebAppsResult(false); base::RunLoop run_loop; registrar().CommitUpdate(std::move(update), @@ -586,7 +587,7 @@ // Test empty update first. { ScopedRegistryUpdate update(®istrar()); } - EXPECT_TRUE(database().write_web_app_ids().empty()); + EXPECT_TRUE(sync_bridge().write_web_app_ids().empty()); { ScopedRegistryUpdate update(®istrar()); @@ -599,9 +600,9 @@ } // Make sure that all app ids were written to the database. - EXPECT_EQ(ids.size(), database().write_web_app_ids().size()); + EXPECT_EQ(ids.size(), sync_bridge().write_web_app_ids().size()); - for (auto& written_app_id : database().write_web_app_ids()) + for (auto& written_app_id : sync_bridge().write_web_app_ids()) ids.erase(written_app_id); EXPECT_TRUE(ids.empty());
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc index 94bb513..d5b898a 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.cc +++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -7,6 +7,8 @@ #include "base/bind.h" #include "base/logging.h" #include "base/optional.h" +#include "chrome/browser/web_applications/web_app_database.h" +#include "chrome/browser/web_applications/web_app_database_factory.h" #include "chrome/common/channel_info.h" #include "components/sync/base/model_type.h" #include "components/sync/base/report_unrecoverable_error.h" @@ -15,19 +17,43 @@ namespace web_app { -WebAppSyncBridge::WebAppSyncBridge() +WebAppSyncBridge::WebAppSyncBridge( + AbstractWebAppDatabaseFactory* database_factory) : WebAppSyncBridge( + database_factory, std::make_unique<syncer::ClientTagBasedModelTypeProcessor>( syncer::WEB_APPS, base::BindRepeating(&syncer::ReportUnrecoverableError, chrome::GetChannel()))) {} WebAppSyncBridge::WebAppSyncBridge( + AbstractWebAppDatabaseFactory* database_factory, std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor) - : syncer::ModelTypeSyncBridge(std::move(change_processor)) {} + : syncer::ModelTypeSyncBridge(std::move(change_processor)) { + DCHECK(database_factory); + database_ = std::make_unique<WebAppDatabase>(database_factory); +} WebAppSyncBridge::~WebAppSyncBridge() = default; +void WebAppSyncBridge::OpenDatabase(RegistryOpenedCallback callback) { + database_->OpenDatabase(std::move(callback)); +} + +void WebAppSyncBridge::WriteWebApps(AppsToWrite apps, + CompletionCallback callback) { + database_->WriteWebApps(std::move(apps), std::move(callback)); +} + +void WebAppSyncBridge::DeleteWebApps(std::vector<AppId> app_ids, + CompletionCallback callback) { + database_->DeleteWebApps(std::move(app_ids), std::move(callback)); +} + +void WebAppSyncBridge::ReadRegistry(RegistryOpenedCallback callback) { + database_->ReadRegistry(std::move(callback)); +} + std::unique_ptr<syncer::MetadataChangeList> WebAppSyncBridge::CreateMetadataChangeList() { NOTIMPLEMENTED();
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.h b/chrome/browser/web_applications/web_app_sync_bridge.h index 9b343f45..78a4fb9 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.h +++ b/chrome/browser/web_applications/web_app_sync_bridge.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/optional.h" +#include "chrome/browser/web_applications/abstract_web_app_sync_bridge.h" #include "components/sync/model/model_type_sync_bridge.h" namespace syncer { @@ -17,14 +18,31 @@ namespace web_app { -class WebAppSyncBridge : public syncer::ModelTypeSyncBridge { +class AbstractWebAppDatabaseFactory; +class WebAppDatabase; + +// The sync bridge exclusively owns ModelTypeChangeProcessor and WebAppDatabase +// (the storage). +class WebAppSyncBridge : public AbstractWebAppSyncBridge, + public syncer::ModelTypeSyncBridge { public: - WebAppSyncBridge(); + explicit WebAppSyncBridge(AbstractWebAppDatabaseFactory* database_factory); // Tests may inject mock change_processor using this ctor. - explicit WebAppSyncBridge( + WebAppSyncBridge( + AbstractWebAppDatabaseFactory* database_factory, std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor); ~WebAppSyncBridge() override; + // AbstractWebAppSyncBridge: + void OpenDatabase(RegistryOpenedCallback callback) override; + void WriteWebApps(AppsToWrite apps, CompletionCallback callback) override; + void DeleteWebApps(std::vector<AppId> app_ids, + CompletionCallback callback) override; + + // Exposed for testing. + void ReadRegistry(RegistryOpenedCallback callback); + + private: // syncer::ModelTypeSyncBridge: std::unique_ptr<syncer::MetadataChangeList> CreateMetadataChangeList() override; @@ -39,7 +57,8 @@ std::string GetClientTag(const syncer::EntityData& entity_data) override; std::string GetStorageKey(const syncer::EntityData& entity_data) override; - private: + std::unique_ptr<WebAppDatabase> database_; + DISALLOW_COPY_AND_ASSIGN(WebAppSyncBridge); };
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc index fb0059b3..82d08c6 100644 --- a/chrome/common/chrome_content_client.cc +++ b/chrome/common/chrome_content_client.cc
@@ -359,11 +359,10 @@ // This list must match the CDM that is being bundled with Chrome. capability->video_codecs.push_back(media::VideoCodec::kCodecVP8); capability->video_codecs.push_back(media::VideoCodec::kCodecVP9); + capability->video_codecs.push_back(media::VideoCodec::kCodecAV1); // TODO(crbug.com/899403): Update this and tests after Widevine CDM // supports VP9 profile 2. capability->supports_vp9_profile2 = false; - // TODO(crbug.com/953504): Update this and tests after Widevine CDM - // supports AV1. #if BUILDFLAG(USE_PROPRIETARY_CODECS) capability->video_codecs.push_back(media::VideoCodec::kCodecH264); #endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index cc4df48..b6e89a46 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -680,7 +680,7 @@ // Enables or disables the App Management UI. const base::Feature kAppManagement{"AppManagement", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Disable downloads of unsafe file types over insecure transports if initiated // from a secure page
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl index e83f1e5..24864b1 100644 --- a/chrome/common/extensions/api/passwords_private.idl +++ b/chrome/common/extensions/api/passwords_private.idl
@@ -46,6 +46,10 @@ // An index to refer back to a unique password entry record. long id; + + // If true, the entry came from the Gaia-account-scoped password store + // rather than from the profile-scoped one. + boolean fromAccountStore; }; dictionary ExceptionEntry { @@ -54,6 +58,10 @@ // An id to refer back to a unique exception entry record. long id; + + // If true, the entry came from the Gaia-account-scoped password store + // rather than from the profile-scoped one. + boolean fromAccountStore; }; dictionary PasswordExportProgress {
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc index 0d4c903..3b81c5e4 100644 --- a/chrome/common/extensions/permissions/permissions_data_unittest.cc +++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -1162,7 +1162,9 @@ DISALLOW_COPY_AND_ASSIGN(CaptureVisiblePageTest); }; -TEST_F(CaptureVisiblePageTest, URLsCapturableWithEitherActiveTabOrAllURLs) { +// TODO(crbug.com/1004573) Disabled due to flake +TEST_F(CaptureVisiblePageTest, + DISABLED_URLsCapturableWithEitherActiveTabOrAllURLs) { const GURL test_urls[] = { // Normal web page. GURL("https://example.com"),
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb index 8b544664..78db08aa 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Windows-এর বর্তমান পাসওয়ার্ড না দিয়ে এগিয়ে গেলে তথ্যের অপূরণীয় ক্ষতি হতে পারে।</translation> <translation id="1383286653814676580">Google ক্রেডেনশিয়াল প্রোভাইডার সাইন-ইন পৃষ্ঠা চালানোর জন্য ব্যবহার করা হয়।</translation> <translation id="1894475569413661128">আপনার কাজের অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন।</translation> +<translation id="2329184763010379754">যে ব্যবহারকারী এই কম্পিউটার লক করেছেন শুধুমাত্র তিনিই সাইন-ইন করতে পারবেন।</translation> +<translation id="2398071111662077301">Chrome ইনস্টল করার সময় কিছু সমস্যা হওয়ার কারণে Google সাইন-ইন স্ক্রিন লোড করা যায়নি। আপনার অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation> <translation id="2469311484561825731">আপনার কাজের অ্যাকাউন্টে সাইন-ইন করা যায়নি। কম্পিউটারে ইন্টারনেট কানেকশন আছে কিনা তা দেখে নিয়ে আবার চেষ্টা করুন।</translation> +<translation id="2679096858700291438">আপনি একটি ভুল Windows পাসওয়ার্ড লিখেছেন। আবার চেষ্টা করুন।</translation> +<translation id="2831078752570172210">আপনার অ্যাকাউন্ট লক করে দেওয়া হয়েছে। আপনার সিস্টেম অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation> +<translation id="2844349213149998955">এই ডিভাইসে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করা যাবে না। কাজের অ্যাকাউন্ট দিয়ে লগ-ইন করুন।</translation> <translation id="3306357053520292004">এই অ্যাকাউন্ট ব্যবহার করে আগেই এই কম্পিউটারের একজন ব্যবহারকারী যোগ করা হয়েছে। অন্য একটি অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।</translation> <translation id="3968372833844047539">G Suite এন্টারপ্রাইজ ব্যবহারকারীরাই কেবলমাত্র লগ-ইন করতে পারবেন।</translation> <translation id="4057329986137569701">একটি অভ্যন্তরীণ সমস্যা হয়েছে।</translation> <translation id="4267670563222825190">আপনার অ্যাকাউন্টের জন্য কোনও ডোমেন ব্যবহারকারী খুঁজে পাওয়া যায়নি। আপনার অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation> <translation id="4300229033992784001">আপনার অ্যাকাউন্টের পাসওয়ার্ড পরিবর্তন হয়েছে। আপনার Windows অ্যাকাউন্টের সাথে কাজের অ্যাকাউন্ট সিঙ্ক করতে আপনার বর্তমান Windows পাসওয়ার্ডটি লিখুন।</translation> <translation id="4706454071748629324">নতুন ব্যবহারকারী যোগ করা যায়নি। এই কম্পিউটার কাজের অ্যাকাউন্ট ব্যবহার করে শুধুমাত্র একজন ব্যবহারকারীর প্রোফাইল তৈরি করতে দেয়।</translation> +<translation id="6033715878377252112">Windows সহায়তাকারীর জন্য Google ক্রেডেনশিয়াল প্রোভাইডার</translation> +<translation id="6149399665202317746">Windows-এর জন্য Google ক্রেডেনশিয়াল প্রোভাইডার</translation> <translation id="6312494990035843744">এই ডোমেনে কাজের অ্যাকাউন্ট দিয়ে সাইন-ইন করা যাবে না। অন্য অ্যাকাউন্ট ব্যবহার করে দেখুন।</translation> <translation id="6463752215771576050">এন্টারপ্রাইজ ম্যানেজমেন্টের জন্য এই কম্পিউটারটিকে নথিভুক্ত করা যায়নি। অন্য একটি কাজের অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।</translation> <translation id="6657585470893396449">পাসওয়ার্ড</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Windows-এর পাসওয়ার্ড ভুলে গেছেন</translation> <translation id="866458870819756755">ব্যবহারকারী তৈরি করা যায়নি।</translation> <translation id="8875753657315897487">আপনার কাজের অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন</translation> +<translation id="8973975512230260387">আপনার সেশনের মেয়াদ শেষ হয়ে গেছে। আপনার Google কাজের অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন।</translation> +<translation id="9055998212250844221">Windows-এর জন্য Google ক্রেডেনশিয়াল প্রোভাইডার দ্বারা তৈরি ব্যবহারকারীর অ্যাকাউন্ট</translation> <translation id="9135619837062629367">এই অ্যাকাউন্ট দিয়ে সাইন-ইন করা যাবে না। অন্য অ্যাকাউন্ট ব্যবহার করে দেখুন।</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb index b7b8ee1..763707140 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">તમારા વર્તમાન Windows પાસવર્ડ વિના આગળ વધવું કદાચ પાછી મેળવી ન શકાય તેવા માહિતીના નુકસાનનું કારણ બની શકે છે.</translation> <translation id="1383286653814676580">Google લૉગ ઇન વિગત પ્રદાતા સાઇન ઇન પેજ ચલાવવા માટે ઉપયોગમાં લેવામાં આવે છે.</translation> <translation id="1894475569413661128">તમારા ઑફિસના એકાઉન્ટનો ઉપયોગ કરીને સાઇન ઇન કરો.</translation> +<translation id="2329184763010379754">આ કમ્પ્યુટરમાં માત્ર એ જ વપરાશકર્તા સાઇન ઇન કરી શકે છે કે જેમણે તેને લૉક કર્યું હતું.</translation> +<translation id="2398071111662077301">તમારા Chrome ઇન્સ્ટૉલેશનમાં સમસ્યાને લીધે Google સાઇન ઇન સ્ક્રીન લોડ કરી શકાતી નથી. તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="2469311484561825731">તમારા ઑફિસના એકાઉન્ટમાં સાઇન ઇન કરવામાં નિષ્ફળ થયાં. કમ્પ્યુટરમાં ઇન્ટરનેટ કનેક્શન હોવાની ખાતરી કરો, પછી ફરી પ્રયાસ કરો.</translation> +<translation id="2679096858700291438">તમે Windowsનો ખોટો પાસવર્ડ દાખલ કર્યો છે. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> +<translation id="2831078752570172210">તમારું એકાઉન્ટ લૉક કરવામાં આવ્યું છે. કૃપા કરીને તમારા સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરો.</translation> +<translation id="2844349213149998955">આ ડિવાઇસ પર વ્યક્તિગત એકાઉન્ટ વડે સાઇન ઇન કરવાની મંજૂરી નથી. કૃપા કરીને ઑફિસના એકાઉન્ટ વડે લૉગ ઇન કરો.</translation> <translation id="3306357053520292004">આ કમ્પ્યુટર પરના વપરાશકર્તાને આ એકાઉન્ટનો ઉપયોગ કરીને પહેલેથી ઉમેરવામાં આવેલા છે. કૃપા કરીને કોઈ અલગ એકાઉન્ટ વડે સાઇન ઇન કરો.</translation> <translation id="3968372833844047539">માત્ર Gsuite એન્ટરપ્રાઇઝ વપરાશકર્તાઓ જ લૉગ ઇન કરવાની મંજૂરી ધરાવે છે.</translation> <translation id="4057329986137569701">કોઈ આંતરિક ભૂલ આવી.</translation> <translation id="4267670563222825190">તમારા એકાઉન્ટ માટે કોઈ ડોમેન. વપરાશકર્તા શોધી શક્યાં નથી. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="4300229033992784001">તમારા એકાઉન્ટનો પાસવર્ડ બદલાઈ ગયો છે. તમારા Windows એકાઉન્ટ સાથે તમારા ઑફિસના એકાઉન્ટને સિંક કરવા માટે કૃપા કરીને તમારો હાલનો Windows પાસવર્ડ દાખલ કરો.</translation> <translation id="4706454071748629324">નવા વપરાશકર્તા ઉમેરવામાં નિષ્ફળ થયાં. આ કમ્પ્યુટર ઑફિસના એકાઉન્ટનો ઉપયોગ કરીને માત્ર એક વપરાશકર્તા બનાવવાની મંજૂરી આપે છે.</translation> +<translation id="6033715878377252112">Windows માટે Google એકાઉન્ટની પાત્રતા ચકાસનાર સહાયક</translation> +<translation id="6149399665202317746">Windows માટે Google એકાઉન્ટની પાત્રતા ચકાસનાર</translation> <translation id="6312494990035843744">આ ડોમેન પર ઑફિસના એકાઉન્ટ વડે સાઇન ઇન કરવાની મંજૂરી નથી. કોઈ અલગ એકાઉન્ટ અજમાવી જુઓ.</translation> <translation id="6463752215771576050">આ કમ્પ્યુટરની એન્ટરપ્રાઇઝ મેનેજમેન્ટ માટે નોંધણી કરવામાં નિષ્ફળ રહ્યાં. કૃપા કરીને ઑફિસના કોઈ અલગ એકાઉન્ટ વડે સાઇન ઇન કરો.</translation> <translation id="6657585470893396449">પાસવર્ડ</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Windows પાસવર્ડ ભૂલી ગયા</translation> <translation id="866458870819756755">વપરાશકર્તા બનાવી શકાયો નથી.</translation> <translation id="8875753657315897487">તમારા ઑફિસના એકાઉન્ટનો ઉપયોગ કરીને સાઇન ઇન કરો</translation> +<translation id="8973975512230260387">તમારું સત્ર સમાપ્ત થઈ ગયું છે. તમારા ઑફિસના Google એકાઉન્ટનો ઉપયોગ કરીને સાઇન ઇન કરો.</translation> +<translation id="9055998212250844221">Windows માટે Google એકાઉન્ટની પાત્રતા ચકાસનાર દ્વારા બનાવવામાં આવેલું વપરાશકર્તા એકાઉન્ટ</translation> <translation id="9135619837062629367">આ એકાઉન્ટ વડે સાઇન ઇન કરવાની મંજૂરી નથી. કોઈ અલગ એકાઉન્ટ અજમાવી જુઓ.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb index fde49e1..74d7055 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Melanjutkan tanpa memasukkan sandi Windows saat ini dapat menyebabkan kehilangan informasi secara permanen.</translation> <translation id="1383286653814676580">Digunakan untuk menjalankan halaman login Penyedia Kredensial Google.</translation> <translation id="1894475569413661128">Login menggunakan akun kerja Anda.</translation> +<translation id="2329184763010379754">Hanya pengguna yang mengunci komputer ini yang diizinkan login.</translation> +<translation id="2398071111662077301">Tidak dapat memuat layar login Google karena terjadi masalah saat menginstal Chrome Anda. Coba hubungi administrator.</translation> <translation id="2469311484561825731">Gagal login ke akun kerja Anda. Pastikan komputer tersambung ke internet, lalu coba lagi.</translation> +<translation id="2679096858700291438">Anda memasukkan sandi Windows yang salah. Coba lagi.</translation> +<translation id="2831078752570172210">Akun Anda telah terkunci. Harap hubungi administrator sistem Anda.</translation> +<translation id="2844349213149998955">Login dengan akun pribadi di perangkat ini tidak diizinkan. Silakan login dengan akun kerja.</translation> <translation id="3306357053520292004">Pengguna di komputer ini telah ditambahkan menggunakan akun ini. Harap login menggunakan akun lain.</translation> <translation id="3968372833844047539">Hanya pengguna G Suite Enterprise yang diizinkan login.</translation> <translation id="4057329986137569701">Terjadi error internal.</translation> <translation id="4267670563222825190">Tidak ada pengguna Domain yang dapat ditemukan untuk akun Anda. Harap hubungi administrator Anda.</translation> <translation id="4300229033992784001">Sandi akun Anda telah diubah. Harap masukkan sandi Windows saat ini untuk menyinkronkan akun Windows dengan akun kerja Anda.</translation> <translation id="4706454071748629324">Gagal menambahkan pengguna baru. Komputer ini hanya mengizinkan pembuatan satu pengguna yang menggunakan akun kerja.</translation> +<translation id="6033715878377252112">Bantuan Penyedia Kredensial Google untuk Windows</translation> +<translation id="6149399665202317746">Penyedia Kredensial Google untuk Windows</translation> <translation id="6312494990035843744">Login dengan akun kerja di domain ini tidak diizinkan. Cobalah akun yang lain.</translation> <translation id="6463752215771576050">Tidak dapat mendaftarkan komputer ini untuk pengelolaan perusahaan. Harap login menggunakan akun kerja lain.</translation> <translation id="6657585470893396449">Sandi</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Lupa Sandi Windows</translation> <translation id="866458870819756755">Tidak dapat membuat pengguna.</translation> <translation id="8875753657315897487">Login menggunakan akun kerja Anda</translation> +<translation id="8973975512230260387">Sesi Anda telah berakhir. Login menggunakan akun kerja Google Anda.</translation> +<translation id="9055998212250844221">Akun pengguna yang dibuat oleh Penyedia Kredensial Google untuk Windows</translation> <translation id="9135619837062629367">Login dengan akun ini tidak diizinkan. Cobalah akun lain.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb index cd772b99..bb8c1f0 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">നിലവിലെ Windows പാസ്വേഡ് നൽകാതെ തുടരുന്നത്, വിവരങ്ങൾ തിരിച്ചെടുക്കാനാകാത്ത വിധം നഷ്ടപ്പെടാൻ കാരണമായേക്കാം.</translation> <translation id="1383286653814676580">Google ക്രെഡൻഷ്യൽ പ്രൊവൈഡർ സൈൻ ഇൻ പേജ് റൺ ചെയ്യാൻ ഉപയോഗിച്ചു.</translation> <translation id="1894475569413661128">നിങ്ങളുടെ ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> +<translation id="2329184763010379754">ഈ കമ്പ്യൂട്ടർ ലോക്ക് ചെയ്ത ഉപയോക്താവിന് മാത്രമേ സൈൻ ഇൻ ചെയ്യാൻ കഴിയൂ.</translation> +<translation id="2398071111662077301">Chrome ഇൻസ്റ്റലേഷനിലെ ഒരു പ്രശ്നം കാരണം Google സൈൻ ഇൻ സ്ക്രീൻ ലോഡ് ചെയ്യാനാവുന്നില്ല. നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="2469311484561825731">നിങ്ങളുടെ ഔദ്യോഗിക അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യാനായില്ല. കമ്പ്യൂട്ടറിൽ ഇൻ്റർനെറ്റ് കണക്ഷനുണ്ടെന്ന് ഉറപ്പാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="2679096858700291438">നിങ്ങൾ നൽകിയ Windows പാസ്വേഡ് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="2831078752570172210">നിങ്ങളുടെ അക്കൗണ്ട് ലോക്ക് ആയിരിക്കുന്നു. നിങ്ങളുടെ സിസ്റ്റം അഡ്മിനെ ബന്ധപ്പെടുക.</translation> +<translation id="2844349213149998955">വ്യക്തിഗത അക്കൗണ്ട് ഉപയോഗിച്ച് ഈ ഉപകരണത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദനീയമല്ല. ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="3306357053520292004">ഈ അക്കൗണ്ട് ഉപയോഗിച്ച് ഈ കമ്പ്യൂട്ടറിൽ ഒരു ഉപയോക്താവിനെ മുമ്പേ ചേർത്തിട്ടുണ്ട്. മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ചെയ്യുക.</translation> <translation id="3968372833844047539">Gsuite എന്റർപ്രൈസ് ഉപയോക്താക്കൾക്ക് മാത്രമേ ലോഗിൻ ചെയ്യാൻ അനുമതിയുള്ളൂ.</translation> <translation id="4057329986137569701">ഒരു ആന്തരിക പിശക് സംഭവിച്ചു.</translation> <translation id="4267670563222825190">നിങ്ങളുടെ അക്കൗണ്ടിന് ഡൊമെയ്ൻ ഉപയോക്താവിനെയൊന്നും കണ്ടെത്താനായില്ല. നിങ്ങളുടെ അഡ്മിനുമായി ബന്ധപ്പെടുക.</translation> <translation id="4300229033992784001">നിങ്ങളുടെ അക്കൗണ്ടിൻ്റെ പാസ്വേഡ് മാറ്റി. Windows അക്കൗണ്ടുമായി ഔദ്യോഗിക അക്കൗണ്ട് സമന്വയിപ്പിക്കാൻ നിങ്ങളുടെ നിലവിലെ Windows പാസ്വേഡ് നൽകുക.</translation> <translation id="4706454071748629324">പുതിയ ഉപയോക്താവിനെ ചേർക്കാനായില്ല. ഒരു ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് ഒരു ഉപയോക്താവിനെ സൃഷ്ടിക്കാൻ മാത്രമേ ഈ കമ്പ്യൂട്ടർ അനുവദിക്കൂ.</translation> +<translation id="6033715878377252112">Windows സഹായിയുടെ Google ക്രെഡൻഷ്യൽ ദാതാവ്</translation> +<translation id="6149399665202317746">Windows-നായുള്ള Google ക്രെഡൻഷ്യൽ ദാതാവ്</translation> <translation id="6312494990035843744">ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് ഈ ഡൊമെയ്നിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദനീയമല്ല. മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് ശ്രമിക്കുക.</translation> <translation id="6463752215771576050">എൻ്റർപ്രൈസ് മാനേജ്മെൻ്റിനായി ഈ കമ്പ്യൂട്ടർ എൻറോൾ ചെയ്യാനായില്ല. മറ്റൊരു ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="6657585470893396449">പാസ്വേഡ്</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Windows പാസ്വേഡ് മറന്നുപോയി</translation> <translation id="866458870819756755">ഒരു ഉപയോക്താവിനെ സൃഷ്ടിക്കാനായില്ല.</translation> <translation id="8875753657315897487">നിങ്ങളുടെ ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation> +<translation id="8973975512230260387">നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഔദ്യോഗിക Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> +<translation id="9055998212250844221">Windows-നായി Google ക്രെഡൻഷ്യൽ ദാതാവ് സൃഷ്ടിച്ച ഉപയോക്തൃ അക്കൗണ്ട്</translation> <translation id="9135619837062629367">ഈ അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യൽ അനുവദനീയമല്ല. മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് ശ്രമിക്കുക.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb index 7f1bb747..baab90d 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Hvis du fortsetter uten å skrive inn det nåværende Windows-passordet, kan det føre til uopprettelig tap av informasjon.</translation> <translation id="1383286653814676580">Brukes til å kjøre påloggingssiden for Google-legitimasjonsleverandøren.</translation> <translation id="1894475569413661128">Logg på med jobbkontoen din.</translation> +<translation id="2329184763010379754">Kun brukeren som låste denne datamaskinen, kan logge på.</translation> +<translation id="2398071111662077301">Kunne ikke laste inn Google-påloggingsskjermen grunnet et problem med Chrome-installasjonen. Kontakt administrator.</translation> <translation id="2469311484561825731">Kunne ikke logge på jobbkontoen din. Sørg for at datamaskinen er koblet til internett, og prøv på nytt.</translation> +<translation id="2679096858700291438">Du skrev inn feil Windows-passord. Prøv på nytt.</translation> +<translation id="2831078752570172210">Kontoen er utestengt. Kontakt systemadministratoren.</translation> +<translation id="2844349213149998955">Det er ikke tillatt å logge på med personlige kontoer på denne enheten. Logg på med en jobbkonto.</translation> <translation id="3306357053520292004">En bruker på denne datamaskinen er allerede lagt til med denne kontoen. Logg på med en annen konto.</translation> <translation id="3968372833844047539">Kun Gsuite Enterprise-brukere har lov til å logge på.</translation> <translation id="4057329986137569701">Det oppsto en intern feil.</translation> <translation id="4267670563222825190">Fant ingen domenebruker for kontoen din. Kontakt administratoren din.</translation> <translation id="4300229033992784001">Passordet for kontoen din er endret. Skriv inn Windows-passordet ditt for å synkronisere Windows-kontoen og jobbkontoen din.</translation> <translation id="4706454071748629324">Kunne ikke legge til den nye brukeren. Denne datamaskinen tillater bare oppretting av én bruker per jobbkonto.</translation> +<translation id="6033715878377252112">Hjelpebruker for Google-legitimasjonsleverandøren for Windows</translation> +<translation id="6149399665202317746">Google-legitimasjonsleverandør for Windows</translation> <translation id="6312494990035843744">Det er ikke tillatt å logge på med jobbkonto på dette domenet. Prøv en annen konto.</translation> <translation id="6463752215771576050">Kunne ikke registrere denne datamaskinen for bedriftsadministrering. Logg på med en annen jobbkonto.</translation> <translation id="6657585470893396449">Passord</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Jeg har glemt Windows-passordet</translation> <translation id="866458870819756755">Kunne ikke opprette bruker.</translation> <translation id="8875753657315897487">Logg på med jobbkontoen din</translation> +<translation id="8973975512230260387">Økten er utløpt. Logg på med Google-jobbkontoen din.</translation> +<translation id="9055998212250844221">Brukerkontoen ble opprettet av Google-legitimasjonsleverandøren for Windows</translation> <translation id="9135619837062629367">Det er ikke tillatt å logge på med denne kontoen. Prøv en annen konto.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb index 182b7e6f..ff123f4 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Om du fortsätter utan att ange lösenordet för Windows kan du förlora information som inte går att återställa.</translation> <translation id="1383286653814676580">Används för att köra inloggningssidan för Google Credential Provider.</translation> <translation id="1894475569413661128">Logga in med ditt jobbkonto.</translation> +<translation id="2329184763010379754">Bara den användare som låste datorn tillåts logga in.</translation> +<translation id="2398071111662077301">Det gick inte att läsa in Googles inloggningsskärm på grund av ett problem med Chrome-installationen. Kontakta administratören.</translation> <translation id="2469311484561825731">Det gick inte att logga in på jobbkontot. Kontrollera att datorn är ansluten till internet och försök sedan igen.</translation> +<translation id="2679096858700291438">Du angav fel lösenord för Windows. Försök igen.</translation> +<translation id="2831078752570172210">Kontot är utelåst. Kontakta systemadministratören.</translation> +<translation id="2844349213149998955">Det är inte tillåtet att logga in med ett personligt konto på den här enheten. Logga in med ett jobbkonto.</translation> <translation id="3306357053520292004">En användare på den här datorn har redan lagts till med det här kontot. Logga in med ett annat konto.</translation> <translation id="3968372833844047539">Endast G Suite Enterprise-användare får logga in.</translation> <translation id="4057329986137569701">Ett internt fel uppstod.</translation> <translation id="4267670563222825190">Ingen domänanvändare hittades för kontot. Kontakta administratören.</translation> <translation id="4300229033992784001">Kontots lösenord har ändrats Ange ditt nuvarande lösenord för Windows för att synkronisera Windows-kontot med jobbkontot.</translation> <translation id="4706454071748629324">Det gick inte att lägga till en ny användare. Datorn tillåter bara att en användare skapas med ett jobbkonto.</translation> +<translation id="6033715878377252112">Hjälpprogram för Googles autentiseringsprovider för Windows</translation> +<translation id="6149399665202317746">Googles autentiseringsprovider för Windows</translation> <translation id="6312494990035843744">Det är inte tillåtet att logga in med ett jobbkonto på den här domänen. Testa att logga in med ett annat konto.</translation> <translation id="6463752215771576050">Det går inte att registrera datorn för företagshantering. Logga in med ett annat jobbkonto.</translation> <translation id="6657585470893396449">Lösenord</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Jag har glömt lösenordet för Windows</translation> <translation id="866458870819756755">Det gick inte att skapa en användare.</translation> <translation id="8875753657315897487">Logga in med ditt jobbkonto</translation> +<translation id="8973975512230260387">Sessionen har upphört. Logga in med ditt jobbkonto på Google.</translation> +<translation id="9055998212250844221">Användarkonto skapat av Googles autentiseringsprovider för Windows</translation> <translation id="9135619837062629367">Det är inte tillåtet att logga in med det här kontot. Testa med ett annat konto.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb index 90e7a7d..63c0dc8 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Hatua ya kuendelea bila kuweka nenosiri lako la sasa la Windows inaweza kusababisha upoteze maelezo kabisa.</translation> <translation id="1383286653814676580">Inatumika kutekeleza ukurasa wa kuingia katika akaunti ya Mtoa Huduma za Vitambulisho vya Google.</translation> <translation id="1894475569413661128">Ingia ukitumia akaunti yako ya kazini.</translation> +<translation id="2329184763010379754">Mtumiaji aliyefunga kompyuta hii ndiye tu anayeruhusiwa kuingia katika akaunti.</translation> +<translation id="2398071111662077301">Imeshindwa kupakia skrini ya Google ya kuingia katika akaunti kutokana na tatizo kwenye usakinishaji wako wa Chrome. Wasiliana na msimamizi wako.</translation> <translation id="2469311484561825731">Imeshindwa kuingia katika akaunti yako ya kazini. Hakikisha kuwa kompyuta ina muunganisho wa Intaneti, kisha ujaribu tena.</translation> +<translation id="2679096858700291438">Umeweka nenosiri lisilo sahihi la Windows. Tafadhali jaribu tena.</translation> +<translation id="2831078752570172210">Akaunti yako imefungwa. Tafadhali wasiliana na msimamizi wako wa mfumo.</translation> +<translation id="2844349213149998955">Huruhusiwi kuingia ukitumia akaunti ya kibinafsi kwenye kifaa hiki. Tafadhali ingia ukitumia akaunti ya kazini.</translation> <translation id="3306357053520292004">Mtumiaji wa kompyuta hii tayari alikuwa ameongezwa kwa kutumia akaunti hii. Ingia ukitumia akaunti nyingine.</translation> <translation id="3968372833844047539">Watumiaji wa G Suite Enterprise pekee ndio wanaruhusiwa kuingia katika akaunti.</translation> <translation id="4057329986137569701">Hitilafu ya ndani imetokea.</translation> <translation id="4267670563222825190">Haikupata mtumiaji wa Kikoa kwenye akaunti yako. Tafadhali wasiliana na msimamizi wako.</translation> <translation id="4300229033992784001">Nenosiri la akaunti yako limebadilika. Tafadhali weka nenosiri lako la sasa la Windows ili usawazishe akaunti yako ya Windows na Akaunti yako ya kazini.</translation> <translation id="4706454071748629324">Imeshindwa kuongeza mtumiaji mpya. Kompyuta hii inaruhusu tu mtumiaji mmoja kuwekwa kwa kutumia akaunti ya kazini.</translation> +<translation id="6033715878377252112">Kisaidizi cha Kitoa Utambulisho Unaotumia kwenye Google kwa ajili ya Windows</translation> +<translation id="6149399665202317746">Kitoa Utambulisho Unaotumia kwenye Google kwa ajili ya Windows</translation> <translation id="6312494990035843744">Huruhusiwi kuingia katika akaunti ukitumia akaunti ya kazini kwenye kikoa hiki. Jaribu akaunti tofauti.</translation> <translation id="6463752215771576050">Imeshindwa kujumuisha kompyuta hii katika udhibiti wa biashara. Tafadhali ingia ukitumia akaunti nyingine ya kazini.</translation> <translation id="6657585470893396449">Nenosiri</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Umesahau Nenosiri la Windows</translation> <translation id="866458870819756755">Imeshindwa kuweka mtumiaji.</translation> <translation id="8875753657315897487">Ingia ukitumia akaunti yako ya kazini</translation> +<translation id="8973975512230260387">Kipindi chako kimekwisha. Ingia ukitumia akaunti yako ya kazini kwenye Google.</translation> +<translation id="9055998212250844221">Akaunti ya mtumiaji iliyofunguliwa na Kitoa Utambulisho Unaotumia kwenye Google katika Windows</translation> <translation id="9135619837062629367">Huruhusiwi kuingia katika akaunti nyingine ukitumia akaunti hii. Jaribu akaunti tofauti.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb index c9e93596..ca46278 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Geçerli Windows şifrenizi girmeden devam etmek, geri alınamaz bilgi kaybına neden olabilir.</translation> <translation id="1383286653814676580">Google Kimlik Bilgisi Sağlayıcısı oturum açma sayfasını çalıştırmak için kullanılır.</translation> <translation id="1894475569413661128">İş hesabınızı kullanarak oturum açın.</translation> +<translation id="2329184763010379754">Yalnızca bu bilgisayarı kilitleyen kullanıcının oturum açmasına izin verilir.</translation> +<translation id="2398071111662077301">Chrome yüklemesiyle ilgili bir sorun nedeniyle Google ile Oturum Açma ekranı yüklenemiyor. Yöneticinizle iletişime geçin.</translation> <translation id="2469311484561825731">İş hesabınızda oturum açılamadı. Bilgisayarın internete bağlı olduğundan emin olup tekrar deneyin.</translation> +<translation id="2679096858700291438">Yanlış bir Windows şifresi girdiniz. Lütfen tekrar deneyin.</translation> +<translation id="2831078752570172210">Hesabınız kilitlendi. Lütfen sistem yöneticinizle iletişime geçin.</translation> +<translation id="2844349213149998955">Bu cihazda kişisel hesapla oturum açılmasına izin verilmiyor. Lütfen bir iş hesabıyla giriş yapın.</translation> <translation id="3306357053520292004">Bu bilgisayardaki bir kullanıcı zaten bu hesap kullanılarak eklenmiş. Lütfen farklı bir hesapla oturum açın.</translation> <translation id="3968372833844047539">Sadece Gsuite Enterprise kullanıcılarının giriş yapmasına izin verilir.</translation> <translation id="4057329986137569701">Dahili bir hata oluştu.</translation> <translation id="4267670563222825190">Hesabınız için hiçbir alan kullanıcısı bulunamadı. Lütfen yöneticinizle görüşün.</translation> <translation id="4300229033992784001">Hesap şifreniz değişti. Windows hesabınızı iş hesabınızla senkronize etmek için lütfen mevcut Windows şifrenizi girin.</translation> <translation id="4706454071748629324">Yeni kullanıcı eklenemedi. Bu bilgisayar yalnızca bir kullanıcının, iş hesabı kullanılarak oluşturulmasına izin verir.</translation> +<translation id="6033715878377252112">Windows için Google Kimlik Bilgisi Sağlayıcı yardımcısı</translation> +<translation id="6149399665202317746">Windows için Google Kimlik Bilgisi Sağlayıcı</translation> <translation id="6312494990035843744">Bu alanda iş hesabı ile oturum açmaya izin verilmiyor. Farklı bir hesap deneyin.</translation> <translation id="6463752215771576050">Bu bilgisayar kurumsal yönetim için kaydedilemedi. Lütfen farklı bir iş Hesabı ile oturum açın.</translation> <translation id="6657585470893396449">Şifre</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Windows Şifresini Unuttum</translation> <translation id="866458870819756755">Kullanıcı oluşturulamadı.</translation> <translation id="8875753657315897487">İş hesabınızı kullanarak oturum açın.</translation> +<translation id="8973975512230260387">Oturumunuzun süresi doldu. Google iş hesabınızı kullanarak oturum açın.</translation> +<translation id="9055998212250844221">Windows için Google Kimlik Bilgisi Sağlayıcı tarafından oluşturulan kullanıcı hesabı</translation> <translation id="9135619837062629367">Bu hesapla oturum açmaya izin verilmiyor. Farklı bir hesapla oturum açmayı deneyin.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb index 5bf9122..a28e1be 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">Nếu tiếp tục mà không nhập mật khẩu Windows hiện tại của mình, thì bạn có thể bị mất thông tin vĩnh viễn.</translation> <translation id="1383286653814676580">Dùng để chạy trang đăng nhập vào Nhà cung cấp chứng chỉ Google.</translation> <translation id="1894475569413661128">Đăng nhập bằng tài khoản công việc của bạn.</translation> +<translation id="2329184763010379754">Chỉ người dùng đã khóa máy tính này mới được phép đăng nhập.</translation> +<translation id="2398071111662077301">Không thể tải màn hình Đăng nhập bằng Google do xảy ra một vấn đề trong quá trình cài đặt Chrome. Hãy liên hệ với quản trị viên của bạn.</translation> <translation id="2469311484561825731">Không đăng nhập được vào tài khoản công việc của bạn. Hãy đảm bảo máy tính đã kết nối Internet rồi thử lại.</translation> +<translation id="2679096858700291438">Bạn đã nhập sai mật khẩu Windows. Vui lòng thử lại.</translation> +<translation id="2831078752570172210">Tài khoản của bạn đã bị khóa. Vui lòng liên hệ với quản trị viên hệ thống.</translation> +<translation id="2844349213149998955">Bạn không thể đăng nhập vào thiết bị này bằng tài khoản cá nhân. Vui lòng đăng nhập bằng tài khoản công việc.</translation> <translation id="3306357053520292004">Một người dùng trên máy tính này đã được thêm bằng tài khoản này. Vui lòng đăng nhập bằng một tài khoản khác.</translation> <translation id="3968372833844047539">Chỉ người dùng G Suite Enterprise mới được phép đăng nhập.</translation> <translation id="4057329986137569701">Đã xảy ra lỗi nội bộ.</translation> <translation id="4267670563222825190">Không tìm được người dùng miền nào cho tài khoản của bạn. Vui lòng liên hệ với quản trị viên.</translation> <translation id="4300229033992784001">Mật khẩu tài khoản của bạn đã thay đổi. Hãy nhập mật khẩu Windows hiện tại để đồng bộ hóa tài khoản Windows với tài khoản công việc của bạn.</translation> <translation id="4706454071748629324">Không thêm được người dùng mới. Máy tính này chỉ cho phép tạo 1 người dùng bằng tài khoản công việc.</translation> +<translation id="6033715878377252112">Trình trợ giúp của Trình cung cấp thông tin đăng nhập Google dành cho Windows</translation> +<translation id="6149399665202317746">Trình cung cấp thông tin đăng nhập Google dành cho Windows</translation> <translation id="6312494990035843744">Bạn không được phép đăng nhập bằng tài khoản công việc trên miền này. Hãy thử một tài khoản khác.</translation> <translation id="6463752215771576050">Không thể đăng ký dịch vụ quản lý doanh nghiệp cho máy tính này. Vui lòng đăng nhập bằng một tài khoản công việc khác.</translation> <translation id="6657585470893396449">Mật khẩu</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">Quên mật khẩu Windows</translation> <translation id="866458870819756755">Không thể tạo người dùng.</translation> <translation id="8875753657315897487">Đăng nhập bằng tài khoản công việc</translation> +<translation id="8973975512230260387">Phiên truy cập của bạn đã hết hạn. Hãy đăng nhập bằng tài khoản công việc trên Google.</translation> +<translation id="9055998212250844221">Tài khoản người dùng tạo bởi Trình cung cấp thông tin đăng nhập Google dành cho Windows</translation> <translation id="9135619837062629367">Tài khoản này không được phép đăng nhập. Hãy thử một tài khoản khác.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb index 36d03de..0b27de50 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">若不输入您当前的 Windows 密码就继续操作,则可能会导致不可逆转的信息丢失。</translation> <translation id="1383286653814676580">用于运行 Google Credential Provider 登录页面。</translation> <translation id="1894475569413661128">请使用您的工作帐号登录。</translation> +<translation id="2329184763010379754">只允许那个锁定此计算机的用户登录。</translation> +<translation id="2398071111662077301">无法加载 Google 登录屏幕,因为您的 Chrome 安装出问题了。请与您的管理员联系。</translation> <translation id="2469311484561825731">未能成功登录您的工作帐号。请确保计算机已连接到互联网,然后重试。</translation> +<translation id="2679096858700291438">您输入的 Windows 密码有误。请重试。</translation> +<translation id="2831078752570172210">您的帐号已被锁定。请与您的系统管理员联系。</translation> +<translation id="2844349213149998955">不允许使用个人帐号登录此设备。请使用工作帐号登录。</translation> <translation id="3306357053520292004">此计算机上已添加了使用此帐号的用户。请改用其他帐号登录。</translation> <translation id="3968372833844047539">只有 G Suite 企业版用户可以登录。</translation> <translation id="4057329986137569701">发生了内部错误。</translation> <translation id="4267670563222825190">找不到您帐号的任何网域用户。请与管理员联系。</translation> <translation id="4300229033992784001">您的帐号密码已更改。请输入您目前使用的 Windows 密码,以便将您的 Windows 帐号与工作帐号同步。</translation> <translation id="4706454071748629324">未能添加新用户。此计算机仅允许使用一个工作帐号创建一个用户。</translation> +<translation id="6033715878377252112">Windows 版 Google 凭据提供程序助手</translation> +<translation id="6149399665202317746">Windows 版 Google 凭据提供程序</translation> <translation id="6312494990035843744">此网域不允许使用工作帐号登录。请尝试改用其他帐号。</translation> <translation id="6463752215771576050">无法为此计算机进行企业管理注册。请改用其他工作帐号登录。</translation> <translation id="6657585470893396449">密码</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">忘记了 Windows 密码</translation> <translation id="866458870819756755">无法创建用户。</translation> <translation id="8875753657315897487">请使用您的工作帐号登录</translation> +<translation id="8973975512230260387">您的会话已过期。请使用您的 Google 工作帐号登录。</translation> +<translation id="9055998212250844221">由 Windows 版 Google 凭据提供程序创建的用户帐号</translation> <translation id="9135619837062629367">不允许使用此帐号登录。请尝试改用其他帐号。</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb index 1b77ee6d..8bd5640 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb
@@ -4,13 +4,20 @@ <translation id="1337821341856692531">如果不輸入目前的 Windows 密碼就繼續,可能會導致無法復原的資訊遺失。</translation> <translation id="1383286653814676580">用於執行 Google 憑證提供者登入頁面。</translation> <translation id="1894475569413661128">請使用公司帳戶登入。</translation> +<translation id="2329184763010379754">只有鎖定這部電腦的使用者可以登入。</translation> +<translation id="2398071111662077301">Chrome 安裝作業發生問題,因此無法載入 Google 登入畫面。請與你的系統管理員聯絡。</translation> <translation id="2469311484561825731">公司帳戶登入失敗。請確認電腦已連上網際網路,然後再試一次。</translation> +<translation id="2679096858700291438">你輸入的 Windows 密碼有誤。請再試一次。</translation> +<translation id="2831078752570172210">你的帳戶已遭到鎖定。請與你的系統管理員聯絡。</translation> +<translation id="2844349213149998955">無法以個人帳戶登入這個裝置。請使用公司帳戶登入。</translation> <translation id="3306357053520292004">這台電腦已有其他使用者使用這個帳戶登入。請改用其他帳戶登入。</translation> <translation id="3968372833844047539">僅限 G Suite Enterprise 使用者登入。</translation> <translation id="4057329986137569701">發生內部錯誤。</translation> <translation id="4267670563222825190">找不到帳戶的網域使用者。請與你的系統管理員聯絡。</translation> <translation id="4300229033992784001">你的帳戶密碼已變更。請輸入目前的 Windows 密碼,讓系統同步處理你的 Windows 帳戶與公司帳戶。</translation> <translation id="4706454071748629324">無法新增使用者。在這台電腦上,公司帳戶只能用於建立一位使用者。</translation> +<translation id="6033715878377252112">Windows 小幫手適用的 Google 憑證提供者</translation> +<translation id="6149399665202317746">Windows 適用的 Google 憑證提供者</translation> <translation id="6312494990035843744">無法以公司帳戶登入這個網域,請改用其他帳戶。</translation> <translation id="6463752215771576050">無法為這部電腦註冊企業管理服務。請改用其他公司帳戶登入。</translation> <translation id="6657585470893396449">密碼</translation> @@ -22,5 +29,7 @@ <translation id="8639729688781680518">忘記 Windows 密碼</translation> <translation id="866458870819756755">無法建立使用者。</translation> <translation id="8875753657315897487">請使用公司帳戶登入</translation> +<translation id="8973975512230260387">你的工作階段已過期。請使用 Google 公司帳戶登入。</translation> +<translation id="9055998212250844221">Google 憑證提供者針對 Windows 建立的使用者帳戶</translation> <translation id="9135619837062629367">你無法以這個帳戶登入,請改用其他帳戶。</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/renderer/autofill/autofill_renderer_browsertest.cc b/chrome/renderer/autofill/autofill_renderer_browsertest.cc index 19a428f..7c61f2dd 100644 --- a/chrome/renderer/autofill/autofill_renderer_browsertest.cc +++ b/chrome/renderer/autofill/autofill_renderer_browsertest.cc
@@ -21,7 +21,8 @@ #include "content/public/common/content_switches.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" -#include "mojo/public/cpp/bindings/associated_binding_set.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/platform/web_string.h" @@ -56,8 +57,9 @@ FakeContentAutofillDriver() : called_field_change_(false) {} ~FakeContentAutofillDriver() override {} - void BindRequest(mojom::AutofillDriverAssociatedRequest request) { - bindings_.AddBinding(this, std::move(request)); + void BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver> receiver) { + receivers_.Add(this, std::move(receiver)); } bool called_field_change() const { return called_field_change_; } @@ -127,7 +129,7 @@ // Records data received via FormSeen() call. std::unique_ptr<std::vector<FormData>> forms_; - mojo::AssociatedBindingSet<mojom::AutofillDriver> bindings_; + mojo::AssociatedReceiverSet<mojom::AutofillDriver> receivers_; }; } // namespace @@ -156,8 +158,9 @@ } void BindAutofillDriver(mojo::ScopedInterfaceEndpointHandle handle) { - fake_driver_.BindRequest( - mojom::AutofillDriverAssociatedRequest(std::move(handle))); + fake_driver_.BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver>( + std::move(handle))); } FakeContentAutofillDriver fake_driver_;
diff --git a/chrome/renderer/autofill/form_autocomplete_browsertest.cc b/chrome/renderer/autofill/form_autocomplete_browsertest.cc index 4b55c11..96bea1d 100644 --- a/chrome/renderer/autofill/form_autocomplete_browsertest.cc +++ b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
@@ -14,7 +14,8 @@ #include "components/autofill/core/common/form_data.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" -#include "mojo/public/cpp/bindings/associated_binding_set.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/web/web_document.h" @@ -40,8 +41,9 @@ ~FakeContentAutofillDriver() override {} - void BindRequest(mojom::AutofillDriverAssociatedRequest request) { - bindings_.AddBinding(this, std::move(request)); + void BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver> receiver) { + receivers_.Add(this, std::move(receiver)); } bool did_unfocus_form() const { return did_unfocus_form_; } @@ -122,7 +124,7 @@ std::unique_ptr<FormFieldData> select_control_changed_; - mojo::AssociatedBindingSet<mojom::AutofillDriver> bindings_; + mojo::AssociatedReceiverSet<mojom::AutofillDriver> receivers_; }; // Helper function to verify the form-related messages received from the @@ -226,8 +228,9 @@ } void BindAutofillDriver(mojo::ScopedInterfaceEndpointHandle handle) { - fake_driver_.BindRequest( - mojom::AutofillDriverAssociatedRequest(std::move(handle))); + fake_driver_.BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver>( + std::move(handle))); } void SimulateUserInput(const blink::WebString& id, const std::string& value) {
diff --git a/chrome/services/app_service/public/mojom/types.mojom b/chrome/services/app_service/public/mojom/types.mojom index 4a519fb..f58b767 100644 --- a/chrome/services/app_service/public/mojom/types.mojom +++ b/chrome/services/app_service/public/mojom/types.mojom
@@ -161,6 +161,7 @@ kFromAppListQueryContextMenu, // Query-dependent results; context menu. kFromAppListRecommendation, // Query-less recommendations (smaller icons). kFromParentalControls, // Parental Controls Settings Section. + kFromShelf, // Shelf. }; enum TriState {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index cbf29fd..89f1061 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1039,6 +1039,8 @@ "../browser/policy/policy_network_browsertest.cc", "../browser/policy/policy_prefs_browsertest.cc", "../browser/policy/policy_startup_browsertest.cc", + "../browser/policy/policy_test_utils.cc", + "../browser/policy/policy_test_utils.h", "../browser/policy/site_isolation_policy_browsertest.cc", "../browser/predictors/loading_predictor_browsertest.cc", "../browser/prefetch/prefetch_browsertest.cc", @@ -1751,6 +1753,7 @@ "../browser/extensions/window_open_apitest.cc", "../browser/extensions/worker_apitest.cc", "../browser/notifications/notification_permission_context_apitest.cc", + "../browser/policy/extension_policy_browsertest.cc", "../browser/safe_browsing/chrome_cleaner/chrome_cleaner_dialog_controller_impl_browsertest_win.cc", "../browser/safe_browsing/chrome_cleaner/chrome_cleaner_reboot_dialog_controller_impl_browsertest_win.cc", "../browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_controller_win.cc", @@ -5096,6 +5099,8 @@ "../browser/ui/app_list/app_list_syncable_service_unittest.cc", "../browser/ui/app_list/app_list_test_util.cc", "../browser/ui/app_list/app_list_test_util.h", + "../browser/ui/app_list/app_service/app_service_test.cc", + "../browser/ui/app_list/app_service/app_service_test.h", "../browser/ui/app_list/arc/arc_app_test.cc", "../browser/ui/app_list/arc/arc_app_test.h", "../browser/ui/app_list/arc/arc_app_unittest.cc",
diff --git a/chrome/test/data/autofill/captured_sites/testcases.json b/chrome/test/data/autofill/captured_sites/testcases.json index 9f3eafe..d04b0be 100644 --- a/chrome/test/data/autofill/captured_sites/testcases.json +++ b/chrome/test/data/autofill/captured_sites/testcases.json
@@ -55,7 +55,7 @@ { "site_name": "harbor_freight" }, { "site_name": "home_depot" }, { "site_name": "hotels" }, - { "site_name": "indigo", "disabled":true, "bug_number":951847 }, + { "site_name": "indigo" }, { "site_name": "jet" }, { "site_name": "jetstar" }, { "site_name": "joann" }, @@ -66,7 +66,7 @@ { "site_name": "lowes" }, { "site_name": "mapsofindia" }, { "site_name": "mercurypay" }, - { "site_name": "modcloth" }, + { "site_name": "modcloth", "expectation":"FAIL", "bug_number":996478 }, { "site_name": "movietickets" }, { "site_name": "musicians_friend" }, { "site_name": "net_a_porter" }, @@ -154,16 +154,16 @@ { "site_name": "represent", "expectation":"PASS" }, { "site_name": "tillys", "expectation":"PASS" }, { "site_name": "verizonwireless", "expectation":"FAIL", "bug_number":996478 }, - { "site_name": "wiley", "expectation":"PASS" }, + { "site_name": "wiley", "expectation":"PASS", "disabled":true, "bug_number":1003044 }, { "site_name": "zenni_optical", "expectation":"PASS" }, { "site_name": "accesscorrections", "expectation":"PASS", "disabled":true, "bug_number":993044 }, { "site_name": "jetspizza", "expectation":"PASS", "disabled":true, "bug_number":993044 }, { "site_name": "star_city_games", "expectation":"PASS", "disabled":true, "bug_number":993044 }, - { "site_name": "1aauto", "expectation":"PASS", "disabled":true, "bug_number":984664 }, + { "site_name": "1aauto", "expectation":"PASS" }, { "site_name": "abercrombie", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "barnes_and_noble", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "collage", "expectation":"PASS", "disabled":true, "bug_number":984664 }, - { "site_name": "cvs", "expectation":"PASS", "disabled":true, "bug_number":984664 }, + { "site_name": "cvs", "expectation":"PASS" }, { "site_name": "ebay", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "elementvape", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "fender", "expectation":"PASS", "disabled":true, "bug_number":984664 }, @@ -175,7 +175,7 @@ { "site_name": "panerabread", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "pets_mart", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "polar", "expectation":"PASS", "disabled":true, "bug_number":984664 }, - { "site_name": "safishing", "expectation":"PASS", "disabled":true, "bug_number":984664 }, + { "site_name": "safishing", "expectation":"PASS" }, { "site_name": "ticket_master", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "tractorsupply", "expectation":"PASS", "disabled":true, "bug_number":984664 }, { "site_name": "tradesy", "expectation":"PASS", "disabled":true, "bug_number":984664 },
diff --git a/chrome/test/data/navigation_predictor/anchors_same_href.html b/chrome/test/data/navigation_predictor/anchors_same_href.html index dcf514d..6e80745 100644 --- a/chrome/test/data/navigation_predictor/anchors_same_href.html +++ b/chrome/test/data/navigation_predictor/anchors_same_href.html
@@ -5,6 +5,6 @@ <a id="google" href="https://google.com">Google</a> <a id="google2" href="https://google.com">Google2</a> <a id="imageSameHref" href="https://google.com"><img height="1" width="1"></a> - <a id="diffHref" href="https://example.com"></a> + <a id="diffHref" href="https://example.com">diff</a> </body> </html> \ No newline at end of file
diff --git a/chrome/test/data/password/captured_sites/testcases.json b/chrome/test/data/password/captured_sites/testcases.json index 9f824b3..e63d8b5f 100644 --- a/chrome/test/data/password/captured_sites/testcases.json +++ b/chrome/test/data/password/captured_sites/testcases.json
@@ -29,7 +29,6 @@ { "scenario_dir":"sign_in_pass", "site_name":"amazon" }, { "scenario_dir":"sign_in_pass", "site_name":"autodesk" }, { "scenario_dir":"sign_in_pass", "site_name":"clever" }, - { "scenario_dir":"sign_in_pass", "site_name":"cryptopia" }, { "scenario_dir":"sign_in_pass", "site_name":"dreambox" }, { "scenario_dir":"sign_in_pass", "site_name":"ebay" }, { "scenario_dir":"sign_in_pass", "site_name":"etsy" }, @@ -79,7 +78,6 @@ { "scenario_dir":"sign_up_fill", "site_name":"battle_net" }, { "scenario_dir":"sign_up_fill", "site_name":"bet_365" }, { "scenario_dir":"sign_up_fill", "site_name":"clever" }, - { "scenario_dir":"sign_up_fill", "site_name":"cryptopia", "disabled":true, "bug_number":984662, "locally":"PASS" }, { "scenario_dir":"sign_up_fill", "site_name":"daum" }, { "scenario_dir":"sign_up_fill", "site_name":"discord_app", "disabled":true, "bug_number":951847 }, { "scenario_dir":"sign_up_fill", "site_name":"dreambox", "disabled":true, "bug_number":984662, "locally":"FAIL" }, @@ -130,7 +128,6 @@ { "scenario_dir":"sign_up_pass", "site_name":"battle_net" }, { "scenario_dir":"sign_up_pass", "site_name":"booking" }, { "scenario_dir":"sign_up_pass", "site_name":"clever" }, - { "scenario_dir":"sign_up_pass", "site_name":"cryptopia" }, { "scenario_dir":"sign_up_pass", "site_name":"discord_app", "disabled":true, "bug_number":951847 }, { "scenario_dir":"sign_up_pass", "site_name":"ea" }, { "scenario_dir":"sign_up_pass", "site_name":"ebay" },
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 9a876a2..40c22d0 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -176,6 +176,7 @@ "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_group_test.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_search_field_tests.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_toast_test.m.js", + "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_toast_manager_test.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_toolbar_search_field_tests.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_view_manager_test.m.js", "$root_gen_dir/chrome/test/data/webui/mock_timer.m.js",
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn index 5ce9c48e..10bf9289 100644 --- a/chrome/test/data/webui/cr_elements/BUILD.gn +++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -25,12 +25,14 @@ "cr_toolbar_search_field_tests.js", "cr_tabs_test.js", "cr_toast_test.js", + "cr_toast_manager_test.js", "cr_toggle_test.js", "cr_view_manager_test.js", ] namespace_rewrites = [ "cr.isMac|isMac", "cr.isWindows|isWindows", + "cr.toastManager.getInstance|getInstance", "MockInteractions.blur|blur", "MockInteractions.downAndUp|downAndUp", "MockInteractions.keyDownOn|keyDownOn",
diff --git a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js index dca8cc2..e2f4303 100644 --- a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js +++ b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js
@@ -3,10 +3,9 @@ // found in the LICENSE file. // clang-format off -// #import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js'; +// #import {AnchorAlignment} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js'; // #import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; // -// #import {AnchorAlignment} from 'chrome://resources/cr_elements/cr_action_menu/anchor_alignment.m.js'; // #import {eventToPromise, flushTasks} from 'chrome://test/test_util.m.js'; // #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; // #import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js index 3aa679a..0e49ad8 100644 --- a/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js +++ b/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js
@@ -200,6 +200,18 @@ }); // eslint-disable-next-line no-var +var CrElementsToastManagerV3Test = class extends CrElementsV3BrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://test?module=cr_elements/cr_toast_manager_test.m.js'; + } +}; + +TEST_F('CrElementsToastManagerV3Test', 'All', function() { + mocha.run(); +}); + +// eslint-disable-next-line no-var var CrElementsViewManagerV3Test = class extends CrElementsV3BrowserTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/cr_elements/cr_toast_manager_test.js b/chrome/test/data/webui/cr_elements/cr_toast_manager_test.js index 2ef1095d..e4e8fee 100644 --- a/chrome/test/data/webui/cr_elements/cr_toast_manager_test.js +++ b/chrome/test/data/webui/cr_elements/cr_toast_manager_test.js
@@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// clang-format off +// #import {getInstance} from 'chrome://resources/cr_elements/cr_toast/cr_toast_manager.m.js'; +// #import {eventToPromise} from 'chrome://test/test_util.m.js'; +// clang-format on + suite('cr-toast-manager', () => { let toastManager; @@ -26,8 +31,12 @@ assertFalse(toastManager.$.button.hidden); toastManager.hide(); - assertEquals( - 'hidden', window.getComputedStyle(toastManager.$.button).visibility); + const whenDone = + new Promise(resolve => window.requestAnimationFrame(resolve)); + return whenDone.then(() => { + assertEquals( + 'hidden', window.getComputedStyle(toastManager.$.button).visibility); + }); }); test('undo-click fired when undo button is clicked', async () => {
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index dffb867..a97d389 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -33,6 +33,7 @@ #include "content/public/common/bindings_policy.h" #include "content/public/common/favicon_url.h" #include "content/public/common/resource_load_info.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/net_errors.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" @@ -376,12 +377,13 @@ media_playback_options->SetUseCmaRenderer(use_cma_renderer_); // Send queryable values - chromecast::shell::mojom::QueryableDataStorePtr queryable_data_store_ptr; + mojo::Remote<chromecast::shell::mojom::QueryableDataStore> + queryable_data_store_remote; render_frame_host->GetRemoteInterfaces()->GetInterface( - &queryable_data_store_ptr); + queryable_data_store_remote.BindNewPipeAndPassReceiver()); for (const auto& value : QueryableData::GetValues()) { // base::Value is not copyable. - queryable_data_store_ptr->Set(value.first, value.second.Clone()); + queryable_data_store_remote->Set(value.first, value.second.Clone()); } }
diff --git a/chromecast/browser/queryable_data_host_cast.cc b/chromecast/browser/queryable_data_host_cast.cc index 53ff7e73..6b15fac 100644 --- a/chromecast/browser/queryable_data_host_cast.cc +++ b/chromecast/browser/queryable_data_host_cast.cc
@@ -7,6 +7,7 @@ #include "chromecast/common/mojom/queryable_data_store.mojom.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/interface_provider.h" namespace chromecast { @@ -22,10 +23,10 @@ const base::Value& value) { for (content::RenderFrameHost* render_frame_host : web_contents_->GetAllFrames()) { - shell::mojom::QueryableDataStorePtr queryable_data_store_ptr; + mojo::Remote<shell::mojom::QueryableDataStore> queryable_data_store_remote; render_frame_host->GetRemoteInterfaces()->GetInterface( - &queryable_data_store_ptr); - queryable_data_store_ptr->Set(key, value.Clone()); + queryable_data_store_remote.BindNewPipeAndPassReceiver()); + queryable_data_store_remote->Set(key, value.Clone()); } }
diff --git a/chromecast/net/BUILD.gn b/chromecast/net/BUILD.gn index c6f2443..235aeea 100644 --- a/chromecast/net/BUILD.gn +++ b/chromecast/net/BUILD.gn
@@ -49,6 +49,18 @@ } } +cast_source_set("io_buffer_pool") { + sources = [ + "io_buffer_pool.cc", + "io_buffer_pool.h", + ] + + deps = [ + "//base", + "//net", + ] +} + cast_source_set("small_message_socket") { sources = [ "small_message_socket.cc", @@ -86,9 +98,11 @@ test("cast_net_unittests") { sources = [ "fake_stream_socket_unittest.cc", + "io_buffer_pool_unittest.cc", ] deps = [ + ":io_buffer_pool", ":test_support", "//base", "//base/test:run_all_unittests",
diff --git a/chromecast/net/io_buffer_pool.cc b/chromecast/net/io_buffer_pool.cc new file mode 100644 index 0000000..4d2203a --- /dev/null +++ b/chromecast/net/io_buffer_pool.cc
@@ -0,0 +1,255 @@ +// 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. + +#include "chromecast/net/io_buffer_pool.h" + +#include <new> + +#include "base/synchronization/lock.h" +#include "net/base/io_buffer.h" + +namespace chromecast { + +// The IOBufferPool allocates IOBuffers and the associated data as a single +// contiguous buffer. The buffer is laid out like this: +// |------------Wrapper----------|---data buffer---| +// |--IOBuffer--|--Internal ptr--|---data buffer---| +// +// The contiguous buffer is allocated as a character array, and then a Wrapper +// instance is placement-newed into it. We return a pointer to the IOBuffer +// within the Wrapper. +// +// When the IOBuffer is deleted (in operator delete), we get a pointer to the +// beginning of storage for the IOBuffer, which is the same memory location +// as the Wrapper instance (since the Wrapper has no vtable or base class, this +// should be true for any compiler). We can therefore cast the "deleted" +// pointer to a Wrapper* and then reclaim the buffer. +// +// All the actual data and logic for the buffer pool is held in the Internal +// class, which is refcounted with 1 ref for the IOBufferPool owner, and 1 ref +// for each buffer currently in use (ie, not in the free list). The Internal +// instance is only deleted when its internal refcount drops to 0; this allows +// buffers allocated from the pool to be safely used and deleted even after the +// pool has been destroyed. +// +// Note that locking in the Internal methods is optional since it is only needed +// when threadsafe operation is requested. + +class IOBufferPool::Internal { + public: + Internal(size_t buffer_size, size_t max_buffers, bool threadsafe); + + size_t num_allocated() const { + base::AutoLockMaybe lock(lock_ptr_); + return num_allocated_; + } + + size_t num_free() const { + base::AutoLockMaybe lock(lock_ptr_); + return num_free_; + } + + void Preallocate(size_t num_buffers); + + void OwnerDestroyed(); + + scoped_refptr<net::IOBuffer> GetBuffer(); + + private: + class Buffer; + class Wrapper; + union Storage; + + ~Internal(); + + void Reclaim(Wrapper* wrapper); + + const size_t buffer_size_; + const size_t max_buffers_; + + mutable base::Lock lock_; + base::Lock* const lock_ptr_; + + Storage* free_buffers_; + size_t num_allocated_; + size_t num_free_; + + int refs_; + + DISALLOW_COPY_AND_ASSIGN(Internal); +}; + +class IOBufferPool::Internal::Buffer : public net::IOBuffer { + public: + explicit Buffer(char* data) : net::IOBuffer(data) {} + + private: + friend class Wrapper; + + ~Buffer() override { data_ = nullptr; } + static void operator delete(void* ptr); + + DISALLOW_COPY_AND_ASSIGN(Buffer); +}; + +class IOBufferPool::Internal::Wrapper { + public: + Wrapper(char* data, IOBufferPool::Internal* pool) + : buffer_(data), pool_(pool) {} + + ~Wrapper() = delete; + static void operator delete(void*) = delete; + + Buffer* buffer() { return &buffer_; } + + void Reclaim() { pool_->Reclaim(this); } + + private: + Buffer buffer_; + IOBufferPool::Internal* const pool_; + + DISALLOW_COPY_AND_ASSIGN(Wrapper); +}; + +union IOBufferPool::Internal::Storage { + Storage* next; // Pointer to next free buffer. + Wrapper wrapper; +}; + +void IOBufferPool::Internal::Buffer::operator delete(void* ptr) { + Wrapper* wrapper = reinterpret_cast<Wrapper*>(ptr); + wrapper->Reclaim(); +} + +IOBufferPool::Internal::Internal(size_t buffer_size, + size_t max_buffers, + bool threadsafe) + : buffer_size_(buffer_size), + max_buffers_(max_buffers), + lock_ptr_(threadsafe ? &lock_ : nullptr), + free_buffers_(nullptr), + num_allocated_(0), + num_free_(0), + refs_(1) { // 1 ref for the owner. +} + +IOBufferPool::Internal::~Internal() { + while (free_buffers_) { + char* data = reinterpret_cast<char*>(free_buffers_); + free_buffers_ = free_buffers_->next; + delete[] data; + } +} + +void IOBufferPool::Internal::Preallocate(size_t num_buffers) { + // We assume that this is uncontended in normal usage, so just lock for the + // entire method. + base::AutoLockMaybe lock(lock_ptr_); + if (num_buffers > max_buffers_) { + num_buffers = max_buffers_; + } + if (num_allocated_ >= num_buffers) { + return; + } + size_t num_extra_buffers = num_buffers - num_allocated_; + num_free_ += num_extra_buffers; + num_allocated_ += num_extra_buffers; + while (num_extra_buffers > 0) { + char* ptr = new char[sizeof(Storage) + buffer_size_]; + Storage* storage = reinterpret_cast<Storage*>(ptr); + storage->next = free_buffers_; + free_buffers_ = storage; + + --num_extra_buffers; + } + // No need to add refs here, since the newly allocated buffers are not in use. +} + +void IOBufferPool::Internal::OwnerDestroyed() { + bool deletable; + { + base::AutoLockMaybe lock(lock_ptr_); + --refs_; // Remove the owner's ref. + deletable = (refs_ == 0); + } + + if (deletable) { + delete this; + } +} + +scoped_refptr<net::IOBuffer> IOBufferPool::Internal::GetBuffer() { + char* ptr = nullptr; + + { + base::AutoLockMaybe lock(lock_ptr_); + if (free_buffers_) { + ptr = reinterpret_cast<char*>(free_buffers_); + free_buffers_ = free_buffers_->next; + --num_free_; + } else { + if (num_allocated_ == max_buffers_) + return nullptr; + ++num_allocated_; + } + ++refs_; // Add a ref for the now in-use buffer. + } + + if (!ptr) { + ptr = new char[sizeof(Storage) + buffer_size_]; + } + + char* data = ptr + sizeof(Storage); + Wrapper* wrapper = new (ptr) Wrapper(data, this); + return scoped_refptr<net::IOBuffer>(wrapper->buffer()); +} + +void IOBufferPool::Internal::Reclaim(Wrapper* wrapper) { + Storage* storage = reinterpret_cast<Storage*>(wrapper); + bool deletable; + { + base::AutoLockMaybe lock(lock_ptr_); + storage->next = free_buffers_; + free_buffers_ = storage; + ++num_free_; + --refs_; // Remove a ref since this buffer is no longer in use. + deletable = (refs_ == 0); + } + + if (deletable) { + delete this; + } +} + +IOBufferPool::IOBufferPool(size_t buffer_size, + size_t max_buffers, + bool threadsafe) + : buffer_size_(buffer_size), + max_buffers_(max_buffers), + internal_(new Internal(buffer_size, max_buffers, threadsafe)) {} + +IOBufferPool::IOBufferPool(size_t buffer_size) + : IOBufferPool(buffer_size, static_cast<size_t>(-1)) {} + +IOBufferPool::~IOBufferPool() { + internal_->OwnerDestroyed(); +} + +size_t IOBufferPool::NumAllocatedForTesting() const { + return internal_->num_allocated(); +} + +size_t IOBufferPool::NumFreeForTesting() const { + return internal_->num_free(); +} + +void IOBufferPool::Preallocate(size_t num_buffers) { + internal_->Preallocate(num_buffers); +} + +scoped_refptr<net::IOBuffer> IOBufferPool::GetBuffer() { + return internal_->GetBuffer(); +} + +} // namespace chromecast
diff --git a/chromecast/net/io_buffer_pool.h b/chromecast/net/io_buffer_pool.h new file mode 100644 index 0000000..5c34c81 --- /dev/null +++ b/chromecast/net/io_buffer_pool.h
@@ -0,0 +1,69 @@ +// 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. + +#ifndef CHROMECAST_NET_IO_BUFFER_POOL_H_ +#define CHROMECAST_NET_IO_BUFFER_POOL_H_ + +#include <stddef.h> + +#include "base/macros.h" +#include "base/memory/ref_counted.h" + +namespace net { +class IOBuffer; +} // namespace net + +namespace chromecast { + +// Buffer pool to allocate ::net::IOBuffers of a constant size. When a buffer +// from this pool is destroyed, it is returned to the pool to be reused (rather +// than constantly reallocating memory). If the buffer is destroyed after the +// pool has been destroyed, the buffer's memory will be freed correctly. +class IOBufferPool : public base::RefCountedThreadSafe<IOBufferPool> { + public: + // |buffer_size| is the usable size of each buffer that will be returned + // by GetBuffer(). |max_buffers| is the maximum number of buffers that this + // pool will allocate. If |threadsafe| is true then the pool and any buffers + // allocated from it may be used safely on any thread; otherwise all access + // to pool and buffers must be made on the creating sequence. + IOBufferPool(size_t buffer_size, size_t max_buffers, bool threadsafe = false); + // If |max_buffers| is not specified, the maximum value of size_t is used. + explicit IOBufferPool(size_t buffer_size); + + size_t buffer_size() const { return buffer_size_; } + size_t max_buffers() const { return max_buffers_; } + + // Ensures that at least |num_buffers| are allocated. If |num_buffers| is + // greater than |max_buffers|, makes sure that |max_buffers| buffers have been + // allocated. + void Preallocate(size_t num_buffers); + + // Returns an IOBuffer from the pool, or |nullptr| if there are no buffers in + // the pool and |max buffers| has been reached. The pool does not keep any + // references to the buffer. It is safe to use the returned buffer after the + // pool has been destroyed; if the buffer is destroyed after the pool is + // destroyed, the buffer's memory will be freed correctly. + scoped_refptr<net::IOBuffer> GetBuffer(); + + // Returns the number of buffers that have ever been allocated by the pool. + size_t NumAllocatedForTesting() const; + // Returns the number of buffers that are currently free in the pool. + size_t NumFreeForTesting() const; + + private: + class Internal; + + friend class base::RefCountedThreadSafe<IOBufferPool>; + ~IOBufferPool(); + + const size_t buffer_size_; + const size_t max_buffers_; + Internal* internal_; // Manages its own lifetime. + + DISALLOW_COPY_AND_ASSIGN(IOBufferPool); +}; + +} // namespace chromecast + +#endif // CHROMECAST_NET_IO_BUFFER_POOL_H_
diff --git a/chromecast/net/io_buffer_pool_unittest.cc b/chromecast/net/io_buffer_pool_unittest.cc new file mode 100644 index 0000000..a42943b --- /dev/null +++ b/chromecast/net/io_buffer_pool_unittest.cc
@@ -0,0 +1,113 @@ +// 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. + +#include "chromecast/net/io_buffer_pool.h" + +#include "base/memory/ref_counted.h" +#include "net/base/io_buffer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromecast { + +namespace { +const size_t kDefaultBufferSize = 256; +} // namespace + +TEST(IOBufferPoolTest, ZeroMaxBuffers) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 0); + EXPECT_EQ(nullptr, pool->GetBuffer()); + EXPECT_EQ(kDefaultBufferSize, pool->buffer_size()); + EXPECT_EQ(0u, pool->max_buffers()); + EXPECT_EQ(0u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); +} + +TEST(IOBufferPoolTest, OneMaxBuffer) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 1); + scoped_refptr<net::IOBuffer> buffer = pool->GetBuffer(); + EXPECT_NE(nullptr, buffer.get()); + EXPECT_EQ(nullptr, pool->GetBuffer()); + EXPECT_EQ(1u, pool->max_buffers()); + EXPECT_EQ(1u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); +} + +TEST(IOBufferPoolTest, SeveralMaxBuffers) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 4); + scoped_refptr<net::IOBuffer> buffer1 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer2 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer3 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer4 = pool->GetBuffer(); + EXPECT_NE(nullptr, buffer1.get()); + EXPECT_NE(nullptr, buffer2.get()); + EXPECT_NE(nullptr, buffer3.get()); + EXPECT_NE(nullptr, buffer4.get()); + EXPECT_EQ(nullptr, pool->GetBuffer()); + EXPECT_EQ(4u, pool->max_buffers()); + EXPECT_EQ(4u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); +} + +TEST(IOBufferPoolTest, Reclaim) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 3); + scoped_refptr<net::IOBuffer> buffer1 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer2 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer3 = pool->GetBuffer(); + EXPECT_NE(nullptr, buffer1.get()); + EXPECT_NE(nullptr, buffer2.get()); + EXPECT_NE(nullptr, buffer3.get()); + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); + buffer1 = nullptr; + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(1u, pool->NumFreeForTesting()); + buffer2 = nullptr; + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(2u, pool->NumFreeForTesting()); + buffer3 = nullptr; + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(3u, pool->NumFreeForTesting()); + buffer1 = pool->GetBuffer(); + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(2u, pool->NumFreeForTesting()); +} + +TEST(IOBufferPoolTest, DestroyBufferAfterPool) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 3); + scoped_refptr<net::IOBuffer> buffer1 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer2 = pool->GetBuffer(); + EXPECT_NE(nullptr, buffer1.get()); + EXPECT_NE(nullptr, buffer2.get()); + EXPECT_EQ(2u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); + buffer1 = nullptr; + EXPECT_EQ(2u, pool->NumAllocatedForTesting()); + EXPECT_EQ(1u, pool->NumFreeForTesting()); + + pool = nullptr; + buffer2 = nullptr; // Expect no crash and no memory errors. +} + +TEST(IOBufferPoolTest, Preallocate) { + auto pool = base::MakeRefCounted<IOBufferPool>(kDefaultBufferSize, 3); + pool->Preallocate(8); + + EXPECT_EQ(3u, pool->max_buffers()); + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(3u, pool->NumFreeForTesting()); + + scoped_refptr<net::IOBuffer> buffer1 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer2 = pool->GetBuffer(); + scoped_refptr<net::IOBuffer> buffer3 = pool->GetBuffer(); + + EXPECT_NE(nullptr, buffer1.get()); + EXPECT_NE(nullptr, buffer2.get()); + EXPECT_NE(nullptr, buffer3.get()); + EXPECT_EQ(nullptr, pool->GetBuffer()); + + EXPECT_EQ(3u, pool->NumAllocatedForTesting()); + EXPECT_EQ(0u, pool->NumFreeForTesting()); +} + +} // namespace chromecast
diff --git a/chromecast/renderer/queryable_data_bindings.cc b/chromecast/renderer/queryable_data_bindings.cc index bd6f9ba..4c1b6d00 100644 --- a/chromecast/renderer/queryable_data_bindings.cc +++ b/chromecast/renderer/queryable_data_bindings.cc
@@ -27,7 +27,7 @@ queryable_data_store_(std::make_unique<QueryableDataStore>( base::ThreadTaskRunnerHandle::Get())) { registry_.AddInterface<shell::mojom::QueryableDataStore>( - base::BindRepeating(&QueryableDataStore::BindQueryableDataStoreRequest, + base::BindRepeating(&QueryableDataStore::BindQueryableDataStoreReceiver, base::Unretained(queryable_data_store_.get()))); }
diff --git a/chromecast/renderer/queryable_data_store.cc b/chromecast/renderer/queryable_data_store.cc index 6cbd59b..5139daf 100644 --- a/chromecast/renderer/queryable_data_store.cc +++ b/chromecast/renderer/queryable_data_store.cc
@@ -25,9 +25,9 @@ std::move(value))); } -void QueryableDataStore::BindQueryableDataStoreRequest( - shell::mojom::QueryableDataStoreRequest request) { - queryable_data_bindings_.AddBinding(this, std::move(request)); +void QueryableDataStore::BindQueryableDataStoreReceiver( + mojo::PendingReceiver<shell::mojom::QueryableDataStore> receiver) { + queryable_data_receivers_.Add(this, std::move(receiver)); } } // namespace chromecast
diff --git a/chromecast/renderer/queryable_data_store.h b/chromecast/renderer/queryable_data_store.h index d1c8ffb..579e35a 100644 --- a/chromecast/renderer/queryable_data_store.h +++ b/chromecast/renderer/queryable_data_store.h
@@ -10,7 +10,8 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "chromecast/common/mojom/queryable_data_store.mojom.h" -#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" namespace base { class Value; @@ -27,8 +28,8 @@ const scoped_refptr<base::TaskRunner> render_main_thread); ~QueryableDataStore() override; - void BindQueryableDataStoreRequest( - shell::mojom::QueryableDataStoreRequest request); + void BindQueryableDataStoreReceiver( + mojo::PendingReceiver<shell::mojom::QueryableDataStore> receiver); private: // shell::mojom::QueryableDataStore implementation: @@ -36,7 +37,7 @@ const scoped_refptr<base::TaskRunner> render_main_thread_; - mojo::BindingSet<shell::mojom::QueryableDataStore> queryable_data_bindings_; + mojo::ReceiverSet<shell::mojom::QueryableDataStore> queryable_data_receivers_; DISALLOW_COPY_AND_ASSIGN(QueryableDataStore); };
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc index d9af5a4..354df02 100644 --- a/chromeos/constants/chromeos_features.cc +++ b/chromeos/constants/chromeos_features.cc
@@ -154,6 +154,10 @@ const base::Feature kReleaseNotes{"ReleaseNotes", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables or disables a toggle to enable Bluetooth debug logs. +const base::Feature kShowBluetoothDebugLogToggle{ + "ShowBluetoothDebugLogToggle", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables showing the battery level in the System Tray and Settings // UI for supported Bluetooth Devices. const base::Feature kShowBluetoothDeviceBattery{
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h index 161b88a..b7797551 100644 --- a/chromeos/constants/chromeos_features.h +++ b/chromeos/constants/chromeos_features.h
@@ -75,6 +75,8 @@ COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kReleaseNotes; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) +extern const base::Feature kShowBluetoothDebugLogToggle; +COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kShowBluetoothDeviceBattery; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kShowPlayInDemoMode;
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc index 52debd30..4c6dec90 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.cc +++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -675,6 +675,12 @@ arc_available_ ? base::make_optional(arc_start_time_) : base::nullopt); } +void FakeSessionManagerClient::EnableAdbSideload( + EnableAdbSideloadCallback callback) {} + +void FakeSessionManagerClient::QueryAdbSideload( + QueryAdbSideloadCallback callback) {} + void FakeSessionManagerClient::NotifyArcInstanceStopped() { for (auto& observer : observers_) observer.ArcInstanceStopped();
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.h b/chromeos/dbus/session_manager/fake_session_manager_client.h index 658f867..e9246a6 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.h +++ b/chromeos/dbus/session_manager/fake_session_manager_client.h
@@ -135,6 +135,8 @@ void EmitArcBooted(const cryptohome::AccountIdentifier& cryptohome_id, VoidDBusMethodCallback callback) override; void GetArcStartTime(DBusMethodCallback<base::TimeTicks> callback) override; + void EnableAdbSideload(EnableAdbSideloadCallback callback) override; + void QueryAdbSideload(QueryAdbSideloadCallback callback) override; // Notifies observers as if ArcInstanceStopped signal is received. void NotifyArcInstanceStopped();
diff --git a/chromeos/dbus/session_manager/session_manager_client.cc b/chromeos/dbus/session_manager/session_manager_client.cc index aa7e4232..88589f3 100644 --- a/chromeos/dbus/session_manager/session_manager_client.cc +++ b/chromeos/dbus/session_manager/session_manager_client.cc
@@ -623,6 +623,28 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } + void EnableAdbSideload(EnableAdbSideloadCallback callback) override { + dbus::MethodCall method_call( + login_manager::kSessionManagerInterface, + login_manager::kSessionManagerEnableAdbSideload); + + session_manager_proxy_->CallMethodWithErrorResponse( + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::BindOnce(&SessionManagerClientImpl::OnEnableAdbSideload, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + + void QueryAdbSideload(QueryAdbSideloadCallback callback) override { + dbus::MethodCall method_call( + login_manager::kSessionManagerInterface, + login_manager::kSessionManagerQueryAdbSideload); + + session_manager_proxy_->CallMethodWithErrorResponse( + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::BindOnce(&SessionManagerClientImpl::OnQueryAdbSideload, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + void Init(dbus::Bus* bus) { session_manager_proxy_ = bus->GetObjectProxy( login_manager::kSessionManagerServiceName, @@ -978,6 +1000,45 @@ std::move(callback).Run(base::TimeTicks::FromInternalValue(ticks)); } + void OnEnableAdbSideload(EnableAdbSideloadCallback callback, + dbus::Response* response, + dbus::ErrorResponse* error) { + if (!response) { + LOG(ERROR) << "Failed to call EnableAdbSideload: " + << (error ? error->ToString() : "(null)"); + std::move(callback).Run(false); + return; + } + + bool succeeded; + dbus::MessageReader reader(response); + if (!reader.PopBool(&succeeded)) { + LOG(ERROR) << "Failed to enable sideloading"; + std::move(callback).Run(false); + return; + } + std::move(callback).Run(true); + } + + void OnQueryAdbSideload(QueryAdbSideloadCallback callback, + dbus::Response* response, + dbus::ErrorResponse* error) { + if (!response) { + LOG(ERROR) << "Failed to call QueryAdbSideload: " + << (error ? error->ToString() : "(null)"); + std::move(callback).Run(false, false); + return; + } + + bool is_allowed; + dbus::MessageReader reader(response); + if (!reader.PopBool(&is_allowed)) { + LOG(ERROR) << "Failed to interpret the response"; + std::move(callback).Run(false, false); + } + std::move(callback).Run(true, is_allowed); + } + dbus::ObjectProxy* session_manager_proxy_ = nullptr; std::unique_ptr<BlockingMethodCaller> blocking_method_caller_; base::ObserverList<Observer>::Unchecked observers_;
diff --git a/chromeos/dbus/session_manager/session_manager_client.h b/chromeos/dbus/session_manager/session_manager_client.h index 0277129..98bfec2 100644 --- a/chromeos/dbus/session_manager/session_manager_client.h +++ b/chromeos/dbus/session_manager/session_manager_client.h
@@ -421,6 +421,23 @@ virtual void GetArcStartTime( DBusMethodCallback<base::TimeTicks> callback) = 0; + using EnableAdbSideloadCallback = base::OnceCallback<void(bool succeeded)>; + + // Asynchronously attempts to enable ARC APK Sideloading. Upon completion, + // invokes |callback| with the result; true on success, false on failure of + // any kind. + virtual void EnableAdbSideload(EnableAdbSideloadCallback callback) = 0; + + using QueryAdbSideloadCallback = + base::OnceCallback<void(bool succeeded, bool is_allowed)>; + + // Asynchronously queries for the current status of ARC APK Sideloading. Upon + // completion, invokes |callback| with |succeeded| indicating if the query + // could be completed. If |succeeded| is true, |is_allowed| contains the + // current status of whether ARC APK Sideloading is allowed on this device, + // based on previous explicit user opt-in. + virtual void QueryAdbSideload(QueryAdbSideloadCallback callback) = 0; + protected: // Use Initialize/Shutdown instead. SessionManagerClient();
diff --git a/components/arc/mojom/video_accelerator_mojom_traits.cc b/components/arc/mojom/video_accelerator_mojom_traits.cc index cd270013..07add4c1 100644 --- a/components/arc/mojom/video_accelerator_mojom_traits.cc +++ b/components/arc/mojom/video_accelerator_mojom_traits.cc
@@ -4,6 +4,9 @@ #include "components/arc/mojom/video_accelerator_mojom_traits.h" +#include "base/files/platform_file.h" +#include "mojo/public/cpp/system/platform_handle.h" + namespace mojo { // Make sure values in arc::mojom::VideoCodecProfile match to the values in @@ -269,4 +272,49 @@ return true; } +// static +bool StructTraits<arc::mojom::VideoFrameDataView, + scoped_refptr<media::VideoFrame>>:: + Read(arc::mojom::VideoFrameDataView data, + scoped_refptr<media::VideoFrame>* out) { + gfx::Rect visible_rect; + if (data.id() == 0 || !data.ReadVisibleRect(&visible_rect)) { + return false; + } + + // We store id at the first 8 byte of the mailbox. + const uint64_t id = data.id(); + static_assert(GL_MAILBOX_SIZE_CHROMIUM >= sizeof(id), + "Size of Mailbox is too small to store id."); + gpu::Mailbox mailbox; + memcpy(mailbox.name, &id, sizeof(id)); + gpu::MailboxHolder mailbox_holders[media::VideoFrame::kMaxPlanes]; + mailbox_holders[0] = gpu::MailboxHolder(mailbox, gpu::SyncToken(), 0); + + // We don't store pixel format and coded_size in Mojo struct. Use dummy value. + *out = media::VideoFrame::WrapNativeTextures( + media::PIXEL_FORMAT_I420, mailbox_holders, + media::VideoFrame::ReleaseMailboxCB(), visible_rect.size(), visible_rect, + visible_rect.size(), base::TimeDelta::FromMilliseconds(data.timestamp())); + return true; +} + +// static +bool StructTraits<arc::mojom::DecoderBufferDataView, arc::DecoderBuffer>::Read( + arc::mojom::DecoderBufferDataView data, + arc::DecoderBuffer* out) { + base::PlatformFile platform_file = base::kInvalidPlatformFile; + if (mojo::UnwrapPlatformFile(data.TakeHandleFd(), &platform_file) != + MOJO_RESULT_OK) { + return false; + } + + out->handle_fd = base::ScopedFD(platform_file); + out->offset = data.offset(); + out->payload_size = data.payload_size(); + out->end_of_stream = data.end_of_stream(); + out->timestamp = base::TimeDelta::FromMilliseconds(data.timestamp()); + return true; +} + } // namespace mojo
diff --git a/components/arc/mojom/video_accelerator_mojom_traits.h b/components/arc/mojom/video_accelerator_mojom_traits.h index 9ac6460..2ad0341 100644 --- a/components/arc/mojom/video_accelerator_mojom_traits.h +++ b/components/arc/mojom/video_accelerator_mojom_traits.h
@@ -5,14 +5,21 @@ #ifndef COMPONENTS_ARC_MOJOM_VIDEO_ACCELERATOR_MOJOM_TRAITS_H_ #define COMPONENTS_ARC_MOJOM_VIDEO_ACCELERATOR_MOJOM_TRAITS_H_ +#include <string.h> + #include <memory> +#include "components/arc/mojom/arc_gfx_mojom_traits.h" #include "components/arc/mojom/video_common.mojom.h" +#include "components/arc/video_accelerator/decoder_buffer.h" #include "components/arc/video_accelerator/video_frame_plane.h" #include "media/base/decode_status.h" #include "media/base/video_codecs.h" +#include "media/base/video_frame.h" #include "media/base/video_frame_layout.h" #include "media/base/video_types.h" +#include "mojo/public/cpp/platform/platform_handle.h" +#include "mojo/public/cpp/system/platform_handle.h" #include "ui/gfx/geometry/size.h" namespace mojo { @@ -145,6 +152,73 @@ media::DecodeStatus* output); }; +template <> +struct StructTraits<arc::mojom::VideoFrameDataView, + scoped_refptr<media::VideoFrame>> { + static bool IsNull(const scoped_refptr<media::VideoFrame> input) { + return !input; + } + + static void SetToNull(scoped_refptr<media::VideoFrame>* output) { + output->reset(); + } + + static uint64_t id(const scoped_refptr<media::VideoFrame> input) { + DCHECK(input); + DCHECK(!input->mailbox_holder(0).mailbox.IsZero()); + + // We store id at the first 8 byte of the mailbox. + uint64_t id; + static_assert(GL_MAILBOX_SIZE_CHROMIUM >= sizeof(id), + "Size of Mailbox is too small to store id."); + const int8_t* const name = input->mailbox_holder(0).mailbox.name; + memcpy(&id, name, sizeof(id)); + return id; + } + + static gfx::Rect visible_rect(const scoped_refptr<media::VideoFrame> input) { + DCHECK(input); + + return input->visible_rect(); + } + + static int64_t timestamp(const scoped_refptr<media::VideoFrame> input) { + DCHECK(input); + + return input->timestamp().InMilliseconds(); + } + + static bool Read(arc::mojom::VideoFrameDataView data, + scoped_refptr<media::VideoFrame>* out); +}; + +template <> +struct StructTraits<arc::mojom::DecoderBufferDataView, arc::DecoderBuffer> { + static mojo::ScopedHandle handle_fd(arc::DecoderBuffer& input) { + return mojo::WrapPlatformHandle( + mojo::PlatformHandle(std::move(input.handle_fd))); + } + + static uint32_t offset(const arc::DecoderBuffer& input) { + return input.offset; + } + + static uint32_t payload_size(const arc::DecoderBuffer& input) { + return input.payload_size; + } + + static bool end_of_stream(const arc::DecoderBuffer& input) { + return input.end_of_stream; + } + + static int64_t timestamp(const arc::DecoderBuffer& input) { + return input.timestamp.InMilliseconds(); + } + + static bool Read(arc::mojom::DecoderBufferDataView data, + arc::DecoderBuffer* out); +}; + } // namespace mojo #endif // COMPONENTS_ARC_MOJOM_VIDEO_ACCELERATOR_MOJOM_TRAITS_H_
diff --git a/components/arc/mojom/video_accelerator_mojom_traits_unittest.cc b/components/arc/mojom/video_accelerator_mojom_traits_unittest.cc index 76c21ca..0ce4fc4 100644 --- a/components/arc/mojom/video_accelerator_mojom_traits_unittest.cc +++ b/components/arc/mojom/video_accelerator_mojom_traits_unittest.cc
@@ -6,7 +6,11 @@ #include <vector> +#include "base/files/file_util.h" +#include "base/stl_util.h" #include "components/arc/mojom/video_common.mojom.h" +#include "components/arc/video_accelerator/arc_video_accelerator_util.h" +#include "components/arc/video_accelerator/decoder_buffer.h" #include "media/base/video_frame_layout.h" #include "media/base/video_types.h" #include "mojo/public/cpp/test_support/test_utils.h" @@ -15,6 +19,7 @@ namespace mojo { namespace { +constexpr int64_t kTimestamp = 1234; constexpr int kWidth = 640; constexpr int kHeight = 480; constexpr media::VideoPixelFormat kFormat = media::PIXEL_FORMAT_I420; @@ -58,4 +63,64 @@ EXPECT_FALSE(output); } +TEST(VideoAcceleratorStructTraitsTest, ConvertVideoFrame) { + // We store id in the first 8 bytes of kMailbox. + gpu::Mailbox kMailbox; + kMailbox.name[0] = 0xff; + kMailbox.name[1] = 0xed; + kMailbox.name[2] = 0xfb; + kMailbox.name[3] = 0xea; + kMailbox.name[4] = 0xf9; + kMailbox.name[5] = 0x7e; + kMailbox.name[6] = 0xe5; + kMailbox.name[7] = 0xe3; + + gpu::MailboxHolder mailbox_holders[media::VideoFrame::kMaxPlanes]; + mailbox_holders[0] = gpu::MailboxHolder(kMailbox, gpu::SyncToken(), 0); + + scoped_refptr<media::VideoFrame> input = + media::VideoFrame::WrapNativeTextures( + kFormat, mailbox_holders, media::VideoFrame::ReleaseMailboxCB(), + kCodedSize, gfx::Rect(kCodedSize), kCodedSize, + base::TimeDelta::FromMilliseconds(kTimestamp)); + scoped_refptr<media::VideoFrame> output; + mojo::test::SerializeAndDeserialize<arc::mojom::VideoFrame>(&input, &output); + + // Verify the fields of input and output frames. + EXPECT_EQ(output->mailbox_holder(0).mailbox, kMailbox); + EXPECT_EQ(output->visible_rect(), input->visible_rect()); + EXPECT_EQ(output->timestamp(), input->timestamp()); +} + +TEST(VideoAcceleratorStructTraitsTest, ConvertNullVideoFrame) { + scoped_refptr<media::VideoFrame> input; + scoped_refptr<media::VideoFrame> output; + mojo::test::SerializeAndDeserialize<arc::mojom::VideoFrame>(&input, &output); + + EXPECT_FALSE(output); +} + +TEST(VideoAcceleratorStructTraitsTest, ConvertDecoderBuffer) { + const std::string kData = "TESTING_STRING"; + const uint32_t kOffset = 3; + const uint32_t kDataSize = kData.size() - kOffset; + constexpr bool kEndOfStream = false; + + arc::DecoderBuffer input(arc::CreateTempFileForTesting(kData), kOffset, + kDataSize, kEndOfStream, + base::TimeDelta::FromMilliseconds(kTimestamp)); + arc::DecoderBuffer output; + mojo::test::SerializeAndDeserialize<arc::mojom::DecoderBuffer>(&input, + &output); + + EXPECT_EQ(output.end_of_stream, input.end_of_stream); + EXPECT_EQ(output.timestamp, input.timestamp); + EXPECT_EQ(output.offset, input.offset); + EXPECT_EQ(output.payload_size, input.payload_size); + + scoped_refptr<media::DecoderBuffer> buf = + std::move(output).ToMediaDecoderBuffer(); + EXPECT_EQ(memcmp(kData.c_str() + kOffset, buf->data(), kDataSize), 0); +} + } // namespace mojo
diff --git a/components/arc/mojom/video_common.mojom b/components/arc/mojom/video_common.mojom index 3ead504..a1cb5ad4 100644 --- a/components/arc/mojom/video_common.mojom +++ b/components/arc/mojom/video_common.mojom
@@ -7,6 +7,8 @@ module arc.mojom; +import "components/arc/mojom/gfx.mojom"; + [Extensible] enum VideoCodecProfile { // The values must match to the values in media::VideoCodecProfile. @@ -120,3 +122,29 @@ uint32 buffer_addr_align; uint64 modifier; }; + +struct VideoFrame { + // Identifier of the buffer. The value of a valid frame should be non-zero. + uint64 id; + Rect visible_rect; + // timestamp in milliseconds. + int64 timestamp; +}; + +// Struct for storing bitstream buffer. +struct DecoderBuffer { + // Field for a physical buffer. This buffer is passed over an interface from + // ARC++ to Chrome, with a callback method that will be run when the buffer is + // used and the file descriptor is closed. + handle handle_fd; + // Distance in bytes between the beginning of the buffer pointed by + // |handle_fd| and the beginning of bitstream buffer. + uint32 offset; + // Bitstream buffer size in bytes. The buffer length referred by |handle_fd| + // can be more than |offset| + |payload_size|. + uint32 payload_size; + // Whether the buffer is an end-of-stream (EOS) buffer. + bool end_of_stream; + // Timestamp in microseconds. + int64 timestamp; +};
diff --git a/components/arc/mojom/video_common.typemap b/components/arc/mojom/video_common.typemap index 6148869..c06a852 100644 --- a/components/arc/mojom/video_common.typemap +++ b/components/arc/mojom/video_common.typemap
@@ -4,15 +4,18 @@ mojom = "//components/arc/mojom/video_common.mojom" public_headers = [ + "//components/arc/video_accelerator/decoder_buffer.h", "//components/arc/video_accelerator/video_frame_plane.h", "//media/base/decode_status.h", "//media/base/video_codecs.h", + "//media/base/video_frame.h", "//media/base/video_frame_layout.h", "//media/base/video_types.h", "//ui/gfx/geometry/size.h", ] public_deps = [ + "//components/arc/video_accelerator:common", "//media", ] @@ -28,10 +31,12 @@ ] type_mappings = [ + "arc.mojom.DecoderBuffer=arc::DecoderBuffer[move_only]", "arc.mojom.DecodeStatus=media::DecodeStatus", "arc.mojom.MediaVideoFramePlane=media::VideoFrameLayout::Plane", "arc.mojom.Size=gfx::Size", "arc.mojom.VideoCodecProfile=media::VideoCodecProfile", + "arc.mojom.VideoFrame=scoped_refptr<media::VideoFrame>[nullable_is_same_type]", # media::VideoFrameLayout doesn't have default constructor, so we cannot # convert directly.
diff --git a/components/arc/video_accelerator/BUILD.gn b/components/arc/video_accelerator/BUILD.gn index 5674e65..80ce9c3 100644 --- a/components/arc/video_accelerator/BUILD.gn +++ b/components/arc/video_accelerator/BUILD.gn
@@ -4,8 +4,6 @@ static_library("video_accelerator") { sources = [ - "arc_video_accelerator_util.cc", - "arc_video_accelerator_util.h", "gpu_arc_video_decode_accelerator.cc", "gpu_arc_video_decode_accelerator.h", "gpu_arc_video_encode_accelerator.cc", @@ -19,8 +17,26 @@ ] deps = [ + ":common", "//components/arc/mojom:media", "//media", "//ui/ozone", ] } + +source_set("common") { + sources = [ + "arc_video_accelerator_util.cc", + "arc_video_accelerator_util.h", + "decoder_buffer.cc", + "decoder_buffer.h", + "video_frame_plane.h", + ] + + deps = [ + "//media", + "//media/gpu:common", + "//mojo/public/cpp/system:system", + "//ui/gfx:memory_buffer", + ] +}
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.cc b/components/arc/video_accelerator/arc_video_accelerator_util.cc index ad5eba9..c0869683 100644 --- a/components/arc/video_accelerator/arc_video_accelerator_util.cc +++ b/components/arc/video_accelerator/arc_video_accelerator_util.cc
@@ -7,6 +7,7 @@ #include <sys/types.h> #include <unistd.h> +#include "base/files/file_util.h" #include "base/files/platform_file.h" #include "base/numerics/checked_math.h" #include "base/numerics/safe_conversions.h" @@ -195,4 +196,22 @@ return gmb_handle; } +base::ScopedFD CreateTempFileForTesting(const std::string& data) { + base::FilePath path; + base::CreateTemporaryFile(&path); + if (base::WriteFile(path, data.c_str(), data.size()) != + base::MakeStrictNum(data.size())) { + VLOGF(1) << "Cannot write the whole data into file."; + return base::ScopedFD(); + } + + base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!file.IsValid()) { + VLOGF(1) << "Failed to create file."; + return base::ScopedFD(); + } + + return base::ScopedFD(file.TakePlatformFile()); +} + } // namespace arc
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.h b/components/arc/video_accelerator/arc_video_accelerator_util.h index cb7fa51..8eada637 100644 --- a/components/arc/video_accelerator/arc_video_accelerator_util.h +++ b/components/arc/video_accelerator/arc_video_accelerator_util.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_ARC_VIDEO_ACCELERATOR_ARC_VIDEO_ACCELERATOR_UTIL_H_ #define COMPONENTS_ARC_VIDEO_ACCELERATOR_ARC_VIDEO_ACCELERATOR_UTIL_H_ +#include <string> #include <vector> #include "base/files/scoped_file.h" @@ -32,5 +33,9 @@ const gfx::Size& coded_size, base::ScopedFD fd, const std::vector<VideoFramePlane>& planes); + +// Create a temp file and write |data| into the file. +base::ScopedFD CreateTempFileForTesting(const std::string& data); + } // namespace arc #endif // COMPONENTS_ARC_VIDEO_ACCELERATOR_ARC_VIDEO_ACCELERATOR_UTIL_H_
diff --git a/components/arc/video_accelerator/decoder_buffer.cc b/components/arc/video_accelerator/decoder_buffer.cc new file mode 100644 index 0000000..e06bd23c --- /dev/null +++ b/components/arc/video_accelerator/decoder_buffer.cc
@@ -0,0 +1,76 @@ +// 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. + +#include "components/arc/video_accelerator/decoder_buffer.h" + +#include "base/logging.h" +#include "base/memory/platform_shared_memory_region.h" +#include "base/memory/read_only_shared_memory_region.h" +#include "base/numerics/checked_math.h" +#include "base/unguessable_token.h" +#include "components/arc/video_accelerator/arc_video_accelerator_util.h" +#include "media/base/decoder_buffer.h" + +namespace arc { + +DecoderBuffer::DecoderBuffer() = default; + +DecoderBuffer::DecoderBuffer(base::ScopedFD handle_fd, + uint32_t offset, + uint32_t payload_size, + bool end_of_stream, + base::TimeDelta timestamp) + : handle_fd(std::move(handle_fd)), + offset(offset), + payload_size(payload_size), + end_of_stream(end_of_stream), + timestamp(timestamp) {} + +DecoderBuffer::DecoderBuffer(DecoderBuffer&& buf) = default; + +DecoderBuffer& DecoderBuffer::operator=(DecoderBuffer&& buf) = default; + +DecoderBuffer::~DecoderBuffer() = default; + +scoped_refptr<media::DecoderBuffer> DecoderBuffer::ToMediaDecoderBuffer() && { + if (end_of_stream) + return media::DecoderBuffer::CreateEOSBuffer(); + + base::CheckedNumeric<off_t> checked_offset(offset); + base::CheckedNumeric<size_t> checked_payload_size(payload_size); + if (!checked_offset.IsValid() || !checked_payload_size.IsValid()) { + VLOG(1) << "Overflow when convert offset and payload size to size_t."; + return nullptr; + } + + size_t required_size; + if (!base::CheckAdd<size_t>(offset, payload_size) + .AssignIfValid(&required_size)) { + VLOG(1) << "Overflow when adding offset and payload size."; + return nullptr; + } + + size_t file_size = 0; + if (!GetFileSize(handle_fd.get(), &file_size) || file_size < required_size) { + VLOG(1) << "File size(" << file_size << ") is smaller than required size(" + << required_size << ")."; + return nullptr; + } + + DCHECK(handle_fd.is_valid()); + auto readonly_region = base::ReadOnlySharedMemoryRegion::Deserialize( + base::subtle::PlatformSharedMemoryRegion::Take( + std::move(handle_fd), + base::subtle::PlatformSharedMemoryRegion::Mode::kReadOnly, file_size, + base::UnguessableToken::Create())); + + scoped_refptr<media::DecoderBuffer> output = + media::DecoderBuffer::FromSharedMemoryRegion( + std::move(readonly_region), checked_offset.ValueOrDie(), + checked_payload_size.ValueOrDie()); + output->set_timestamp(timestamp); + return output; +} + +} // namespace arc
diff --git a/components/arc/video_accelerator/decoder_buffer.h b/components/arc/video_accelerator/decoder_buffer.h new file mode 100644 index 0000000..aed684b --- /dev/null +++ b/components/arc/video_accelerator/decoder_buffer.h
@@ -0,0 +1,46 @@ +// 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. + +#ifndef COMPONENTS_ARC_VIDEO_ACCELERATOR_DECODER_BUFFER_H_ +#define COMPONENTS_ARC_VIDEO_ACCELERATOR_DECODER_BUFFER_H_ + +#include "base/files/scoped_file.h" +#include "base/memory/scoped_refptr.h" +#include "base/time/time.h" + +namespace media { +class DecoderBuffer; +} // namespace media + +namespace arc { + +// Intermediate class in converting from a mojom::DecoderBuffer to +// media::DecoderBuffer. Because media::DecoderBuffer doesn't have a public +// constructor, we cannot convert to media::DecoderBuffer directly by +// StructTraits::Read(). +struct DecoderBuffer { + DecoderBuffer(); + DecoderBuffer(base::ScopedFD handle_fd, + uint32_t offset, + uint32_t payload_size, + bool end_of_stream, + base::TimeDelta timestamp); + ~DecoderBuffer(); + DecoderBuffer(DecoderBuffer&& buf); + DecoderBuffer& operator=(DecoderBuffer&& buf); + + // Convert to media::DecoderBuffer. + scoped_refptr<media::DecoderBuffer> ToMediaDecoderBuffer() &&; + + // See components/arc/mojom/video_common.mojom for descriptions of each field. + base::ScopedFD handle_fd; + uint32_t offset; + uint32_t payload_size; + bool end_of_stream; + base::TimeDelta timestamp; +}; + +} // namespace arc + +#endif // COMPONENTS_ARC_VIDEO_ACCELERATOR_DECODER_BUFFER_H_
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc index 2d4294e..f416570 100644 --- a/components/download/internal/common/download_utils.cc +++ b/components/download/internal/common/download_utils.cc
@@ -41,6 +41,10 @@ // file starting at the offset from the response. const int64_t kInvalidFileWriteOffset = -1; +// Default expiration time of download in days. Canceled and interrupted +// downloads will be deleted after expiration. +const int kDefaultDownloadExpiredTimeInDays = 90; + void AppendExtraHeaders(net::HttpRequestHeaders* headers, DownloadUrlParameters* params) { for (const auto& header : params->request_headers()) @@ -611,4 +615,12 @@ ? result : kDefaultContentValidationLength; } + +base::TimeDelta GetExpiredDownloadDeleteTime() { + int expired_days = base::GetFieldTrialParamByFeatureAsInt( + features::kDeleteExpiredDownloads, kExpiredDownloadDeleteTimeFinchKey, + kDefaultDownloadExpiredTimeInDays); + return base::TimeDelta::FromDays(expired_days); +} + } // namespace download
diff --git a/components/download/public/common/download_features.cc b/components/download/public/common/download_features.cc index c40c501..65fc66ec 100644 --- a/components/download/public/common/download_features.cc +++ b/components/download/public/common/download_features.cc
@@ -55,6 +55,10 @@ const base::Feature kUseParallelRequestsForQUIC{ "UseParallelRequestsForQUIC", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kDeleteExpiredDownloads{"DeleteExpiredDownloads", + base::FEATURE_ENABLED_BY_DEFAULT}; + } // namespace features } // namespace download
diff --git a/components/download/public/common/download_features.h b/components/download/public/common/download_features.h index 0c8bec9..d200114 100644 --- a/components/download/public/common/download_features.h +++ b/components/download/public/common/download_features.h
@@ -53,6 +53,10 @@ // Whether parallel download is used for QUIC connections. COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature kUseParallelRequestsForQUIC; + +// Whether to delete expired download. +COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature kDeleteExpiredDownloads; + } // namespace features } // namespace download
diff --git a/components/download/public/common/download_utils.h b/components/download/public/common/download_utils.h index e2f42b7e..3730631 100644 --- a/components/download/public/common/download_utils.h +++ b/components/download/public/common/download_utils.h
@@ -111,6 +111,13 @@ // Get the number of bytes to validate from finch configuration. int64_t GetDownloadValidationLengthConfig(); +// Finch parameter key value for the time to delete expired downloads in days. +constexpr char kExpiredDownloadDeleteTimeFinchKey[] = + "expired_download_delete_days"; + +// Returns the time to delete expired downloads. +COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetExpiredDownloadDeleteTime(); + } // namespace download #endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_UTILS_H_
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc index b7e59401..a891102 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -209,8 +209,7 @@ provisional_frame_resource_id = 0; } -void MetricsRenderFrameObserver::DidFailProvisionalLoad( - const blink::WebURLError& error) { +void MetricsRenderFrameObserver::DidFailProvisionalLoad() { // Clear the data use tracker for the provisional navigation that started. provisional_frame_resource_data_use_.reset(); }
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h index ac56f4f..76ba329 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -69,7 +69,7 @@ bool from_archive) override; void ReadyToCommitNavigation( blink::WebDocumentLoader* document_loader) override; - void DidFailProvisionalLoad(const blink::WebURLError& error) override; + void DidFailProvisionalLoad() override; void DidCommitProvisionalLoad(bool is_same_document_navigation, ui::PageTransition transition) override; void OnDestruct() override;
diff --git a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc index 92d1925..0b5542a3 100644 --- a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc +++ b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
@@ -19,6 +19,7 @@ #include "ui/base/resource/resource_bundle.h" namespace pdf { + namespace { const PP_PrivateAccessibilityTextRunInfo kFirstTextRun = { @@ -41,6 +42,8 @@ const PP_PrivateAccessibilityTextRunInfo kFourthRunMultiLine = { 6, 12, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)}; +const char kChromiumTestUrl[] = "www.cs.chromium.org"; + void CompareRect(PP_Rect expected_rect, PP_Rect actual_rect) { EXPECT_EQ(expected_rect.point.x, actual_rect.point.x); EXPECT_EQ(expected_rect.point.y, actual_rect.point.y); @@ -217,23 +220,29 @@ } TEST_F(PdfAccessibilityTreeTest, TestPdfAccessibilityTreeCreation) { + static const char kTestAltText[] = "Alternate text for image"; + text_runs_.emplace_back(kFirstTextRun); text_runs_.emplace_back(kSecondTextRun); chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityLinkInfo link; - link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - link.url = "www.cs.chromium.org"; - link.text_run_index = 0; - link.text_run_count = 1; - links_.push_back(std::move(link)); + { + ppapi::PdfAccessibilityLinkInfo link; + link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + link.url = kChromiumTestUrl; + link.text_run_index = 0; + link.text_run_count = 1; + links_.push_back(std::move(link)); + } - ppapi::PdfAccessibilityImageInfo image; - image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - image.alt_text = "Alternate text for image"; - image.text_run_index = 2; - images_.push_back(image); + { + ppapi::PdfAccessibilityImageInfo image; + image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + image.alt_text = kTestAltText; + image.text_run_index = 2; + images_.push_back(std::move(image)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -281,7 +290,7 @@ ui::AXNode* link_node = paragraph_node->children()[0]; ASSERT_TRUE(link_node); - EXPECT_EQ(link.url, + EXPECT_EQ(kChromiumTestUrl, link_node->GetStringAttribute(ax::mojom::StringAttribute::kUrl)); EXPECT_EQ(ax::mojom::Role::kLink, link_node->data().role); ASSERT_EQ(1u, link_node->children().size()); @@ -299,7 +308,7 @@ ui::AXNode* image_node = paragraph_node->children()[1]; ASSERT_TRUE(image_node); EXPECT_EQ(ax::mojom::Role::kImage, image_node->data().role); - EXPECT_EQ(image.alt_text, + EXPECT_EQ(kTestAltText, image_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); } @@ -311,12 +320,14 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityLinkInfo link; - link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - link.url = "www.cs.chromium.org"; - link.text_run_index = 2; - link.text_run_count = 2; - links_.push_back(std::move(link)); + { + ppapi::PdfAccessibilityLinkInfo link; + link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + link.url = kChromiumTestUrl; + link.text_run_index = 2; + link.text_run_count = 2; + links_.push_back(std::move(link)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -390,7 +401,7 @@ ui::AXNode* link_node = paragraph_node->children()[1]; ASSERT_TRUE(link_node); - EXPECT_EQ(link.url, + EXPECT_EQ(kChromiumTestUrl, link_node->GetStringAttribute(ax::mojom::StringAttribute::kUrl)); EXPECT_EQ(ax::mojom::Role::kLink, link_node->data().role); ASSERT_EQ(1u, link_node->children().size()); @@ -459,17 +470,23 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityLinkInfo link; - link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - // Add first link in the vector. - link.text_run_index = 2; - link.text_run_count = 0; - links_.push_back(link); + { + // Add first link in the vector. + ppapi::PdfAccessibilityLinkInfo link; + link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + link.text_run_index = 2; + link.text_run_count = 0; + links_.push_back(std::move(link)); + } - // Add second link in the vector. - link.text_run_index = 0; - link.text_run_count = 1; - links_.push_back(std::move(link)); + { + // Add second link in the vector. + ppapi::PdfAccessibilityLinkInfo link; + link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + link.text_run_index = 0; + link.text_run_count = 1; + links_.push_back(std::move(link)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -499,11 +516,13 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityLinkInfo link; - link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - link.text_run_index = 3; - link.text_run_count = 0; - links_.push_back(std::move(link)); + { + ppapi::PdfAccessibilityLinkInfo link; + link.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + link.text_run_index = 3; + link.text_run_count = 0; + links_.push_back(std::move(link)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -533,15 +552,21 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityImageInfo image; - image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - // Add first image to the vector. - image.text_run_index = 1; - images_.push_back(image); + { + // Add first image to the vector. + ppapi::PdfAccessibilityImageInfo image; + image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + image.text_run_index = 1; + images_.push_back(std::move(image)); + } - // Add second image to the vector. - image.text_run_index = 0; - images_.push_back(image); + { + // Add second image to the vector. + ppapi::PdfAccessibilityImageInfo image; + image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + image.text_run_index = 0; + images_.push_back(std::move(image)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -571,10 +596,12 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityImageInfo image; - image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); - image.text_run_index = 3; - images_.push_back(image); + { + ppapi::PdfAccessibilityImageInfo image; + image.bounds = PP_MakeFloatRectFromXYWH(0.0f, 0.0f, 0.0f, 0.0f); + image.text_run_index = 3; + images_.push_back(std::move(image)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size(); @@ -668,13 +695,15 @@ chars_.insert(chars_.end(), std::begin(kDummyCharsData), std::end(kDummyCharsData)); - ppapi::PdfAccessibilityLinkInfo link; - link.url = "www.cs.chromium.org"; - link.text_run_index = 0; - link.text_run_count = 1; - link.bounds = {{0, 0}, {10, 10}}; - link.index_in_page = 0; - links_.push_back(std::move(link)); + { + ppapi::PdfAccessibilityLinkInfo link; + link.url = kChromiumTestUrl; + link.text_run_index = 0; + link.text_run_count = 1; + link.bounds = {{0, 0}, {10, 10}}; + link.index_in_page = 0; + links_.push_back(std::move(link)); + } page_info_.text_run_count = text_runs_.size(); page_info_.char_count = chars_.size();
diff --git a/components/pdf/renderer/pdf_accessibility_tree_unittest.cc b/components/pdf/renderer/pdf_accessibility_tree_unittest.cc index ccaa9fa..ab71bc96 100644 --- a/components/pdf/renderer/pdf_accessibility_tree_unittest.cc +++ b/components/pdf/renderer/pdf_accessibility_tree_unittest.cc
@@ -4,6 +4,8 @@ #include "components/pdf/renderer/pdf_accessibility_tree.h" +#include <utility> + #include "testing/gtest/include/gtest/gtest.h" namespace pdf { @@ -65,16 +67,21 @@ std::vector<ppapi::PdfAccessibilityLinkInfo> links; std::vector<ppapi::PdfAccessibilityImageInfo> images; - ppapi::PdfAccessibilityLinkInfo link; - // Add first link in the vector. - link.text_run_index = 2; - link.text_run_count = 0; - links.push_back(link); + { + // Add first link in the vector. + ppapi::PdfAccessibilityLinkInfo link; + link.text_run_index = 2; + link.text_run_count = 0; + links.push_back(std::move(link)); + } - // Add second link in the vector. - link.text_run_index = 0; - link.text_run_count = 1; - links.push_back(link); + { + // Add second link in the vector. + ppapi::PdfAccessibilityLinkInfo link; + link.text_run_index = 0; + link.text_run_count = 1; + links.push_back(std::move(link)); + } ASSERT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars, links, images)); @@ -91,10 +98,12 @@ std::vector<ppapi::PdfAccessibilityLinkInfo> links; std::vector<ppapi::PdfAccessibilityImageInfo> images; - ppapi::PdfAccessibilityLinkInfo link; - link.text_run_index = 3; - link.text_run_count = 0; - links.push_back(link); + { + ppapi::PdfAccessibilityLinkInfo link; + link.text_run_index = 3; + link.text_run_count = 0; + links.push_back(std::move(link)); + } ASSERT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars, links, images)); @@ -111,14 +120,19 @@ std::vector<ppapi::PdfAccessibilityLinkInfo> links; std::vector<ppapi::PdfAccessibilityImageInfo> images; - ppapi::PdfAccessibilityImageInfo image; - // Add first image to the vector. - image.text_run_index = 1; - images.push_back(image); + { + // Add first image to the vector. + ppapi::PdfAccessibilityImageInfo image; + image.text_run_index = 1; + images.push_back(std::move(image)); + } - // Add second image to the vector. - image.text_run_index = 0; - images.push_back(image); + { + // Add second image to the vector. + ppapi::PdfAccessibilityImageInfo image; + image.text_run_index = 0; + images.push_back(std::move(image)); + } ASSERT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars, links, images)); @@ -135,12 +149,14 @@ std::vector<ppapi::PdfAccessibilityLinkInfo> links; std::vector<ppapi::PdfAccessibilityImageInfo> images; - ppapi::PdfAccessibilityImageInfo image; - image.text_run_index = 3; - images.push_back(image); + { + ppapi::PdfAccessibilityImageInfo image; + image.text_run_index = 3; + images.push_back(std::move(image)); + } ASSERT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars, links, images)); } -} // namespace pdf \ No newline at end of file +} // namespace pdf
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index caa9b82a..e728aa0 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -93,6 +93,7 @@ Wird diese Richtlinie nicht konfiguriert, können im Cache gespeicherte GPOs für maximal 25 Stunden wiederverwendet werden. Ist die Richtlinie auf 0 gesetzt, so ist die GPO-Speicherung deaktiviert. Dies erhöht die Serverlast, da GPOs bei jedem Richtlinienabruf heruntergeladen werden, auch wenn sie unverändert sind.</translation> +<translation id="1111470455889178048">Nutzeruploads und -downloads zum Scannen senden</translation> <translation id="1117462881884985156">Für die hier angegebenen Hosts umgeht <ph name="PRODUCT_NAME" /> alle Proxys. Diese Richtlinie tritt nur dann in Kraft, wenn Sie bei "Auswählen, wie Proxyserver-Einstellungen angegeben werden" die Option für manuelle Proxyeinstellungen ausgewählt haben und die Richtlinie "<ph name="PROXY_SETTINGS_POLICY_NAME" />" nicht konfiguriert wurde. @@ -397,6 +398,7 @@ sind nicht zulässig.</translation> <translation id="1634989431648355062">Das Plug-in "<ph name="FLASH_PLUGIN_NAME" />" für diese Websites zulassen</translation> <translation id="1645793986494086629">Schema:</translation> +<translation id="1648816843164517573">Liste der Namen, die den HSTS-Richtliniencheck umgehen</translation> <translation id="1653229475925941921">Ist diese Richtlinie konfiguriert, wird damit der Lupentyp bestimmt, der aktiviert ist. Wenn Sie die Richtlinie auf "None" setzen, ist die Lupe deaktiviert. Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. @@ -892,6 +894,7 @@ <translation id="254653220329944566">Cloud-Berichte für <ph name="PRODUCT_NAME" /> aktivieren</translation> <translation id="2548572254685798999">Safe Browsing-Daten erfassen</translation> <translation id="2550593661567988768">Nur Simplexdruck</translation> +<translation id="2551520365302988324">Nutzeruploads zum Scannen senden</translation> <translation id="2552966063069741410">Zeitzone</translation> <translation id="2562339630163277285">Gibt die URL an, die die Suchmaschine für die Bereitstellung von Instant-Ergebnissen verwendet. Die URL sollte den String "<ph name="SEARCH_TERM_MARKER" />" enthalten, der bei der Abfrage durch den Text ersetzt wird, den der Nutzer bisher eingegeben hat. @@ -966,6 +969,7 @@ <translation id="2665422249821137126">Großen Cursor auf der Anmeldeseite aktivieren</translation> <translation id="2672012807430078509">Steuerung, durch die NTLM als Authentifizierungsprotokoll für SMB-Bereitstellungen aktiviert wird</translation> <translation id="267596348720209223">Gibt die vom Suchanbieter unterstützten Zeichencodierungen an. Codierungen sind Codepage-Namen wie UTF-8, GB2312 und ISO-8859-1. Sie werden in der Reihenfolge durchprobiert, in der sie angegeben werden. Diese Richtlinie ist optional. Ist sie nicht konfiguriert, so kommt der Standardwert UTF-8 zum Einsatz. Diese Richtlinie wird nur umgesetzt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation> +<translation id="2679827548357140943">Liste der Domains, für die hochgeladene Inhalte auf Malware geprüft werden müssen</translation> <translation id="268577405881275241">Funktion für Datenkomprimierungs-Proxy aktivieren</translation> <translation id="2693108589792503178">Hiermit wird die URL zur Passwortänderung konfiguriert.</translation> <translation id="2694143893026486692">Angedockte Lupe aktiviert</translation> @@ -1336,6 +1340,10 @@ <translation id="332771718998993005">Hiermit wird der Name von <ph name="PRODUCT_NAME" />-Zielen festgelegt. Wird für diese Richtlinie ein nicht-leerer String definiert, dann wird dieser als Name für das <ph name="PRODUCT_NAME" />-Ziel verwendet. Andernfalls wird der Gerätename als Zielname verwendet. Ist diese Richtlinie nicht definiert, wird der Gerätename als Zielname verwendet und der Geräteeigentümer oder ein Nutzer der Domain, von der das Gerät verwaltet wird, hat die Möglichkeit, den Namen zu ändern. Der Name darf maximal 24 Zeichen enthalten.</translation> +<translation id="3331950121151548952">Liste der Domains, für die hochgeladene Inhalte auf Malware geprüft werden müssen. Diese Richtlinie wird nur verwendet, wenn "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />" auf einen Wert gesetzt ist und Malwareprüfungen für Uploads zugelassen oder erzwungen werden. + + Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, werden hochgeladene Inhalte nicht auf Malware geprüft. + </translation> <translation id="3335468714959531450">Ermöglicht die Erstellung einer Liste mit URL-Mustern, die Websites angeben, denen das Speichern von Cookies gestattet ist. Ist diese Richtlinie nicht konfiguriert, kommt für alle Websites entweder der globale Standardwert der Richtlinie "DefaultCookiesSetting", sofern konfiguriert, oder die persönliche Konfiguration des Nutzers zum Einsatz. @@ -1402,6 +1410,15 @@ Ist die Richtlinie auf "false" gesetzt oder nicht definiert, wird der Start der Sitzung als Ausgangspunkt für Verzögerungen beim Energiesparmodus und Begrenzungen der Sitzungslänge verwendet.</translation> <translation id="3478024346823118645">Nutzerdaten bei Abmeldung löschen</translation> <translation id="3480961938508521469">Lädt den Akku mit normaler Geschwindigkeit vollständig auf.</translation> +<translation id="3483729306380590354">Legt den Akkuladestand (%) für benutzerdefiniertes Starten des Ladevorgangs fest. + + Der Ladevorgang startet, wenn der Ladestand auf den Startwert für benutzerdefiniertes Laden gefallen ist. + + "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" />" muss mindestens fünf Prozentpunkte unter "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />" liegen. + + Diese Richtlinie wird nur verwendet, wenn "<ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" />" auf "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />" gesetzt ist. + + Wenn diese Richtlinie nicht konfiguriert oder festgelegt ist, wird der <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" />-Akkulademodus verwendet.</translation> <translation id="348495353354674884">Bildschirmtastatur aktivieren</translation> <translation id="3487623755010328395"> Wenn diese Richtlinie festgelegt wird, versucht <ph name="PRODUCT_NAME" />, sich selbst zu registrieren und die zugehörige Cloud-Richtlinie für alle Profile anzuwenden. @@ -1835,6 +1852,15 @@ Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. Ist die Richtlinie nicht konfiguriert, ist "Automatisch klicken" anfangs deaktiviert, kann jedoch vom Nutzer jederzeit aktiviert werden.</translation> +<translation id="4215197846797661927">Legt die Tageskonfiguration für den erweiterten Akkulademodus fest. + + Diese Richtlinie wird nur verwendet, wenn "<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />" auf "true" gesetzt ist. + + Ist diese Richtlinie nicht konfiguriert oder nicht eingestellt, dann bleibt der erweiterte Akkulademodus deaktiviert. + + Hinweis: "<ph name="CHARGE_START_TIME_FIELD_NAME" />" muss kleiner sein als "<ph name="CHARGE_END_TIME_FIELD_NAME" />". + + Hinweis: Zulässige Werte für das Feld "<ph name="MINUTE_FIELD_NAME" />" in "<ph name="CHARGE_START_TIME_FIELD_NAME" />" und "<ph name="CHARGE_END_TIME_FIELD_NAME" />" sind 0, 15, 30 und 45.</translation> <translation id="4224610387358583899">Verzögerungen für die Bildschirmsperre</translation> <translation id="423797045246308574">Ermöglicht Ihnen die Erstellung einer Liste mit URL-Mustern, die Websites angeben, denen die Schlüsselgenerierung nicht gestattet ist. Wenn ein URL-Muster in "KeygenAllowedForUrls" angegeben ist, werden die Ausnahmen durch diese Richtlinien überschrieben. @@ -1900,6 +1926,17 @@ Der Richtlinienwert sollte in Millisekunden angegeben werden. Werte müssen kleiner oder gleich dem Wert für die Inaktivitätsverzögerung sein. Die Warnung wird nur eingeblendet, wenn infolge der Inaktivität der Nutzer abgemeldet oder das Gerät heruntergefahren wird.</translation> +<translation id="4342827592971649626">Mit dieser Richtlinie können Sie den Tiefenscan von Nutzerdownloads mit Safe Browsing verwalten. Wenn sie nicht konfiguriert oder auf die Standardeinstellung "Dateien nicht scannen" festgelegt wird, werden Downloads von Nutzern nicht von Safe Browsing gescannt. + + Ist "Scannen von Dateien verbieten" festgelegt, können Nutzer ihre Downloads nicht scannen lassen. Das weicht von der Standardeinstellung ab, bei der bestimmte Nutzer, z. B. Nutzer des erweiterten Sicherheitsprogramms, ihre Downloads scannen lassen können. Mit dieser Einstellung wird auch das verhindert. + + Wenn "Nutzerdownloads zum Scannen senden" festgelegt ist, werden die Downloads von Nutzern zum Scannen auf Malware an Safe Browsing gesendet. + + Wenn "Nutzeruploads zum Scannen senden" festgelegt ist, werden die Uploads von Nutzern zum Scannen auf Malware an Safe Browsing gesendet. + + Wenn "Nutzeruploads und -downloads zum Scannen senden" festgelegt ist, gelten die unter "Nutzeruploads zum Scannen senden" und "Nutzerdownloads zum Scannen senden" beschriebenen Regeln. + + Weitere Informationen dazu, wie die Ergebnisse der Scans Nutzern und Administratoren angezeigt werden, finden Sie in den Richtlinien "<ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" />" und "<ph name="UNSAFE_EVENTS_REPORTING_ENABLED" />".</translation> <translation id="4344356660952451291">Liste der Domains, für die heruntergeladene Inhalte auf Regeleinhaltung geprüft werden müssen</translation> <translation id="4346674324214534449">Hiermit kann festgelegt werden, ob die Werbung auf Websites mit aufdringlichen Werbeanzeigen blockiert wird. @@ -2462,6 +2499,16 @@ Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. Ist die Richtlinie nicht konfiguriert, kann der Nutzer ein Bild auswählen, das als Hintergrund auf dem Desktop und dem Anmeldebildschirm angezeigt wird.</translation> +<translation id="5437214086679373363">Mit dieser Richtlinie wird festgelegt, ob Nutzer passwortgeschützte Dateien hoch- oder herunterladen dürfen, wenn Scans erforderlich sind. Die Beschränkung gilt nur für Dateien, die gemäß den folgenden Richtlinien gescannt werden müssen: "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />", "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" und die Richtlinien, über die die Listen der Domains gesteuert werden, für die Überprüfungen aktiviert sind. + + Ist die Richtlinie auf "Keine" gesetzt, hindert <ph name="PRODUCT_NAME" /> den Nutzer am Upload oder Download passwortgeschützter Dateien. + + Ist sie auf "Download von passwortgeschützten Dateien zulassen" gesetzt, können Nutzer passwortgeschützte Dateien in <ph name="PRODUCT_NAME" /> herunterladen. + + Ist sie auf "Upload von passwortgeschützten Dateien zulassen" gesetzt, können passwortgeschützte Dateien in <ph name="PRODUCT_NAME" /> hochgeladen werden. + + Wenn diese Richtlinie nicht eingerichtet oder auf "Upload und Download zulassen" festgelegt ist, gelten in <ph name="PRODUCT_NAME" /> die unter "Download von passwortgeschützten Dateien zulassen" und "Upload von passwortgeschützten Dateien zulassen" beschriebenen Regeln. + </translation> <translation id="5437733496511628148">Durch Aktivieren dieser Einstellung wird verhindert, dass Webseitenelemente, die nicht von der Domain in der Adressleiste des Browser stammen, Cookies setzen. Wenn die Einstellung deaktiviert wird, dürfen Cookies von Webseitenelementen, die nicht von der Domain in der Adressleiste des Browsers stammen, gesetzt werden. Nutzer können diese Einstellung nicht ändern. @@ -3340,13 +3387,32 @@ Weitere Informationen zur Richtlinie "<ph name="IEEM_SITELIST_POLICY" />" von Internet Explorer: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">URLs, denen ohne Nachfrage Zugriff auf Videoaufnahmegeräte gestattet wird</translation> +<translation id="713712866686796666">Hiermit kann die Tageskonfiguration für das Umschalten bei Leistungsspitzen festgelegt werden. + + Diese Richtlinie wird nur verwendet, wenn "<ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" />" auf "true" gesetzt ist. + + Wenn sie nicht konfiguriert oder festgelegt ist, bleibt das Umschalten bei Leistungsspitzen immer deaktiviert. + + Hinweis: Zulässige Werte für das Feld "<ph name="MINUTE_FIELD_NAME" />" in "<ph name="START_TIME_FIELD_NAME" />", "<ph name="END_TIME_FIELD_NAME" />" und "<ph name="CHARGE_START_TIME_FIELD_NAME" />" sind 0, 15, 30 und 45.</translation> <translation id="7138678301420049075">Sonstiges</translation> +<translation id="7139809614375682935">Legt den Akkuladestand (%) für benutzerdefiniertes Beenden des Ladevorgangs fest. + + Wenn der benutzerdefinierte Endwert für die Akkuaufladung erreicht wird, endet der Ladevorgang. + + "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" />" muss mindestens fünf Prozentpunkte unter "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />" liegen. + + Diese Richtlinie wird nur verwendet, wenn "<ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" />" auf "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />" gesetzt ist. + + Wenn diese Richtlinie nicht konfiguriert oder festgelegt ist, wird der <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" />-Akkulademodus verwendet.</translation> <translation id="7140629953254369759"><ph name="PRODUCT_OS_NAME" /> wird angewiesen, die jeweils angegebene Konfiguration des Aufgabenplaners zu nutzen. Diese Richtlinie kann auf "Konservativ" und auf "Leistung" gesetzt werden. Dadurch wird entweder eine Aufgabenplaner-Konfiguration für optimale Stabilität oder für optimale Leistung ausgewählt. Wenn die Richtlinie nicht festgelegt ist, kann der Nutzer selbst wählen.</translation> <translation id="7145335384492396213">Standardmodus PIN-Druck</translation> +<translation id="7149042336307555519"> Verbindungstypen, die für Betriebssystem-Updates verwendet werden können. Betriebssystem-Updates stellen für Verbindungen aufgrund ihrer Größe eine starke Belastung dar und können zusätzliche Kosten verursachen. Aus diesem Grund sind sie für teure Verbindungstypen (derzeit nur "cellular") standardmäßig nicht aktiviert. + + Die unterstützten Verbindungstypen sind "<ph name="CONNECTION_TYPE_ETHERNET_NAME" />", "<ph name="CONNECTION_TYPE_WIFI_NAME" />" und "<ph name="CONNECTION_TYPE_CELLULAR_NAME" />".</translation> <translation id="7152605873936173525">Über diese Richtlinie wird der Modus des DoH-Resolvers gesteuert. Bei dieser Richtlinie wird nur der Standardmodus auf Anfrageebene festgelegt. Für bestimmte Anfragetypen kann der Modus überschrieben werden, etwa bei Anfragen zum Auflösen des Hostnamens eines DoH-Servers. Durch den Modus "<ph name="SECURE_DNS_MODE_OFF" />" wird DoH (DNS over HTTPS) deaktiviert. @@ -3376,6 +3442,17 @@ Falls die Richtlinie auf "false" gesetzt wird, werden Bildschirm-Wakelock-Anfragen auf den Status von System-Wakelocks zurückgestuft.</translation> <translation id="7177857088692019405">Schnelles Entsperren</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">Hiermit können Sie die Energieverwaltungsrichtlinie zum Umschalten bei Leistungsspitzen aktivieren. + + Das Umschalten bei Leistungsspitzen ist eine Richtlinie, mit der Energie gespart werden kann. Dazu wird die Nutzung des Netzstroms während der Tageszeiten mit Spitzenlasten minimiert. Für jeden Wochentag kann eine Start- und eine Endzeit für den Modus zum Umschalten bei Leistungsspitzen festgelegt werden. Während dieser Zeiträume wird das System über den Akku mit Strom versorgt, solange der Ladezustand des Akkus einen bestimmten Schwellenwert nicht unterschreitet – auch dann, wenn das System an das Stromnetz angeschlossen ist. Nach der angegebenen Endzeit wird das System wieder über Netzstrom versorgt, der Akku jedoch nicht geladen. Das System wird wieder auf den normalen Betrieb mit Netzstrom umgestellt und der Akku aufgeladen, nachdem die festgelegte Startzeit zum Laden erreicht wurde. + + Wenn diese Richtlinie auf "true" gesetzt ist und "<ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" />" und "<ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" />" festgelegt sind, ist das Umschalten bei Leistungsspitzen immer aktiviert, sofern die Funktion vom Gerät unterstützt wird. + + Wenn die Richtlinie auf "false" festgelegt ist, ist das Umschalten bei Leistungsspitzen immer deaktiviert. + + Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. + + Wird die Richtlinie nicht festgelegt, ist das Umschalten bei Leistungsspitzen zuerst deaktiviert und kann vom Nutzer nicht aktiviert werden.</translation> <translation id="718956142899066210">Für Updates zugelassene Verbindungstypen</translation> <translation id="7190286937411178540">Bedienungshilfe "Objekt mit Tastaturfokus hervorheben" aktivieren</translation> <translation id="7194407337890404814">Name der Standardsuchmaschine</translation> @@ -4000,6 +4077,17 @@ Wenn diese Richtlinie nicht konfiguriert ist, wird die Einstellung aktiviert.</translation> <translation id="8382184662529825177">Verwendung von Remote-Bescheinigung (Remote Attestation) zum Schutz von Inhalten für das Gerät aktivieren</translation> +<translation id="8382693763260501307">Hiermit können Sie die Energieverwaltungsrichtlinie für den intelligenten Akkulademodus aktivieren. + + Der intelligente Akkulademodus erlaubt eine Maximierung der Akkulebensdauer. Im intelligenten Akkulademodus verwendet das System außerhalb der Arbeitszeit den Standardladealgorithmus und weitere Verfahren, um die Lebensdauer des Akkus zu maximieren. Während der Arbeitszeit wird dagegen das Schnellladen verwendet. Beim Schnellladen wird der Akku in kürzerer Zeit aufgeladen und steht mit der gesamten Ladekapazität schneller wieder zur Verfügung. Für jeden Tag wird die Zeit, in der das System am intensivsten genutzt wird, durch einen Startzeitpunkt und eine Dauer angegeben. + + Wenn diese Richtlinie auf "true" gesetzt und "<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" />" ebenfalls eingestellt ist, ist der intelligente Akkulademodus immer aktiviert, sofern diese Funktion vom Gerät unterstützt wird. + + Ist die Richtlinie auf "false" gesetzt, dann ist der Modus immer deaktiviert. + + Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. + + Wird die Richtlinie nicht festgelegt, dann ist der intelligente Akkulademodus deaktiviert und kann vom Nutzer nicht aktiviert werden.</translation> <translation id="838870586332499308">Daten-Roaming aktivieren</translation> <translation id="8390049129576938611">Deaktiviert den internen PDF-Viewer in <ph name="PRODUCT_NAME" />. Stattdessen werden PDF-Dateien als Download behandelt und der Nutzer kann sie mit der Standard-Anwendung öffnen. @@ -4186,9 +4274,15 @@ Wenn diese Richtlinie konfiguriert ist, werden diese Apps festgelegt und können von Nutzern nicht geändert werden. Ist diese Richtlinie nicht konfiguriert, können Nutzer die Liste der im Launcher angepinnten Apps ändern.</translation> +<translation id="8779504970846195767">Hiermit wird der Schwellenwert des Akkus für das Umschalten bei Leistungsspitzen (%) festgelegt. + + Diese Richtlinie wird nur verwendet, wenn "<ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" />" auf "true" gesetzt ist. + + Wenn sie nicht konfiguriert oder festgelegt ist, bleibt das Umschalten bei Leistungsspitzen immer deaktiviert.</translation> <translation id="8798099450830957504">Standardeinstellung</translation> <translation id="8800453707696044281">Den Akkuladestand (%) für benutzerdefiniertes Beenden des Ladevorgangs festlegen</translation> <translation id="8801680448782904838">Nutzer benachrichtigen, dass ein Neustart des Browsers oder des Geräts empfohlen wird oder erforderlich ist</translation> +<translation id="8802816494059596691">In dieser Liste aufgeführte Hostnamen sind vom HSTS-Richtliniencheck ausgenommen, der Anfragen von http auf https upgraden kann. Für diese Richtlinie sind nur Single-Label-Hostnamen zulässig. Hostnamen müssen kanonisiert werden: Alle IDNs müssen in ihr A-Label-Format konvertiert und alle ASCII-Buchstaben kleingeschrieben werden. Diese Richtlinie gilt nur für die angegebenen Hostnamen. Sie gilt nicht für Subdomains der angegebenen Namen.</translation> <translation id="8818173863808665831">Meldet den Standort des Geräts. Wenn die Richtlinie nicht oder auf "False" festgelegt wird, wird der Standort nicht gemeldet.</translation> @@ -4350,6 +4444,17 @@ Wenn als Richtlinienwert ein Token festgelegt ist, das mit einem Quick-Fix-Build verknüpft ist, wird das Gerät auf den entsprechenden Build aktualisiert, sofern eine solche Aktualisierung nicht durch eine andere Richtlinie blockiert wird. Falls die Richtlinie nicht konfiguriert oder der Wert nicht mit einem Quick-Fix-Build verknüpft ist, wird das Gerät nicht auf einen Quick-Fix-Build aktualisiert. Wenn auf dem Gerät bereits ein Quick-Fix-Build installiert ist und die Richtlinie nicht mehr konfiguriert oder der Wert nicht mehr mit einem Quick-Fix-Build verknüpft ist, wird das Gerät auf einen regulären Build aktualisiert, sofern die Aktualisierung nicht durch eine andere Richtlinie blockiert wird.</translation> +<translation id="9053158112041032237">Hiermit können Sie die Energieverwaltungsrichtlinie für den Akkulademodus aktivieren. + + Mit dieser Richtlinie können Sie das Aufladen des Akkus dynamisch steuern und auf diese Weise den durch unnötige Belastung entstehenden Akkuverschleiß verringern und die Lebensdauer des Akkus verlängern. + + Wenn der benutzerdefinierte Akkulademodus ausgewählt wird, müssen "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" />" und "<ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />" konfiguriert sein. + + Wenn die Richtlinie konfiguriert ist, wird der Akkulademodus angewendet, sofern er auf dem Gerät unterstützt wird. + + Wird die Richtlinie nicht konfiguriert, obwohl sie auf dem Gerät unterstützt wird, dann wird der Standardmodus für die Akkuaufladung angewendet und kann vom Nutzer nicht geändert werden. + + Hinweis: Sofern konfiguriert, überschreibt "<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />" diese Richtlinie.</translation> <translation id="9054012305936267950">Diese Richtlinie steuert die Anmeldung bei diesem Browser. Sie können damit festlegen, ob sich der Nutzer bei <ph name="PRODUCT_NAME" /> über sein Konto anmelden und zugehörige Dienste nutzen kann, beispielsweise die Chrome-Synchronisierung. Wenn die Richtlinie auf "Browseranmeldung deaktivieren" gesetzt ist, kann der Nutzer sich nicht im Browser anmelden und keine kontobasierten Dienste nutzen. In diesem Fall können Funktionen auf Browserebene wie die Chrome-Synchronisierung nicht verwendet werden und sind auch nicht verfügbar. Falls ein Nutzer angemeldet ist, wenn die Richtlinie auf "Deaktiviert" gesetzt wird, wird er beim nächsten Ausführen von Chrome automatisch abgemeldet. Seine lokalen Profildaten wie Lesezeichen und Passwörter bleiben jedoch erhalten. Der Nutzer kann sich auch weiterhin bei Google-Webdiensten wie Gmail anmelden und diese verwenden.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index aa81312bc..49fad04 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -97,6 +97,7 @@ Si cette règle n'est pas définie, les GPO mis en cache peuvent être réutilisés dans un délai maximal de 25 heures. Si cette règle est définie sur 0, la mise en cache des GPO est désactivée. Notez que cela augmente la charge du serveur, car les GPO sont de nouveau téléchargés à chaque récupération de règle, même s'ils ne sont pas modifiés.</translation> +<translation id="1111470455889178048">Envoyer les importations et les téléchargements des utilisateurs pour analyse</translation> <translation id="1117462881884985156"><ph name="PRODUCT_NAME" /> ignore tout serveur proxy pour la liste d'hôtes spécifiée ici. Cette règle ne prend effet que si vous avez sélectionné les paramètres de proxy manuels dans l'option "Sélectionner le mode de spécification des paramètres de serveur proxy", et si la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> n'a pas été spécifiée. @@ -401,6 +402,7 @@ ne sont pas autorisés.</translation> <translation id="1634989431648355062">Autoriser le plug-in "<ph name="FLASH_PLUGIN_NAME" />" sur ces sites</translation> <translation id="1645793986494086629">Schéma :</translation> +<translation id="1648816843164517573">Liste des noms qui seront exemptés de la vérification de la règle HSTS</translation> <translation id="1653229475925941921">Si cette règle est définie, elle contrôle le type de loupe activé. Définissez la règle sur "None" pour désactiver la loupe. Si vous définissez cette règle, les utilisateurs n'ont pas la possibilité de la modifier ni de l'ignorer. @@ -910,6 +912,7 @@ <translation id="254653220329944566">Active la création de rapports dans le cloud pour <ph name="PRODUCT_NAME" /></translation> <translation id="2548572254685798999">Enregistrer les informations de navigation sécurisée</translation> <translation id="2550593661567988768">Impression recto seulement</translation> +<translation id="2551520365302988324">Envoyer les importations des utilisateurs pour analyse</translation> <translation id="2552966063069741410">Fuseau horaire</translation> <translation id="2562339630163277285">Spécifie l'URL du moteur de recherche utilisé pour fournir des résultats instantanés. Cette URL doit contenir la chaîne <ph name="SEARCH_TERM_MARKER" />, qui sera remplacée lors de la requête par le texte déjà saisi par l'utilisateur. @@ -990,6 +993,7 @@ Cette règle est facultative. Si elle n'est pas configurée, la valeur par défaut UTF-8 est utilisée. Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée.</translation> +<translation id="2679827548357140943">Liste des domaines pour lesquels le contenu importé doit être vérifié afin de détecter d'éventuels logiciels malveillants</translation> <translation id="268577405881275241">Activer la fonctionnalité de proxy pour la compression de données</translation> <translation id="2693108589792503178">Configurez l'URL de modification de mot de passe.</translation> <translation id="2694143893026486692">Loupe ancrée activée</translation> @@ -1368,6 +1372,10 @@ <translation id="332771718998993005">Détermine le nom de la destination <ph name="PRODUCT_NAME" />. Si cette règle est définie sur une chaîne non vide, cette chaîne devient le nom de la destination <ph name="PRODUCT_NAME" />. Sinon, le nom de la destination est le nom de l'appareil. Si cette règle n'est pas définie, le nom de la destination est celui de l'appareil, et le propriétaire de l'appareil (ou un utilisateur du domaine gérant l'appareil) peut le modifier. Le nom est limité à 24 caractères.</translation> +<translation id="3331950121151548952">Liste des domaines pour lesquels le contenu importé doit être vérifié afin de détecter d'éventuels logiciels malveillants. Cette règle n'est utilisée que si la règle <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> est définie sur une valeur autorisant ou imposant la vérification des importations à la recherche d'éventuels logiciels malveillants. + + Si cette règle n'est pas définie ou si elle est configurée, mais qu'aucun domaine n'est indiqué dans la liste, aucun contenu importé n'est vérifié pour déterminer s'il contient ou non un logiciel malveillant. + </translation> <translation id="3335468714959531450">Permet de définir une liste de formats d'URL spécifiant les sites autorisés à utiliser des cookies. Si cette règle n'est pas configurée, la valeur par défaut globale est utilisée pour tous les sites à partir de la règle "DefaultCookiesSetting" si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. @@ -1437,6 +1445,15 @@ Si la règle est définie sur "False" ou si elle n'a pas été configurée, les délais liés à la gestion de l'alimentation et la limite relative à la durée de la session sont activés dès que la session débute.</translation> <translation id="3478024346823118645">Effacer les données utilisateur à la déconnexion</translation> <translation id="3480961938508521469">Recharge complète de la batterie en mode standard.</translation> +<translation id="3483729306380590354">Permet de personnaliser le pourcentage auquel la batterie doit commencer à charger. + + La batterie commence à se charger lorsqu'elle atteint le niveau défini. + + La règle <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> doit être inférieure d'au moins cinq points par rapport à la règle <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />. + + Cette règle n'est utilisée que si la règle <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> est définie sur <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />. + + Si cette règle n'est pas configurée ni définie, le mode <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> de recharge de la batterie est alors appliqué.</translation> <translation id="348495353354674884">Activer le clavier virtuel</translation> <translation id="3487623755010328395"> Si cette règle est activée, <ph name="PRODUCT_NAME" /> tente de s'enregistrer et d'appliquer la règle relative au cloud associée à tous les profils. @@ -1880,6 +1897,15 @@ Si vous configurez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. Si elle n'est pas définie, le clic automatique est désactivé au départ, mais les utilisateurs peuvent l'activer à tout moment.</translation> +<translation id="4215197846797661927">Permet de définir le jour de recharge de la batterie en mode avancé. + + Cette règle n'est utilisée que si la règle <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> est définie sur "True". + + Si cette règle n'est pas configurée ni définie, le mode avancé de recharge de la batterie est toujours désactivé. + + Remarque : La valeur du champ <ph name="CHARGE_START_TIME_FIELD_NAME" /> doit être inférieure à celle du champ <ph name="CHARGE_END_TIME_FIELD_NAME" />. + + Remarque : Les valeurs autorisées dans le champ <ph name="MINUTE_FIELD_NAME" /> de <ph name="CHARGE_START_TIME_FIELD_NAME" /> et <ph name="CHARGE_END_TIME_FIELD_NAME" /> sont 0, 15, 30 et 45.</translation> <translation id="4224610387358583899">Délais de verrouillage de l'écran</translation> <translation id="423797045246308574">Permet de définir une liste de formats d'URL qui déterminent les sites qui ne sont pas autorisés à utiliser la génération de clé. Si la règle "KeygenAllowedForUrls" est appliquée à un format d'URL, elle a priorité sur ces exceptions. @@ -1946,6 +1972,17 @@ La valeur de la règle doit être indiquée en millisecondes. Les valeurs doivent être inférieures ou égales au délai d'inactivité. Le message d'avertissement ne s'affiche que si le dépassement du délai d'inactivité entraîne une déconnexion ou l'arrêt de l'appareil.</translation> +<translation id="4342827592971649626">Cette règle permet de contrôler l'analyse approfondie des téléchargements des utilisateurs à l'aide de la navigation sécurisée. Si cette règle n'est pas configurée ou si elle est définie sur le paramètre par défaut ("Ne pas analyser les fichiers"), les téléchargements des utilisateurs ne sont pas analysés par la navigation sécurisée. + + Si cette règle est définie sur "Interdire l'analyse des fichiers", les utilisateurs ne sont pas autorisés à analyser leurs téléchargements. Ce paramètre est différent de celui par défaut, dans la mesure où certains utilisateurs (comme les utilisateurs de la Protection Avancée) peuvent envoyer leurs téléchargements pour analyse. Avec ce paramètre, ces utilisateurs ne peuvent donc pas analyser leurs fichiers. + + Si cette règle est définie sur "Envoyer les téléchargements des utilisateurs pour analyse", les téléchargements des utilisateurs sont envoyés sur le réseau à la navigation sécurisée afin d'y être analysés pour détecter les éventuels logiciels malveillants. + + Si cette règle est définie sur "Envoyer les importations des utilisateurs pour analyse", les importations des utilisateurs sont envoyés sur le réseau à la navigation sécurisée afin d'y être analysés pour détecter les éventuels logiciels malveillants. + + Si cette règle est définie sur "Envoyer les importations et les téléchargements des utilisateurs pour analyse", le produit se comporte conformément aux règles indiquées sous "Envoyer les importations des utilisateurs pour analyse" et "Envoyer les téléchargements des utilisateurs pour analyse". + + Pour savoir comment les utilisateurs et les administrateurs peuvent consulter les résultats de l'analyse, reportez-vous aux règles <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> et <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" />.</translation> <translation id="4344356660952451291">Liste des domaines pour lesquels le contenu téléchargé doit faire l'objet d'une vérification de conformité</translation> <translation id="4346674324214534449">Vous permet de définir si les annonces doivent être bloquées sur les sites présentant des annonces intrusives. @@ -2533,6 +2570,16 @@ Si vous définissez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. Si la règle n'est pas définie, l'utilisateur peut choisir une image à afficher sur le bureau et en arrière-plan de l'écran de connexion.</translation> +<translation id="5437214086679373363">Permet de déterminer si les utilisateurs sont autorisés ou non à importer ou à télécharger des fichiers protégés par un mot de passe lorsqu'une analyse est requise. Cette restriction ne s'applique qu'aux fichiers nécessitant une analyse comme défini par <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> et par les règles qui régissent la liste des domaines pour lesquels les vérifications sont activées. + + Si cette règle est définie sur "Aucune", <ph name="PRODUCT_NAME" /> empêche l'utilisateur d'importer ou de télécharger des fichiers protégés par un mot de passe. + + Si cette règle est définie sur "Autoriser les téléchargements", <ph name="PRODUCT_NAME" /> autorise l'utilisateur à télécharger des fichiers protégés par un mot de passe. + + Si cette règle est définie sur "Autoriser les importations", <ph name="PRODUCT_NAME" /> autorise l'utilisateur à importer des fichiers protégés par un mot de passe. + + Si cette règle n'est pas configurée ou si elle est définie sur "Autoriser les importations et les téléchargements", <ph name="PRODUCT_NAME" /> se comporte conformément aux règles indiquées sous "Autoriser les téléchargements" et "Autoriser les importations". + </translation> <translation id="5437733496511628148">L'activation de ce paramètre empêche que des cookies soient définis par des éléments de page Web qui ne font pas partie du domaine indiqué dans la barre d'adresse du navigateur. La désactivation de ce paramètre autorise le fait que des cookies soient définis par des éléments de page Web qui ne font pas partie du domaine indiqué dans la barre d'adresse du navigateur, sans que les utilisateurs puissent modifier ce réglage. @@ -3455,13 +3502,32 @@ Pour en savoir plus sur la règle <ph name="IEEM_SITELIST_POLICY" /> d'Internet Explorer, consultez la page https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">URL autorisées à accéder aux appareils de capture vidéo sans avis préalable</translation> +<translation id="713712866686796666">Permet de définir la configuration quotidienne du passage à l'alimentation via la batterie. + + Cette règle n'est utilisée que si la règle <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> est définie sur "True". + + Si cette règle n'est pas configurée ni définie, le passage à l'alimentation via la batterie est désactivé. + + Remarque : Les valeurs autorisées dans le champ <ph name="MINUTE_FIELD_NAME" /> de <ph name="START_TIME_FIELD_NAME" />, <ph name="END_TIME_FIELD_NAME" /> et <ph name="CHARGE_START_TIME_FIELD_NAME" /> sont 0, 15, 30 et 45.</translation> <translation id="7138678301420049075">Autre</translation> +<translation id="7139809614375682935">Permet de personnaliser le pourcentage auquel la charge de la batterie doit s'arrêter. + + Une fois ce pourcentage atteint, la charge s'arrête. + + La règle <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> doit être inférieure d'au moins cinq points par rapport à la règle <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />. + + Cette règle n'est utilisée que si la règle <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> est définie sur <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />. + + Si cette règle n'est pas configurée ni définie, le mode <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> de recharge de la batterie est alors appliqué.</translation> <translation id="7140629953254369759">Contraint <ph name="PRODUCT_OS_NAME" /> à utiliser la configuration du planificateur de tâches identifiée par le nom spécifié. Cette règle dispose des options "prudent" et "performances", vous permettant de sélectionner des configurations de planificateurs de tâches privilégiant, respectivement, la stabilité ou les performances. Si cette règle n'est pas paramétrée, l'utilisateur pourra faire son propre choix.</translation> <translation id="7145335384492396213">Mode d'impression par code défini par défaut</translation> +<translation id="7149042336307555519"> Types de connexion autorisés pour les mises à jour du système d'exploitation. En raison de leur taille, les mises à jour du système d'exploitation peuvent considérablement ralentir la connexion et entraînent parfois des frais supplémentaires. C'est pourquoi elles ne sont pas activées par défaut pour les types de connexion jugés onéreux (actuellement, seul le type de connexion au réseau mobile est concerné). + + Les identifiants des types de connexion reconnus sont <ph name="CONNECTION_TYPE_ETHERNET_NAME" />, <ph name="CONNECTION_TYPE_WIFI_NAME" /> et <ph name="CONNECTION_TYPE_CELLULAR_NAME" />.</translation> <translation id="7152605873936173525">Permet de contrôler le mode du résolveur DNS-over-HTTPS. Veuillez noter que cette règle ne définit que le mode par défaut pour chaque requête. Ce mode peut être ignoré pour les requêtes spéciales, telles que celles visant à résoudre un nom d'hôte de serveur DNS-over-HTTPS. Le mode <ph name="SECURE_DNS_MODE_OFF" /> désactive DNS-over-HTTPS. @@ -3494,6 +3560,17 @@ Si cette règle est définie sur "False", les demandes de wakelocks forçant l'activation de l'écran seront rétrogradées au rang de demandes de wakelocks système.</translation> <translation id="7177857088692019405">Déverrouillage rapide</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">Permet d'activer la règle de gestion de l'alimentation avec passage à l'alimentation via la batterie. + + Le passage à l'alimentation via la batterie est une règle d'économie d'énergie qui réduit au maximum le recours au courant alternatif pendant les pics d'utilisation au cours de la journée. Il est possible de définir une heure de début et de fin de ce mode pour chaque jour de la semaine. À ces périodes, le système fonctionnera sur la batterie, même si l'appareil est branché sur le courant alternatif, tant que le niveau de la batterie reste au-dessus du seuil défini. À la fin de la plage spécifiée, le système fonctionnera sur le courant alternatif s'il y est branché, mais ne rechargera pas la batterie. Le système reprendra son fonctionnement habituel en utilisant le courant alternatif et en rechargeant la batterie à l'heure de début de charge spécifiée. + + Si cette règle est définie sur "True", et si les règles <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" /> et <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" /> sont configurées, le passage à l'alimentation via la batterie est activé s'il est compatible avec l'appareil. + + Si cette règle est définie sur "False", le passage à l'alimentation via la batterie est désactivé. + + Si vous configurez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. + + Si cette règle n'est pas configurée, le passage à l'alimentation via la batterie est désactivé au départ et ne peut être activé par l'utilisateur.</translation> <translation id="718956142899066210">Types de connexion autorisés pour les mises à jour</translation> <translation id="7190286937411178540">Activer la fonctionnalité d'accessibilité de mise en surbrillance au clavier</translation> <translation id="7194407337890404814">Nom du moteur de recherche par défaut</translation> @@ -4134,6 +4211,17 @@ Si cette règle n'est pas configurée, le paramètre est activé.</translation> <translation id="8382184662529825177">Autoriser l'utilisation de l'attestation à distance pour assurer la protection du contenu de l'appareil</translation> +<translation id="8382693763260501307">Permet de gérer l'alimentation en mode avancé de recharge de la batterie. + + Le mode avancé de recharge de la batterie permet à l'utilisateur de maximiser les performances de la batterie. Pour ce faire, le système combine un algorithme de recharge standard avec d'autres techniques en dehors des heures de travail. Pendant les heures de travail, une option de recharge rapide est utilisée. La batterie est alors rechargée plus rapidement, et le niveau de charge complète est atteint plus vite. Pour chaque jour, vous pouvez définir l'heure à partir de laquelle le système est le plus sollicité, ainsi que la durée de cette utilisation intensive. + + Si cette règle est définie sur "True" et si la règle <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" /> est configurée, le mode avancé de recharge de la batterie est toujours activé s'il est compatible avec l'appareil. + + Si cette règle est définie sur "False", ce mode est toujours désactivé. + + Si vous configurez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. + + Si cette règle n'est pas configurée, ce mode est désactivé et ne peut être activé par l'utilisateur.</translation> <translation id="838870586332499308">Activer l'itinérance des données</translation> <translation id="8390049129576938611">Désactive la visionneuse de documents PDF intégrée dans <ph name="PRODUCT_NAME" />. Les fichiers PDF sont alors traités comme des téléchargements que l'utilisateur peut ouvrir avec l'application par défaut. @@ -4332,9 +4420,15 @@ Si cette règle est configurée, le groupe d'applications est figé et ne peut plus être modifié par l'utilisateur. Si cette règle n'est pas définie, l'utilisateur a la possibilité de modifier la liste des applications épinglées dans le Lanceur d'applications.</translation> +<translation id="8779504970846195767">Permet de définir en pourcentage le seuil de passage à l'alimentation via la batterie. + + Cette règle n'est utilisée que si la règle <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> est définie sur "True". + + Si cette règle n'est pas configurée ni définie, le passage à l'alimentation via la batterie est désactivé.</translation> <translation id="8798099450830957504">Par défaut</translation> <translation id="8800453707696044281">Personnaliser le pourcentage auquel la recharge de la batterie doit s'arrêter</translation> <translation id="8801680448782904838">Avertir un utilisateur qu'un redémarrage du navigateur ou de l'appareil est recommandé ou exigé</translation> +<translation id="8802816494059596691">Les noms d'hôte indiqués dans cette liste seront exemptés de la vérification de la règle HSTS susceptible de remplacer les requêtes HTTP en requêtes HTTPS. Seuls les noms d'hôte sans extension sont autorisés dans cette règle. Les noms d'hôtes doivent être mis sous forme canonique : tous les noms de domaine internationalisés (IDN) doivent être convertis dans leur format d'étiquette A, et toutes les lettres ASCII doivent être en minuscules. Cette règle ne s'applique qu'aux noms d'hôte spécifiques indiqués. Elle ne s'applique pas aux sous-domaines des noms spécifiés.</translation> <translation id="8818173863808665831">Permet d'indiquer l'emplacement géographique de l'appareil. Si cette règle n'est pas définie, ou si la valeur "false" lui est attribuée, l'emplacement n'est pas indiqué.</translation> @@ -4498,6 +4592,17 @@ Si la règle est définie sur un jeton qui correspond à un build Quick Fix, l'appareil sera mis à jour avec le build Quick Fix correspondant à condition que la mise à jour ne soit pas bloquée par une autre règle. Si la règle n'est pas définie ou si la valeur ne correspond à aucun build Quick Fix, l'appareil ne sera pas mis à jour avec un tel build. Si l'appareil exécute déjà un build Quick Fix, mais que la règle n'est plus définie ou que sa valeur ne correspond plus à aucun build de ce type, il est mis à jour avec un build normal à condition que la mise à jour ne soit pas bloquée par une autre règle.</translation> +<translation id="9053158112041032237">Permet de gérer l'alimentation suivant le mode de recharge de la batterie. + + La recharge est contrôlée dynamiquement afin de réduire au maximum l'usure de la batterie due aux contraintes et d'allonger sa durée de vie. + + Si le mode personnalisé de recharge est sélectionné, les règles <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> et <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> doivent être définies. + + Si cette règle est définie, le mode de recharge de la batterie est appliqué si l'appareil est compatible. + + Si cette règle n'est pas définie et si elle est compatible avec l'appareil, le mode standard de recharge de la batterie est appliqué et ne peut pas être modifié par l'utilisateur. + + Remarque : <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> remplace cette règle si l'ancienne est définie.</translation> <translation id="9054012305936267950">Cette règle vous permet de gérer la connexion au navigateur et de spécifier si l'utilisateur peut ou non se connecter à <ph name="PRODUCT_NAME" /> avec son compte et utiliser les services associés, comme la synchronisation Chrome. Si la règle est définie sur "Désactiver la connexion au navigateur", l'utilisateur ne peut pas se connecter au navigateur et utiliser les services associés. Dans ce cas, les fonctionnalités qui opèrent au niveau de ce dernier, comme la synchronisation Chrome, ne peuvent pas être utilisées et sont donc indisponibles. Si l'utilisateur était connecté au moment où la règle est passée à l'état "Désactivée", il sera déconnecté la prochaine fois qu'il utilisera Chrome, mais ses données de profil locales (favoris, mots de passe, etc.) seront conservées. Il pourra tout de même se connecter aux services Web Google, comme Gmail, et s'en servir.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 2d54446d..58d4ca2 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -97,6 +97,7 @@ 정책이 설정되지 않으면 캐시된 GPO가 최대 25시간 동안 재사용됩니다. 정책이 0으로 설정되면 GPO 캐싱이 사용 중지됩니다. 이렇게 하면 GPO가 바뀌지 않더라도 정책을 가져올 때마다 GPO가 다시 다운로드되기 때문에 서버 로드가 증가합니다.</translation> +<translation id="1111470455889178048">사용자 업로드 및 다운로드 항목을 전송하여 검사</translation> <translation id="1117462881884985156"><ph name="PRODUCT_NAME" />은 여기에 지정된 호스트 목록에 대해 모든 프록시를 우회합니다. 이 정책은 '프록시 서버 설정을 지정하는 방법 선택'에서 수동 프록시 설정을 선택한 경우 및 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않은 경우에만 적용됩니다. @@ -402,6 +403,7 @@ 와일드 카드 패턴은 허용되지 않습니다.</translation> <translation id="1634989431648355062">이 사이트에서 <ph name="FLASH_PLUGIN_NAME" /> 플러그인 허용</translation> <translation id="1645793986494086629">스키마:</translation> +<translation id="1648816843164517573">HSTS 정책 검사를 우회할 이름 목록입니다.</translation> <translation id="1653229475925941921">이 정책이 설정되어 있으면 사용 설정된 화면 돋보기 유형을 지정합니다. 이 정책을 'None'으로 설정하면 화면 돋보기가 사용 중지됩니다. 이 정책을 설정하면 사용자는 변경하거나 덮어쓸 수 없습니다. @@ -908,6 +910,7 @@ <translation id="254653220329944566"><ph name="PRODUCT_NAME" /> 클라우드 보고 기능 사용</translation> <translation id="2548572254685798999">세이프 브라우징 정보 보고</translation> <translation id="2550593661567988768">단면 인쇄만</translation> +<translation id="2551520365302988324">사용자 업로드 항목을 전송하여 검사</translation> <translation id="2552966063069741410">시간대</translation> <translation id="2562339630163277285">순간 검색결과를 제공하는 데 사용되는 검색엔진의 URL을 지정합니다. URL에는 <ph name="SEARCH_TERM_MARKER" /> 문자열이 포함되어야 하며 이 문자열은 검색 시 사용자가 지금까지 입력한 내용으로 대체됩니다. @@ -988,6 +991,7 @@ 이 정책은 선택사항입니다. 설정하지 않으면 기본값인 UTF-8이 사용됩니다. 이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우에만 적용됩니다.</translation> +<translation id="2679827548357140943">업로드한 콘텐츠에 멀웨어가 있는지 검사해야 하는 도메인 목록입니다.</translation> <translation id="268577405881275241">데이터 압축 프록시 기능 사용</translation> <translation id="2693108589792503178">비밀번호 변경 URL을 설정합니다.</translation> <translation id="2694143893026486692">고정 돋보기 사용 설정됨</translation> @@ -1366,6 +1370,10 @@ <translation id="332771718998993005"><ph name="PRODUCT_NAME" /> 전송 대상으로 알릴 이름을 설정하세요. 이 정책을 비어 있지 않은 문자열로 설정하면 해당 문자열이 <ph name="PRODUCT_NAME" /> 전송 대상의 이름으로 사용됩니다. 반면에 비어 있는 문자열로 설정하면 기기 이름이 전송 대상의 이름으로 사용됩니다. 이 정책을 설정하지 않으면 기기 이름이 전송 대상의 이름으로 사용되며, 기기 소유자(또는 기기를 관리하는 도메인의 사용자)가 이 이름을 변경할 수 있습니다. 이름의 길이는 영문 24자로 제한됩니다.</translation> +<translation id="3331950121151548952">업로드한 콘텐츠에 멀웨어가 있는지 검사해야 하는 도메인 목록입니다. 이 정책은 <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />이(가) 업로드 항목에 멀웨어 검사를 허용하거나 시행하는 값으로 설정된 경우에만 사용됩니다. + + 정책이 설정되지 않거나 빈 도메인 목록으로 설정되면 업로드한 콘텐츠에 멀웨어가 있는지 검사하지 않습니다. + </translation> <translation id="3335468714959531450">쿠키 설정이 허용되는 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. 이 정책을 설정하지 않으면 'DefaultCookiesSetting' 정책(설정된 경우) 또는 사용자 개인 설정의 전체 기본값이 모든 사이트에 사용됩니다 @@ -1435,6 +1443,15 @@ 이 정책이 false로 설정되거나 설정되지 않으면 세션이 시작되자마자 즉시 전원 관리 지연 및 세션 길이 제한이 실행됩니다.</translation> <translation id="3478024346823118645">로그아웃 시 사용자 데이터 삭제</translation> <translation id="3480961938508521469">배터리를 일반 속도로 완전히 충전합니다.</translation> +<translation id="3483729306380590354">배터리 충전을 시작할 지점을 퍼센트로 맞춤설정합니다. + + 배터리가 맞춤설정된 충전 시작 값까지 소모되면 배터리 충전이 시작됩니다. + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" />은(는) <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />보다 최소 5퍼센트 포인트 낮아야 합니다. + + 이 정책은 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" />이(가) <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />(으)로 설정된 경우에만 사용됩니다. + + 정책이 구성 또는 설정되지 않은 경우 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 배터리 충전 모드가 적용됩니다.</translation> <translation id="348495353354674884">가상 키보드 사용</translation> <translation id="3487623755010328395"> 이 정책을 설정하면 <ph name="PRODUCT_NAME" />에서 모든 프로필에 직접 제품을 등록하고 관련 클라우드 정책을 적용하려 합니다. @@ -1883,6 +1900,15 @@ 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. 정책이 설정되지 않은 경우 처음에는 자동 클릭이 사용 중지되어 있으나 사용자가 언제든지 사용하도록 설정할 수 있습니다.</translation> +<translation id="4215197846797661927">고급 배터리 충전 모드의 주간 구성을 설정합니다. + + 이 정책은 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />이(가) True로 설정된 경우에만 사용됩니다. + + 정책이 구성 또는 설정되지 않은 경우 고급 배터리 충전 모드는 항상 사용 중지됩니다. + + 참고: <ph name="CHARGE_START_TIME_FIELD_NAME" />은(는) <ph name="CHARGE_END_TIME_FIELD_NAME" /> 미만이어야 합니다. + + 참고: <ph name="CHARGE_START_TIME_FIELD_NAME" /> 및 <ph name="CHARGE_END_TIME_FIELD_NAME" />의 <ph name="MINUTE_FIELD_NAME" /> 필드에 허용된 값은 0, 15, 30, 45입니다.</translation> <translation id="4224610387358583899">화면 잠금 지연</translation> <translation id="423797045246308574">키 생성 사용이 허용되지 않는 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. URL 패턴이 'KeygenAllowedForUrls'에 있는 경우 이 정책은 이 예외를 무시합니다. @@ -1948,6 +1974,17 @@ 이 정책 값은 밀리초 단위로 지정해야 하며 값은 유휴 지연보다 작거나 같게 고정됩니다. 유휴 작업이 로그아웃 또는 종료인 경우에만 경고 메시지가 표시됩니다.</translation> +<translation id="4342827592971649626">이 정책은 세이프 브라우징을 통한 사용자 다운로드 항목의 심층 검사를 제어합니다. 정책이 설정되지 않거나 기본값인 '파일을 검사하지 않음'으로 설정되면 세이프 브라우징에서 사용자 다운로드 항목을 검사하지 않습니다. + + '파일 검사 금지'로 설정되면 사용자가 다운로드 항목을 검사할 수 없습니다. 이는 일부 사용자(예: 고급 보호 사용자)가 다운로드 항목을 전송하여 검사하도록 허용하는 기본값과는 다릅니다. '파일 검사 금지'로 설정하면 이러한 사용자의 검사도 차단됩니다. + + '사용자 다운로드 항목을 전송하여 검사'로 설정되면 사용자 다운로드 항목이 네트워크를 통해 세이프 브라우징으로 전송되어 멀웨어 검사를 거치게 됩니다. + + '사용자 업로드 항목을 전송하여 검사'로 설정되면 사용자 업로드 항목이 네트워크를 통해 세이프 브라우징으로 전송되어 멀웨어 검사를 거치게 됩니다. + + '사용자 업로드 및 다운로드 항목을 전송하여 검사'로 설정되면 '사용자 업로드 항목을 전송하여 검사' 및 '사용자 다운로드 항목을 전송하여 검사'에서 설명된 규칙에 따라 작동합니다. + + 검사 결과가 사용자와 관리자에게 어떻게 표시되는지 자세히 알아보려면 <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> 및 <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" /> 정책을 참조하세요.</translation> <translation id="4344356660952451291">다운로드한 콘텐츠의 규정 준수를 검사해야 하는 도메인 목록</translation> <translation id="4346674324214534449">방해가 되는 광고가 포함된 사이트에서 광고를 차단할지 설정할 수 있습니다. @@ -2538,6 +2575,16 @@ 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. 이 정책을 설정하지 않으면 사용자가 데스크톱 및 로그인 화면 배경에 표시되는 이미지를 선택할 수 있습니다.</translation> +<translation id="5437214086679373363">검사가 필요한 경우 사용자가 비밀번호로 보호된 파일을 업로드 또는 다운로드하도록 허용할지 여부를 제어합니다. 이 제한은 검사가 사용 설정된 도메인 목록을 제어하는 정책, <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> 및 <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />에서 검사가 필요하다고 결정한 파일에만 적용됩니다. + + 정책이 '없음'으로 설정되면 <ph name="PRODUCT_NAME" />에서 사용자가 비밀번호로 보호된 파일을 업로드하거나 다운로드하지 못하도록 차단합니다. + + 정책이 '다운로드 허용'으로 설정되면 <ph name="PRODUCT_NAME" />에서 사용자가 비밀번호로 보호된 파일을 다운로드하도록 허용합니다. + + 정책이 '업로드 허용'으로 설정되면 <ph name="PRODUCT_NAME" />에서 사용자가 비밀번호로 보호된 파일을 업로드하도록 허용합니다. + + 정책이 설정되지 않거나 '업로드 및 다운로드 허용'으로 설정되면 <ph name="PRODUCT_NAME" />은(는) '다운로드 허용' 및 '업로드 허용'에 설명된 규칙에 따라 작동합니다. + </translation> <translation id="5437733496511628148">이 설정을 사용하면 브라우저의 주소 표시줄에 있는 도메인이 출처가 아닌 웹페이지 요소의 쿠키 설정을 금지합니다. 이 설정을 사용하지 않으면 브라우저의 주소 표시줄에 있는 도메인이 출처가 아닌 웹페이지 요소의 쿠키 설정을 허용하며 사용자가 이 설정을 변경하지 못하게 됩니다. @@ -3464,13 +3511,32 @@ Internet Explorer의 <ph name="IEEM_SITELIST_POLICY" /> 정책은 https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode에서 자세히 살펴보세요.</translation> <translation id="7132877481099023201">별도 메시지를 표시하지 않고 동영상 캡처 기기에 대한 액세스 권한이 부여되는 URL입니다.</translation> +<translation id="713712866686796666">전력 피크 시프트 요일 구성을 설정합니다. + + 이 정책은 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" />이(가) True로 설정된 경우에만 사용됩니다. + + 정책이 구성 또는 설정되지 않은 경우 전력 피크 시프트는 항상 사용 중지되어 있습니다. + + 참고: <ph name="START_TIME_FIELD_NAME" />, <ph name="END_TIME_FIELD_NAME" /> 및 <ph name="CHARGE_START_TIME_FIELD_NAME" />의 <ph name="MINUTE_FIELD_NAME" /> 필드에 허용된 값은 0, 15, 30, 45입니다.</translation> <translation id="7138678301420049075">기타</translation> +<translation id="7139809614375682935">배터리 충전을 중단할 지점을 퍼센트로 맞춤설정합니다. + + 맞춤설정된 배터리 충전 중단 값에 도달하면 배터리 충전이 중지됩니다. + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" />은(는) <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />보다 최소 5퍼센트 포인트 낮아야 합니다. + + 이 정책은 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" />이(가) <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />(으)로 설정된 경우에만 사용됩니다. + + 정책이 구성 또는 설정되지 않은 경우 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 배터리 충전 모드가 적용됩니다.</translation> <translation id="7140629953254369759"><ph name="PRODUCT_OS_NAME" />이(가) 지정된 이름으로 식별된 작업 스케줄러 설정을 사용하도록 지시합니다. 이 정책은 '소극적' 또는 '성능 최적화'로 설정할 수 있습니다. 각각 안정성 또는 최대 성능을 기준으로 작업 스케줄러 설정을 선택하는 옵션입니다. 정책을 설정하지 않으면 사용자가 직접 선택할 수 있습니다.</translation> <translation id="7145335384492396213">기본 PIN 인쇄 모드</translation> +<translation id="7149042336307555519"> OS 업데이트에 사용할 수 있는 연결 유형입니다. OS 업데이트는 용량이 크기 때문에 잠재적으로 연결 네트워크에 부담이 되며 부가 비용이 발생할 수 있습니다. 따라서 비용이 부담스러운 연결 유형은 기본적으로 사용하지 않도록 설정합니다(현재 'cellular'만 해당). + + 인식할 수 있는 연결 유형 식별자는 <ph name="CONNECTION_TYPE_ETHERNET_NAME" />, <ph name="CONNECTION_TYPE_WIFI_NAME" />, <ph name="CONNECTION_TYPE_CELLULAR_NAME" />입니다.</translation> <translation id="7152605873936173525">DNS-over-HTTPS 리졸버의 모드를 제어합니다. 이 정책은 각 쿼리의 기본 모드만 설정합니다. DNS-over-HTTPS 서버 호스트 이름 리졸브 요청과 같은 특별한 유형의 쿼리에서는 모드가 재정의될 수 있습니다. <ph name="SECURE_DNS_MODE_OFF" /> 모드는 DNS-over-HTTPS를 사용 중지합니다. @@ -3503,6 +3569,17 @@ 이 정책이 false로 설정되면 화면 wake lock 요청이 시스템 wake lock 요청으로 강등됩니다.</translation> <translation id="7177857088692019405">빠른 잠금 해제</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">전력 피크 시프트 전원 관리 정책을 사용합니다. + + 피크 시프트는 하루 중 사용량이 최대치에 이를 때 교류 전원 사용을 최소화하는 절전 정책입니다. 매주 평일 전력 피크 시프트 모드를 시작할 시간과 종료할 시간을 설정할 수 있습니다. 이 시간 동안에는 교류 전원이 연결되어 있어도 배터리가 지정된 임계값 이상으로 유지되는 한 시스템이 배터리 전원으로 작동합니다. 지정된 종료 시간이 지나면 교류 전원이 연결되어 있는 경우 시스템이 교류 전원으로 작동하지만 배터리가 충전되지는 않습니다. 지정된 충전 시작 시간이 되면 시스템이 다시 교류 전원을 사용하여 평소대로 작동하며 배터리가 충전됩니다. + + 이 정책이 True로 설정되어 있고 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" />, <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" />이(가) 설정되어 있으면 전력 피크 시프트는 기기가 지원할 경우 항상 사용 설정됩니다. + + 이 정책이 False로 설정된 경우 전력 피크 시프트는 항상 사용 중지됩니다. + + 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. + + 정책이 설정되지 않은 경우 전력 피크 시프트는 처음부터 사용 중지되며 사용자가 활성화할 수 없습니다.</translation> <translation id="718956142899066210">업데이트에 허용되어 있는 연결 유형</translation> <translation id="7190286937411178540">키보드 포커스 강조표시 접근성 기능 사용</translation> <translation id="7194407337890404814">기본 검색 공급자 이름</translation> @@ -4143,6 +4220,17 @@ 이 정책을 설정하지 않은 상태로 두면 설정이 사용됩니다.</translation> <translation id="8382184662529825177">기기의 콘텐츠 보호에 원격 인증을 사용합니다.</translation> +<translation id="8382693763260501307">고급 배터리 충전 모드 전원 관리 정책을 사용합니다. + + 고급 배터리 충전 모드를 사용하면 사용자가 배터리의 상태를 최적화할 수 있습니다. 고급 충전 모드에서 시스템은 근무 시간이 아닐 때 표준 충전 알고리즘 및 기타 기법을 사용해 배터리의 상태를 최적화합니다. 근무 시간 동안에는 급속 충전이 사용됩니다. 급속 충전을 사용하면 배터리가 빠르게 충전되기 때문에 완전히 충전되기까지 걸리는 시간이 짧습니다. 매일 시스템 사용량이 가장 큰 시간대가 시작 시간 및 지속 시간으로 지정됩니다. + + 이 정책이 True로 설정되고 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" />이(가) 설정되면 기기에서 지원되는 경우 고급 배터리 충전 모드가 항상 사용됩니다. + + 이 정책이 False로 설정되면 고급 배터리 충전 모드가 항상 사용 중지됩니다. + + 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. + + 정책이 설정되지 않으면 고급 배터리 충전 모드가 사용 중지되며 사용자가 활성화할 수 없습니다.</translation> <translation id="838870586332499308">데이터 로밍 사용</translation> <translation id="8390049129576938611"><ph name="PRODUCT_NAME" />의 내부 PDF 뷰어를 사용 중지합니다. 대신 이를 다운로드 파일로 처리해 사용자가 기본 애플리케이션으로 PDF 파일을 열 수 있도록 합니다. @@ -4353,9 +4441,15 @@ 이 정책이 구성되면 애플리케이션 집합이 고정되어 사용자가 변경할 수 없습니다. 정책이 설정되지 않으면 사용자가 런처에 고정된 앱 목록을 변경할 수 있습니다.</translation> +<translation id="8779504970846195767">전력 피크 시프트 배터리 임계값을 퍼센트로 설정합니다. + + 이 정책은 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" />이(가) True로 설정된 경우에만 사용됩니다. + + 정책이 구성 또는 설정되지 않은 경우 전력 피크 시프트는 항상 사용 중지되어 있습니다.</translation> <translation id="8798099450830957504">기본값</translation> <translation id="8800453707696044281">배터리 충전을 중단할 지점을 퍼센트로 맞춤설정합니다.</translation> <translation id="8801680448782904838">사용자에게 브라우저 재실행 또는 기기 재시작이 필요하거나 권장된다고 알림</translation> +<translation id="8802816494059596691">이 목록에 지정된 호스트 이름은 http에서 https로 요청을 업그레이드할 가능성이 있는 HSTS 정책 검사에서 제외됩니다. 이 정책에서는 단일 라벨 호스트 이름만 허용됩니다. 호스트 이름은 표준화되어야 합니다. 모든 IDN은 A 라벨 형식으로 표현되어야 하며 모든 ASCII 문자는 소문자여야 합니다. 이 정책은 지정된 호스트 이름에만 적용되며 지정된 이름의 하위 도메인에는 적용되지 않습니다.</translation> <translation id="8818173863808665831">기기의 지리적 위치를 신고합니다. 정책이 설정되지 않았거나 잘못 설정되어 있으면 위치가 신고되지 않습니다.</translation> @@ -4518,6 +4612,17 @@ 정책 값이 빠른 픽스 빌드로 매핑되는 토큰으로 설정된 경우 업데이트가 다른 정책에 의해 차단되지 않으면 기기가 빠른 픽스 빌드로 업데이트됩니다. 이 정책이 설정되지 않았거나 값이 빠른 픽스 빌드로 매핑되지 않는 경우 기기가 빠른 픽스 빌드로 업데이트되지 않습니다. 기기에서 이미 빠른 픽스 빌드가 실행되고 있고 정책이 더 이상 설정되지 않거나 정책 값이 더 이상 빠른 픽스 빌드로 매핑되지 않는 경우 업데이트가 다른 정책에 의해 차단되지 않으면 기기가 일반 빌드로 업데이트됩니다.</translation> +<translation id="9053158112041032237">배터리 충전 모드의 전원 관리 정책을 지정합니다. + + 배터리 충전을 동적으로 제어하여 배터리 스트레스로 인한 배터리 소모를 최소화하고 배터리 수명을 늘립니다. + + 맞춤 배터리 충전 모드가 선택되었다면 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 및 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />이(가) 지정되어야 합니다. + + 이 정책이 설정되면 기기에서 지원되는 경우 배터리 충전 모드가 적용됩니다. + + 이 정책이 기기에서 지원되지만 설정되지 않았다면 표준 배터리 충전 모드가 적용되며 사용자가 변경할 수 없습니다. + + 참고: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />이(가) 지정된 경우 이 정책을 재정의합니다.</translation> <translation id="9054012305936267950">브라우저의 로그인 동작을 제어하는 정책입니다. 이 정책을 사용하면 사용자가 자신의 계정으로 <ph name="PRODUCT_NAME" />에 로그인하고 Chrome 동기화와 같은 계정 관련 서비스를 사용하도록 허용할지 결정할 수 있습니다. 정책을 '브라우저 로그인 사용 중지'로 설정하면 사용자가 브라우저에 로그인하여 계정 기반 서비스를 사용할 수 없습니다. 이 경우 Chrome 동기화와 같은 브라우저 수준의 기능을 사용할 수 없으며, 이러한 기능이 제공되지도 않습니다. 사용자가 로그인되어 있는 상태에서 정책이 '사용 중지'로 설정되면 다음번에 Chrome을 실행할 때 사용자가 로그아웃됩니다. 이때 북마크, 비밀번호 등 사용자의 로컬 프로필 데이터는 삭제되지 않습니다. Gmail과 같은 Google 웹 서비스의 경우 계속해서 로그인하여 사용할 수 있습니다.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 61ef9ce..839ffa8 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2048,7 +2048,7 @@ <translation id="4604931264910482931">Создание черного списка для хостов обмена сообщениями с оригинальными приложениями</translation> <translation id="4617338332148204752">Отменить проверку метатега в <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="4625915093043961294">Настройка белого списка расширений</translation> -<translation id="4632261735235986857">Запретить сканирование файлов</translation> +<translation id="4632261735235986857">Запретить проверку файлов</translation> <translation id="4632343302005518762">Типы содержания, которые <ph name="PRODUCT_FRAME_NAME" /> может обрабатывать</translation> <translation id="4632566332417930481">Запретить использование Инструментов разработчика в отношении расширений, установленных в соответствии с корпоративной политикой, и разрешить во всех остальных случаях</translation> <translation id="4633786464238689684">Использование клавиш верхнего ряда как функциональных @@ -2269,7 +2269,7 @@ <translation id="5148753489738115745">Позволяет задать дополнительные параметры, которые используются при запуске <ph name="PRODUCT_NAME" /> из <ph name="PRODUCT_FRAME_NAME" />. Если это правило не задано, действуют настройки командной строки по умолчанию.</translation> -<translation id="5150323673529584553">Не сканировать файлы</translation> +<translation id="5150323673529584553">Не проверять файлы</translation> <translation id="5152787786897382519">В Chromium и Google Chrome есть группы взаимозависимых правил, которые определяют работу различных функций. Эти группы приведены ниже. Если у правила несколько источников, применяются значения из источника с наивысшим приоритетом, а остальные значения игнорируются. Информация о приоритете правил доступна на странице <ph name="POLICY_PRIORITY_DOC_URL" />.</translation> <translation id="5159469559091666409">Частота отправки сетевых пакетов (в миллисекундах). @@ -4211,7 +4211,7 @@ Если правило не настроено или для него выбрано значение False, браузер можно использовать без входа в <ph name="PRODUCT_NAME" />.</translation> <translation id="858309738002328421">Блокировать загрузку больших файлов</translation> -<translation id="8585558195682146109">Отправлять скачанные файлы на сканирование</translation> +<translation id="8585558195682146109">Отправлять скачанные файлы на проверку</translation> <translation id="8586528890725660268">Определяет принтеры, с которыми не может работать пользователь. Применимо только в том случае, если в правиле <ph name="BULK_PRINTERS_ACCESS_MODE" /> задан параметр <ph name="PRINTERS_BLACKLIST" />.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 47df280..6e1eac75 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -95,6 +95,7 @@ หากไม่ได้ตั้งค่านโยบาย GPO ที่แคชจะนำมาใช้ซ้ำได้สูงสุด 25 ชั่วโมง หากตั้งค่านโยบายเป็น 0 ระบบจะปิดใช้การแคช GPO โปรดทราบว่าการปิดใช้แคชจะเพิ่มการโหลดเซิร์ฟวอร์เนื่องจากต้องดาวน์โหลด GPO ใหม่ทุกครั้งที่เรียกใช้นโยบายแม้ว่านโยบายจะเป็นเวอร์ชันเดิมก็ตาม</translation> +<translation id="1111470455889178048">ส่งไฟล์ที่ผู้ใช้อัปโหลดและดาวน์โหลดไปสแกน</translation> <translation id="1117462881884985156"><ph name="PRODUCT_NAME" /> จะข้ามพร็อกซีสำหรับรายชื่อโฮสต์ที่ระบุไว้ที่นี่ นโยบายนี้จะมีผลในกรณีที่คุณเลือกการตั้งค่าพร็อกซีด้วยตนเองที่ "เลือกวิธีระบุการตั้งค่าพร็อกซีเซิร์ฟเวอร์" และในกรณีที่ไม่มีการระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> @@ -393,6 +394,7 @@ ระบบจะปฏิเสธการเข้าถึงโดยอัตโนมัติ และไม่อนุญาตให้ใช้รูปแบบสัญลักษณ์แทน</translation> <translation id="1634989431648355062">อนุญาตปลั๊กอิน <ph name="FLASH_PLUGIN_NAME" /> ในเว็บไซต์เหล่านี้</translation> <translation id="1645793986494086629">สคีมา</translation> +<translation id="1648816843164517573">รายชื่อที่จะข้ามการตรวจสอบตามนโยบาย HSTS</translation> <translation id="1653229475925941921">หากตั้งค่านโยบายนี้ นโยบายจะควบคุมประเภทของแว่นขยายหน้าจอที่เปิดใช้ การตั้งค่านโยบายเป็น "ไม่มี" จะปิดใช้แว่นขยายหน้าจอ หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะแก้ไขหรือลบล้างนโยบายไม่ได้ @@ -882,6 +884,7 @@ <translation id="254653220329944566">เปิดใช้การรายงานในระบบคลาวด์ของ <ph name="PRODUCT_NAME" /></translation> <translation id="2548572254685798999">รายงานข้อมูล Google Safe Browsing</translation> <translation id="2550593661567988768">การพิมพ์ด้านเดียวเท่านั้น</translation> +<translation id="2551520365302988324">ส่งไฟล์ที่ผู้ใช้อัปโหลดไปสแกน</translation> <translation id="2552966063069741410">เขตเวลา</translation> <translation id="2562339630163277285">ระบุ URL ของเครื่องมือค้นหาที่ใช้ในการให้ผลการค้นหาแบบทันใจ URL ควรมีสตริง <ph name="SEARCH_TERM_MARKER" /> ซึ่งจะถูกแทนที่ด้วยข้อความที่ผู้ใช้ป้อนขณะค้นหา @@ -955,6 +958,7 @@ <translation id="2665422249821137126">เปิดใช้เคอร์เซอร์ขนาดใหญ่ในหน้าจอการเข้าสู่ระบบ</translation> <translation id="2672012807430078509">ควบคุมการเปิดใช้ NTLM เป็นโปรโตคอลการตรวจสอบสิทธิ์สำหรับการต่อเชื่อม SMB</translation> <translation id="267596348720209223">กำหนดการเข้ารหัสตัวอักษรที่สนับสนุนโดยผู้ให้บริการการค้นหา การเข้ารหัสหมายถึงชื่อหน้ารหัสอย่างเช่น UTF-8, GB2312 และ ISO-8859-1 โดยมีการนำมาใช้ตามลำดับที่ให้มา นโยบายนี้เป็นทางเลือก หากไม่ตั้งค่าไว้ จะมีการใช้ค่าเริ่มต้นซึ่งก็คือ UTF-8 นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย "DefaultSearchProviderEnabled" เท่านั้น</translation> +<translation id="2679827548357140943">รายการโดเมนของเนื้อหาที่อัปโหลดซึ่งต้องมีการตรวจหามัลแวร์</translation> <translation id="268577405881275241">เปิดใช้ฟีเจอร์พร็อกซีการบีบอัดข้อมูล</translation> <translation id="2693108589792503178">กำหนดค่า URL การเปลี่ยนรหัสผ่าน</translation> <translation id="2694143893026486692">แว่นขยายหน้าจอบางส่วนเปิดอยู่</translation> @@ -1326,6 +1330,10 @@ <translation id="332771718998993005">กำหนดชื่อที่โฆษณาเป็นปลายทางของ <ph name="PRODUCT_NAME" /> หากตั้งค่านโยบายนี้เป็นสตริงที่ไม่ว่างเปล่า ระบบจะใช้สตริงนั้นเป็นชื่อปลายทางของ <ph name="PRODUCT_NAME" /> มิเช่นนั้นชื่อปลายทางจะเป็นชื่ออุปกรณ์ หากไม่ตั้งค่านโยบายนี้ ชื่อปลายทางจะเป็นชื่ออุปกรณ์ และเจ้าของอุปกรณ์ (หรือผู้ใช้จากโดเมนที่จัดการอุปกรณ์) จะได้รับอนุญาตให้เปลี่ยนชื่อ ชื่อต้องมีความยาวไม่เกิน 24 อักขระ</translation> +<translation id="3331950121151548952">รายการโดเมนของเนื้อหาที่อัปโหลดซึ่งต้องมีการตรวจหามัลแวร์ ระบบจะใช้นโยบายนี้ต่อเมื่อมีการกำหนด <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> เป็นค่าที่อนุญาตหรือบังคับให้มีการตรวจหามัลแวร์ในการอัปโหลด + + หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็นรายการโดเมนที่ว่างเปล่า จะไม่มีการตรวจหามัลแวร์ในเนื้อหาที่อัปโหลด + </translation> <translation id="3335468714959531450">ให้คุณกำหนดรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่ได้รับอนุญาตให้ตั้งค่าคุกกี้ หากไม่มีการตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นทั่วไปสำหรับเว็บไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultCookiesSetting" หากมีการตั้งค่าไว้ หรือจากการกำหนดค่าส่วนบุคคลของผู้ใช้เอง @@ -1395,6 +1403,15 @@ หากนโยบายนี้ได้รับการตั้งค่าเป็นเท็จหรือไม่ได้ตั้งค่า การจัดการพลังงานจะหน่วงเวลาและการจำกัดความยาวเซสชันจะเริ่มทำงานทันทีที่เริ่มเซสชัน</translation> <translation id="3478024346823118645">ล้างข้อมูลผู้ใช้เมื่อออกจากระบบ</translation> <translation id="3480961938508521469">ชาร์จแบตเตอรี่จนเต็มด้วยอัตรามาตรฐาน</translation> +<translation id="3483729306380590354">ตั้งค่าการเริ่มชาร์จแบตเตอรี่ที่กำหนดเองเป็นเปอร์เซ็นต์ + + แบตเตอรี่จะเริ่มชาร์จเมื่อพลังงานลดลงจากค่าการเริ่มชาร์จแบตเตอรี่ที่กำหนดไว้ + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> ต้องอยู่ที่จุดต่ำกว่า <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> อย่างน้อย 5% + + ระบบจะใช้นโยบายนี้เมื่อมีการตั้งค่า <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> เป็น <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" /> เท่านั้น + + หากไม่ได้กำหนดค่านโยบายนี้หรือไม่ได้ตั้งค่า ระบบจะใช้โหมดการชาร์จแบตเตอรี่ <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /></translation> <translation id="348495353354674884">เปิดใช้งานแป้นพิมพ์เสมือน</translation> <translation id="3487623755010328395"> หากตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> จะพยายามลงทะเบียนตนเองและใช้นโยบายระบบคลาวด์ที่เกี่ยวข้องกับโปรไฟล์ทั้งหมด @@ -1824,6 +1841,15 @@ หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ หากไม่มีการตั้งค่านโยบายนี้ ระบบจะปิดฟีเจอร์คลิกอัตโนมัติในขั้นต้น แต่ผู้ใช้เปิดใช้ได้ทุกเมื่อ</translation> +<translation id="4215197846797661927">ตั้งค่ากำหนดวันของโหมดการชาร์จแบตเตอรี่ขั้นสูง + + ระบบจะใช้นโยบายนี้เมื่อมีการตั้งค่า <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> เป็น "จริง" เท่านั้น + + หากไม่ได้กำหนดค่านโยบายนี้หรือไม่ได้ตั้งค่า ระบบจะปิดใช้โหมดการชาร์จแบตเตอรี่ขั้นสูงไว้เสมอ + + หมายเหตุ: <ph name="CHARGE_START_TIME_FIELD_NAME" /> ต้องน้อยกว่า <ph name="CHARGE_END_TIME_FIELD_NAME" /> + + หมายเหตุ: ค่าที่อนุญาตของช่อง<ph name="MINUTE_FIELD_NAME" />ใน <ph name="CHARGE_START_TIME_FIELD_NAME" /> และ <ph name="CHARGE_END_TIME_FIELD_NAME" /> คือ 0, 15, 30, 45</translation> <translation id="4224610387358583899">การหน่วงเวลาในการล็อกหน้าจอ</translation> <translation id="423797045246308574">ช่วยให้คุณกำหนดรายการรูปแบบ URL ที่ระบุเว็บไซต์ที่ไม่ได้รับอนุญาตให้ใช้การสร้างคีย์ หากรูปแบบ URL อยู่ใน "KeygenBlockedForUrls" นโยบายนี้จะลบล้างข้อยกเว้นเหล่านี้ @@ -1889,6 +1915,17 @@ ควรระบุค่าของนโยบายเป็นมิลลิวินาที ค่าจะถูกบีบให้เหลือน้อยกว่าหรือเท่ากับความล่าช้าของการไม่ใช้งาน ข้อความเตือนจะแสดงต่อเมื่อการทำงานสำหรับการไม่ใช้งานคือการออกจากระบบหรือการปิดเครื่อง</translation> +<translation id="4342827592971649626">นโยบายนี้ควบคุมการสแกนไฟล์ที่ผู้ใช้ดาวน์โหลดอย่างละเอียดด้วย Google Safe Browsing หากไม่ได้ตั้งค่า หรือตั้งเป็นค่าเริ่มต้น "ไม่ต้องสแกนไฟล์" Google Safe Browsing จะไม่สแกนไฟล์ที่ผู้ใช้ดาวน์โหลด + + หากตั้งค่าเป็น "ห้ามสแกนไฟล์" ผู้ใช้จะไม่ได้รับอนุญาตให้สแกนไฟล์ที่ดาวน์โหลด ซึ่งแตกต่างจากค่าเริ่มต้น เพราะผู้ใช้บางราย (เช่น ผู้ใช้ที่ใช้การปกป้องขั้นสูง) จะส่งไฟล์ที่ดาวน์โหลดให้สแกนได้ การตั้งค่านี้จะป้องกันไม่ให้ผู้ใช้เหล่านี้ทำการสแกน + + หากตั้งค่าเป็น "ส่งไฟล์ที่ผู้ใช้ดาวน์โหลดไปสแกน" ระบบจะส่งไฟล์ที่ผู้ใช้ดาวน์โหลดผ่านเครือข่ายไปยัง Google Safe Browsing เพื่อสแกนหามัลแวร์ + + หากตั้งค่าเป็น "ส่งไฟล์ที่ผู้ใช้อัปโหลดไปสแกน" ระบบจะส่งไฟล์ที่ผู้ใช้อัปโหลดผ่านเครือข่ายไปยัง Google Safe Browsing เพื่อสแกนหามัลแวร์ + + หากตั้งค่าเป็น "ส่งไฟล์ที่ผู้ใช้อัปโหลดและดาวน์โหลดไปสแกน" ก็จะทำงานตามกฎที่อธิบายไว้ในตัวเลือก "ส่งไฟล์ที่ผู้ใช้อัปโหลดไปสแกน" และ "ส่งไฟล์ที่ผู้ใช้ดาวน์โหลดไปสแกน" + + ดูรายละเอียดเกี่ยวกับการแสดงผลการสแกนแก่ผู้ใช้และผู้ดูแลระบบได้จากนโยบาย <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> และ <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" /></translation> <translation id="4344356660952451291">รายการโดเมนที่ต้องตรวจสอบการปฏิบัติตามข้อกำหนดของเนื้อหาที่ดาวน์โหลด</translation> <translation id="4346674324214534449">อนุญาตให้คุณตั้งค่าได้ว่าจะบล็อกโฆษณาในเว็บไซต์ที่มีโฆษณาที่แทรกหรือไม่ @@ -2447,6 +2484,16 @@ หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ หากไม่ได้ตั้งค่านโยบาย ผู้ใช้จะเลือกรูปภาพที่จะให้ปรากฏในเดสก์ท็อปและในพื้นหลังของหน้าจอเข้าสู่ระบบได้</translation> +<translation id="5437214086679373363">ควบคุมว่าจะอนุญาตให้ผู้ใช้อัปโหลดหรือดาวน์โหลดไฟล์ที่ป้องกันด้วยรหัสผ่านหรือไม่เมื่อต้องมีการสแกน การจำกัดนี้ใช้เฉพาะกับไฟล์ที่ต้องมีการสแกนตามที่กำหนดโดย <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> และนโยบายต่างๆ ที่ควบคุมรายการโดเมนที่เปิดใช้การตรวจสอบ + + หากตั้งค่านโยบายนี้เป็น "ไม่มี" <ph name="PRODUCT_NAME" /> จะบล็อกผู้ใช้ไม่ให้อัปโหลดหรือดาวน์โหลดไฟล์ที่ป้องกันด้วยรหัสผ่าน + + หากตั้งค่านโยบายนี้เป็น "อนุญาตการดาวน์โหลด" <ph name="PRODUCT_NAME" /> จะอนุญาตให้ผู้ใช้ดาวน์โหลดไฟล์ที่ป้องกันด้วยรหัสผ่าน + + หากตั้งค่านโยบายนี้เป็น "อนุญาตการอัปโหลด" <ph name="PRODUCT_NAME" /> จะอนุญาตให้ผู้ใช้อัปโหลดไฟล์ที่ป้องกันด้วยรหัสผ่าน + + หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็น "อนุญาตการอัปโหลดและดาวน์โหลด" <ph name="PRODUCT_NAME" /> จะทำงานตามกฎที่อธิบายไว้ในตัวเลือก "อนุญาตการดาวน์โหลด" และ "อนุญาตการอัปโหลด" + </translation> <translation id="5437733496511628148">การเปิดใช้การตั้งค่านี้จะป้องกันไม่ให้มีการตั้งค่าคุกกี้โดยองค์ประกอบของหน้าเว็บที่ไม่ได้มาจากโดเมนที่อยู่ในแถบที่อยู่ของเบราว์เซอร์ การปิดใช้การตั้งค่านี้จะอนุญาตให้มีการตั้งค่าคุกกี้โดยองค์ประกอบของหน้าเว็บที่ไม่ได้มาจากโดเมนที่อยู่ในแถบที่อยู่ของเบราว์เซอร์ และป้องกันไม่ให้ผู้ใช้เปลี่ยนแปลงการตั้งค่านี้ @@ -3338,13 +3385,32 @@ ดูข้อมูลเพิ่มเติมเกี่ยวกับนโยบาย <ph name="IEEM_SITELIST_POLICY" /> ของ Internet Explorer ได้ที่ https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">URL ที่จะได้รับสิทธิ์การเข้าถึงอุปกรณ์จับภาพวิดีโอโดยไม่ต้องแจ้ง</translation> +<translation id="713712866686796666">กำหนดค่าวันที่เปิดใช้พาวเวอร์พีคชิฟต์ + + ระบบจะใช้นโยบายนี้เมื่อมีการตั้งค่า <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> เป็น "จริง" เท่านั้น + + หากไม่กำหนดค่านโยบายนี้หรือไม่ได้ตั้งค่า พาวเวอร์พีคชิฟต์จะปิดใช้เสมอ + + หมายเหตุ: ค่าที่อนุญาตของช่อง<ph name="MINUTE_FIELD_NAME" />ใน <ph name="START_TIME_FIELD_NAME" />, <ph name="END_TIME_FIELD_NAME" /> และ <ph name="CHARGE_START_TIME_FIELD_NAME" /> คือ 0, 15, 30, 45</translation> <translation id="7138678301420049075">อื่นๆ</translation> +<translation id="7139809614375682935">ตั้งค่าการหยุดชาร์จแบตเตอรี่ที่กำหนดเองเป็นเปอร์เซ็นต์ + + แบตเตอรี่จะหยุดชาร์จเมื่อถึงค่าการหยุดชาร์จแบตเตอรี่ที่กำหนดเอง + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> ต้องอยู่ที่จุดต่ำกว่า <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> อย่างน้อย 5% + + ระบบจะใช้นโยบายนี้เมื่อมีการตั้งค่า <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> เป็น <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" /> เท่านั้น + + หากไม่ได้กำหนดค่านโยบายนี้หรือไม่ได้ตั้งค่า ระบบจะใช้โหมดการชาร์จแบตเตอรี่ <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /></translation> <translation id="7140629953254369759">สั่งให้ <ph name="PRODUCT_OS_NAME" /> ใช้การกำหนดค่าเครื่องจัดตารางเวลางานที่ระบุโดยชื่อที่เจาะจง นโยบายนี้ตั้งค่าได้เป็น "ระมัดระวัง" และ "ประสิทธิภาพ" ซึ่งจะเลือกการกำหนดค่าเครื่องจัดตารางเวลางานที่ปรับแต่งเพื่อความเสถียรและประสิทธิภาพสูงสุดตามลำดับ หากไม่ได้ตั้งค่านโยบาย ผู้ใช้จะเลือกโหมดเองได้</translation> <translation id="7145335384492396213">โหมดการพิมพ์ด้วย PIN ที่เป็นค่าเริ่มต้น</translation> +<translation id="7149042336307555519"> ประเภทการเชื่อมต่อที่อนุญาตให้ใช้สำหรับการอัปเดตระบบปฏิบัติการ การอัปเดตระบบปฏิบัติการอาจทำให้การเชื่อมต่อทำงานหนักมากเนื่องจากขนาดของการอัปเดต และอาจทำให้มีค่าใช้จ่ายเพิ่มเติม ดังนั้น โดยค่าเริ่มต้นจึงไม่มีการเปิดใช้การอัปเดตกับประเภทการเชื่อมต่อที่ถือว่ามีค่าใช้จ่ายสูง (ปัจจุบันมีเพียง "เน็ตมือถือ") + + ตัวระบุประเภทการเชื่อมต่อที่รู้จัก ได้แก่ <ph name="CONNECTION_TYPE_ETHERNET_NAME" /> <ph name="CONNECTION_TYPE_WIFI_NAME" /> และ <ph name="CONNECTION_TYPE_CELLULAR_NAME" /></translation> <translation id="7152605873936173525">ควบคุมโหมดของรีโซลเวอร์ DNS-over-HTTPS โปรดทราบว่านโยบายนี้จะตั้งค่าโหมดเริ่มต้นสำหรับการค้นหาแต่ละรายการเท่านั้น อาจมีการลบล้างโหมดได้สำหรับประเภทการค้นหาพิเศษ เช่น คำขอแก้ไขชื่อโฮสต์ของเซิร์ฟเวอร์ DNS-over-HTTPS โหมด <ph name="SECURE_DNS_MODE_OFF" /> จะปิดใช้โหมด DNS-over-HTTPS @@ -3376,6 +3442,17 @@ หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะลดระดับคำขอการทำงานขณะล็อกหน้าจอเป็นคำขอการทำงานขณะล็อกระบบ</translation> <translation id="7177857088692019405">ปลดล็อกด่วน</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">เปิดใช้นโยบายการจัดการพลังงานด้วยพาวเวอร์พีคชิฟต์ + + พีคชิฟต์คือนโยบายการประหยัดพลังงานที่ลดการใช้ไฟฟ้ากระแสสลับในช่วงที่มีการใช้งานสูงสุดระหว่างวัน คุณกำหนดเวลาเริ่มเปิดและปิดใช้โหมดพาวเวอร์พีคชิฟต์ในแต่ละวันได้ ในช่วงเวลาดังกล่าว ระบบจะทำงานโดยใช้พลังงานจากแบตเตอรี่แม้ว่าจะยังมีไฟฟ้ากระแสสลับอยู่ ตราบใดที่ระดับแบตเตอรี่อยู่เหนือเกณฑ์ที่ระบุ หลังเวลาสิ้นสุดที่ระบุ ระบบจะทำงานโดยใช้พลังงานจากไฟฟ้ากระแสสลับหากมีอยู่ แต่จะไม่ชาร์จแบตเตอรี่ แล้วจะกลับมาทำงานตามปกติอีกครั้งโดยใช้ไฟฟ้ากระแสสลับและชาร์จแบตเตอรี่ใหม่หลังจากเวลาเริ่มต้นการชาร์จที่ระบุ + + หากตั้งค่านโยบายนี้เป็น "จริง" และตั้งค่า <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" />, <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" /> ไว้ พาวเวอร์พีคชิฟต์จะเปิดใช้อยู่เสมอหากอุปกรณ์รองรับ + + หากตั้งค่านโยบายนี้เป็น "เท็จ" พาวเวอร์พีคชิฟต์จะปิดใช้อยู่เสมอ + + หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ พาวเวอร์พีคชิฟต์จะปิดใช้ในขั้นต้นและผู้ใช้จะเปิดใช้ไม่ได้</translation> <translation id="718956142899066210">ประเภทการเชื่อมต่อที่อนุญาตสำหรับการอัปเดต</translation> <translation id="7190286937411178540">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการไฮไลต์โฟกัสของแป้นพิมพ์</translation> <translation id="7194407337890404814">ชื่อผู้ให้บริการการค้นหาเริ่มต้น</translation> @@ -4007,6 +4084,17 @@ หากไม่กำหนดค่านโยบายนี้ ระบบจะเปิดใช้การตั้งค่า</translation> <translation id="8382184662529825177">เปิดใช้การใช้งานการรับรองระยะไกลสำหรับการปกป้องเนื้อหาสำหรับอุปกรณ์</translation> +<translation id="8382693763260501307">เปิดใช้นโยบายการจัดการพลังงานของโหมดการชาร์จแบตเตอรี่ขั้นสูง + + โหมดการชาร์จแบตเตอรี่ขั้นสูงช่วยให้ผู้ใช้เพิ่มประสิทธิภาพแบตเตอรี่ได้สูงสุด ในโหมดการชาร์จขั้นสูง ระบบจะใช้อัลกอริทึมการชาร์จมาตรฐานและเทคนิคอื่นๆ ในช่วงที่ไม่มีการทำงานเพื่อเพิ่มประสิทธิภาพแบตเตอรี่สูงสุด ในช่วงที่มีการทำงาน ระบบจะใช้การชาร์จด่วน การชาร์จด่วนนี้ช่วยให้ชาร์จแบตเตอรี่ได้เร็วขึ้น แบตเตอรี่จึงชาร์จเต็มเร็วขึ้น เวลาที่จะมีการใช้งานระบบมากที่สุดในแต่ละวันจะระบุโดยเวลาเริ่มต้นและระยะเวลา + + หากตั้งค่านโยบายนี้เป็น "จริง" และมีการตั้งค่า <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" /> ระบบจะเปิดใช้โหมดการชาร์จแบตเตอรี่ขั้นสูงไว้เสมอหากอุปกรณ์รองรับ + + หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะปิดใช้โหมดการชาร์จแบตเตอรี่ขั้นสูงไว้เสมอ + + หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้โหมดการชาร์จแบตเตอรี่ขั้นสูงและผู้ใช้จะเปิดใช้โหมดนี้ไม่ได้</translation> <translation id="838870586332499308">เปิดใช้งานการโรมมิ่งข้อมูล</translation> <translation id="8390049129576938611">ปิดใช้โปรแกรมดู PDF ภายใน <ph name="PRODUCT_NAME" /> โดยจะปฏิบัติต่อไฟล์ PDF เป็นไฟล์ที่ดาวน์โหลดแทนและอนุญาตให้ผู้ใช้เปิดไฟล์ PDF ด้วยแอปพลิเคชันเริ่มต้น @@ -4208,9 +4296,15 @@ หากกำหนดค่านโยบายนี้ ชุดแอปพลิเคชันจะตายตัวและผู้ใช้จะทำการเปลี่ยนแปลงไม่ได้ หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนแปลงรายการแอปที่ตรึงไว้ใน Launcher ได้</translation> +<translation id="8779504970846195767">กำหนดเกณฑ์ระดับแบตเตอรี่สำหรับโหมดพาวเวอร์พีคชิฟต์เป็นเปอร์เซ็นต์ + + ระบบจะใช้นโยบายนี้เมื่อมีการตั้งค่า <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> เป็น "จริง" เท่านั้น + + หากไม่กำหนดค่านโยบายนี้หรือไม่ได้ตั้งค่า พาวเวอร์พีคชิฟต์จะปิดใช้เสมอ</translation> <translation id="8798099450830957504">ค่าเริ่มต้น</translation> <translation id="8800453707696044281">ตั้งค่าการหยุดชาร์จแบตเตอรี่ที่กำหนดเองเป็นเปอร์เซ็นต์</translation> <translation id="8801680448782904838">แจ้งผู้ใช้ว่าควรหรือจำเป็นต้องเปิดเบราว์เซอร์ขึ้นมาใหม่หรือรีสตาร์ทอุปกรณ์</translation> +<translation id="8802816494059596691">ชื่อโฮสต์ที่ระบุไว้ในรายการนี้จะได้รับการยกเว้นไม่ต้องรับการตรวจสอบตามนโยบาย HSTS ที่อาจอัปเกรดคำขอจาก HTTP เป็น HTTPS นโยบายนี้อนุญาตเฉพาะชื่อโฮสต์ที่ติดป้ายกำกับเดียวเท่านั้น ชื่อโฮสต์ต้องกำหนดเป็น Canonical ซึ่งหมายความว่าต้องแปลง IDN ทั้งหมดเป็นรูปแบบ A-label และตัวอักษร ASCII ทั้งหมดต้องเป็นตัวพิมพ์เล็ก นโยบายนี้มีผลเฉพาะกับชื่อโฮสต์ที่ระบุไว้บางรายการเท่านั้น ไม่ใช่กับโดเมนย่อยของชื่อที่ระบุ</translation> <translation id="8818173863808665831">รายงานตำแหน่งทางภูมิศาสตร์ของอุปกรณ์ หากไม่ได้ตั้งค่านโยบายนี้เอาไว้ หรือตั้งค่าเป็นเท็จ ตำแหน่งจะไม่ถูกรายงาน</translation> @@ -4372,6 +4466,17 @@ หากกำหนดค่านโยบายเป็นโทเค็นที่แมปไปยังบิวด์ Quick Fix อุปกรณ์จะได้รับการอัปเดตเป็นบิวด์ Quick Fix ที่เกี่ยวข้องหากการอัปเดตไม่ได้ถูกบล็อกโดยนโยบายอื่น หากไม่ได้ตั้งค่านโยบายหรือหากค่าของนโยบายไม่ได้แมปไปยังบิวด์ Quick Fix อุปกรณ์ก็จะไม่อัปเดตเป็นบิวด์ Quick Fix หากอุปกรณ์ใช้บิวด์ Quick Fix อยู่แล้วและไม่ได้มีการตั้งค่านโยบายอีกต่อไป หรือค่าของนโยบายไม่ได้แมปไปยังบิวด์ Quick Fix อีกต่อไป อุปกรณ์จะอัปเดตเป็นบิวด์ปกติหากการอัปเดตไม่ได้ถูกบล็อกโดยนโยบายอื่น</translation> +<translation id="9053158112041032237">ระบุนโยบายการจัดการพลังงานของโหมดการชาร์จแบตเตอรี่ + + ควบคุมการชาร์จแบตเตอรี่แบบไดนามิกเพื่อลดการเสื่อมของแบตเตอรี่เนื่องจากการใช้แบตเตอรี่มากเกินไปและยืดอายุการใช้งานแบตเตอรี่ + + หากเลือกโหมดการชาร์จแบตเตอรี่ที่กำหนดเอง คุณจะต้องระบุ <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> และ <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> + + หากตั้งค่านโยบายนี้ ระบบจะใช้โหมดการชาร์จแบตเตอรี่หากอุปกรณ์รองรับ + + หากไม่ได้ตั้งค่านโยบายนี้แต่อุปกรณ์รองรับนโยบาย ระบบจะใช้โหมดการชาร์จแบตเตอรี่มาตรฐานและผู้ใช้จะเปลี่ยนแปลงไม่ได้ + + หมายเหตุ: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> จะลบล้างนโยบายนี้หากระบุนโยบายเดิมไว้</translation> <translation id="9054012305936267950">นโยบายนี้ควบคุมลักษณะการทำงานในการลงชื่อเข้าใช้ของเบราว์เซอร์ โดยให้คุณระบุว่าผู้ใช้จะลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /> ด้วยบัญชีของตนและใช้บริการที่เกี่ยวข้องกับบัญชี เช่น การซิงค์ของ Chrome ได้หรือไม่ หากตั้งค่านโยบายเป็น "ปิดใช้การลงชื่อเข้าใช้เบราว์เซอร์" ผู้ใช้จะลงชื่อเข้าใช้เบราว์เซอร์และใช้บริการที่เกี่ยวข้องกับบัญชีไม่ได้ ในกรณีนี้ฟีเจอร์ระดับเบราว์เซอร์อย่างเช่น การซิงค์ของ Chrome จะใช้งานไม่ได้และไม่มีให้ใช้งาน หากผู้ใช้ลงชื่อเข้าใช้และนโยบายนี้ตั้งค่าเป็น "ปิดใช้" ผู้ใช้จะต้องออกจากระบบในครั้งถัดไปที่เรียกใช้ Chrome แต่ข้อมูลโปรไฟล์ในเครื่องของผู้ใช้ เช่น บุ๊กมาร์ก รหัสผ่าน ฯลฯ จะยังคงอยู่ ผู้ใช้จะยังคงลงชื่อเข้าใช้และใช้บริการเว็บของ Google เช่น Gmail ได้ต่อไป
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index e97122c..09c701f 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -84,6 +84,7 @@ 如果此政策未设置,已缓存的 GPO 最多可被重复使用 25 小时。 如果此政策设为 0,系统就会关闭 GPO 缓存。请注意,这样设置会增加服务器负载,因为系统在每次提取政策时都要重新下载 GPO(即使版本未变也是如此)。</translation> +<translation id="1111470455889178048">发送用户上传内容和下载内容进行扫描</translation> <translation id="1117462881884985156"><ph name="PRODUCT_NAME" /> 会绕过在此处指定的主机列表中的任何代理。 只有当您在“选择如何指定代理服务器设置”中选择了手动代理设置且未指定 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策时,该政策才会生效。 @@ -367,6 +368,7 @@ <translation id="163200210584085447">系统会将此列表中的网址格式与请求网址的安全来源进行比对。如果找到了匹配项,系统将允许相应网址通过 SAML 登录页面访问视频捕获设备。如果未找到匹配项,系统将自动拒绝授予访问权限。不允许使用通配符模式。</translation> <translation id="1634989431648355062">允许这些网站运行 <ph name="FLASH_PLUGIN_NAME" /> 插件</translation> <translation id="1645793986494086629">架构:</translation> +<translation id="1648816843164517573">以列表形式指定:哪些名称将绕过 HSTS 政策检查</translation> <translation id="1653229475925941921">如果设置了此政策,则会控制启用的放大镜类型。如果将此政策设为“None”,则会停用放大镜。 如果您设置了此政策,用户将无法对其进行更改或替换。 @@ -843,6 +845,7 @@ <translation id="254653220329944566">启用 <ph name="PRODUCT_NAME" /> 云端报告</translation> <translation id="2548572254685798999">报告安全浏览信息</translation> <translation id="2550593661567988768">仅限单面打印</translation> +<translation id="2551520365302988324">发送用户上传内容进行扫描</translation> <translation id="2552966063069741410">时区</translation> <translation id="2562339630163277285">指定用于提供即搜即得结果的搜索引擎网址。该网址应包含字符串“<ph name="SEARCH_TERM_MARKER" />”,系统会在用户进行查询时将该字符串替换为用户输入的文字。 @@ -917,6 +920,7 @@ <translation id="2665422249821137126">在登录屏幕上启用大号光标</translation> <translation id="2672012807430078509">控制是否允许将 NTLM 作为 SMB 装载功能的身份验证协议</translation> <translation id="267596348720209223">指定搜索服务提供商支持的字符编码。编码是指类似于 UTF-8、GB2312 和 ISO-8859-1 的代码页名称,并按此顺序进行尝试。此政策是可选的,如果未设置,将使用默认值 UTF-8。要实施此政策,必须先启用“DefaultSearchProviderEnabled”政策。</translation> +<translation id="2679827548357140943">以列表形式指定:对于哪些网域,系统需要在上传内容时检查恶意软件</translation> <translation id="268577405881275241">启用数据压缩代理功能</translation> <translation id="2693108589792503178">配置用于更改密码的网址。</translation> <translation id="2694143893026486692">已启用停靠的放大镜</translation> @@ -1286,6 +1290,10 @@ <translation id="332771718998993005">将广告中宣传的名称确定为 <ph name="PRODUCT_NAME" /> 目标名称。 如果此政策设为非空字符串,该字符串将被用作 <ph name="PRODUCT_NAME" /> 目标名称。否则,目标名称便是设备名称。如果此政策未设置,则目标名称将是设备名称,且设备所有者(或者该设备的托管网域内的用户)将能更改该名称。该名称的长度不得超过 24 个字符。</translation> +<translation id="3331950121151548952">以列表形式指定:对于哪些网域,系统需要在上传内容时执行恶意软件检查。仅当 <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> 的值设为允许或强制对上传内容执行恶意软件检查时,才会用到此政策。 + + 如果此政策设为一个空的网域列表或未设置,系统便无需对任何上传内容执行恶意软件检查。 + </translation> <translation id="3335468714959531450">让您能够设置一系列网址格式,以用于指定允许哪些网站设置 Cookie。 如果未设置此政策,系统将会对所有网站使用“DefaultCookiesSetting”政策中的全局默认值(倘若已设置“DefaultCookiesSetting”政策),或使用用户个人配置中的全局默认值(倘若未设置“DefaultCookiesSetting”政策)。 @@ -1353,6 +1361,15 @@ 如果该政策设置为 False 或未设置,电源管理延迟和会话长度限制将在会话启动后立即开始计算。</translation> <translation id="3478024346823118645">退出时清除用户数据</translation> <translation id="3480961938508521469">以标准速率将电池充满。</translation> +<translation id="3483729306380590354">设置自定义电池充电起始电量(以百分比表示)。 + + 当电池电量消耗到自定义电池充电起始电量时,电池就会开始充电。 + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 必须至少比 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> 低 5 个百分点。 + + 仅当 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> 设为 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" /> 时,才会用到此政策。 + + 如果未配置或未设置此政策,则会应用 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 电池充电模式。</translation> <translation id="348495353354674884">启用虚拟键盘</translation> <translation id="3487623755010328395"> 如果已设置此政策,<ph name="PRODUCT_NAME" /> 将会尝试自行注册并为所有个人资料应用关联的云政策。 @@ -1781,6 +1798,15 @@ 如果您设置了此政策,用户将无法更改或覆盖它。 如果未设置此政策,则“自动点击”最初会处于停用状态,但用户可以随时启用该功能。</translation> +<translation id="4215197846797661927">设定日间高级电池充电模式配置。 + + 仅当 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> 设为 true 时,才会用到此政策。 + + 如果未配置或未设置此政策,则高级电池充电模式会始终处于停用状态。 + + 注意:<ph name="CHARGE_START_TIME_FIELD_NAME" /> 必须早于 <ph name="CHARGE_END_TIME_FIELD_NAME" />。 + + 注意:<ph name="CHARGE_START_TIME_FIELD_NAME" /> 和 <ph name="CHARGE_END_TIME_FIELD_NAME" /> 所允许的 <ph name="MINUTE_FIELD_NAME" /> 字段值为 0、15、30、45。</translation> <translation id="4224610387358583899">屏幕锁定延迟时间</translation> <translation id="423797045246308574">可让您设置一个网址格式列表,以便指定哪些网站不能使用密钥生成功能。对于同时还包含在“KeygenAllowedForUrls”中的网址格式,系统将应用此政策而忽略“KeygenBlockedForUrls”政策。 @@ -1846,6 +1872,17 @@ 指定的政策值应以毫秒为单位,并且不得大于闲置延迟时间。 仅当闲置操作为注销或关机时,系统才会显示警告消息。</translation> +<translation id="4342827592971649626">此政策用于控制安全浏览功能对用户下载内容的深度扫描。如果此政策未设置,或设为默认的“不扫描文件”,安全浏览功能将不会扫描用户下载内容。 + + 如果此政策设为“禁止扫描文件”,系统将会禁止用户扫描他们的下载内容。此设置不同于默认设置:默认设置允许某些用户(例如,那些已加入高级保护计划的用户)将他们的下载内容发送给服务器进行扫描,但此设置会禁止这类用户进行扫描。 + + 如果此政策设为“发送用户下载内容进行扫描”,系统就会将用户下载内容通过网络发送给安全浏览功能,以进行恶意软件扫描。 + + 如果此政策设为“发送用户上传内容进行扫描”,系统就会将用户上传内容通过网络发送给安全浏览功能,以进行恶意软件扫描。 + + 如果此政策设为“发送用户上传内容和下载内容进行扫描”,则系统将根据“发送用户上传内容进行扫描”和“发送用户下载内容进行扫描”所述的规则操作。 + + 若想详细了解系统会如何向用户和管理员显示扫描结果,请参阅 <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> 和 <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" /> 政策。</translation> <translation id="4344356660952451291">需要检查下载内容是否合规的网域列表</translation> <translation id="4346674324214534449">可让您设置是否应禁止含侵扰性广告的网站展示广告。 @@ -2398,6 +2435,16 @@ 如果您设置了此政策,用户将无法更改或替换此政策。 如果未设置此政策,用户将可以自行选择要在桌面和登录屏幕背景中显示的图片。</translation> +<translation id="5437214086679373363">控制是否允许用户在需要扫描时上传或下载受密码保护的文件。此限制仅适用于需要扫描的文件,是否需要扫描取决于 <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />、<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> 以及用于控制哪些网域需要启用检查功能的政策。 + + 如果此政策未设置或设为“无”,则 <ph name="PRODUCT_NAME" /> 会禁止用户上传或下载受密码保护的文件。 + + 如果此政策设为“允许下载”,则 <ph name="PRODUCT_NAME" /> 会允许用户下载受密码保护的文件。 + + 如果此政策设为“允许上传”,则 <ph name="PRODUCT_NAME" /> 会允许用户上传受密码保护的文件。 + + 如果此政策未设置或设为“允许上传和下载”,则 <ph name="PRODUCT_NAME" /> 将根据“允许下载”和“允许上传”所述的规则操作。 + </translation> <translation id="5437733496511628148">启用此设置后,如果网页元素并非来自浏览器的地址栏中的网域,就无法设置 Cookie。 停用此设置后,并非来自浏览器地址栏中的网域的网页元素也可以设置 Cookie,并且用户无法更改此设置。 @@ -3271,13 +3318,32 @@ 如需详细了解 Internet Explorer 的 <ph name="IEEM_SITELIST_POLICY" /> 政策,请访问 https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">无需提示用户即可使用视频捕获设备的网址</translation> +<translation id="713712866686796666">用于设定日间用电高峰转移配置。 + + 仅当 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> 设为 true 时,才会用到此政策。 + + 如果未配置或未设置此政策,“用电高峰转移”将始终处于停用状态。 + + 注意:<ph name="START_TIME_FIELD_NAME" />、<ph name="END_TIME_FIELD_NAME" /> 和 <ph name="CHARGE_START_TIME_FIELD_NAME" /> 所允许的 <ph name="MINUTE_FIELD_NAME" /> 字段值为 0、15、30、45。</translation> <translation id="7138678301420049075">其他</translation> +<translation id="7139809614375682935">设置电池充电自定义停止充电值(以百分比表示)。 + + 当电池电量达到电池充电自定义停止充电值时,电池就会停止充电。 + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 必须至少比 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> 低 5 个百分点。 + + 仅当 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> 设为 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" /> 时,才会用到此政策。 + + 如果未配置或未设置此政策,则会应用 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 电池充电模式。</translation> <translation id="7140629953254369759">指示 <ph name="PRODUCT_OS_NAME" />使用由指定名称标识的任务调度程序配置。 您可以将此政策设置为“conservative”和"performance”,这将分别选择以稳定性和最佳性能为目标进行优化的任务调度程序配置。 如果未设置此政策,则用户可以自行选择。</translation> <translation id="7145335384492396213">默认 PIN 码打印模式</translation> +<translation id="7149042336307555519"> 指定可使用哪些连接类型来更新操作系统。由于规模庞大,操作系统更新可能会对连接造成沉重负荷,也可能会产生额外费用。所以,在默认情况下,当用户使用较为昂贵的连接类型(目前仅包括“cellular”)时,系统不会启用操作系统更新。 + + 系统可识别的连接类型标识符包括 <ph name="CONNECTION_TYPE_ETHERNET_NAME" />、<ph name="CONNECTION_TYPE_WIFI_NAME" /> 和 <ph name="CONNECTION_TYPE_CELLULAR_NAME" />。</translation> <translation id="7152605873936173525">控制 DNS-over-HTTPS 解析器的模式。请注意,此政策仅会为每次查询设置默认模式。对于特殊类型的查询(例如,请求解析 DNS-over-HTTPS 服务器主机名),此政策所设的模式可能会被覆盖。 “<ph name="SECURE_DNS_MODE_OFF" />”模式会停用 DNS-over-HTTPS。 @@ -3306,6 +3372,17 @@ 如果将此政策设为 false,屏幕唤醒锁定请求将降级为系统唤醒锁定请求。</translation> <translation id="7177857088692019405">快速解锁</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">启用用电高峰转移电源管理政策。 + + “用电高峰转移”是一种节电政策,可在一天中的用电高峰期间尽可能减少对交流电的使用。对于每个工作日,您都可设置开始时间和结束时间以运行“用电高峰转移”模式。在您所设定的时段内,只要电池电量高于指定阈值,即使连接了交流电,系统也会仅使用电池来维持运行。待指定的结束时间过后,系统将会使用交流电(如果已连接)来维持运行,但不会为电池充电。待指定的充电开始时间过后,系统会再次使用交流电来维持正常运行,并会为电池充电。 + + 如果此政策设为 true,并且 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" /> 和 <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" /> 均已设置,“用电高峰转移”将会始终处于启用状态(如果设备支持的话)。 + + 如果此政策设为 false,“用电高峰转移”将会始终处于停用状态。 + + 如果您设置了此政策,用户将无法更改或覆盖它。 + + 如果未设置此政策,“用电高峰转移”的初始状态为停用,且无法由用户启用。</translation> <translation id="718956142899066210">允许用于更新的连接类型</translation> <translation id="7190286937411178540">启用“键盘焦点突出显示”无障碍功能</translation> <translation id="7194407337890404814">默认搜索服务提供商名称</translation> @@ -3928,6 +4005,17 @@ 如果未设置此政策,系统将启用此设置。</translation> <translation id="8382184662529825177">允许为设备使用远程认证来保护内容</translation> +<translation id="8382693763260501307">启用高级电池充电模式电源管理政策。 + + 高级电池充电模式让用户能够最大限度地延长电池寿命。在高级充电模式下,系统会在非工作时间使用标准充电算法和其他技术来最大限度地延长电池寿命。在工作时间,系统会使用快速充电。快速充电可更快地为电池充电,因此只需较短的时间即可将电池充满。每天系统使用量最大的时段由开始时间和持续时间指定。 + + 如果此政策设为 true,并且设置了 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" />,则高级电池充电模式会始终处于启用状态(如果相应设备支持的话)。 + + 如果此政策设为 false,则高级电池充电模式会始终处于停用状态。 + + 如果您设置了此政策,用户将无法更改或覆盖它。 + + 如果未设置此政策,则高级电池充电模式会处于停用状态,且无法由用户启用。</translation> <translation id="838870586332499308">启用数据漫游</translation> <translation id="8390049129576938611">在 <ph name="PRODUCT_NAME" /> 中停用内部 PDF 查看器。改为将此 PDF 查看器视为下载项,并允许用户使用此默认应用打开 PDF 文件。 @@ -4114,9 +4202,15 @@ 如果配置了此政策,该组应用会固定不变且无法由用户更改。 如果未设置此政策,用户便可更改启动器中的固定应用列表。</translation> +<translation id="8779504970846195767">用于设定用电高峰转移电量阈值(以百分比表示)。 + + 仅当 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> 设为 true 时,才会用到此政策。 + + 如果未配置或未设置此政策,“用电高峰转移”将始终处于停用状态。</translation> <translation id="8798099450830957504">默认</translation> <translation id="8800453707696044281">设置电池充电自定义停止充电值(以百分比表示)</translation> <translation id="8801680448782904838">系统建议或要求重新启动浏览器或重启设备时,通知用户</translation> +<translation id="8802816494059596691">此列表中指定的主机名将免受 HSTS 政策检查,该检查可能会将请求从 HTTP 升级到 HTTPS。此政策只允许使用单标签主机名。必须使用规范化主机名:任何 IDN 都必须被转换为对应的 A 标签格式,并且所有 ASCII 字母都必须小写。此政策只适用于指定的特定主机名,不适用于指定名称的子网域。</translation> <translation id="8818173863808665831">报告设备的地理位置。 如果未设置此政策或将其设为 false,系统将不会报告相关位置。</translation> @@ -4260,6 +4354,17 @@ 如果此政策的值设为与 Quick Fix Build 对应的令牌,那么只要更新未被其他政策阻止,该设备就会更新至相应的 Quick Fix Build。 如果未设置此政策,或者此政策的值不与 Quick Fix Build 对应,该设备便不会更新至 Quick Fix Build。如果该设备已在运行 Quick Fix Build,并且您已不再设置此政策或者此政策的值已不再与 Quick Fix Build 对应,那么只要更新未被其他政策阻止,该设备就会更新至常规版本。</translation> +<translation id="9053158112041032237">指定电池充电模式电源管理政策。 + + 动态地控制电池充电,以最大限度地减少因电池应力导致的电池损耗,从而延长电池寿命。 + + 如果选择了自定义电池充电模式,则必须指定 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 和 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />。 + + 如果设置了此政策,则会应用电池充电模式(如果相应设备支持的话)。 + + 如果未设置此政策,并且相应设备支持此政策,则会应用标准电池充电模式,而且无法由用户更改。 + + 注意:<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />(若已指定)会覆盖此政策。</translation> <translation id="9054012305936267950">此政策旨在控制浏览器的登录行为。它允许您指定用户是否可使用其帐号登录 <ph name="PRODUCT_NAME" /> 并使用帐号相关服务(如 Chrome 同步)。 如果此政策设为“禁止登录浏览器”,用户便无法登录浏览器并使用帐号相关服务。在这种情况下,用户无法使用也无法访问浏览器级功能(如 Chrome 同步)。如果用户已登录并且此政策设为“停用”,则用户将在下次运行 Chrome 时退出登录,但他们的本地个人资料数据(如书签、密码等)会被予以保留。用户仍能登录并使用 Google 网络服务(如 Gmail)。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index baab149..1eacdbbf 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -87,6 +87,7 @@ 如果你沒有設定這項政策,系統最多會將快取 GPO 重複使用 25 小時。 如將這項政策設為 0,就代表關閉 GPO 快取功能;請注意,這項設定會增加伺服器負載,因為即使 GPO 沒有更動,系統還是必須在每次擷取政策時重新下載 GPO。</translation> +<translation id="1111470455889178048">傳送使用者上傳及下載的內容以供掃描</translation> <translation id="1117462881884985156"><ph name="PRODUCT_NAME" /> 會略過這項政策所指定的一系列主機的 Proxy。 你必須在「選擇如何指定 Proxy 伺服器設定」中選取手動 Proxy 設定,並且未指定 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策,這項政策才會生效。 @@ -389,6 +390,7 @@ 萬用模式。</translation> <translation id="1634989431648355062">允許在這些網站上執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式</translation> <translation id="1645793986494086629">架構:</translation> +<translation id="1648816843164517573">可略過 HTTP 嚴格傳輸安全性政策檢查的名稱清單</translation> <translation id="1653229475925941921">如果設定這項政策,政策會控管啟用的放大鏡類型。將這項政策設為「None」,即可停用放大鏡。 設定這項政策後,使用者無法變更或覆寫這項政策。 @@ -880,6 +882,7 @@ <translation id="254653220329944566">啟用 <ph name="PRODUCT_NAME" /> 雲端報告功能</translation> <translation id="2548572254685798999">回報安全瀏覽資訊</translation> <translation id="2550593661567988768">僅限單面列印</translation> +<translation id="2551520365302988324">傳送使用者上傳內容以供掃描</translation> <translation id="2552966063069741410">時區</translation> <translation id="2562339630163277285">指定用於提供互動智慧搜尋結果的搜尋引擎網址。網址應包含 <ph name="SEARCH_TERM_MARKER" /> 字串,使用者輸入的查詢文字會取代這個字串。 @@ -954,6 +957,7 @@ <translation id="2665422249821137126">在登入畫面上啟用大型游標</translation> <translation id="2672012807430078509">控管是否要為 SMB 掛接功能啟用 NTLM 驗證通訊協定</translation> <translation id="267596348720209223">指定搜尋引擎支援的字元編碼。編碼就是 UTF-8、GB2312 和 ISO-8859-1 等字碼頁名稱。系統會以提供的順序來測試。這項政策是選擇性的,如果未設定,預設會使用的是 UTF-8。只有在啟用「DefaultSearchProviderEnabled」政策時,系統才會遵循這項政策。</translation> +<translation id="2679827548357140943">須檢查上傳內容是否包含惡意軟體的網域清單</translation> <translation id="268577405881275241">啟用資料壓縮 Proxy 功能</translation> <translation id="2693108589792503178">設定變更密碼網址。</translation> <translation id="2694143893026486692">停駐放大鏡已啟用</translation> @@ -1322,6 +1326,10 @@ <translation id="332771718998993005">確定公開為「<ph name="PRODUCT_NAME" />」目的地的名稱。 如果這項政策設為非空白字串,該字串就會成為「<ph name="PRODUCT_NAME" />」目的地的名稱,否則目的地名稱將會是裝置名稱。如果未設定這項政策,則目的地名稱會是裝置名稱,且裝置擁有者 (或裝置管理網域中的使用者) 可進行變更。名稱長度上限為 24 個字元。</translation> +<translation id="3331950121151548952">須檢查上傳內容是否包含惡意軟體的網域清單。你必須將 <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> 的值設為允許或強制針對上傳內容執行惡意軟體檢查,才能使用這項政策。 + + 如果不設定這項政策或設定為空白的網域清單,系統不會檢查上傳內容是否包含惡意軟體。 + </translation> <translation id="3335468714959531450">讓你設定網址模式清單,指定可設定 Cookie 的網站。 如果未設定這項政策,系統會根據「DefaultCookiesSetting」政策 (如有設定) 或使用者的個人設定,將通用預設值套用至所有網站。 @@ -1391,6 +1399,15 @@ 如果這項政策設為 False 或未設定,系統會延遲管理電源,並且在工作階段開始後立即執行工作階段長度限制。</translation> <translation id="3478024346823118645">登出後清除使用者資料</translation> <translation id="3480961938508521469">以標準充電速度將電池完全充飽。</translation> +<translation id="3483729306380590354">自訂開始充電的值 (以百分比為單位)。 + + 電池電量耗用到自訂的開始充電值時,就會開始充電。 + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 的值必須至少比 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />.的值低五個百分點。 + + 你必須將 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> 設為 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />,才能使用這項政策。 + + 如果未設定或不設定這項政策,系統將套用 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 充電模式。</translation> <translation id="348495353354674884">啟用虛擬鍵盤</translation> <translation id="3487623755010328395"> 如果設定這項政策,<ph name="PRODUCT_NAME" /> 嘗試自動註冊,並且為所有設定檔套用相關聯的雲端政策。 @@ -1815,6 +1832,15 @@ 設定這項政策後,使用者即無法變更或覆寫。 如果不設定這項政策,系統預設會停用自動點擊功能,但使用者隨時可以啟用這項功能。</translation> +<translation id="4215197846797661927">設定進階充電模式日間配置。 + + 你必須將 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> 設為 True,才能使用這項政策。 + + 如果未設定或不設定這項政策,系統將一律停用進階充電模式。 + + 注意:<ph name="CHARGE_START_TIME_FIELD_NAME" /> 必須小於 <ph name="CHARGE_END_TIME_FIELD_NAME" />。 + + 注意:在 <ph name="CHARGE_START_TIME_FIELD_NAME" /> 和<ph name="CHARGE_END_TIME_FIELD_NAME" /> 的 <ph name="MINUTE_FIELD_NAME" /> 欄位中,允許的值為 0、15、30、45。</translation> <translation id="4224610387358583899">螢幕鎖定延遲</translation> <translation id="423797045246308574">允許您設定網址模式清單,指定禁止使用金鑰產生功能的網站。如果網址模式為「KeygenAllowedForUrls」,這項政策就會覆寫這類例外狀況。 @@ -1880,6 +1906,17 @@ 指定政策值時需以毫秒為單位。這項設定值必須小於或等於閒置延遲時間。 只有當閒置動作設為登出或關機時,系統才會顯示警告訊息。</translation> +<translation id="4342827592971649626">這項政策可控管安全瀏覽功能是否要對使用者下載的內容進行深度掃描。如果不設定這項政策,或設為預設的「不要掃描檔案」,安全瀏覽功能將不會掃描使用者下載的內容。 + + 如果將這項政策設為「禁止掃描檔案」,系統將禁止使用者掃描下載內容。這項設定與預設值不同,因為特定使用者 (例如加入進階保護計畫的使用者) 可以將下載內容傳送給系統進行掃描。這項設定會禁止這些使用者掃描下載內容。 + + 如果將這項政策設為「傳送使用者下載內容以供掃描」,系統會將使用者下載的內容透過網路傳送給安全瀏覽功能,進行惡意軟體掃描。 + + 如果將這項政策設為「傳送使用者上傳內容以供掃描」,系統會將使用者上傳的內容透過網路傳送給安全瀏覽功能,進行惡意軟體掃描。 + + 如果將這項政策設為「傳送使用者上傳及下載的內容以供掃描」,系統會依照「傳送使用者上傳內容以供掃描」以及「傳送使用者下載內容以供掃描」設定的規則執行作業。 + + 如要進一步瞭解使用者和管理員如何查看掃描結果,請參閱 <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> 和 <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" /> 政策。</translation> <translation id="4344356660952451291">須檢查下載內容是否符合規範的網域清單</translation> <translation id="4346674324214534449">讓你設定是否禁止含侵入式廣告的網站顯示廣告。 @@ -2437,6 +2474,16 @@ 設定這項政策後,使用者即無法變更或覆寫。 如果不設定這項政策,使用者可自行選擇桌面和登入畫面背景的顯示圖片。</translation> +<translation id="5437214086679373363">必須進行掃描時,控管使用者是否可以上傳或下載受密碼保護的檔案。如果 <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />、<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> 或控管已啟用檢查功能的網域清單政策判斷檔案需要掃描,系統才會套用這項限制。 + + 如果將這項政策設為「無」,<ph name="PRODUCT_NAME" /> 會禁止使用者上傳或下載受密碼保護的檔案。 + + 如果將這項政策設為「允許下載」,<ph name="PRODUCT_NAME" /> 會允許使用者下載受密碼保護的檔案。 + + 如果將這項政策設為「允許上傳」,<ph name="PRODUCT_NAME" /> 會允許使用者上傳受密碼保護的檔案。 + + 如果不設定這項政策或設為「允許上傳及下載」,<ph name="PRODUCT_NAME" /> 會依照「允許下載」和「允許上傳」設定的規則執行作業。 + </translation> <translation id="5437733496511628148">如果啟用這項設定,系統將禁止第三方設定 Cookie;網頁元素必須來自瀏覽器網址列中的網域,才能設定 Cookie。 如果停用這項設定,即使網頁元素不是來自瀏覽器網址列中的網域,也能設定 Cookie;使用者並無法變更這項設定。 @@ -3310,13 +3357,32 @@ 如要進一步瞭解 Internet Explorer 的 <ph name="IEEM_SITELIST_POLICY" /> 政策,請參閱:https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">系統會直接授權存取視訊擷取裝置而不需提示的網址</translation> +<translation id="713712866686796666">設定日間用電尖峰轉移配置。 + + 你必須將 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> 設為 True,才能使用這項政策。 + + 如果未設定或不設定這項政策,系統將一律關閉用電尖峰轉移功能。 + + 注意:在 <ph name="START_TIME_FIELD_NAME" />、<ph name="END_TIME_FIELD_NAME" /> 和 <ph name="CHARGE_START_TIME_FIELD_NAME" /> 的 <ph name="MINUTE_FIELD_NAME" /> 欄位中,允許的值為 0、15、30、45。</translation> <translation id="7138678301420049075">其他</translation> +<translation id="7139809614375682935">自訂電池的停止充電值 (以百分比表示)。 + + 電池電量達到自訂的停止充電值時,就會停止充電。 + + <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 的值必須至少比 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />.的值低五個百分點。 + + 你必須將 <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> 設為 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />,才能使用這項政策。 + + 如果未設定或不設定這項政策,系統將套用 <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> 充電模式。</translation> <translation id="7140629953254369759">指示 <ph name="PRODUCT_OS_NAME" /> 根據指定名稱使用不同的工作排程器設定。 你可以將這項政策設為「conservative」或「performance」,讓系統選取以穩定性或效能最佳化為主的工作排程器設定。 如果不設定這項政策,使用者將可自行選取偏好設定。</translation> <translation id="7145335384492396213">預設 PIN 碼列印模式</translation> +<translation id="7149042336307555519"> 允許用來進行作業系統更新的連線類型。由於作業系統更新檔案較大,可能會對連線流量造成沉重負荷,也可能會產生額外費用。因此當使用者使用較昂貴的連線類型 (目前僅有「cellular」) 時,系統預設不會啟用作業系統更新。 + + 系統可識別的連線類型識別碼包括 <ph name="CONNECTION_TYPE_ETHERNET_NAME" />、<ph name="CONNECTION_TYPE_WIFI_NAME" /> 和 <ph name="CONNECTION_TYPE_CELLULAR_NAME" />。</translation> <translation id="7152605873936173525">控管 DNS-over-HTTPS 解析器的模式。請注意,這項政策只會設定每次查詢的預設模式。系統可能會覆寫特殊查詢類型的模式,例如解析 DNS-over-HTTPS 伺服器主機名稱的要求。 <ph name="SECURE_DNS_MODE_OFF" /> 模式會停用 DNS-over-HTTPS。 @@ -3346,6 +3412,17 @@ 如果這項政策設為「False」,系統將忽略螢幕 Wake Lock 使用要求。</translation> <translation id="7177857088692019405">快速解鎖</translation> <translation id="7185078796915954712">TLS 1.3</translation> +<translation id="7187447094921703950">啟用「用電尖峰轉移」電源管理政策。 + + 「用電尖峰轉移」是一項省電政策,能夠在一天中的用電尖峰期間,將交流電的使用量降到最低。你可以針對每個工作日,個別設定「用電尖峰轉移」模式的開始和結束時間。在你所設定的時間內,只要電池電量高於指定閾值,即使裝置已連接到交流電源,系統仍會強制使用電池供電。到達指定的結束時間之後,如果裝置連接到交流電源,系統就會改用交流電源,但不會對電池充電。到達指定的充電開始時間之後,如果裝置連接到交流電源,系統會再次使用交流電源運作,同時為電池充電。 + + 如果將這項政策設為 True,並設定 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" />、<ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" /> 政策,系統將一律在支援的裝置上開啟用電尖峰轉移功能。 + + 如果將這項政策設為 False,系統一律會關閉尖峰用電轉移功能。 + + 設定這項政策後,使用者即無法變更或覆寫。 + + 如果未設定這項政策,系統預設會關閉用電尖峰轉移功能,且使用者無法啟用這項功能。</translation> <translation id="718956142899066210">允許進行更新的連線類型</translation> <translation id="7190286937411178540">啟用鍵盤焦點醒目顯示無障礙功能</translation> <translation id="7194407337890404814">預設搜尋引擎名稱</translation> @@ -3963,6 +4040,17 @@ 如果不設定這項政策,系統就會啟用這項政策。</translation> <translation id="8382184662529825177">啟用可用於保護裝置內容的遠端認證機制</translation> +<translation id="8382693763260501307">啟用進階充電模式電源管理政策。 + + 進階充電模式可讓使用者大幅延長電池壽命。使用進階充電模式時,系統會在非工作時間採用標準充電演算法和其他技術儘可能延長電池壽命。在工作時間則會使用快速充電模式。這種快速充電模式會加快充電速度,因此電池可以更快充飽。你可以設定開始時間和持續期間,指定每天最常使用系統的時間。 + + 如果將這項政策設為 True,且已設定 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" />,系統將一律在支援的裝置上啟用進階充電模式。 + + 如果將這項政策設為 False,系統將一律停用進階充電模式。 + + 設定這項政策後,使用者即無法變更或覆寫。 + + 如果未設定這項政策,系統會停用進階充電模式,且使用者無法啟用。</translation> <translation id="838870586332499308">啟用數據漫遊</translation> <translation id="8390049129576938611">停用 <ph name="PRODUCT_NAME" /> 的內部 PDF 檢視器。改為將 PDF 檔案視為下載項目,允許使用者使用預設的應用程式開啟。 @@ -4157,9 +4245,15 @@ 如果設定這項政策,應用程式集將會固定,且使用者無法變更。 如果不設定這項政策,使用者就可以變更啟動器中的固定應用程式清單。</translation> +<translation id="8779504970846195767">設定用電尖峰轉移電池閾值 (以百分比為單位)。 + + 你必須將 <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> 設為 True,才能使用這項政策。 + + 如果未設定或不設定這項政策,系統將一律關閉用電尖峰轉移功能。</translation> <translation id="8798099450830957504">預設</translation> <translation id="8800453707696044281">自訂電池停止充電值 (以百分比表示)</translation> <translation id="8801680448782904838">透過通知建議或要求使用者重新啟動瀏覽器或裝置</translation> +<translation id="8802816494059596691">這份清單中指定的主機名稱會從 HTTP 嚴格傳輸安全性政策檢查作業中排除,該檢查可能會將要求從 HTTP 升級為 HTTPS。這項政策只允許單一標籤主機名稱。主機名稱必須標準化:任何 IDN 都必須轉換為單一標籤格式,且所有 ASCII 字母都必須使用小寫。這項政策只適用於指定的主機名稱,不適用於指定主機名稱的子網域。</translation> <translation id="8818173863808665831">回報裝置的地理位置。 如果未設定這項政策,或將其設定為 False,系統將不會回報位置。</translation> @@ -4308,6 +4402,17 @@ 如果將政策值設為對應至快速修復版本的符記,且其他政策未封鎖更新,則裝置會更新為相應的快速修復版本。 如果未設定這項政策,或政策值未對應至快速修復版本,則裝置不會更新為快速修復版本。如果裝置已執行快速修復版本,且你不再設定這項政策,或政策值不再對應至快速修復版本,那麼在其他政策未封鎖更新的情況下,裝置會更新為相應的一般版本。</translation> +<translation id="9053158112041032237">指定充電模式電源管理政策。 + + 以動態方式控管充電模式,盡可能降低因過度使用造成的電池耗損,並延長電池壽命。 + + 如果已選取自訂充電模式,就必須指定 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> 和 <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />。 + + 如果設定了這項政策,系統將一律在支援的裝置上套用充電模式。 + + 如果裝置支援這項政策但你未設定政策,系統會套用標準充電模式,且使用者無法變更這個模式。 + + 注意:如果指定 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />,這項政策會遭到覆寫。</translation> <translation id="9054012305936267950">這項政策可控管瀏覽器的登入行為。你可以指定使用者是否能用個人帳戶登入 <ph name="PRODUCT_NAME" /> 並使用帳戶相關服務 (例如 Chrome 同步功能)。 如果將這項政策設為「禁止登入瀏覽器」,使用者將無法登入瀏覽器,也無法使用帳戶相關服務。在這種情況下,使用者無法使用瀏覽器層級的功能 (例如 Chrome 同步功能)。如果這項政策在使用者登入瀏覽器後才設為「停用」,則這些已登入的使用者會在下次執行 Chrome 時被登出,但系統仍會保留他們的本機設定檔資料 (例如書籤、密碼等)。使用者仍然可以登入並使用 Gmail 等 Google 網路服務。
diff --git a/components/printing/common/print.mojom b/components/printing/common/print.mojom index e2624c87..d1b00877 100644 --- a/components/printing/common/print.mojom +++ b/components/printing/common/print.mojom
@@ -15,6 +15,7 @@ // printing grunt work for RenderView. interface PrintRenderFrame { // Tells the RenderFrame to initiate print preview for the entire - // document. - InitiatePrintPreview(bool has_selection); + // document. Optionally provides a |print_renderer| to render print documents. + InitiatePrintPreview(associated PrintRenderer? print_renderer, + bool has_selection); };
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index c57c8c4..fa6f27bf 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1110,8 +1110,7 @@ is_loading_ = true; } -void PrintRenderFrameHelper::DidFailProvisionalLoad( - const blink::WebURLError& error) { +void PrintRenderFrameHelper::DidFailProvisionalLoad() { DidFinishLoad(); } @@ -1199,11 +1198,16 @@ print_render_frame_binding_.Bind(std::move(request)); } -void PrintRenderFrameHelper::InitiatePrintPreview(bool has_selection) { +void PrintRenderFrameHelper::InitiatePrintPreview( + mojom::PrintRendererAssociatedPtrInfo print_renderer, + bool has_selection) { #if BUILDFLAG(ENABLE_PRINT_PREVIEW) if (ipc_nesting_level_ > 1) return; + if (print_renderer) + print_renderer_.Bind(std::move(print_renderer)); + blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); // If we are printing a PDF extension frame, find the plugin node and print
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index 5b3f94af..a4f11e5 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h
@@ -190,7 +190,7 @@ void DidStartNavigation( const GURL& url, base::Optional<blink::WebNavigationType> navigation_type) override; - void DidFailProvisionalLoad(const blink::WebURLError& error) override; + void DidFailProvisionalLoad() override; void DidFinishLoad() override; void ScriptedPrint(bool user_initiated) override; bool OnMessageReceived(const IPC::Message& message) override; @@ -199,7 +199,9 @@ mojom::PrintRenderFrameAssociatedRequest request); // printing::mojom::PrintRenderFrame: - void InitiatePrintPreview(bool has_selection) override; + void InitiatePrintPreview( + mojom::PrintRendererAssociatedPtrInfo print_renderer, + bool has_selection) override; // Message handlers --------------------------------------------------------- void OnPrintPages(); @@ -401,6 +403,10 @@ // Used to check the prerendering status. const std::unique_ptr<Delegate> delegate_; + // Used to render print documents from an external source (ARC, Crostini, + // etc.). + mojom::PrintRendererAssociatedPtr print_renderer_; + mojo::AssociatedBinding<mojom::PrintRenderFrame> print_render_frame_binding_; // Keeps track of the state of print preview between messages.
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc index 4ee4825..98db41a 100644 --- a/components/printing/test/print_render_frame_helper_browsertest.cc +++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -261,7 +261,7 @@ void OnPrintPreview(const base::DictionaryValue& dict) { PrintRenderFrameHelper* print_render_frame_helper = GetPrintRenderFrameHelper(); - print_render_frame_helper->InitiatePrintPreview(false); + print_render_frame_helper->InitiatePrintPreview(nullptr, false); base::RunLoop run_loop; DidPreviewPageListener filter(&run_loop); render_thread_->sink().AddFilter(&filter);
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 75cdf03..a4b5b6b 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"আপনার কম্পিউটারের সফ্টওয়্যার Chrome-কে নিরাপদে ইন্টারনেটে কানেক্ট করতে বাধা দিচ্ছে" (শুধুমাত্র Windows কম্পিউটারের জন্য)</translation> <translation id="1294154142200295408">কম্যান্ড-লাইন ভেরিয়েশন</translation> <translation id="129553762522093515">সম্প্রতি বন্ধ হয়েছে</translation> +<translation id="1298536327547837046">ম্যালওয়্যার স্ক্যান করা</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />আপনার কুকিজ সাফ করে দেখুন<ph name="END_LINK" /></translation> <translation id="1307966114820526988">শীঘ্রই বন্ধ করা হবে এমন ফিচার</translation> <translation id="1320233736580025032">Prc1 (Envelope)</translation> @@ -430,6 +431,7 @@ <translation id="320323717674993345">পেমেন্ট বাতিল করুন</translation> <translation id="3207960819495026254">বুকমার্ক করা হয়েছে</translation> <translation id="3209034400446768650">পৃষ্ঠাটির মাধ্যমে টাকা চার্জ করা হতে পারে</translation> +<translation id="3215092763954878852">WebAuthn ব্যবহার করা যায়নি</translation> <translation id="3225919329040284222">সার্ভারটি এমন একটি সার্টিফিকেট উপস্থাপনা করেছে যা বিল্ট-ইন প্রত্যাশাগুলির সাথে মেলে না৷ এই প্রত্যাশাগুলি আপনাকে সুরক্ষিত করতে কিছু নিশ্চিত, উচ্চ সুরক্ষার ওয়েবসাইটের জন্য অন্তর্ভুক্ত৷</translation> <translation id="3226128629678568754">পৃষ্ঠা লোড করার জন্য প্রয়োজনীয় ডেটা আবার জমা দিতে রিলোড বোতামটি টিপুন৷</translation> <translation id="3227137524299004712">মাইক্রোফোন</translation> @@ -566,6 +568,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{কিছুই নয়}=1{১টি সাইট থেকে }one{#টি সাইট থেকে }other{#টি সাইট থেকে }}</translation> <translation id="397105322502079400">গণনা করা হচ্ছে...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> অবরুদ্ধ হয়ে রয়েছে</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> আপনার ব্রাউজারে Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন চালু করেছে। Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন আপনার কিছু ডেটা অ্যাক্সেস করতে পারে।</translation> <translation id="3987940399970879459">১ এমবির কম</translation> <translation id="40103911065039147">{URL_count,plural, =1{আশেপাশের ১টি ওয়েবপৃষ্ঠা}one{আশেপাশের #টি ওয়েবপৃষ্ঠা}other{আশেপাশের #টি ওয়েবপৃষ্ঠা}}</translation> <translation id="4030383055268325496">&যোগ করাকে পূর্বাবস্থায় ফেরান</translation> @@ -634,6 +637,7 @@ <translation id="4277028893293644418">পাসওয়ার্ড রিসেট করুন</translation> <translation id="4279811152705618813"><ph name="ENROLLMENT_DOMAIN" /> আপনার <ph name="DEVICE_TYPE" /> ম্যানেজ করে</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{এই কার্ডটি আপনার Google অ্যাকাউন্টে সেভ করা হয়েছে}one{এই কার্ডগুলি আপনার Google অ্যাকাউন্টে সেভ করা হয়েছে}other{এই কার্ডগুলি আপনার Google অ্যাকাউন্টে সেভ করা হয়েছে}}</translation> +<translation id="428847186335018806">Chrome-এ ডাউনলোড বা আপলোড করা ফাইল স্ক্যান করুন।</translation> <translation id="42981349822642051">প্রসারিত করুন</translation> <translation id="4302965934281694568">Chou3 (Envelope)</translation> <translation id="4305817255990598646">পাল্টান</translation> @@ -672,6 +676,7 @@ <translation id="4506176782989081258">যাচাইকরণের ত্রুটি: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">সিস্টেম প্রশাসকের সাথে যোগাযোগ করে দেখুন</translation> <translation id="450710068430902550">প্রশাসকের সাথে ভাগ করছে</translation> +<translation id="4508814173490746936">টাচ আইডি ব্যবহার করা যায়নি</translation> <translation id="4510487217173779431">Chou4 (Envelope)</translation> <translation id="4515275063822566619">কার্ড ও ঠিকানাগুলি Chrome এবং আপনার Google অ্যাকাউন্ট (<ph name="ACCOUNT_EMAIL" />) থেকে এসেছে। আপনি <ph name="BEGIN_LINK" />সেটিংস<ph name="END_LINK" />এ গিয়ে সেগুলি পরিচালনা করতে পারবেন।</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> @@ -767,6 +772,7 @@ <translation id="5045550434625856497">ভুল পাসওয়ার্ড</translation> <translation id="5056549851600133418">আপনার জন্য নিবন্ধগুলি</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(১টি ব্যবহার করা হচ্ছে)}one{(#টি ব্যবহার করা হচ্ছে)}other{(#টি ব্যবহার করা হচ্ছে)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />প্রক্সি ঠিকানা পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation> <translation id="5087286274860437796">সার্ভারের সার্টিফিকেট এই সময়ে বৈধ নয়৷</translation> <translation id="5087580092889165836">কার্ড জুড়ুন</translation> @@ -995,6 +1001,7 @@ <translation id="6302269476990306341">Chrome-এ Google অ্যাসিস্ট্যান্ট এতক্ষণ পরে বন্ধ হয়ে যাবে:</translation> <translation id="6305205051461490394"><ph name="URL" /> এ পৌঁছানো যাচ্ছে না</translation> <translation id="6321917430147971392">আপনার DNS সেটিংস পরীক্ষা করুন</translation> +<translation id="6322182122604171028">Windows Hello ব্যবহার করা যায়নি</translation> <translation id="6328639280570009161">নেটওয়ার্ক পূর্বানুমান নিষ্ক্রিয় করার চেষ্টা করুন</translation> <translation id="6328784461820205019">"আপনার কানেকশন গোপন নয়" বা "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" বা "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" বা "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" বা "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" বা "SSL সার্টিফিকেটে সমস্যা"</translation> <translation id="6328786501058569169">এই সাইটটি প্রতারণামূলক</translation> @@ -1018,6 +1025,7 @@ <translation id="6433490469411711332">পরিচিতি তথ্য সম্পাদনা করুন</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> সংযোগ করতে প্রত্যাখ্যান করেছে।</translation> <translation id="6434309073475700221">বাতিল</translation> +<translation id="6435221585574090192">আপনার অ্যাডমিনিস্ট্রেটরের সাথে Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন দ্বারা ফ্ল্যাগ করা হয়েছে এমন নিরাপত্তা সংক্রান্ত ঘটনা সম্পর্কিত ডেটা শেয়ার করুন। এর মধ্যে পৃষ্ঠার ইউআরএল, ফাইলের নাম ও মেটাডেটা, আপনার ডিভাইস ব্যবহারকারীর নাম এবং Chrome ব্যবহারকারীর নাম থাকতে পারে।</translation> <translation id="6440503408713884761">এড়ানো হয়েছে</translation> <translation id="6446163441502663861">Kahu (Envelope)</translation> <translation id="6446608382365791566">আরও তথ্য যোগ করুন</translation> @@ -1062,6 +1070,7 @@ <translation id="6671697161687535275">Chromium থেকে ফর্ম প্রস্তাবনা সরাবেন?</translation> <translation id="6685834062052613830">সাইন-আউট করে সেট-আপ সম্পূর্ণ করুন</translation> <translation id="6689271823431384964">আপনি সাইন-ইন করে আছেন বলে, Chrome আপনার কার্ডগুলি Google অ্যাকাউন্টে সেভ করতে চান কিনা তা জানতে চাইছে। সেটিংস থেকে আপনি এই বিকল্প পরিবর্তন করতে পারেন। আপনার অ্যাকাউন্ট থেকেই কার্ডহোল্ডারের নাম পাওয়া গেছে।</translation> +<translation id="6707256370811247129">Chrome-এ আপনার ডাউনলোড বা আপলোড করা ক্যাশে এবং ফাইলগুলির কন্টেন্ট স্ক্যান করুন।</translation> <translation id="6710213216561001401">পূর্ববর্তী</translation> <translation id="6710594484020273272"><সার্চের পদ লিখুন></translation> <translation id="671076103358959139">নথিভুক্ত করার জন্য টোকেন:</translation> @@ -1080,6 +1089,7 @@ <translation id="681021252041861472">এই ফিল্ডটি ফাঁকা রাখা যাবে না</translation> <translation id="6810899417690483278">কাস্টমাইজেশন আইডি</translation> <translation id="6825578344716086703">আপনি <ph name="DOMAIN" />-এ পৌঁছানোর প্রচেষ্টা করেছেন, কিন্তু সার্ভারটি একটি দুর্বল অ্যালগারিদম স্বাক্ষর (যেমন SHA-1) ব্যবহার করে একটি স্বাক্ষরিত সার্টিফিকেট উপস্থাপন করেছে। এর অর্থ হল সার্ভার যে সুরক্ষা প্রমাণপত্রাদি উপস্থাপন করেছে তা জাল হতে পারে এবং সার্ভারটি আপনার প্রত্যাশিত সার্ভার নাও হতে পারে (হতে পারে আপনি একজন আক্রমণকারীর সাথে যোগাযোগ করছেন)।</translation> +<translation id="6826370046007623921">ডেটা হারানো প্রতিরোধ</translation> <translation id="6831043979455480757">অনুবাদ</translation> <translation id="6839929833149231406">এলাকা</translation> <translation id="6852204201400771460">আবার অ্যাপ লোড করতে চান?</translation> @@ -1226,6 +1236,7 @@ <translation id="7542995811387359312">স্বয়ংক্রিয় ক্রেডিট কার্ড পূরণটি অক্ষম রয়েছে কারণ এই ফর্মটি কোনও সুরক্ষিত সংযোগ ব্যবহার করে না৷</translation> <translation id="7548892272833184391">কানেকশনের সমস্যার সমাধান করুন</translation> <translation id="7549584377607005141">ঠিকঠাক ডিসপ্লে করার জন্য এই ওয়েবপৃষ্ঠার আপনার আগে দেওয়া ডেটা প্রযোজন৷ আপনি এই ডেটাটি আবার পাঠাতে পারেন, কিন্তু এমনটি করে আপনি যেকোনো পদক্ষেপের পুনরাবৃত্তি করবেন যা এই পৃষ্ঠাটি আগেই সম্পাদনা করেছে৷</translation> +<translation id="7550637293666041147">আপনার ডিভাইস ব্যবহারকারীর নাম এবং Chrome ব্যবহারকারীর নাম</translation> <translation id="7552846755917812628">নিম্নোল্লিখিত টিপ্স ব্যবহার করে দেখুন:</translation> <translation id="7554791636758816595">নতুন ট্যাব</translation> <translation id="7564049878696755256">আপনি নিজের <ph name="ORG_NAME" /> অ্যাকাউন্টের অ্যাক্সেস হারাতে পারেন অথবা আপনার পরিচয় চুরি হয়ে যেতে পারে। Chrome এখনই আপনার পাসওয়ার্ড পরিবর্তন করার আর্জি জানাচ্ছে।</translation> @@ -1240,6 +1251,7 @@ <translation id="7610193165460212391">সীমার বাইরে মান <ph name="VALUE" />৷</translation> <translation id="7613889955535752492">মেয়াদোত্তীর্ণ: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">আপনার কাছে ইতিমধ্যেই এমন ডেটা আছে যা Google অ্যাকাউন্টের পাসওয়ার্ডের কোনো ভিন্ন ভার্সন ব্যবহারের দ্বারা এনক্রিপ্ট করা হয়৷ অনুগ্রহ করে এটিকে নিচে লিখুন৷</translation> +<translation id="7625784245512586808">Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন</translation> <translation id="7633909222644580952">পারফর্ম্যান্সের ডেটা ও ক্র্যাশ রিপোর্ট</translation> <translation id="7637571805876720304">Chromium থেকে ক্রেডিট কার্ড সরাবেন?</translation> <translation id="7638605456503525968">সিরিয়াল পোর্ট</translation> @@ -1350,6 +1362,7 @@ <translation id="8211406090763984747">কানেকশনটি নিরাপদ</translation> <translation id="8218327578424803826">নির্ধারিত লোকেশন:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> +<translation id="8220639454292072926">এন্টারপ্রাইজ রিপোর্টিং</translation> <translation id="8225771182978767009">এই কম্পিউটার যিনি সেট-আপ করেছেন তিনি এই সাইটটি অবরুদ্ধ করার বিষয়টি চয়ন করেছেন।</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">নতুন ছদ্মবেশী ট্যাবে একটি পৃষ্ঠা খুলুন</translation> @@ -1432,6 +1445,7 @@ <translation id="8740359287975076522"><ph name="HOST_NAME" /> এর <abbr id="ডিএনএসDefinition">ডিএনএস ঠিকানা</abbr> পাওয়া যায়নি। সমস্যা নির্ণয় করা হচ্ছে।</translation> <translation id="874846938927089722">এই ক্রেডিট ও প্রিপেড কার্ডগুলি গ্রহণ করা হয়</translation> <translation id="874918643257405732">এই ট্যাব বুকমার্ক করুন</translation> +<translation id="8751426954251315517">পরে আবার চেষ্টা করুন</translation> <translation id="8759274551635299824">এই কার্ডটির মেয়াদ শেষ হয়েছে</translation> <translation id="8761567432415473239">Google নিরাপদ ব্রাউজিং সম্প্রতি <ph name="SITE" /> এ <ph name="BEGIN_LINK" />ক্ষতিকারক প্রোগ্রামগুলি খুঁজে পেয়েছে<ph name="END_LINK" />৷</translation> <translation id="8763927697961133303">USB ডিভাইস</translation> @@ -1496,6 +1510,7 @@ <translation id="9080712759204168376">অর্ডারের সারসংক্ষেপ</translation> <translation id="9089260154716455634">Off-Hours সংক্রান্ত নীতি:</translation> <translation id="9095388113577226029">আরও ভাষা...</translation> +<translation id="9098981495403789647">আপনার অ্যাডমিনিস্ট্রেটর আপনার ব্রাউজারে Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন চালু করেছে। Chrome এন্টারপ্রাইজ থ্রেট প্রোটেকশন আপনার কিছু ডেটা অ্যাক্সেস করতে পারে।</translation> <translation id="9103872766612412690"><ph name="SITE" /> সাধারণত আপনার তথ্য সুরক্ষিত রাখতে এনক্রিপশন ব্যবহার করে। এবার Chromium, <ph name="SITE" />-এর সাথে কানেক্ট করার চেষ্টা করলে ওয়েবসাইটটি অস্বাভাবিক এবং ভুল ক্রেডেনশিয়াল পাঠিয়ে দেয়। হয় একজন আক্রমণকারী <ph name="SITE" /> হতে চাইছে অথবা একটি ওয়াই-ফাই সাইন-ইন স্ক্রিন কানেকশনকে বাধা দিয়েছে। আপনার তথ্য এখনো নিরাপদ আছে কারণ কোনো ডেটা আদানপ্রদানের আগেই Chromium কানেকশন বন্ধ করে দিয়েছে।</translation> <translation id="9106062320799175032">বিলিংয়ের ঠিকানা যোগ করুন</translation> <translation id="9114524666733003316">কার্ড নিশ্চিত করা হচ্ছে...</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index d67763cb..cb94974e 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"તમારા કમ્પ્યુટરમાંનું સૉફ્ટવેર Chromeને સુરક્ષિત રીતે વેબ સાથે કનેક્ટ થવાથી અટકાવે છે" (માત્ર Windows કમ્પ્યુટર)</translation> <translation id="1294154142200295408">આદેશ વાક્યમાં વિવિધતા</translation> <translation id="129553762522093515">તાજેતરમાં બંધ કરેલા</translation> +<translation id="1298536327547837046">માલવેરની તપાસ કરવી</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />તમારી કૂકીઝને સાફ કરવાનો પ્રયાસ કરો<ph name="END_LINK" /></translation> <translation id="1307966114820526988">નાપસંદ કરેલી સુવિધાઓ</translation> <translation id="1320233736580025032">Prc1 (એન્વલપ)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">ચુકવણી રદ કરો</translation> <translation id="3207960819495026254">બુકમાર્ક કરેલ</translation> <translation id="3209034400446768650">પેજ કદાચ નાણાં વસૂલી શકે છે</translation> +<translation id="3215092763954878852">WebAuthnનો ઉપયોગ કરી શક્યાં નથી</translation> <translation id="3225919329040284222">સર્વર એક પ્રમાણપત્ર પ્રસ્તુત કરે છે જે બિલ્ટ-ઇન અપેક્ષાઓ સાથે મેળ ખાતું નથી. આ અપેક્ષાઓમાં તમને સુરક્ષિત રાખવા માટે અમુક ચોક્કસ, ઉચ્ચ-સુરક્ષા વેબસાઇટ્સનો સમાવેશ થાય છે.</translation> <translation id="3226128629678568754">પૃષ્ઠને લોડ કરવા માટે જરૂરી ડેટા ફરીથી સબમિટ કરવા માટે ફરીથી લોડ કરો બટન દબાવો.</translation> <translation id="3227137524299004712">માઇક્રોફોન</translation> @@ -564,6 +566,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{કોઈ નહીં}=1{1 સાઇટમાંથી }one{# સાઇટમાંથી }other{# સાઇટમાંથી }}</translation> <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" />માં તમારા બ્રાઉઝર પર Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવા ચાલુ કરેલી છે. Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવાને તમારા અમુક ડેટાનો ઍક્સેસ છે.</translation> <translation id="3987940399970879459">1 MB કરતાં ઓછું</translation> <translation id="40103911065039147">{URL_count,plural, =1{નજીકમાં 1 વેબ પેજ}one{નજીકમાં # વેબ પેજ}other{નજીકમાં # વેબ પેજ}}</translation> <translation id="4030383055268325496">&ઉમેરવું પૂર્વવત્ કરો</translation> @@ -632,6 +635,7 @@ <translation id="4277028893293644418">પાસવર્ડ રીસેટ કરો</translation> <translation id="4279811152705618813">તમારા <ph name="DEVICE_TYPE" />ને <ph name="ENROLLMENT_DOMAIN" /> મેનેજ કરે છે</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{આ કાર્ડને તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યું છે}one{આ કાર્ડને Google એકાઉન્ટમાં સાચવવામાં આવ્યાં છે}other{આ કાર્ડને Google એકાઉન્ટમાં સાચવવામાં આવ્યાં છે}}</translation> +<translation id="428847186335018806">તમે Chromeમાં ડાઉનલોડ અથવા અપલોડ કરેલી ફાઇલો તપાસો.</translation> <translation id="42981349822642051">વિસ્તૃત કરો</translation> <translation id="4302965934281694568">Chou3 (એન્વલપ)</translation> <translation id="4305817255990598646">સ્વિચ</translation> @@ -670,6 +674,7 @@ <translation id="4506176782989081258">માન્યતા ભૂલ: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરીને</translation> <translation id="450710068430902550">વ્યવસ્થાપક સાથે શેર કરવું</translation> +<translation id="4508814173490746936">ટચ IDનો ઉપયોગ કરી શક્યાં નથી</translation> <translation id="4510487217173779431">Chou4 (એન્વલપ)</translation> <translation id="4515275063822566619">કાર્ડ અને સરનામા Chrome અને Google એકાઉન્ટ (<ph name="ACCOUNT_EMAIL" />)માંથી છે. તમે તેને <ph name="BEGIN_LINK" />સેટિંગ<ph name="END_LINK" />માં જઈને મેનેજ કરી શકો છો.</translation> <translation id="4517607026994743406">Comm-10 (એન્વલપ)</translation> @@ -765,6 +770,7 @@ <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation> <translation id="5056549851600133418">તમારા માટે લેખ</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 ઉપયોગમાં છે)}one{(# ઉપયોગમાં છે)}other{(# ઉપયોગમાં છે)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />પ્રૉક્સી ઍડ્રેસ ચેક કરવાનો પ્રયાસ કરો<ph name="END_LINK" /></translation> <translation id="5087286274860437796">સર્વરનું પ્રમાણપત્ર આ સમયે માન્ય નથી.</translation> <translation id="5087580092889165836">કાર્ડ ઉમેરો</translation> @@ -994,6 +1000,7 @@ <translation id="6302269476990306341">Chromeમાં Google આસિસ્ટંટ રોકાઈ રહ્યું છે</translation> <translation id="6305205051461490394"><ph name="URL" />, પહોંચવા યોગ્ય નથી.</translation> <translation id="6321917430147971392">તમારી DNS સેટિંગ્સ તપાસો</translation> +<translation id="6322182122604171028">Windows Helloનો ઉપયોગ કરી શક્યાં નથી</translation> <translation id="6328639280570009161">નેટવર્ક પૂર્વાનુમાનને અક્ષમ કરવાનો પ્રયાસ કરો</translation> <translation id="6328784461820205019">"તમારું કનેક્શન ખાનગી નથી" અથવા "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" અથવા "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" અથવા "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" અથવા "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" અથવા "SSL પ્રમાણપત્ર ભૂલ"</translation> <translation id="6328786501058569169">આ સાઇટ ભ્રામક છે</translation> @@ -1017,6 +1024,7 @@ <translation id="6433490469411711332">સંપર્ક માહિતીમાં ફેરફાર કરો</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> એ કનેક્ટ કરવાનો ઇનકાર કર્યો.</translation> <translation id="6434309073475700221">કાઢી નાખો</translation> +<translation id="6435221585574090192">Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવા દ્વારા ચિહ્નિત કરવામાં આવેલી સુરક્ષા ઇવેન્ટ વિશેનો ડેટા તમારા વ્યવસ્થાપક સાથે શેર કરો. આમાં પેજની URLs, ફાઇલનું નામ અને ફાઇલ મેટાડેટા, તમારું ડિવાઇસ વપરાશકર્તા નામ અને Chrome વપરાશકર્તા નામનો સમાવેશ હોય શકે.</translation> <translation id="6440503408713884761">અવગણી</translation> <translation id="6446163441502663861">Kahu (એન્વલપ)</translation> <translation id="6446608382365791566">વધુ માહિતી ઉમેરો</translation> @@ -1061,6 +1069,7 @@ <translation id="6671697161687535275">Chromium માંથી ફોર્મ સૂચન દૂર કરીએ?</translation> <translation id="6685834062052613830">સાઇન આઉટ કરો અને સેટઅપ પૂર્ણ કરો</translation> <translation id="6689271823431384964">તમે સાઇન ઇન કરેલું છે તેથી Chrome તમને તમારા કાર્ડ તમારા Google એકાઉન્ટમાં સાચવવાની ઑફર કરે છે. તમે સેટિંગમાં આ વર્તણૂકને બદલી શકો છો. કાર્ડધારકનું નામ તમારા એકાઉન્ટમાંથી આવે છે.</translation> +<translation id="6707256370811247129">તમે Chromeમાં ડાઉનલોડ અથવા અપલોડ કરો છો તે કૅશ મેમરી અને ફાઇલોનું કન્ટેન્ટ તપાસો.</translation> <translation id="6710213216561001401">પાછલી</translation> <translation id="6710594484020273272"><શોધ શબ્દ લખો></translation> <translation id="671076103358959139">નોંધણી ટોકન:</translation> @@ -1079,6 +1088,7 @@ <translation id="681021252041861472">ફરજિયાત</translation> <translation id="6810899417690483278">કસ્ટમાઇઝેશન ID</translation> <translation id="6825578344716086703">તમે <ph name="DOMAIN" /> પર પહોંચવાનો પ્રયાસ કર્યો, પરંતુ સર્વરે નબળા સહી ઍલ્ગોરિધમ (જેમ કે SHA-1)નો ઉપયોગ કરીને સહીિત કરેલું પ્રમાણપત્ર પ્રસ્તુત કર્યું. આનો અર્થ એ છે કે સર્વરે પ્રસ્તુત કરેલા સુરક્ષા પ્રમાણપત્રો બનાવટી હોય શકે છે અને તે સર્વર તમારું અપેક્ષિત સર્વર (તમે કોઈ હુમલાખોર સાથે વાર્તાલાપ કરતા હોય શકે) ન પણ હોય.</translation> +<translation id="6826370046007623921">ડેટા નુકસાન અટકાવ</translation> <translation id="6831043979455480757">અનુવાદ કરો</translation> <translation id="6839929833149231406">ક્ષેત્ર</translation> <translation id="6852204201400771460">ઍપ ફરીથી લોડ કરીએ?</translation> @@ -1225,6 +1235,7 @@ <translation id="7542995811387359312">આપમેળે ક્રેડિટ કાર્ડ ભરણ અક્ષમ કર્યું છે કારણ કે આ ફોર્મ સુરક્ષિત કનેક્શનનો ઉપયોગ કરતું નથી.</translation> <translation id="7548892272833184391">કનેક્શન ભૂલો સુધારો</translation> <translation id="7549584377607005141">આ વેબપેજને તે ડેટાની જરૂર છે જે તમે પહેલાં બરાબર રીતે પ્રદર્શિત થાય તે માટે દાખલ કર્યો હતો. તમે આ ડેટા ફરીથી મોકલી શકો છો, પણ આમ કરીને તમે કોઈપણ ક્રિયા કે જે પેજ પહેલાં જ કરી ચૂક્યું છે તેનું પુનરાવર્તન કરશો.</translation> +<translation id="7550637293666041147">તમારું ડિવાઇસ વપરાશકર્તા નામ અને Chrome વપરાશકર્તા નામ</translation> <translation id="7552846755917812628">નીચેની ટિપને અજમાવો:</translation> <translation id="7554791636758816595">નવું ટૅબ</translation> <translation id="7564049878696755256">તમે તમારા <ph name="ORG_NAME" /> એકાઉન્ટનો ઍક્સેસ ગુમાવી શકો છો અથવા તમને ઓળખ ચોરીનો અનુભવ થઈ શકે છે. Chrome તમને હમણાં જ તમારો પાસવર્ડ બદલવાની ભલામણ કરે છે.</translation> @@ -1239,6 +1250,7 @@ <translation id="7610193165460212391">મૂલ્ય <ph name="VALUE" /> શ્રેણી બહારનું છે.</translation> <translation id="7613889955535752492">સમાપ્તિ: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">તમારી પાસે પેહલાથી જ ડેટા છે જે તમારા Google એકાઉન્ટ પાસવર્ડના વિવિધ વર્ઝનનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરેલો છે.</translation> +<translation id="7625784245512586808">Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવા</translation> <translation id="7633909222644580952">કાર્યપ્રદર્શન ડેટા અને ક્રૅશ રિપોર્ટ</translation> <translation id="7637571805876720304">Chromium માંથી ક્રેડિટ કાર્ડ દૂર કરીએ?</translation> <translation id="7638605456503525968">સીરિયલ પોર્ટ</translation> @@ -1349,6 +1361,7 @@ <translation id="8211406090763984747">કનેક્શન સુરક્ષિત છે</translation> <translation id="8218327578424803826">સોંપાયેલ સ્થાન:</translation> <translation id="8220146938470311105">C7/C6 (એન્વલપ)</translation> +<translation id="8220639454292072926">એન્ટરપ્રાઇઝ રિપોર્ટિંગ</translation> <translation id="8225771182978767009">આ કમ્પ્યુટરને સેટ કરનાર વ્યક્તિએ આ સાઇટને અવરોધિત કરવાનું પસંદ કર્યું છે.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">એક નવી છુપી વિંડોમાં પેજ ખોલો</translation> @@ -1431,6 +1444,7 @@ <translation id="8740359287975076522"><ph name="HOST_NAME" /> નું <abbr id="dnsDefinition">DNS સરનામું</abbr> શોધી શકાયું નથી. સમસ્યાનું નિદાન કરી રહ્યાં છીએ.</translation> <translation id="874846938927089722">સ્વીકૃત ક્રેડિટ અને પ્રિપેઇડ કાર્ડ</translation> <translation id="874918643257405732">આ ટૅબને બુકમાર્ક કરો</translation> +<translation id="8751426954251315517">કૃપા કરીને આગલી વખતે ફરી પ્રયાસ કરો</translation> <translation id="8759274551635299824">આ કાર્ડની સમયસીમા સમાપ્ત થઈ ગઈ છે</translation> <translation id="8761567432415473239">Google Safe Browsing ને તાજેતરમાં <ph name="SITE" /> પર <ph name="BEGIN_LINK" />હાનિકારક પ્રોગ્રામ્સ મળ્યાં<ph name="END_LINK" />.</translation> <translation id="8763927697961133303">USB ઉપકરણ</translation> @@ -1495,6 +1509,7 @@ <translation id="9080712759204168376">ઑર્ડરનો સારાંશ</translation> <translation id="9089260154716455634">બિન-કામકાજી સમય સંબંધી નીતિ:</translation> <translation id="9095388113577226029">વધુ ભાષાઓ...</translation> +<translation id="9098981495403789647">તમારા વ્યવસ્થાપકે તમારા બ્રાઉઝર પર Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવા ચાલુ કરેલી છે. Chrome એન્ટરપ્રાઇઝ જોખમ સંરક્ષણ સેવાને તમારા અમુક ડેટાનો ઍક્સેસ છે.</translation> <translation id="9103872766612412690"><ph name="SITE" /> સામાન્ય રીતે તમારી માહિતીને સુરક્ષિત રાખવા માટે એન્ક્રિપ્શનનો ઉપયોગ કરે છે. જ્યારે આ સમયે Chromium દ્વારા <ph name="SITE" />થી કનેક્ટ કરવાનો પ્રયાસ થયો, ત્યારે વેબસાઇટે અસામાન્ય અને ખોટા લૉગ ઇન વિગતને પાછા મોકલ્યાં. આવું ત્યારે થઈ શકે જ્યારે કોઈ હુમલાખોર <ph name="SITE" /> હોવાનો ડોળ કરવાનો પ્રયાસ કરી રહ્યો હોવ અથવા કોઈ Wi-Fi સાઇન-ઇન સ્ક્રીને કનેક્શનમાં વિક્ષેપ પાડ્યો હોય. તમારી માહિતી હજી પણ સુરક્ષિત છે કારણ કે Chromium એ કોઈ પણ ડેટા વિનિમય થાય એ પહેલાં જ કનેક્શન રોકી દીધું.</translation> <translation id="9106062320799175032">બિલિંગ સરનામું ઉમેરો</translation> <translation id="9114524666733003316">કાર્ડ કન્ફર્મ કરી રહ્યાં છીએ...</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index e6eb61f1..5d26419 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -72,7 +72,7 @@ <translation id="1294154142200295408">अलग-अलग तरह की कमांड-लाइन</translation> <translation id="129553762522093515">हाल ही में बंद किए गए</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />अपनी कुकी साफ़ करके देखें<ph name="END_LINK" /></translation> -<translation id="1307966114820526988">बंद की गईं सुविधाएं</translation> +<translation id="1307966114820526988">बंद की गई सुविधाएं</translation> <translation id="1320233736580025032">पीआरसी1 (एन्वेलप)</translation> <translation id="132301787627749051">क्लिपबोर्ड इमेज खोजें</translation> <translation id="1323433172918577554">और दिखाएं</translation> @@ -803,7 +803,7 @@ <translation id="5251803541071282808">क्लाउड</translation> <translation id="5252000469029418751">सी7 (एन्वेलप)</translation> <translation id="5254958791078852567">ई1</translation> -<translation id="5269999699920406580">सिस्टम-व्यापी रूप से लागू होने वाली सुविधाओं को सिर्फ़ मालिक ही सेट कर सकता है: <ph name="OWNER_EMAIL" /></translation> +<translation id="5269999699920406580">सिस्टम से जुड़ी हुई सुविधाओं को सिर्फ़ मालिक ही सेट कर सकता है: <ph name="OWNER_EMAIL" /></translation> <translation id="5273658854610202413">चेतावनी: इस नीति को PolicyDictionaryMultipleSourceMergeList नीति में बताए अनुसार नहीं मिलाया जा सकता, क्योंकि यह शब्दकोश की उन नीतियों का हिस्सा नहीं है जिन्हें मिलाया जा सकता है.</translation> <translation id="5283044957620376778">बी1</translation> <translation id="528468243742722775">खत्म</translation> @@ -840,7 +840,7 @@ <translation id="5457113250005438886">अमान्य</translation> <translation id="5458150163479425638">{CONTACT,plural, =0{<ph name="CONTACT_PREVIEW" />}=1{<ph name="CONTACT_PREVIEW" /> और <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अन्य}one{<ph name="CONTACT_PREVIEW" /> और <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अन्य}other{<ph name="CONTACT_PREVIEW" /> और <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अन्य}}</translation> <translation id="5470861586879999274">&बदलाव को फिर से लागू करें</translation> -<translation id="5473728911100096288">इन सुविधाओं को चालू करके, आप रोके गए फ़ीचर इस्तेमाल करेंगे जो आने वाले वर्शन में मौजूद नहीं होंगे.</translation> +<translation id="5473728911100096288">इन सुविधाओं को चालू करके, आप रोकी गई सुविधाएं इस्तेमाल करेंगे. ये आने वाले वर्शन में मौजूद नहीं होंगी.</translation> <translation id="5478437291406423475">बी6/सी4 (एन्वेलप)</translation> <translation id="5481076368049295676">यह सामग्री आपके डिवाइस पर ऐसा खतरनाक सॉफ़्टवेयर इंस्टॉल करने की कोशिश कर सकती है जो आपकी जानकारी चुरा सकता है या उसे हटा सकता है. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation> <translation id="54817484435770891">मान्य पता जोड़ें</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 0c4e33d..b07ce15 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"Software di komputer mencegah Chrome terhubung dengan aman ke web" (khusus komputer Windows)</translation> <translation id="1294154142200295408">Variasi baris perintah</translation> <translation id="129553762522093515">Baru saja ditutup</translation> +<translation id="1298536327547837046">Pemindaian Malware</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Coba hapus cookie Anda<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Fitur yang Tidak Digunakan Lagi</translation> <translation id="1320233736580025032">Prc1 (Envelope)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">Batalkan Pembayaran</translation> <translation id="3207960819495026254">Diberi bookmark</translation> <translation id="3209034400446768650">Halaman mungkin dikenakan biaya</translation> +<translation id="3215092763954878852">Tidak dapat menggunakan WebAuthn</translation> <translation id="3225919329040284222">Server menunjukkan sertifikat yang tidak sesuai dengan harapan terpasang. Harapan ini disertakan untuk situs web tertentu dengan keamanan tinggi guna melindungi Anda.</translation> <translation id="3226128629678568754">Tekan tombol muat ulang untuk mengirimkan lagi data yang dibutuhkan untuk memuat halaman ini.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -564,6 +566,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Tidak ada}=1{Dari 1 situs }other{Dari # situs }}</translation> <translation id="397105322502079400">Menghitung...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> diblokir.</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> telah mengaktifkan Perlindungan Ancaman Chrome Enterprise di browser Anda. Perlindungan Ancaman Chrome Enterprise memiliki akses ke beberapa data Anda.</translation> <translation id="3987940399970879459">Kurang dari 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{1 halaman web di sekitar}other{# halaman web di sekitar}}</translation> <translation id="4030383055268325496">&Urungkan penambahan</translation> @@ -632,6 +635,7 @@ <translation id="4277028893293644418">Setel ulang sandi</translation> <translation id="4279811152705618813"><ph name="DEVICE_TYPE" /> Anda dikelola oleh <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Kartu ini telah disimpan di Akun Google Anda}other{Kartu-kartu ini telah disimpan di Akun Google Anda}}</translation> +<translation id="428847186335018806">Pindai file yang Anda download atau upload di Chrome.</translation> <translation id="42981349822642051">Luaskan</translation> <translation id="4302965934281694568">Chou3 (Envelope)</translation> <translation id="4305817255990598646">Alihkan</translation> @@ -670,6 +674,7 @@ <translation id="4506176782989081258">Kesalahan validasi: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">Hubungi admin sistem</translation> <translation id="450710068430902550">Berbagi dengan Administrator</translation> +<translation id="4508814173490746936">Tidak dapat menggunakan Touch ID</translation> <translation id="4510487217173779431">Chou4 (Envelope)</translation> <translation id="4515275063822566619">Kartu dan alamat berasal dari Chrome dan Akun Google (<ph name="ACCOUNT_EMAIL" />). Anda dapat mengelolanya di <ph name="BEGIN_LINK" />Setelan<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> @@ -765,6 +770,7 @@ <translation id="5045550434625856497">Sandi salah</translation> <translation id="5056549851600133418">Artikel untuk Anda</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 terpakai)}other{(# terpakai)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Periksa alamat proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sertifikat server saat ini tidak valid.</translation> <translation id="5087580092889165836">Tambahkan kartu</translation> @@ -994,6 +1000,7 @@ <translation id="6302269476990306341">Asisten Google di Chrome sedang dihentikan</translation> <translation id="6305205051461490394"><ph name="URL" /> tidak dapat dijangkau.</translation> <translation id="6321917430147971392">Periksa setelan DNS Anda</translation> +<translation id="6322182122604171028">Tidak dapat menggunakan Windows Hello</translation> <translation id="6328639280570009161">Coba nonaktifkan prediksi jaringan</translation> <translation id="6328784461820205019">"Koneksi Anda tidak bersifat pribadi" atau "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" atau "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" atau "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" atau "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" atau "SSL certificate error"S</translation> <translation id="6328786501058569169">Situs ini bersifat menipu</translation> @@ -1017,6 +1024,7 @@ <translation id="6433490469411711332">Edit info kontak</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> menolak untuk tersambung.</translation> <translation id="6434309073475700221">Tutup</translation> +<translation id="6435221585574090192">Bagikan data tentang peristiwa keamanan yang telah ditandai oleh Perlindungan Ancaman Chrome Enterprise kepada Administrator Anda. Ini mungkin termasuk URL halaman, nama file dan metadata file, nama pengguna perangkat dan nama pengguna Chrome Anda.</translation> <translation id="6440503408713884761">Diabaikan</translation> <translation id="6446163441502663861">Kahu (Envelope)</translation> <translation id="6446608382365791566">Tambahkan informasi lainnya</translation> @@ -1061,6 +1069,7 @@ <translation id="6671697161687535275">Hapus saran formulir dari Chromium?</translation> <translation id="6685834062052613830">Keluar dan selesaikan penyiapan</translation> <translation id="6689271823431384964">Chrome menawarkan untuk menyimpan informasi kartu ke Akun Google Anda karena Anda sedang login. Anda dapat mengubah perilaku ini di setelan. Nama pemegang kartu berasal dari akun Anda.</translation> +<translation id="6707256370811247129">Pindai konten cache dan file yang Anda download atau upload di Chrome.</translation> <translation id="6710213216561001401">Sebelumnya</translation> <translation id="6710594484020273272"><Ketik istilah penelusuran></translation> <translation id="671076103358959139">Token Pendaftaran:</translation> @@ -1079,6 +1088,7 @@ <translation id="681021252041861472">Kolom Wajib Diisi</translation> <translation id="6810899417690483278">ID Penyesuaian</translation> <translation id="6825578344716086703">Anda berusaha menjangkau <ph name="DOMAIN" />, tetapi server menyajikan sertifikat yang ditandatangani menggunakan algoritme tanda tangan yang lemah (seperti SHA-1). Hal ini berarti kredensial keamanan yang disajikan server mungkin telah dipalsukan, dan server tersebut mungkin bukan yang diharapkan (Anda mungkin sedang berkomunikasi dengan penyerang).</translation> +<translation id="6826370046007623921">Pencegahan Kebocoran Data</translation> <translation id="6831043979455480757">Terjemahkan</translation> <translation id="6839929833149231406">Wilayah</translation> <translation id="6852204201400771460">Muat ulang aplikasi?</translation> @@ -1223,6 +1233,7 @@ <translation id="7542995811387359312">Pengisian kartu kredit otomatis dinonaktifkan karena formulir ini tidak menggunakan sambungan aman.</translation> <translation id="7548892272833184391">Memperbaiki error koneksi</translation> <translation id="7549584377607005141">Halaman web ini membutuhkan data yang Anda masukkan sebelumnya agar dapat ditampilkan dengan benar. Anda dapat mengirimkan data ini lagi, namun dengan begitu Anda akan mengulangi tindakan apa pun yang sebelumnya dilakukan oleh halaman ini.</translation> +<translation id="7550637293666041147">Nama pengguna perangkat dan nama pengguna Chrome Anda</translation> <translation id="7552846755917812628">Coba tips berikut:</translation> <translation id="7554791636758816595">Tab Baru</translation> <translation id="7564049878696755256">Anda dapat kehilangan akses ke akun <ph name="ORG_NAME" /> atau mengalami pencurian identitas. Chrome menyarankan Anda untuk mengubah sandi sekarang.</translation> @@ -1237,6 +1248,7 @@ <translation id="7610193165460212391">Nilai di luar jangkauan <ph name="VALUE" />.</translation> <translation id="7613889955535752492">Masa berlaku habis: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Anda sudah memiliki data yang dienkripsi menggunakan versi sandi Akun Google yang berbeda. Masukkan sandi di bawah.</translation> +<translation id="7625784245512586808">Perlindungan Ancaman Chrome Enterprise</translation> <translation id="7633909222644580952">Data performa dan laporan kerusakan</translation> <translation id="7637571805876720304">Hapus kartu kredit dari Chromium?</translation> <translation id="7638605456503525968">Port serial</translation> @@ -1347,6 +1359,7 @@ <translation id="8211406090763984747">Koneksi aman</translation> <translation id="8218327578424803826">Lokasi yang Ditetapkan:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> +<translation id="8220639454292072926">Pelaporan Perusahaan</translation> <translation id="8225771182978767009">Orang yang menyiapkan komputer ini telah memilih untuk memblokir situs ini.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Buka halaman dalam tab Samaran baru</translation> @@ -1427,6 +1440,7 @@ <translation id="8740359287975076522"><abbr id="dnsDefinition">Alamat DNS</abbr> <ph name="HOST_NAME" /> tidak dapat ditemukan. Mendiagnosis masalah.</translation> <translation id="874846938927089722">Kartu Kredit dan Prabayar yang Diterima</translation> <translation id="874918643257405732">Bookmark tab ini</translation> +<translation id="8751426954251315517">Coba lagi lain waktu</translation> <translation id="8759274551635299824">Kartu sudah tidak aktif</translation> <translation id="8761567432415473239">Google Safe Browsing baru-baru ini <ph name="BEGIN_LINK" />menemukan program berbahaya<ph name="END_LINK" /> di <ph name="SITE" />.</translation> <translation id="8763927697961133303">Perangkat USB</translation> @@ -1491,6 +1505,7 @@ <translation id="9080712759204168376">Ringkasan Pesanan</translation> <translation id="9089260154716455634">Kebijakan Waktu Nonaktif:</translation> <translation id="9095388113577226029">Bahasa lainnya...</translation> +<translation id="9098981495403789647">Administrator Anda telah mengaktifkan Perlindungan Ancaman Chrome Enterprise di browser Anda. Perlindungan Ancaman Chrome Enterprise memiliki akses ke beberapa data Anda.</translation> <translation id="9103872766612412690"><ph name="SITE" /> biasanya menggunakan enkripsi untuk melindungi informasi Anda. Saat Chromium mencoba menyambung ke <ph name="SITE" /> kali ini, situs web mengembalikan kredensial yang salah dan tidak biasa. Hal ini dapat terjadi jika ada penyerang yang berpura-pura menjadi <ph name="SITE" />, atau layar masuk Wi-Fi mengganggu sambungan. Informasi Anda masih aman karena Chromium menghentikan sambungan sebelum terjadi pertukaran data apa pun.</translation> <translation id="9106062320799175032">Tambahkan Alamat Penagihan</translation> <translation id="9114524666733003316">Mengonfirmasi kartu...</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 001074a..ff8fce6 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"വെബിലേക്ക് സുരക്ഷിതമായി കണക്റ്റ് ചെയ്യുന്നതിൽ നിന്ന് Chrome-നെ നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ സോഫ്റ്റ്വെയർ തടയുന്നു" (Windows കമ്പ്യൂട്ടറുകളിൽ മാത്രം)</translation> <translation id="1294154142200295408">കമാൻഡ്-ലൈൻ വ്യതിയാനങ്ങൾ</translation> <translation id="129553762522093515">സമീപകാലത്ത് അടച്ചവ</translation> +<translation id="1298536327547837046">മാൽവേർ സ്കാനിംഗ് ഫീച്ചർ</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />നിങ്ങളുടെ കുക്കികൾ മായ്ക്കുന്നത് പരീക്ഷിക്കുക<ph name="END_LINK" /></translation> <translation id="1307966114820526988">അവസാനിപ്പിച്ച ഫീച്ചറുകൾ</translation> <translation id="1320233736580025032">Prc1 (എൻവലപ്പ്)</translation> @@ -426,6 +427,7 @@ <translation id="320323717674993345">പേയ്മെന്റ് റദ്ദാക്കുക</translation> <translation id="3207960819495026254">ബുക്ക്മാർക്കുചെയ്തു</translation> <translation id="3209034400446768650">പേജ് പണം ഈടാക്കിയേക്കാം</translation> +<translation id="3215092763954878852">WebAuthn ഉപയോഗിക്കാനായില്ല</translation> <translation id="3225919329040284222">ബിൽട്ട്-ഇൻ പ്രതീക്ഷകള്ക്ക് പൊരുത്തപ്പെടാത്ത സര്ട്ടിഫിക്കറ്റാണ് സെര്വര് അവതരിപ്പിച്ചത്. നിങ്ങളെ സംരക്ഷിക്കുന്നതിലേക്കായുള്ള നിശ്ചിത, ഉന്നത-സുരക്ഷാ വെബ്സൈറ്റുകൾക്കായാണ് ഈ പ്രതീക്ഷകൾ ഉൾപ്പെടുത്തിയിരിക്കുന്നത്.</translation> <translation id="3226128629678568754">പേജ് ലോഡ് ചെയ്യുന്നതിനാവശ്യമായ ഡാറ്റ വീണ്ടും സമർപ്പിക്കാൻ വീണ്ടും ലോഡ് ചെയ്യുക ബട്ടൺ അമർത്തുക.</translation> <translation id="3227137524299004712">മൈക്രോഫോൺ</translation> @@ -562,6 +564,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു സൈറ്റിൽ നിന്ന് }other{# സൈറ്റുകളിൽ നിന്ന് }}</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്തിരിക്കുന്നു</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> നിങ്ങളുടെ ബ്രൗസറിൽ Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷ പ്രവർത്തനക്ഷമമാക്കി. Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷയ്ക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസുണ്ട്.</translation> <translation id="3987940399970879459">ഒരു MB-യിൽ കുറവാണ്</translation> <translation id="40103911065039147">{URL_count,plural, =1{സമീപത്ത് ഒരു വെബ് പേജുണ്ട്}other{സമീപത്ത് # വെബ് പേജുകളുണ്ട്}}</translation> <translation id="4030383055268325496">&ചേർത്തത് പഴയപടിയാക്കുക</translation> @@ -629,6 +632,7 @@ <translation id="4277028893293644418">പാസ്വേഡ് റീസെറ്റ് ചെയ്യുക</translation> <translation id="4279811152705618813">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> മാനേജ് ചെയ്യുന്നത് <ph name="ENROLLMENT_DOMAIN" /> ആണ്</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{ഈ കാർഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിച്ചു}other{ഈ കാർഡുകൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിച്ചു}}</translation> +<translation id="428847186335018806">Chrome-ൽ നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്നതോ അപ്ലോഡ് ചെയ്യുന്നതോ ആയ ഫയലുകൾ സ്കാൻ ചെയ്യുക.</translation> <translation id="42981349822642051">വികസിപ്പിക്കുക</translation> <translation id="4302965934281694568">Chou3 (എൻവലപ്പ്)</translation> <translation id="4305817255990598646">സ്വിച്ച് ചെയ്യുക</translation> @@ -667,6 +671,7 @@ <translation id="4506176782989081258">മൂല്യനിർണ്ണയ പിശക്: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">സിസ്റ്റം അഡ്മിനെ ബന്ധപ്പെടുന്നു</translation> <translation id="450710068430902550">അഡ്മിനിസ്ട്രേറ്ററുമായി പങ്കിടുന്നു</translation> +<translation id="4508814173490746936">ടച്ച് ഐഡി ഉപയോഗിക്കാനായില്ല</translation> <translation id="4510487217173779431">Chou4 (എൻവലപ്പ്)</translation> <translation id="4515275063822566619">കാർഡുകളും വിലാസങ്ങളും Chrome-ൽ നിന്നും നിങ്ങളുടെ അക്കൗണ്ടിൽ (<ph name="ACCOUNT_EMAIL" />) നിന്നുമുള്ളതുമാണ്. നിങ്ങൾക്ക് ഇവ <ph name="BEGIN_LINK" />ക്രമീകരണത്തിൽ<ph name="END_LINK" /> മാനേജ് ചെയ്യാം.</translation> <translation id="4517607026994743406">Comm-10 (എൻവലപ്പ്)</translation> @@ -762,6 +767,7 @@ <translation id="5045550434625856497">പാസ്വേഡ് തെറ്റാണ്</translation> <translation id="5056549851600133418">നിങ്ങൾക്കുള്ള ലേഖനങ്ങൾ</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(ഒരെണ്ണം ഉപയോഗത്തിലാണ്)}other{(# എണ്ണം ഉപയോഗത്തിലാണ്)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />പ്രോക്സി വിലാസം പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> <translation id="5087286274860437796">സെർവറിന്റെ സർട്ടിഫിക്കറ്റിന് ഇപ്പോൾ സാധുതയില്ല.</translation> <translation id="5087580092889165836">കാർഡ് ചേർക്കുക</translation> @@ -990,6 +996,7 @@ <translation id="6302269476990306341">Chrome സ്വമേധയാ പൂരിപ്പിക്കൽ നിർത്തുന്നതിലെ Google അസിസ്റ്റന്റ് സാന്നിധ്യം</translation> <translation id="6305205051461490394"><ph name="URL" /> ലഭ്യമല്ല.</translation> <translation id="6321917430147971392">നിങ്ങളുടെ DNS ക്രമീകരണങ്ങൾ പരിശോധിക്കുക</translation> +<translation id="6322182122604171028">Windows Hello ഉപയോഗിക്കാനായില്ല</translation> <translation id="6328639280570009161">നെറ്റ്വർക്ക് പ്രവചനം പ്രവർത്തനരഹിതമാക്കാൻ ശ്രമിക്കുക</translation> <translation id="6328784461820205019">"നിങ്ങളുടെ കണക്ഷൻ സ്വകാര്യമല്ല" അല്ലെങ്കിൽ "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" അല്ലെങ്കിൽ "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" അല്ലെങ്കിൽ "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" അല്ലെങ്കിൽ "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" അല്ലെങ്കിൽ "SSL സർട്ടിഫിക്കറ്റ് പിശക്"</translation> <translation id="6328786501058569169">ഈ സൈറ്റ് വഞ്ചനാപരമായതാണ്</translation> @@ -1013,6 +1020,7 @@ <translation id="6433490469411711332">കോൺടാക്റ്റ് വിവരം എഡിറ്റുചെയ്യുക</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> കണക്റ്റുചെയ്യൽ നിരസിച്ചു.</translation> <translation id="6434309073475700221">നിരാകരിക്കുക</translation> +<translation id="6435221585574090192">Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷ ഫ്ലാഗ് ചെയ്ത സുരക്ഷാ ഇവന്റുകളെക്കുറിച്ചുള്ള ഡാറ്റ നിങ്ങളുടെ അഡ്മിനുമായി പങ്കിടുക. പേജ് url-കൾ, ഫയലിന്റെ പേര്, ഫയൽ മെറ്റാഡാറ്റ, നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉപയോക്തൃനാമം, Chrome ഉപയോക്തൃനാമം എന്നിവ ഇവയിൽ ഉൾപ്പെട്ടേക്കാം.</translation> <translation id="6440503408713884761">അവഗണിച്ചു</translation> <translation id="6446163441502663861">കഹു (എൻവലപ്പ്)</translation> <translation id="6446608382365791566">കൂടുതൽ വിവരങ്ങൾ ചേർക്കുക</translation> @@ -1057,6 +1065,7 @@ <translation id="6671697161687535275">Chromium-ത്തിൽ നിന്ന് ഫോം നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation> <translation id="6685834062052613830">സൈൻ ഔട്ട് ചെയ്ത്, സജ്ജമാക്കൽ പൂർത്തിയാക്കുക</translation> <translation id="6689271823431384964">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്നതിനാലാണ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡുകൾ സംരക്ഷിക്കാമെന്ന് Chrome വാഗ്ദാനം ചെയ്യുന്നത്. ക്രമീകരണത്തിൽ ഈ രീതി മാറ്റാനാകും. കാർഡുടമയുടെ പേര് നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്നുമാണ് വന്നത്.</translation> +<translation id="6707256370811247129">നിങ്ങൾ Chrome-ൽ അപ്ലോഡ് ചെയ്യുന്നതോ ഡൗൺലോഡ് ചെയ്യുന്നതോ ആയ ഫയലുകളും കാഷെയുടെ ഉള്ളടക്കങ്ങളും സ്കാൻ ചെയ്യുക.</translation> <translation id="6710213216561001401">കഴിഞ്ഞ</translation> <translation id="6710594484020273272"><തിരയൽ പദം നൽകുക></translation> <translation id="671076103358959139">എന്റോള്മെന്റ് ടോക്കണ്:</translation> @@ -1075,6 +1084,7 @@ <translation id="681021252041861472">ഇത് പൂരിപ്പിക്കേണ്ടതുണ്ട്</translation> <translation id="6810899417690483278">ഇഷ്ടാനുസൃതമാക്കൽ ഐഡി</translation> <translation id="6825578344716086703">നിങ്ങൾ <ph name="DOMAIN" /> എന്നതിൽ എത്താൻ ശ്രമിച്ചു, പക്ഷേ ഒരു ദുർബലമായ സിഗ്നേച്ചർ അൽഗോരിതം ഉപയോഗിച്ച് ഒപ്പിട്ട ഒരു സർട്ടിഫിക്കറ്റ് സെർവർ നൽകി. ഇതിനർത്ഥം സെർവർ നൽകിയ സുരക്ഷാ ക്രെഡൻഷ്യലുകൾ വ്യാജമാകാമെന്നും നിങ്ങൾ ഉദ്ദേശിച്ച സെർവർ ആയിരിക്കില്ല എന്നുമാണ് (നിങ്ങൾ ആക്രമണകാരിയുമായിട്ടാകാം ആശയവിനിമയം നടത്തുന്നത്).</translation> +<translation id="6826370046007623921">ഡാറ്റാ നഷ്ടം തടയൽ ഫീച്ചർ</translation> <translation id="6831043979455480757">വിവർത്തനം ചെയ്യുക</translation> <translation id="6839929833149231406">ഏരിയ</translation> <translation id="6852204201400771460">ആപ്പ് റീലോഡ് ചെയ്യണോ?</translation> @@ -1219,6 +1229,7 @@ <translation id="7542995811387359312">ഈ ഫോം ഒരു സുരക്ഷിത കണക്ഷന് ഉപയോഗിക്കാത്തതിനാല് സ്വപ്രേരിത ക്രെഡിറ്റ് കാര്ഡ് പൂരിപ്പിക്കല് അപ്രാപ്തമാക്കി.</translation> <translation id="7548892272833184391">കണക്ഷൻ പിശകുകൾ പരിഹരിക്കുക</translation> <translation id="7549584377607005141">ശരിയായി പ്രദർശിപ്പിക്കാൻ ഈ വെബ് പേജിന് നിങ്ങൾ മുമ്പ് നൽകിയ ഡാറ്റ ആവശ്യമാണ്. നിങ്ങൾക്ക് ഈ ഡാറ്റ വീണ്ടും അയയ്ക്കാനാകുമെങ്കിലും, അങ്ങനെ ചെയ്യുന്നത് ഈ പേജിൽ മുമ്പ് ചെയ്ത ഏത് പ്രവർത്തനവും നിങ്ങൾക്ക് ആവർത്തിക്കേണ്ടതായി വരും.</translation> +<translation id="7550637293666041147">നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉപയോക്തൃനാമവും Chrome ഉപയോക്തൃനാമവും</translation> <translation id="7552846755917812628">ഇനിപ്പറയുന്ന നുറുങ്ങുകൾ പരീക്ഷിക്കൂ:</translation> <translation id="7554791636758816595">പുതിയ ടാബ്</translation> <translation id="7564049878696755256">നിങ്ങളുടെ <ph name="ORG_NAME" /> അക്കൗണ്ടിലേക്കുള്ള ആക്സസ് നഷ്ടമാകാനോ ഐഡന്റിറ്റി മോഷ്ടിക്കപ്പെടാനോ സാധ്യതയുണ്ട്. ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> @@ -1233,6 +1244,7 @@ <translation id="7610193165460212391">മൂല്യം പരിധിക്ക് പുറത്താണ് <ph name="VALUE" />.</translation> <translation id="7613889955535752492">കാലഹരണപ്പെടുന്നത്: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Google അക്കൗണ്ട് പാസ്വേഡിന്റെ വ്യത്യസ്ത പതിപ്പ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്ത ഡേറ്റ ഇപ്പോൾ തന്നെ നിങ്ങളുടെ കൈവശമുണ്ട്. ആ പാസ്വേഡ് താഴെ നൽകുക.</translation> +<translation id="7625784245512586808">Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷ</translation> <translation id="7633909222644580952">പ്രകടന ഡാറ്റയും ക്രാഷ് റിപ്പോർട്ടുകളും</translation> <translation id="7637571805876720304">Chromium-ൽ നിന്ന് ക്രെഡിറ്റ് കാർഡ് നീക്കംചെയ്യണോ?</translation> <translation id="7638605456503525968">സീരിയൽ പോർട്ടുകൾ</translation> @@ -1343,6 +1355,7 @@ <translation id="8211406090763984747">കണക്ഷൻ സുരക്ഷിതമാണ്</translation> <translation id="8218327578424803826">നൽകിയിരിക്കുന്ന ലൊക്കേഷൻ:</translation> <translation id="8220146938470311105">C7/C6 (എൻവലപ്പ്)</translation> +<translation id="8220639454292072926">എന്റർപ്രൈസ് റിപ്പോർട്ടിംഗ് ഫീച്ചർ</translation> <translation id="8225771182978767009">ഈ കമ്പ്യൂട്ടർ സജ്ജമാക്കിയ വ്യക്തി, ഈ സൈറ്റ് ബ്ലോക്ക് ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">പുതിയൊരു അദൃശ്യ ടാബിൽ പേജ് തുറക്കുക</translation> @@ -1425,6 +1438,7 @@ <translation id="8740359287975076522"><ph name="HOST_NAME" /> ഹോസ്റ്റിന്റെ <abbr id="dnsDefinition">DNS വിലാസം</abbr> കണ്ടെത്താനായില്ല. പ്രശ്നം നിർണ്ണയിക്കുന്നു.</translation> <translation id="874846938927089722">സ്വീകരിക്കുന്ന ക്രെഡിറ്റ് കാർഡുകളും പ്രീപെയ്ഡ് കാർഡുകളും</translation> <translation id="874918643257405732">ഈ ടാബ് ബുക്ക്മാർക്ക് ചെയ്യുക</translation> +<translation id="8751426954251315517">പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation> <translation id="8759274551635299824">ഈ കാർഡ് കാലഹരണപ്പെട്ടു</translation> <translation id="8761567432415473239">Google സുരക്ഷിത ബ്രൗസിംഗ് <ph name="SITE" /> എന്നതിൽ ഈയിടെ <ph name="BEGIN_LINK" />ദോഷകരമായ പ്രോഗ്രാമുകൾ കണ്ടെത്തി<ph name="END_LINK" />.</translation> <translation id="8763927697961133303">USB ഉപകരണം</translation> @@ -1489,6 +1503,7 @@ <translation id="9080712759204168376">ഓർഡർ സംഗ്രഹം</translation> <translation id="9089260154716455634">ഓഫ് അവേഴ്സ് നയം:</translation> <translation id="9095388113577226029">കൂടുതൽ ഭാഷകൾ...</translation> +<translation id="9098981495403789647">നിങ്ങളുടെ ബ്രൗസറിൽ Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷ അഡ്മിൻ പ്രവർത്തനക്ഷമമാക്കി. Chrome എന്റർപ്രൈസ് ഭീഷണി പരിരക്ഷയ്ക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസുണ്ട്.</translation> <translation id="9103872766612412690">നിങ്ങളുടെ വിവരങ്ങൾ പരിരക്ഷിക്കാൻ സാധാരണയായി <ph name="SITE" />, എൻക്രിപ്ഷൻ ഉപയോഗിക്കുന്നു. ഇപ്പോൾ <ph name="SITE" /> സൈറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാൻ Chromium ശ്രമിച്ചപ്പോൾ, അസാധാരണമായതും തെറ്റായതുമായ ക്രെഡൻഷ്യലുകൾ വെബ്സൈറ്റ് തിരികെ അയച്ചു. ഒരു ആക്രമണകാരി <ph name="SITE" /> എന്നതായി ഭാവിക്കാൻ ശ്രമിക്കുമ്പോഴോ Wi-Fi സൈൻ ഇൻ സ്ക്രീൻ, കണക്ഷനെ തടസ്സപ്പെടുത്തുമ്പോഴോ ആണ് ഇങ്ങനെ സംഭവിക്കാനിടയുള്ളത്. ഏതെങ്കിലും ഡാറ്റ കൈമാറുന്നതിനുമുമ്പ് Chromium കണക്ഷൻ അവസാനിപ്പിച്ചതിനാൽ, നിങ്ങളുടെ വിവരങ്ങൾ തുടർന്നും സുരക്ഷിതമായിരിക്കും.</translation> <translation id="9106062320799175032">ബില്ലിംഗ് വിലാസം ചേർക്കുക</translation> <translation id="9114524666733003316">കാർഡ് സ്ഥിരീകരിക്കുന്നു...</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index e1bcc29..9469577 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">«Det er programvare på datamaskinen din som hindrer Chrome i å koble trygt til Internett» (bare på Windows-datamaskiner)</translation> <translation id="1294154142200295408">Variasjoner i kommandolinjen</translation> <translation id="129553762522093515">Nylig lukket</translation> +<translation id="1298536327547837046">Gjennomsøking etter skadelig programvare</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Prøv å slette informasjonskapslene dine<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Avviklede funksjoner</translation> <translation id="1320233736580025032">Prc1 (konvolutt)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">Avbryt betalingen</translation> <translation id="3207960819495026254">Bokmerket</translation> <translation id="3209034400446768650">Siden kan belaste deg for penger</translation> +<translation id="3215092763954878852">Kunne ikke bruke WebAuthn</translation> <translation id="3225919329040284222">Tjeneren oppga et sertifikat som ikke samsvarte med innebygde forventninger. Disse forventningene benyttes for visse nettsteder med høy sikkerhet, og brukes for å beskytte deg.</translation> <translation id="3226128629678568754">Trykk på knappen for å laste inn på nytt, for å sende inn dataene som trengs for å laste inn siden på nytt.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -565,6 +567,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Ingen}=1{Fra 1 nettsted }other{Fra # nettsteder }}</translation> <translation id="397105322502079400">Beregner …</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokkert</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> har slått på Chrome Enterprise trusselbeskyttelse i nettleseren din. Chrome Enterprise trusselbeskyttelse har tilgang til noen av dataene dine.</translation> <translation id="3987940399970879459">Under 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{1 Like ved-nettside}other{# Like ved-nettsider}}</translation> <translation id="4030383055268325496">&Angre tilleggingen</translation> @@ -633,6 +636,7 @@ <translation id="4277028893293644418">Tilbakestill passordet</translation> <translation id="4279811152705618813"><ph name="DEVICE_TYPE" /> administreres av <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Dette kortet er lagret i Google-kontoen din}other{Disse kortene er lagret i Google-kontoen din}}</translation> +<translation id="428847186335018806">Gjennomsøk filer du laster ned eller opp i Chrome.</translation> <translation id="42981349822642051">Vis</translation> <translation id="4302965934281694568">Chou3 (konvolutt)</translation> <translation id="4305817255990598646">Bytt</translation> @@ -671,6 +675,7 @@ <translation id="4506176782989081258">Valideringsfeil: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">Kontakt systemadministratoren</translation> <translation id="450710068430902550">Deling med administratoren</translation> +<translation id="4508814173490746936">Kunne ikke bruke Touch ID</translation> <translation id="4510487217173779431">Chou4 (konvolutt)</translation> <translation id="4515275063822566619">Kortene og adressene er fra Chrome og Google-kontoen din (<ph name="ACCOUNT_EMAIL" />). Du kan administrere dem i <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (konvolutt)</translation> @@ -766,6 +771,7 @@ <translation id="5045550434625856497">Feil passord</translation> <translation id="5056549851600133418">Artikler for deg</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 i bruk)}other{(# i bruk)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sjekk proxy-tjeneradressen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sertifikatet til tjeneren er ikke gyldig for øyeblikket.</translation> <translation id="5087580092889165836">Legg til et kort</translation> @@ -995,6 +1001,7 @@ <translation id="6302269476990306341">Stopper Google-assistenten i Chrome</translation> <translation id="6305205051461490394"><ph name="URL" /> er ikke tilgjengelig.</translation> <translation id="6321917430147971392">Kontrollér DNS-innstillingene dine</translation> +<translation id="6322182122604171028">Kunne ikke bruke Windows Hello</translation> <translation id="6328639280570009161">Prøv å slå av nettverksforutsigelse</translation> <translation id="6328784461820205019">«Tilkoblingen din er ikke privat», «<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>», «<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>», «<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>», «<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>» eller «SSL-sertifikatfeil»</translation> <translation id="6328786501058569169">Dette nettstedet er villedende</translation> @@ -1018,6 +1025,7 @@ <translation id="6433490469411711332">Endre kontaktinformasjonen</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> avviste tilkoblingsforsøket.</translation> <translation id="6434309073475700221">Forkast</translation> +<translation id="6435221585574090192">Del data om sikkerhetshendelser som er rapport av Chrome Enterprise trusselbeskyttelse, med administratoren. Dette kan blant annet være nettsideadresser, filnavn og -metadata samt brukernavnet ditt på enheten og i Chrome.</translation> <translation id="6440503408713884761">Ignorert</translation> <translation id="6446163441502663861">Kahu (konvolutt)</translation> <translation id="6446608382365791566">Legg til mer informasjon</translation> @@ -1062,6 +1070,7 @@ <translation id="6671697161687535275">Vil du fjerne forslaget fra Chromium?</translation> <translation id="6685834062052613830">Logg av og fullfør konfigurasjonen</translation> <translation id="6689271823431384964">Chrome tilbyr å lagre kort i Google-kontoen din fordi du er logget på. Du kan endre dette i innstillingene. Kortinnehaverens navn kommer fra kontoen din.</translation> +<translation id="6707256370811247129">Gjennomsøk innholdet i bufferen og filene du laster ned eller opp i Chrome.</translation> <translation id="6710213216561001401">Forrige</translation> <translation id="6710594484020273272"><Skriv inn en søketerm></translation> <translation id="671076103358959139">Registreringstoken:</translation> @@ -1080,6 +1089,7 @@ <translation id="681021252041861472">Obligatorisk felt</translation> <translation id="6810899417690483278">Tilpasnings-ID</translation> <translation id="6825578344716086703">Du prøvde å gå til <ph name="DOMAIN" />, men tjeneren presenterte et sertifikat som er signert med en svak signaturalgoritme (for eksempel SHA-1). Dette betyr at sikkerhetslegitimasjonen tjeneren presenterte, kan være forfalsket. Tjeneren kan med andre ord være en annen tjener enn du tror (og du kommuniserer kanskje med en angriper).</translation> +<translation id="6826370046007623921">Forebygging av datatap</translation> <translation id="6831043979455480757">Oversett</translation> <translation id="6839929833149231406">Område</translation> <translation id="6852204201400771460">Vil du laste inn appen på nytt?</translation> @@ -1225,6 +1235,7 @@ <translation id="7542995811387359312">Automatisk utfylling av kredittkort er deaktivert fordi dette skjemaet ikke bruker en sikker tilkobling.</translation> <translation id="7548892272833184391">Fiks tilkoblingsfeil</translation> <translation id="7549584377607005141">Denne nettsiden krever data som du har skrevet inn tidligere for å vises korrekt. Du kan sende inn dataene på nytt, men hvis du gjør det, gjentas eventuelle handlinger denne siden utførte.</translation> +<translation id="7550637293666041147">Brukernavnet ditt på enheten og i Chrome</translation> <translation id="7552846755917812628">Prøv følgende tips:</translation> <translation id="7554791636758816595">Ny fane</translation> <translation id="7564049878696755256">Du kan miste tilgangen til <ph name="ORG_NAME" />-kontoen din eller bli utsatt for identitetstyveri. Chrome anbefaler at du endrer passordet ditt nå.</translation> @@ -1239,6 +1250,7 @@ <translation id="7610193165460212391">Verdien er utenfor rekkevidden <ph name="VALUE" />.</translation> <translation id="7613889955535752492">Utløpsdato: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Du har allerede data som er kryptert med en annen versjon av Google-kontopassordet ditt. Skriv det inn nedenfor.</translation> +<translation id="7625784245512586808">Chrome Enterprise trusselbeskyttelse</translation> <translation id="7633909222644580952">Ytelsesdata og programstopprapporter</translation> <translation id="7637571805876720304">Vil du fjerne kredittkortet fra Chromium?</translation> <translation id="7638605456503525968">Serielle porter</translation> @@ -1349,6 +1361,7 @@ <translation id="8211406090763984747">Tilkoblingen er sikker</translation> <translation id="8218327578424803826">Tilordnet posisjon:</translation> <translation id="8220146938470311105">C7/C6 (konvolutt)</translation> +<translation id="8220639454292072926">Enterprise-rapportering</translation> <translation id="8225771182978767009">Personen som konfigurerte denne datamaskinen, har valgt å blokkere dette nettstedet.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Åpne siden i et nytt inkognitovindu</translation> @@ -1431,6 +1444,7 @@ <translation id="8740359287975076522"><abbr id="dnsDefinition">DNS-adressen</abbr> til <ph name="HOST_NAME" /> ble ikke funnet. Problemet diagnostiseres.</translation> <translation id="874846938927089722">Godkjente kredittkort og forhåndsbetalte kort</translation> <translation id="874918643257405732">Bokmerk denne fanen</translation> +<translation id="8751426954251315517">Prøv på nytt neste gang</translation> <translation id="8759274551635299824">Dette kortet er utløpt</translation> <translation id="8761567432415473239">Google Safe Browsing oppdaget nylig <ph name="BEGIN_LINK" />skadelige programmer<ph name="END_LINK" /> på <ph name="SITE" />.</translation> <translation id="8763927697961133303">USB-enhet</translation> @@ -1495,6 +1509,7 @@ <translation id="9080712759204168376">Bestillingssammendrag</translation> <translation id="9089260154716455634">Regler for bruk utenom arbeidstiden:</translation> <translation id="9095388113577226029">Flere språk</translation> +<translation id="9098981495403789647">Administratoren har slått på Chrome Enterprise trusselbeskyttelse i nettleseren din. Chrome Enterprise trusselbeskyttelse har tilgang til noen av dataene dine.</translation> <translation id="9103872766612412690"><ph name="SITE" /> bruker vanligvis kryptering for å beskytte informasjonen din. Da Chromium prøvde å koble til <ph name="SITE" /> denne gangen, sendte nettstedet tilbake uvanlig og feil legitimasjon. Dette kan skje hvis en angriper prøver å utgi seg for å være <ph name="SITE" />, eller hvis en Wi-Fi-påloggingsskjerm har avbrutt tilkoblingen. Informasjonen din er likevel sikker fordi Chromium stoppet tilkoblingen før det ble utvekslet noen data.</translation> <translation id="9106062320799175032">Legg til faktureringsadresse</translation> <translation id="9114524666733003316">Bekrefter kortet …</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 743c890..d3680fc3 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -863,7 +863,7 @@ <translation id="553484882784876924">Prc6 (конверт)</translation> <translation id="5540224163453853">Не удалось найти указанную статью</translation> <translation id="5541546772353173584">Добавьте адрес электронной почты</translation> -<translation id="5545756402275714221">Новости для вас</translation> +<translation id="5545756402275714221">Статьи для вас</translation> <translation id="5556459405103347317">Перезагрузить</translation> <translation id="5560088892362098740">Дата окончания срока действия</translation> <translation id="5565735124758917034">Активен</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 7958b79..599df770 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">Programvara på datorn förhindrar att Chrome ansluter till internet på ett säkert sätt (endast Windows-datorer)</translation> <translation id="1294154142200295408">Varianter på kommandoraden</translation> <translation id="129553762522093515">Nyligen stängda</translation> +<translation id="1298536327547837046">Genomsökning efter skadlig programvara</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Testa att rensa cookies<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Utfasade funktioner</translation> <translation id="1320233736580025032">Prc1 (kuvert)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">Avbryt betalningen</translation> <translation id="3207960819495026254">Bokmärkt</translation> <translation id="3209034400446768650">Sidan kan vara avgiftsbelagd</translation> +<translation id="3215092763954878852">Det gick inte att använda WebAuthn</translation> <translation id="3225919329040284222">Ett certifikat som inte överensstämmer med inbyggda förväntningar presenterades på servern. Förväntningarna gäller för webbplatser med hög säkerhet för att skydda dig.</translation> <translation id="3226128629678568754">Om du på nytt vill skicka datan som behövs för att läsa in sidan trycker du på knappen Läs in igen.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -565,6 +567,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Ingen}=1{Från 1 webbplats }other{Från # webbplatser }}</translation> <translation id="397105322502079400">Beräknar ...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> har blockerats</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> har aktiverat skydd mot hot i Chrome Enterprise i webbläsaren. Skyddet mot hot i Chrome Enterprise har tillgång till en del av din data.</translation> <translation id="3987940399970879459">Mindre än 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{1 webbsida i närheten}other{# webbsidor i närheten}}</translation> <translation id="4030383055268325496">&Ångra Lägg till</translation> @@ -633,6 +636,7 @@ <translation id="4277028893293644418">Återställ lösenord</translation> <translation id="4279811152705618813">Din <ph name="DEVICE_TYPE" /> hanteras av <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Det här kortet har sparats i ditt Google-konto}other{De här korten har sparats i ditt Google-konto}}</translation> +<translation id="428847186335018806">Genomsök filer som du laddar ned eller laddar upp i Chrome.</translation> <translation id="42981349822642051">Expandera</translation> <translation id="4302965934281694568">Chou3 (kuvert)</translation> <translation id="4305817255990598646">Byt</translation> @@ -671,6 +675,7 @@ <translation id="4506176782989081258">Valideringsfel: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">kontakta systemadministratören</translation> <translation id="450710068430902550">Delad med en administratör</translation> +<translation id="4508814173490746936">Det gick inte att använda Touch ID</translation> <translation id="4510487217173779431">Chou4 (kuvert)</translation> <translation id="4515275063822566619">Kort och adresser har hämtats från Chrome och ditt Google-konto (<ph name="ACCOUNT_EMAIL" />). Du hanterar dessa under <ph name="BEGIN_LINK" />Inställningar<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (kuvert)</translation> @@ -766,6 +771,7 @@ <translation id="5045550434625856497">Felaktigt lösenord</translation> <translation id="5056549851600133418">Artiklar för dig</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 används)}other{(# används)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />kontrollera proxyadressen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Servercertifikatet är inte giltigt för närvarande.</translation> <translation id="5087580092889165836">Lägg till kort</translation> @@ -995,6 +1001,7 @@ <translation id="6302269476990306341">Google-assistenten i Chrome stoppas</translation> <translation id="6305205051461490394"><ph name="URL" /> kan inte nås.</translation> <translation id="6321917430147971392">Kontrollera DNS-inställningarna</translation> +<translation id="6322182122604171028">Det gick inte att använda Windows Hello</translation> <translation id="6328639280570009161">Prova att inaktivera nätverksförslag</translation> <translation id="6328784461820205019">Anslutningen är inte privat eller <span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span> eller <span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span> eller <span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span> eller <span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>eller SSL-certifikatfel</translation> <translation id="6328786501058569169">Den här webbplatsen är bedräglig</translation> @@ -1018,6 +1025,7 @@ <translation id="6433490469411711332">Redigera kontaktuppgifter</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> avvisade anslutningen.</translation> <translation id="6434309073475700221">Kasta</translation> +<translation id="6435221585574090192">Dela data om säkerhetshändelser som flaggats av skyddet mot hot i Chrome Enterprise med administratören. Det kan t.ex. vara webbadresser, filnamn och metadata om filer, ditt användarnamn på enheten och ditt användarnamn i Chrome.</translation> <translation id="6440503408713884761">Ignoreras</translation> <translation id="6446163441502663861">Kahu (kuvert)</translation> <translation id="6446608382365791566">Lägg till mer information</translation> @@ -1062,6 +1070,7 @@ <translation id="6671697161687535275">Vill du ta bort formulärförslaget från Chromium?</translation> <translation id="6685834062052613830">Logga ut och slutför konfigureringen</translation> <translation id="6689271823431384964">Chrome ger möjlighet att spara dina kort i ditt Google-konto eftersom du är inloggad. Du kan ändra detta i inställningarna. Kortinnehavarens namn hämtas från ditt konto.</translation> +<translation id="6707256370811247129">Genomsök cacheminnet och filer som du laddar ned eller laddar upp i Chrome.</translation> <translation id="6710213216561001401">Föregående</translation> <translation id="6710594484020273272"><Ange sökterm></translation> <translation id="671076103358959139">Registreringstoken:</translation> @@ -1080,6 +1089,7 @@ <translation id="681021252041861472">Obligatoriskt fält</translation> <translation id="6810899417690483278">Anpassnings-id</translation> <translation id="6825578344716086703">Du försökte besöka <ph name="DOMAIN" />, men servern skickade ett certifikat som signerats med en svag signaturalgoritm (t.ex. SHA-1). Det innebär att säkerhetsuppgifterna som servern uppgav kan vara förfalskade och att servern kanske inte är den server du tror (du kanske kommunicerar med en skadlig server).</translation> +<translation id="6826370046007623921">Förebyggande av dataförlust</translation> <translation id="6831043979455480757">Översätt</translation> <translation id="6839929833149231406">Område</translation> <translation id="6852204201400771460">Vill du läsa in appen igen?</translation> @@ -1226,6 +1236,7 @@ <translation id="7542995811387359312">Automatisk ifyllning av kreditkort har inaktiverats eftersom formulärets anslutning inte är säker.</translation> <translation id="7548892272833184391">Åtgärda anslutningsproblem</translation> <translation id="7549584377607005141">Den här webbsidan kräver uppgifter som du har angett tidigare för att kunna visas korrekt. Du kan skicka uppgifterna igen, men om du gör det upprepas de åtgärder som har utförts av sidan tidigare.</translation> +<translation id="7550637293666041147">Ditt användarnamn på enheten och användarnamn i Chrome</translation> <translation id="7552846755917812628">Testa följande tips:</translation> <translation id="7554791636758816595">Ny flik</translation> <translation id="7564049878696755256">Du kan förlora åtkomsten till kontot på <ph name="ORG_NAME" /> eller bli utsatt för identitetsstöld. Du rekommenderas att ändra lösenordet nu.</translation> @@ -1240,6 +1251,7 @@ <translation id="7610193165460212391">Värdet är utanför intervallet <ph name="VALUE" />.</translation> <translation id="7613889955535752492">Upphör: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Du har redan data som krypteras med en annan version av ditt lösenord till Google-kontot. Ange det nedan.</translation> +<translation id="7625784245512586808">Skydd mot hot i Chrome Enterprise</translation> <translation id="7633909222644580952">Prestandainformation och kraschrapporter</translation> <translation id="7637571805876720304">Vill du ta bort kreditkortet från Chromium?</translation> <translation id="7638605456503525968">Serieportar</translation> @@ -1350,6 +1362,7 @@ <translation id="8211406090763984747">Anslutningen är säker</translation> <translation id="8218327578424803826">Tilldelad plats:</translation> <translation id="8220146938470311105">C7/C6 (kuvert)</translation> +<translation id="8220639454292072926">Företagsrapportering</translation> <translation id="8225771182978767009">Personen som konfigurerade datorn har valt att blockera den här webbplatsen.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Öppna sidan på en ny inkognitoflik</translation> @@ -1433,6 +1446,7 @@ <translation id="8740359287975076522">Det gick inte att hitta <ph name="HOST_NAME" />s <abbr id="dnsDefinition">DNS-adress</abbr>. Diagnostiserar problemet.</translation> <translation id="874846938927089722">Godkända kreditkort och förbetalda kort</translation> <translation id="874918643257405732">Bokmärk den här fliken</translation> +<translation id="8751426954251315517">Försök igen senare</translation> <translation id="8759274551635299824">Kortets giltighetstid har löpt ut</translation> <translation id="8761567432415473239">Googles tjänst Säker webbsökning <ph name="BEGIN_LINK" />hittade skadliga program<ph name="END_LINK" /> på <ph name="SITE" /> nyligen.</translation> <translation id="8763927697961133303">USB-enhet</translation> @@ -1497,6 +1511,7 @@ <translation id="9080712759204168376">Sammanfattning av beställningen</translation> <translation id="9089260154716455634">Princip för användning utanför arbetstid:</translation> <translation id="9095388113577226029">Fler språk …</translation> +<translation id="9098981495403789647">Administratören har aktiverat skydd mot hot i Chrome Enterprise i webbläsaren. Skyddet mot hot i Chrome Enterprise har tillgång till en del av din data.</translation> <translation id="9103872766612412690">På <ph name="SITE" /> används normalt kryptering (SSL) för att skydda din information. När Chromium försökte ansluta till <ph name="SITE" /> den här gången skickade webbplatsen tillbaka ovanliga och felaktiga uppgifter. Sådant kan hända när en angripare utger sig för att vara <ph name="SITE" /> eller när anslutningen har avbrutits av en Wi-Fi-inloggningsskärm. Din information är fortfarande säker eftersom Chromium avbröt anslutningen innan någon data utbyttes.</translation> <translation id="9106062320799175032">Lägg till faktureringsadress</translation> <translation id="9114524666733003316">Kortet kontrolleras …</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index fea5746..f470d550 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"Kuna programu kwenye kompyuta yako inayoizuia Chrome isiunganishe kwenye wavuti kwa usalama" (kompyuta za Windows pekee)</translation> <translation id="1294154142200295408">Tofauti za miundo ya amri</translation> <translation id="129553762522093515">Vilivyofungwa hivi karibuni</translation> +<translation id="1298536327547837046">Uchanganuzi wa Programu Hasidi</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Jaribu kufuta vidakuzi kwenye kivinjari chako<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Vipengele Vilivyoacha Kutumiwa</translation> <translation id="1320233736580025032">Prc1 (Bahasha)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">Ghairi Malipo</translation> <translation id="3207960819495026254">Imealamishwa</translation> <translation id="3209034400446768650">Huenda ukurasa ukakutoza</translation> +<translation id="3215092763954878852">Imeshindwa kutumia WebAuthn</translation> <translation id="3225919329040284222">Seva imewasilisha cheti kisicholingana na matarajio ya kijenzi cha ndani. Matarajio haya yanajumlishwa kwa baadhi ya tovuti za usalama wa juu ili kukulinda.</translation> <translation id="3226128629678568754">Bonyeza kitufe cha kupakia upya ili kuwasilisha upya data inayohitajika kupakia ukurasa.</translation> <translation id="3227137524299004712">Maikrofoni</translation> @@ -565,6 +567,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Hamna}=1{Kutoka kwenye tovuti 1 }other{Kutoka kwenye tovuti # }}</translation> <translation id="397105322502079400">Inakokotoa...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> imezuiwa.</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> imewasha Ulinzi wa Hatari wa Biashara ya Chrome kwenye kivinjari chako. Ulinzi wa Hatari wa Biashara ya Chrome una uwezo wa kufikia baadhi ya data yako.</translation> <translation id="3987940399970879459">Chini ya MB 1</translation> <translation id="40103911065039147">{URL_count,plural, =1{ukurasa 1 wa wavuti ulio karibu}other{kurasa # za wavuti zilizo karibu}}</translation> <translation id="4030383055268325496">Tendua kuongeza</translation> @@ -633,6 +636,7 @@ <translation id="4277028893293644418">Badilisha nenosiri</translation> <translation id="4279811152705618813"><ph name="DEVICE_TYPE" /> yako inasimamiwa na <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Kadi hii imehifadhiwa kwenye Akaunti yako ya Google}other{Kadi hizi zimehifadhiwa kwenye Akaunti yako ya Google}}</translation> +<translation id="428847186335018806">Kuchanganua faili unazopakua au kupakia kwenye Chrome.</translation> <translation id="42981349822642051">Panua</translation> <translation id="4302965934281694568">Chou3 (Bahasha)</translation> <translation id="4305817255990598646">Badilisha</translation> @@ -671,6 +675,7 @@ <translation id="4506176782989081258">Hitilafu ya uthibitishaji: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">Kuwasiliana na msimamizi wa mfumo</translation> <translation id="450710068430902550">Kushiriki na Msimamizi</translation> +<translation id="4508814173490746936">Imeshindwa kutumia Touch ID</translation> <translation id="4510487217173779431">Chou4 (Bahasha)</translation> <translation id="4515275063822566619">Kadi na anwani zinatoka Chrome na Akaunti yako ya Google (<ph name="ACCOUNT_EMAIL" />). Unaweza kuzidhibiti katika <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Bahasha)</translation> @@ -766,6 +771,7 @@ <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation> <translation id="5056549851600133418">Makala kwa ajili yako</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 kinatumika)}other{(# vinatumika)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kuangalia anwani mbadala<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Cheti cha seva si sahihi kwa sasa.</translation> <translation id="5087580092889165836">Ongeza kadi</translation> @@ -995,6 +1001,7 @@ <translation id="6302269476990306341">Programu ya Mratibu wa Google katika Chrome inaacha kufanya kazi</translation> <translation id="6305205051461490394"><ph name="URL" /> haiwezi kufikiwa.</translation> <translation id="6321917430147971392">Angalia mipangilio yako ya DNS</translation> +<translation id="6322182122604171028">Imeshindwa kutumia Windows Hello</translation> <translation id="6328639280570009161">Jaribu kuzima utabiri wa mtandao</translation> <translation id="6328784461820205019">"Muunganisho wako si wa faragha" au "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" au "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" au "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" au "hitilafu ya cheti cha SSL"</translation> <translation id="6328786501058569169">Tovuti hii ni ya udanganyifu</translation> @@ -1018,6 +1025,7 @@ <translation id="6433490469411711332">Badilisha maelezo ya mawasiliano</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> imekataa kuunganisha.</translation> <translation id="6434309073475700221">Tupa</translation> +<translation id="6435221585574090192">Kushiriki data kuhusu matukio ya usalama ambayo yameripotiwa na kipengele cha Ulinzi wa Hatari wa Biashara ya Chrome na msimamizi wako. Hii inaweza kujumuisha URL za ukurasa, jina la faili na metadata ya faili, jina lako la mtumiaji wa kifaa na jina lako la mtumiaji wa Chrome.</translation> <translation id="6440503408713884761">Imepuuzwa</translation> <translation id="6446163441502663861">Kahu (Bahasha)</translation> <translation id="6446608382365791566">Ongeza maelezo zaidi</translation> @@ -1062,6 +1070,7 @@ <translation id="6671697161687535275">Je, ungependa kuondoa pendekezo la fomu kwenye Chromium?</translation> <translation id="6685834062052613830">Ondoka na ukamilishe kuweka mipangilio</translation> <translation id="6689271823431384964">Chrome itakuhifadhia kadi zako katika Akaunti yako ya Google kwa sababu umeingia katika akaunti. Unaweza kubadilisha hali hii katika mipangilio. Jina la mwenye kadi linatoka kwenye akaunti yako.</translation> +<translation id="6707256370811247129">Kuchanganua maudhui ya akiba na faili ambazo unapakia au kupakua kwenye Chrome.</translation> <translation id="6710213216561001401">Iliyotangulia</translation> <translation id="6710594484020273272"><Andika neno unalotaka kutafuta></translation> <translation id="671076103358959139">Tokeni ya Kujiandikisha:</translation> @@ -1080,6 +1089,7 @@ <translation id="681021252041861472">Sehemu Hii Sharti Ijazwe</translation> <translation id="6810899417690483278">Kitambulisho cha kubadilisha ili kukufaa</translation> <translation id="6825578344716086703">Umejaribu kufikia <ph name="DOMAIN" />, lakini seva iliwasilisha cheti kilichotiwa sahihi na kanuni duni. Hii inamaanisha kuwa stakabadhi za usalama zilizowasilishwa na seva hiyo huenda ni bandia na seva hiyo huenda ikawa si ile uliyotarajia (unaweza kuwa unawasiliana na mvamizi).</translation> +<translation id="6826370046007623921">Mfumo wa Kuzuia Data Isipotee</translation> <translation id="6831043979455480757">Tafsiri</translation> <translation id="6839929833149231406">Eneo</translation> <translation id="6852204201400771460">Ungependa kupakia programu upya?</translation> @@ -1224,6 +1234,7 @@ <translation id="7542995811387359312">Mjazo otomatiki wa kadi ya mkopo umelemazwa kwa sababu fomu hii haitumii muunganisho salama.</translation> <translation id="7548892272833184391">Rekebisha hitilafu za muunganisho</translation> <translation id="7549584377607005141">Ukurasa huu wa wavuti unahitaji data ambayo uliingiza mapema ili ionyeshwe inavyostahili. Unaweza kutuma tena data hii, lakini kwa kufanya hivyo utarudia hatua yoyote ambayo ukurasa huu ulifanya hapo awali.</translation> +<translation id="7550637293666041147">Jina lako la mtumiaji wa kifaa na jina lako la mtumiaji wa Chrome</translation> <translation id="7552846755917812628">Jaribu vidokezo vinavyofuata:</translation> <translation id="7554791636758816595">Kichupo Kipya</translation> <translation id="7564049878696755256">Unaweza kupoteza uwezo wa kufikia Akaunti yako ya <ph name="ORG_NAME" /> au kuibiwa utambulisho. Chrome inapendekeza ubadilishe nenosiri lako sasa.</translation> @@ -1238,6 +1249,7 @@ <translation id="7610193165460212391">Thamani imezidi masafa<ph name="VALUE" />.</translation> <translation id="7613889955535752492">Muda wa matumizi utakwisha: <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Tayari una data ambayo imesimbwa kwa fiche kwa kutumia toleo tofauti la nenosiri lako la Akaunti ya Google. Tafadhali liingize hapo chini.</translation> +<translation id="7625784245512586808">Ulinzi wa Hatari wa Biashara ya Chrome</translation> <translation id="7633909222644580952">Ripoti za utendaji na programu kuacha kufanya kazi</translation> <translation id="7637571805876720304">Je, ungependa kuondoa kadi ya mikopo kwenye Chromium?</translation> <translation id="7638605456503525968">Milango ya kuingiza</translation> @@ -1348,6 +1360,7 @@ <translation id="8211406090763984747">Muunganisho ni salama</translation> <translation id="8218327578424803826">Mahali Palipohawilishwa:</translation> <translation id="8220146938470311105">C7/C6 (Bahasha)</translation> +<translation id="8220639454292072926">Kuripoti Biashara</translation> <translation id="8225771182978767009">Mtu ambaye aliweka mipangilio ya kompyuta hii ameamua kuzuia tovuti hii.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Fungua ukurasa kwenye kichupo fiche kipya</translation> @@ -1429,6 +1442,7 @@ <translation id="8740359287975076522"><ph name="HOST_NAME" /> <abbr id="dnsDefinition">anwani ya DNS</abbr> haikupatikana. Tatizo linachunguzwa.</translation> <translation id="874846938927089722">Kadi za Mikopo na za Kulipia Awali Zinazokubaliwa</translation> <translation id="874918643257405732">Alamisha kichupo hiki</translation> +<translation id="8751426954251315517">Tafadhali jaribu tena baadaye</translation> <translation id="8759274551635299824">Muda wa matumizi wa kadi hii umekwisha</translation> <translation id="8761567432415473239">Kuvinjari Salama kwa Google <ph name="BEGIN_LINK" />kulipata programu zinazodhuru<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi karibuni.</translation> <translation id="8763927697961133303">Kifaa cha USB</translation> @@ -1493,6 +1507,7 @@ <translation id="9080712759204168376">Muhtasari wa Agizo</translation> <translation id="9089260154716455634">Sera ya Saa Zisizo za Kazi:</translation> <translation id="9095388113577226029">Lugha zaidi...</translation> +<translation id="9098981495403789647">Msimamizi wako amewasha kipengele cha Ulinzi wa Hatari wa Biashara ya Chrome kwenye kivinjari chako. Ulinzi wa Hatari wa Biashara ya Chrome una uwezo wa kufikia baadhi ya data yako.</translation> <translation id="9103872766612412690">Kwa kawaida <ph name="SITE" /> hutumia usimbaji fiche ili kulinda maelezo yako. Chromium ilipojaribu kuunganisha kwenye <ph name="SITE" /> wakati huu, tovuti ilituma kitambulisho kisicho cha kawaida na kisicho sahihi. Hili linaweza kutokea mvamizi anapojaribu kujifanya kuwa <ph name="SITE" />, au uchanganuzi wa kuingia katika Wi-Fi umeingilia muunganisho. Maelezo yako yangali salama kwa sababu Chromium ilisimamisha muunganisho kabla data yoyote itumwe.</translation> <translation id="9106062320799175032">Ongeza Anwani ya Kutuma Bili</translation> <translation id="9114524666733003316">Inathibitisha kadi…</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index bc550255..6217c0f 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"Bilgisayarınızdaki yazılım, Chrome'un web'e güvenli bir şekilde bağlanmasını engelliyor" (yalnızca Windows bilgisayarlar)</translation> <translation id="1294154142200295408">Komut satırı varyasyonları</translation> <translation id="129553762522093515">Son kapatılan</translation> +<translation id="1298536327547837046">Kötü Amaçlı Yazılım Tarama</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Çerezlerinizi temizlemeyi deneyin<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Kullanımdan Kaldırılan Özellikler</translation> <translation id="1320233736580025032">Prc1 (Zarf)</translation> @@ -427,6 +428,7 @@ <translation id="320323717674993345">Ödemeyi iptal et</translation> <translation id="3207960819495026254">Yer işareti koyuldu</translation> <translation id="3209034400446768650">Sayfa sizden ücret alabilir</translation> +<translation id="3215092763954878852">WebAuthn kullanılamadı</translation> <translation id="3225919329040284222">Sunucu, yerleşik beklentilerle eşleşmeyen bir sertifika sundu. Bu beklentiler sizi korumak amacıyla bazı yüksek güvenlikli web sitelerinde bulunur.</translation> <translation id="3226128629678568754">Sayfayı yüklemek üzere gereken verileri tekrar göndermek için yeniden yükle düğmesine basın.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -563,6 +565,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Yok}=1{1 siteden }other{# siteden }}</translation> <translation id="397105322502079400">Hesaplanııyor...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> engellendi</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" />, tarayıcınızda Chrome Enterprise Threat Protection özelliğini etkinleştirdi. Chrome Enterprise Threat Protection özelliğinin verilerinizin bir kısmına erişimi vardır.</translation> <translation id="3987940399970879459">1 MB'tan az</translation> <translation id="40103911065039147">{URL_count,plural, =1{Yakındaki 1 web sayfası}other{Yakındaki # web sayfası}}</translation> <translation id="4030383055268325496">Eklemeyi &geri al</translation> @@ -631,6 +634,7 @@ <translation id="4277028893293644418">Şifreyi sıfırla</translation> <translation id="4279811152705618813"><ph name="DEVICE_TYPE" /> cihazınız <ph name="ENROLLMENT_DOMAIN" /> tarafından yönetiliyor.</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Bu kart Google Hesabınıza kaydedildi}other{Bu kartlar Google Hesabınıza kaydedildi}}</translation> +<translation id="428847186335018806">Chrome'da indirdiğiniz veya yüklediğiniz dosyaları tarama.</translation> <translation id="42981349822642051">Genişlet</translation> <translation id="4302965934281694568">Chou3 (Zarf)</translation> <translation id="4305817255990598646">Anahtar</translation> @@ -669,6 +673,7 @@ <translation id="4506176782989081258">Doğrulama hatası: <ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">Sistem yöneticisiyle iletişime geçme</translation> <translation id="450710068430902550">Yöneticiyle Paylaşma</translation> +<translation id="4508814173490746936">Touch ID kullanılamadı</translation> <translation id="4510487217173779431">Chou4 (Zarf)</translation> <translation id="4515275063822566619">Kart ve adres bilgileri Chrome'dan ve Google Hesabınızdan (<ph name="ACCOUNT_EMAIL" />) alınmaktadır. Bunları <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" />'dan yönetebilirsiniz.</translation> <translation id="4517607026994743406">Comm-10 (Zarf)</translation> @@ -764,6 +769,7 @@ <translation id="5045550434625856497">Hatalı parola</translation> <translation id="5056549851600133418">Size uygun makaleler</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 çerez kullanımda)}other{(# çerez kullanımda)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxy adresini kontrol etme<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sunucu sertifikası şu anda geçerli değil.</translation> <translation id="5087580092889165836">Kart ekle</translation> @@ -993,6 +999,7 @@ <translation id="6302269476990306341">Chrome'da Google Asistan durduruluyor</translation> <translation id="6305205051461490394"><ph name="URL" /> adresine ulaşılamıyor.</translation> <translation id="6321917430147971392">DNS ayarlarınızı kontrol edin</translation> +<translation id="6322182122604171028">Windows Hello kullanılamadı</translation> <translation id="6328639280570009161">Ağ tahmin özelliğini devre dışı bırakmayı deneyin</translation> <translation id="6328784461820205019">"Bağlantınız gizli değil", "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>", "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>", "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>", "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" veya "SSL sertifika hatası"</translation> <translation id="6328786501058569169">Bu site yanıltıcıdır</translation> @@ -1016,6 +1023,7 @@ <translation id="6433490469411711332">İletişim bilgilerini düzenle</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> bağlanmayı reddetti.</translation> <translation id="6434309073475700221">Sil</translation> +<translation id="6435221585574090192">Chrome Enterprise Threat Protection tarafından işaretlenen güvenlik işlemleri hakkında Yöneticiniz ile veri paylaşın. Bu veriler, sayfa URL'lerini, dosya adını, dosya meta verisini, cihaz kullanıcı adınızı ve Chrome kullanıcı adınızı içerebilir.</translation> <translation id="6440503408713884761">Yoksayıldı</translation> <translation id="6446163441502663861">Kahu (Zarf)</translation> <translation id="6446608382365791566">Daha fazla bilgi ekleyin</translation> @@ -1060,6 +1068,7 @@ <translation id="6671697161687535275">Form önerisi Chromium'dan kaldırılsın mı?</translation> <translation id="6685834062052613830">Çıkış yapın ve kurulumu tamamlayın</translation> <translation id="6689271823431384964">Chrome, oturumunuz açık olduğu için kartlarınızı Google Hesabınıza kaydetmeyi öneriyor. Bu davranışı ayarlardan değiştirebilirsiniz. Kart sahibinin adı hesabınızdan gelir.</translation> +<translation id="6707256370811247129">Önbelleğin içeriğini ve Chrome'da indirdiğiniz veya yüklediğiniz dosyaları tarama.</translation> <translation id="6710213216561001401">Önceki</translation> <translation id="6710594484020273272"><Arama terimini yazın></translation> <translation id="671076103358959139">Kayıt Jetonu:</translation> @@ -1078,6 +1087,7 @@ <translation id="681021252041861472">Gerekli Alan</translation> <translation id="6810899417690483278">Özelleştirme Kimliği</translation> <translation id="6825578344716086703"><ph name="DOMAIN" /> alanına erişme girişiminde bulundunuz ancak sunucu SHA-1 gibi zayıf bir imza algoritması kullanılarak imzalanmış bir sertifika sağladı. Bu, sunucunun sağladığı güvenlik bilgilerinin sahte olabileceği anlamına gelir ve sunucu sizin beklediğiniz sunucu olmayabilir (bir saldırgan ile irtibat kuruyor olabilirsiniz).</translation> +<translation id="6826370046007623921">Veri Kaybını Önleme</translation> <translation id="6831043979455480757">Çevir</translation> <translation id="6839929833149231406">Bölge</translation> <translation id="6852204201400771460">Uygulama yeniden yüklensin mi?</translation> @@ -1224,6 +1234,7 @@ <translation id="7542995811387359312">Bu form güvenli bağlantı kullanmadığından kredi kartı bilgilerini otomatik doldurma özelliği devre dışı bırakıldı.</translation> <translation id="7548892272833184391">Bağlantı hatalarını düzeltme</translation> <translation id="7549584377607005141">Bu Web sayfasının düzgün şekilde görüntülenmesi için, önceden girdiğiniz veriler gerekiyor. Bu verileri tekrar gönderebilirsiniz, ancak bunu yaptığınızda bu sayfanın daha önce gerçekleştirdiği işlemler de tekrar edilir.</translation> +<translation id="7550637293666041147">Cihaz kullanıcı adınız ve Chrome kullanıcı adınız</translation> <translation id="7552846755917812628">Aşağıdaki ipuçlarını deneyin:</translation> <translation id="7554791636758816595">Yeni Sekme</translation> <translation id="7564049878696755256"><ph name="ORG_NAME" /> hesabınıza erişimi kaybedebilir veya kimlik hırsızlığına maruz kalabilirsiniz. Chrome, şifrenizi hemen değiştirmenizi önerir.</translation> @@ -1238,6 +1249,7 @@ <translation id="7610193165460212391">Değer aralık dışında: <ph name="VALUE" />.</translation> <translation id="7613889955535752492">Son kullanım tarihi: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Google Hesabı şifrenizin farklı bir sürümü kullanılarak şifrelenmiş verileriniz zaten var. Lütfen bu şifreyi aşağıya girin.</translation> +<translation id="7625784245512586808">Chrome Enterprise Threat Protection</translation> <translation id="7633909222644580952">Performans verileri ve kilitlenme raporları</translation> <translation id="7637571805876720304">Kredi kartı Chromium'dan kaldırılsın mı?</translation> <translation id="7638605456503525968">Seri bağlantı noktaları</translation> @@ -1348,6 +1360,7 @@ <translation id="8211406090763984747">Bağlantı güvenli</translation> <translation id="8218327578424803826">Atanan Konum:</translation> <translation id="8220146938470311105">C7/C6 (Zarf)</translation> +<translation id="8220639454292072926">Kurumsal Raporlama</translation> <translation id="8225771182978767009">Bu bilgisayarı kuran kişi bu siteyi engellemeyi seçmiş.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Sayfayı yeni bir Gizli sekmede aç</translation> @@ -1431,6 +1444,7 @@ <translation id="8740359287975076522"><ph name="HOST_NAME" /> ana makinesinin <abbr id="dnsDefinition">DNS adresi</abbr> bulunamadı. Sorun teşhis ediliyor.</translation> <translation id="874846938927089722">Kabul Edilen Kredi Kartları ve Ön Ödemeli Kartlar</translation> <translation id="874918643257405732">Bu sekmeye yer işareti koy</translation> +<translation id="8751426954251315517">Lütfen bir dahaki sefer tekrar deneyin</translation> <translation id="8759274551635299824">Bu kartın kullanım süresi doldu</translation> <translation id="8761567432415473239">Google Güvenli Tarama, yakın zamanda <ph name="SITE" /> sitesinde <ph name="BEGIN_LINK" />zararlı programlar buldu<ph name="END_LINK" />.</translation> <translation id="8763927697961133303">USB cihaz</translation> @@ -1495,6 +1509,7 @@ <translation id="9080712759204168376">Sipariş Özeti</translation> <translation id="9089260154716455634">Mesai Dışı Saatler Politikası:</translation> <translation id="9095388113577226029">Diğer diller...</translation> +<translation id="9098981495403789647">Yöneticiniz, tarayıcınızda Chrome Enterprise Threat Protection özelliğini etkinleştirdi. Chrome Enterprise Threat Protection özelliğinin verilerinizin bir kısmına erişimi vardır.</translation> <translation id="9103872766612412690"><ph name="SITE" /> normalde bilgilerinizi korumak için şifreleme kullanmaktadır. Chromium bu sefer <ph name="SITE" /> sitesine bağlanmayı denediğinde, web sitesi sıra dışı ve yanlış kimlik bilgileri döndürdü. Bir saldırgan <ph name="SITE" /> gibi davranmaya çalışıyor olabilir ya da bir Kablosuz oturum açma ekranı bağlantıyı kesmiştir. Chromium herhangi bir veri alışverişinden önce bağlantıyı durdurduğu için bilgileriniz hâlâ güvendedir.</translation> <translation id="9106062320799175032">Fatura Adresi Ekleyin</translation> <translation id="9114524666733003316">Kart onaylanıyor...</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 6f77453..ab6811fa 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">"Phần mềm trên máy tính của bạn đang ngăn không cho Chrome kết nối an toàn với web" (chỉ trên máy tính Windows)</translation> <translation id="1294154142200295408">Các biến thể của dòng lệnh</translation> <translation id="129553762522093515">Các tab đã đóng gần đây</translation> +<translation id="1298536327547837046">Quét tìm phần mềm độc hại</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Thử xóa các cookie của bạn<ph name="END_LINK" /></translation> <translation id="1307966114820526988">Tính năng sắp ngừng hoạt động</translation> <translation id="1320233736580025032">Prc1 (Phong bì)</translation> @@ -429,6 +430,7 @@ <translation id="320323717674993345">Hủy thanh toán</translation> <translation id="3207960819495026254">Đã đánh dấu trang</translation> <translation id="3209034400446768650">Trang này có thể tính phí</translation> +<translation id="3215092763954878852">Không thể dùng WebAuthn</translation> <translation id="3225919329040284222">Máy chủ đưa ra chứng chỉ không khớp với kỳ vọng được tích hợp sẵn. Các kỳ vọng này có trong một số trang web nhất định, có tính bảo mật cao với mục đích bảo vệ bạn.</translation> <translation id="3226128629678568754">Nhấn nút tải lại để gửi lại các dữ liệu cần thiết để tải trang.</translation> <translation id="3227137524299004712">Micrô</translation> @@ -565,6 +567,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Không có}=1{Của 1 trang web }other{Của # trang web }}</translation> <translation id="397105322502079400">Đang tính...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> bị chặn</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> đã bật tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise trên trình duyệt. Tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise có quyền truy cập vào một số dữ liệu của bạn.</translation> <translation id="3987940399970879459">Dưới 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{1 trang web lân cận}other{# trang web lân cận}}</translation> <translation id="4030383055268325496">&Hoàn tác thêm</translation> @@ -633,6 +636,7 @@ <translation id="4277028893293644418">Đặt lại mật khẩu</translation> <translation id="4279811152705618813"><ph name="DEVICE_TYPE" /> của bạn do <ph name="ENROLLMENT_DOMAIN" /> quản lý</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{Đã lưu thẻ này vào Tài khoản Google của bạn}other{Đã lưu các thẻ này vào Tài khoản Google của bạn}}</translation> +<translation id="428847186335018806">Quét các tệp mà bạn tải lên hoặc tải xuống trên Chrome.</translation> <translation id="42981349822642051">Mở rộng</translation> <translation id="4302965934281694568">Chou3 (Phong bì)</translation> <translation id="4305817255990598646">Chuyển</translation> @@ -671,6 +675,7 @@ <translation id="4506176782989081258">Lỗi xác thực: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4506599922270137252">Liên hệ với quản trị viên hệ thống</translation> <translation id="450710068430902550">Chia sẻ với quản trị viên</translation> +<translation id="4508814173490746936">Không thể dùng Touch ID</translation> <translation id="4510487217173779431">Chou4 (Phong bì)</translation> <translation id="4515275063822566619">Thẻ và địa chỉ từ Chrome và Tài khoản Google của bạn (<ph name="ACCOUNT_EMAIL" />). Bạn có thể quản lý thẻ và địa chỉ trong <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Phong bì)</translation> @@ -766,6 +771,7 @@ <translation id="5045550434625856497">Mật khẩu sai</translation> <translation id="5056549851600133418">Tin bài dành cho bạn</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 cookie đang được dùng)}other{(# cookie đang được dùng)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kiểm tra địa chỉ proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Chứng chỉ của máy chủ không hợp lệ tại thời điểm này.</translation> <translation id="5087580092889165836">Thêm thẻ</translation> @@ -995,6 +1001,7 @@ <translation id="6302269476990306341">Trợ lý Google trong Chrome đang dừng</translation> <translation id="6305205051461490394">Không thể truy cập <ph name="URL" />.</translation> <translation id="6321917430147971392">Kiểm tra cài đặt DNS của bạn</translation> +<translation id="6322182122604171028">Không thể dùng Windows Hello</translation> <translation id="6328639280570009161">Thử tắt dự đoán mạng</translation> <translation id="6328784461820205019">"Kết nối của bạn không phải là kết nối riêng tư" hoặc "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" hoặc "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" hoặc "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" hoặc "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" hoặc "Lỗi chứng chỉ SSL"</translation> <translation id="6328786501058569169">Đây là trang web lừa đảo</translation> @@ -1018,6 +1025,7 @@ <translation id="6433490469411711332">Chỉnh sửa thông tin liên hệ</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> đã từ chối kết nối.</translation> <translation id="6434309073475700221">Hủy</translation> +<translation id="6435221585574090192">Chia sẻ với Quản trị viên các dữ liệu về những sự kiện bảo mật mà tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise đã gắn cờ. Các dữ liệu này có thể bao gồm cả URL trang, tên tệp và siêu dữ liệu tệp, tên người dùng Chrome và tên người dùng thiết bị của bạn.</translation> <translation id="6440503408713884761">Bị bỏ qua</translation> <translation id="6446163441502663861">Kahu (Phong bì)</translation> <translation id="6446608382365791566">Thêm thông tin khác</translation> @@ -1062,6 +1070,7 @@ <translation id="6671697161687535275">Bạn muốn xóa đề xuất biểu mẫu khỏi Chromium?</translation> <translation id="6685834062052613830">Đăng xuất và hoàn thành quá trình thiết lập</translation> <translation id="6689271823431384964">Chrome đang đề xuất lưu thẻ của bạn vào Tài khoản Google vì bạn đã đăng nhập. Bạn có thể thay đổi hoạt động này trong phần cài đặt. Tên chủ thẻ được lấy từ tài khoản của bạn.</translation> +<translation id="6707256370811247129">Quét nội dung trong bộ nhớ đệm và các tệp mà bạn tải lên hoặc tải xuống trên Chrome.</translation> <translation id="6710213216561001401">Trước đó</translation> <translation id="6710594484020273272"><Nhập cụm từ tìm kiếm></translation> <translation id="671076103358959139">Mã đăng ký:</translation> @@ -1080,6 +1089,7 @@ <translation id="681021252041861472">Trường bắt buộc</translation> <translation id="6810899417690483278">ID tùy chỉnh</translation> <translation id="6825578344716086703">Bạn đã cố gắng truy cập vào <ph name="DOMAIN" /> nhưng máy chủ xuất trình một chứng chỉ được ký bằng một thuật toán chữ ký yếu (chẳng hạn như SHA-1). Điều này có nghĩa là thông tin đăng nhập bảo mật mà máy chủ xuất trình có thể đã bị giả mạo và máy chủ đó có thể không phải là máy chủ mà bạn mong đợi (bạn có thể đang kết nối với kẻ tấn công).</translation> +<translation id="6826370046007623921">Ngăn chặn mất dữ liệu</translation> <translation id="6831043979455480757">Dịch</translation> <translation id="6839929833149231406">Vùng</translation> <translation id="6852204201400771460">Tải lại ứng dụng?</translation> @@ -1226,6 +1236,7 @@ <translation id="7542995811387359312">Tính năng tự động điền thẻ tín dụng đã bị vô hiệu hóa vì biểu mẫu này không sử dụng kết nối an toàn.</translation> <translation id="7548892272833184391">Khắc phục lỗi kết nối</translation> <translation id="7549584377607005141">Trang web này yêu cầu dữ liệu mà bạn đã nhập trước đó để được hiển thị đúng cách. Bạn có thể gửi lại dữ liệu này nhưng làm như vậy bạn sẽ lặp lại mọi hoạt động mà trang này đã thực hiện trước đó.</translation> +<translation id="7550637293666041147">Tên người dùng Chrome và tên người dùng thiết bị của bạn</translation> <translation id="7552846755917812628">Thử các mẹo sau:</translation> <translation id="7554791636758816595">Tab mới</translation> <translation id="7564049878696755256">Bạn có thể mất quyền truy cập vào tài khoản <ph name="ORG_NAME" /> của mình hoặc bị đánh cắp danh tính. Chrome khuyên bạn nên thay đổi mật khẩu ngay bây giờ.</translation> @@ -1240,6 +1251,7 @@ <translation id="7610193165460212391">Giá trị nằm ngoài phạm vi <ph name="VALUE" />.</translation> <translation id="7613889955535752492">Hết hạn: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">Bạn đã có dữ liệu được mã hóa bằng mật khẩu khác của Tài khoản Google. Vui lòng nhập mật khẩu đó bên dưới.</translation> +<translation id="7625784245512586808">Tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise</translation> <translation id="7633909222644580952">Báo cáo sự cố và dữ liệu hiệu suất</translation> <translation id="7637571805876720304">Bạn muốn xóa thẻ tín dụng khỏi Chromium?</translation> <translation id="7638605456503525968">Cổng nối tiếp</translation> @@ -1350,6 +1362,7 @@ <translation id="8211406090763984747">Kết nối an toàn</translation> <translation id="8218327578424803826">Vị trí được gán:</translation> <translation id="8220146938470311105">C7/C6 (Phong bì)</translation> +<translation id="8220639454292072926">Báo cáo của Enterprise</translation> <translation id="8225771182978767009">Người thiết lập máy tính này đã chọn chặn trang web này.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Mở trang trong tab Ẩn danh mới</translation> @@ -1433,6 +1446,7 @@ <translation id="8740359287975076522">Không thể tìm thấy <abbr id="dnsDefinition">địa chỉ DNS</abbr> của <ph name="HOST_NAME" />. Đang chẩn đoán sự cố.</translation> <translation id="874846938927089722">Thẻ tín dụng và thẻ trả trước được chấp nhận</translation> <translation id="874918643257405732">Đánh dấu tab này</translation> +<translation id="8751426954251315517">Vui lòng thử lại vào lần tiếp theo</translation> <translation id="8759274551635299824">Thẻ này đã hết hạn</translation> <translation id="8761567432415473239">Gần đây, Duyệt web an toàn của Google <ph name="BEGIN_LINK" />tìm thấy chương trình độc hại<ph name="END_LINK" /> trên trang <ph name="SITE" />.</translation> <translation id="8763927697961133303">Thiết bị USB</translation> @@ -1497,6 +1511,7 @@ <translation id="9080712759204168376">Tóm tắt đơn hàng</translation> <translation id="9089260154716455634">Chính sách về khoảng thời gian tắt:</translation> <translation id="9095388113577226029">Ngôn ngữ khác...</translation> +<translation id="9098981495403789647">Quản trị viên đã bật tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise trên trình duyệt. Tính năng Bảo vệ khỏi mối đe dọa của Chrome Enterprise có quyền truy cập vào một số dữ liệu của bạn.</translation> <translation id="9103872766612412690"><ph name="SITE" /> thường sử dụng mã hóa để bảo vệ thông tin của bạn. Khi Chromium cố gắng kết nối với <ph name="SITE" /> tại thời điểm này, trang web đã gửi lại thông tin đăng nhập không chính xác và bất thường. Điều này có thể xảy ra khi kẻ tấn công đang cố gắng giả mạo là <ph name="SITE" /> hoặc màn hình đăng nhập Wi-Fi đã làm gián đoạn kết nối. Thông tin của bạn vẫn an toàn do Chromium đã ngừng kết nối trước khi bất kỳ dữ liệu nào được trao đổi.</translation> <translation id="9106062320799175032">Thêm địa chỉ thanh toán</translation> <translation id="9114524666733003316">Đang xác nhận thẻ...</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index a329fbf..6342a8c 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">“您计算机上的软件导致 Chrome 无法安全地连接到网络”(仅限 Windows 计算机)</translation> <translation id="1294154142200295408">命令行变体</translation> <translation id="129553762522093515">最近关闭的标签页</translation> +<translation id="1298536327547837046">恶意软件扫描</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />尝试清除 Cookie<ph name="END_LINK" /></translation> <translation id="1307966114820526988">已被弃用的功能</translation> <translation id="1320233736580025032">Prc1 (Envelope)</translation> @@ -425,6 +426,7 @@ <translation id="320323717674993345">取消付款</translation> <translation id="3207960819495026254">已加书签</translation> <translation id="3209034400446768650">此网页可能会收取费用</translation> +<translation id="3215092763954878852">无法使用 WebAuthn</translation> <translation id="3225919329040284222">服务器提供的证书与内置预期证书不匹配。这些预期证书是针对某些高安全性网站提供的,以便为您提供保护。</translation> <translation id="3226128629678568754">按“重新加载”按钮,重新提交加载该网页所需的数据。</translation> <translation id="3227137524299004712">麦克风</translation> @@ -559,6 +561,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{无}=1{来自 1 个网站}other{来自 # 个网站}}</translation> <translation id="397105322502079400">正在计算...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 已被屏蔽</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> 已在您的浏览器中启用了 Chrome 企业版威胁防护功能。Chrome 企业版威胁防护功能可以访问您的部分数据。</translation> <translation id="3987940399970879459">小于 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{附近有 1 个网页}other{附近有 # 个网页}}</translation> <translation id="4030383055268325496">撤消添加(&U)</translation> @@ -627,6 +630,7 @@ <translation id="4277028893293644418">重置密码</translation> <translation id="4279811152705618813">您的 <ph name="DEVICE_TYPE" /> 由 <ph name="ENROLLMENT_DOMAIN" /> 管理</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{这张卡已保存到您的 Google 帐号中}other{这些卡已保存到您的 Google 帐号中}}</translation> +<translation id="428847186335018806">扫描您在 Chrome 中下载或上传的文件。</translation> <translation id="42981349822642051">展开</translation> <translation id="4302965934281694568">Chou3 (Envelope)</translation> <translation id="4305817255990598646">切换</translation> @@ -665,6 +669,7 @@ <translation id="4506176782989081258">验证错误:<ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">联系系统管理员</translation> <translation id="450710068430902550">与管理员分享</translation> +<translation id="4508814173490746936">无法使用 Touch ID</translation> <translation id="4510487217173779431">Chou4 (Envelope)</translation> <translation id="4515275063822566619">信用卡选项和地址选项均来自 Chrome 和您的 Google 帐号 (<ph name="ACCOUNT_EMAIL" />)。您可在<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />中管理这些选项。</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> @@ -760,6 +765,7 @@ <translation id="5045550434625856497">密码不正确</translation> <translation id="5056549851600133418">为您推荐的文章</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(使用了 1 个)}other{(使用了 # 个)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />检查代理服务器地址<ph name="END_LINK" /></translation> <translation id="5087286274860437796">服务器的证书目前无效。</translation> <translation id="5087580092889165836">添加新卡</translation> @@ -987,6 +993,7 @@ <translation id="6302269476990306341">Chrome 中的 Google 助理即将停止工作</translation> <translation id="6305205051461490394">无法访问 <ph name="URL" />。</translation> <translation id="6321917430147971392">请检查您的DNS设置是否正确</translation> +<translation id="6322182122604171028">无法使用 Windows Hello</translation> <translation id="6328639280570009161">请尝试停用网络联想查询功能</translation> <translation id="6328784461820205019">“您的连接不是私密连接”、“<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>”、“<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>”、“<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>”、“<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>”或“SSL 证书错误”</translation> <translation id="6328786501058569169">此网站是欺骗性网站</translation> @@ -1010,6 +1017,7 @@ <translation id="6433490469411711332">修改联系信息</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> 拒绝了我们的连接请求。</translation> <translation id="6434309073475700221">放弃</translation> +<translation id="6435221585574090192">与您的管理员分享 Chrome 企业版威胁防护功能所报告的安全性事件的相关数据。这些数据可能包括页面网址、文件名、文件元数据、您的设备用户名和 Chrome 用户名。</translation> <translation id="6440503408713884761">已忽略</translation> <translation id="6446163441502663861">Kahu (Envelope)</translation> <translation id="6446608382365791566">添加更多信息</translation> @@ -1054,6 +1062,7 @@ <translation id="6671697161687535275">要从 Chromium 中移除表单填写建议吗?</translation> <translation id="6685834062052613830">请退出并完成设置</translation> <translation id="6689271823431384964">Chrome 正在询问是否要将卡保存到您的 Google 帐号中,因为您已登录。您可在“设置”中更改此行为。持卡人姓名来自您的帐号。</translation> +<translation id="6707256370811247129">扫描您在 Chrome 中下载或上传的缓存和文件的内容。</translation> <translation id="6710213216561001401">上一个</translation> <translation id="6710594484020273272"><输入搜索字词></translation> <translation id="671076103358959139">注册令牌:</translation> @@ -1072,6 +1081,7 @@ <translation id="681021252041861472">必填字段</translation> <translation id="6810899417690483278">自定义 ID</translation> <translation id="6825578344716086703">您尝试访问的是 <ph name="DOMAIN" />,但是服务器出示的证书是使用弱签名算法(例如 SHA-1)签署的。这意味着服务器出示的安全凭据可能是伪造的,因此这可能并不是您想要访问的服务器(您可能正在与攻击者进行通信)。</translation> +<translation id="6826370046007623921">数据泄露防护</translation> <translation id="6831043979455480757">翻译</translation> <translation id="6839929833149231406">地域</translation> <translation id="6852204201400771460">要重新加载应用吗?</translation> @@ -1218,6 +1228,7 @@ <translation id="7542995811387359312">由于该表单不使用安全连接,因此自动填写信用卡信息的功能已停用。</translation> <translation id="7548892272833184391">修正网络连接错误</translation> <translation id="7549584377607005141">此网页需要使用您之前输入的数据才能正常显示。您可以重新发送这些数据,不过,这么做会重复执行此网页之前执行过的所有操作。</translation> +<translation id="7550637293666041147">您的设备用户名和 Chrome 用户名</translation> <translation id="7552846755917812628">请尝试按以下提示操作:</translation> <translation id="7554791636758816595">新标签页</translation> <translation id="7564049878696755256">您可能会无法再访问自己的 <ph name="ORG_NAME" /> 帐号,或者身份信息遭到盗用。Chrome 建议您立即更改密码。</translation> @@ -1232,6 +1243,7 @@ <translation id="7610193165460212391">值超出了范围 (<ph name="VALUE" />)。</translation> <translation id="7613889955535752492">过期时间:<ph name="EXPIRATION_YEAR" /> 年 <ph name="EXPIRATION_MONTH" /> 月</translation> <translation id="7615602087246926389">您已经使用不同版本的 Google 帐号密码加密了数据。请在下方输入。</translation> +<translation id="7625784245512586808">Chrome 企业版威胁防护</translation> <translation id="7633909222644580952">性能数据和崩溃报告</translation> <translation id="7637571805876720304">要从 Chromium 中移除信用卡吗?</translation> <translation id="7638605456503525968">串行端口</translation> @@ -1342,6 +1354,7 @@ <translation id="8211406090763984747">连接是安全的</translation> <translation id="8218327578424803826">分配的位置:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> +<translation id="8220639454292072926">企业版报告</translation> <translation id="8225771182978767009">设置此计算机的用户已选择屏蔽此网站。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">在新的无痕式标签页中打开网页</translation> @@ -1425,6 +1438,7 @@ <translation id="8740359287975076522">无法找到 <ph name="HOST_NAME" /> 的 <abbr id="dnsDefinition">DNS 地址</abbr>。正在诊断该问题。</translation> <translation id="874846938927089722">接受的信用卡和预付卡</translation> <translation id="874918643257405732">为此标签页添加书签</translation> +<translation id="8751426954251315517">请稍后重试</translation> <translation id="8759274551635299824">此信用卡已失效</translation> <translation id="8761567432415473239">Google安全浏览功能最近在<ph name="SITE" />上<ph name="BEGIN_LINK" />发现了有害程序<ph name="END_LINK" />。</translation> <translation id="8763927697961133303">USB 设备</translation> @@ -1489,6 +1503,7 @@ <translation id="9080712759204168376">订单摘要</translation> <translation id="9089260154716455634">“非工作时间”政策:</translation> <translation id="9095388113577226029">更多语言…</translation> +<translation id="9098981495403789647">您的管理员已在您的浏览器中启用了 Chrome 企业版威胁防护功能。Chrome 企业版威胁防护功能可以访问您的部分数据。</translation> <translation id="9103872766612412690"><ph name="SITE" /> 通常会使用加密技术来保护您的信息。Chromium 此次尝试连接到 <ph name="SITE" /> 时,此网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充 <ph name="SITE" />,或 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Chromium 尚未进行任何数据交换便停止了连接。</translation> <translation id="9106062320799175032">添加帐单邮寄地址</translation> <translation id="9114524666733003316">正在确认信用卡…</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index fd05ccf..bd5e226a 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -71,6 +71,7 @@ <translation id="1292701964462482250">「你的電腦上有軟體阻止 Chrome 建立安全的網路連線」(僅限 Windows 電腦)</translation> <translation id="1294154142200295408">命令列變化版本</translation> <translation id="129553762522093515">最近關閉的分頁</translation> +<translation id="1298536327547837046">惡意軟體掃描</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />試試看清除 Cookie<ph name="END_LINK" /></translation> <translation id="1307966114820526988">已淘汰的功能</translation> <translation id="1320233736580025032">Prc1 (信封)</translation> @@ -427,6 +428,7 @@ <translation id="320323717674993345">取消付款</translation> <translation id="3207960819495026254">已加入書籤</translation> <translation id="3209034400446768650">這個頁面可能會產生費用</translation> +<translation id="3215092763954878852">無法使用 WebAuthn</translation> <translation id="3225919329040284222">伺服器呈現的憑證與內建的預期條件不符。我們在系統中針對特定高安全性的網站內建了這些預期條件,目的在於保護你的資料安全無虞。</translation> <translation id="3226128629678568754">按下重新載入按鈕,重新提交載入網頁所需的資料。</translation> <translation id="3227137524299004712">麥克風</translation> @@ -563,6 +565,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{無}=1{來自 1 個網站 }other{來自 # 個網站 }}</translation> <translation id="397105322502079400">計算中…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 遭到封鎖</translation> +<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> 已為你的瀏覽器啟用 Chrome Enterprise 威脅防護功能。Chrome Enterprise 威脅防護功能可以存取你的部分資料。</translation> <translation id="3987940399970879459">不到 1 MB</translation> <translation id="40103911065039147">{URL_count,plural, =1{附近有 1 個網頁}other{附近有 # 個網頁}}</translation> <translation id="4030383055268325496">復原新增(&U)</translation> @@ -631,6 +634,7 @@ <translation id="4277028893293644418">重設密碼</translation> <translation id="4279811152705618813">你的 <ph name="DEVICE_TYPE" /> 是由 <ph name="ENROLLMENT_DOMAIN" /> 管理</translation> <translation id="428639260510061158">{NUM_CARDS,plural, =1{這張卡片已儲存到你的 Google 帳戶}other{這些卡片已儲存到你的 Google 帳戶}}</translation> +<translation id="428847186335018806">掃描你透過 Chrome 下載或上傳的檔案。</translation> <translation id="42981349822642051">展開</translation> <translation id="4302965934281694568">Chou3 (信封)</translation> <translation id="4305817255990598646">切換</translation> @@ -669,6 +673,7 @@ <translation id="4506176782989081258">驗證錯誤:<ph name="VALIDATION_ERROR" /></translation> <translation id="4506599922270137252">與系統管理員聯絡</translation> <translation id="450710068430902550">與管理員分享</translation> +<translation id="4508814173490746936">無法使用 Touch ID</translation> <translation id="4510487217173779431">Chou4 (信封)</translation> <translation id="4515275063822566619">信用卡和地址資訊皆來自 Chrome 和你的 Google 帳戶 (<ph name="ACCOUNT_EMAIL" />)。你可以在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />頁面管理這些資訊。</translation> <translation id="4517607026994743406">Comm-10 (信封)</translation> @@ -764,6 +769,7 @@ <translation id="5045550434625856497">密碼不正確</translation> <translation id="5056549851600133418">推薦給你的文章</translation> <translation id="5068524481479508725">A10</translation> +<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(目前使用 1 個 Cookie)}other{(目前使用 # 個 Cookie)}}</translation> <translation id="5070335125961472645"><ph name="BEGIN_LINK" />檢查 Proxy 位址<ph name="END_LINK" /></translation> <translation id="5087286274860437796">伺服器憑證目前無效。</translation> <translation id="5087580092889165836">新增信用卡</translation> @@ -992,6 +998,7 @@ <translation id="6302269476990306341">正在停止 Chrome 版 Google 助理</translation> <translation id="6305205051461490394">無法連上 <ph name="URL" />。</translation> <translation id="6321917430147971392">檢查 DNS 設定</translation> +<translation id="6322182122604171028">無法使用 Windows Hello</translation> <translation id="6328639280570009161">建議停用網路預測功能</translation> <translation id="6328784461820205019">「你的連線不是私人連線」、「<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>」、「<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>」、「<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>」、「<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>」或「SSL 憑證錯誤」</translation> <translation id="6328786501058569169">這是詐欺網站</translation> @@ -1015,6 +1022,7 @@ <translation id="6433490469411711332">編輯聯絡資訊</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> 拒絕連線。</translation> <translation id="6434309073475700221">捨棄</translation> +<translation id="6435221585574090192">將 Chrome Enterprise 威脅防護功能標記的安全性事件相關資料提供給系統管理員。這些資料可能包括網頁網址、檔名、檔案中繼資料、你的裝置使用者名稱和 Chrome 使用者名稱。</translation> <translation id="6440503408713884761">已忽略</translation> <translation id="6446163441502663861">Kahu (信封)</translation> <translation id="6446608382365791566">新增詳細資訊</translation> @@ -1059,6 +1067,7 @@ <translation id="6671697161687535275">要從 Chromium 中移除表單填寫建議嗎?</translation> <translation id="6685834062052613830">請登出並完成設定程序</translation> <translation id="6689271823431384964">你已登入帳戶,因此 Chrome 詢問你是否要將卡片儲存至 Google 帳戶。你可以在設定中變更這項行為。持卡人姓名來自你的帳戶。</translation> +<translation id="6707256370811247129">掃描你透過 Chrome 下載或上傳的快取內容和檔案。</translation> <translation id="6710213216561001401">返回</translation> <translation id="6710594484020273272"><輸入搜尋字詞></translation> <translation id="671076103358959139">註冊憑證:</translation> @@ -1077,6 +1086,7 @@ <translation id="681021252041861472">必填欄位</translation> <translation id="6810899417690483278">自訂 ID</translation> <translation id="6825578344716086703">你嘗試連上 <ph name="DOMAIN" />,但伺服器的憑證是以防護力薄弱的簽章演算法 (例如 SHA-1) 進行簽署。這代表伺服器提供的安全性憑證可能遭到偽造,而且這個伺服器可能並不是你的目標伺服器 (你的連線對象可能是攻擊者的電腦)。</translation> +<translation id="6826370046007623921">資料遺失防護</translation> <translation id="6831043979455480757">翻譯</translation> <translation id="6839929833149231406">區域</translation> <translation id="6852204201400771460">要重新載入應用程式嗎?</translation> @@ -1223,6 +1233,7 @@ <translation id="7542995811387359312">由於這個表單並未採用加密連線方式,所以信用卡自動填入功能已停用。</translation> <translation id="7548892272833184391">修正連線錯誤</translation> <translation id="7549584377607005141">這個網頁需要使用你先前輸入的資料才能正確顯示。你可以重新傳送這些資料,不過這麼做會重複執行這個網頁先前執行過的任何動作。</translation> +<translation id="7550637293666041147">你的裝置使用者名稱和 Chrome 使用者名稱</translation> <translation id="7552846755917812628">嘗試按照下列提示操作:</translation> <translation id="7554791636758816595">新增分頁</translation> <translation id="7564049878696755256">你可能會失去 <ph name="ORG_NAME" /> 帳戶存取權,或身分遭到冒用。Chrome 建議你立即變更密碼。</translation> @@ -1237,6 +1248,7 @@ <translation id="7610193165460212391">值超出 <ph name="VALUE" /> 的範圍。</translation> <translation id="7613889955535752492">有效期限:<ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="7615602087246926389">你已經使用其他版本的「Google 帳戶」密碼對資料進行加密,請在下方輸入密碼。</translation> +<translation id="7625784245512586808">Chrome Enterprise 威脅防護</translation> <translation id="7633909222644580952">效能資料和當機報告</translation> <translation id="7637571805876720304">要從 Chromium 中移除信用卡嗎?</translation> <translation id="7638605456503525968">序列埠</translation> @@ -1347,6 +1359,7 @@ <translation id="8211406090763984747">已建立安全連線</translation> <translation id="8218327578424803826">指派的位置:</translation> <translation id="8220146938470311105">C7/C6 (信封)</translation> +<translation id="8220639454292072926">企業報告</translation> <translation id="8225771182978767009">設定這部電腦的使用者選擇封鎖這個網站。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">在新的無痕式分頁中開啟網頁</translation> @@ -1429,6 +1442,7 @@ <translation id="8740359287975076522">找不到 <ph name="HOST_NAME" /> 的 <abbr id="dnsDefinition">DNS 位址</abbr>,正在診斷問題。</translation> <translation id="874846938927089722">接受的信用卡和預付卡</translation> <translation id="874918643257405732">將此分頁加入書籤</translation> +<translation id="8751426954251315517">請稍後再試</translation> <translation id="8759274551635299824">這張信用卡已過期</translation> <translation id="8761567432415473239">Google 安全瀏覽最近在「<ph name="SITE" />」<ph name="BEGIN_LINK" />發現了有害程式<ph name="END_LINK" />。</translation> <translation id="8763927697961133303">USB 裝置</translation> @@ -1493,6 +1507,7 @@ <translation id="9080712759204168376">訂單摘要</translation> <translation id="9089260154716455634">停機時間政策:</translation> <translation id="9095388113577226029">更多語言...</translation> +<translation id="9098981495403789647">系統管理員已為你的瀏覽器啟用 Chrome Enterprise 威脅防護功能。Chrome Enterprise 威脅防護功能可以存取你的部分資料。</translation> <translation id="9103872766612412690"><ph name="SITE" /> 通常使用加密方式保護您的資訊。但 Chromium 這次嘗試連線到 <ph name="SITE" /> 時,該網站傳回了異常且錯誤的憑證。這可能是因為有攻擊者企圖偽裝成 <ph name="SITE" />,或是受到 Wi-Fi 登入畫面影響而造成連線中斷。不過請放心,Chromium 已及時停止連線,並未傳輸任何資料,因此您的資訊仍然安全無虞。</translation> <translation id="9106062320799175032">新增帳單地址</translation> <translation id="9114524666733003316">正在驗證信用卡...</translation>
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc index f80fc71f..f0d28a5 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -212,8 +212,7 @@ SetSubresourceFilterForCommittedLoad(std::move(filter)); } -void SubresourceFilterAgent::DidFailProvisionalLoad( - const blink::WebURLError& error) { +void SubresourceFilterAgent::DidFailProvisionalLoad() { // TODO(engedy): Add a test with `frame-ancestor` violation to exercise this. ResetInfoForNextCommit(); }
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h index 8630a818..e56f5a3 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.h +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -98,7 +98,7 @@ // content::RenderFrameObserver: void OnDestruct() override; void DidCreateNewDocument() override; - void DidFailProvisionalLoad(const blink::WebURLError& error) override; + void DidFailProvisionalLoad() override; void DidFinishLoad() override; void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) override;
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc index 2e93e3b9..c0d4bb1 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
@@ -419,8 +419,7 @@ state->measure_performance = true; agent()->ActivateForNextCommittedLoad(std::move(state), AdFrameType::kNonAd /* ad_type */); - agent_as_rfo()->DidFailProvisionalLoad( - blink::WebURLError(net::ERR_FAILED, blink::WebURL())); + agent_as_rfo()->DidFailProvisionalLoad(); agent_as_rfo()->DidStartNavigation(GURL(), base::nullopt); agent_as_rfo()->ReadyToCommitNavigation(nullptr); agent_as_rfo()->DidCommitProvisionalLoad(
diff --git a/components/ui_devtools/viz/dom_agent_viz.h b/components/ui_devtools/viz/dom_agent_viz.h index e7bc773..db0c08c 100644 --- a/components/ui_devtools/viz/dom_agent_viz.h +++ b/components/ui_devtools/viz/dom_agent_viz.h
@@ -62,6 +62,10 @@ void OnUnregisteredFrameSinkHierarchy( const viz::FrameSinkId& parent_frame_sink_id, const viz::FrameSinkId& child_frame_sink_id) override; + void OnFrameSinkDidBeginFrame(const viz::FrameSinkId& frame_sink_id, + const viz::BeginFrameArgs& args) override {} + void OnFrameSinkDidFinishFrame(const viz::FrameSinkId& frame_sink_id, + const viz::BeginFrameArgs& args) override {} // DOM::Backend: protocol::Response enable() override;
diff --git a/components/viz/host/hit_test/hit_test_query.cc b/components/viz/host/hit_test/hit_test_query.cc index 959b9a985..56e8ac9 100644 --- a/components/viz/host/hit_test/hit_test_query.cc +++ b/components/viz/host/hit_test/hit_test_query.cc
@@ -191,6 +191,13 @@ Target* target) const { gfx::PointF location_transformed(location); + // Exclude a region and all its descendants if the region has the ignore bit + // set. + if (features::IsVizHitTestingSurfaceLayerEnabled() && + hit_test_data_[region_index].flags & HitTestRegionFlags::kHitTestIgnore) { + return false; + } + if (is_location_relative_to_parent) { // HasPerspective() is checked for the transform because the point will not // be transformed correctly for a plane with a different normal.
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index 356ac6f..0fd4f64 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -396,11 +396,14 @@ : 0); } -void Display::UpdateRootFrameMissing() { +bool Display::IsRootFrameMissing() const { Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); - bool root_frame_missing = !surface || !surface->HasActiveFrame(); + return !surface || !surface->HasActiveFrame(); +} + +void Display::UpdateRootFrameMissing() { if (scheduler_) - scheduler_->SetRootFrameMissing(root_frame_missing); + scheduler_->SetRootFrameMissing(IsRootFrameMissing()); } void Display::OnContextLost() {
diff --git a/components/viz/service/display/display.h b/components/viz/service/display/display.h index 1e01b18..0457cb3 100644 --- a/components/viz/service/display/display.h +++ b/components/viz/service/display/display.h
@@ -175,6 +175,8 @@ base::ScopedClosureRunner GetCacheBackBufferCb(); + bool IsRootFrameMissing() const; + private: // TODO(cblume, crbug.com/900973): |enable_shared_images| is a temporary // solution that unblocks us until SharedImages are threadsafe in WebView.
diff --git a/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc b/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc index 02a02664..bb569124 100644 --- a/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc +++ b/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc
@@ -17,16 +17,18 @@ void CompositingModeReporterImpl::SetUsingSoftwareCompositing() { gpu_ = false; - watchers_.ForAllPtrs([](mojom::CompositingModeWatcher* watcher) { - watcher->CompositingModeFallbackToSoftware(); - }); + for (auto& it : watchers_) + it->CompositingModeFallbackToSoftware(); } void CompositingModeReporterImpl::AddCompositingModeWatcher( - mojom::CompositingModeWatcherPtr watcher) { + mojo::PendingRemote<mojom::CompositingModeWatcher> watcher) { + mojo::Remote<mojom::CompositingModeWatcher> watcher_remote( + std::move(watcher)); if (!gpu_) - watcher->CompositingModeFallbackToSoftware(); - watchers_.AddPtr(std::move(watcher)); + watcher_remote->CompositingModeFallbackToSoftware(); + + watchers_.Add(std::move(watcher_remote)); } } // namespace viz
diff --git a/components/viz/service/display_embedder/compositing_mode_reporter_impl.h b/components/viz/service/display_embedder/compositing_mode_reporter_impl.h index 14f9758..5188a03 100644 --- a/components/viz/service/display_embedder/compositing_mode_reporter_impl.h +++ b/components/viz/service/display_embedder/compositing_mode_reporter_impl.h
@@ -8,7 +8,8 @@ #include "base/macros.h" #include "components/viz/service/viz_service_export.h" #include "mojo/public/cpp/bindings/binding_set.h" -#include "mojo/public/cpp/bindings/interface_ptr_set.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote_set.h" #include "services/viz/public/mojom/compositing/compositing_mode_watcher.mojom.h" namespace viz { @@ -32,12 +33,12 @@ // mojom::CompositingModeReporter implementation. void AddCompositingModeWatcher( - mojom::CompositingModeWatcherPtr watcher) override; + mojo::PendingRemote<mojom::CompositingModeWatcher> watcher) override; private: bool gpu_ = true; mojo::BindingSet<mojom::CompositingModeReporter> bindings_; - mojo::InterfacePtrSet<mojom::CompositingModeWatcher> watchers_; + mojo::RemoteSet<mojom::CompositingModeWatcher> watchers_; }; } // namespace viz
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index 5fe7ecd8..abfa4711 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -323,8 +323,10 @@ if (last_activated_surface_id_.is_valid()) surface_manager_->SurfaceModified(last_activated_surface_id_, modified_ack); - if (begin_frame_source_) + if (begin_frame_source_) { begin_frame_source_->DidFinishFrame(this); + frame_sink_manager_->DidFinishFrame(frame_sink_id_, last_begin_frame_args_); + } } void CompositorFrameSinkSupport::SubmitCompositorFrame( @@ -528,8 +530,10 @@ break; } - if (begin_frame_source_) + if (begin_frame_source_) { begin_frame_source_->DidFinishFrame(this); + frame_sink_manager_->DidFinishFrame(frame_sink_id_, last_begin_frame_args_); + } return SubmitResult::ACCEPTED; } @@ -637,6 +641,7 @@ "IssueBeginFrame"); last_frame_time_ = args.frame_time; client_->OnBeginFrame(copy_args, std::move(frame_timing_details_)); + frame_sink_manager_->DidBeginFrame(frame_sink_id_, args); frame_timing_details_.clear(); UpdateNeedsBeginFramesInternal(); }
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc index b64ce75..efd5346 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc +++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc
@@ -4,15 +4,22 @@ #include "components/viz/service/frame_sinks/external_begin_frame_source_mojo.h" +#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h" + namespace viz { ExternalBeginFrameSourceMojo::ExternalBeginFrameSourceMojo( + FrameSinkManagerImpl* frame_sink_manager, mojom::ExternalBeginFrameControllerAssociatedRequest controller_request, uint32_t restart_id) : ExternalBeginFrameSource(this, restart_id), - binding_(this, std::move(controller_request)) {} + frame_sink_manager_(frame_sink_manager), + binding_(this, std::move(controller_request)) { + frame_sink_manager_->AddObserver(this); +} ExternalBeginFrameSourceMojo::~ExternalBeginFrameSourceMojo() { + frame_sink_manager_->RemoveObserver(this); DCHECK(!display_); } @@ -20,16 +27,63 @@ const BeginFrameArgs& args, bool force, base::OnceCallback<void(const BeginFrameAck&)> callback) { + DCHECK(!pending_frame_callback_) << "Got overlapping IssueExternalBeginFrame"; + original_source_id_ = args.source_id; + OnBeginFrame(args); - DCHECK(!pending_frame_callback_) << "Got overlapping IssueExternalBeginFrame"; pending_frame_callback_ = std::move(callback); + // When not forcing a frame, wait for it to occur when sinks needs a frame. + if (!force) + return; // Ensure that Display will receive the BeginFrame (as a missed one), even // if it doesn't currently need it. This way, we ensure that // OnDisplayDidFinishFrame will be called for this BeginFrame. - if (force) - display_->SetNeedsOneBeginFrame(); + DCHECK(display_); + display_->SetNeedsOneBeginFrame(); + MaybeProduceFrameCallback(); +} + +void ExternalBeginFrameSourceMojo::OnDestroyedCompositorFrameSink( + const FrameSinkId& sink_id) { + pending_frame_sinks_.erase(sink_id); + MaybeProduceFrameCallback(); +} + +void ExternalBeginFrameSourceMojo::OnFrameSinkDidBeginFrame( + const FrameSinkId& sink_id, + const BeginFrameArgs& args) { + if (args.source_id != original_source_id_) + return; + pending_frame_sinks_.insert(sink_id); +} + +void ExternalBeginFrameSourceMojo::OnFrameSinkDidFinishFrame( + const FrameSinkId& sink_id, + const BeginFrameArgs& args) { + if (args.source_id != original_source_id_) + return; + pending_frame_sinks_.erase(sink_id); + MaybeProduceFrameCallback(); +} + +void ExternalBeginFrameSourceMojo::MaybeProduceFrameCallback() { + if (!pending_frame_sinks_.empty()) + return; + if (!pending_frame_callback_) + return; + // If root frame is missing, the display scheduler will not produce a + // frame, so fire the pending frame callback early. + if (!display_->IsRootFrameMissing()) + return; + + // All frame sinks are done with frame, yet the root frame is still missing, + // the display won't draw, so resolve callback now. + BeginFrameAck nak(last_begin_frame_args_.source_id, + last_begin_frame_args_.sequence_number, + /*has_damage=*/false); + std::move(pending_frame_callback_).Run(nak); } void ExternalBeginFrameSourceMojo::OnDisplayDidFinishFrame(
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h index 34f65713..fb2361e9 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h +++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
@@ -7,14 +7,18 @@ #include <memory> +#include "base/containers/flat_set.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" #include "components/viz/common/frame_sinks/begin_frame_source.h" #include "components/viz/service/display/display.h" +#include "components/viz/service/frame_sinks/frame_sink_observer.h" #include "mojo/public/cpp/bindings/associated_binding.h" #include "services/viz/privileged/mojom/compositing/external_begin_frame_controller.mojom.h" namespace viz { +class FrameSinkManagerImpl; + // Implementation of ExternalBeginFrameSource that's controlled by IPCs over // the mojom::ExternalBeginFrameController interface. Replaces the Display's // default BeginFrameSource. Observes the Display to be notified of BeginFrame @@ -23,9 +27,11 @@ : public mojom::ExternalBeginFrameController, public DisplayObserver, public ExternalBeginFrameSource, - public ExternalBeginFrameSourceClient { + public ExternalBeginFrameSourceClient, + public FrameSinkObserver { public: ExternalBeginFrameSourceMojo( + FrameSinkManagerImpl* frame_sink_manager, mojom::ExternalBeginFrameControllerAssociatedRequest controller_request, uint32_t restart_id); ~ExternalBeginFrameSourceMojo() override; @@ -46,9 +52,36 @@ void OnDisplayDidFinishFrame(const BeginFrameAck& ack) override; void OnDisplayDestroyed() override; - base::OnceCallback<void(const BeginFrameAck& ack)> pending_frame_callback_; - mojo::AssociatedBinding<mojom::ExternalBeginFrameController> binding_; + // FrameSinkObserver overrides. + void OnRegisteredFrameSinkId(const FrameSinkId& frame_sink_id) override {} + void OnInvalidatedFrameSinkId(const FrameSinkId& frame_sink_id) override {} + void OnCreatedCompositorFrameSink(const FrameSinkId& frame_sink_id, + bool is_root) override {} + void OnDestroyedCompositorFrameSink( + const FrameSinkId& frame_sink_id) override; + void OnRegisteredFrameSinkHierarchy( + const FrameSinkId& parent_frame_sink_id, + const FrameSinkId& child_frame_sink_id) override {} + void OnUnregisteredFrameSinkHierarchy( + const FrameSinkId& parent_frame_sink_id, + const FrameSinkId& child_frame_sink_id) override {} + void OnFrameSinkDidBeginFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) override; + void OnFrameSinkDidFinishFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) override; + void MaybeProduceFrameCallback(); + + FrameSinkManagerImpl* const frame_sink_manager_; + + mojo::AssociatedBinding<mojom::ExternalBeginFrameController> binding_; + base::OnceCallback<void(const BeginFrameAck& ack)> pending_frame_callback_; + // The frame source id as specified in BeginFrameArgs passed to + // IssueExternalBeginFrame. Note this is likely to be different from our + // source id, but this is what will be reported to FrameSinkObserver methods. + uint64_t original_source_id_ = BeginFrameArgs::kStartingSourceId; + + base::flat_set<FrameSinkId> pending_frame_sinks_; Display* display_ = nullptr; };
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index 9e3d6aa..749f1c0 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -566,6 +566,18 @@ return video_detector_.get(); } +void FrameSinkManagerImpl::DidBeginFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) { + for (auto& observer : observer_list_) + observer.OnFrameSinkDidBeginFrame(frame_sink_id, args); +} + +void FrameSinkManagerImpl::DidFinishFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) { + for (auto& observer : observer_list_) + observer.OnFrameSinkDidFinishFrame(frame_sink_id, args); +} + void FrameSinkManagerImpl::AddObserver(FrameSinkObserver* obs) { observer_list_.AddObserver(obs); }
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h index 8284c16..507863c7 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -198,6 +198,11 @@ void OnFrameTokenChanged(const FrameSinkId& frame_sink_id, uint32_t frame_token); + void DidBeginFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args); + void DidFinishFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args); + void AddObserver(FrameSinkObserver* obs); void RemoveObserver(FrameSinkObserver* obs);
diff --git a/components/viz/service/frame_sinks/frame_sink_observer.h b/components/viz/service/frame_sinks/frame_sink_observer.h index bab0bb8..a97bcafb 100644 --- a/components/viz/service/frame_sinks/frame_sink_observer.h +++ b/components/viz/service/frame_sinks/frame_sink_observer.h
@@ -8,6 +8,7 @@ namespace viz { class FrameSinkId; +struct BeginFrameArgs; class FrameSinkObserver { public: @@ -36,6 +37,14 @@ virtual void OnUnregisteredFrameSinkHierarchy( const FrameSinkId& parent_frame_sink_id, const FrameSinkId& child_frame_sink_id) = 0; + + // Called when a sink has started a frame. + virtual void OnFrameSinkDidBeginFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) = 0; + + // Called when a sink has finished processing a frame. + virtual void OnFrameSinkDidFinishFrame(const FrameSinkId& frame_sink_id, + const BeginFrameArgs& args) = 0; }; } // namespace viz
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc index 6d9c0f7..a20afa4 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -64,6 +64,7 @@ if (params->external_begin_frame_controller.is_pending()) { auto owned_external_begin_frame_source_mojo = std::make_unique<ExternalBeginFrameSourceMojo>( + frame_sink_manager, std::move(params->external_begin_frame_controller), restart_id); external_begin_frame_source_mojo = owned_external_begin_frame_source_mojo.get();
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb index d52036e..eeba632 100644 --- a/content/app/strings/translations/content_strings_bn.xtb +++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">দয়া করে অনুরোধ হওয়া বিন্যাসটি মেলান৷</translation> <translation id="7118469954320184356">কোনও বিবরণ নেই।</translation> <translation id="7139483182332611405">মুখবন্ধ</translation> +<translation id="7214187073215825913">কন্টেন্টের তথ্য</translation> <translation id="7263440858009898357">তালিকা থেকে একটি আইটেম নির্বাচন করুন৷ </translation> <translation id="727747134524199931">কলাম শিরোলেখ</translation> <translation id="7320576522385648310">বাফার হচ্ছে</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb index bbe2ed9..3bdb5443 100644 --- a/content/app/strings/translations/content_strings_gu.xtb +++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">કૃપા કરીને વિનંતી કરેલા ફોર્મેટ સાથે મેળ કરો.</translation> <translation id="7118469954320184356">કોઈ વર્ણન ઉપલબ્ધ નથી.</translation> <translation id="7139483182332611405">પ્રસ્તાવના</translation> +<translation id="7214187073215825913">કન્ટેન્ટ વિશેની માહિતી</translation> <translation id="7263440858009898357">કૃપા કરીને સૂચિમાંથી એક આઇટમ પસંદ કરો.</translation> <translation id="727747134524199931">કૉલમ હેડર</translation> <translation id="7320576522385648310">બફર થઈ રહ્યું છે</translation>
diff --git a/content/app/strings/translations/content_strings_id.xtb b/content/app/strings/translations/content_strings_id.xtb index 21cfc5a..1e89c845 100644 --- a/content/app/strings/translations/content_strings_id.xtb +++ b/content/app/strings/translations/content_strings_id.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Sesuaikan dengan format yang diminta.</translation> <translation id="7118469954320184356">Deskripsi tidak tersedia.</translation> <translation id="7139483182332611405">kata pengantar</translation> +<translation id="7214187073215825913">informasi konten</translation> <translation id="7263440858009898357">Pilih item pada daftar.</translation> <translation id="727747134524199931">judul kolom</translation> <translation id="7320576522385648310">buffering</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb index ab6a6da..a8b0d89 100644 --- a/content/app/strings/translations/content_strings_ml.xtb +++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">അഭ്യര്ത്ഥി ച്ചഫോര്മാറ്റ് ദയവായി പൊരുത്തപ്പെടുത്തുക.</translation> <translation id="7118469954320184356">വിവരണം ലഭ്യമല്ല.</translation> <translation id="7139483182332611405">പീഠിക</translation> +<translation id="7214187073215825913">ഉള്ളടക്ക വിവരങ്ങൾ</translation> <translation id="7263440858009898357">പട്ടികയിലെ ഒരു ഇനം ദയവായി തിരഞ്ഞെടുക്കുക</translation> <translation id="727747134524199931">കോളം പേര്</translation> <translation id="7320576522385648310">ബഫർ ചെയ്യൽ</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb index c5d6513..051aed7b 100644 --- a/content/app/strings/translations/content_strings_no.xtb +++ b/content/app/strings/translations/content_strings_no.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Sørg for samsvar med det forespurte formatet.</translation> <translation id="7118469954320184356">Ingen beskrivelse er tilgjengelig.</translation> <translation id="7139483182332611405">forord</translation> +<translation id="7214187073215825913">innholdsinformasjon</translation> <translation id="7263440858009898357">Velg en artikkel i listen.</translation> <translation id="727747134524199931">kolonneoverskrift</translation> <translation id="7320576522385648310">bufring</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb index 73c1595..35e8d1d 100644 --- a/content/app/strings/translations/content_strings_sv.xtb +++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Matcha det format som anges.</translation> <translation id="7118469954320184356">Det finns ingen tillgänglig beskrivning.</translation> <translation id="7139483182332611405">företal</translation> +<translation id="7214187073215825913">innehållsinformation</translation> <translation id="7263440858009898357">Välj ett alternativ i listan.</translation> <translation id="727747134524199931">kolumnrubrik</translation> <translation id="7320576522385648310">buffrar</translation>
diff --git a/content/app/strings/translations/content_strings_sw.xtb b/content/app/strings/translations/content_strings_sw.xtb index 0665062..2c52783d 100644 --- a/content/app/strings/translations/content_strings_sw.xtb +++ b/content/app/strings/translations/content_strings_sw.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Tafadhali linganisha umbizo lililoombwa.</translation> <translation id="7118469954320184356">Hakuna maelezo yanayopatikana.</translation> <translation id="7139483182332611405">dibaji</translation> +<translation id="7214187073215825913">maelezo ya maudhui</translation> <translation id="7263440858009898357">Tafadhali chagua kipengee katika orodha.</translation> <translation id="727747134524199931">kijajuu cha safu wima</translation> <translation id="7320576522385648310">inaakibisha</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb index c27d999..b1ae218 100644 --- a/content/app/strings/translations/content_strings_tr.xtb +++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Lütfen istenen biçimi eşleştirin.</translation> <translation id="7118469954320184356">Açıklama yok.</translation> <translation id="7139483182332611405">önsöz</translation> +<translation id="7214187073215825913">içerik bilgisi</translation> <translation id="7263440858009898357">Lütfen listeden bir öğe seçin.</translation> <translation id="727747134524199931">sütun başlığı</translation> <translation id="7320576522385648310">arabelleğe alınıyor</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb index 359e2b8..c280083 100644 --- a/content/app/strings/translations/content_strings_vi.xtb +++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">Vui lòng khớp với định dạng được yêu cầu.</translation> <translation id="7118469954320184356">Không có nội dung mô tả.</translation> <translation id="7139483182332611405">lời nói đầu</translation> +<translation id="7214187073215825913">thông tin về nội dung</translation> <translation id="7263440858009898357">Vui lòng chọn một mục trong danh sách.</translation> <translation id="727747134524199931">tiêu đề cột</translation> <translation id="7320576522385648310">lưu vào bộ đệm</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb index 3535338..3c23250 100644 --- a/content/app/strings/translations/content_strings_zh-CN.xtb +++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">请与所请求的格式保持一致。</translation> <translation id="7118469954320184356">尚无说明。</translation> <translation id="7139483182332611405">序言</translation> +<translation id="7214187073215825913">内容信息</translation> <translation id="7263440858009898357">请在列表中选择一项。</translation> <translation id="727747134524199931">列标题</translation> <translation id="7320576522385648310">正在缓冲</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb index 54d93f0..95c5641e 100644 --- a/content/app/strings/translations/content_strings_zh-TW.xtb +++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -186,6 +186,7 @@ <translation id="709897737746224366">請符合要求的格式。</translation> <translation id="7118469954320184356">目前沒有說明。</translation> <translation id="7139483182332611405">前言</translation> +<translation id="7214187073215825913">內容資訊</translation> <translation id="7263440858009898357">請選取一個清單中的項目。</translation> <translation id="727747134524199931">欄標題</translation> <translation id="7320576522385648310">緩衝處理中</translation>
diff --git a/content/browser/android/nfc_host.cc b/content/browser/android/nfc_host.cc index 1c61147..c445a89 100644 --- a/content/browser/android/nfc_host.cc +++ b/content/browser/android/nfc_host.cc
@@ -32,14 +32,14 @@ service_manager::Connector* connector = content::GetSystemConnector(); if (connector) { - connector->BindInterface(device::mojom::kServiceName, - mojo::MakeRequest(&nfc_provider_)); + connector->Connect(device::mojom::kServiceName, + nfc_provider_.BindNewPipeAndPassReceiver()); } } -void NFCHost::GetNFC(device::mojom::NFCRequest request) { +void NFCHost::GetNFC(mojo::PendingReceiver<device::mojom::NFC> receiver) { // Connect to an NFC object, associating it with |id_|. - nfc_provider_->GetNFCForHost(id_, std::move(request)); + nfc_provider_->GetNFCForHost(id_, std::move(receiver)); } NFCHost::~NFCHost() {}
diff --git a/content/browser/android/nfc_host.h b/content/browser/android/nfc_host.h index 50a87e08..9c9c404 100644 --- a/content/browser/android/nfc_host.h +++ b/content/browser/android/nfc_host.h
@@ -7,6 +7,8 @@ #include "base/android/jni_android.h" #include "content/public/browser/web_contents.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/nfc_provider.mojom.h" namespace content { @@ -19,7 +21,7 @@ explicit NFCHost(WebContents* web_contents); ~NFCHost(); - void GetNFC(device::mojom::NFCRequest request); + void GetNFC(mojo::PendingReceiver<device::mojom::NFC> receiver); private: // This instance's ID (passed to the NFC implementation via |nfc_provider_| @@ -29,7 +31,7 @@ // The WebContents that owns this instance. WebContents* web_contents_; - device::mojom::NFCProviderPtr nfc_provider_; + mojo::Remote<device::mojom::NFCProvider> nfc_provider_; DISALLOW_COPY_AND_ASSIGN(NFCHost); };
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 557d30e..27908f08 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -51,6 +51,8 @@ map->Add<blink::mojom::LockManager>(base::BindRepeating( &RenderFrameHostImpl::CreateLockManager, base::Unretained(host))); + map->Add<blink::mojom::FileChooser>(base::BindRepeating( + &RenderFrameHostImpl::GetFileChooser, base::Unretained(host))); } void PopulateBinderMapWithContext(
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc index 42ab3396..25ba8c1 100644 --- a/content/browser/code_cache/generated_code_cache.cc +++ b/content/browser/code_cache/generated_code_cache.cc
@@ -147,7 +147,9 @@ const std::string& key() const { return key_; } const scoped_refptr<net::IOBufferWithSize> data() const { return data_; } ReadDataCallback ReleaseReadCallback() { return std::move(read_callback_); } - GetBackendCallback ReleaseCallback() { return std::move(callback_); } + GetBackendCallback ReleaseBackendCallback() { + return std::move(backend_callback_); + } private: PendingOperation(Operation op, @@ -160,7 +162,7 @@ const std::string key_; const scoped_refptr<net::IOBufferWithSize> data_; ReadDataCallback read_callback_; - GetBackendCallback callback_; + GetBackendCallback backend_callback_; }; std::unique_ptr<GeneratedCodeCache::PendingOperation> @@ -178,7 +180,7 @@ const ReadDataCallback& read_callback) { return base::WrapUnique(new PendingOperation( Operation::kFetch, std::move(key), scoped_refptr<net::IOBufferWithSize>(), - read_callback, GetBackendCallback())); + std::move(read_callback), GetBackendCallback())); } std::unique_ptr<GeneratedCodeCache::PendingOperation> @@ -191,11 +193,11 @@ std::unique_ptr<GeneratedCodeCache::PendingOperation> GeneratedCodeCache::PendingOperation::CreateGetBackendPendingOp( - GetBackendCallback callback) { + GetBackendCallback backend_callback) { return base::WrapUnique( new PendingOperation(Operation::kGetBackend, std::string(), scoped_refptr<net::IOBufferWithSize>(), - ReadDataCallback(), std::move(callback))); + ReadDataCallback(), std::move(backend_callback))); } GeneratedCodeCache::PendingOperation::PendingOperation( @@ -203,12 +205,12 @@ std::string key, scoped_refptr<net::IOBufferWithSize> buffer, const ReadDataCallback& read_callback, - GetBackendCallback callback) + GetBackendCallback backend_callback) : op_(op), key_(std::move(key)), data_(buffer), - read_callback_(read_callback), - callback_(std::move(callback)) {} + read_callback_(std::move(read_callback)), + backend_callback_(std::move(backend_callback)) {} GeneratedCodeCache::PendingOperation::~PendingOperation() = default; @@ -264,9 +266,10 @@ std::string key = GetCacheKey(url, origin_lock); // If there is an in progress operation corresponding to this key. Enqueue it // so we can issue once the in-progress operation finishes. - if (EnqueueAsPendingOperation( - key, GeneratedCodeCache::PendingOperation::CreateWritePendingOp( - key, buffer))) { + if (!TryBeginOperation(key)) { + EnqueueAsPendingOperation( + key, GeneratedCodeCache::PendingOperation::CreateWritePendingOp( + key, buffer)); return; } @@ -295,9 +298,10 @@ std::string key = GetCacheKey(url, origin_lock); // If there is an in progress operation corresponding to this key. Enqueue it // so we can issue once the in-progress operation finishes. - if (EnqueueAsPendingOperation( - key, GeneratedCodeCache::PendingOperation::CreateFetchPendingOp( - key, read_data_callback))) { + if (!TryBeginOperation(key)) { + EnqueueAsPendingOperation( + key, GeneratedCodeCache::PendingOperation::CreateFetchPendingOp( + key, read_data_callback)); return; } @@ -392,7 +396,7 @@ DeleteEntryImpl(op->key()); break; case kGetBackend: - DoPendingGetBackend(op->ReleaseCallback()); + DoPendingGetBackend(op->ReleaseBackendCallback()); break; } } @@ -593,18 +597,22 @@ IssueOperation(op.get()); } -bool GeneratedCodeCache::EnqueueAsPendingOperation( +bool GeneratedCodeCache::TryBeginOperation(const std::string& key) { + auto it = active_entries_map_.find(key); + if (it != active_entries_map_.end()) + return false; + + // Create an entry to indicate there is a in-progress operation for this key. + active_entries_map_[key] = base::queue<std::unique_ptr<PendingOperation>>(); + return true; +} + +void GeneratedCodeCache::EnqueueAsPendingOperation( const std::string& key, std::unique_ptr<PendingOperation> op) { auto it = active_entries_map_.find(key); - if (it != active_entries_map_.end()) { - it->second.emplace(std::move(op)); - return true; - } - - // Create a entry to indicate there is a in-progress operation for this key. - active_entries_map_[key] = base::queue<std::unique_ptr<PendingOperation>>(); - return false; + DCHECK(it != active_entries_map_.end()); + it->second.emplace(std::move(op)); } void GeneratedCodeCache::DoPendingGetBackend(GetBackendCallback user_callback) {
diff --git a/content/browser/code_cache/generated_code_cache.h b/content/browser/code_cache/generated_code_cache.h index c8e11d2..3605cb88 100644 --- a/content/browser/code_cache/generated_code_cache.h +++ b/content/browser/code_cache/generated_code_cache.h
@@ -164,9 +164,12 @@ // Issues the queued operation at the front of the queue for the given |key|. void IssueQueuedOperationForEntry(const std::string& key); - // Enqueues into the list if there is an in-progress operation. Otherwise - // creates an entry to indicate there is an active operation. - bool EnqueueAsPendingOperation(const std::string& key, + // Checks for in-progress operations. If there are none, marks the key as + // in-progress and returns true. Otherwise returns false. + bool TryBeginOperation(const std::string& key); + // Enqueues the operation as pending for the key. This should only be called + // if TryBeginOperation returned false. + void EnqueueAsPendingOperation(const std::string& key, std::unique_ptr<PendingOperation> op); void IssueOperation(PendingOperation* op);
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index 82707fc..4196b270 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -428,7 +428,7 @@ viz::mojom::ExternalBeginFrameControllerAssociatedRequest request = nullptr; external_begin_frame_source_mojo = std::make_unique<viz::ExternalBeginFrameSourceMojo>( - std::move(request), + GetFrameSinkManager(), std::move(request), viz::BeginFrameSource::kNotRestartableId); begin_frame_source = external_begin_frame_source_mojo.get(); } else if (disable_frame_rate_limit_) {
diff --git a/content/browser/devtools/protocol/system_info_handler.cc b/content/browser/devtools/protocol/system_info_handler.cc index 670bfaf5..6e0f4119 100644 --- a/content/browser/devtools/protocol/system_info_handler.cc +++ b/content/browser/devtools/protocol/system_info_handler.cc
@@ -47,9 +47,11 @@ } // Give the GPU process a few seconds to provide GPU info. // Linux Debug builds need more time -- see Issue 796437. -// Windows builds need more time -- see Issue 873112. -#if (defined(OS_LINUX) && !defined(NDEBUG)) || defined(OS_WIN) +// Windows builds need more time -- see Issue 873112 and 1004472. +#if (defined(OS_LINUX) && !defined(NDEBUG)) const int kGPUInfoWatchdogTimeoutMs = 20000; +#elif defined(OS_WIN) +const int kGPUInfoWatchdogTimeoutMs = 30000; #else const int kGPUInfoWatchdogTimeoutMs = 5000; #endif @@ -288,10 +290,16 @@ } void OnGpuInfoUpdate() override { - if (GpuDataManagerImpl::GetInstance()->IsGpuFeatureInfoAvailable() && - GpuDataManagerImpl::GetInstance()->IsDx12VulkanVersionAvailable()) { - UnregisterAndSendResponse(); - } + if (!GpuDataManagerImpl::GetInstance()->IsGpuFeatureInfoAvailable()) + return; + base::CommandLine* command = base::CommandLine::ForCurrentProcess(); + // Only wait for DX12/Vulkan info if requested at Chrome start up. + if (!command->HasSwitch( + switches::kDisableGpuProcessForDX12VulkanInfoCollection) && + command->HasSwitch(switches::kNoDelayForDX12VulkanInfoCollection) && + !GpuDataManagerImpl::GetInstance()->IsDx12VulkanVersionAvailable()) + return; + UnregisterAndSendResponse(); } void OnGpuProcessCrashed(base::TerminationStatus exit_code) override {
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 9d5e2589..d637be2 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -83,7 +83,6 @@ namespace content { namespace { -#if defined(OS_ANDROID) void DeleteDownloadedFileOnUIThread(const base::FilePath& file_path) { if (!file_path.empty()) { download::GetDownloadTaskRunner()->PostTask( @@ -92,7 +91,6 @@ file_path)); } } -#endif StoragePartitionImpl* GetStoragePartition(BrowserContext* context, int render_process_id, @@ -552,16 +550,16 @@ uint32_t id = download->GetId(); if (id > max_id) max_id = id; -#if defined(OS_ANDROID) - // On android, clean up cancelled and non resumable interrupted downloads. + + // Clean up cancelled and non resumable interrupted downloads. if (ShouldClearDownloadFromDB(download->GetURL(), download->GetState(), - download->GetLastReason())) { + download->GetLastReason(), + download->GetStartTime())) { cleared_download_guids_on_startup_.insert(download->GetGuid()); DeleteDownloadedFileOnUIThread(download->GetFullPath()); it = in_progress_downloads_.erase(it); continue; } -#endif // defined(OS_ANDROID) ++it; } PostInitialization(DOWNLOAD_INITIALIZATION_DEPENDENCY_IN_PROGRESS_CACHE); @@ -902,20 +900,20 @@ // Retrive the in-progress download if it exists. Notice that this also // removes it from |in_progress_downloads_|. auto in_progress_download = RetrieveInProgressDownload(id); -#if defined(OS_ANDROID) - // On Android, there is no way to interact with cancelled or non-resumable - // download. Simply returning null and don't store them in this class to - // reduce memory usage. + + // Return null to clear cancelled or non-resumable download. if (cleared_download_guids_on_startup_.find(guid) != cleared_download_guids_on_startup_.end()) { return nullptr; } + if (url_chain.empty() || - ShouldClearDownloadFromDB(url_chain.back(), state, interrupt_reason)) { + ShouldClearDownloadFromDB(url_chain.back(), state, interrupt_reason, + start_time)) { DeleteDownloadedFileOnUIThread(current_path); return nullptr; } -#endif + auto item = base::WrapUnique(item_factory_->CreatePersistedItem( this, guid, id, current_path, target_path, url_chain, referrer_url, site_url, tab_url, tab_refererr_url, request_initiator, mime_type, @@ -991,28 +989,26 @@ if (!history_loaded || !in_progress_cache_initialized_) return; -#if defined(OS_ANDROID) - for (const auto& guid : cleared_download_guids_on_startup_) - in_progress_manager_->RemoveInProgressDownload(guid); - if (cancelled_download_cleared_from_history_ > 0) { - UMA_HISTOGRAM_COUNTS_1000( - "MobileDownload.CancelledDownloadRemovedFromHistory", - cancelled_download_cleared_from_history_); - } + for (const auto& guid : cleared_download_guids_on_startup_) { + in_progress_manager_->RemoveInProgressDownload(guid); + } - if (interrupted_download_cleared_from_history_ > 0) { - UMA_HISTOGRAM_COUNTS_1000( - "MobileDownload.InterruptedDownloadsRemovedFromHistory", - interrupted_download_cleared_from_history_); - } -#endif + if (cancelled_download_cleared_from_history_ > 0) { + UMA_HISTOGRAM_COUNTS_1000("Download.CancelledDownloadRemovedFromHistory", + cancelled_download_cleared_from_history_); + } - if (in_progress_downloads_.empty()) { - OnDownloadManagerInitialized(); - } else { - GetNextId(base::BindOnce(&DownloadManagerImpl::ImportInProgressDownloads, - weak_factory_.GetWeakPtr())); - } + if (interrupted_download_cleared_from_history_ > 0) { + UMA_HISTOGRAM_COUNTS_1000("Download.InterruptedDownloadsRemovedFromHistory", + interrupted_download_cleared_from_history_); + } + + if (in_progress_downloads_.empty()) { + OnDownloadManagerInitialized(); + } else { + GetNextId(base::BindOnce(&DownloadManagerImpl::ImportInProgressDownloads, + weak_factory_.GetWeakPtr())); + } } void DownloadManagerImpl::ImportInProgressDownloads(uint32_t id) { @@ -1338,25 +1334,33 @@ return is_history_download_id_retrieved_ && in_progress_cache_initialized_; } -#if defined(OS_ANDROID) bool DownloadManagerImpl::ShouldClearDownloadFromDB( const GURL& url, download::DownloadItem::DownloadState state, - download::DownloadInterruptReason reason) { - if (state == download::DownloadItem::CANCELLED) { + download::DownloadInterruptReason reason, + const base::Time& start_time) { + if (!base::FeatureList::IsEnabled( + download::features::kDeleteExpiredDownloads)) { + return false; + } + + // Use system time to determine if the download is expired. Manually setting + // the system time can affect this. + bool expired = base::Time::Now() - start_time >= + download::GetExpiredDownloadDeleteTime(); + if (state == download::DownloadItem::CANCELLED && expired) { ++cancelled_download_cleared_from_history_; return true; } + if (reason != download::DOWNLOAD_INTERRUPT_REASON_NONE && - download::GetDownloadResumeMode(url, reason, false /* restart_required */, - false /* user_action_required */) == - download::ResumeMode::INVALID) { + state == download::DownloadItem::INTERRUPTED && expired) { ++interrupted_download_cleared_from_history_; return true; } + return false; } -#endif // defined(OS_ANDROID) std::unique_ptr<download::DownloadItemImpl> DownloadManagerImpl::RetrieveInProgressDownload(uint32_t id) {
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h index 7be699b..63b66ecc 100644 --- a/content/browser/download/download_manager_impl.h +++ b/content/browser/download/download_manager_impl.h
@@ -281,14 +281,12 @@ // Called when this object is considered initialized. void OnDownloadManagerInitialized(); -#if defined(OS_ANDROID) - // Check whether a download should be cleared from history. On Android, - // cancelled and non-resumable interrupted download will be cleaned up to - // save memory. + // Check whether a download should be cleared from history. Cancelled and + // non-resumable interrupted download will be cleaned up to save memory. bool ShouldClearDownloadFromDB(const GURL& url, download::DownloadItem::DownloadState state, - download::DownloadInterruptReason reason); -#endif // defined(OS_ANDROID) + download::DownloadInterruptReason reason, + const base::Time& start_time); // Factory for creation of downloads items. std::unique_ptr<download::DownloadItemFactory> item_factory_;
diff --git a/content/browser/field_trial_recorder.cc b/content/browser/field_trial_recorder.cc index 51540dcd..65b115ec 100644 --- a/content/browser/field_trial_recorder.cc +++ b/content/browser/field_trial_recorder.cc
@@ -4,8 +4,14 @@ #include "content/browser/field_trial_recorder.h" +#include <memory> +#include <string> +#include <utility> + #include "base/metrics/field_trial.h" -#include "mojo/public/cpp/bindings/strong_binding.h" +#include "content/common/field_trial_recorder.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" namespace content { @@ -15,9 +21,9 @@ // static void FieldTrialRecorder::Create( - mojom::FieldTrialRecorderRequest request) { - mojo::MakeStrongBinding(std::make_unique<FieldTrialRecorder>(), - std::move(request)); + mojo::PendingReceiver<mojom::FieldTrialRecorder> receiver) { + mojo::MakeSelfOwnedReceiver(std::make_unique<FieldTrialRecorder>(), + std::move(receiver)); } void FieldTrialRecorder::FieldTrialActivated(const std::string& trial_name) { @@ -28,4 +34,4 @@ base::FieldTrialList::FindFullName(trial_name); } -} // namespce content +} // namespace content
diff --git a/content/browser/field_trial_recorder.h b/content/browser/field_trial_recorder.h index ab425d5..040e2f5 100644 --- a/content/browser/field_trial_recorder.h +++ b/content/browser/field_trial_recorder.h
@@ -7,6 +7,7 @@ #include "base/threading/thread_checker.h" #include "content/common/field_trial_recorder.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace content { @@ -15,7 +16,7 @@ FieldTrialRecorder(); ~FieldTrialRecorder() override; - static void Create(mojom::FieldTrialRecorderRequest request); + static void Create(mojo::PendingReceiver<mojom::FieldTrialRecorder> receiver); private: // content::mojom::FieldTrialRecorder:
diff --git a/content/browser/frame_host/back_forward_cache.cc b/content/browser/frame_host/back_forward_cache.cc index 660cf9f6..b83baae 100644 --- a/content/browser/frame_host/back_forward_cache.cc +++ b/content/browser/frame_host/back_forward_cache.cc
@@ -207,10 +207,6 @@ auto matching_rfh = std::find_if( render_frame_hosts_.begin(), render_frame_hosts_.end(), [navigation_entry_id](std::unique_ptr<RenderFrameHostImpl>& rfh) { - // Never restore evicted frames. - if (rfh->is_evicted_from_back_forward_cache()) - return false; - return rfh->nav_entry_id() == navigation_entry_id; });
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc index c8c28a5..606d4535 100644 --- a/content/browser/frame_host/navigation_controller_impl.cc +++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -528,7 +528,10 @@ } NavigationControllerImpl::~NavigationControllerImpl() { - DiscardNonCommittedEntriesInternal(); + // The NavigationControllerImpl might be called inside its delegate + // destructor. Calling it is not valid anymore. + delegate_ = nullptr; + DiscardNonCommittedEntries(); } WebContents* NavigationControllerImpl::GetWebContents() { @@ -592,7 +595,7 @@ // should also update the current_index. current_index = pending_entry_index_; } else { - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); current_index = GetCurrentEntryIndex(); if (current_index != -1) { entry = GetEntryAtIndex(current_index); @@ -618,7 +621,7 @@ delegate_->ActivateAndShowRepostFormWarningDialog(); } else { if (!IsInitialNavigation()) - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); pending_entry_ = entry; pending_entry_index_ = current_index; @@ -662,7 +665,7 @@ void NavigationControllerImpl::SetPendingEntry( std::unique_ptr<NavigationEntryImpl> entry) { - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); pending_entry_ = entry.release(); DCHECK_EQ(-1, pending_entry_index_); NotificationService::current()->Notify( @@ -1088,10 +1091,8 @@ // discard it and make sure it is removed from the URL bar. After that, // there is nothing we can do with this navigation, so we just return to // the caller that nothing has happened. - if (pending_entry_) { + if (pending_entry_) DiscardNonCommittedEntries(); - delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); - } return false; default: NOTREACHED(); @@ -1112,7 +1113,7 @@ // TODO(pbos): Consider a CHECK here that verifies that the pending entry has // been cleared instead of protecting against it. if (!keep_pending_entry) - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); // All committed entries should have nonempty content state so WebKit doesn't // get confused when we go back to them (see the function for details). @@ -1470,7 +1471,7 @@ // navigation. Now we know that the renderer has updated its state accordingly // and it is safe to also clear the browser side history. if (params.history_list_was_cleared) { - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); entries_.clear(); last_committed_entry_index_ = -1; } @@ -1661,7 +1662,7 @@ // Note that we need to use the "internal" version since we don't want to // actually change any other state, just kill the pointer. if (!keep_pending_entry) - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); // If a transient entry was removed, the indices might have changed, so we // have to query the entry index again. @@ -1820,7 +1821,7 @@ // We only need to discard the pending entry in this history navigation // case. For newly created subframes, there was no pending entry. last_committed_entry_index_ = entry_index; - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); // History navigations should send a commit notification. send_commit_notification = true; @@ -2399,17 +2400,6 @@ last_committed_entry_index_--; } -void NavigationControllerImpl::DiscardNonCommittedEntries() { - bool transient = transient_entry_index_ != -1; - DiscardNonCommittedEntriesInternal(); - - // If there was a transient entry, invalidate everything so the new active - // entry state is shown. - if (transient) { - delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); - } -} - NavigationEntryImpl* NavigationControllerImpl::GetPendingEntry() { // If there is no pending_entry_, there should be no pending_entry_index_. DCHECK(pending_entry_ || pending_entry_index_ == -1); @@ -2444,7 +2434,7 @@ if (pending_entry_ && pending_entry_index_ == -1) entry->set_unique_id(pending_entry_->GetUniqueID()); - DiscardNonCommittedEntriesInternal(); + DiscardNonCommittedEntries(); int current_size = static_cast<int>(entries_.size()); @@ -3379,9 +3369,11 @@ last_committed_entry_index_ = selected_index; } -void NavigationControllerImpl::DiscardNonCommittedEntriesInternal() { +void NavigationControllerImpl::DiscardNonCommittedEntries() { DiscardPendingEntry(false); DiscardTransientEntry(); + if (delegate_) + delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); } void NavigationControllerImpl::DiscardTransientEntry() {
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h index 19733b1..1841215 100644 --- a/content/browser/frame_host/navigation_controller_impl.h +++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -444,9 +444,6 @@ // Removes the entry at |index|, as long as it is not the current entry. void RemoveEntryAtIndexInternal(int index); - // Discards both the pending and transient entries. - void DiscardNonCommittedEntriesInternal(); - // Discards only the transient entry. void DiscardTransientEntry();
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index 656561d..a4208f3 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -1072,7 +1072,7 @@ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); EXPECT_TRUE(controller.GetPendingEntry()); EXPECT_EQ(-1, controller.GetLastCommittedEntryIndex()); - EXPECT_EQ(1, delegate->navigation_state_change_count()); + EXPECT_EQ(2, delegate->navigation_state_change_count()); // Certain rare cases can make a direct DidCommitProvisionalLoad call without // going to the browser. Renderer reload of an about:blank is such a case. @@ -1083,7 +1083,7 @@ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); EXPECT_FALSE(controller.GetPendingEntry()); EXPECT_EQ(-1, controller.GetLastCommittedEntryIndex()); - EXPECT_EQ(2, delegate->navigation_state_change_count()); + EXPECT_EQ(3, delegate->navigation_state_change_count()); contents()->SetDelegate(nullptr); } @@ -1110,7 +1110,7 @@ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); EXPECT_TRUE(controller.GetPendingEntry()); EXPECT_EQ(-1, controller.GetLastCommittedEntryIndex()); - EXPECT_EQ(1, delegate->navigation_state_change_count()); + EXPECT_EQ(2, delegate->navigation_state_change_count()); // It may abort before committing, if it's a download or due to a stop or // a new navigation from the user. @@ -1122,7 +1122,7 @@ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); EXPECT_TRUE(controller.GetPendingEntry()); EXPECT_EQ(-1, controller.GetLastCommittedEntryIndex()); - EXPECT_EQ(1, delegate->navigation_state_change_count()); + EXPECT_EQ(2, delegate->navigation_state_change_count()); NavigationEntry* pending_entry = controller.GetPendingEntry(); // Ensure that a reload keeps the same pending entry. @@ -1163,9 +1163,9 @@ EXPECT_EQ(-1, controller.GetPendingEntryIndex()); EXPECT_TRUE(controller.GetPendingEntry()); EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); - // The delegate should have been notified twice: once for the loading state - // change, and once for the url change. - EXPECT_EQ(2, delegate->navigation_state_change_count()); + // The delegate should have been notified at least twice: once for the loading + // state change, and once for the url change. + EXPECT_EQ(3, delegate->navigation_state_change_count()); // The visible entry should be the last committed URL, not the pending one. EXPECT_EQ(kExistingURL, controller.GetVisibleEntry()->GetURL()); @@ -1189,7 +1189,7 @@ EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); // The delegate should have been notified twice: once for the loading state // change, and once for the url change. - EXPECT_EQ(4, delegate->navigation_state_change_count()); + EXPECT_EQ(5, delegate->navigation_state_change_count()); // The visible entry should be the last committed URL, not the pending one, // so that no spoof is possible.
diff --git a/content/browser/frame_host/render_frame_host_delegate.cc b/content/browser/frame_host/render_frame_host_delegate.cc index 76a68ea7..4e6e725 100644 --- a/content/browser/frame_host/render_frame_host_delegate.cc +++ b/content/browser/frame_host/render_frame_host_delegate.cc
@@ -97,7 +97,8 @@ } #if defined(OS_ANDROID) -void RenderFrameHostDelegate::GetNFC(device::mojom::NFCRequest request) {} +void RenderFrameHostDelegate::GetNFC( + mojo::PendingReceiver<device::mojom::NFC> receiver) {} #endif bool RenderFrameHostDelegate::ShouldRouteMessageEvent(
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index e3997f81..9f27141 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -21,6 +21,7 @@ #include "content/public/common/javascript_dialog_type.h" #include "content/public/common/resource_load_info.mojom.h" #include "content/public/common/resource_type.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" #include "net/cert/cert_status_flags.h" #include "net/http/http_response_headers.h" @@ -260,7 +261,7 @@ #if defined(OS_ANDROID) // Gets an NFC implementation within the context of this delegate. - virtual void GetNFC(device::mojom::NFCRequest request); + virtual void GetNFC(mojo::PendingReceiver<device::mojom::NFC> receiver); #endif // Notification that the frame wants to go into fullscreen mode.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index bfcb977f..4ed6e41 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -572,11 +572,12 @@ using FileChooserResult = blink::mojom::FileChooserResult; public: - static void Create(RenderFrameHostImpl* render_frame_host, - blink::mojom::FileChooserRequest request) { - mojo::MakeStrongBinding( + static void Create( + RenderFrameHostImpl* render_frame_host, + mojo::PendingReceiver<blink::mojom::FileChooser> receiver) { + mojo::MakeSelfOwnedReceiver( std::make_unique<FileChooserImpl>(render_frame_host), - std::move(request)); + std::move(receiver)); } FileChooserImpl(RenderFrameHostImpl* render_frame_host) @@ -1896,7 +1897,7 @@ } void RenderFrameHostImpl::DeleteRenderFrame(FrameDeleteIntention intent) { - if (!is_active()) + if (unload_state_ != UnloadState::NotRun) return; if (render_frame_created_) { @@ -4307,7 +4308,7 @@ #if defined(OS_ANDROID) if (base::FeatureList::IsEnabled(features::kWebNfc)) { registry_->AddInterface<device::mojom::NFC>(base::Bind( - &RenderFrameHostImpl::BindNFCRequest, base::Unretained(this))); + &RenderFrameHostImpl::BindNFCReceiver, base::Unretained(this))); } #endif @@ -4469,9 +4470,6 @@ registry_->AddInterface(base::BindRepeating(&ContactsManagerImpl::Create, base::Unretained(this))); - registry_->AddInterface( - base::BindRepeating(&FileChooserImpl::Create, base::Unretained(this))); - registry_->AddInterface(base::BindRepeating(&WakeLockServiceImpl::Create, base::Unretained(this))); @@ -6246,21 +6244,21 @@ } void RenderFrameHostImpl::CreateAudioOutputStreamFactory( - mojom::RendererAudioOutputStreamFactoryRequest request) { + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) { if (base::FeatureList::IsEnabled(features::kAudioServiceAudioStreams)) { media::AudioSystem* audio_system = BrowserMainLoop::GetInstance()->audio_system(); MediaStreamManager* media_stream_manager = BrowserMainLoop::GetInstance()->media_stream_manager(); audio_service_audio_output_stream_factory_.emplace( - this, audio_system, media_stream_manager, std::move(request)); + this, audio_system, media_stream_manager, std::move(receiver)); } else { RendererAudioOutputStreamFactoryContext* factory_context = GetProcess()->GetRendererAudioOutputStreamFactoryContext(); DCHECK(factory_context); in_content_audio_output_stream_factory_ = RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( - factory_context, GetRoutingID(), std::move(request)); + factory_context, GetRoutingID(), std::move(receiver)); } } @@ -6295,7 +6293,8 @@ } #if defined(OS_ANDROID) -void RenderFrameHostImpl::BindNFCRequest(device::mojom::NFCRequest request) { +void RenderFrameHostImpl::BindNFCReceiver( + mojo::PendingReceiver<device::mojom::NFC> receiver) { // https://w3c.github.io/web-nfc/#security-policies // WebNFC API must be only accessible from top level browsing context. if (GetParent()) { @@ -6304,7 +6303,7 @@ return; } if (delegate_) - delegate_->GetNFC(std::move(request)); + delegate_->GetNFC(std::move(receiver)); } #endif @@ -6358,6 +6357,11 @@ speech_synthesis_impl_->AddReceiver(std::move(receiver)); } +void RenderFrameHostImpl::GetFileChooser( + mojo::PendingReceiver<blink::mojom::FileChooser> receiver) { + FileChooserImpl::Create(this, std::move(receiver)); +} + blink::mojom::FileChooserPtr RenderFrameHostImpl::BindFileChooserForTesting() { blink::mojom::FileChooserPtr chooser; FileChooserImpl::Create(this, mojo::MakeRequest(&chooser));
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 6800a77a..44122a2 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -1046,6 +1046,8 @@ void CreateLockManager( mojo::PendingReceiver<blink::mojom::LockManager> receiver); + void GetFileChooser( + mojo::PendingReceiver<blink::mojom::FileChooser> receiver); // https://mikewest.github.io/corpp/#initialize-embedder-policy-for-global network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy() @@ -1521,7 +1523,7 @@ void CreateAudioInputStreamFactory( mojo::PendingReceiver<mojom::RendererAudioInputStreamFactory> receiver); void CreateAudioOutputStreamFactory( - mojom::RendererAudioOutputStreamFactoryRequest request); + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); void BindMediaInterfaceFactoryRequest( media::mojom::InterfaceFactoryRequest request); @@ -1536,7 +1538,7 @@ void OnMediaInterfaceFactoryConnectionError(); #if defined(OS_ANDROID) - void BindNFCRequest(device::mojom::NFCRequest request); + void BindNFCReceiver(mojo::PendingReceiver<device::mojom::NFC> receiver); #endif #if !defined(OS_ANDROID)
diff --git a/content/browser/gpu/gpu_data_manager_impl.cc b/content/browser/gpu/gpu_data_manager_impl.cc index 21930892..2dc0e56 100644 --- a/content/browser/gpu/gpu_data_manager_impl.cc +++ b/content/browser/gpu/gpu_data_manager_impl.cc
@@ -130,6 +130,11 @@ base::AutoLock auto_lock(lock_); private_->UpdateDx12VulkanRequestStatus(request_continues); } + +bool GpuDataManagerImpl::Dx12VulkanRequested() const { + base::AutoLock auto_lock(lock_); + return private_->Dx12VulkanRequested(); +} #endif void GpuDataManagerImpl::UpdateGpuFeatureInfo(
diff --git a/content/browser/gpu/gpu_data_manager_impl.h b/content/browser/gpu/gpu_data_manager_impl.h index 23c13b2b..12290fa 100644 --- a/content/browser/gpu/gpu_data_manager_impl.h +++ b/content/browser/gpu/gpu_data_manager_impl.h
@@ -81,6 +81,7 @@ const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info); void UpdateDxDiagNodeRequestStatus(bool request_continues); void UpdateDx12VulkanRequestStatus(bool request_continues); + bool Dx12VulkanRequested() const; #endif // Update the GPU feature info. This updates the blacklist and enabled status // of GPU rasterization. In the future this will be used for more features.
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index 14de90926..45335d3 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -377,7 +377,6 @@ #if defined(OS_WIN) if (gpu_info_dx_diag_requested_) return; - gpu_info_dx_diag_requested_ = true; GpuProcessHost::CallOnIO( GPU_PROCESS_KIND_UNSANDBOXED_NO_GL, true /* force_create */, @@ -400,10 +399,9 @@ void GpuDataManagerImplPrivate::RequestGpuSupportedRuntimeVersion( bool delayed) { #if defined(OS_WIN) - if (gpu_info_dx12_vulkan_requested_) - return; - base::OnceClosure task = base::BindOnce([]() { + if (GpuDataManagerImpl::GetInstance()->Dx12VulkanRequested()) + return; GpuProcessHost* host = GpuProcessHost::Get( GPU_PROCESS_KIND_UNSANDBOXED_NO_GL, true /* force_create */); if (!host) { @@ -421,8 +419,6 @@ base::PostDelayedTask(FROM_HERE, {BrowserThread::IO}, std::move(task), base::TimeDelta::FromSeconds(120)); } else { - gpu_info_dx12_vulkan_requested_ = true; - gpu_info_dx12_vulkan_request_failed_ = false; base::PostTask(FROM_HERE, {BrowserThread::IO}, std::move(task)); } #endif @@ -435,10 +431,11 @@ bool GpuDataManagerImplPrivate::IsDx12VulkanVersionAvailable() const { #if defined(OS_WIN) - // gpu_integration_test needs dx12/Vulkan info. If this info is needed, - // --no-delay-for-dx12-vulkan-info-collection should be added to the browser - // command line. This function returns the status of availability to the tests - // based on whether gpu info has been requested or not. + // Certain gpu_integration_test needs dx12/Vulkan info. If this info is + // needed, --no-delay-for-dx12-vulkan-info-collection should be added to the + // browser command line, so that the collection of this info isn't delayed. + // This function returns the status of availability to the tests based on + // whether gpu info has been requested or not. return gpu_info_dx12_vulkan_valid_ || !gpu_info_dx12_vulkan_requested_ || gpu_info_dx12_vulkan_request_failed_; @@ -567,6 +564,10 @@ if (gpu_info_dx12_vulkan_request_failed_) NotifyGpuInfoUpdate(); } + +bool GpuDataManagerImplPrivate::Dx12VulkanRequested() const { + return gpu_info_dx12_vulkan_requested_; +} #endif void GpuDataManagerImplPrivate::UpdateGpuFeatureInfo(
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.h b/content/browser/gpu/gpu_data_manager_impl_private.h index 0f0c81f..71dc0bf 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.h +++ b/content/browser/gpu/gpu_data_manager_impl_private.h
@@ -66,6 +66,7 @@ const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info); void UpdateDx12VulkanRequestStatus(bool request_continues); void UpdateDxDiagNodeRequestStatus(bool request_continues); + bool Dx12VulkanRequested() const; #endif void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info, const base::Optional<gpu::GpuFeatureInfo>&
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 9249325..dd8c792b 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -41,6 +41,7 @@ #include "gpu/config/gpu_feature_type.h" #include "gpu/config/gpu_info.h" #include "gpu/config/gpu_lists_version.h" +#include "gpu/config/gpu_util.h" #include "gpu/ipc/common/gpu_memory_buffer_support.h" #include "gpu/ipc/host/gpu_memory_buffer_support.h" #include "skia/ext/skia_commit_hash.h" @@ -114,27 +115,6 @@ } return list; } - -std::string D3dFeaturelevelToString(uint32_t d3d_feature_level) { - if (d3d_feature_level == 0) { - return "Not supported"; - } else { - return base::StringPrintf("D3D %d.%d", (d3d_feature_level >> 12) & 0xF, - (d3d_feature_level >> 8) & 0xF); - } -} - -std::string VulkanVersionToString(uint32_t vulkan_version) { - if (vulkan_version == 0) { - return "Not supported"; - } else { - // Vulkan version number VK_MAKE_VERSION(major, minor, patch) - // (((major) << 22) | ((minor) << 12) | (patch)) - return base::StringPrintf( - "Vulkan API %d.%d.%d", (vulkan_version >> 22) & 0x3FF, - (vulkan_version >> 12) & 0x3FF, vulkan_version & 0xFFF); - } -} #endif std::string GPUDeviceToString(const gpu::GPUInfo::GPUDevice& gpu) { @@ -212,12 +192,13 @@ basic_info->Append(NewDescriptionValuePair( "Driver D3D12 feature level", - D3dFeaturelevelToString( + gpu::D3DFeatureLevelToString( gpu_info.dx12_vulkan_version_info.d3d12_feature_level))); basic_info->Append(NewDescriptionValuePair( "Driver Vulkan API version", - VulkanVersionToString(gpu_info.dx12_vulkan_version_info.vulkan_version))); + gpu::VulkanVersionToString( + gpu_info.dx12_vulkan_version_info.vulkan_version))); #endif basic_info->Append(
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index d38084e3..7ae9b631e 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -46,6 +46,7 @@ #include "content/browser/service_manager/service_manager_context.h" #include "content/common/child_process.mojom.h" #include "content/common/child_process_host_impl.h" +#include "content/common/field_trial_recorder.mojom.h" #include "content/common/in_process_child_thread_params.h" #include "content/common/service_manager/child_connection.h" #include "content/common/view_messages.h" @@ -73,6 +74,8 @@ #include "media/base/media_switches.h" #include "media/media_buildflags.h" #include "mojo/public/cpp/bindings/associated_remote.h" +#include "mojo/public/cpp/bindings/generic_pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/interface_provider.h" @@ -607,12 +610,15 @@ std::move(interface_pipe)); } -void GpuProcessHost::BindHostReceiver(mojo::GenericPendingReceiver receiver) { - if (auto field_trial_receiver = receiver.As<mojom::FieldTrialRecorder>()) { - mojom::FieldTrialRecorderRequest request(std::move(field_trial_receiver)); +void GpuProcessHost::BindHostReceiver( + mojo::GenericPendingReceiver generic_receiver) { + if (auto field_trial_receiver = + generic_receiver.As<mojom::FieldTrialRecorder>()) { + mojo::PendingReceiver<mojom::FieldTrialRecorder> receiver( + std::move(field_trial_receiver)); base::PostTask( FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&FieldTrialRecorder::Create, std::move(request))); + base::BindOnce(&FieldTrialRecorder::Create, std::move(receiver))); } }
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h index 555bfed..8a614c3 100644 --- a/content/browser/gpu/gpu_process_host.h +++ b/content/browser/gpu/gpu_process_host.h
@@ -161,7 +161,7 @@ override; void BindInterface(const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) override; - void BindHostReceiver(mojo::GenericPendingReceiver receiver) override; + void BindHostReceiver(mojo::GenericPendingReceiver generic_receiver) override; void RunService( const std::string& service_name, mojo::PendingReceiver<service_manager::mojom::Service> receiver) override;
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc index 4d2b00d..0a270e1 100644 --- a/content/browser/hid/hid_service_unittest.cc +++ b/content/browser/hid/hid_service_unittest.cc
@@ -11,6 +11,8 @@ #include "content/public/common/content_switches.h" #include "content/test/test_render_view_host.h" #include "content/test/test_web_contents.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "services/device/public/cpp/hid/fake_hid_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -25,10 +27,12 @@ class FakeHidConnectionClient : public device::mojom::HidConnectionClient { public: - FakeHidConnectionClient() : binding_(this) {} + FakeHidConnectionClient() = default; + ~FakeHidConnectionClient() override = default; - void Bind(device::mojom::HidConnectionClientRequest request) { - binding_.Bind(std::move(request)); + void Bind( + mojo::PendingReceiver<device::mojom::HidConnectionClient> receiver) { + receiver_.Bind(std::move(receiver)); } // mojom::HidConnectionClient: @@ -36,7 +40,7 @@ const std::vector<uint8_t>& buffer) override {} private: - mojo::Binding<device::mojom::HidConnectionClient> binding_; + mojo::Receiver<device::mojom::HidConnectionClient> receiver_{this}; DISALLOW_COPY_AND_ASSIGN(FakeHidConnectionClient); };
diff --git a/content/browser/media/audio_output_stream_broker.cc b/content/browser/media/audio_output_stream_broker.cc index 434b363ff..1cf8dba 100644 --- a/content/browser/media/audio_output_stream_broker.cc +++ b/content/browser/media/audio_output_stream_broker.cc
@@ -175,8 +175,7 @@ return; } - client_->Created(media::mojom::AudioOutputStreamPtr(std::move(stream)), - std::move(data_pipe)); + client_->Created(std::move(stream), std::move(data_pipe)); } void AudioOutputStreamBroker::ObserverBindingLost(
diff --git a/content/browser/media/audio_output_stream_broker_unittest.cc b/content/browser/media/audio_output_stream_broker_unittest.cc index 917651c..b3ea4a7 100644 --- a/content/browser/media/audio_output_stream_broker_unittest.cc +++ b/content/browser/media/audio_output_stream_broker_unittest.cc
@@ -19,6 +19,8 @@ #include "media/mojo/mojom/audio_output_stream.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/buffer.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -54,7 +56,7 @@ MockAudioOutputStreamProviderClient() : binding_(this) {} ~MockAudioOutputStreamProviderClient() override {} - void Created(media::mojom::AudioOutputStreamPtr, + void Created(mojo::PendingRemote<media::mojom::AudioOutputStream>, media::mojom::ReadWriteAudioDataPipePtr) override { OnCreated(); } @@ -96,7 +98,7 @@ group_id(group_id) {} bool requested = false; - media::mojom::AudioOutputStreamRequest stream_request; + mojo::PendingReceiver<media::mojom::AudioOutputStream> stream_receiver; media::mojom::AudioOutputStreamObserverAssociatedPtrInfo observer_info; media::mojom::AudioLogPtr log; const std::string output_device_id; @@ -126,7 +128,7 @@ EXPECT_TRUE(stream_request_data_->params.Equals(params)); EXPECT_EQ(stream_request_data_->group_id, group_id); stream_request_data_->requested = true; - stream_request_data_->stream_request = std::move(stream_receiver); + stream_request_data_->stream_receiver = std::move(stream_receiver); stream_request_data_->observer_info = std::move(observer); stream_request_data_->log.Bind(std ::move(log)); stream_request_data_->created_callback = std::move(created_callback);
diff --git a/content/browser/media/midi_host.cc b/content/browser/media/midi_host.cc index 34997ce..94b363f 100644 --- a/content/browser/media/midi_host.cc +++ b/content/browser/media/midi_host.cc
@@ -17,7 +17,7 @@ #include "media/midi/message_util.h" #include "media/midi/midi_message_queue.h" #include "media/midi/midi_service.h" -#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" namespace content { namespace { @@ -59,13 +59,14 @@ } // static -void MidiHost::BindRequest(int render_process_id, - midi::MidiService* midi_service, - midi::mojom::MidiSessionProviderRequest request) { +void MidiHost::BindReceiver( + int render_process_id, + midi::MidiService* midi_service, + mojo::PendingReceiver<midi::mojom::MidiSessionProvider> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - mojo::MakeStrongBinding( + mojo::MakeSelfOwnedReceiver( base::WrapUnique(new MidiHost(render_process_id, midi_service)), - std::move(request)); + std::move(receiver)); } void MidiHost::CompleteStartSession(Result result) {
diff --git a/content/browser/media/midi_host.h b/content/browser/media/midi_host.h index abb3006..d9c5fef 100644 --- a/content/browser/media/midi_host.h +++ b/content/browser/media/midi_host.h
@@ -43,11 +43,12 @@ public: ~MidiHost() override; - // Creates an instance of MidiHost and binds |request| to the instance using - // a strong binding. Should be called on the IO thread. - static void BindRequest(int render_process_id, - midi::MidiService* midi_service, - midi::mojom::MidiSessionProviderRequest request); + // Creates an instance of MidiHost and binds |receiver| to the instance using + // a self owned receiver. Should be called on the IO thread. + static void BindReceiver( + int render_process_id, + midi::MidiService* midi_service, + mojo::PendingReceiver<midi::mojom::MidiSessionProvider> receiver); // MidiManagerClient implementation. These methods can be called on any thread // by platform specific implementations of MidiManager, so use locks
diff --git a/content/browser/media/midi_host_unittest.cc b/content/browser/media/midi_host_unittest.cc index f63d5f7..6296720 100644 --- a/content/browser/media/midi_host_unittest.cc +++ b/content/browser/media/midi_host_unittest.cc
@@ -18,8 +18,8 @@ #include "media/midi/midi_service.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" -#include "mojo/public/cpp/bindings/strong_binding.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -137,9 +137,8 @@ mojo::PendingRemote<midi::mojom::MidiSessionClient> client_remote; mojo::MakeSelfOwnedReceiver(std::make_unique<MidiSessionClientForTesting>(), client_remote.InitWithNewPipeAndPassReceiver()); - midi::mojom::MidiSessionRequest session_request = - mojo::MakeRequest(&session_); - host_->StartSession(std::move(session_request), std::move(client_remote)); + host_->StartSession(session_.BindNewPipeAndPassReceiver(), + std::move(client_remote)); } ~MidiHostTest() override { session_.reset(); @@ -195,7 +194,7 @@ base::WeakPtr<FakeMidiManagerFactory> factory_; std::unique_ptr<midi::MidiService> service_; std::unique_ptr<MidiHostForTesting> host_; - midi::mojom::MidiSessionPtr session_; + mojo::Remote<midi::mojom::MidiSession> session_; DISALLOW_COPY_AND_ASSIGN(MidiHostTest); };
diff --git a/content/browser/mojo_sandbox_browsertest.cc b/content/browser/mojo_sandbox_browsertest.cc index ed9218e..3f3eec4 100644 --- a/content/browser/mojo_sandbox_browsertest.cc +++ b/content/browser/mojo_sandbox_browsertest.cc
@@ -16,6 +16,7 @@ #include "content/public/common/bind_interface_helpers.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/test_service.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/interface_provider.h" namespace content { @@ -65,12 +66,12 @@ IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessSharedBuffer) { // Ensures that a shared buffer can be created within a sandboxed process. - mojom::TestServicePtr test_service; - BindInterface(host_.get(), &test_service); + mojo::Remote<mojom::TestService> test_service; + BindInterface(host_.get(), test_service.BindNewPipeAndPassReceiver()); bool got_response = false; base::RunLoop run_loop; - test_service.set_connection_error_handler(run_loop.QuitClosure()); + test_service.set_disconnect_handler(run_loop.QuitClosure()); test_service->CreateSharedBuffer( kTestMessage, base::BindOnce(
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index 1c45e64..e3bcfdd 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -2435,24 +2435,24 @@ // URL here. { EXPECT_EQ(url_b, shell()->web_contents()->GetVisibleURL()); - EXPECT_EQ(url_c, embedder_url_tracker.url()); + EXPECT_EQ(url_b, embedder_url_tracker.url()); } response_A2.WaitForRequest(); { EXPECT_EQ(url_b, shell()->web_contents()->GetVisibleURL()); - EXPECT_EQ(url_c, embedder_url_tracker.url()); + EXPECT_EQ(url_b, embedder_url_tracker.url()); } // 6. Start history same-document navigation, cancelling 5. EXPECT_TRUE(ExecJs(shell()->web_contents(), "history.forward()")); { EXPECT_EQ(url_b, shell()->web_contents()->GetVisibleURL()); - EXPECT_EQ(url_c, embedder_url_tracker.url()); + EXPECT_EQ(url_b, embedder_url_tracker.url()); } EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); { EXPECT_EQ(url_b, shell()->web_contents()->GetVisibleURL()); - EXPECT_EQ(url_c, embedder_url_tracker.url()); + EXPECT_EQ(url_b, embedder_url_tracker.url()); } // TODO(https://crbug.com/998284): The URL tracked by the embedder should have
diff --git a/content/browser/process_internals/process_internals_handler_impl.cc b/content/browser/process_internals/process_internals_handler_impl.cc index ef1c86174..06a9dc8 100644 --- a/content/browser/process_internals/process_internals_handler_impl.cc +++ b/content/browser/process_internals/process_internals_handler_impl.cc
@@ -4,6 +4,7 @@ #include "content/browser/process_internals/process_internals_handler_impl.h" +#include <string> #include <utility> #include <vector> @@ -13,6 +14,8 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/site_isolation_policy.h" #include "content/public/browser/web_contents.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace content { @@ -76,8 +79,8 @@ ProcessInternalsHandlerImpl::ProcessInternalsHandlerImpl( BrowserContext* browser_context, - mojo::InterfaceRequest<::mojom::ProcessInternalsHandler> request) - : browser_context_(browser_context), binding_(this, std::move(request)) {} + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver) + : browser_context_(browser_context), receiver_(this, std::move(receiver)) {} ProcessInternalsHandlerImpl::~ProcessInternalsHandlerImpl() = default;
diff --git a/content/browser/process_internals/process_internals_handler_impl.h b/content/browser/process_internals/process_internals_handler_impl.h index 9b58e192..51a7f01a 100644 --- a/content/browser/process_internals/process_internals_handler_impl.h +++ b/content/browser/process_internals/process_internals_handler_impl.h
@@ -7,7 +7,8 @@ #include "content/browser/process_internals/process_internals.mojom.h" #include "content/public/browser/web_contents_observer.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace content { @@ -18,7 +19,7 @@ public: ProcessInternalsHandlerImpl( BrowserContext* browser_context, - mojo::InterfaceRequest<::mojom::ProcessInternalsHandler> request); + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver); ~ProcessInternalsHandlerImpl() override; // mojom::ProcessInternalsHandler overrides: @@ -31,7 +32,7 @@ private: BrowserContext* browser_context_; - mojo::Binding<::mojom::ProcessInternalsHandler> binding_; + mojo::Receiver<::mojom::ProcessInternalsHandler> receiver_; DISALLOW_COPY_AND_ASSIGN(ProcessInternalsHandlerImpl); };
diff --git a/content/browser/process_internals/process_internals_ui.cc b/content/browser/process_internals/process_internals_ui.cc index e7275636..c157b59c 100644 --- a/content/browser/process_internals/process_internals_ui.cc +++ b/content/browser/process_internals/process_internals_ui.cc
@@ -5,9 +5,13 @@ #include "content/browser/process_internals/process_internals_ui.h" #include <memory> +#include <string> +#include <utility> #include "base/bind.h" #include "base/macros.h" +#include "content/browser/process_internals/process_internals.mojom.h" +#include "content/browser/process_internals/process_internals_handler_impl.h" #include "content/grit/content_resources.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" @@ -16,12 +20,8 @@ #include "content/public/browser/web_ui_message_handler.h" #include "content/public/common/bindings_policy.h" #include "content/public/common/url_constants.h" - -#include "content/browser/process_internals/process_internals.mojom.h" -#include "content/browser/process_internals/process_internals_handler_impl.h" - -#include "content/public/common/bindings_policy.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/system/message_pipe.h" namespace content { @@ -51,11 +51,11 @@ ProcessInternalsUI::~ProcessInternalsUI() = default; void ProcessInternalsUI::BindProcessInternalsHandler( - ::mojom::ProcessInternalsHandlerRequest request, + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver, RenderFrameHost* render_frame_host) { ui_handler_ = std::make_unique<ProcessInternalsHandlerImpl>( render_frame_host->GetSiteInstance()->GetBrowserContext(), - std::move(request)); + std::move(receiver)); } void ProcessInternalsUI::OnInterfaceRequestFromFrame(
diff --git a/content/browser/process_internals/process_internals_ui.h b/content/browser/process_internals/process_internals_ui.h index bd2bdc6..a93cc751 100644 --- a/content/browser/process_internals/process_internals_ui.h +++ b/content/browser/process_internals/process_internals_ui.h
@@ -5,9 +5,15 @@ #ifndef CONTENT_BROWSER_PROCESS_INTERNALS_PROCESS_INTERNALS_UI_H_ #define CONTENT_BROWSER_PROCESS_INTERNALS_PROCESS_INTERNALS_UI_H_ +#include <memory> +#include <string> +#include <utility> + #include "content/browser/process_internals/process_internals.mojom.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_ui_controller.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/system/message_pipe.h" #include "services/service_manager/public/cpp/binder_registry.h" namespace content { @@ -32,7 +38,7 @@ registry_.AddInterface(std::move(binder)); } void BindProcessInternalsHandler( - ::mojom::ProcessInternalsHandlerRequest request, + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver, RenderFrameHost* render_frame_host); private:
diff --git a/content/browser/renderer_host/input/composited_scrolling_browsertest.cc b/content/browser/renderer_host/input/composited_scrolling_browsertest.cc index 8c577c87..ab9a8907 100644 --- a/content/browser/renderer_host/input/composited_scrolling_browsertest.cc +++ b/content/browser/renderer_host/input/composited_scrolling_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/renderer_host/input/synthetic_gesture.h" #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture.h" @@ -165,6 +166,9 @@ #endif IN_PROC_BROWSER_TEST_F(CompositedScrollingBrowserTest, MAYBE_Scroll3DTransformedScroller) { + // Disable scroll resampling because this is checking scroll distance. + base::test::ScopedFeatureList scoped_feature_list_; + scoped_feature_list_.InitAndDisableFeature(features::kResamplingScrollEvents); LoadURL(); double scroll_distance = DoTouchScroll(gfx::Point(50, 150), gfx::Vector2d(0, 100));
diff --git a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.cc b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.cc index 90611c5..d3ec6c4 100644 --- a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.cc +++ b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.cc
@@ -28,7 +28,7 @@ RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( RendererAudioOutputStreamFactoryContext* context, int render_frame_id, - mojom::RendererAudioOutputStreamFactoryRequest request) { + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) { std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle, BrowserThread::DeleteOnIOThread> handle(new RenderFrameAudioOutputStreamFactoryHandle(context, @@ -38,7 +38,7 @@ base::PostTask( FROM_HERE, {BrowserThread::IO}, base::BindOnce(&RenderFrameAudioOutputStreamFactoryHandle::Init, - base::Unretained(handle.get()), std::move(request))); + base::Unretained(handle.get()), std::move(receiver))); return handle; } @@ -51,12 +51,12 @@ RenderFrameAudioOutputStreamFactoryHandle( RendererAudioOutputStreamFactoryContext* context, int render_frame_id) - : impl_(render_frame_id, context), binding_(&impl_) {} + : impl_(render_frame_id, context), receiver_(&impl_) {} void RenderFrameAudioOutputStreamFactoryHandle::Init( - mojom::RendererAudioOutputStreamFactoryRequest request) { + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - binding_.Bind(std::move(request)); + receiver_.Bind(std::move(receiver)); } OldRenderFrameAudioOutputStreamFactory::OldRenderFrameAudioOutputStreamFactory(
diff --git a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.h b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.h index 2f0ad9266..f00bbf26 100644 --- a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.h +++ b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory.h
@@ -14,13 +14,14 @@ #include "content/common/content_export.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h" #include "content/public/browser/browser_thread.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace content { class RendererAudioOutputStreamFactoryContext; -// Handles a RendererAudioOutputStreamFactory request for a render frame host, +// Handles a RendererAudioOutputStreamFactory receiver for a render frame host, // using the provided RendererAudioOutputStreamFactoryContext. This class may // be constructed on any thread, but must be used on the IO thread after that. // This class is used for creating streams hosted by the browser. It is being @@ -77,14 +78,15 @@ DISALLOW_COPY_AND_ASSIGN(OldRenderFrameAudioOutputStreamFactory); }; -// This class is a convenient bundle of factory and binding. +// This class is a convenient bundle of factory and receiver. class CONTENT_EXPORT RenderFrameAudioOutputStreamFactoryHandle { public: static std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle, BrowserThread::DeleteOnIOThread> - CreateFactory(RendererAudioOutputStreamFactoryContext* context, - int render_frame_id, - mojom::RendererAudioOutputStreamFactoryRequest request); + CreateFactory( + RendererAudioOutputStreamFactoryContext* context, + int render_frame_id, + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); ~RenderFrameAudioOutputStreamFactoryHandle(); @@ -93,10 +95,11 @@ RendererAudioOutputStreamFactoryContext* context, int render_frame_id); - void Init(mojom::RendererAudioOutputStreamFactoryRequest request); + void Init( + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); OldRenderFrameAudioOutputStreamFactory impl_; - mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; + mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_; DISALLOW_COPY_AND_ASSIGN(RenderFrameAudioOutputStreamFactoryHandle); };
diff --git a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc index 3079649..e403377fb8 100644 --- a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc +++ b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc
@@ -20,6 +20,9 @@ #include "media/base/audio_parameters.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/platform_handle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -29,14 +32,6 @@ namespace { using testing::Test; -using AudioOutputStreamFactory = mojom::RendererAudioOutputStreamFactory; -using AudioOutputStreamFactoryPtr = - mojo::InterfacePtr<AudioOutputStreamFactory>; -using AudioOutputStreamFactoryRequest = - mojo::InterfaceRequest<AudioOutputStreamFactory>; -using AudioOutputStream = media::mojom::AudioOutputStream; -using AudioOutputStreamPtr = mojo::InterfacePtr<AudioOutputStream>; -using AudioOutputStreamRequest = mojo::InterfaceRequest<AudioOutputStream>; using AudioOutputStreamProviderClient = media::mojom::AudioOutputStreamProviderClient; using AudioOutputStreamProviderClientPtr = @@ -143,23 +138,23 @@ return std::move(delegate_); } - AudioOutputStreamFactoryPtr CreateFactory() { + mojo::Remote<mojom::RendererAudioOutputStreamFactory> CreateFactory() { DCHECK(!factory_); - AudioOutputStreamFactoryPtr ret; + mojo::Remote<mojom::RendererAudioOutputStreamFactory> remote; factory_ = std::make_unique<OldRenderFrameAudioOutputStreamFactory>( kRenderFrameId, this); - factory_binding_ = std::make_unique< - mojo::Binding<mojom::RendererAudioOutputStreamFactory>>( - factory_.get(), mojo::MakeRequest(&ret)); - return ret; + factory_receiver_ = std::make_unique< + mojo::Receiver<mojom::RendererAudioOutputStreamFactory>>( + factory_.get(), remote.BindNewPipeAndPassReceiver()); + return remote; } private: const std::string salt_; const bool auth_ok_; std::unique_ptr<OldRenderFrameAudioOutputStreamFactory> factory_; - std::unique_ptr<mojo::Binding<mojom::RendererAudioOutputStreamFactory>> - factory_binding_; + std::unique_ptr<mojo::Receiver<mojom::RendererAudioOutputStreamFactory>> + factory_receiver_; std::unique_ptr<media::AudioOutputDelegate> delegate_; media::AudioOutputDelegate::EventHandler** delegate_event_handler_location_ = nullptr; @@ -178,10 +173,11 @@ return p; } - void Created(AudioOutputStreamPtr stream, + void Created(mojo::PendingRemote<media::mojom::AudioOutputStream> stream, media::mojom::ReadWriteAudioDataPipePtr data_pipe) override { was_called_ = true; - stream_ = std::move(stream); + stream_.reset(); + stream_.Bind(std::move(stream)); } bool was_called() { return was_called_; } @@ -190,7 +186,7 @@ private: mojo::Binding<AudioOutputStreamProviderClient> provider_client_binding_; - AudioOutputStreamPtr stream_; + mojo::Remote<media::mojom::AudioOutputStream> stream_; bool was_called_ = false; DISALLOW_COPY_AND_ASSIGN(MockClient); @@ -221,12 +217,13 @@ auto factory_context = std::make_unique<MockContext>(true); factory_context->PrepareDelegateForCreation( std::make_unique<MockAudioOutputDelegate>(), &event_handler); - AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote = + factory_context->CreateFactory(); media::OutputDeviceStatus status; media::AudioParameters params; std::string id; - factory_ptr->RequestDeviceAuthorization( + factory_remote->RequestDeviceAuthorization( mojo::MakeRequest(&provider), base::nullopt, "default", base::BindOnce(&AuthCallback, base::Unretained(&status), base::Unretained(¶ms), base::Unretained(&id))); @@ -264,12 +261,13 @@ content::BrowserTaskEnvironment task_environment; AudioOutputStreamProviderPtr output_provider; auto factory_context = std::make_unique<MockContext>(false); - AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote = + factory_context->CreateFactory(); media::OutputDeviceStatus status; media::AudioParameters params; std::string id; - factory_ptr->RequestDeviceAuthorization( + factory_remote->RequestDeviceAuthorization( mojo::MakeRequest(&output_provider), base::nullopt, "default", base::BindOnce(&AuthCallback, base::Unretained(&status), base::Unretained(¶ms), base::Unretained(&id))); @@ -291,9 +289,10 @@ base::BindOnce([](bool* destructed) { *destructed = true; }, &delegate_is_destructed)), &event_handler); - AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote = + factory_context->CreateFactory(); - factory_ptr->RequestDeviceAuthorization( + factory_remote->RequestDeviceAuthorization( mojo::MakeRequest(&provider), base::nullopt, "default", base::BindOnce([](media::OutputDeviceStatus status, const media::AudioParameters& params, @@ -322,9 +321,10 @@ base::BindOnce([](bool* destructed) { *destructed = true; }, &delegate_is_destructed)), &event_handler); - AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote = + factory_context->CreateFactory(); - factory_ptr->RequestDeviceAuthorization( + factory_remote->RequestDeviceAuthorization( mojo::MakeRequest(&provider), base::nullopt, "default", base::BindOnce([](media::OutputDeviceStatus status, const media::AudioParameters& params,
diff --git a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc index d44dedc..ce43c1a6 100644 --- a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc +++ b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc
@@ -29,6 +29,7 @@ #include "media/base/output_device_info.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace content { @@ -38,11 +39,12 @@ Core(RenderFrameHost* frame, media::AudioSystem* audio_system, MediaStreamManager* media_stream_manager, - mojom::RendererAudioOutputStreamFactoryRequest request); + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); ~Core() final = default; - void Init(mojom::RendererAudioOutputStreamFactoryRequest request); + void Init( + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); size_t current_number_of_providers_for_testing() { return stream_providers_.size(); @@ -130,7 +132,7 @@ const int frame_id_; AudioOutputAuthorizationHandler authorization_handler_; - mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; + mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this}; // Always null-check this weak pointer before dereferencing it. base::WeakPtr<ForwardingAudioStreamFactory::Core> forwarding_factory_; @@ -150,11 +152,11 @@ RenderFrameHost* frame, media::AudioSystem* audio_system, MediaStreamManager* media_stream_manager, - mojom::RendererAudioOutputStreamFactoryRequest request) + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) : core_(new Core(frame, audio_system, media_stream_manager, - std::move(request))) { + std::move(receiver))) { DCHECK_CURRENTLY_ON(BrowserThread::UI); } @@ -179,11 +181,10 @@ RenderFrameHost* frame, media::AudioSystem* audio_system, MediaStreamManager* media_stream_manager, - mojom::RendererAudioOutputStreamFactoryRequest request) + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) : process_id_(frame->GetProcess()->GetID()), frame_id_(frame->GetRoutingID()), - authorization_handler_(audio_system, media_stream_manager, process_id_), - binding_(this) { + authorization_handler_(audio_system, media_stream_manager, process_id_) { DCHECK_CURRENTLY_ON(BrowserThread::UI); ForwardingAudioStreamFactory::Core* tmp_factory = @@ -202,14 +203,14 @@ // thread. base::PostTask( FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&Core::Init, base::Unretained(this), std::move(request))); + base::BindOnce(&Core::Init, base::Unretained(this), std::move(receiver))); } void RenderFrameAudioOutputStreamFactory::Core::Init( - mojom::RendererAudioOutputStreamFactoryRequest request) { + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - binding_.Bind(std::move(request)); + receiver_.Bind(std::move(receiver)); } void RenderFrameAudioOutputStreamFactory::Core::RequestDeviceAuthorization(
diff --git a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.h b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.h index 5036267..34bd3afa 100644 --- a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.h +++ b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "content/common/content_export.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace media { class AudioSystem; @@ -45,7 +46,7 @@ RenderFrameHost* frame, media::AudioSystem* audio_system, MediaStreamManager* media_stream_manager, - mojom::RendererAudioOutputStreamFactoryRequest request); + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver); ~RenderFrameAudioOutputStreamFactory();
diff --git a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc index 7c563f0e..fe41e23 100644 --- a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc +++ b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc
@@ -30,8 +30,11 @@ #include "media/audio/test_audio_thread.h" #include "media/base/audio_parameters.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/pending_associated_remote.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/audio/public/cpp/fake_stream_factory.h" #include "services/audio/public/mojom/constants.mojom.h" #include "services/audio/public/mojom/stream_factory.mojom.h" @@ -133,24 +136,24 @@ }; TEST_F(RenderFrameAudioOutputStreamFactoryTest, ConstructDestruct) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), - media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; + RenderFrameAudioOutputStreamFactory factory( + main_rfh(), audio_system_.get(), media_stream_manager_.get(), + factory_remote.BindNewPipeAndPassReceiver()); } TEST_F(RenderFrameAudioOutputStreamFactoryTest, RequestDeviceAuthorizationForDefaultDevice_StatusOk) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), - media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; + RenderFrameAudioOutputStreamFactory factory( + main_rfh(), audio_system_.get(), media_stream_manager_.get(), + factory_remote.BindNewPipeAndPassReceiver()); media::mojom::AudioOutputStreamProviderPtr provider_ptr; MockAuthorizationCallback mock_callback; - factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), - base::nullopt, kDefaultDeviceId, - mock_callback.Get()); + factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), + base::nullopt, kDefaultDeviceId, + mock_callback.Get()); EXPECT_CALL(mock_callback, Run(media::OUTPUT_DEVICE_STATUS_OK, _, std::string())); @@ -163,16 +166,16 @@ TEST_F( RenderFrameAudioOutputStreamFactoryTest, RequestDeviceAuthorizationForDefaultDeviceAndDestroyProviderPtr_CleansUp) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), - media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; + RenderFrameAudioOutputStreamFactory factory( + main_rfh(), audio_system_.get(), media_stream_manager_.get(), + factory_remote.BindNewPipeAndPassReceiver()); media::mojom::AudioOutputStreamProviderPtr provider_ptr; MockAuthorizationCallback mock_callback; - factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), - base::nullopt, kDefaultDeviceId, - mock_callback.Get()); + factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), + base::nullopt, kDefaultDeviceId, + mock_callback.Get()); provider_ptr.reset(); EXPECT_CALL(mock_callback, @@ -186,16 +189,16 @@ TEST_F( RenderFrameAudioOutputStreamFactoryTest, RequestDeviceAuthorizationForNondefaultDeviceWithoutAuthorization_Fails) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), - media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; + RenderFrameAudioOutputStreamFactory factory( + main_rfh(), audio_system_.get(), media_stream_manager_.get(), + factory_remote.BindNewPipeAndPassReceiver()); media::mojom::AudioOutputStreamProviderPtr provider_ptr; MockAuthorizationCallback mock_callback; - factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), - base::nullopt, kDeviceId, - mock_callback.Get()); + factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), + base::nullopt, kDeviceId, + mock_callback.Get()); EXPECT_CALL(mock_callback, Run(Ne(media::OUTPUT_DEVICE_STATUS_OK), _, std::string())); @@ -207,16 +210,16 @@ TEST_F(RenderFrameAudioOutputStreamFactoryTest, CreateStream_CreatesStreamAndFreesProvider) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), - media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; + RenderFrameAudioOutputStreamFactory factory( + main_rfh(), audio_system_.get(), media_stream_manager_.get(), + factory_remote.BindNewPipeAndPassReceiver()); media::mojom::AudioOutputStreamProviderPtr provider_ptr; MockAuthorizationCallback mock_callback; - factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), - base::nullopt, kDefaultDeviceId, - mock_callback.Get()); + factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), + base::nullopt, kDefaultDeviceId, + mock_callback.Get()); { media::mojom::AudioOutputStreamProviderClientPtr client; mojo::MakeRequest(&client); @@ -239,14 +242,14 @@ MockAuthorizationCallback mock_callback; { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; + mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote; RenderFrameAudioOutputStreamFactory factory( main_rfh(), audio_system_.get(), media_stream_manager_.get(), - mojo::MakeRequest(&factory_ptr)); + factory_remote.BindNewPipeAndPassReceiver()); - factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), - base::nullopt, kDefaultDeviceId, - mock_callback.Get()); + factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), + base::nullopt, kDefaultDeviceId, + mock_callback.Get()); audio::mojom::StreamFactory::CreateOutputStreamCallback created_callback; EXPECT_CALL(mock_callback,
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc index a3b61c58..446db60 100644 --- a/content/browser/renderer_host/render_process_host_browsertest.cc +++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -38,6 +38,7 @@ #include "media/base/media_switches.h" #include "media/base/test_data_util.h" #include "media/mojo/buildflags.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" @@ -235,9 +236,9 @@ RenderProcessHost* spare_renderer = RenderProcessHostImpl::GetSpareRenderProcessHostForTesting(); - mojom::TestServicePtr service; + mojo::Remote<mojom::TestService> service; ASSERT_NE(nullptr, spare_renderer); - BindInterface(spare_renderer, &service); + BindInterface(spare_renderer, service.BindNewPipeAndPassReceiver()); base::RunLoop run_loop; set_process_exit_callback(run_loop.QuitClosure()); @@ -673,8 +674,8 @@ process_exits_ = 0; rph->AddObserver(this); - mojom::TestServicePtr service; - BindInterface(rph, &service); + mojo::Remote<mojom::TestService> service; + BindInterface(rph, service.BindNewPipeAndPassReceiver()); base::RunLoop run_loop; set_process_exit_callback(run_loop.QuitClosure()); @@ -752,8 +753,8 @@ process_exits_ = 0; rph->AddObserver(this); - mojom::TestServicePtr service; - BindInterface(rph, &service); + mojo::Remote<mojom::TestService> service; + BindInterface(rph, service.BindNewPipeAndPassReceiver()); { // Force a bad message event to occur which will terminate the renderer. @@ -855,8 +856,8 @@ process_exits_ = 0; rph->AddObserver(this); - mojom::TestServicePtr service; - BindInterface(rph, &service); + mojo::Remote<mojom::TestService> service; + BindInterface(rph, service.BindNewPipeAndPassReceiver()); { // Force a bad message event to occur which will terminate the renderer. @@ -921,8 +922,8 @@ process_exits_ = 0; rph->AddObserver(this); - mojom::TestServicePtr service; - BindInterface(rph, &service); + mojo::Remote<mojom::TestService> service; + BindInterface(rph, service.BindNewPipeAndPassReceiver()); { // Force a bad message event to occur which will terminate the renderer.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 25fd6ca6..64a16f4 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2076,7 +2076,7 @@ base::Unretained(file_system_manager_impl_.get()))); registry->AddInterface(base::BindRepeating( - &MidiHost::BindRequest, GetID(), + &MidiHost::BindReceiver, GetID(), base::Unretained(BrowserMainLoop::GetInstance()->midi_service()))); if (gpu_client_) {
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 82e76d7..ff4a64a 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -237,8 +237,6 @@ CHECK(result.second) << "Inserting a duplicate item!"; GetProcess()->AddRoute(routing_id_, this); - GetWidget()->set_owner_delegate(this); - GetProcess()->AddObserver(this); ui::GpuSwitchingManager::GetInstance()->AddObserver(this); @@ -255,6 +253,8 @@ &RenderViewHostImpl::ClosePageTimeout, weak_factory_.GetWeakPtr()))); input_device_change_observer_.reset(new InputDeviceChangeObserver(this)); + + GetWidget()->set_owner_delegate(this); } RenderViewHostImpl::~RenderViewHostImpl() {
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc index 8c36fe2..06eb349 100644 --- a/content/browser/service_worker/service_worker_job_unittest.cc +++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -697,13 +697,8 @@ scoped_refptr<ServiceWorkerVersion> version = new ServiceWorkerVersion( registration.get(), script_url, blink::mojom::ScriptType::kClassic, 1L, helper_->context()->AsWeakPtr()); - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version.get())); version->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc index 3c15b0f..28689f72 100644 --- a/content/browser/service_worker/service_worker_registration_unittest.cc +++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -55,26 +55,8 @@ // From service_worker_registration.cc. constexpr base::TimeDelta kMaxLameDuckTime = base::TimeDelta::FromMinutes(5); -// TODO(falken): Make this a common helper function. -void StartWorker(ServiceWorkerVersion* version, - ServiceWorkerMetrics::EventType purpose) { - base::RunLoop loop; - blink::ServiceWorkerStatusCode code; - version->StartWorker( - purpose, - base::BindOnce( - [](base::OnceClosure done, blink::ServiceWorkerStatusCode* out_code, - blink::ServiceWorkerStatusCode result_code) { - *out_code = result_code; - std::move(done).Run(); - }, - loop.QuitClosure(), &code)); - loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, code); -} - int CreateInflightRequest(ServiceWorkerVersion* version) { - StartWorker(version, ServiceWorkerMetrics::EventType::PUSH); + EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, StartServiceWorker(version)); return version->StartRequest(ServiceWorkerMetrics::EventType::PUSH, base::DoNothing()); } @@ -481,7 +463,8 @@ helper_->AddNewPendingServiceWorker<FakeServiceWorker>(helper_.get()); // Start the worker. - StartWorker(version_2.get(), ServiceWorkerMetrics::EventType::INSTALL); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_2.get())); version_2->SetStatus(ServiceWorkerVersion::INSTALLED); // Set it to activate when ready. The original version should still be
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc index 08952c1b..c3ee035 100644 --- a/content/browser/service_worker/service_worker_test_utils.cc +++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -9,6 +9,7 @@ #include "base/barrier_closure.h" #include "base/run_loop.h" +#include "base/test/bind_test_util.h" #include "base/time/time.h" #include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" @@ -295,6 +296,26 @@ std::move(quit_closure), out); } +blink::ServiceWorkerStatusCode StartServiceWorker( + ServiceWorkerVersion* version) { + blink::ServiceWorkerStatusCode status; + base::RunLoop run_loop; + version->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, + base::BindLambdaForTesting( + [&](blink::ServiceWorkerStatusCode result_status) { + status = result_status; + run_loop.Quit(); + })); + run_loop.Run(); + return status; +} + +void StopServiceWorker(ServiceWorkerVersion* version) { + base::RunLoop run_loop; + version->StopWorker(run_loop.QuitClosure()); + run_loop.Run(); +} + base::WeakPtr<ServiceWorkerProviderHost> CreateProviderHostForServiceWorkerContext( int process_id,
diff --git a/content/browser/service_worker/service_worker_test_utils.h b/content/browser/service_worker/service_worker_test_utils.h index 1ef3df8..31d0e76 100644 --- a/content/browser/service_worker/service_worker_test_utils.h +++ b/content/browser/service_worker/service_worker_test_utils.h
@@ -64,6 +64,11 @@ ReceiveServiceWorkerStatus(base::Optional<blink::ServiceWorkerStatusCode>* out, base::OnceClosure quit_closure); +blink::ServiceWorkerStatusCode StartServiceWorker( + ServiceWorkerVersion* version); + +void StopServiceWorker(ServiceWorkerVersion* version); + // Container for keeping the Mojo connection to the service worker provider on // the renderer alive. class ServiceWorkerRemoteProviderEndpoint {
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc index 80d3715e..dda309d 100644 --- a/content/browser/service_worker/service_worker_version_unittest.cc +++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -100,18 +100,6 @@ TestServiceImpl() {} }; -void StartWorker(ServiceWorkerVersion* version, - ServiceWorkerMetrics::EventType purpose) { - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version->StartWorker( - purpose, ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - EXPECT_EQ(EmbeddedWorkerStatus::STARTING, version->running_status()); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); - EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version->running_status()); -} - class ServiceWorkerVersionTest : public testing::Test { protected: using FetchHandlerExistence = blink::mojom::FetchHandlerExistence; @@ -389,7 +377,8 @@ TEST_F(ServiceWorkerVersionTest, StartUnregisteredButStillLiveWorker) { // Start the worker. - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); // Delete the registration. @@ -404,14 +393,8 @@ // The live registration is marked as uninstalling, but still exists. ASSERT_TRUE(registration_->is_uninstalling()); - { - // Stop the worker. - bool has_stopped = false; - base::RunLoop run_loop; - version_->StopWorker(VerifyCalled(&has_stopped, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_TRUE(has_stopped); - } + // Stop the worker. + StopServiceWorker(version_.get()); // Dispatch an event on the unregistered and stopped but still live worker. SimulateDispatchEvent(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); @@ -565,11 +548,7 @@ EXPECT_FALSE(version_->update_timer_.IsRunning()); // Update is actually scheduled after the worker stops. - bool has_stopped = false; - base::RunLoop run_loop; - version_->StopWorker(VerifyCalled(&has_stopped, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_TRUE(has_stopped); + StopServiceWorker(version_.get()); EXPECT_TRUE(version_->stale_time_.is_null()); EXPECT_TRUE(version_->update_timer_.IsRunning()); } @@ -634,7 +613,8 @@ } TEST_F(ServiceWorkerVersionTest, StartRequestWithNullContext) { - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); version_->context_ = nullptr; version_->StartRequest(ServiceWorkerMetrics::EventType::PUSH, @@ -684,7 +664,8 @@ ASSERT_EQ(0, listener.updated_count); auto* service_worker = helper_->AddNewPendingServiceWorker<FakeServiceWorker>(helper_.get()); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); service_worker->RunUntilInitializeGlobalScope(); // Simulate requesting SetCachedMetadata from the service worker global scope. @@ -702,8 +683,8 @@ } TEST_F(ServiceWorkerVersionTest, RestartWorker) { - StartWorker(version_.get(), - ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); bool has_stopped = false; @@ -718,17 +699,9 @@ EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status()); run_loop.Run(); - { - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - - // The worker should have been successfully re-started after stopped. - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); - } + // Restart the worker. + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // The worker should have been stopped. EXPECT_TRUE(has_stopped); @@ -786,8 +759,8 @@ base::RunLoop run_loop; version_->SetStatus(ServiceWorkerVersion::ACTIVATED); client->UnblockStartWorker(); - StartWorker(version_.get(), - ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Create a request. int request_id = version_->StartRequest( @@ -832,7 +805,8 @@ base::Optional<blink::ServiceWorkerStatusCode> status; base::RunLoop run_loop; version_->SetStatus(ServiceWorkerVersion::ACTIVATED); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::SYNC); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Create a request that should expire Now(). int request_id = version_->StartRequestWithCustomTimeout( @@ -856,7 +830,8 @@ base::Optional<blink::ServiceWorkerStatusCode> status; base::RunLoop run_loop; version_->SetStatus(ServiceWorkerVersion::ACTIVATED); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::SYNC); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Create a request that should expire Now(). int request_id = version_->StartRequestWithCustomTimeout( @@ -884,7 +859,8 @@ base::RunLoop second_run_loop; version_->SetStatus(ServiceWorkerVersion::ACTIVATED); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::SYNC); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); base::SimpleTestTickClock tick_clock; SetTickClockForTesting(&tick_clock); @@ -949,8 +925,8 @@ base::RunLoop fetch_run_loop; version_->SetStatus(ServiceWorkerVersion::ACTIVATED); - StartWorker(version_.get(), - ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Create a fetch request that should expire sometime later. int fetch_request_id = version_->StartRequest( @@ -1054,7 +1030,8 @@ auto* client = helper_->AddNewPendingInstanceClient< DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get()); client->UnblockStartWorker(); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Try to stop the worker. bool has_stopped = false; @@ -1078,7 +1055,8 @@ EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); // Try to start the worker again. It should work. - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // The timeout interval should be reset to normal. EXPECT_TRUE(version_->timeout_timer_.IsRunning()); @@ -1093,7 +1071,8 @@ auto* client = helper_->AddNewPendingInstanceClient< DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get()); client->UnblockStartWorker(); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); // Try to stop the worker. bool has_stopped = false; @@ -1124,7 +1103,8 @@ auto* client = helper_->AddNewPendingInstanceClient<FakeEmbeddedWorkerInstanceClient>( helper_.get()); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::SYNC); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); base::RunLoop loop; blink::ServiceWorkerStatusCode status = blink::ServiceWorkerStatusCode::kOk; @@ -1179,25 +1159,15 @@ blink::mojom::ScriptType::kClassic, helper_->context()->storage()->NewVersionId(), helper_->context()->AsWeakPtr()); - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorDisallowed, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kErrorDisallowed, + StartServiceWorker(version.get())); } TEST_F(ServiceWorkerVersionTest, ForegroundServiceWorkerCountUpdatedByControllee) { // Start the worker before we have a controllee. - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ( 0, helper_->mock_render_process_host()->foreground_service_worker_count()); @@ -1226,13 +1196,8 @@ TEST_F(ServiceWorkerVersionTest, ForegroundServiceWorkerCountNotUpdatedBySameProcessControllee) { // Start the worker before we have a controllee. - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ( 0, helper_->mock_render_process_host()->foreground_service_worker_count()); @@ -1251,13 +1216,8 @@ TEST_F(ServiceWorkerVersionTest, ForegroundServiceWorkerCountUpdatedByControlleeProcessIdChange) { // Start the worker before we have a controllee. - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ( 0, helper_->mock_render_process_host()->foreground_service_worker_count()); @@ -1314,13 +1274,8 @@ // Starting the worker should notify the RenderProcessHost of the foreground // worker. - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ( 1, helper_->mock_render_process_host()->foreground_service_worker_count()); @@ -1345,13 +1300,8 @@ TEST_F(ServiceWorkerVersionNoFetchHandlerTest, ForegroundServiceWorkerCountNotUpdated) { // Start the worker before we have a controllee. - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ( 0, helper_->mock_render_process_host()->foreground_service_worker_count()); @@ -1368,62 +1318,35 @@ } TEST_F(ServiceWorkerVersionTest, FailToStart_UseNewRendererProcess) { - base::Optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop run_loop_1; ServiceWorkerContextCore* context = helper_->context(); int64_t id = version_->version_id(); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); // Start once. It should choose the "existing process". - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop_1.QuitClosure())); - run_loop_1.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ(helper_->mock_render_process_id(), version_->embedded_worker()->process_id()); - { - bool has_stopped = false; - base::RunLoop run_loop; - version_->StopWorker(VerifyCalled(&has_stopped, run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_TRUE(has_stopped); - } + + StopServiceWorker(version_.get()); // Fail once. - status.reset(); helper_->AddPendingInstanceClient( std::make_unique<FailStartInstanceClient>(helper_.get())); - base::RunLoop run_loop_2; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop_2.QuitClosure())); - run_loop_2.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed, - status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed, + StartServiceWorker(version_.get())); EXPECT_EQ(1, context->GetVersionFailureCount(id)); // Fail again. - status.reset(); helper_->AddPendingInstanceClient( std::make_unique<FailStartInstanceClient>(helper_.get())); - base::RunLoop run_loop_3; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop_3.QuitClosure())); - run_loop_3.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed, - status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed, + StartServiceWorker(version_.get())); EXPECT_EQ(2, context->GetVersionFailureCount(id)); // Succeed. It should choose the "new process". - status.reset(); - base::RunLoop run_loop_4; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop_4.QuitClosure())); - run_loop_4.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ(helper_->new_render_process_id(), version_->embedded_worker()->process_id()); EXPECT_EQ(0, context->GetVersionFailureCount(id)); @@ -1432,13 +1355,8 @@ // Start again. It should choose the "existing process" again as we no longer // force creation of a new process. - status.reset(); - base::RunLoop run_loop_5; - version_->StartWorker( - ServiceWorkerMetrics::EventType::UNKNOWN, - ReceiveServiceWorkerStatus(&status, run_loop_5.QuitClosure())); - run_loop_5.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); EXPECT_EQ(helper_->mock_render_process_id(), version_->embedded_worker()->process_id()); version_->StopWorker(base::DoNothing()); @@ -1475,7 +1393,8 @@ TEST_F(ServiceWorkerVersionTest, InstalledFetchEventHandlerExists) { auto* service_worker = helper_->AddNewPendingServiceWorker<FakeServiceWorker>(helper_.get()); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); service_worker->RunUntilInitializeGlobalScope(); EXPECT_EQ(FetchHandlerExistence::EXISTS, service_worker->fetch_handler_existence()); @@ -1485,7 +1404,8 @@ InstalledFetchEventHandlerDoesNotExist) { auto* service_worker = helper_->AddNewPendingServiceWorker<FakeServiceWorker>(helper_.get()); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); service_worker->RunUntilInitializeGlobalScope(); EXPECT_EQ(FetchHandlerExistence::DOES_NOT_EXIST, service_worker->fetch_handler_existence()); @@ -1530,7 +1450,8 @@ // cause a crash. std::pair<blink::mojom::ConsoleMessageLevel, std::string> test_message = std::make_pair(blink::mojom::ConsoleMessageLevel::kVerbose, ""); - StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN); + ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, + StartServiceWorker(version_.get())); version_->AddMessageToConsole(test_message.first, test_message.second); service_worker->RunUntilInitializeGlobalScope(); EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index 6e4fd49d..7f0571e1 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -2805,6 +2805,92 @@ kHitTestTolerance); } +IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, + PointerEventsNoneWithNestedOOPIF) { + GURL main_url(embedded_test_server()->GetURL( + "/frame_tree/page_with_positioned_nested_frames.html")); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + ASSERT_EQ(1U, root->child_count()); + RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>( + root->current_frame_host()->GetRenderWidgetHost()->GetView()); + + EXPECT_EQ( + " Site A ------------ proxies for B C\n" + " +--Site B ------- proxies for A C\n" + " +--Site C -- proxies for A B\n" + "Where A = http://127.0.0.1/\n" + " B = http://a.com/\n" + " C = http://baz.com/", + DepictFrameTree(root)); + + FrameTreeNode* child_node = root->child_at(0); + FrameTreeNode* grandchild_node = child_node->child_at(0); + + // This is to make sure that the hit_test_data is clean before running the + // hit_test_data_change_observer. + WaitForHitTestData(child_node->current_frame_host()); + WaitForHitTestData(grandchild_node->current_frame_host()); + + HitTestRegionObserver hit_test_data_change_observer( + root_view->GetRootFrameSinkId()); + hit_test_data_change_observer.WaitForHitTestData(); + + EXPECT_TRUE(ExecuteScript(web_contents(), + "document.getElementsByTagName('iframe')[0].style." + "pointerEvents = 'none';")); + + hit_test_data_change_observer.WaitForHitTestDataChange(); + + MainThreadFrameObserver observer( + root->current_frame_host()->GetRenderWidgetHost()); + observer.Wait(); + + // Create listeners for mouse events. + RenderWidgetHostMouseEventMonitor main_frame_monitor( + root->current_frame_host()->GetRenderWidgetHost()); + RenderWidgetHostMouseEventMonitor child_frame_monitor( + child_node->current_frame_host()->GetRenderWidgetHost()); + + // ------------------------ + // root 50px + // --------------------- + // |child 50px | + // 50px| -------------- | + // |50px| grand_child || + // | | || + // | |-------------|| + // --------------------- + // + // Since child has pointer-events: none, (125, 125) should be claimed by root. + blink::WebMouseEvent mouse_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); + mouse_event.button = blink::WebPointerProperties::Button::kLeft; + SetWebEventPositions(&mouse_event, gfx::Point(125, 125), root_view); + mouse_event.click_count = 1; + + main_frame_monitor.ResetEventReceived(); + child_frame_monitor.ResetEventReceived(); + + InputEventAckWaiter waiter(root->current_frame_host()->GetRenderWidgetHost(), + blink::WebInputEvent::kMouseDown); + RenderWidgetHostInputEventRouter* router = + web_contents()->GetInputEventRouter(); + router->RouteMouseEvent(root_view, &mouse_event, ui::LatencyInfo()); + waiter.Wait(); + + EXPECT_TRUE(main_frame_monitor.EventWasReceived()); + EXPECT_NEAR(125, main_frame_monitor.event().PositionInWidget().x, + kHitTestTolerance); + EXPECT_NEAR(125, main_frame_monitor.event().PositionInWidget().y, + kHitTestTolerance); + EXPECT_FALSE(child_frame_monitor.EventWasReceived()); +} + // This test tests that browser process can successfully hit test on nested // OOPIFs that are partially occluded by main frame elements. IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest,
diff --git a/content/browser/utility_process_host_browsertest.cc b/content/browser/utility_process_host_browsertest.cc index dd5c8671..cc80c53d9 100644 --- a/content/browser/utility_process_host_browsertest.cc +++ b/content/browser/utility_process_host_browsertest.cc
@@ -17,6 +17,7 @@ #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" #include "content/public/test/test_service.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #if defined(OS_MACOSX) || defined(OS_LINUX) #include <sys/wait.h> @@ -73,7 +74,7 @@ #endif EXPECT_TRUE(host->Start()); - BindInterface(host, &service_); + BindInterface(host, service_.BindNewPipeAndPassReceiver()); if (crash) { service_->DoCrashImmediately( base::BindOnce(&UtilityProcessHostBrowserTest::OnSomethingOnIOThread, @@ -98,7 +99,7 @@ base::PostTask(FROM_HERE, {BrowserThread::UI}, std::move(done_closure_)); } - mojom::TestServicePtr service_; + mojo::Remote<mojom::TestService> service_; base::OnceClosure done_closure_; // Access on UI thread.
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index f194fb6..6ca26bf 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3308,9 +3308,10 @@ } #if defined(OS_ANDROID) -void WebContentsImpl::GetNFC(device::mojom::NFCRequest request) { +void WebContentsImpl::GetNFC( + mojo::PendingReceiver<device::mojom::NFC> receiver) { NFCHost nfc_host(this); - nfc_host.GetNFC(std::move(request)); + nfc_host.GetNFC(std::move(receiver)); } #endif
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index ebd4a8df..665089f 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -55,6 +55,7 @@ #include "content/public/common/page_importance_signals.h" #include "content/public/common/resource_type.h" #include "content/public/common/three_d_api_types.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/load_states.h" @@ -574,7 +575,7 @@ device::mojom::GeolocationContext* GetGeolocationContext() override; device::mojom::WakeLockContext* GetWakeLockContext() override; #if defined(OS_ANDROID) - void GetNFC(device::mojom::NFCRequest request) override; + void GetNFC(mojo::PendingReceiver<device::mojom::NFC> receiver) override; #endif void EnterFullscreenMode(const GURL& origin, const blink::WebFullscreenOptions& options) override;
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 762c8164..612f0ff 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -410,7 +410,7 @@ connector_->OverrideBinderForTesting( service_manager::ServiceFilter::ByName(device::mojom::kServiceName), device::mojom::HidManager::Name_, - base::Bind(&device::FakeFidoHidManager::AddBinding, + base::Bind(&device::FakeFidoHidManager::AddReceiver, base::Unretained(fake_hid_manager_.get()))); // Set up a timer for testing. @@ -2572,7 +2572,7 @@ connector_->OverrideBinderForTesting( service_manager::ServiceFilter::ByName(device::mojom::kServiceName), device::mojom::HidManager::Name_, - base::Bind(&device::FakeFidoHidManager::AddBinding, + base::Bind(&device::FakeFidoHidManager::AddReceiver, base::Unretained(fake_hid_manager_.get()))); // Set up a timer for testing. @@ -4195,7 +4195,7 @@ connector_->OverrideBinderForTesting( service_manager::ServiceFilter::ByName(device::mojom::kServiceName), device::mojom::HidManager::Name_, - base::BindRepeating(&device::FakeFidoHidManager::AddBinding, + base::BindRepeating(&device::FakeFidoHidManager::AddReceiver, base::Unretained(fake_hid_manager_.get()))); // Set up a timer for testing.
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc index af2a07cec..d1a8042d 100644 --- a/content/child/child_thread_impl.cc +++ b/content/child/child_thread_impl.cc
@@ -63,6 +63,7 @@ #include "ipc/ipc_sync_message_filter.h" #include "mojo/core/embedder/scoped_ipc_support.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/platform/named_platform_channel.h" #include "mojo/public/cpp/platform/platform_channel.h" @@ -547,8 +548,8 @@ void ChildThreadImpl::OnFieldTrialGroupFinalized( const std::string& trial_name, const std::string& group_name) { - mojom::FieldTrialRecorderPtr field_trial_recorder; - BindHostReceiver(mojo::MakeRequest(&field_trial_recorder)); + mojo::Remote<mojom::FieldTrialRecorder> field_trial_recorder; + BindHostReceiver(field_trial_recorder.BindNewPipeAndPassReceiver()); field_trial_recorder->FieldTrialActivated(trial_name); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index c318b39..c079513b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -1237,7 +1237,8 @@ // All coordinates are in DIP. @VisibleForTesting @CalledByNative - void onSelectionEvent(int eventType, int left, int top, int right, int bottom) { + void onSelectionEvent( + @SelectionEventType int eventType, int left, int top, int right, int bottom) { // Ensure the provided selection coordinates form a non-empty rect, as required by // the selection action mode. if (left == right) ++right;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java index 8a30d05..08908c4c 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionClient.java
@@ -19,6 +19,7 @@ import org.chromium.content_public.browser.SelectionMetricsLogger; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.touch_selection.SelectionEventType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -61,8 +62,9 @@ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || windowAndroid == null) return null; // Don't do Smart Selection when device is not provisioned or in incognito mode. - if (!isDeviceProvisioned(windowAndroid.getContext().get()) || webContents.isIncognito()) + if (!isDeviceProvisioned(windowAndroid.getContext().get()) || webContents.isIncognito()) { return null; + } return new SmartSelectionClient(callback, webContents, windowAndroid); } @@ -90,7 +92,7 @@ public void onSelectionChanged(String selection) {} @Override - public void onSelectionEvent(int eventType, float posXPix, float posYPix) {} + public void onSelectionEvent(@SelectionEventType int eventType, float posXPix, float posYPix) {} @Override public void selectWordAroundCaretAck(boolean didSelect, int startAdjust, int endAdjust) {}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java index aa2eb1b8..bc61add 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java
@@ -12,6 +12,7 @@ import android.view.textclassifier.TextSelection; import org.chromium.content.browser.selection.SmartSelectionClient; +import org.chromium.ui.touch_selection.SelectionEventType; /** * Interface to a content layer client that can process and modify selection text. @@ -94,7 +95,7 @@ * @param posXPix The x coordinate of the selection start handle. * @param posYPix The y coordinate of the selection start handle. */ - void onSelectionEvent(int eventType, float posXPix, float posYPix); + void onSelectionEvent(@SelectionEventType int eventType, float posXPix, float posYPix); /** * Acknowledges that a selectWordAroundCaret action has completed with the given result.
diff --git a/content/public/app/content_browser_manifest.cc b/content/public/app/content_browser_manifest.cc index aba4a94d..58bbeef 100644 --- a/content/public/app/content_browser_manifest.cc +++ b/content/public/app/content_browser_manifest.cc
@@ -225,7 +225,6 @@ "blink.mojom.DateTimeChooser", "blink.mojom.DisplayCutoutHost", "blink.mojom.DedicatedWorkerHostFactory", - "blink.mojom.FileChooser", "blink.mojom.GeolocationService", "blink.mojom.HidService", "blink.mojom.IDBFactory",
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h index 1f48681..81b5f690 100644 --- a/content/public/renderer/render_frame_observer.h +++ b/content/public/renderer/render_frame_observer.h
@@ -37,7 +37,6 @@ class WebElement; class WebFormElement; class WebString; -struct WebURLError; class WebWorkerFetchContext; } @@ -109,7 +108,7 @@ // TODO(dgozman): replace next two methods with DidFinishNavigation. virtual void DidCommitProvisionalLoad(bool is_same_document_navigation, ui::PageTransition transition) {} - virtual void DidFailProvisionalLoad(const blink::WebURLError& error) {} + virtual void DidFailProvisionalLoad() {} virtual void DidFinishLoad() {} virtual void DidFinishDocumentLoad() {} virtual void DidHandleOnloadEvents() {}
diff --git a/content/public/test/test_service.cc b/content/public/test/test_service.cc index d8f815e..4497f375 100644 --- a/content/public/test/test_service.cc +++ b/content/public/test/test_service.cc
@@ -31,9 +31,9 @@ registry_.BindInterface(interface_name, std::move(interface_pipe)); } -void TestService::Create(mojom::TestServiceRequest request) { - DCHECK(!binding_.is_bound()); - binding_.Bind(std::move(request)); +void TestService::Create(mojo::PendingReceiver<mojom::TestService> receiver) { + DCHECK(!receiver_.is_bound()); + receiver_.Bind(std::move(receiver)); } void TestService::DoSomething(DoSomethingCallback callback) {
diff --git a/content/public/test/test_service.h b/content/public/test/test_service.h index 5137236..3710c54 100644 --- a/content/public/test/test_service.h +++ b/content/public/test/test_service.h
@@ -9,7 +9,8 @@ #include "base/macros.h" #include "content/public/test/test_service.mojom.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service_binding.h" @@ -32,7 +33,7 @@ const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) override; - void Create(mojom::TestServiceRequest request); + void Create(mojo::PendingReceiver<mojom::TestService> receiver); // TestService: void DoSomething(DoSomethingCallback callback) override; @@ -45,7 +46,7 @@ service_manager::ServiceBinding service_binding_; service_manager::BinderRegistry registry_; - mojo::Binding<mojom::TestService> binding_{this}; + mojo::Receiver<mojom::TestService> receiver_{this}; // The name of the app connecting to us. std::string requestor_name_;
diff --git a/content/renderer/media/audio/audio_output_ipc_factory.cc b/content/renderer/media/audio/audio_output_ipc_factory.cc index cff7e00..6fc112d 100644 --- a/content/renderer/media/audio/audio_output_ipc_factory.cc +++ b/content/renderer/media/audio/audio_output_ipc_factory.cc
@@ -25,7 +25,7 @@ AudioOutputIPCFactory::~AudioOutputIPCFactory() { // Allow destruction in tests. - DCHECK(factory_ptrs_.empty()); + DCHECK(factory_remotes_.empty()); DCHECK_EQ(instance_, this); instance_ = nullptr; } @@ -42,16 +42,16 @@ void AudioOutputIPCFactory::RegisterRemoteFactory( int frame_id, service_manager::InterfaceProvider* interface_provider) { - mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; - interface_provider->GetInterface(&factory_ptr); - // PassInterface unbinds the message pipe from the current thread. This - // allows us to bind it to the IO thread. + mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> factory_remote; + interface_provider->GetInterface( + factory_remote.InitWithNewPipeAndPassReceiver()); // Unretained is safe due to the contract at the top of the header file. + // It's safe to pass the |factory_remote| PendingRemote between threads. io_task_runner_->PostTask( FROM_HERE, base::BindOnce(&AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread, base::Unretained(this), frame_id, - factory_ptr.PassInterface())); + std::move(factory_remote))); } void AudioOutputIPCFactory::MaybeDeregisterRemoteFactory(int frame_id) { @@ -65,17 +65,17 @@ mojom::RendererAudioOutputStreamFactory* AudioOutputIPCFactory::GetRemoteFactory(int frame_id) const { DCHECK(io_task_runner_->BelongsToCurrentThread()); - auto it = factory_ptrs_.find(frame_id); - return it == factory_ptrs_.end() ? nullptr : it->second.get(); + auto it = factory_remotes_.find(frame_id); + return it == factory_remotes_.end() ? nullptr : it->second.get(); } void AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread( int frame_id, - mojom::RendererAudioOutputStreamFactoryPtrInfo factory_ptr_info) { + mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> + factory_pending_remote) { DCHECK(io_task_runner_->BelongsToCurrentThread()); std::pair<StreamFactoryMap::iterator, bool> emplace_result = - factory_ptrs_.emplace(frame_id, - mojo::MakeProxy(std::move(factory_ptr_info))); + factory_remotes_.emplace(frame_id, std::move(factory_pending_remote)); DCHECK(emplace_result.second) << "Attempt to register a factory for a " "frame which already has a factory " @@ -85,9 +85,9 @@ DCHECK(emplaced_factory.is_bound()) << "Factory is not bound to a remote implementation."; - // Unretained is safe because |this| owns the binding, so a connection error + // Unretained is safe because |this| owns the remote, so a connection error // cannot trigger after destruction. - emplaced_factory.set_connection_error_handler(base::BindOnce( + emplaced_factory.set_disconnect_handler(base::BindOnce( &AudioOutputIPCFactory::MaybeDeregisterRemoteFactoryOnIOThread, base::Unretained(this), frame_id)); } @@ -96,10 +96,10 @@ int frame_id) { DCHECK(io_task_runner_->BelongsToCurrentThread()); // This function can be called both by the frame and the connection error - // handler of the factory pointer. Calling erase multiple times even though + // handler of the factory remote. Calling erase multiple times even though // there is nothing to erase is safe, so we don't have to handle this in any // particular way. - factory_ptrs_.erase(frame_id); + factory_remotes_.erase(frame_id); } } // namespace content
diff --git a/content/renderer/media/audio/audio_output_ipc_factory.h b/content/renderer/media/audio/audio_output_ipc_factory.h index 0f87cfd..a19ea1a 100644 --- a/content/renderer/media/audio/audio_output_ipc_factory.h +++ b/content/renderer/media/audio/audio_output_ipc_factory.h
@@ -11,6 +11,8 @@ #include "base/memory/ref_counted.h" #include "content/common/content_export.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" namespace base { class SingleThreadTaskRunner; @@ -63,13 +65,15 @@ private: using StreamFactoryMap = - base::flat_map<int, mojom::RendererAudioOutputStreamFactoryPtr>; + base::flat_map<int, + mojo::Remote<mojom::RendererAudioOutputStreamFactory>>; mojom::RendererAudioOutputStreamFactory* GetRemoteFactory(int frame_id) const; void RegisterRemoteFactoryOnIOThread( int frame_id, - mojom::RendererAudioOutputStreamFactoryPtrInfo factory_ptr_info); + mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> + factory_pending_remote); void MaybeDeregisterRemoteFactoryOnIOThread(int frame_id); @@ -77,7 +81,7 @@ bool UsingMojoFactories() const; // Maps frame id to the corresponding factory. - StreamFactoryMap factory_ptrs_; + StreamFactoryMap factory_remotes_; const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
diff --git a/content/renderer/media/audio/audio_output_ipc_factory_unittest.cc b/content/renderer/media/audio/audio_output_ipc_factory_unittest.cc index 4c561f4..0a58633 100644 --- a/content/renderer/media/audio/audio_output_ipc_factory_unittest.cc +++ b/content/renderer/media/audio/audio_output_ipc_factory_unittest.cc
@@ -14,8 +14,8 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "media/audio/audio_output_ipc.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/system/message_pipe.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "testing/gmock/include/gmock/gmock.h" @@ -38,7 +38,7 @@ class FakeRemoteFactory : public mojom::RendererAudioOutputStreamFactory { public: - FakeRemoteFactory() : binding_(this) {} + FakeRemoteFactory() = default; ~FakeRemoteFactory() override {} void RequestDeviceAuthorization( @@ -58,14 +58,14 @@ } void Bind(mojo::ScopedMessagePipeHandle handle) { - EXPECT_FALSE(binding_.is_bound()); - binding_.Bind( + EXPECT_FALSE(receiver_.is_bound()); + receiver_.Bind( mojo::InterfaceRequest<mojom::RendererAudioOutputStreamFactory>( std::move(handle))); } private: - mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; + mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this}; base::OnceClosure on_called_; };
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc.cc b/content/renderer/media/audio/mojo_audio_output_ipc.cc index bb9224a..85443ca2 100644 --- a/content/renderer/media/audio/mojo_audio_output_ipc.cc +++ b/content/renderer/media/audio/mojo_audio_output_ipc.cc
@@ -228,14 +228,15 @@ } void MojoAudioOutputIPC::Created( - media::mojom::AudioOutputStreamPtr stream, + mojo::PendingRemote<media::mojom::AudioOutputStream> pending_stream, media::mojom::ReadWriteAudioDataPipePtr data_pipe) { DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); DCHECK(delegate_); UMA_HISTOGRAM_TIMES("Media.Audio.Render.OutputDeviceStreamCreationTime", base::TimeTicks::Now() - stream_creation_start_time_); - stream_ = std::move(stream); + stream_.reset(); + stream_.Bind(std::move(pending_stream)); base::PlatformFile socket_handle; auto result =
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc.h b/content/renderer/media/audio/mojo_audio_output_ipc.h index cc1ec18..cf29e0f 100644 --- a/content/renderer/media/audio/mojo_audio_output_ipc.h +++ b/content/renderer/media/audio/mojo_audio_output_ipc.h
@@ -19,6 +19,8 @@ #include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" namespace content { @@ -55,7 +57,7 @@ void SetVolume(double volume) override; // media::mojom::AudioOutputStreamProviderClient implementation. - void Created(media::mojom::AudioOutputStreamPtr stream, + void Created(mojo::PendingRemote<media::mojom::AudioOutputStream> stream, media::mojom::ReadWriteAudioDataPipePtr data_pipe) override; private: @@ -93,7 +95,7 @@ mojo::Binding<media::mojom::AudioOutputStreamProviderClient> binding_; media::mojom::AudioOutputStreamProviderPtr stream_provider_; - media::mojom::AudioOutputStreamPtr stream_; + mojo::Remote<media::mojom::AudioOutputStream> stream_; media::AudioOutputIPCDelegate* delegate_ = nullptr; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc b/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc index bf402aa..08e023b 100644 --- a/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc +++ b/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc
@@ -17,6 +17,9 @@ #include "media/audio/audio_device_description.h" #include "media/base/audio_parameters.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/platform_handle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -54,23 +57,24 @@ ~TestStreamProvider() override { // If we expected a stream to be acquired, make sure it is so. if (stream_) - EXPECT_TRUE(binding_); + EXPECT_TRUE(receiver_); } void Acquire( const media::AudioParameters& params, media::mojom::AudioOutputStreamProviderClientPtr provider_client, const base::Optional<base::UnguessableToken>& processing_id) override { - EXPECT_EQ(binding_, base::nullopt); + EXPECT_EQ(receiver_, base::nullopt); EXPECT_NE(stream_, nullptr); std::swap(provider_client, provider_client_); - media::mojom::AudioOutputStreamPtr stream_ptr; - binding_.emplace(stream_, mojo::MakeRequest(&stream_ptr)); + mojo::PendingRemote<media::mojom::AudioOutputStream> stream_pending_remote; + receiver_.emplace(stream_, + stream_pending_remote.InitWithNewPipeAndPassReceiver()); base::CancelableSyncSocket foreign_socket; EXPECT_TRUE( base::CancelableSyncSocket::CreatePair(&socket_, &foreign_socket)); provider_client_->Created( - std::move(stream_ptr), + std::move(stream_pending_remote), {base::in_place, base::UnsafeSharedMemoryRegion::Create(kMemoryLength), mojo::WrapPlatformFile(foreign_socket.Release())}); } @@ -85,7 +89,7 @@ private: media::mojom::AudioOutputStream* stream_; media::mojom::AudioOutputStreamProviderClientPtr provider_client_; - base::Optional<mojo::Binding<media::mojom::AudioOutputStream>> binding_; + base::Optional<mojo::Receiver<media::mojom::AudioOutputStream>> receiver_; base::CancelableSyncSocket socket_; }; @@ -93,7 +97,7 @@ public: TestRemoteFactory() : expect_request_(false), - binding_(this, mojo::MakeRequest(&this_proxy_)) {} + receiver_(this, this_remote_.BindNewPipeAndPassReceiver()) {} ~TestRemoteFactory() override {} @@ -146,9 +150,9 @@ } void Disconnect() { - binding_.Close(); - this_proxy_.reset(); - binding_.Bind(mojo::MakeRequest(&this_proxy_)); + receiver_.reset(); + this_remote_.reset(); + receiver_.Bind(this_remote_.BindNewPipeAndPassReceiver()); provider_binding_.reset(); provider_.reset(); expect_request_ = false; @@ -159,14 +163,14 @@ } private: - mojom::RendererAudioOutputStreamFactory* get() { return this_proxy_.get(); } + mojom::RendererAudioOutputStreamFactory* get() { return this_remote_.get(); } bool expect_request_; base::Optional<base::UnguessableToken> expected_session_id_; std::string expected_device_id_; - mojom::RendererAudioOutputStreamFactoryPtr this_proxy_; - mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; + mojo::Remote<mojom::RendererAudioOutputStreamFactory> this_remote_; + mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this}; std::unique_ptr<TestStreamProvider> provider_; base::Optional<mojo::Binding<media::mojom::AudioOutputStreamProvider>> provider_binding_;
diff --git a/content/renderer/pepper/pepper_file_chooser_host.cc b/content/renderer/pepper/pepper_file_chooser_host.cc index d0eaf74..99ecd4d 100644 --- a/content/renderer/pepper/pepper_file_chooser_host.cc +++ b/content/renderer/pepper/pepper_file_chooser_host.cc
@@ -13,11 +13,12 @@ #include "content/public/renderer/renderer_ppapi_host.h" #include "content/renderer/pepper/pepper_file_ref_renderer_host.h" #include "content/renderer/render_view_impl.h" +#include "mojo/public/cpp/bindings/remote.h" #include "ppapi/c/pp_errors.h" #include "ppapi/host/dispatch_host_message.h" #include "ppapi/host/ppapi_host.h" #include "ppapi/proxy/ppapi_messages.h" -#include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h" #include "third_party/blink/public/platform/file_path_conversion.h" #include "third_party/blink/public/platform/web_string.h" @@ -38,8 +39,9 @@ blink::mojom::FileChooserParamsPtr params) { if (!render_frame) return false; - render_frame->GetInterfaceProvider()->GetInterface(&file_chooser_); - file_chooser_.set_connection_error_handler(base::BindOnce( + render_frame->GetBrowserInterfaceBroker()->GetInterface( + file_chooser_.BindNewPipeAndPassReceiver()); + file_chooser_.set_disconnect_handler(base::BindOnce( &CompletionHandler::OnConnectionError, base::Unretained(this))); file_chooser_->OpenFileChooser( std::move(params), base::BindOnce(&CompletionHandler::DidChooseFiles, @@ -81,7 +83,7 @@ } base::WeakPtr<PepperFileChooserHost> host_; - blink::mojom::FileChooserPtr file_chooser_; + mojo::Remote<blink::mojom::FileChooser> file_chooser_; DISALLOW_COPY_AND_ASSIGN(CompletionHandler); };
diff --git a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc b/content/renderer/pepper/pepper_file_chooser_host_unittest.cc index 21c64e3..90fc335b2 100644 --- a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc +++ b/content/renderer/pepper/pepper_file_chooser_host_unittest.cc
@@ -15,6 +15,7 @@ #include "content/renderer/pepper/pepper_file_chooser_host.h" #include "content/renderer/render_view_impl.h" #include "content/test/test_content_client.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "ppapi/c/pp_errors.h" #include "ppapi/host/host_message_context.h" #include "ppapi/host/ppapi_host.h" @@ -26,7 +27,6 @@ #include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/resource_tracker.h" #include "ppapi/shared_impl/test_globals.h" -#include "services/service_manager/public/cpp/interface_provider.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h" @@ -37,27 +37,23 @@ using blink::mojom::FileChooserFileInfoPtr; using blink::mojom::FileChooserParams; using blink::mojom::FileChooserParamsPtr; -using blink::mojom::FileChooserPtr; -using blink::mojom::FileChooserRequest; namespace { class MockFileChooser : public FileChooser { public: - MockFileChooser(service_manager::InterfaceProvider* provider, + MockFileChooser(blink::BrowserInterfaceBrokerProxy* broker, base::OnceClosure reached_callback) : reached_callback_(std::move(reached_callback)) { - service_manager::InterfaceProvider::TestApi test_api(provider); - test_api.SetBinderForName( + broker->SetBinderForTesting( FileChooser::Name_, - base::BindRepeating(&MockFileChooser::OnFileChooserRequest, + base::BindRepeating(&MockFileChooser::BindFileChooserReceiver, base::Unretained(this))); - provider_ = provider; + broker_ = broker; } ~MockFileChooser() override { - service_manager::InterfaceProvider::TestApi test_api(provider_); - test_api.ClearBinderForName(FileChooser::Name_); + broker_->SetBinderForTesting(FileChooser::Name_, {}); } const FileChooserParams& params() const { @@ -70,12 +66,12 @@ DCHECK(params_); std::move(callback_).Run(blink::mojom::FileChooserResult::New( std::move(files), base::FilePath())); - bindings_.FlushForTesting(); + receivers_.FlushForTesting(); } private: - void OnFileChooserRequest(mojo::ScopedMessagePipeHandle handle) { - bindings_.AddBinding(this, FileChooserRequest(std::move(handle))); + void BindFileChooserReceiver(mojo::ScopedMessagePipeHandle handle) { + receivers_.Add(this, mojo::PendingReceiver<FileChooser>(std::move(handle))); } void OpenFileChooser(FileChooserParamsPtr params, @@ -89,8 +85,8 @@ const base::FilePath& directory_path, EnumerateChosenDirectoryCallback callback) override {} - service_manager::InterfaceProvider* provider_; - mojo::BindingSet<FileChooser> bindings_; + blink::BrowserInterfaceBrokerProxy* broker_; + mojo::ReceiverSet<FileChooser> receivers_; OpenFileChooserCallback callback_; FileChooserParamsPtr params_; base::OnceClosure reached_callback_; @@ -107,7 +103,7 @@ globals_.GetResourceTracker()->DidCreateInstance(pp_instance_); mock_file_chooser_ = std::make_unique<MockFileChooser>( static_cast<RenderFrameImpl*>(view_->GetMainRenderFrame()) - ->GetInterfaceProvider(), + ->GetBrowserInterfaceBroker(), run_loop_.QuitClosure()); } void TearDown() override {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 4966798..7a098ee 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -3031,16 +3031,15 @@ // SSL manager can react to the provisional load failure before being // notified the load stopped. // - NotifyObserversOfFailedProvisionalLoad(error); + NotifyObserversOfFailedProvisionalLoad(); // Notify the browser that we failed a provisional load with an error. SendFailedProvisionalLoad(http_method.Ascii(), error, frame_); } -void RenderFrameImpl::NotifyObserversOfFailedProvisionalLoad( - const blink::WebURLError& error) { +void RenderFrameImpl::NotifyObserversOfFailedProvisionalLoad() { for (auto& observer : observers_) - observer.DidFailProvisionalLoad(error); + observer.DidFailProvisionalLoad(); } void RenderFrameImpl::LoadNavigationErrorPage( @@ -3838,7 +3837,7 @@ if (commit_params->nav_entry_id == 0) { // For renderer initiated navigations, we send out a // DidFailProvisionalLoad() notification. - NotifyObserversOfFailedProvisionalLoad(error); + NotifyObserversOfFailedProvisionalLoad(); // |browser_side_navigation_pending_| can be false if we are committing // failed navigation in a different process than it was started, e.g. @@ -6634,9 +6633,6 @@ sync_navigation_callback_.Cancel(); mhtml_body_loader_client_.reset(); - for (auto& observer : observers_) - observer.DidStartNavigation(url, info->navigation_type); - // First navigation in a frame to an empty document must be handled // synchronously. bool is_first_real_empty_document_navigation = @@ -6645,6 +6641,8 @@ if (is_first_real_empty_document_navigation && !is_history_navigation_in_new_child_frame) { + for (auto& observer : observers_) + observer.DidStartNavigation(url, info->navigation_type); CommitSyncNavigation(std::move(info)); return; } @@ -6658,6 +6656,8 @@ if (!frame_->WillStartNavigation( *info, false /* is_history_navigation_in_new_child_frame */)) return; + for (auto& observer : observers_) + observer.DidStartNavigation(url, info->navigation_type); // Only the first navigation in a frame to an empty document must be // handled synchronously, the others are required to happen // asynchronously. So a PostTask is used. @@ -7186,6 +7186,8 @@ is_history_navigation_in_new_child_frame)) return; + for (auto& observer : observers_) + observer.DidStartNavigation(info->url_request.Url(), info->navigation_type); browser_side_navigation_pending_ = true; browser_side_navigation_pending_url_ = info->url_request.Url();
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index f345953..6c428a1 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -924,7 +924,7 @@ // the Mojo IPC layer. void MaybeEnableMojoBindings(); - void NotifyObserversOfFailedProvisionalLoad(const blink::WebURLError& error); + void NotifyObserversOfFailedProvisionalLoad(); bool handling_select_range() const { return handling_select_range_; }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 56bff368..7b6c310 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -678,8 +678,7 @@ .Build()), main_thread_scheduler_(std::move(scheduler)), categorized_worker_pool_(new CategorizedWorkerPool()), - client_id_(1), - compositing_mode_watcher_binding_(this) { + client_id_(1) { TRACE_EVENT0("startup", "RenderThreadImpl::Create"); Init(); } @@ -696,8 +695,7 @@ .Build()), main_thread_scheduler_(std::move(scheduler)), categorized_worker_pool_(new CategorizedWorkerPool()), - is_scroll_animator_enabled_(false), - compositing_mode_watcher_binding_(this) { + is_scroll_animator_enabled_(false) { TRACE_EVENT0("startup", "RenderThreadImpl::Create"); DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kRendererClientId)); @@ -961,12 +959,8 @@ if (!is_gpu_compositing_disabled_) { BindHostReceiver(mojo::MakeRequest(&compositing_mode_reporter_)); - // Make |this| a CompositingModeWatcher for the - // |compositing_mode_reporter_|. - viz::mojom::CompositingModeWatcherPtr watcher_ptr; - compositing_mode_watcher_binding_.Bind(mojo::MakeRequest(&watcher_ptr)); compositing_mode_reporter_->AddCompositingModeWatcher( - std::move(watcher_ptr)); + compositing_mode_watcher_receiver_.BindNewPipeAndPassRemote()); } }
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index b1bc912..1832cee 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -45,10 +45,10 @@ #include "ipc/ipc_sync_channel.h" #include "media/media_buildflags.h" #include "mojo/public/cpp/bindings/associated_receiver.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.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 "mojo/public/cpp/bindings/thread_safe_interface_ptr.h" #include "net/base/network_change_notifier.h" @@ -725,8 +725,8 @@ viz::mojom::CompositingModeReporterPtr compositing_mode_reporter_; // The class is a CompositingModeWatcher, which is bound to mojo through // this member. - mojo::Binding<viz::mojom::CompositingModeWatcher> - compositing_mode_watcher_binding_; + mojo::Receiver<viz::mojom::CompositingModeWatcher> + compositing_mode_watcher_receiver_{this}; base::WeakPtrFactory<RenderThreadImpl> weak_factory_{this};
diff --git a/content/shell/renderer/web_test/web_test_render_frame_observer.cc b/content/shell/renderer/web_test/web_test_render_frame_observer.cc index 807e772e..ad020d0 100644 --- a/content/shell/renderer/web_test/web_test_render_frame_observer.cc +++ b/content/shell/renderer/web_test/web_test_render_frame_observer.cc
@@ -67,8 +67,7 @@ ->DidCommitNavigationInMainFrame(); } -void WebTestRenderFrameObserver::DidFailProvisionalLoad( - const blink::WebURLError& error) { +void WebTestRenderFrameObserver::DidFailProvisionalLoad() { if (!render_frame()->IsMainFrame()) return; focus_on_next_commit_ = false;
diff --git a/content/shell/renderer/web_test/web_test_render_frame_observer.h b/content/shell/renderer/web_test/web_test_render_frame_observer.h index 64d7c2c..3411c8d 100644 --- a/content/shell/renderer/web_test/web_test_render_frame_observer.h +++ b/content/shell/renderer/web_test/web_test_render_frame_observer.h
@@ -24,7 +24,7 @@ blink::WebDocumentLoader* document_loader) override; void DidCommitProvisionalLoad(bool is_same_document_navigation, ui::PageTransition transition) override; - void DidFailProvisionalLoad(const blink::WebURLError& error) override; + void DidFailProvisionalLoad() override; void OnDestruct() override; // mojom::WebTestControl implementation.
diff --git a/content/shell/test_runner/web_frame_test_proxy.cc b/content/shell/test_runner/web_frame_test_proxy.cc index afa9efd..79013b4 100644 --- a/content/shell/test_runner/web_frame_test_proxy.cc +++ b/content/shell/test_runner/web_frame_test_proxy.cc
@@ -67,7 +67,7 @@ } } - void DidFailProvisionalLoad(const blink::WebURLError& error) override { + void DidFailProvisionalLoad() override { if (test_runner()->ShouldDumpFrameLoadCallbacks()) { WebFrameTestClient::PrintFrameDescription(delegate(), render_frame()->GetWebFrame());
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc index 61b358f5..557f4de 100644 --- a/content/shell/utility/shell_content_utility_client.cc +++ b/content/shell/utility/shell_content_utility_client.cc
@@ -21,9 +21,9 @@ #include "content/public/test/test_service.mojom.h" #include "content/public/utility/utility_thread.h" #include "content/shell/common/power_monitor_test_impl.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/bindings/service_factory.h" -#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/system/buffer.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/test/echo/echo_service.h" @@ -34,9 +34,9 @@ class TestUtilityServiceImpl : public mojom::TestService { public: - static void Create(mojom::TestServiceRequest request) { - mojo::MakeStrongBinding(base::WrapUnique(new TestUtilityServiceImpl), - std::move(request)); + static void Create(mojo::PendingReceiver<mojom::TestService> receiver) { + mojo::MakeSelfOwnedReceiver(base::WrapUnique(new TestUtilityServiceImpl), + std::move(receiver)); } // mojom::TestService implementation:
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py index f4a00e2..ea2f41b 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -80,12 +80,6 @@ if cls._disable_log_uploads: browser_options.logs_cloud_bucket = None - # A non-sandboxed, 120-seconds-delayed gpu process is currently running in - # the browser to collect gpu info. A command line switch is added here so - # the dx12/vulkan info can be collected immediately for the tests. - browser_args.append( - '--no-delay-for-dx12-vulkan-info-collection') - # Append the new arguments. browser_options.AppendExtraBrowserArgs(browser_args) cls._last_launched_browser_args = set(browser_args)
diff --git a/content/test/gpu/gpu_tests/info_collection_test.py b/content/test/gpu/gpu_tests/info_collection_test.py index 58032b85..ba14a3f 100644 --- a/content/test/gpu/gpu_tests/info_collection_test.py +++ b/content/test/gpu/gpu_tests/info_collection_test.py
@@ -27,6 +27,8 @@ options.expected_device_id)) yield ('InfoCollection_direct_composition', '_', ('_RunDirectCompositionTest', '_', '_')) + yield ('InfoCollection_dx12_vulkan', '_', + ('_RunDX12VulkanTest', '_', '_')) @classmethod def SetUpProcess(cls): @@ -87,6 +89,17 @@ self.fail('%s mismatch, expected %s but got %s.' % (field, self._ValueToStr(expected), self._ValueToStr(detected))) + def _RunDX12VulkanTest(self, gpu, unused_arg_0, unused_arg_1): + os_name = self.browser.platform.GetOSName() + if os_name and os_name.lower() == 'win': + self.RestartBrowserIfNecessaryWithArgs([ + '--no-delay-for-dx12-vulkan-info-collection']) + # Need to re-request system info for DX12/Vulkan bits. + system_info = self.browser.GetSystemInfo() + if not system_info: + self.fail("Browser doesn't support GetSystemInfo") + # TODO(zmo): Verify Win GPU bots DX12/Vulkan supports are as expected. + @staticmethod def _ValueToStr(value): if type(value) is str:
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 725527e..2f8d9c9 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -621,7 +621,8 @@ # Pages that should be run with GPU rasterization enabled. @staticmethod def GpuRasterizationPages(base_name): - browser_args = ['--force-gpu-rasterization'] + browser_args = ['--force-gpu-rasterization', + '--disable-software-compositing-fallback'] return [ PixelTestPage( 'pixel_background.html', @@ -744,6 +745,7 @@ def ExperimentalCanvasFeaturesPages(base_name): browser_args = [ '--enable-experimental-web-platform-features'] # for lowLatency + accelerated_args = ['--disable-software-compositing-fallback'] unaccelerated_args = [ '--disable-accelerated-2d-canvas', '--disable-gpu-compositing'] @@ -833,14 +835,14 @@ base_name + '_OffscreenCanvasAccelerated2D', test_rect=[0, 0, 360, 200], revision=12, - browser_args=browser_args), + browser_args=browser_args + accelerated_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_worker.html', base_name + '_OffscreenCanvasAccelerated2DWorker', test_rect=[0, 0, 360, 200], revision=12, - browser_args=browser_args), + browser_args=browser_args + accelerated_args), PixelTestPage( 'pixel_offscreenCanvas_2d_commit_main.html', @@ -889,7 +891,7 @@ base_name + '_CanvasDisplayLinearRGBAccelerated2D', test_rect=[0, 0, 140, 140], revision=10, - browser_args=browser_args), + browser_args=browser_args + accelerated_args), PixelTestPage( 'pixel_canvas_display_linear-rgb.html', @@ -910,7 +912,7 @@ base_name + '_CanvasDisplaySRGBAccelerated2D', test_rect=[0, 0, 140, 140], revision=0, # not used, unsupported - browser_args=browser_args), + browser_args=browser_args + accelerated_args), PixelTestPage( 'pixel_canvas_display_srgb.html',
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt index fbb084d..0812080a 100644 --- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -42,3 +42,6 @@ # The Nexus 6 times out on these tests while waiting for the JS to complete crbug.com/611906 [ android qualcomm-adreno-(tm)-420 ] ContextLost_WebGLContextLostFromLoseContextExtension [ Failure ] crbug.com/611906 [ android qualcomm-adreno-(tm)-420 ] ContextLost_WebGLContextLostFromQuantity [ Failure ] +crbug.com/609629 [ android qualcomm-adreno-(tm)-420 ] GpuCrash_GPUProcessCrashesExactlyOncePerVisitToAboutGpuCrash [ Skip ] +crbug.com/609629 [ android qualcomm-adreno-(tm)-420 ] ContextLost_WebGLContextLostFromGPUProcessExit [ Skip ] +crbug.com/609629 [ android qualcomm-adreno-(tm)-420 ] ContextLost_WebGLContextLostInHiddenTab [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 9d2accd..bc395e6 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -181,20 +181,6 @@ crbug.com/974380 [ mac ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker [ Skip ] crbug.com/974383 [ mac ] Pixel_CanvasDisplayLinearRGBAccelerated2D [ Skip ] -# Fails when the browser features SkiaRenderer & Vulkan are enabled on Linux -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplayLinearRGBUnaccelerated2D [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplaySRGBUnaccelerated2D [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplaySRGBUnaccelerated2DGPUCompositing [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasUnacceleratedLowLatency2D [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_Canvas2DTabSwitch_SoftwareCompositing [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasUnaccelerated2D [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasUnaccelerated2DWorker [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasWebGLSoftwareCompositing [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasWebGLSoftwareCompositingWorker [ Skip ] -crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_RepeatedWebGLTo2D_SoftwareCompositing [ Skip ] -crbug.com/985366 [ linux skia-renderer use-vulkan ] Pixel_CanvasLowLatency2D [ Skip ] - # Also producing blank images on Intel crbug.com/974383 [ linux skia-renderer use-vulkan intel ] Pixel_CanvasDisplayLinearRGBAccelerated2D [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 41b699b3f..4e3514c 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -113,6 +113,7 @@ crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/misc/tex-input-validation.html [ Failure ] crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] +crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] # Win / NVIDIA / Passthrough command decoder / D3D11 crbug.com/751849 [ win7 debug nvidia d3d11 passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ RetryOnFailure ] @@ -295,6 +296,7 @@ crbug.com/931016 [ win amd vulkan passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgb* [ Failure ] crbug.com/974347 [ win amd vulkan passthrough ] conformance/textures/image/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] crbug.com/974347 [ win amd vulkan passthrough ] conformance/textures/image/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1004581 [ win amd vulkan passthrough ] conformance/rendering/multisample-corruption.html [ Failure ] # Vulkan / Win / Intel / Passthrough command decoder crbug.com/angleproject/2909 [ win intel vulkan passthrough ] conformance/ogles/GL/faceforward/faceforward_001_to_006.html [ Failure ] @@ -338,18 +340,18 @@ crbug.com/990368 [ mac passthrough ] conformance/canvas/draw-static-webgl-to-multiple-canvas-test.html [ Failure ] crbug.com/990368 [ mac passthrough ] conformance/canvas/draw-webgl-to-canvas-test.html [ Failure ] crbug.com/990368 [ mac passthrough ] conformance/canvas/to-data-url-test.html [ Failure ] -crbug.com/990368 [ mac passthrough ] conformance/extensions/oes-texture-float-linear.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/misc/canvas-teximage-after-multiple-drawimages.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texparameter-test.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-active-bind-2.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-active-bind.html [ Skip ] -crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-npot.html [ Skip ] +crbug.com/990368 [ mac passthrough ] conformance/extensions/oes-texture-float-linear.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/misc/canvas-teximage-after-multiple-drawimages.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texparameter-test.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-active-bind-2.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-active-bind.html [ Failure ] +crbug.com/990368 [ mac passthrough ] conformance/textures/misc/texture-npot.html [ Failure ] crbug.com/angleproject/3812 [ mac passthrough ] conformance/context/context-attribute-preserve-drawing-buffer.html [ Failure ] crbug.com/990368 [ mac passthrough ] conformance/context/premultiplyalpha-test.html [ Failure ] crbug.com/989194 [ mac passthrough ] conformance/extensions/oes-texture-float-with-video.html [ Failure ]
diff --git a/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc b/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc index 5580fbc..03e6faee 100644 --- a/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc +++ b/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc
@@ -31,7 +31,9 @@ #include "media/audio/simple_sources.h" #include "media/base/audio_parameters.h" #include "media/base/media_switches.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/platform_handle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -189,12 +191,12 @@ } UniqueAudioOutputStreamFactoryPtr CreateAndBindFactory( - mojom::RendererAudioOutputStreamFactoryRequest request) { + mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) { factory_context_.reset(new RendererAudioOutputStreamFactoryContextImpl( kRenderProcessId, &audio_system_, &audio_manager_, media_stream_manager_.get())); return RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( - factory_context_.get(), kRenderFrameId, std::move(request)); + factory_context_.get(), kRenderFrameId, std::move(receiver)); } std::unique_ptr<MediaStreamManager> media_stream_manager_; @@ -229,35 +231,39 @@ }, &create_stream_called, stream)); - mojom::RendererAudioOutputStreamFactoryPtr stream_factory; - auto factory_handle = - CreateAndBindFactory(mojo::MakeRequest(&stream_factory)); + mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> + pending_stream_factory; + auto factory_handle = CreateAndBindFactory( + pending_stream_factory.InitWithNewPipeAndPassReceiver()); base::Thread renderer_side_ipc_thread("Renderer IPC thread"); ASSERT_TRUE(renderer_side_ipc_thread.Start()); auto renderer_ipc_task_runner = renderer_side_ipc_thread.task_runner(); - // Bind |stream_factory| to |renderer_ipc_task_runner|. - mojom::RendererAudioOutputStreamFactory* factory_ptr; + // Bind |pending_stream_factory| to |renderer_ipc_task_runner|. + mojo::Remote<mojom::RendererAudioOutputStreamFactory> stream_factory; + mojom::RendererAudioOutputStreamFactory* factory_remote; renderer_ipc_task_runner->PostTask( - FROM_HERE, base::BindOnce( - [](mojom::RendererAudioOutputStreamFactoryPtr* factory, - mojom::RendererAudioOutputStreamFactoryPtrInfo info, - mojom::RendererAudioOutputStreamFactory** ptr) { - factory->Bind(std::move(info)); - *ptr = factory->get(); - }, - base::Unretained(&stream_factory), - stream_factory.PassInterface(), &factory_ptr)); - // Wait for factory_ptr to be set. + FROM_HERE, + base::BindOnce( + [](mojo::Remote<mojom::RendererAudioOutputStreamFactory>* factory, + mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> + pending_remote, + mojom::RendererAudioOutputStreamFactory** ptr) { + factory->Bind(std::move(pending_remote)); + *ptr = factory->get(); + }, + base::Unretained(&stream_factory), std::move(pending_stream_factory), + &factory_remote)); + // Wait for factory_remote to be set. SyncWith(renderer_ipc_task_runner); auto renderer_side_ipc = std::make_unique<MojoAudioOutputIPC>( base::BindRepeating( - [](mojom::RendererAudioOutputStreamFactory* factory_ptr) { - return factory_ptr; + [](mojom::RendererAudioOutputStreamFactory* factory_remote) { + return factory_remote; }, - factory_ptr), + factory_remote), renderer_ipc_task_runner); auto device = base::MakeRefCounted<media::AudioOutputDevice>( @@ -278,7 +284,8 @@ // |stream_factory| must be destroyed on the correct thread. renderer_ipc_task_runner->PostTask( FROM_HERE, - base::BindOnce([](mojom::RendererAudioOutputStreamFactoryPtr) {}, + base::BindOnce([](mojo::Remote<mojom::RendererAudioOutputStreamFactory> + stream_factory) { stream_factory.reset(); }, std::move(stream_factory))); SyncWith(renderer_ipc_task_runner); // Wait for any clean-up tasks.
diff --git a/device/fido/hid/fake_hid_impl_for_testing.cc b/device/fido/hid/fake_hid_impl_for_testing.cc index c51c9c2f..0ee4ba3 100644 --- a/device/fido/hid/fake_hid_impl_for_testing.cc +++ b/device/fido/hid/fake_hid_impl_for_testing.cc
@@ -127,13 +127,14 @@ FakeFidoHidManager::~FakeFidoHidManager() = default; -void FakeFidoHidManager::AddBinding(mojo::ScopedMessagePipeHandle handle) { - bindings_.AddBinding(this, - device::mojom::HidManagerRequest(std::move(handle))); +void FakeFidoHidManager::AddReceiver(mojo::ScopedMessagePipeHandle handle) { + receivers_.Add(this, mojo::PendingReceiver<device::mojom::HidManager>( + std::move(handle))); } -void FakeFidoHidManager::AddBinding2(device::mojom::HidManagerRequest request) { - bindings_.AddBinding(this, std::move(request)); +void FakeFidoHidManager::AddReceiver2( + mojo::PendingReceiver<device::mojom::HidManager> receiver) { + receivers_.Add(this, std::move(receiver)); } void FakeFidoHidManager::AddFidoHidDevice(std::string guid) { @@ -216,7 +217,7 @@ connector_->OverrideBinderForTesting( service_manager::ServiceFilter::ByName(device::mojom::kServiceName), device::mojom::HidManager::Name_, - base::BindRepeating(&FakeFidoHidManager::AddBinding, + base::BindRepeating(&FakeFidoHidManager::AddReceiver, base::Unretained(this))); }
diff --git a/device/fido/hid/fake_hid_impl_for_testing.h b/device/fido/hid/fake_hid_impl_for_testing.h index 597cd5d3..0908a4c 100644 --- a/device/fido/hid/fake_hid_impl_for_testing.h +++ b/device/fido/hid/fake_hid_impl_for_testing.h
@@ -14,8 +14,9 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "device/fido/fido_constants.h" -#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/interface_ptr_set.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/strong_binding.h" #include "services/device/public/mojom/hid.mojom.h" #include "testing/gmock/include/gmock/gmock.h" @@ -111,8 +112,8 @@ const std::string& device_guid, mojo::PendingRemote<mojom::HidConnectionClient> connection_client, ConnectCallback callback) override; - void AddBinding(mojo::ScopedMessagePipeHandle handle); - void AddBinding2(device::mojom::HidManagerRequest request); + void AddReceiver(mojo::ScopedMessagePipeHandle handle); + void AddReceiver2(mojo::PendingReceiver<device::mojom::HidManager> receiver); void AddDevice(device::mojom::HidDeviceInfoPtr device); void AddDeviceAndSetConnection(device::mojom::HidDeviceInfoPtr device, device::mojom::HidConnectionPtr connection); @@ -122,7 +123,7 @@ std::map<std::string, device::mojom::HidDeviceInfoPtr> devices_; std::map<std::string, device::mojom::HidConnectionPtr> connections_; mojo::AssociatedInterfacePtrSet<device::mojom::HidManagerClient> clients_; - mojo::BindingSet<device::mojom::HidManager> bindings_; + mojo::ReceiverSet<device::mojom::HidManager> receivers_; DISALLOW_COPY_AND_ASSIGN(FakeFidoHidManager); };
diff --git a/device/fido/hid/fido_hid_device_unittest.cc b/device/fido/hid/fido_hid_device_unittest.cc index b659797..a40e701 100644 --- a/device/fido/hid/fido_hid_device_unittest.cc +++ b/device/fido/hid/fido_hid_device_unittest.cc
@@ -21,8 +21,8 @@ #include "device/fido/hid/fake_hid_impl_for_testing.h" #include "device/fido/hid/fido_hid_message.h" #include "device/fido/test_callback_receiver.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/cpp/hid/hid_device_filter.h" #include "services/device/public/mojom/hid.mojom.h" #include "testing/gmock/include/gmock/gmock.h" @@ -223,13 +223,13 @@ public: void SetUp() override { fake_hid_manager_ = std::make_unique<FakeFidoHidManager>(); - fake_hid_manager_->AddBinding2(mojo::MakeRequest(&hid_manager_)); + fake_hid_manager_->AddReceiver2(hid_manager_.BindNewPipeAndPassReceiver()); } protected: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - device::mojom::HidManagerPtr hid_manager_; + mojo::Remote<device::mojom::HidManager> hid_manager_; std::unique_ptr<FakeFidoHidManager> fake_hid_manager_; };
diff --git a/device/fido/hid/fido_hid_discovery.cc b/device/fido/hid/fido_hid_discovery.cc index c471cd02..eb75c3bd 100644 --- a/device/fido/hid/fido_hid_discovery.cc +++ b/device/fido/hid/fido_hid_discovery.cc
@@ -26,8 +26,8 @@ void FidoHidDiscovery::StartInternal() { DCHECK(connector_); - connector_->BindInterface(device::mojom::kServiceName, - mojo::MakeRequest(&hid_manager_)); + connector_->Connect(device::mojom::kServiceName, + hid_manager_.BindNewPipeAndPassReceiver()); device::mojom::HidManagerClientAssociatedPtrInfo client; binding_.Bind(mojo::MakeRequest(&client));
diff --git a/device/fido/hid/fido_hid_discovery.h b/device/fido/hid/fido_hid_discovery.h index 204bb25..03322c10 100644 --- a/device/fido/hid/fido_hid_discovery.h +++ b/device/fido/hid/fido_hid_discovery.h
@@ -13,6 +13,7 @@ #include "base/memory/weak_ptr.h" #include "device/fido/fido_device_discovery.h" #include "mojo/public/cpp/bindings/associated_binding.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/cpp/hid/hid_device_filter.h" #include "services/device/public/mojom/hid.mojom.h" @@ -43,7 +44,7 @@ void OnGetDevices(std::vector<device::mojom::HidDeviceInfoPtr> devices); service_manager::Connector* connector_; - device::mojom::HidManagerPtr hid_manager_; + mojo::Remote<device::mojom::HidManager> hid_manager_; mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_; HidDeviceFilter filter_; base::WeakPtrFactory<FidoHidDiscovery> weak_factory_{this};
diff --git a/device/gamepad/nintendo_data_fetcher.cc b/device/gamepad/nintendo_data_fetcher.cc index bfd5d6d..97a801f 100644 --- a/device/gamepad/nintendo_data_fetcher.cc +++ b/device/gamepad/nintendo_data_fetcher.cc
@@ -30,8 +30,8 @@ void NintendoDataFetcher::OnAddedToProvider() { // Open a connection to the HID service. On a successful connection, // OnGetDevices will be called with a list of connected HID devices. - connector()->BindInterface(mojom::kServiceName, - mojo::MakeRequest(&hid_manager_)); + connector()->Connect(mojom::kServiceName, + hid_manager_.BindNewPipeAndPassReceiver()); mojom::HidManagerClientAssociatedPtrInfo client; binding_.Bind(mojo::MakeRequest(&client)); hid_manager_->GetDevicesAndSetClient(
diff --git a/device/gamepad/nintendo_data_fetcher.h b/device/gamepad/nintendo_data_fetcher.h index c0964a2e..8437aac4 100644 --- a/device/gamepad/nintendo_data_fetcher.h +++ b/device/gamepad/nintendo_data_fetcher.h
@@ -15,6 +15,7 @@ #include "device/gamepad/nintendo_controller.h" #include "device/gamepad/public/cpp/gamepads.h" #include "mojo/public/cpp/bindings/associated_binding.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/hid.mojom.h" namespace device { @@ -110,7 +111,7 @@ // A mapping from source ID to connected Nintendo Switch devices. ControllerMap controllers_; - mojom::HidManagerPtr hid_manager_; + mojo::Remote<mojom::HidManager> hid_manager_; mojo::AssociatedBinding<mojom::HidManagerClient> binding_; base::WeakPtrFactory<NintendoDataFetcher> weak_factory_{this};
diff --git a/docs/android_dynamic_feature_modules.md b/docs/android_dynamic_feature_modules.md index 9a259ed..dc1879e 100644 --- a/docs/android_dynamic_feature_modules.md +++ b/docs/android_dynamic_feature_modules.md
@@ -61,17 +61,6 @@ </manifest> ``` -Then, add a package ID for Foo so that Foo's resources have unique identifiers. -For this, add a new ID to -`//chrome/android/modules/chrome_feature_modules.gni`: - -```gn -resource_packages_id_mapping = [ - ..., - "foo=0x{XX}", # Set {XX} to next lower hex number. -] -``` - Next, create a descriptor configuring the Foo module. To do this, create `//chrome/android/features/foo/foo_module.gni` and add the following:
diff --git a/docs/ui/product_excellence/index.md b/docs/ui/product_excellence/index.md index b6c4a82c..15a36603 100644 --- a/docs/ui/product_excellence/index.md +++ b/docs/ui/product_excellence/index.md
@@ -1,7 +1,7 @@ # Stint 4: Views Cleanup Continued Schedule: May 12-31, 2019 -Participants: TBD -Summary and stories: TBD +Participants: kylixrd, pkasting, robliao, 2 external contributors +[Summary](https://groups.google.com/a/google.com/d/topic/chrome-desktop-ui/vOccMw26R5o/discussion) Relevant links: * [Bug query](https://bugs.chromium.org/p/chromium/issues/list?q=hotlist%3DViewsCleanup)
diff --git a/extensions/browser/api/device_permissions_prompt.cc b/extensions/browser/api/device_permissions_prompt.cc index 83cd02e..7a43763f 100644 --- a/extensions/browser/api/device_permissions_prompt.cc +++ b/extensions/browser/api/device_permissions_prompt.cc
@@ -22,6 +22,7 @@ #include "extensions/common/extension.h" #include "mojo/public/cpp/bindings/associated_binding.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/cpp/hid/hid_device_filter.h" #include "services/device/public/cpp/hid/hid_usage_and_page.h" #include "services/device/public/cpp/usb/usb_utils.h" @@ -217,8 +218,8 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); service_manager::Connector* connector = content::GetSystemConnector(); DCHECK(connector); - connector->BindInterface(device::mojom::kServiceName, - mojo::MakeRequest(&hid_manager_)); + connector->Connect(device::mojom::kServiceName, + hid_manager_.BindNewPipeAndPassReceiver()); device::mojom::HidManagerClientAssociatedPtrInfo client; binding_.Bind(mojo::MakeRequest(&client)); @@ -297,7 +298,7 @@ bool initialized_; std::vector<HidDeviceFilter> filters_; - device::mojom::HidManagerPtr hid_manager_; + mojo::Remote<device::mojom::HidManager> hid_manager_; DevicePermissionsPrompt::HidDevicesCallback callback_; mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_; };
diff --git a/extensions/browser/api/hid/hid_device_manager.cc b/extensions/browser/api/hid/hid_device_manager.cc index 55e3f1f..98a13d3 100644 --- a/extensions/browser/api/hid/hid_device_manager.cc +++ b/extensions/browser/api/hid/hid_device_manager.cc
@@ -287,12 +287,12 @@ if (!hid_manager_) { // |hid_manager_| is initialized and safe to use whether or not the // connection is successful. - device::mojom::HidManagerRequest request = mojo::MakeRequest(&hid_manager_); DCHECK_CURRENTLY_ON(content::BrowserThread::UI); auto* connector = content::GetSystemConnector(); DCHECK(connector); - connector->BindInterface(device::mojom::kServiceName, std::move(request)); + connector->Connect(device::mojom::kServiceName, + hid_manager_.BindNewPipeAndPassReceiver()); } // Enumerate HID devices and set client. std::vector<device::mojom::HidDeviceInfoPtr> empty_devices; @@ -309,10 +309,10 @@ } void HidDeviceManager::SetFakeHidManagerForTesting( - device::mojom::HidManagerPtr fake_hid_manager) { + mojo::PendingRemote<device::mojom::HidManager> fake_hid_manager) { DCHECK(!hid_manager_); DCHECK(fake_hid_manager); - hid_manager_ = std::move(fake_hid_manager); + hid_manager_.Bind(std::move(fake_hid_manager)); LazyInitialize(); } std::unique_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList(
diff --git a/extensions/browser/api/hid/hid_device_manager.h b/extensions/browser/api/hid/hid_device_manager.h index fe034ee..0057c56 100644 --- a/extensions/browser/api/hid/hid_device_manager.h +++ b/extensions/browser/api/hid/hid_device_manager.h
@@ -19,6 +19,8 @@ #include "extensions/browser/extension_event_histogram_value.h" #include "extensions/common/api/hid.h" #include "mojo/public/cpp/bindings/associated_binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/hid.mojom.h" namespace device { @@ -79,7 +81,7 @@ virtual void LazyInitialize(); void SetFakeHidManagerForTesting( - device::mojom::HidManagerPtr fake_hid_manager); + mojo::PendingRemote<device::mojom::HidManager> fake_hid_manager); private: friend class BrowserContextKeyedAPIFactory<HidDeviceManager>; @@ -122,7 +124,7 @@ content::BrowserContext* browser_context_ = nullptr; EventRouter* event_router_ = nullptr; bool initialized_ = false; - device::mojom::HidManagerPtr hid_manager_; + mojo::Remote<device::mojom::HidManager> hid_manager_; mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_; bool enumeration_ready_ = false; std::vector<std::unique_ptr<GetApiDevicesParams>> pending_enumerations_;
diff --git a/extensions/renderer/render_frame_observer_natives.cc b/extensions/renderer/render_frame_observer_natives.cc index 8b115715..289d968 100644 --- a/extensions/renderer/render_frame_observer_natives.cc +++ b/extensions/renderer/render_frame_observer_natives.cc
@@ -34,7 +34,7 @@ delete this; } - void DidFailProvisionalLoad(const blink::WebURLError& error) override { + void DidFailProvisionalLoad() override { // Use PostTask to avoid running user scripts while handling this // DidFailProvisionalLoad notification. base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/extensions/renderer/script_injection_manager.cc b/extensions/renderer/script_injection_manager.cc index b8d95e4..9f3eeb0 100644 --- a/extensions/renderer/script_injection_manager.cc +++ b/extensions/renderer/script_injection_manager.cc
@@ -75,7 +75,7 @@ bool OnMessageReceived(const IPC::Message& message) override; void DidCreateNewDocument() override; void DidCreateDocumentElement() override; - void DidFailProvisionalLoad(const blink::WebURLError& error) override; + void DidFailProvisionalLoad() override; void DidFinishDocumentLoad() override; void FrameDetached() override; void OnDestruct() override; @@ -146,8 +146,7 @@ weak_factory_.GetWeakPtr(), UserScript::DOCUMENT_START)); } -void ScriptInjectionManager::RFOHelper::DidFailProvisionalLoad( - const blink::WebURLError& error) { +void ScriptInjectionManager::RFOHelper::DidFailProvisionalLoad() { auto it = manager_->frame_statuses_.find(render_frame()); if (it != manager_->frame_statuses_.end() && it->second == UserScript::DOCUMENT_START) { @@ -210,7 +209,7 @@ // If the navigation request fails (e.g. 204/205/downloads), notify the // extension to avoid keeping the frame in a START state indefinitely which // leads to deadlocks. - DidFailProvisionalLoad(blink::WebURLError(net::ERR_FAILED, blink::WebURL())); + DidFailProvisionalLoad(); } void ScriptInjectionManager::RFOHelper::OnExecuteCode(
diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc index 56c61fbc..5842034 100644 --- a/gpu/config/gpu_info.cc +++ b/gpu/config/gpu_info.cc
@@ -5,6 +5,7 @@ #include <stdint.h> #include "gpu/config/gpu_info.h" +#include "gpu/config/gpu_util.h" namespace { @@ -102,9 +103,10 @@ enumerator->BeginDx12VulkanVersionInfo(); enumerator->AddBool("supportsDx12", info.supports_dx12); enumerator->AddBool("supportsVulkan", info.supports_vulkan); - enumerator->AddInt("dx12FeatureLevel", - static_cast<int>(info.d3d12_feature_level)); - enumerator->AddInt("vulkanVersion", static_cast<int>(info.vulkan_version)); + enumerator->AddString("dx12FeatureLevel", + gpu::D3DFeatureLevelToString(info.d3d12_feature_level)); + enumerator->AddString("vulkanVersion", + gpu::VulkanVersionToString(info.vulkan_version)); enumerator->EndDx12VulkanVersionInfo(); } #endif
diff --git a/gpu/config/gpu_util.cc b/gpu/config/gpu_util.cc index 8b0e103..1131ecb 100644 --- a/gpu/config/gpu_util.cc +++ b/gpu/config/gpu_util.cc
@@ -755,4 +755,27 @@ return ""; } +#if defined(OS_WIN) +std::string D3DFeatureLevelToString(uint32_t d3d_feature_level) { + if (d3d_feature_level == 0) { + return "Not supported"; + } else { + return base::StringPrintf("D3D %d.%d", (d3d_feature_level >> 12) & 0xF, + (d3d_feature_level >> 8) & 0xF); + } +} + +std::string VulkanVersionToString(uint32_t vulkan_version) { + if (vulkan_version == 0) { + return "Not supported"; + } else { + // Vulkan version number VK_MAKE_VERSION(major, minor, patch) + // (((major) << 22) | ((minor) << 12) | (patch)) + return base::StringPrintf( + "Vulkan API %d.%d.%d", (vulkan_version >> 22) & 0x3FF, + (vulkan_version >> 12) & 0x3FF, vulkan_version & 0xFFF); + } +} +#endif // OS_WIN + } // namespace gpu
diff --git a/gpu/config/gpu_util.h b/gpu/config/gpu_util.h index ebb8299..d1cfed5 100644 --- a/gpu/config/gpu_util.h +++ b/gpu/config/gpu_util.h
@@ -80,6 +80,11 @@ GPU_EXPORT std::string GetIntelGpuGeneration(uint32_t vendor_id, uint32_t device_id); +#if defined(OS_WIN) +GPU_EXPORT std::string D3DFeatureLevelToString(uint32_t d3d_feature_level); +GPU_EXPORT std::string VulkanVersionToString(uint32_t vulkan_version); +#endif // OS_WIN + } // namespace gpu #endif // GPU_CONFIG_GPU_UTIL_H_
diff --git a/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect-expected.txt b/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect-expected.txt new file mode 100644 index 0000000..3bbf5f7 --- /dev/null +++ b/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect-expected.txt
@@ -0,0 +1,3 @@ +Tests that virtual time isn't stalled by aborted client-side redirect. +Aborting request to http://test.com/redirect +page says: DONE \ No newline at end of file
diff --git a/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect.js b/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect.js new file mode 100644 index 0000000..0df0ab8 --- /dev/null +++ b/headless/test/data/protocol/emulation/virtual-time-cancel-client-redirect.js
@@ -0,0 +1,61 @@ +// 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. + +const html = ` + <script> + setTimeout(() => console.log('DONE'), 1000); + location.href = '/redirect'; + </script>`; + +(async function(testRunner) { + var {page, session, dp} = await testRunner.startWithFrameControl( + `Tests that virtual time isn't stalled by aborted client-side redirect.`); + + await dp.Runtime.enable(); + await dp.Fetch.enable(); + + dp.Fetch.onRequestPaused(event => { + const url = event.params.request.url; + if (/index.html$/.test(url)) { + dp.Fetch.fulfillRequest({ + requestId: event.params.requestId, + responseCode: 200, + responseHeaders: [], + body: btoa(html) + }); + return; + } + testRunner.log(`Aborting request to ${url}`); + dp.Fetch.failRequest({ + requestId: event.params.requestId, + errorReason: 'Aborted' + }); + }); + + const virtualTimeChunkSize = 100; + const virtualTimeTicksBase = + (await dp.Emulation.setVirtualTimePolicy({policy: 'pause'})) + .result.virtualTimeTicksBase; + dp.Emulation.setVirtualTimePolicy({ + policy: 'pauseIfNetworkFetchesPending', + budget: virtualTimeChunkSize, + waitForNavigation: true}); + + let frameTimeTicks = 0; + dp.Emulation.onVirtualTimeBudgetExpired(async e => { + frameTimeTicks += virtualTimeChunkSize; + await dp.HeadlessExperimental.beginFrame({ + frameTimeTicks: virtualTimeTicksBase + frameTimeTicks, + interval: virtualTimeChunkSize, + noDisplayUpdates: false}); + await dp.Emulation.setVirtualTimePolicy({ + policy: 'pauseIfNetworkFetchesPending', budget: virtualTimeChunkSize}); + }); + + dp.Page.navigate({url: 'http://test.com/index.html'}); + + const params = (await dp.Runtime.onceConsoleAPICalled()).params; + testRunner.log(`page says: ${params.args[0].value}`); + testRunner.completeTest(); +})
diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc index 034d57aa..a91b9da7 100644 --- a/headless/test/headless_protocol_browsertest.cc +++ b/headless/test/headless_protocol_browsertest.cc
@@ -332,6 +332,9 @@ #endif HEADLESS_PROTOCOL_COMPOSITOR_TEST(MAYBE_CompositorCssAnimation, "emulation/compositor-css-animation-test.js") +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + VirtualTimeCancelClientRedirect, + "emulation/virtual-time-cancel-client-redirect.js") HEADLESS_PROTOCOL_COMPOSITOR_TEST(VirtualTimeControllerTest, "helpers/virtual-time-controller-test.js") HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererHelloWorld,
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 62cc129..4747f36 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -964,6 +964,9 @@ - (void)stopChromeMain { // The UI should be stopped before the models they observe are stopped. + [self.signinInteractionCoordinator cancel]; + self.signinInteractionCoordinator = nil; + [_mainCoordinator stop]; _mainCoordinator = nil;
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb index 8dd46501..1c5b94a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -17,7 +17,7 @@ <translation id="3148688391461398285">С геоданными в браузере Chrome будет ещё больше функций.</translation> <translation id="3167189358072330585">Ваш аккаунт не поддерживается в Google Chrome. Обратитесь к администратору домена или войдите с помощью обычного аккаунта Google.</translation> <translation id="3196546062792660320">Чтобы сэкономить ваше время, Chrome будет использовать аккаунты, сохраненные на вашем устройстве. Добавить или удалить их можно в настройках.</translation> -<translation id="3282568296779691940">Войдите в Chrome</translation> +<translation id="3282568296779691940">Войти в Chrome</translation> <translation id="3345341804167540816">Возьмите Chrome с собой</translation> <translation id="384394811301901750">Google Chrome не может получить доступ к камере.</translation> <translation id="3980220367029651214">Вы переключаетесь с синхронизируемого аккаунта <ph name="USER_EMAIL1" /> на <ph name="USER_EMAIL2" />. Сейчас данными Chrome управляет администратор домена <ph name="DOMAIN" />. После переключения они будут удалены с устройства, но данные аккаунта <ph name="USER_EMAIL1" /> сохранятся.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 2b2ea3cd..d2d5a462 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">পাসওয়ার্ড লুকান</translation> <translation id="145015347812617860"><ph name="COUNT" />টি আইটেম</translation> <translation id="1491277525950327607">সেটিং টগল করতে দুবার আলতো চাপুন</translation> +<translation id="1509486075633541495">ওয়েবসাইটে সাইন-ইন করুন</translation> <translation id="152234381334907219">কখনও সংরক্ষিত হয়নি</translation> <translation id="1540800554400757039">ঠিকানা ১</translation> <translation id="1545749641540134597">QR কোড স্ক্যান করুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 2e6a9ce..2ed88cc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">પાસવર્ડ છુપાવો</translation> <translation id="145015347812617860"><ph name="COUNT" /> આઇટમ્સ</translation> <translation id="1491277525950327607">સેટિંગ ટૉગલ કરવા માટે બે વાર ટૅપ કરો</translation> +<translation id="1509486075633541495">વેબસાઇટમાં સાઇન ઇન કરો</translation> <translation id="152234381334907219">ક્યારેય ન સચવાયેલું</translation> <translation id="1540800554400757039">સરનામું 1</translation> <translation id="1545749641540134597">QR કોડ સ્કેન કરો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 73dfd17..bd8fc9a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Sembunyikan Sandi</translation> <translation id="145015347812617860"><ph name="COUNT" /> item</translation> <translation id="1491277525950327607">Ketuk dua kali untuk beralih setelan</translation> +<translation id="1509486075633541495">Login ke situs</translation> <translation id="152234381334907219">Jangan Pernah Disimpan</translation> <translation id="1540800554400757039">Alamat 1</translation> <translation id="1545749641540134597">Pindai Kode QR</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 15826a8a..420a7a9a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">പാസ്വേഡ് അദൃശ്യമാക്കുക</translation> <translation id="145015347812617860"><ph name="COUNT" /> ഇനങ്ങൾ</translation> <translation id="1491277525950327607">ക്രമീകരണം മാറ്റാൻ ഡബിൾ ടാപ്പ് ചെയ്യുക</translation> +<translation id="1509486075633541495">വെബ്സൈറ്റിലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="152234381334907219">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation> <translation id="1540800554400757039">വിലാസം 1</translation> <translation id="1545749641540134597">QR കോഡ് സ്കാൻ ചെയ്യുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 6be93cf..e0a079d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Skjul passordet</translation> <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation> <translation id="1491277525950327607">Dobbelttrykk for å slå innstillingen av/på</translation> +<translation id="1509486075633541495">Logg på nettstedet</translation> <translation id="152234381334907219">Aldri lagret</translation> <translation id="1540800554400757039">Adresse 1</translation> <translation id="1545749641540134597">Skann en QR-kode</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index ee6681a4..a72e172f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Dölj lösenord</translation> <translation id="145015347812617860"><ph name="COUNT" /> objekt</translation> <translation id="1491277525950327607">Aktivera eller inaktivera inställningen genom att trycka snabbt två gånger</translation> +<translation id="1509486075633541495">Logga in på webbplats</translation> <translation id="152234381334907219">Aldrig sparat</translation> <translation id="1540800554400757039">Adressrad 1</translation> <translation id="1545749641540134597">Skanna QR-kod</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 5d41c68..1a1f46e6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Ficha Nenosiri</translation> <translation id="145015347812617860">Vipengee <ph name="COUNT" /></translation> <translation id="1491277525950327607">Gusa mara mbili ili ugeuze mipangilio</translation> +<translation id="1509486075633541495">Ingia katika akaunti ya tovuti</translation> <translation id="152234381334907219">Hayatahifadhiwa Kamwe</translation> <translation id="1540800554400757039">Anwani ya 1</translation> <translation id="1545749641540134597">Changanua Msimbo wa QR</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 6c2fb50..b504e6dc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Şifreyi Gizle</translation> <translation id="145015347812617860"><ph name="COUNT" /> öğe</translation> <translation id="1491277525950327607">Ayarı açıp kapatmak için iki kez dokunun</translation> +<translation id="1509486075633541495">Web sitesinde oturum açın</translation> <translation id="152234381334907219">Hiç Kaydedilmeyenler</translation> <translation id="1540800554400757039">Adres 1</translation> <translation id="1545749641540134597">QR Kodunu Tara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index ef86e15b..6d29da9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">Ẩn mật khẩu</translation> <translation id="145015347812617860"><ph name="COUNT" /> mục</translation> <translation id="1491277525950327607">Nhấn đúp để chuyển đổi cài đặt</translation> +<translation id="1509486075633541495">Đăng nhập vào trang web</translation> <translation id="152234381334907219">Không bao giờ lưu</translation> <translation id="1540800554400757039">Địa chỉ 1</translation> <translation id="1545749641540134597">Quét mã QR</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index 64bc17d..532ac7c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">隐藏密码</translation> <translation id="145015347812617860">有<ph name="COUNT" />个书签</translation> <translation id="1491277525950327607">点按两次即可切换设置</translation> +<translation id="1509486075633541495">登录网站</translation> <translation id="152234381334907219">一律不保存</translation> <translation id="1540800554400757039">地址第1行</translation> <translation id="1545749641540134597">扫描 QR 码</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 8b4c7b4..07fc3d56 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -44,6 +44,7 @@ <translation id="1449835205994625556">隱藏密碼</translation> <translation id="145015347812617860"><ph name="COUNT" /> 個項目</translation> <translation id="1491277525950327607">輕觸兩下即可切換設定</translation> +<translation id="1509486075633541495">登入網站</translation> <translation id="152234381334907219">永不儲存</translation> <translation id="1540800554400757039">地址 1</translation> <translation id="1545749641540134597">掃描 QR 圖碼</translation>
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h index 4238aba6..e804845a 100644 --- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h +++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
@@ -34,6 +34,9 @@ // Updates Infobar badge for the case where Infobar of |infobar_type| was // accepted. void UpdateBadgeForInfobarAccepted(InfobarType infobar_type); + // Updates Infobar badge for the case where an Infobar banner of + // |infobar_type| was dismissed. + void UpdateBadgeForInfobarBannerDismissed(InfobarType infobar_type); // Returns all BadgeItems for the TabHelper Webstate. std::vector<id<BadgeItem>> GetInfobarBadgeItems();
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm index 866b286..76470ac 100644 --- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm +++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
@@ -40,6 +40,9 @@ infobar_badge_models_[infobar_type] = badgeModel; } +void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed( + InfobarType infobar_type) {} + std::vector<id<BadgeItem>> InfobarBadgeTabHelper::GetInfobarBadgeItems() { // Return all infobar badge items. std::vector<id<BadgeItem>> infobar_badges_items;
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm b/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm index cbe8baf..a0cfb09 100644 --- a/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm +++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm
@@ -63,6 +63,11 @@ @end @implementation InfobarBadgeUITestDelegate +- (void)infobarBannerWasDismissed:(InfobarType)infobarType + forWebState:(web::WebState*)webState { + // TODO(crbug.com/977340): Test this method. + self.infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed(infobarType); +} - (void)infobarWasAccepted:(InfobarType)infobarType forWebState:(web::WebState*)webState { self.infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted(infobarType);
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn index 2b1978f..06bdb05c 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -215,6 +215,7 @@ "//ios/chrome/browser/passwords", "//ios/chrome/browser/ui/settings", "//ios/chrome/browser/ui/settings/autofill", + "//ios/chrome/browser/ui/settings/autofill:feature_flags", "//ios/chrome/browser/ui/settings/password", "//ios/chrome/browser/ui/util", "//ios/chrome/test:eg_test_support",
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.h b/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.h index 6004705..f7e8349 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.h +++ b/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.h
@@ -21,6 +21,7 @@ namespace manual_fill { extern NSString* const ManageCardsAccessibilityIdentifier; +extern NSString* const kAddCreditCardsAccessibilityIdentifier; } // namespace manual_fill // Object in charge of getting the cards relevant for the manual fill
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.mm index f4a1666..8565279 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/card_mediator.mm
@@ -40,6 +40,8 @@ NSString* const ManageCardsAccessibilityIdentifier = @"kManualFillManageCardsAccessibilityIdentifier"; +NSString* const kAddCreditCardsAccessibilityIdentifier = + @"kAddCreditCardsAccessibilityIdentifier"; } // namespace manual_fill @@ -144,6 +146,8 @@ "ManualFallback_CreditCard_OpenAddCreditCard")); [weakSelf.dispatcher showAddCreditCard]; }]; + addCreditCardsItem.accessibilityIdentifier = + manual_fill::kAddCreditCardsAccessibilityIdentifier; [self.consumer presentActions:@[ addCreditCardsItem, manageCreditCardsItem ]]; } else {
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm index 4e9f13d..9c1b45b2 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
@@ -9,6 +9,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" +#include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/personal_data_manager.h" @@ -20,6 +21,7 @@ #import "ios/chrome/browser/ui/autofill/manual_fill/card_view_controller.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.h" +#import "ios/chrome/browser/ui/settings/autofill/features.h" #import "ios/chrome/browser/ui/util/ui_util.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" @@ -89,6 +91,13 @@ return grey_accessibilityID(manual_fill::ManageCardsAccessibilityIdentifier); } +// Returns a matcher for the button to add credit cards settings in manual +// fallback. +id<GREYMatcher> AddCreditCardsMatcher() { + return grey_accessibilityID( + manual_fill::kAddCreditCardsAccessibilityIdentifier); +} + // Returns a matcher for the credit card settings collection view. id<GREYMatcher> CreditCardSettingsMatcher() { return grey_accessibilityID(kAutofillCreditCardTableViewId); @@ -243,7 +252,7 @@ assertWithMatcher:grey_interactable()]; } -// Tests that the "Manage Credt Cards..." action works. +// Tests that the "Manage Credit Cards..." action works. - (void)testManageCreditCardsActionOpensCreditCardSettings { [self saveLocalCreditCard]; @@ -268,6 +277,33 @@ assertWithMatcher:grey_sufficientlyVisible()]; } +// Tests that the "Add Credit Cards..." action works. +- (void)testAddCreditCardsActionOpensAddCreditCardSettings { + base::test::ScopedFeatureList featureList; + featureList.InitAndEnableFeature(kSettingsAddPaymentMethod); + [self saveLocalCreditCard]; + + // Bring up the keyboard. + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElement(kFormElementUsername)]; + + // Tap on the credit card icon. + [[EarlGrey selectElementWithMatcher:CreditCardIconMatcher()] + performAction:grey_tap()]; + + // Try to scroll. + [[EarlGrey selectElementWithMatcher:CreditCardTableViewMatcher()] + performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)]; + + // Tap the "Add Credit Cards..." action. + [[EarlGrey selectElementWithMatcher:AddCreditCardsMatcher()] + performAction:grey_tap()]; + + // Verify the credit cards settings opened. + [[EarlGrey selectElementWithMatcher:chrome_test_util::AddCreditCardView()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + // Tests that the credit card View Controller is dismissed when tapping the // keyboard icon. - (void)testKeyboardIconDismissCreditCardController {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm index 9933aaf..83d0ae6 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -239,6 +239,8 @@ self.infobarBannerState = InfobarBannerPresentationState::NotPresented; [self configureAccessibilityForBannerInViewController:self.baseViewController presenting:NO]; + [self.badgeDelegate infobarBannerWasDismissed:self.infobarType + forWebState:self.webState]; self.bannerTransitionDriver = nil; animatedFullscreenDisabler_ = nullptr; [self infobarWasDismissed];
diff --git a/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h b/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h index 556a2d1..69a8f7a 100644 --- a/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h +++ b/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h
@@ -22,6 +22,11 @@ - (void)infobarWasAccepted:(InfobarType)infobarType forWebState:(web::WebState*)webState; +// Called whenever an InfobarBanner of type |infobarType| in |webState| was +// dismissed. |webState| cannot be nil. +- (void)infobarBannerWasDismissed:(InfobarType)infobarType + forWebState:(web::WebState*)webState; + @end #endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_BADGE_UI_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm index 44c843a5..cc8c13a4a 100644 --- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
@@ -324,8 +324,10 @@ } // Tests that the InfobarBanner is dismissed when changing Webstates. +// TODO(crbug.com/1004514): This test fails due to +// infobarBannerWasDismissed:forWebState:. TEST_F(InfobarContainerCoordinatorTest, - TestInfobarBannerDismissAtWebStateChange) { + DISABLED_TestInfobarBannerDismissAtWebStateChange) { AddInfobar(); AddSecondWebstate(); @@ -424,8 +426,10 @@ // Tests that the Infobar is dismissed by closing the Webstate before its // presentation is completed. +// TODO(crbug.com/1004514): This test fails due to +// infobarBannerWasDismissed:forWebState:. TEST_F(InfobarContainerCoordinatorTest, - TestInfobarBannerDismissedClosingWebstate) { + DISABLED_TestInfobarBannerDismissedClosingWebstate) { AddInfobar(); // Close the Webstate without calling WaitUntilConditionOrTimeout. web_state_list_->CloseWebStateAt(0, 0); @@ -439,7 +443,10 @@ } // Tests that the Infobar is dismissed when both the VC and Webstate are closed. -TEST_F(InfobarContainerCoordinatorTest, TestDismissingAndClosingWebstate) { +// TODO(crbug.com/1004514): This test fails due to +// infobarBannerWasDismissed:forWebState:. +TEST_F(InfobarContainerCoordinatorTest, + DISABLED_TestDismissingAndClosingWebstate) { AddInfobar(); ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( base::test::ios::kWaitForUIElementTimeout, ^bool { @@ -463,8 +470,10 @@ // Tests that the Infobar is dismissed when both the VC and Webstate are closed, // and there's more than one webstate. +// TODO(crbug.com/1004514): This test fails due to +// infobarBannerWasDismissed:forWebState:. TEST_F(InfobarContainerCoordinatorTest, - TestDismissingAndClosingWebstateSecondWebstate) { + DISABLED_TestDismissingAndClosingWebstateSecondWebstate) { AddInfobar(); AddSecondWebstate(); EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm b/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm index 37c27ab..9b1408b 100644 --- a/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm +++ b/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm
@@ -99,14 +99,23 @@ - (void)infobarWasAccepted:(InfobarType)infobarType forWebState:(web::WebState*)webState { - if (IsInfobarUIRebootEnabled()) { DCHECK(webState); DCHECK_EQ(webState, self.webStateList->GetActiveWebState()); InfobarBadgeTabHelper* infobarBadgeTabHelper = InfobarBadgeTabHelper::FromWebState(webState); DCHECK(infobarBadgeTabHelper); infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted(infobarType); - } +} + +- (void)infobarBannerWasDismissed:(InfobarType)infobarType + forWebState:(web::WebState*)webState { + DCHECK(webState); + // If the banner is dismissed because of a change in WebState, |webState| will + // not match the AcitveWebStaate, so don't DCHECK. + InfobarBadgeTabHelper* infobarBadgeTabHelper = + InfobarBadgeTabHelper::FromWebState(webState); + DCHECK(infobarBadgeTabHelper); + infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed(infobarType); } #pragma mark - UpgradeCenterClient
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/BUILD.gn index feea2c6..e4e6de1 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/BUILD.gn
@@ -22,6 +22,7 @@ "//ios/chrome/browser/ui/alert_view_controller", "//ios/chrome/browser/ui/elements", "//ios/chrome/browser/ui/overlays:coordinators", + "//ios/chrome/browser/ui/presenters", "//ui/base", ] }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_coordinator.mm index 8319aba..c67146f 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_coordinator.mm
@@ -9,17 +9,21 @@ #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/web_content_area/app_launcher/app_launcher_alert_overlay_mediator.h" +#import "ios/chrome/browser/ui/presenters/contained_presenter_delegate.h" +#import "ios/chrome/browser/ui/presenters/non_modal_view_controller_presenter.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @interface AppLauncherAlertOverlayCoordinator () < - AppLauncherAlertOverlayMediatorDelegate> + AppLauncherAlertOverlayMediatorDelegate, + ContainedPresenterDelegate> // Whether the coordinator has been started. @property(nonatomic, getter=isStarted) BOOL started; @property(nonatomic) AlertViewController* alertViewController; +@property(nonatomic) NonModalViewControllerPresenter* presenter; @property(nonatomic) AppLauncherAlertOverlayMediator* mediator; @end @@ -42,12 +46,28 @@ [self stopAnimated:YES]; } +#pragma mark - ContainedPresenterDelegate + +- (void)containedPresenterDidPresent:(id<ContainedPresenter>)presenter { + self.delegate->OverlayUIDidFinishPresentation(self.request); +} + +- (void)containedPresenterDidDismiss:(id<ContainedPresenter>)presenter { + self.alertViewController = nil; + self.presenter = nil; + self.delegate->OverlayUIDidFinishDismissal(self.request); +} + #pragma mark - OverlayCoordinator + (BOOL)supportsRequest:(OverlayRequest*)request { return !!request->GetConfig<AppLauncherAlertOverlayRequestConfig>(); } ++ (BOOL)usesChildViewController { + return YES; +} + - (UIViewController*)viewController { return self.alertViewController; } @@ -63,31 +83,19 @@ self.mediator = [[AppLauncherAlertOverlayMediator alloc] initWithRequest:self.request]; self.mediator.consumer = self.alertViewController; - __weak __typeof__(self) weakSelf = self; - [self.baseViewController - presentViewController:self.alertViewController - animated:animated - completion:^{ - weakSelf.delegate->OverlayUIDidFinishPresentation( - weakSelf.request); - }]; + self.presenter = [[NonModalViewControllerPresenter alloc] init]; + self.presenter.delegate = self; + self.presenter.baseViewController = self.baseViewController; + self.presenter.presentedViewController = self.alertViewController; + [self.presenter prepareForPresentation]; + [self.presenter presentAnimated:animated]; self.started = YES; } - (void)stopAnimated:(BOOL)animated { if (!self.started) return; - __weak __typeof__(self) weakSelf = self; - [self.baseViewController - dismissViewControllerAnimated:animated - completion:^{ - __typeof__(self) strongSelf = weakSelf; - if (!strongSelf) - return; - strongSelf.alertViewController = nil; - strongSelf.delegate->OverlayUIDidFinishDismissal( - weakSelf.request); - }]; + [self.presenter dismissAnimated:animated]; self.started = NO; }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn index 89b2345..d857701a 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn
@@ -22,6 +22,7 @@ "//ios/chrome/browser/ui/alert_view_controller", "//ios/chrome/browser/ui/elements", "//ios/chrome/browser/ui/overlays:coordinators", + "//ios/chrome/browser/ui/presenters", "//ui/base", ] }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/http_auth_dialog_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/http_auth_dialog_overlay_coordinator.mm index c8be674..a613ba2 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/http_auth_dialog_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/http_auth_dialog_overlay_coordinator.mm
@@ -9,18 +9,22 @@ #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/http_auth_dialog_overlay_mediator.h" +#import "ios/chrome/browser/ui/presenters/contained_presenter_delegate.h" +#import "ios/chrome/browser/ui/presenters/non_modal_view_controller_presenter.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @interface HTTPAuthDialogOverlayCoordinator () < + ContainedPresenterDelegate, HTTPAuthDialogOverlayMediatorDataSource, HTTPAuthDialogOverlayMediatorDelegate> // Whether the coordinator has been started. @property(nonatomic, getter=isStarted) BOOL started; @property(nonatomic) AlertViewController* alertViewController; +@property(nonatomic) NonModalViewControllerPresenter* presenter; @property(nonatomic) HTTPAuthDialogOverlayMediator* mediator; @end @@ -38,6 +42,18 @@ _mediator.delegate = self; } +#pragma mark - ContainedPresenterDelegate + +- (void)containedPresenterDidPresent:(id<ContainedPresenter>)presenter { + self.delegate->OverlayUIDidFinishPresentation(self.request); +} + +- (void)containedPresenterDidDismiss:(id<ContainedPresenter>)presenter { + self.alertViewController = nil; + self.presenter = nil; + self.delegate->OverlayUIDidFinishDismissal(self.request); +} + #pragma mark - HTTPAuthDialogOverlayMediatorDataSource - (NSString*)userForMediator:(HTTPAuthDialogOverlayMediator*)mediator { @@ -65,6 +81,10 @@ return !!request->GetConfig<HTTPAuthOverlayRequestConfig>(); } ++ (BOOL)usesChildViewController { + return YES; +} + - (UIViewController*)viewController { return self.alertViewController; } @@ -80,31 +100,19 @@ self.mediator = [[HTTPAuthDialogOverlayMediator alloc] initWithRequest:self.request]; self.mediator.consumer = self.alertViewController; - __weak __typeof__(self) weakSelf = self; - [self.baseViewController - presentViewController:self.alertViewController - animated:animated - completion:^{ - weakSelf.delegate->OverlayUIDidFinishPresentation( - weakSelf.request); - }]; + self.presenter = [[NonModalViewControllerPresenter alloc] init]; + self.presenter.delegate = self; + self.presenter.baseViewController = self.baseViewController; + self.presenter.presentedViewController = self.alertViewController; + [self.presenter prepareForPresentation]; + [self.presenter presentAnimated:animated]; self.started = YES; } - (void)stopAnimated:(BOOL)animated { if (!self.started) return; - __weak __typeof__(self) weakSelf = self; - [self.baseViewController - dismissViewControllerAnimated:animated - completion:^{ - __typeof__(self) strongSelf = weakSelf; - if (!strongSelf) - return; - strongSelf.alertViewController = nil; - strongSelf.delegate->OverlayUIDidFinishDismissal( - weakSelf.request); - }]; + [self.presenter dismissAnimated:animated]; self.started = NO; }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn index 0cd1acc..83e68054 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn
@@ -9,6 +9,7 @@ "java_script_dialog_overlay_coordinator+subclassing.h", "java_script_dialog_overlay_coordinator.h", "java_script_dialog_overlay_coordinator.mm", + "java_script_dialog_overlay_mediator+subclassing.h", "java_script_dialog_overlay_mediator.h", "java_script_dialog_overlay_mediator.mm", ]
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm index 0ffde9b..7f4a424 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm
@@ -11,6 +11,7 @@ #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -27,10 +28,6 @@ #pragma mark - Accessors -- (const JavaScriptDialogSource*)requestSource { - return &self.config->source(); -} - - (JavaScriptAlertOverlayRequestConfig*)config { return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>(); } @@ -39,7 +36,6 @@ if (self.consumer == consumer) return; [super setConsumer:consumer]; - [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())]; __weak __typeof__(self) weakSelf = self; NSMutableArray* actions = [@[ [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) @@ -54,3 +50,15 @@ } @end + +@implementation JavaScriptAlertOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource&)requestSource { + return self.config->source(); +} + +- (const std::string&)requestMessage { + return self.config->message(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm index 8c243c3..4df196b 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm
@@ -25,8 +25,9 @@ using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest; -// Tests that the consumer values are set correctly for alerts. -TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) { +// Tests that the consumer values are set correctly for alerts from the main +// frame. +TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupMainFrame) { web::TestWebState web_state; const GURL kUrl("https://chromium.test"); const std::string kMessage("Message"); @@ -38,6 +39,26 @@ [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title); + EXPECT_EQ(0U, consumer().textFieldConfigurations.count); + ASSERT_EQ(1U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); +} + +// Tests that the consumer values are set correctly for alerts from an iframe. +TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupIFrame) { + web::TestWebState web_state; + const GURL kUrl("https://chromium.test"); + const std::string kMessage("Message"); + std::unique_ptr<OverlayRequest> request = + OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>( + JavaScriptDialogSource(&web_state, kUrl, /*is_main_frame=*/false), + kMessage); + SetMediator( + [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); + + // Verify the consumer values. EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); EXPECT_EQ(0U, consumer().textFieldConfigurations.count); ASSERT_EQ(1U, consumer().actions.count); @@ -63,7 +84,7 @@ [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); // Verify the consumer values. - EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); + EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title); EXPECT_EQ(0U, consumer().textFieldConfigurations.count); ASSERT_EQ(2U, consumer().actions.count); EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm index 4d48b84..84036be 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm
@@ -12,6 +12,7 @@ #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -29,10 +30,6 @@ #pragma mark - Accessors -- (const JavaScriptDialogSource*)requestSource { - return &self.config->source(); -} - - (JavaScriptConfirmationOverlayRequestConfig*)config { return self.request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>(); } @@ -41,7 +38,6 @@ if (self.consumer == consumer) return; [super setConsumer:consumer]; - [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())]; __weak __typeof__(self) weakSelf = self; NSMutableArray* actions = [@[ [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) @@ -77,3 +73,15 @@ } @end + +@implementation JavaScriptConfirmationOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource&)requestSource { + return self.config->source(); +} + +- (const std::string&)requestMessage { + return self.config->message(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm index 1286eab..3856ab7 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm
@@ -33,11 +33,10 @@ } // Creates a mediator and sets it for testing. - void CreateMediator() { + void CreateMediator(bool is_main_frame = true) { request_ = OverlayRequest::CreateWithConfig< JavaScriptConfirmationOverlayRequestConfig>( - JavaScriptDialogSource(&web_state_, url_, /*is_main_frame=*/true), - message_); + JavaScriptDialogSource(&web_state_, url_, is_main_frame), message_); SetMediator([[JavaScriptConfirmationOverlayMediator alloc] initWithRequest:request_.get()]); } @@ -56,11 +55,27 @@ std::unique_ptr<OverlayRequest> request_; }; -// Tests that the consumer values are set correctly for confirmations. -TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetup) { +// Tests that the consumer values are set correctly for confirmations from the +// main frame. +TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetupMainFrame) { CreateMediator(); // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title); + EXPECT_EQ(0U, consumer().textFieldConfigurations.count); + ASSERT_EQ(2U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); + EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title); +} + +// Tests that the consumer values are set correctly for confirmations from +// iframes. +TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetupIFrame) { + CreateMediator(/*is_main_frame=*/false); + + // Verify the consumer values. EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); EXPECT_EQ(0U, consumer().textFieldConfigurations.count); ASSERT_EQ(2U, consumer().actions.count); @@ -78,7 +93,7 @@ CreateMediator(); // Verify the consumer values. - EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); + EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title); EXPECT_EQ(0U, consumer().textFieldConfigurations.count); ASSERT_EQ(3U, consumer().actions.count); EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm index 05a92ea..371db64 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm
@@ -7,6 +7,7 @@ #include "base/logging.h" #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -19,8 +20,8 @@ // Returns the blocking state for |source|'s WebState, or nullptr if the // WebState was destroyed. JavaScriptDialogBlockingState* GetBlockingState( - const JavaScriptDialogSource* source) { - web::WebState* web_state = source->web_state(); + const JavaScriptDialogSource& source) { + web::WebState* web_state = source.web_state(); if (!web_state) return nullptr; JavaScriptDialogBlockingState::CreateForWebState(web_state); @@ -29,7 +30,7 @@ } // namespace AlertAction* GetBlockingAlertAction(JavaScriptDialogOverlayMediator* mediator) { - const JavaScriptDialogSource* source = mediator.requestSource; + const JavaScriptDialogSource& source = mediator.requestSource; JavaScriptDialogBlockingState* blocking_state = GetBlockingState(source); if (!blocking_state || !blocking_state->show_blocking_option()) return nil;
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h new file mode 100644 index 0000000..56d5c8b6 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h
@@ -0,0 +1,24 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" + +class JavaScriptDialogSource; + +// Category used by JavaScriptDialogOverlayMediator subclasses to provide +// information from their OverlayRequests. +@interface JavaScriptDialogOverlayMediator (Subclassing) + +// Returns the source for the OverlayRequest. +@property(nonatomic, readonly) const JavaScriptDialogSource& requestSource; + +// Returns the message for the OverlayRequest. +@property(nonatomic, readonly) const std::string& requestMessage; + +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h index eeaa3aa..3ea5d1aa 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h
@@ -8,7 +8,6 @@ #import <Foundation/Foundation.h> class OverlayRequest; -class JavaScriptDialogSource; @protocol AlertConsumer; @protocol JavaScriptDialogOverlayMediatorDelegate; @@ -19,9 +18,6 @@ // The request passed on initialization. @property(nonatomic, readonly) OverlayRequest* request; -// Returns the source for the OverlayRequest. -@property(nonatomic, readonly) const JavaScriptDialogSource* requestSource; - // The consumer to be updated by this mediator. Setting to a new value uses the // configuration data in |request| to update the new consumer. @property(nonatomic, weak) id<AlertConsumer> consumer;
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm index 689e09e8..b5612e2 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm
@@ -5,10 +5,12 @@ #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" #include "base/logging.h" +#import "base/strings/sys_string_conversions.h" #include "components/strings/grit/components_strings.h" #include "components/url_formatter/elide_url.h" #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -28,11 +30,6 @@ #pragma mark - Accessors -- (const JavaScriptDialogSource*)requestSource { - NOTREACHED() << "Subclasses must implement."; - return nullptr; -} - - (void)setConsumer:(id<AlertConsumer>)consumer { if (_consumer == consumer) return; @@ -40,18 +37,18 @@ if (!_consumer) return; - const JavaScriptDialogSource* source = self.requestSource; - NSString* consumerTitle = nil; - if (source->is_main_frame()) { - base::string16 title = url_formatter::FormatUrlForSecurityDisplay( - source->url(), url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS); - consumerTitle = - l10n_util::GetNSStringF(IDS_JAVASCRIPT_MESSAGEBOX_TITLE, title); + NSString* requestMessage = base::SysUTF8ToNSString(self.requestMessage); + if (self.requestSource.is_main_frame()) { + // If the requesting page's URL is already displayed in the location bar, + // there is no need to add information about the request source. Instead, + // show the request's message text as the alert's title. + [_consumer setTitle:requestMessage]; } else { - consumerTitle = l10n_util::GetNSString( - IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); + [_consumer + setTitle:l10n_util::GetNSString( + IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME)]; + [_consumer setMessage:requestMessage]; } - [_consumer setTitle:consumerTitle]; } @end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm index ffbb44f8..1447b32a 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm
@@ -11,6 +11,7 @@ #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h" #import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/web/public/test/fakes/test_web_state.h" @@ -26,22 +27,26 @@ : JavaScriptDialogOverlayMediator { web::TestWebState _webState; std::unique_ptr<JavaScriptDialogSource> _source; + std::string _message; } // Initializer for a mediator that has a JavaScriptDialogSource with |sourceURL| -// and |isMainFrame|. +// and |isMainFrame|. |message| is the dialog's message text. - (instancetype)initWithRequest:(OverlayRequest*)request sourceURL:(const GURL&)sourceURL - isMainFrame:(BOOL)isMainFrame; + isMainFrame:(BOOL)isMainFrame + message:(const std::string&)message; @end @implementation FakeJavaScriptDialogOverlayMediator - (instancetype)initWithRequest:(OverlayRequest*)request sourceURL:(const GURL&)sourceURL - isMainFrame:(BOOL)isMainFrame { + isMainFrame:(BOOL)isMainFrame + message:(const std::string&)message { if (self = [super initWithRequest:request]) { _source = std::make_unique<JavaScriptDialogSource>(&_webState, sourceURL, isMainFrame); + _message = message; } return self; } @@ -50,8 +55,12 @@ @implementation FakeJavaScriptDialogOverlayMediator (Subclassing) -- (const JavaScriptDialogSource*)requestSource { - return _source.get(); +- (const JavaScriptDialogSource&)requestSource { + return *_source.get(); +} + +- (const std::string&)requestMessage { + return _message; } @end @@ -59,34 +68,38 @@ // Test fixture for JavaScriptDialogOverlayMediator. using JavaScriptDialogOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest; -// Tests the title for a JavaScript dialog from the main frame. -TEST_F(JavaScriptDialogOverlayMediatorTest, MainFrameTitle) { +// Tests the JavaScript dialog setup from the main frame. +TEST_F(JavaScriptDialogOverlayMediatorTest, MainFrame) { std::unique_ptr<OverlayRequest> request = OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr); const GURL kUrl("https://chromium.org"); + const std::string kMessage("Message"); SetMediator([[FakeJavaScriptDialogOverlayMediator alloc] initWithRequest:request.get() sourceURL:kUrl - isMainFrame:YES]); + isMainFrame:YES + message:kMessage]); - base::string16 title = url_formatter::FormatUrlForSecurityDisplay( - kUrl, url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS); - NSString* expected_title = - l10n_util::GetNSStringF(IDS_JAVASCRIPT_MESSAGEBOX_TITLE, title); - EXPECT_NSEQ(expected_title, consumer().title); + // For the main frame, the URL is already displayed in the location bar, so + // there is no need to add source information. The message is used as the + // consumer's title in this case. + EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title); } -// Tests the title for a JavaScript dialog from the main frame. -TEST_F(JavaScriptDialogOverlayMediatorTest, IFrameTitle) { +// Tests the JavaScript dialog setup from an iframe. +TEST_F(JavaScriptDialogOverlayMediatorTest, IFrameSetup) { std::unique_ptr<OverlayRequest> request = OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr); const GURL kUrl("https://chromium.org"); + const std::string kMessage("Message"); SetMediator([[FakeJavaScriptDialogOverlayMediator alloc] initWithRequest:request.get() sourceURL:kUrl - isMainFrame:NO]); + isMainFrame:NO + message:kMessage]); NSString* expected_title = l10n_util::GetNSString( IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); EXPECT_NSEQ(expected_title, consumer().title); + EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm index b11f9f2..938cf81 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm
@@ -15,6 +15,7 @@ #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -34,10 +35,6 @@ #pragma mark - Accessors -- (const JavaScriptDialogSource*)requestSource { - return &self.config->source(); -} - - (JavaScriptPromptOverlayRequestConfig*)config { return self.request->GetConfig<JavaScriptPromptOverlayRequestConfig>(); } @@ -91,3 +88,15 @@ } @end + +@implementation JavaScriptPromptOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource&)requestSource { + return self.config->source(); +} + +- (const std::string&)requestMessage { + return self.config->message(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm index 95ba44a..dfacf8a0 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm
@@ -88,8 +88,28 @@ FakePromptOverlayMediatorDataSource* data_source_ = nil; }; -// Tests that the consumer values are set correctly for main frame prompts. -TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetup) { +// Tests that the consumer values are set correctly for main frame prompts from +// the main frame. +TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetupMainFrame) { + CreateMediator(); + + // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title); + ASSERT_EQ(1U, consumer().textFieldConfigurations.count); + EXPECT_NSEQ(base::SysUTF8ToNSString(default_prompt_value()), + consumer().textFieldConfigurations[0].text); + EXPECT_FALSE(!!consumer().textFieldConfigurations[0].placeholder); + EXPECT_NSEQ(kJavaScriptPromptTextFieldAccessibiltyIdentifier, + consumer().textFieldConfigurations[0].accessibilityIdentifier); + ASSERT_EQ(2U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); + EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title); +} + +// Tests that the consumer values are set correctly for prompts from iframes. +TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetupIframe) { CreateMediator(); // Verify the consumer values.
diff --git a/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc index 15487a6a..5df75fa 100644 --- a/media/audio/pulse/audio_manager_pulse.cc +++ b/media/audio/pulse/audio_manager_pulse.cc
@@ -104,11 +104,15 @@ AudioParameters AudioManagerPulse::GetInputStreamParameters( const std::string& device_id) { int user_buffer_size = GetUserBufferSize(); - int buffer_size = user_buffer_size ? - user_buffer_size : kDefaultInputBufferSize; + int buffer_size = + user_buffer_size ? user_buffer_size : kDefaultInputBufferSize; - // TODO(xians): add support for querying native channel layout for pulse. UpdateNativeAudioHardwareInfo(); + auto* operation = pa_context_get_source_info_by_name( + input_context_, default_source_name_.c_str(), DefaultSourceInfoCallback, + this); + WaitForOperationCompletion(input_mainloop_, operation); + // We don't want to accidentally open a monitor device, so return invalid // parameters for those. if (device_id == AudioDeviceDescription::kDefaultDeviceId && @@ -260,18 +264,19 @@ pa_operation* operation = pa_context_get_server_info( input_context_, AudioHardwareInfoCallback, this); WaitForOperationCompletion(input_mainloop_, operation); - operation = pa_context_get_source_info_by_name( - input_context_, default_source_name_.c_str(), DefaultSourceInfoCallback, - this); - WaitForOperationCompletion(input_mainloop_, operation); + + // Be careful about adding OS calls to this method. + // GetPreferredOutputStreamParameters() calls this method on a critical path. + // If the OS calls hang they will hang all device authorizations. } void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context, const pa_source_info* info, - int error, void *user_data) { + int eol, + void* user_data) { AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data); - if (error) { + if (eol) { // Signal the pulse object that it is done. pa_threaded_mainloop_signal(manager->input_mainloop_, 0); return; @@ -297,17 +302,17 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context, const pa_sink_info* info, - int error, void *user_data) { + int eol, + void* user_data) { AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data); - if (error) { + if (eol) { // Signal the pulse object that it is done. pa_threaded_mainloop_signal(manager->input_mainloop_, 0); return; } - manager->devices_->push_back(AudioDeviceName(info->description, - info->name)); + manager->devices_->push_back(AudioDeviceName(info->description, info->name)); } void AudioManagerPulse::AudioHardwareInfoCallback(pa_context* context,
diff --git a/media/audio/pulse/audio_manager_pulse.h b/media/audio/pulse/audio_manager_pulse.h index 2e5c424..11df0c6 100644 --- a/media/audio/pulse/audio_manager_pulse.h +++ b/media/audio/pulse/audio_manager_pulse.h
@@ -69,10 +69,12 @@ // Callback to get the devices' info like names, used by GetInputDevices(). static void InputDevicesInfoCallback(pa_context* context, const pa_source_info* info, - int error, void* user_data); + int eol, + void* user_data); static void OutputDevicesInfoCallback(pa_context* context, const pa_sink_info* info, - int error, void* user_data); + int eol, + void* user_data); // Callback to get the native sample rate of PulseAudio, used by // UpdateNativeAudioHardwareInfo().
diff --git a/media/base/audio_discard_helper.cc b/media/base/audio_discard_helper.cc index ecb3e2a1..9534653 100644 --- a/media/base/audio_discard_helper.cc +++ b/media/base/audio_discard_helper.cc
@@ -156,7 +156,13 @@ // For simplicity require the start of the discard to be within the current // buffer. Doing so allows us avoid complexity around tracking discards // across buffers. - CHECK_LT(discard_start, decoded_frames); + if (discard_start >= decoded_frames) { + DLOG(ERROR) + << "Unsupported discard padding and decoder delay mix. Due to " + "decoder delay, discard padding indicates data beyond the current " + "buffer should be discarded. This is not supported."; + return false; + } const size_t frames_to_discard = std::min(start_frames_to_discard, decoded_frames - discard_start);
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 411a9dd..0eb03fde 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -77,11 +77,14 @@ // level, DmaBufs are not mappable from userspace. storage_type != VideoFrame::STORAGE_DMABUFS && #endif + // GpuMemoryBuffer is not mappable at VideoFrame level. In most places + // GpuMemoryBuffer is opaque to the CPU, and for places that really need + // to access the data on CPU they can get the buffer with + // GetGpuMemoryBuffer() and call gfx::GpuMemoryBuffer::Map(). (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY || storage_type == VideoFrame::STORAGE_OWNED_MEMORY || storage_type == VideoFrame::STORAGE_SHMEM || - storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER || - storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFER); + storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER); } // Checks if |source_format| can be wrapped into a |target_format| frame.
diff --git a/media/fuchsia/cdm/fuchsia_cdm.cc b/media/fuchsia/cdm/fuchsia_cdm.cc index 398c803..df3ed2e 100644 --- a/media/fuchsia/cdm/fuchsia_cdm.cc +++ b/media/fuchsia/cdm/fuchsia_cdm.cc
@@ -12,6 +12,13 @@ #include "media/base/cdm_promise.h" #include "media/fuchsia/cdm/fuchsia_decryptor.h" +#define REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm) \ + if (!cdm) { \ + promise->reject(CdmPromise::Exception::INVALID_STATE_ERROR, 0, \ + "CDM channel is disconnected."); \ + return; \ + } + namespace media { namespace { @@ -226,10 +233,12 @@ session_callbacks_(std::move(callbacks)), decryptor_(new FuchsiaDecryptor(cdm_.get())) { DCHECK(cdm_); - cdm_.set_error_handler([](zx_status_t status) { - // Error will be handled in CdmSession::OnSessionError. + cdm_.set_error_handler([this](zx_status_t status) { ZX_LOG(ERROR, status) << "The fuchsia.media.drm.ContentDecryptionModule" << " channel was terminated."; + + // Reject all the pending promises. + promises_.Clear(); }); } @@ -238,6 +247,8 @@ void FuchsiaCdm::SetServerCertificate( const std::vector<uint8_t>& certificate, std::unique_ptr<SimpleCdmPromise> promise) { + REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_); + uint32_t promise_id = promises_.SavePromise(std::move(promise)); cdm_->SetServerCertificate( certificate, @@ -273,6 +284,8 @@ return; } + REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_); + uint32_t promise_id = promises_.SavePromise(std::move(promise)); auto session = std::make_unique<CdmSession>(&session_callbacks_); @@ -344,6 +357,8 @@ return; } + REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_); + // Caller should NOT pass in an empty response. DCHECK(!response.empty());
diff --git a/media/fuchsia/common/sysmem_buffer_writer.cc b/media/fuchsia/common/sysmem_buffer_writer.cc index 82346ec2..addfafb 100644 --- a/media/fuchsia/common/sysmem_buffer_writer.cc +++ b/media/fuchsia/common/sysmem_buffer_writer.cc
@@ -174,8 +174,13 @@ buffer_constraints.min_buffer_count_for_camping = stream_constraints.default_settings().packet_count_for_client(); buffer_constraints.has_buffer_memory_constraints = true; + + const int kDefaultPacketSize = 512 * 1024; buffer_constraints.buffer_memory_constraints.min_size_bytes = - stream_constraints.has_per_packet_buffer_bytes_recommended(); + stream_constraints.has_per_packet_buffer_bytes_recommended() + ? stream_constraints.per_packet_buffer_bytes_recommended() + : kDefaultPacketSize; + buffer_constraints.buffer_memory_constraints.ram_domain_supported = true; buffer_constraints.buffer_memory_constraints.cpu_domain_supported = true;
diff --git a/media/gpu/v4l2/v4l2_vp8_accelerator.cc b/media/gpu/v4l2/v4l2_vp8_accelerator.cc index c9be027..89353376 100644 --- a/media/gpu/v4l2/v4l2_vp8_accelerator.cc +++ b/media/gpu/v4l2/v4l2_vp8_accelerator.cc
@@ -222,7 +222,7 @@ struct v4l2_ext_control ctrl; memset(&ctrl, 0, sizeof(ctrl)); - ctrl.id = V4L2_CTRL_TYPE_VP8_FRAME_HEADER; + ctrl.id = V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER; ctrl.size = sizeof(v4l2_frame_hdr); ctrl.ptr = &v4l2_frame_hdr;
diff --git a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc index 4d5cbe6..4341b83 100644 --- a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc +++ b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
@@ -12,7 +12,6 @@ #include "media/gpu/macros.h" #include "media/gpu/vaapi/vaapi_utils.h" #include "media/gpu/vaapi/vaapi_wrapper.h" -#include "ui/gfx/linux/native_pixmap_dmabuf.h" namespace media { @@ -126,14 +125,8 @@ return nullptr; } - const scoped_refptr<gfx::NativePixmap> pixmap = - CreateNativePixmapDmaBuf(video_frame.get()); - if (!pixmap) { - VLOGF(1) << "Failed to create NativePixmap"; - return nullptr; - } scoped_refptr<VASurface> va_surface = - vaapi_wrapper_->CreateVASurfaceForPixmap(pixmap); + vaapi_wrapper_->CreateVASurfaceForVideoFrame(video_frame.get()); if (!va_surface) { VLOGF(1) << "Failed to create VASurface"; return nullptr;
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc index 434e923..6ab2963 100644 --- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
@@ -27,7 +27,6 @@ #include "media/gpu/macros.h" #include "media/gpu/vaapi/vaapi_jpeg_encoder.h" #include "media/parsers/jpeg_parser.h" -#include "ui/gfx/linux/native_pixmap_dmabuf.h" namespace media { @@ -171,14 +170,8 @@ // We need to explicitly blit the bound input surface here to make sure the // input we sent to VAAPI encoder is in tiled NV12 format since implicit // tiling logic is not contained in every driver. - auto input_pixmap = CreateNativePixmapDmaBuf(input_frame.get()); - if (!input_pixmap) { - VLOGF(1) << "Cannot create native pixmap for input frame"; - notify_error_cb_.Run(task_id, PLATFORM_FAILURE); - return; - } auto input_surface = - vpp_vaapi_wrapper_->CreateVASurfaceForPixmap(input_pixmap); + vpp_vaapi_wrapper_->CreateVASurfaceForVideoFrame(input_frame.get()); if (!input_surface) { VLOGF(1) << "Failed to create input va surface"; notify_error_cb_.Run(task_id, PLATFORM_FAILURE);
diff --git a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc index 0bcacba..6d68e85 100644 --- a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
@@ -43,8 +43,6 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/gpu_memory_buffer.h" -#include "ui/gfx/linux/native_pixmap_dmabuf.h" -#include "ui/gfx/native_pixmap.h" namespace media { @@ -378,14 +376,8 @@ TRACE_EVENT1("jpeg", __func__, "input_buffer_id", input_buffer_id); // Bind a VA surface to |video_frame|. - scoped_refptr<gfx::NativePixmap> pixmap = - CreateNativePixmapDmaBuf(video_frame.get()); - if (!pixmap) { - VLOGF(1) << "Cannot create native pixmap for output buffer"; - return false; - } scoped_refptr<VASurface> output_surface = - vpp_vaapi_wrapper_->CreateVASurfaceForPixmap(pixmap); + vpp_vaapi_wrapper_->CreateVASurfaceForVideoFrame(video_frame.get()); if (!output_surface) { VLOGF(1) << "Cannot create VA surface for output buffer"; return false;
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap.h b/media/gpu/vaapi/vaapi_picture_native_pixmap.h index f506341..7d9c22a 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap.h +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap.h
@@ -18,10 +18,6 @@ class GLImage; } -namespace gfx { -class NativePixmap; -} - namespace media { class VaapiWrapper; @@ -46,9 +42,6 @@ VASurfaceID va_surface_id() const override; protected: - // Ozone buffer, the storage of the EGLImage and the VASurface. - scoped_refptr<gfx::NativePixmap> pixmap_; - // GLImage bound to the GL textures used by the VDA client. scoped_refptr<gl::GLImage> gl_image_;
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc index 76beac9..782f9724 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc
@@ -46,21 +46,19 @@ } } -bool VaapiPictureNativePixmapEgl::Initialize() { +bool VaapiPictureNativePixmapEgl::Initialize( + scoped_refptr<gfx::NativePixmap> pixmap) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(pixmap_); + DCHECK(pixmap); + DCHECK(pixmap->AreDmaBufFdsValid()); // Create a |va_surface_| from dmabuf fds (pixmap->GetDmaBufFd) - va_surface_ = vaapi_wrapper_->CreateVASurfaceForPixmap(pixmap_); + va_surface_ = vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap)); if (!va_surface_) { LOG(ERROR) << "Failed creating VASurface for NativePixmap"; return false; } - // On non-ozone, no need to import dmabuf fds into output the gl texture - // because the dmabuf fds have been made from it. - DCHECK(pixmap_->AreDmaBufFdsValid()); - if (bind_image_cb_ && !bind_image_cb_.Run(client_texture_id_, texture_target_, gl_image_, true /* can_bind_to_sampler */)) { @@ -106,13 +104,13 @@ return false; } - // The |pixmap_| takes ownership of the dmabuf fds. So the only reason - // to keep a reference on the image is because the GPU service needs to - // track this image as it will be attached to a client texture. - pixmap_ = native_pixmap_dmabuf; + // The |va_surface_| created from |native_pixmap_dmabuf| shares the ownership + // of the buffer. So the only reason to keep a reference on the image is + // because the GPU service needs to track this image as it will be attached + // to a client texture. gl_image_ = image; - return Initialize(); + return Initialize(std::move(native_pixmap_dmabuf)); } bool VaapiPictureNativePixmapEgl::ImportGpuMemoryBufferHandle(
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h index f00591ffd..65e204c 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h
@@ -14,6 +14,10 @@ #include "ui/gfx/buffer_types.h" #include "ui/gfx/geometry/size.h" +namespace gfx { +class NativePixmap; +} // namespace gfx + namespace media { class VaapiWrapper; @@ -41,7 +45,7 @@ gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle) override; private: - bool Initialize(); + bool Initialize(scoped_refptr<gfx::NativePixmap> pixmap); DISALLOW_COPY_AND_ASSIGN(VaapiPictureNativePixmapEgl); };
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc index 0c3a6d8f..ed55a68f 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc
@@ -7,7 +7,6 @@ #include "media/gpu/vaapi/va_surface.h" #include "media/gpu/vaapi/vaapi_wrapper.h" #include "ui/gfx/gpu_memory_buffer.h" -#include "ui/gfx/linux/native_pixmap_dmabuf.h" #include "ui/gfx/native_pixmap.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_image_native_pixmap.h" @@ -48,12 +47,13 @@ } } -bool VaapiPictureNativePixmapOzone::Initialize() { +bool VaapiPictureNativePixmapOzone::Initialize( + scoped_refptr<gfx::NativePixmap> pixmap) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(pixmap_); - + DCHECK(pixmap); + DCHECK(pixmap->AreDmaBufFdsValid()); // Create a |va_surface_| from dmabuf fds (pixmap->GetDmaBufFd) - va_surface_ = vaapi_wrapper_->CreateVASurfaceForPixmap(pixmap_); + va_surface_ = vaapi_wrapper_->CreateVASurfaceForPixmap(pixmap); if (!va_surface_) { LOG(ERROR) << "Failed creating VASurface for NativePixmap"; return false; @@ -69,10 +69,10 @@ gl::ScopedTextureBinder texture_binder(texture_target_, texture_id_); - const gfx::BufferFormat format = pixmap_->GetBufferFormat(); + const gfx::BufferFormat format = pixmap->GetBufferFormat(); auto image = base::MakeRefCounted<gl::GLImageNativePixmap>(size_, format); - if (!image->Initialize(pixmap_)) { + if (!image->Initialize(std::move(pixmap))) { LOG(ERROR) << "Failed to create GLImage"; return false; } @@ -97,15 +97,15 @@ ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance(); ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone(); - pixmap_ = factory->CreateNativePixmap(gfx::kNullAcceleratedWidget, - VK_NULL_HANDLE, size_, format, - gfx::BufferUsage::SCANOUT_VDA_WRITE); - if (!pixmap_) { + auto pixmap = factory->CreateNativePixmap( + gfx::kNullAcceleratedWidget, VK_NULL_HANDLE, size_, format, + gfx::BufferUsage::SCANOUT_VDA_WRITE); + if (!pixmap) { LOG(ERROR) << "Failed allocating a pixmap"; return false; } - return Initialize(); + return Initialize(std::move(pixmap)); } bool VaapiPictureNativePixmapOzone::ImportGpuMemoryBufferHandle( @@ -116,16 +116,16 @@ ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance(); ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone(); // CreateNativePixmapFromHandle() will take ownership of the handle. - pixmap_ = factory->CreateNativePixmapFromHandle( + auto pixmap = factory->CreateNativePixmapFromHandle( gfx::kNullAcceleratedWidget, size_, format, std::move(gpu_memory_buffer_handle.native_pixmap_handle)); - if (!pixmap_) { + if (!pixmap) { LOG(ERROR) << "Failed creating a pixmap from a native handle"; return false; } - return Initialize(); + return Initialize(std::move(pixmap)); } } // namespace media
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h index c7edbd5..e2dab58 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h
@@ -14,6 +14,10 @@ #include "ui/gfx/buffer_types.h" #include "ui/gfx/geometry/size.h" +namespace gfx { +class NativePixmap; +} // namespace gfx + namespace media { class VaapiWrapper; @@ -40,7 +44,7 @@ gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle) override; private: - bool Initialize(); + bool Initialize(scoped_refptr<gfx::NativePixmap> pixmap); DISALLOW_COPY_AND_ASSIGN(VaapiPictureNativePixmapOzone); };
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index 54cb5a7..1f6979d 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -16,15 +16,12 @@ #include "media/base/video_util.h" #include "media/gpu/gpu_video_decode_accelerator_helpers.h" #include "media/gpu/linux/dmabuf_video_frame_pool.h" -#include "media/gpu/linux/platform_video_frame_utils.h" #include "media/gpu/macros.h" #include "media/gpu/vaapi/va_surface.h" #include "media/gpu/vaapi/vaapi_h264_accelerator.h" #include "media/gpu/vaapi/vaapi_vp8_accelerator.h" #include "media/gpu/vaapi/vaapi_vp9_accelerator.h" #include "media/gpu/vaapi/vaapi_wrapper.h" -#include "ui/gfx/linux/native_pixmap_dmabuf.h" -#include "ui/gfx/native_pixmap.h" namespace media { @@ -409,20 +406,11 @@ frame->set_timestamp(current_decode_task_->buffer_->timestamp()); - // Create a native pixmap from the video frame. - scoped_refptr<gfx::NativePixmap> native_pixmap = - CreateNativePixmapDmaBuf(frame.get()); - if (!native_pixmap) { - VLOGF(1) << "Failed to create NativePixmap from VideoFrame"; - SetState(State::kError); - return nullptr; - } - // Create VASurface from the native pixmap. scoped_refptr<VASurface> va_surface = - vaapi_wrapper_->CreateVASurfaceForPixmap(native_pixmap); + vaapi_wrapper_->CreateVASurfaceForVideoFrame(frame.get()); if (!va_surface || va_surface->id() == VA_INVALID_ID) { - VLOGF(1) << "Failed to create VASurface from NativePixmap"; + VLOGF(1) << "Failed to create VASurface from VideoFrame"; SetState(State::kError); return nullptr; }
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index dec7d93..e134cc24 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -41,6 +41,7 @@ // Auto-generated for dlopen libva libraries #include "media/gpu/vaapi/va_stubs.h" +#include "media/gpu/linux/platform_video_frame_utils.h" #include "media/gpu/vaapi/vaapi_picture.h" #include "media/gpu/vaapi/vaapi_utils.h" #include "third_party/libyuv/include/libyuv.h" @@ -1388,8 +1389,19 @@ return va_res == VA_STATUS_SUCCESS; } +scoped_refptr<VASurface> VaapiWrapper::CreateVASurfaceForVideoFrame( + const VideoFrame* frame) { + DCHECK(frame); + scoped_refptr<gfx::NativePixmap> pixmap = CreateNativePixmapDmaBuf(frame); + if (!pixmap) { + LOG(ERROR) << "Failed to create NativePixmap from VideoFrame"; + return nullptr; + } + return CreateVASurfaceForPixmap(std::move(pixmap)); +} + scoped_refptr<VASurface> VaapiWrapper::CreateVASurfaceForPixmap( - const scoped_refptr<gfx::NativePixmap>& pixmap) { + scoped_refptr<gfx::NativePixmap> pixmap) { const gfx::BufferFormat buffer_format = pixmap->GetBufferFormat(); // Create a VASurface for a NativePixmap by importing the underlying dmabufs. @@ -1445,6 +1457,8 @@ VA_SUCCESS_OR_RETURN(va_res, "Failed to create unowned VASurface", nullptr); } + // VASurface shares an ownership of the buffer referred by the passed file + // descriptor. We can release |pixmap| here. return new VASurface(va_surface_id, size, va_format, base::BindOnce(&VaapiWrapper::DestroySurface, this)); }
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h index 44ff1505..6c00f57 100644 --- a/media/gpu/vaapi/vaapi_wrapper.h +++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -230,10 +230,20 @@ const gfx::Size& size, const base::Optional<gfx::Size>& visible_size = base::nullopt); - // Creates a self-releasing VASurface from |pixmap|. The ownership of the - // surface is transferred to the caller. + // Creates a self-releasing VASurface from |frame|. The created VASurface + // doesn't have the ownership of |frame|, while it shares the ownership of the + // underlying buffer represented by |frame|. In other words, the buffer is + // alive at least until both |frame| and the created VASurface are destroyed. + scoped_refptr<VASurface> CreateVASurfaceForVideoFrame( + const VideoFrame* frame); + + // Creates a self-releasing VASurface from |pixmap|. The created VASurface + // shares the ownership of the underlying buffer represented by |pixmap|. The + // ownership of the surface is transferred to the caller. A caller can destroy + // |pixmap| after this method returns and the underlying buffer will be kept + // alive by the VASurface. scoped_refptr<VASurface> CreateVASurfaceForPixmap( - const scoped_refptr<gfx::NativePixmap>& pixmap); + scoped_refptr<gfx::NativePixmap> pixmap); // Syncs and exports |va_surface| as a gfx::NativePixmapDmaBuf. Currently, the // only VAAPI surface pixel formats supported are VA_FOURCC_IMC3 and
diff --git a/media/gpu/vaapi/vp8_encoder.cc b/media/gpu/vaapi/vp8_encoder.cc index c2b4f03..d72d152f 100644 --- a/media/gpu/vaapi/vp8_encoder.cc +++ b/media/gpu/vaapi/vp8_encoder.cc
@@ -18,8 +18,9 @@ // Based on WebRTC's defaults. constexpr int kMinQP = 4; -// b/110059922: Tuned 112->113 for bitrate issue in a lower resolution (180p). -constexpr int kMaxQP = 113; +// b/110059922, crbug.com/1001900: Tuned 112->117 for bitrate issue in a lower +// resolution (180p). +constexpr int kMaxQP = 117; constexpr int kDefaultQP = (3 * kMinQP + kMaxQP) / 4; } // namespace @@ -153,10 +154,11 @@ DCHECK(!visible_size_.IsEmpty()); current_frame_hdr_.width = visible_size_.width(); current_frame_hdr_.height = visible_size_.height(); - // Since initial_qp is always kDefaultQP (=31), y_ac_qi should be 27 + // Since initial_qp is always kDefaultQP (=32), y_ac_qi should be 28 // (the table index for kDefaultQP, see rfc 14.1. table ac_qlookup) + static_assert(kDefaultQP == 32, "kDefault QP is not 32"); DCHECK_EQ(current_params_.initial_qp, kDefaultQP); - constexpr uint8_t kDefaultQPACQIndex = 27; + constexpr uint8_t kDefaultQPACQIndex = 28; current_frame_hdr_.quantization_hdr.y_ac_qi = kDefaultQPACQIndex; current_frame_hdr_.show_frame = true; // TODO(sprang): Make this dynamic. Value based on reference implementation
diff --git a/media/mojo/mojom/audio_output_stream.mojom b/media/mojo/mojom/audio_output_stream.mojom index 24f3934..07d33d6 100644 --- a/media/mojo/mojom/audio_output_stream.mojom +++ b/media/mojo/mojom/audio_output_stream.mojom
@@ -85,5 +85,6 @@ // to transfer the audio data. // TODO(https://crbug.com/787806): Currently, this will be called at most // once. In the future, it may be called several times. - Created(AudioOutputStream stream, ReadWriteAudioDataPipe data_pipe); + Created(pending_remote<AudioOutputStream> stream, + ReadWriteAudioDataPipe data_pipe); };
diff --git a/media/mojo/services/mojo_audio_output_stream.cc b/media/mojo/services/mojo_audio_output_stream.cc index f3e4cde..a7607029 100644 --- a/media/mojo/services/mojo_audio_output_stream.cc +++ b/media/mojo/services/mojo_audio_output_stream.cc
@@ -21,8 +21,7 @@ StreamCreatedCallback stream_created_callback, DeleterCallback deleter_callback) : stream_created_callback_(std::move(stream_created_callback)), - deleter_callback_(std::move(deleter_callback)), - binding_(this) { + deleter_callback_(std::move(deleter_callback)) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(stream_created_callback_); DCHECK(deleter_callback_); @@ -85,15 +84,16 @@ DCHECK(socket_handle.is_valid()); - mojom::AudioOutputStreamPtr stream; - binding_.Bind(mojo::MakeRequest(&stream)); - // |this| owns |binding_| so unretained is safe. - binding_.set_connection_error_handler(base::BindOnce( + mojo::PendingRemote<mojom::AudioOutputStream> pending_stream; + receiver_.Bind(pending_stream.InitWithNewPipeAndPassReceiver()); + // |this| owns |receiver_| so unretained is safe. + receiver_.set_disconnect_handler(base::BindOnce( &MojoAudioOutputStream::StreamConnectionLost, base::Unretained(this))); std::move(stream_created_callback_) - .Run(std::move(stream), {base::in_place, std::move(shared_memory_region), - std::move(socket_handle)}); + .Run(std::move(pending_stream), + {base::in_place, std::move(shared_memory_region), + std::move(socket_handle)}); } void MojoAudioOutputStream::OnStreamError(int stream_id) {
diff --git a/media/mojo/services/mojo_audio_output_stream.h b/media/mojo/services/mojo_audio_output_stream.h index c58814b..bbb56fce 100644 --- a/media/mojo/services/mojo_audio_output_stream.h +++ b/media/mojo/services/mojo_audio_output_stream.h
@@ -12,7 +12,8 @@ #include "media/audio/audio_output_delegate.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" #include "media/mojo/services/media_mojo_export.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" namespace media { @@ -23,7 +24,7 @@ public AudioOutputDelegate::EventHandler { public: using StreamCreatedCallback = - base::OnceCallback<void(mojom::AudioOutputStreamPtr, + base::OnceCallback<void(mojo::PendingRemote<mojom::AudioOutputStream>, media::mojom::ReadWriteAudioDataPipePtr)>; using CreateDelegateCallback = base::OnceCallback<std::unique_ptr<AudioOutputDelegate>( @@ -62,7 +63,7 @@ StreamCreatedCallback stream_created_callback_; DeleterCallback deleter_callback_; - mojo::Binding<AudioOutputStream> binding_; + mojo::Receiver<AudioOutputStream> receiver_{this}; std::unique_ptr<AudioOutputDelegate> delegate_; base::WeakPtrFactory<MojoAudioOutputStream> weak_factory_{this};
diff --git a/media/mojo/services/mojo_audio_output_stream_unittest.cc b/media/mojo/services/mojo_audio_output_stream_unittest.cc index 62a409a..75ab474 100644 --- a/media/mojo/services/mojo_audio_output_stream_unittest.cc +++ b/media/mojo/services/mojo_audio_output_stream_unittest.cc
@@ -13,6 +13,9 @@ #include "base/test/task_environment.h" #include "media/audio/audio_output_controller.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/platform_handle.h" #include "testing/gmock/include/gmock/gmock.h" @@ -34,8 +37,6 @@ using testing::SaveArg; using testing::StrictMock; using testing::Test; -using AudioOutputStream = mojom::AudioOutputStream; -using AudioOutputStreamPtr = mojo::InterfacePtr<AudioOutputStream>; class TestCancelableSyncSocket : public base::CancelableSyncSocket { public: @@ -125,7 +126,8 @@ return nullptr; } -void NotCalled(mojom::AudioOutputStreamPtr, mojom::ReadWriteAudioDataPipePtr) { +void NotCalled(mojo::PendingRemote<mojom::AudioOutputStream>, + mojom::ReadWriteAudioDataPipePtr) { ADD_FAILURE() << "The StreamCreated callback was called despite the test " "expecting it not to."; } @@ -137,9 +139,9 @@ MojoAudioOutputStreamTest() : foreign_socket_(std::make_unique<TestCancelableSyncSocket>()) {} - AudioOutputStreamPtr CreateAudioOutput() { - mojom::AudioOutputStreamPtr p; - pending_stream_request_ = mojo::MakeRequest(&p); + mojo::Remote<mojom::AudioOutputStream> CreateAudioOutput() { + mojo::Remote<mojom::AudioOutputStream> remote; + pending_stream_receiver = remote.BindNewPipeAndPassReceiver(); ExpectDelegateCreation(); impl_ = std::make_unique<MojoAudioOutputStream>( base::BindOnce(&MockDelegateFactory::CreateDelegate, @@ -147,14 +149,14 @@ base::BindOnce(&MojoAudioOutputStreamTest::CreatedStream, base::Unretained(this)), base::BindOnce(&MockDeleter::Finished, base::Unretained(&deleter_))); - return p; + return remote; } protected: - void CreatedStream(mojom::AudioOutputStreamPtr stream, + void CreatedStream(mojo::PendingRemote<mojom::AudioOutputStream> stream, mojom::ReadWriteAudioDataPipePtr data_pipe) { - EXPECT_EQ(mojo::FuseMessagePipes(pending_stream_request_.PassMessagePipe(), - stream.PassInterface().PassHandle()), + EXPECT_EQ(mojo::FuseMessagePipes(pending_stream_receiver.PassPipe(), + stream.PassPipe()), MOJO_RESULT_OK); client_.Initialize(std::move(data_pipe)); } @@ -180,12 +182,11 @@ StrictMock<MockDelegateFactory> mock_delegate_factory_; StrictMock<MockDeleter> deleter_; StrictMock<MockClient> client_; - mojom::AudioOutputStreamRequest pending_stream_request_; + mojo::PendingReceiver<mojom::AudioOutputStream> pending_stream_receiver; std::unique_ptr<MojoAudioOutputStream> impl_; }; TEST_F(MojoAudioOutputStreamTest, NoDelegate_SignalsError) { - mojom::AudioOutputStreamPtr stream_ptr; MojoAudioOutputStream stream( base::BindOnce(&CreateNoDelegate), base::BindOnce(&NotCalled), base::BindOnce(&MockDeleter::Finished, base::Unretained(&deleter_))); @@ -194,54 +195,59 @@ } TEST_F(MojoAudioOutputStreamTest, Play_Plays) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(*delegate_, OnPlayStream()); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->Play(); + audio_output_remote->Play(); base::RunLoop().RunUntilIdle(); } TEST_F(MojoAudioOutputStreamTest, Pause_Pauses) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(*delegate_, OnPauseStream()); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->Pause(); + audio_output_remote->Pause(); base::RunLoop().RunUntilIdle(); } TEST_F(MojoAudioOutputStreamTest, SetVolume_SetsVolume) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(*delegate_, OnSetVolume(kNewVolume)); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->SetVolume(kNewVolume); + audio_output_remote->SetVolume(kNewVolume); base::RunLoop().RunUntilIdle(); } TEST_F(MojoAudioOutputStreamTest, Flush_FlushesStream) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(*delegate_, OnFlushStream()); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->Flush(); + audio_output_remote->Flush(); base::RunLoop().RunUntilIdle(); } TEST_F(MojoAudioOutputStreamTest, DestructWithCallPending_Safe) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); base::RunLoop().RunUntilIdle(); @@ -249,13 +255,14 @@ foreign_socket_->ExpectOwnershipTransfer(); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->Play(); + audio_output_remote->Play(); impl_.reset(); base::RunLoop().RunUntilIdle(); } TEST_F(MojoAudioOutputStreamTest, Created_NotifiesClient) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); base::RunLoop().RunUntilIdle(); EXPECT_CALL(client_, GotNotification()); @@ -269,31 +276,34 @@ } TEST_F(MojoAudioOutputStreamTest, SetVolumeTooLarge_Error) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(deleter_, Finished(true)); EXPECT_CALL(client_, GotNotification()); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->SetVolume(15); + audio_output_remote->SetVolume(15); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClear(&deleter_); } TEST_F(MojoAudioOutputStreamTest, SetVolumeNegative_Error) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(deleter_, Finished(true)); EXPECT_CALL(client_, GotNotification()); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr->SetVolume(-0.5); + audio_output_remote->SetVolume(-0.5); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClear(&deleter_); } TEST_F(MojoAudioOutputStreamTest, DelegateErrorBeforeCreated_PropagatesError) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(deleter_, Finished(true)); ASSERT_NE(nullptr, delegate_event_handler_); @@ -304,7 +314,8 @@ } TEST_F(MojoAudioOutputStreamTest, DelegateErrorAfterCreated_PropagatesError) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(deleter_, Finished(true)); base::RunLoop().RunUntilIdle(); @@ -320,14 +331,15 @@ } TEST_F(MojoAudioOutputStreamTest, RemoteEndGone_CallsDeleter) { - AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput(); + mojo::Remote<mojom::AudioOutputStream> audio_output_remote = + CreateAudioOutput(); EXPECT_CALL(client_, GotNotification()); EXPECT_CALL(deleter_, Finished(false)); delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_), std::move(foreign_socket_)); - audio_output_ptr.reset(); + audio_output_remote.reset(); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClear(&deleter_); }
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 223b8f6..b4c8b8a 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -3960,7 +3960,6 @@ { "name": "concentrade.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crepererum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryptoparty.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dannyrohde.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "devdoodle.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diasp.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dime-staging.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4823,7 +4822,6 @@ { "name": "bentley.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "berra.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bfw-online.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "biasmath.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biou.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoinworld.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blauwwit.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6615,7 +6613,6 @@ { "name": "continuumgaming.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cool110.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "creep.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "crestasantos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cruzr.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "customd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cvr.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8434,7 +8431,6 @@ { "name": "bubblegumblog.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "buchheld.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "budgetthostels.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "buffalodrinkinggame.beer", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "buildbox.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "built.by", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bulletpoint.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12650,8 +12646,6 @@ { "name": "cubecraftstore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cubecraftstore.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cubos.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "cubostecnologia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "cubostecnologia.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cucc.date", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "culturedcode.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cuongquach.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13431,7 +13425,6 @@ { "name": "points4unitedway.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pole.net.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "polycrypt.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pomar.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ponteencima.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pontokay.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pornbay.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13788,7 +13781,6 @@ { "name": "travisforte.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "travisfranck.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "travler.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "treinaweb.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tributh.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tripcombi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tsuyuzakihiroyuki.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14546,7 +14538,6 @@ { "name": "gta-arabs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "giga.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blitzprog.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "gem-indonesia.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gorgiaxx.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gamepad.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "glasner.photo", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14892,7 +14883,6 @@ { "name": "logicio.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mcea-hld.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mercadobitcoin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "mesicka.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "machtweb.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "marketnsight.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mercadobitcoin.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19884,7 +19874,6 @@ { "name": "d2s.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chatnbook.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ducalendars.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "diju.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drawvesly.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "douzer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dreamlandmagic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30921,7 +30910,6 @@ { "name": "matcha-iga.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mayavi.co.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lunasqu.ee", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "maitrechaton.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "malmoesport.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "magazinedotreino.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "magnatronic.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -34205,7 +34193,6 @@ { "name": "niclasreich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nien.gq", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nienkeslop.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nintendoforum.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nixonlibrary.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nlfant.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nodefiles.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -34736,7 +34723,6 @@ { "name": "wisdomize.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wishesbee.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wittepapaver.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "witting.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wjg.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wjg.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wollongongbaptist.hopto.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -36200,7 +36186,6 @@ { "name": "jagbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jamieweb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jammysplodgers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jangocloud.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "janheidler.dynv6.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jballelectronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jbsinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -38630,7 +38615,6 @@ { "name": "proggersession.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projectforge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "purplebricksplc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pyjiaoyi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qimiao.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quarryhillrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quatrefoiscent.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -39160,7 +39144,6 @@ { "name": "creatieven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creativeconceptsvernon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creato.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "creatujoya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creditreporttips.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cribcore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cronologie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -39541,7 +39524,6 @@ { "name": "idrissi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iha6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ikkbb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ikkev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immaternity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imponet.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40430,7 +40412,6 @@ { "name": "xxxlbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yacineboumaza.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yannick.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ybscareers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yenibilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yetishirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yocchan1513.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41365,7 +41346,6 @@ { "name": "zapatoshechoamano.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zoccarato.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zodgame.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zofrex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zouyaoji.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zubro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zwk.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41501,7 +41481,6 @@ { "name": "briefvorlagen-papierformat.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btcp.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buchverlag-scholz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bull.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burgernet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "businessfactors.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buytermpaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -42694,7 +42673,6 @@ { "name": "play-charades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plumbingcentral.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "policesromandesrecrutement.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "policyreporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "policyreporter.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "polit-it.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pomockypredeti.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -45390,7 +45368,6 @@ { "name": "tastic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "telekothonbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tellusaboutus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tennispensacola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teto.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thehouseofgod.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thenowheremen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47927,7 +47904,6 @@ { "name": "se-theories.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "securecomms.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "securitypuppy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sedlakovalegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "selea.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "selfoutlet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seolaba.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49874,7 +49850,6 @@ { "name": "oldprop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oliveoilschool.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "omori.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oneheartbali.church", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oneiroi.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oneprediction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onice.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51953,7 +51928,6 @@ { "name": "flavo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "floorballpoint.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fnanen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "follower98.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forex-plus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forextickler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "franzknoll.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53037,7 +53011,6 @@ { "name": "cypad.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d-parts.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dabasstacija.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "danholloway.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danielsfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darioclip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darkrisks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53135,7 +53108,6 @@ { "name": "gagliarducci.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "galabau-maurmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "galacg.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gehas-wein-shop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gemgroups.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "general-insurance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "germancraft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54029,7 +54001,6 @@ { "name": "construction-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "costellofc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "covaci.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "craazzyman21.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crazy-cat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "credittoken.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "criptolog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54441,7 +54412,6 @@ { "name": "ontservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openmirrors.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openroademail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "opure.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oriondynamic.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orocojuco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "otmo7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54654,7 +54624,6 @@ { "name": "thepharm.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "therapiemi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thermorecetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thestyleforme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetotalemaildelivery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theverybusyoffice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewayofthedojo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55895,7 +55864,6 @@ { "name": "casecoverkeygi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caseycapitalpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casino-online.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "casinovergleich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catalyconv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cellebrite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "celltesequ.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56294,7 +56262,6 @@ { "name": "lbmblaasmuziek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "leankit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "leeaaronsrealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "legaldesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lektier.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letranif.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "levineteamestates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56547,7 +56514,6 @@ { "name": "scholarshipplatform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scholarshipsplatform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schuelerzeitung-ideenlos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "scorerealtygroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scottlanderkingman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "screefox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "screen-fox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56693,7 +56659,6 @@ { "name": "themeridianway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "themiddle.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theninenine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thesnellvilledentist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thestandingroomrestaurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetinylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thevalueofarchitecture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60368,7 +60333,6 @@ { "name": "jwz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jzgj088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kamen-master.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kayo.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keepitsecure24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kennedyinsurancesolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kevindienst.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61698,7 +61662,6 @@ { "name": "securenets.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sektor41.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sentencing.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "seolotsen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seowordpress.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "serverping.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sextfriend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62112,7 +62075,6 @@ { "name": "shavit.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shdsub.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shiny.gift", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shippinglabel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shopdongho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sietejefes.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simulping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62367,7 +62329,6 @@ { "name": "kt3i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kys.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laceysfarm.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lagranmoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "leaseourthings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "legoutcheznous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "legyenkianegykereked.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62376,7 +62337,6 @@ { "name": "lepourquoiducomment.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "les-explos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letsprint3d.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "liaronce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lieren4x4.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "life29.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lifewithdyna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63560,7 +63520,6 @@ { "name": "ibericartechnik.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icci.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icelandicasian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "icnc.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "impactingsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infraredradiant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64570,7 +64529,6 @@ { "name": "bakerviewdentalcentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "banka.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "barcelonabagels.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bavarianhiker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benstevinson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestbrokerindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blobemoji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65124,7 +65082,6 @@ { "name": "intoparking.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iparkki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipslsig.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ironpony.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itcbuerobedarf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itconsulting-wolfinger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itdo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66013,7 +65970,6 @@ { "name": "mcpebox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medbreaker-friends.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "medvedkovo-hovrino.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "megaxhost.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meinheizstrom.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "melosyne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66101,7 +66057,6 @@ { "name": "offensity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oku-nara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "okwu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oldnoob.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "on2it.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oncalltech.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onelinkmmp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66237,7 +66192,6 @@ { "name": "redheadfuck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "remmik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "renefloresphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "retzer.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "revhost-consulting.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "revolta-hosting.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reyesfernando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68327,7 +68281,6 @@ { "name": "p9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paratlantalalkozas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "partin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "passionate.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pentatec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "permisecole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "persefonne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68675,8 +68628,6 @@ { "name": "ambulari.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apachezone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "argecord.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "arisechurch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ariseconference.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arterydb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arthritisrheumaticdiseases.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artikelpendidikan.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71415,7 +71366,6 @@ { "name": "deluxecccam.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dennishzg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "derco.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "digihoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "districtcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dockstarter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dor-tak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72822,7 +72772,6 @@ { "name": "886666e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72830,22 +72779,14 @@ { "name": "886666n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "918awx.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "918bio.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "918db.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918ddk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "918hs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918ui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "91milk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "999zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72907,9 +72848,7 @@ { "name": "boxtreeclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brickadia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btopc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "btt285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btt6262a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "btt9292a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buysoft.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "byfeldt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73611,7 +73550,6 @@ { "name": "bryanfalchuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btshenqi.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btsou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "budgetinsurance.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buhex.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burbankdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buzzpop.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74018,11 +73956,7 @@ { "name": "z8182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z8233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z8851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z8922.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8925.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8929.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaffke.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zakonu.net.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zd0808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74235,7 +74169,6 @@ { "name": "12344048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "12345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1234a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123seo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "12n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "131365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74266,10 +74199,6 @@ { "name": "16-qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16region.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1831365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1832365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1834365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1837365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1baks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1cprosto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74720,7 +74649,6 @@ { "name": "52002w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "52002x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "52002y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "520xpjxpj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "55554048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "555b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5566bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74901,8 +74829,6 @@ { "name": "663365g.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "663365h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "663365i.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "663365j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "663365k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "666111bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "666222bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74949,7 +74875,6 @@ { "name": "733575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "73365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "74365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "75365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "755204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "755243.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "755245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76927,7 +76852,6 @@ { "name": "qq6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qqq6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qqq63.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qqq67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quantumfinance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qubhockey.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "queirozmiotto.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77588,11 +77512,8 @@ { "name": "vulgar-teens.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vysokoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w000999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w123123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w234234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w456456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w567567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w66w66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w678678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77600,7 +77521,6 @@ { "name": "w888022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w888033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w888044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w888066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w888077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w888088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w888099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77683,21 +77603,10 @@ { "name": "x3828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x3927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x58.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x58f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x58p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x58t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x58v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "x58z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x5901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x5902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x5903.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78055,7 +77964,6 @@ { "name": "6321222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6321333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "632140.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "632142.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "632143.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "632144.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "632147.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78085,7 +77993,6 @@ { "name": "7win.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "800139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8666321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "888xpjxpj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8win.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "900823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "91d75.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78198,7 +78105,6 @@ { "name": "agks02.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrodronechile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agweili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agzlapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimare-web.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airmash.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ajaxtime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79808,11 +79714,8 @@ { "name": "w8605.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w8609.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w8620.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w8625.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w8626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w8628.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w8659.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w888055.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w9196.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wa3368.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "waplumber.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79919,7 +79822,6 @@ { "name": "ym063.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourloan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yura.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaimdengi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaimexpress.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zajm-bez-poruchitelej.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80002,7 +79904,6 @@ { "name": "3970ku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3970ok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3970win.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3970yes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3970ylc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3blazing.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3dprinterwiki.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81053,7 +80954,6 @@ { "name": "seyrederiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sh68.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shelfplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shiftsecurityleft.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shopmacher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simpleshirts.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sinalizeweb.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81128,7 +81028,6 @@ { "name": "virtuewisdomfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voloskova.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "votemate.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vv1234.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w3n14izy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w3n14izy.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w3n14izy.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81242,7 +81141,6 @@ { "name": "bachmatt-baar.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bachweid-baar.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bastide-viens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "belkys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "berksarl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestcomputersecuritybooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beyondboxgifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81439,7 +81337,6 @@ { "name": "mjproduction.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modderday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moens.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nemhaisan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netface.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netfolio.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nix13.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81464,7 +81361,6 @@ { "name": "planetpowershell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "platform161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "podlibre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "portugal.gov.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pousadaestreladapraia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "precedencemedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "premiumhosting.com.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81577,7 +81473,6 @@ { "name": "z-cert.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z3u5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z8950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zombmage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zoohaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81604,7 +81499,6 @@ { "name": "aigner-club.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aigner-club.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aignerimage.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "akmade.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "albstaedter-kids-cup.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alibaba-test.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antyfake.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81655,7 +81549,6 @@ { "name": "cp015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creativeideasagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cryptex.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cryptoninjas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ctf-albstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d88a.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d88b.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81897,7 +81790,6 @@ { "name": "serkanceyhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sham-group.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoppingvrimini.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sksongs.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "skuizy.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sm-kyoushitsu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smakoszwegrzynka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82982,7 +82874,6 @@ { "name": "572kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "575kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5agks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "615kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "61z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "621kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "625kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83277,7 +83168,6 @@ { "name": "ks89.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks90.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kstr.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ktlearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "la-bolle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "labastidedesaromes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lacochinacounselor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83561,6 +83451,476 @@ { "name": "zone-de-confiance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zorgenvoorandrea.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zoubaa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0cd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "115z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "123666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "14erc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "14ercooper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "222tips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "234666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "235u.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "345666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "35089y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "35089y1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "35089y2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40percentpapermache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "45b.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4investors.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4wrd.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52062i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52062m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "588z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "616xin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "654666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "668z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "765666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8156d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8238d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "868z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "881z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8875d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "92owl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a04gameapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a04webapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a06gameapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a06webapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aberon.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "actingcxo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adonis.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adonis.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advaith.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "affiliates.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airconditioning-sandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajsgall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allanta.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allmajestic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apkright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "appbydl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apply-esta.us.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apwide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artifexnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artigoos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asesoriaglobalenseguros.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlantacustomfab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autodius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autogestioninmobiliaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "awangardaszkola.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ayyz66.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b1nzy-pinged.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bachmannyachts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bacsmegye.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "balanceado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baltimorecashflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baranyavar.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barnhardt4berks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "basechat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beautyseasons.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beckijayes.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bergfex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestehostingproviders.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettashoerepairs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettmer.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettmer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bhaweshkumar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bhrenovations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bi5.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biancazapatka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bisoga.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blogauto.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bloomscape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blueangel.org.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bmcorp.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boomfestival.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "br1334shop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brickweb.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridalfabrics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridalfabrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridalfabrics.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridalfabrics.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brokolit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brugerklub.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bryanphilton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bsstainless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "callmewhatever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cameramark.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canhas.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cardozovargas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cardozovargas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casashmodel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ceramiche.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "changinglivestoday.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chernyak.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chicagenial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christineandcie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christineprayon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cialisonlinee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clairette-de-die-lantheaume.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudsters.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coderscripts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coinsuggest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comfortsolutionsair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "commure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consommation-locale.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "contractorswestga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "correctconstructions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creativeground.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crowcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ctmrepository.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cubesugar.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuckoo.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cursosgratuitos.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybertrash.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d1qvlbepn0kduz.cloudfront.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dal.net.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dating.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decoacerospanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decorativeflooring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demedx.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dianpi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disinfestazioni24.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dobbshvac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "douglascountybar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "douglascountyfilmtrail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ds28s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dungdev.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dustandsand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-surety.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eecs388.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eimmigration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eleganceperfumes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elgringosrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elycoin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emrahcinik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "encoro.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enjoytech.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enlamochiladeadri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enlilrosse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "epawnatl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "equipoweb.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "espacobebecia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "everydaylatestnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "evthing.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exploredouglascountyga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9marketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fachfusspflege-exner.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fejervar.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finda.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fireglow.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "framer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freshbean.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fridaysforfuture-bremen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "froogo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuckssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funktionevents.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaetantremois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaozj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "garduri-electrice-animale.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "georgesand.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalairsea.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globaleaks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalvoice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gorpg.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greengates.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gregorydorrifourt.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grexx.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gympass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hac2er.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haramainbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harington.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "has.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hasandeniz.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heardcountyathletics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hellofrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hi-media.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hinepaving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hklbgd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homecaring.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homeehome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homelabalert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "horizon.ne.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotelstanford.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "howardscholars.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "husk.house", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i-pinged-everyone.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "icanhas.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "igramfollower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "im-a.cricket", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imoe.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inkthreadable.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inpatec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intelligentcontacts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intelligentnegotiator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "introspectivemarketresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "investinweed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "invetep.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irishsessions.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jack-p2.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "janostheil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jaramilloconstrucciones.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jitterbit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jnsz.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jobfury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jobtarget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johannfritsche.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jyk.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karawanken-tunnel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karolak.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katapult.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keestalkstech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kingfast.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kingsblueblue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kita-freie-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kleor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klimmzugstange-fitness.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knuterikskare.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kodkollen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kodkollen.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kopfkrieg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kreatorbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurierwilenski.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laboiteare.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laptop98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lcv.psc.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicos.etc.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.rio.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leoservicosetc.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "levels.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leveluprankings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libertarian-party.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libwebsockets.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifetoolscdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lintelliftusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "load.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "love-spells-tarot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luisfernandoosorio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lumacurve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magicstay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magyarepitok.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maiet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mailtrap.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maklerinfo.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malwar.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malwar.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malwr.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "martellosecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvinschopf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvman.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvnetdigital.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mawulihotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maylamtoiden.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazloum.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbsync4supply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meiksbar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "merchant.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metrosahel.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mgsdb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "michelwolf.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micropigpets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikkei.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "millerwalker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miniwaplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miss-alisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "misterandersson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mlonline.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mlwr.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "modelspoor-projecten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "modelspoorprojecten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "modernautorepairs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mont-thabor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "morrellllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mountainutilities.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mraag.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrvnt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "muot.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mustsellacarglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "my-web.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myphamthemis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nan.cm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nashikmatka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "natmal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noahenco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nocloud.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nogradhont.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nspireoutreach.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "objectif-securite.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "officezoneonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "okkhor52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olive.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ollies.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onchol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oneartyminute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlytrong.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onpointplugins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optiekdemeester.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oqpo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osmdroid.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osomagicmountain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ownian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pandahut.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paradiseprivatehospital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "partnersofprc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pdfget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pestpilis.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pfnext.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plaisirs-coquins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planetchiropracticga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planosylicencias.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plans3ds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plcgurus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "please-uwu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plz.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pokoleniebar.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "priv.gc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "privatenebula.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "programador-web-freelance.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "putnamcollision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "querencia.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quickformspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdviitd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "recruitnow.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renewedhopefc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "restore-aid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rinkhill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riptidetech.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rohrle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roomkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rosebankplumber24-7.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roseberyvenues.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rsquare.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rswow.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rubymediagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rummey.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saalfrank.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saalfrank.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safetysite.tips", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sakerhetsbubblan.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samandroscosrestaurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samusil.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sand-stoneinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "santa-fell-from.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sapphireservicesga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "satmali.az", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "segurosmaurobracchieri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sergio.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sherrikelley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiganmartialarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sideleau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skjt.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skolebil.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sofialobocera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solucionespicadelly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "somogyivar.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "songsmp3.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "songun.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sonictonic.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soundorabilia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staticfury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stau-a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stelinauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strousberg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "structuralfix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surveil.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swoffordconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tarife.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tauedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "technicaloffice.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "temariogratis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "terass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "the-spoonfeed.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theboulders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theepicsponge.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theolivetreerestaurants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thethoughttrainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thetuco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thevenuevr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toddcullumresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tolnavar.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tomik.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tradecloud.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tradelogicintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tradie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trainme.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travauxcontact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelamm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trebnie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tusi.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twdtulelo.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twistfix.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tylervigario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ucnedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unique-tutorials.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "universal-edge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usa-viagra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v800y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vabusinesses.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "versicherungen-blog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vnministries.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "void.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waehlefamilie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "warmcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wearebase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wefound.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wenceslas.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "werbetopshop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "west-nerica.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whistleblowing.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wildrough.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wohnbegleitung.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "writemyestimate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wsave.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wuz.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--5kv19nxn6b.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--birkenblttertee-7kb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtremeperformance.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xuwei.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xxxbunker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xzibits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y2g.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yabbarov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yachtfolio1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yocto.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youngsoad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourdailyalerts.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ys633.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ysuna.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z33d.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6192.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6281.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6381.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6571.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6592.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z6912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z8870.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zanjirzanane-shanbeghazan.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd697.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd753.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd759.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd762.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd825.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd826.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index 7d7f8d9..179e4a3 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -22,6 +22,7 @@ #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/rand_util.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/synchronization/lock.h" @@ -345,6 +346,7 @@ NID_X9_62_prime256v1, NID_secp384r1}; SSL_CTX_set1_curves(ssl_ctx_.get(), kCurves, base::size(kCurves)); } + // The "Random" group is configured on the |SSL*|, below. if (send_signal) { SSL_CTX_enable_pq_experiment_signal(ssl_ctx_.get()); @@ -908,6 +910,36 @@ SSL_set_shed_handshake_config(ssl_.get(), 1); +#if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) + // CECPQ2b is only optimised for x86-64 and aarch64, and is too slow on + // other CPUs to even experiment with. + const std::string post_quantum_group = kPostQuantumGroup.Get(); + // The Random group does per-connection randomisation and so is configured + // on the |SSL*|. Other groups are configured on the |SSL_CTX*|, above. + if (post_quantum_group == "Random") { + uint8_t coins; + base::RandBytes(&coins, sizeof(coins)); + switch (coins % 3) { + case 0: { + static const int kCurves[] = {NID_CECPQ2, NID_X25519, + NID_X9_62_prime256v1, NID_secp384r1}; + SSL_set1_curves(ssl_.get(), kCurves, base::size(kCurves)); + break; + } + + case 1: { + static const int kCurves[] = {NID_CECPQ2b, NID_X25519, + NID_X9_62_prime256v1, NID_secp384r1}; + SSL_set1_curves(ssl_.get(), kCurves, base::size(kCurves)); + break; + } + + case 2: + break; + } + } +#endif + // TODO(https://crbug.com/775438), if |ssl_config_.privacy_mode| is enabled, // this should always continue with no client certificate. send_client_cert_ = context_->GetClientCertificate(
diff --git a/net/websockets/websocket_stream.cc b/net/websockets/websocket_stream.cc index 607c2f9..a92bcccf 100644 --- a/net/websockets/websocket_stream.cc +++ b/net/websockets/websocket_stream.cc
@@ -302,9 +302,12 @@ class SSLErrorCallbacks : public WebSocketEventInterface::SSLErrorCallbacks { public: explicit SSLErrorCallbacks(URLRequest* url_request) - : url_request_(url_request) {} + : url_request_(url_request->GetWeakPtr()) {} void CancelSSLRequest(int error, const SSLInfo* ssl_info) override { + if (!url_request_) + return; + if (ssl_info) { url_request_->CancelWithSSLError(error, *ssl_info); } else { @@ -313,11 +316,12 @@ } void ContinueSSLRequest() override { - url_request_->ContinueDespiteLastError(); + if (url_request_) + url_request_->ContinueDespiteLastError(); } private: - URLRequest* url_request_; + base::WeakPtr<URLRequest> url_request_; }; void Delegate::OnReceivedRedirect(URLRequest* request,
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc index 90e53f50..1b77f05 100644 --- a/net/websockets/websocket_stream_test.cc +++ b/net/websockets/websocket_stream_test.cc
@@ -1689,5 +1689,52 @@ failure_message()); } +TEST_P(WebSocketStreamCreateTest, CancelSSLRequestAfterDelete) { + auto ssl_socket_data = std::make_unique<SSLSocketDataProvider>( + ASYNC, ERR_CERT_AUTHORITY_INVALID); + ssl_socket_data->ssl_info.cert = + ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der"); + ASSERT_TRUE(ssl_socket_data->ssl_info.cert.get()); + url_request_context_host_.AddSSLSocketDataProvider( + std::move(ssl_socket_data)); + + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET, 0)}; + MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 1)}; + std::unique_ptr<SequencedSocketData> raw_socket_data( + BuildSocketData(reads, writes)); + CreateAndConnectRawExpectations("wss://www.example.org/", NoSubProtocols(), + HttpRequestHeaders(), + std::move(raw_socket_data)); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(has_failed()); + ASSERT_TRUE(ssl_error_callbacks_); + stream_request_.reset(); + ssl_error_callbacks_->CancelSSLRequest(ERR_CERT_AUTHORITY_INVALID, + &ssl_info_); +} + +TEST_P(WebSocketStreamCreateTest, ContinueSSLRequestAfterDelete) { + auto ssl_socket_data = std::make_unique<SSLSocketDataProvider>( + ASYNC, ERR_CERT_AUTHORITY_INVALID); + ssl_socket_data->ssl_info.cert = + ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der"); + ASSERT_TRUE(ssl_socket_data->ssl_info.cert.get()); + url_request_context_host_.AddSSLSocketDataProvider( + std::move(ssl_socket_data)); + + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET, 0)}; + MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 1)}; + std::unique_ptr<SequencedSocketData> raw_socket_data( + BuildSocketData(reads, writes)); + CreateAndConnectRawExpectations("wss://www.example.org/", NoSubProtocols(), + HttpRequestHeaders(), + std::move(raw_socket_data)); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(has_failed()); + ASSERT_TRUE(ssl_error_callbacks_); + stream_request_.reset(); + ssl_error_callbacks_->ContinueSSLRequest(); +} + } // namespace } // namespace net
diff --git a/pdf/accessibility.cc b/pdf/accessibility.cc index 7662c58..79294dbd 100644 --- a/pdf/accessibility.cc +++ b/pdf/accessibility.cc
@@ -5,7 +5,6 @@ #include "pdf/accessibility.h" #include "pdf/pdf_engine.h" -#include "ppapi/c/private/ppb_pdf.h" namespace chrome_pdf { @@ -15,8 +14,8 @@ PP_PrivateAccessibilityPageInfo* page_info, std::vector<PP_PrivateAccessibilityTextRunInfo>* text_runs, std::vector<PP_PrivateAccessibilityCharInfo>* chars, - std::vector<PP_PrivateAccessibilityLinkInfo>* links, - std::vector<PP_PrivateAccessibilityImageInfo>* images) { + std::vector<pp::PDF::PrivateAccessibilityLinkInfo>* links, + std::vector<pp::PDF::PrivateAccessibilityImageInfo>* images) { int page_count = engine->GetNumberOfPages(); if (page_index < 0 || page_index >= page_count) return false;
diff --git a/pdf/accessibility.h b/pdf/accessibility.h index 1fd0d90..11ec97c 100644 --- a/pdf/accessibility.h +++ b/pdf/accessibility.h
@@ -9,11 +9,7 @@ #include <vector> -struct PP_PrivateAccessibilityCharInfo; -struct PP_PrivateAccessibilityImageInfo; -struct PP_PrivateAccessibilityLinkInfo; -struct PP_PrivateAccessibilityPageInfo; -struct PP_PrivateAccessibilityTextRunInfo; +#include "ppapi/cpp/private/pdf.h" namespace chrome_pdf { @@ -29,8 +25,8 @@ PP_PrivateAccessibilityPageInfo* page_info, std::vector<PP_PrivateAccessibilityTextRunInfo>* text_runs, std::vector<PP_PrivateAccessibilityCharInfo>* chars, - std::vector<PP_PrivateAccessibilityLinkInfo>* links, - std::vector<PP_PrivateAccessibilityImageInfo>* images); + std::vector<pp::PDF::PrivateAccessibilityLinkInfo>* links, + std::vector<pp::PDF::PrivateAccessibilityImageInfo>* images); } // namespace chrome_pdf
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index c6b9448..3d8c99d 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -964,16 +964,15 @@ PP_PrivateAccessibilityPageInfo page_info; std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs; std::vector<PP_PrivateAccessibilityCharInfo> chars; - std::vector<PP_PrivateAccessibilityLinkInfo> links; - std::vector<PP_PrivateAccessibilityImageInfo> images; + std::vector<pp::PDF::PrivateAccessibilityLinkInfo> links; + std::vector<pp::PDF::PrivateAccessibilityImageInfo> images; if (!GetAccessibilityInfo(engine_.get(), page_index, &page_info, &text_runs, &chars, &links, &images)) { return; } - pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info, - text_runs.data(), chars.data(), - links.data(), images.data()); + pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info, text_runs, + chars, links, images); // Schedule loading the next page. pp::CompletionCallback callback = callback_factory_.NewCallback(
diff --git a/pdf/pdfium/accessibility_unittest.cc b/pdf/pdfium/accessibility_unittest.cc index f1f59f6..d56c698 100644 --- a/pdf/pdfium/accessibility_unittest.cc +++ b/pdf/pdfium/accessibility_unittest.cc
@@ -8,7 +8,6 @@ #include "pdf/pdfium/pdfium_test_base.h" #include "pdf/test/test_client.h" #include "pdf/test/test_utils.h" -#include "ppapi/c/private/ppb_pdf.h" #include "ppapi/c/private/ppp_pdf.h" #include "testing/gtest/include/gtest/gtest.h" @@ -73,8 +72,8 @@ PP_PrivateAccessibilityPageInfo page_info; std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs; std::vector<PP_PrivateAccessibilityCharInfo> chars; - std::vector<PP_PrivateAccessibilityLinkInfo> links; - std::vector<PP_PrivateAccessibilityImageInfo> images; + std::vector<pp::PDF::PrivateAccessibilityLinkInfo> links; + std::vector<pp::PDF::PrivateAccessibilityImageInfo> images; ASSERT_TRUE(GetAccessibilityInfo(engine.get(), 0, &page_info, &text_runs, &chars, &links, &images)); EXPECT_EQ(0u, page_info.page_index);
diff --git a/ppapi/c/private/ppb_pdf.h b/ppapi/c/private/ppb_pdf.h index 8cb2ae15..e98003a 100644 --- a/ppapi/c/private/ppb_pdf.h +++ b/ppapi/c/private/ppb_pdf.h
@@ -81,6 +81,7 @@ // This holds the link information provided by the PDF and will be used in // accessibility to provide the link information. +// Needs to stay in sync with C++ version. struct PP_PrivateAccessibilityLinkInfo { // URL of the link. const char* url; @@ -102,6 +103,7 @@ // This holds the image information provided by the PDF and will be used in // accessibility to provide the image information. +// Needs to stay in sync with C++ version. struct PP_PrivateAccessibilityImageInfo { // Alternate text for the image provided by PDF. const char* alt_text; @@ -194,11 +196,11 @@ // accessibility support. void (*SetAccessibilityPageInfo)( PP_Instance instance, - struct PP_PrivateAccessibilityPageInfo* page_info, - struct PP_PrivateAccessibilityTextRunInfo text_runs[], - struct PP_PrivateAccessibilityCharInfo chars[], - struct PP_PrivateAccessibilityLinkInfo links[], - struct PP_PrivateAccessibilityImageInfo images[]); + const struct PP_PrivateAccessibilityPageInfo* page_info, + const struct PP_PrivateAccessibilityTextRunInfo text_runs[], + const struct PP_PrivateAccessibilityCharInfo chars[], + const struct PP_PrivateAccessibilityLinkInfo links[], + const struct PP_PrivateAccessibilityImageInfo images[]); // Sends information about the PDF's URL and the embedder's URL. void (*SetCrashData)(PP_Instance instance,
diff --git a/ppapi/cpp/private/pdf.cc b/ppapi/cpp/private/pdf.cc index 0ae90b0..5910c2f 100644 --- a/ppapi/cpp/private/pdf.cc +++ b/ppapi/cpp/private/pdf.cc
@@ -18,6 +18,26 @@ return PPB_PDF_INTERFACE; } +void ConvertPrivateAccessibilityLinkInfo( + const PDF::PrivateAccessibilityLinkInfo& link, + PP_PrivateAccessibilityLinkInfo* info) { + info->url = link.url.c_str(); + info->url_length = link.url.size(); + info->index_in_page = link.index_in_page; + info->text_run_index = link.text_run_index; + info->text_run_count = link.text_run_count; + info->bounds = link.bounds; +} + +void ConvertPrivateAccessibilityImageInfo( + const PDF::PrivateAccessibilityImageInfo& image, + PP_PrivateAccessibilityImageInfo* info) { + info->alt_text = image.alt_text.c_str(); + info->alt_text_length = image.alt_text.size(); + info->text_run_index = image.text_run_index; + info->bounds = image.bounds; +} + } // namespace // static @@ -202,14 +222,23 @@ // static void PDF::SetAccessibilityPageInfo( const InstanceHandle& instance, - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]) { + const PP_PrivateAccessibilityPageInfo* page_info, + const std::vector<PP_PrivateAccessibilityTextRunInfo>& text_runs, + const std::vector<PP_PrivateAccessibilityCharInfo>& chars, + const std::vector<PrivateAccessibilityLinkInfo>& links, + const std::vector<PrivateAccessibilityImageInfo>& images) { if (has_interface<PPB_PDF>()) { + std::vector<PP_PrivateAccessibilityLinkInfo> link_info(links.size()); + for (size_t i = 0; i < links.size(); ++i) + ConvertPrivateAccessibilityLinkInfo(links[i], &link_info[i]); + + std::vector<PP_PrivateAccessibilityImageInfo> image_info(images.size()); + for (size_t i = 0; i < images.size(); ++i) + ConvertPrivateAccessibilityImageInfo(images[i], &image_info[i]); + get_interface<PPB_PDF>()->SetAccessibilityPageInfo( - instance.pp_instance(), page_info, text_runs, chars, links, images); + instance.pp_instance(), page_info, text_runs.data(), chars.data(), + link_info.data(), image_info.data()); } }
diff --git a/ppapi/cpp/private/pdf.h b/ppapi/cpp/private/pdf.h index e4a883ca7..cec922b2 100644 --- a/ppapi/cpp/private/pdf.h +++ b/ppapi/cpp/private/pdf.h
@@ -8,8 +8,10 @@ #include <stdint.h> #include <string> +#include <vector> #include "ppapi/c/private/ppb_pdf.h" +#include "ppapi/cpp/rect.h" struct PP_BrowserFont_Trusted_Description; @@ -20,6 +22,24 @@ class PDF { public: + // C++ version of PP_PrivateAccessibilityLinkInfo. + // Needs to stay in sync with the C version. + struct PrivateAccessibilityLinkInfo { + std::string url; + uint32_t index_in_page; + uint32_t text_run_index; + uint32_t text_run_count; + FloatRect bounds; + }; + + // C++ version of PP_PrivateAccessibilityImageInfo. + // Needs to stay in sync with the C version. + struct PrivateAccessibilityImageInfo { + std::string alt_text; + uint32_t text_run_index; + FloatRect bounds; + }; + // Returns true if the required interface is available. static bool IsAvailable(); @@ -72,11 +92,11 @@ PP_PrivateAccessibilityDocInfo* doc_info); static void SetAccessibilityPageInfo( const InstanceHandle& instance, - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]); + const PP_PrivateAccessibilityPageInfo* page_info, + const std::vector<PP_PrivateAccessibilityTextRunInfo>& text_runs, + const std::vector<PP_PrivateAccessibilityCharInfo>& chars, + const std::vector<PrivateAccessibilityLinkInfo>& links, + const std::vector<PrivateAccessibilityImageInfo>& images); static void SetCrashData(const InstanceHandle& instance, const char* pdf_url, const char* top_level_url);
diff --git a/ppapi/proxy/pdf_resource.cc b/ppapi/proxy/pdf_resource.cc index cb225c5..642276c 100644 --- a/ppapi/proxy/pdf_resource.cc +++ b/ppapi/proxy/pdf_resource.cc
@@ -211,11 +211,11 @@ } void PDFResource::SetAccessibilityPageInfo( - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]) { + const PP_PrivateAccessibilityPageInfo* page_info, + const PP_PrivateAccessibilityTextRunInfo text_runs[], + const PP_PrivateAccessibilityCharInfo chars[], + const PP_PrivateAccessibilityLinkInfo links[], + const PP_PrivateAccessibilityImageInfo images[]) { std::vector<PP_PrivateAccessibilityTextRunInfo> text_run_vector( text_runs, text_runs + page_info->text_run_count); std::vector<PP_PrivateAccessibilityCharInfo> char_vector(
diff --git a/ppapi/proxy/pdf_resource.h b/ppapi/proxy/pdf_resource.h index 71a1f59d..b371b3cd 100644 --- a/ppapi/proxy/pdf_resource.h +++ b/ppapi/proxy/pdf_resource.h
@@ -61,11 +61,11 @@ void SetAccessibilityDocInfo( PP_PrivateAccessibilityDocInfo* doc_info) override; void SetAccessibilityPageInfo( - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]) override; + const PP_PrivateAccessibilityPageInfo* page_info, + const PP_PrivateAccessibilityTextRunInfo text_runs[], + const PP_PrivateAccessibilityCharInfo chars[], + const PP_PrivateAccessibilityLinkInfo links[], + const PP_PrivateAccessibilityImageInfo images[]) override; void SetCrashData(const char* pdf_url, const char* top_level_url) override; void SelectionChanged(const PP_FloatPoint& left, int32_t left_height,
diff --git a/ppapi/shared_impl/pdf_accessibility_shared.cc b/ppapi/shared_impl/pdf_accessibility_shared.cc index 6670450e..ea389f78 100644 --- a/ppapi/shared_impl/pdf_accessibility_shared.cc +++ b/ppapi/shared_impl/pdf_accessibility_shared.cc
@@ -9,31 +9,29 @@ PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo() = default; PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo( - const PdfAccessibilityLinkInfo& other) = default; - -PdfAccessibilityLinkInfo::~PdfAccessibilityLinkInfo() = default; + const PP_PrivateAccessibilityLinkInfo& link) + : url(std::string(link.url, link.url_length)), + index_in_page(link.index_in_page), + text_run_index(link.text_run_index), + text_run_count(link.text_run_count), + bounds(link.bounds) {} PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo( - const PP_PrivateAccessibilityLinkInfo& link) { - url = std::string(link.url, link.url_length); - index_in_page = link.index_in_page; - text_run_index = link.text_run_index; - text_run_count = link.text_run_count; - bounds = link.bounds; -} + PdfAccessibilityLinkInfo&& other) = default; + +PdfAccessibilityLinkInfo::~PdfAccessibilityLinkInfo() = default; PdfAccessibilityImageInfo::PdfAccessibilityImageInfo() = default; PdfAccessibilityImageInfo::PdfAccessibilityImageInfo( - const PdfAccessibilityImageInfo& other) = default; - -PdfAccessibilityImageInfo::~PdfAccessibilityImageInfo() = default; + const PP_PrivateAccessibilityImageInfo& image) + : alt_text(std::string(image.alt_text, image.alt_text_length)), + text_run_index(image.text_run_index), + bounds(image.bounds) {} PdfAccessibilityImageInfo::PdfAccessibilityImageInfo( - const PP_PrivateAccessibilityImageInfo& image) { - alt_text = std::string(image.alt_text, image.alt_text_length); - text_run_index = image.text_run_index; - bounds = image.bounds; -} + PdfAccessibilityImageInfo&& other) = default; + +PdfAccessibilityImageInfo::~PdfAccessibilityImageInfo() = default; } // namespace ppapi
diff --git a/ppapi/shared_impl/pdf_accessibility_shared.h b/ppapi/shared_impl/pdf_accessibility_shared.h index 2591835..fd321d68 100644 --- a/ppapi/shared_impl/pdf_accessibility_shared.h +++ b/ppapi/shared_impl/pdf_accessibility_shared.h
@@ -13,10 +13,12 @@ namespace ppapi { +// Needs to stay in sync with PP_PrivateAccessibilityLinkInfo. struct PPAPI_SHARED_EXPORT PdfAccessibilityLinkInfo { PdfAccessibilityLinkInfo(); - PdfAccessibilityLinkInfo(const PdfAccessibilityLinkInfo& other); - PdfAccessibilityLinkInfo(const PP_PrivateAccessibilityLinkInfo& link); + explicit PdfAccessibilityLinkInfo( + const PP_PrivateAccessibilityLinkInfo& link); + PdfAccessibilityLinkInfo(PdfAccessibilityLinkInfo&& other); ~PdfAccessibilityLinkInfo(); std::string url; @@ -26,10 +28,12 @@ PP_FloatRect bounds; }; +// Needs to stay in sync with PP_PrivateAccessibilityImageInfo. struct PPAPI_SHARED_EXPORT PdfAccessibilityImageInfo { PdfAccessibilityImageInfo(); - PdfAccessibilityImageInfo(const PdfAccessibilityImageInfo& other); - PdfAccessibilityImageInfo(const PP_PrivateAccessibilityImageInfo& image); + explicit PdfAccessibilityImageInfo( + const PP_PrivateAccessibilityImageInfo& image); + PdfAccessibilityImageInfo(PdfAccessibilityImageInfo&& other); ~PdfAccessibilityImageInfo(); std::string alt_text;
diff --git a/ppapi/thunk/ppb_pdf_api.h b/ppapi/thunk/ppb_pdf_api.h index cf9b25e1..b56ba890 100644 --- a/ppapi/thunk/ppb_pdf_api.h +++ b/ppapi/thunk/ppb_pdf_api.h
@@ -41,11 +41,11 @@ virtual void SetAccessibilityDocInfo( PP_PrivateAccessibilityDocInfo* doc_info) = 0; virtual void SetAccessibilityPageInfo( - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]) = 0; + const PP_PrivateAccessibilityPageInfo* page_info, + const PP_PrivateAccessibilityTextRunInfo text_runs[], + const PP_PrivateAccessibilityCharInfo chars[], + const PP_PrivateAccessibilityLinkInfo links[], + const PP_PrivateAccessibilityImageInfo images[]) = 0; virtual void SetCrashData(const char* pdf_url, const char* top_level_url) = 0; virtual void SelectionChanged(const PP_FloatPoint& left, int32_t left_height,
diff --git a/ppapi/thunk/ppb_pdf_thunk.cc b/ppapi/thunk/ppb_pdf_thunk.cc index 4aa60d5b..19204b0 100644 --- a/ppapi/thunk/ppb_pdf_thunk.cc +++ b/ppapi/thunk/ppb_pdf_thunk.cc
@@ -162,21 +162,21 @@ enter.functions()->SetAccessibilityViewportInfo(viewport_info); } -void SetAccessibilityDocInfo( - PP_Instance instance, - PP_PrivateAccessibilityDocInfo* doc_info) { +void SetAccessibilityDocInfo(PP_Instance instance, + PP_PrivateAccessibilityDocInfo* doc_info) { EnterInstanceAPI<PPB_PDF_API> enter(instance); if (enter.failed()) return; enter.functions()->SetAccessibilityDocInfo(doc_info); } -void SetAccessibilityPageInfo(PP_Instance instance, - PP_PrivateAccessibilityPageInfo* page_info, - PP_PrivateAccessibilityTextRunInfo text_runs[], - PP_PrivateAccessibilityCharInfo chars[], - PP_PrivateAccessibilityLinkInfo links[], - PP_PrivateAccessibilityImageInfo images[]) { +void SetAccessibilityPageInfo( + PP_Instance instance, + const PP_PrivateAccessibilityPageInfo* page_info, + const PP_PrivateAccessibilityTextRunInfo text_runs[], + const PP_PrivateAccessibilityCharInfo chars[], + const PP_PrivateAccessibilityLinkInfo links[], + const PP_PrivateAccessibilityImageInfo images[]) { EnterInstanceAPI<PPB_PDF_API> enter(instance); if (enter.failed()) return;
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb index 26cac626..bfefc7f4 100644 --- a/remoting/resources/remoting_strings_fil.xtb +++ b/remoting/resources/remoting_strings_fil.xtb
@@ -187,7 +187,7 @@ Piliin ang '<ph name="BUTTON_NAME" />' sa ibaba. Sa iyong mga kagustuhan sa Seguridad at Privacy, lagyan ng check ang kahon sa tabi ng '<ph name="SERVICE_SCRIPT_NAME" />.' -Kung may check na ang '<ph name="SERVICE_SCRIPT_NAME" />,' i-uncheck ito at muling lagyan ng check.</translation> +Kung may check na ang '<ph name="SERVICE_SCRIPT_NAME" />,' i-uncheck ito at lagyan ito ulit ng check.</translation> <translation id="5510035215749041527">Alisin na sa pagkakakonekta</translation> <translation id="5593560073513909978">Pansamantalang hindi available ang serbisyo. Pakisubukang muli sa ibang pagkakataon.</translation> <translation id="5601503069213153581">PIN</translation> @@ -304,7 +304,7 @@ <translation id="837021510621780684">Mula sa computer na ito</translation> <translation id="8383794970363966105">Upang magamit ang Chromoting, kakailanganin mong magdagdag ng Google Account sa iyong device.</translation> <translation id="8386846956409881180">Na-configure ang host gamit ang mga di-wastong kredensyal sa OAuth.</translation> -<translation id="8406498562923498210">Pumili ng session na ilulunsad sa iyong environment ng Remote na Desktop ng Chrome. (Tandaang puwedeng hindi sinusuportahan ng ilang uri ng session ang pagtakbo sa Remote na Desktop ng Chrome at sa lokal na console nang sabay.)</translation> +<translation id="8406498562923498210">Pumili ng session na ilulunsad sa iyong environment ng Remote na Desktop ng Chrome. (Tandaang posibleng hindi sinusuportahan ng ilang uri ng session ang pagtakbo sa Remote na Desktop ng Chrome at sa lokal na console nang sabay.)</translation> <translation id="8428213095426709021">Mga Setting</translation> <translation id="8445362773033888690">Tingnan sa Google Play Store</translation> <translation id="8509907436388546015">Proseso ng Pagsasama ng Desktop</translation>
diff --git a/services/device/device_service.cc b/services/device/device_service.cc index 028a6db..0bbbf66 100644 --- a/services/device/device_service.cc +++ b/services/device/device_service.cc
@@ -182,7 +182,7 @@ registry_.AddInterface<mojom::BatteryMonitor>(base::Bind( &DeviceService::BindBatteryMonitorReceiver, base::Unretained(this))); registry_.AddInterface<mojom::HidManager>(base::Bind( - &DeviceService::BindHidManagerRequest, base::Unretained(this))); + &DeviceService::BindHidManagerReceiver, base::Unretained(this))); registry_.AddInterface<mojom::NFCProvider>(base::Bind( &DeviceService::BindNFCProviderReceiver, base::Unretained(this))); registry_.AddInterface<mojom::VibrationManager>(base::Bind( @@ -235,10 +235,11 @@ BatteryMonitorImpl::Create(std::move(receiver)); } -void DeviceService::BindHidManagerRequest(mojom::HidManagerRequest request) { +void DeviceService::BindHidManagerReceiver( + mojo::PendingReceiver<mojom::HidManager> receiver) { if (!hid_manager_) hid_manager_ = std::make_unique<HidManagerImpl>(); - hid_manager_->AddBinding(std::move(request)); + hid_manager_->AddReceiver(std::move(receiver)); } void DeviceService::BindNFCProviderReceiver(
diff --git a/services/device/device_service.h b/services/device/device_service.h index 15ae816..2969c91a 100644 --- a/services/device/device_service.h +++ b/services/device/device_service.h
@@ -153,7 +153,8 @@ #if !defined(OS_ANDROID) void BindBatteryMonitorReceiver( mojo::PendingReceiver<mojom::BatteryMonitor> receiver); - void BindHidManagerRequest(mojom::HidManagerRequest request); + void BindHidManagerReceiver( + mojo::PendingReceiver<mojom::HidManager> receiver); void BindNFCProviderReceiver( mojo::PendingReceiver<mojom::NFCProvider> receiver); void BindVibrationManagerRequest(mojom::VibrationManagerRequest request);
diff --git a/services/device/hid/hid_connection_impl_unittest.cc b/services/device/hid/hid_connection_impl_unittest.cc index 667d7b66..96fd7c1 100644 --- a/services/device/hid/hid_connection_impl_unittest.cc +++ b/services/device/hid/hid_connection_impl_unittest.cc
@@ -8,7 +8,8 @@ #include "base/bind_helpers.h" #include "base/memory/ref_counted_memory.h" #include "build/build_config.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "services/device/device_service_test_base.h" #include "testing/gtest/include/gtest/gtest.h" @@ -65,10 +66,11 @@ // report has been received. The contents of the input report are saved. class TestHidConnectionClient : public mojom::HidConnectionClient { public: - TestHidConnectionClient() : binding_(this) {} + TestHidConnectionClient() = default; + ~TestHidConnectionClient() override = default; - void Bind(mojom::HidConnectionClientRequest request) { - binding_.Bind(std::move(request)); + void Bind(mojo::PendingReceiver<mojom::HidConnectionClient> receiver) { + receiver_.Bind(std::move(receiver)); } // mojom::HidConnectionClient implementation. @@ -86,7 +88,7 @@ private: base::RunLoop run_loop_; - mojo::Binding<mojom::HidConnectionClient> binding_; + mojo::Receiver<mojom::HidConnectionClient> receiver_{this}; uint8_t report_id_ = 0; std::vector<uint8_t> buffer_;
diff --git a/services/device/hid/hid_manager_impl.cc b/services/device/hid/hid_manager_impl.cc index 0a78cd8..f0023249 100644 --- a/services/device/hid/hid_manager_impl.cc +++ b/services/device/hid/hid_manager_impl.cc
@@ -36,8 +36,9 @@ g_hid_service.Get() = std::move(hid_service); } -void HidManagerImpl::AddBinding(mojom::HidManagerRequest request) { - bindings_.AddBinding(this, std::move(request)); +void HidManagerImpl::AddReceiver( + mojo::PendingReceiver<mojom::HidManager> receiver) { + receivers_.Add(this, std::move(receiver)); } void HidManagerImpl::GetDevicesAndSetClient(
diff --git a/services/device/hid/hid_manager_impl.h b/services/device/hid/hid_manager_impl.h index f96e5dc..88ca655 100644 --- a/services/device/hid/hid_manager_impl.h +++ b/services/device/hid/hid_manager_impl.h
@@ -9,8 +9,9 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" -#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/interface_ptr_set.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "services/device/hid/hid_device_info.h" #include "services/device/hid/hid_service.h" #include "services/device/public/mojom/hid.mojom.h" @@ -30,7 +31,7 @@ // passed |hid_service|. static void SetHidServiceForTesting(std::unique_ptr<HidService> hid_service); - void AddBinding(mojom::HidManagerRequest request); + void AddReceiver(mojo::PendingReceiver<mojom::HidManager> receiver); // mojom::HidManager implementation: void GetDevicesAndSetClient(mojom::HidManagerClientAssociatedPtrInfo client, @@ -56,7 +57,7 @@ void OnDeviceRemoved(mojom::HidDeviceInfoPtr device_info) override; std::unique_ptr<HidService> hid_service_; - mojo::BindingSet<mojom::HidManager> bindings_; + mojo::ReceiverSet<mojom::HidManager> receivers_; mojo::AssociatedInterfacePtrSet<mojom::HidManagerClient> clients_; ScopedObserver<HidService, HidService::Observer> hid_service_observer_;
diff --git a/services/device/hid/hid_manager_unittest.cc b/services/device/hid/hid_manager_unittest.cc index bad4a271..dd3e8bf 100644 --- a/services/device/hid/hid_manager_unittest.cc +++ b/services/device/hid/hid_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "base/run_loop.h" #include "build/build_config.h" #include "mojo/public/cpp/bindings/associated_binding.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/device/device_service_test_base.h" #include "services/device/hid/hid_manager_impl.h" #include "services/device/hid/mock_hid_connection.h" @@ -128,7 +129,8 @@ // Transfer the ownership of the |mock_hid_service| to HidManagerImpl. // It is safe to use the |mock_hid_service_| in this test. HidManagerImpl::SetHidServiceForTesting(std::move(mock_hid_service)); - connector()->BindInterface(mojom::kServiceName, &hid_manager_); + connector()->Connect(mojom::kServiceName, + hid_manager_.BindNewPipeAndPassReceiver()); } void TearDown() override { HidManagerImpl::SetHidServiceForTesting(nullptr); } @@ -141,7 +143,7 @@ mock_hid_service_->RemoveDevice(platform_device_id); } - mojom::HidManagerPtr hid_manager_; + mojo::Remote<mojom::HidManager> hid_manager_; MockHidService* mock_hid_service_; DISALLOW_COPY_AND_ASSIGN(HidManagerTest);
diff --git a/services/network/public/cpp/ip_address_for_blink.typemap b/services/network/public/cpp/ip_address_for_blink.typemap new file mode 100644 index 0000000..05f2e9e --- /dev/null +++ b/services/network/public/cpp/ip_address_for_blink.typemap
@@ -0,0 +1,11 @@ +# 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. + +mojom = "//services/network/public/mojom/ip_address.mojom" +public_headers = [ "//net/base/ip_address.h" ] +traits_headers = [ "//services/network/public/cpp/ip_address_mojom_traits.h" ] +type_mappings = [ "network.mojom.IPAddress=::net::IPAddress" ] +public_deps = [ + "//net", +]
diff --git a/services/network/public/cpp/ip_endpoint_for_blink.typemap b/services/network/public/cpp/ip_endpoint_for_blink.typemap new file mode 100644 index 0000000..822f6688 --- /dev/null +++ b/services/network/public/cpp/ip_endpoint_for_blink.typemap
@@ -0,0 +1,11 @@ +# 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. + +mojom = "//services/network/public/mojom/ip_endpoint.mojom" +public_headers = [ "//net/base/ip_endpoint.h" ] +traits_headers = [ "//services/network/public/cpp/ip_endpoint_mojom_traits.h" ] +type_mappings = [ "network.mojom.IPEndPoint=::net::IPEndPoint" ] +public_deps = [ + "//net", +]
diff --git a/services/network/public/cpp/network_interface_for_blink.typemap b/services/network/public/cpp/network_interface_for_blink.typemap new file mode 100644 index 0000000..efcb8e0 --- /dev/null +++ b/services/network/public/cpp/network_interface_for_blink.typemap
@@ -0,0 +1,12 @@ +# 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. + +mojom = "//services/network/public/mojom/network_interface.mojom" +public_headers = [ "//net/base/network_interfaces.h" ] +traits_headers = + [ "//services/network/public/cpp/network_interface_mojom_traits.h" ] +public_deps = [ + "//net", +] +type_mappings = [ "network.mojom.NetworkInterface=::net::NetworkInterface" ]
diff --git a/services/service_manager/tests/background_service_manager_test_service_main.cc b/services/service_manager/tests/background_service_manager_test_service_main.cc index 4c2a64ea..83b450ec 100644 --- a/services/service_manager/tests/background_service_manager_test_service_main.cc +++ b/services/service_manager/tests/background_service_manager_test_service_main.cc
@@ -5,7 +5,8 @@ #include "base/bind.h" #include "base/macros.h" #include "base/task/single_thread_task_executor.h" -#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service_binding.h" @@ -21,7 +22,7 @@ TestClient(mojom::ServiceRequest request) : service_binding_(this, std::move(request)) { registry_.AddInterface(base::BindRepeating( - &TestClient::BindTestServiceRequest, base::Unretained(this))); + &TestClient::BindTestServiceReceiver, base::Unretained(this))); } ~TestClient() override = default; @@ -37,15 +38,16 @@ // mojom::TestService void Test(TestCallback callback) override { std::move(callback).Run(); } - void BindTestServiceRequest(mojom::TestServiceRequest request) { - bindings_.AddBinding(this, std::move(request)); + void BindTestServiceReceiver( + mojo::PendingReceiver<mojom::TestService> receiver) { + receivers_.Add(this, std::move(receiver)); } void Quit() override { service_binding_.RequestClose(); } ServiceBinding service_binding_; BinderRegistry registry_; - mojo::BindingSet<mojom::TestService> bindings_; + mojo::ReceiverSet<mojom::TestService> receivers_; DISALLOW_COPY_AND_ASSIGN(TestClient); };
diff --git a/services/service_manager/tests/background_service_manager_unittest.cc b/services/service_manager/tests/background_service_manager_unittest.cc index 992720a..91ed7473 100644 --- a/services/service_manager/tests/background_service_manager_unittest.cc +++ b/services/service_manager/tests/background_service_manager_unittest.cc
@@ -14,6 +14,7 @@ #include "base/values.h" #include "build/build_config.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/constants.h" #include "services/service_manager/public/cpp/manifest.h" @@ -90,9 +91,9 @@ base::Token::CreateRandom()), service.PassInterface(), mojo::NullReceiver() /* metadata_receiver */); - mojom::TestServicePtr test_service; - service_impl.connector()->BindInterface(ServiceFilter::ByName(kAppName), - &test_service); + mojo::Remote<mojom::TestService> test_service; + service_impl.connector()->Connect(ServiceFilter::ByName(kAppName), + test_service.BindNewPipeAndPassReceiver()); base::RunLoop run_loop; bool got_result = false; test_service->Test(base::BindOnce(&SetFlagAndRunClosure, &got_result,
diff --git a/services/viz/public/mojom/compositing/compositing_mode_watcher.mojom b/services/viz/public/mojom/compositing/compositing_mode_watcher.mojom index 4336cf5f..003a924 100644 --- a/services/viz/public/mojom/compositing/compositing_mode_watcher.mojom +++ b/services/viz/public/mojom/compositing/compositing_mode_watcher.mojom
@@ -12,5 +12,5 @@ // Adds a watcher to hear when the compositing mode will use software instead of // gpu. If the compositing mode is software already when the watcher is added, it // will still be notified. - AddCompositingModeWatcher(CompositingModeWatcher watcher); + AddCompositingModeWatcher(pending_remote<CompositingModeWatcher> watcher); };
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 350272a1..aaf6a62 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -1900,69 +1900,91 @@ ], "junit_tests": [ { + "name": "android_webview_junit_tests", "test": "android_webview_junit_tests" }, { + "name": "base_junit_tests", "test": "base_junit_tests" }, { + "name": "chrome_junit_tests", "test": "chrome_junit_tests" }, { + "name": "components_background_task_scheduler_junit_tests", "test": "components_background_task_scheduler_junit_tests" }, { + "name": "components_gcm_driver_junit_tests", "test": "components_gcm_driver_junit_tests" }, { + "name": "components_invalidation_impl_junit_tests", "test": "components_invalidation_impl_junit_tests" }, { + "name": "components_policy_junit_tests", "test": "components_policy_junit_tests" }, { + "name": "components_signin_junit_tests", "test": "components_signin_junit_tests" }, { + "name": "components_variations_junit_tests", "test": "components_variations_junit_tests" }, { + "name": "content_junit_tests", "test": "content_junit_tests" }, { + "name": "device_junit_tests", "test": "device_junit_tests" }, { + "name": "junit_unit_tests", "test": "junit_unit_tests" }, { + "name": "keyboard_accessory_junit_tests", "test": "keyboard_accessory_junit_tests" }, { + "name": "media_base_junit_tests", "test": "media_base_junit_tests" }, { + "name": "media_router_junit_tests", "test": "media_router_junit_tests" }, { + "name": "module_installer_junit_tests", "test": "module_installer_junit_tests" }, { + "name": "net_junit_tests", "test": "net_junit_tests" }, { + "name": "service_junit_tests", "test": "service_junit_tests" }, { + "name": "ui_junit_tests", "test": "ui_junit_tests" }, { + "name": "webapk_client_junit_tests", "test": "webapk_client_junit_tests" }, { + "name": "webapk_shell_apk_h2o_junit_tests", "test": "webapk_shell_apk_h2o_junit_tests" }, { + "name": "webapk_shell_apk_junit_tests", "test": "webapk_shell_apk_junit_tests" } ] @@ -1989,9 +2011,11 @@ ], "junit_tests": [ { + "name": "cast_base_junit_tests", "test": "cast_base_junit_tests" }, { + "name": "cast_shell_junit_tests", "test": "cast_shell_junit_tests" } ] @@ -25375,69 +25399,91 @@ ], "junit_tests": [ { + "name": "android_webview_junit_tests", "test": "android_webview_junit_tests" }, { + "name": "base_junit_tests", "test": "base_junit_tests" }, { + "name": "chrome_junit_tests", "test": "chrome_junit_tests" }, { + "name": "components_background_task_scheduler_junit_tests", "test": "components_background_task_scheduler_junit_tests" }, { + "name": "components_gcm_driver_junit_tests", "test": "components_gcm_driver_junit_tests" }, { + "name": "components_invalidation_impl_junit_tests", "test": "components_invalidation_impl_junit_tests" }, { + "name": "components_policy_junit_tests", "test": "components_policy_junit_tests" }, { + "name": "components_signin_junit_tests", "test": "components_signin_junit_tests" }, { + "name": "components_variations_junit_tests", "test": "components_variations_junit_tests" }, { + "name": "content_junit_tests", "test": "content_junit_tests" }, { + "name": "device_junit_tests", "test": "device_junit_tests" }, { + "name": "junit_unit_tests", "test": "junit_unit_tests" }, { + "name": "keyboard_accessory_junit_tests", "test": "keyboard_accessory_junit_tests" }, { + "name": "media_base_junit_tests", "test": "media_base_junit_tests" }, { + "name": "media_router_junit_tests", "test": "media_router_junit_tests" }, { + "name": "module_installer_junit_tests", "test": "module_installer_junit_tests" }, { + "name": "net_junit_tests", "test": "net_junit_tests" }, { + "name": "service_junit_tests", "test": "service_junit_tests" }, { + "name": "ui_junit_tests", "test": "ui_junit_tests" }, { + "name": "webapk_client_junit_tests", "test": "webapk_client_junit_tests" }, { + "name": "webapk_shell_apk_h2o_junit_tests", "test": "webapk_shell_apk_h2o_junit_tests" }, { + "name": "webapk_shell_apk_junit_tests", "test": "webapk_shell_apk_junit_tests" } ] @@ -26292,7 +26338,6 @@ "--gs-results-bucket=chromium-result-details", "--recover-devices" ], - "experiment_percentage": 100, "merge": { "args": [ "--bucket",
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index b52c9e3..d83cccf4 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -7541,69 +7541,91 @@ ], "junit_tests": [ { + "name": "android_webview_junit_tests", "test": "android_webview_junit_tests" }, { + "name": "base_junit_tests", "test": "base_junit_tests" }, { + "name": "chrome_junit_tests", "test": "chrome_junit_tests" }, { + "name": "components_background_task_scheduler_junit_tests", "test": "components_background_task_scheduler_junit_tests" }, { + "name": "components_gcm_driver_junit_tests", "test": "components_gcm_driver_junit_tests" }, { + "name": "components_invalidation_impl_junit_tests", "test": "components_invalidation_impl_junit_tests" }, { + "name": "components_policy_junit_tests", "test": "components_policy_junit_tests" }, { + "name": "components_signin_junit_tests", "test": "components_signin_junit_tests" }, { + "name": "components_variations_junit_tests", "test": "components_variations_junit_tests" }, { + "name": "content_junit_tests", "test": "content_junit_tests" }, { + "name": "device_junit_tests", "test": "device_junit_tests" }, { + "name": "junit_unit_tests", "test": "junit_unit_tests" }, { + "name": "keyboard_accessory_junit_tests", "test": "keyboard_accessory_junit_tests" }, { + "name": "media_base_junit_tests", "test": "media_base_junit_tests" }, { + "name": "media_router_junit_tests", "test": "media_router_junit_tests" }, { + "name": "module_installer_junit_tests", "test": "module_installer_junit_tests" }, { + "name": "net_junit_tests", "test": "net_junit_tests" }, { + "name": "service_junit_tests", "test": "service_junit_tests" }, { + "name": "ui_junit_tests", "test": "ui_junit_tests" }, { + "name": "webapk_client_junit_tests", "test": "webapk_client_junit_tests" }, { + "name": "webapk_shell_apk_h2o_junit_tests", "test": "webapk_shell_apk_h2o_junit_tests" }, { + "name": "webapk_shell_apk_junit_tests", "test": "webapk_shell_apk_junit_tests" } ] @@ -7664,6 +7686,7 @@ ], "junit_tests": [ { + "name": "base_junit_tests", "test": "base_junit_tests" } ]
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index efa27148..c4c0e09 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -7494,69 +7494,91 @@ ], "junit_tests": [ { + "name": "android_webview_junit_tests", "test": "android_webview_junit_tests" }, { + "name": "base_junit_tests", "test": "base_junit_tests" }, { + "name": "chrome_junit_tests", "test": "chrome_junit_tests" }, { + "name": "components_background_task_scheduler_junit_tests", "test": "components_background_task_scheduler_junit_tests" }, { + "name": "components_gcm_driver_junit_tests", "test": "components_gcm_driver_junit_tests" }, { + "name": "components_invalidation_impl_junit_tests", "test": "components_invalidation_impl_junit_tests" }, { + "name": "components_policy_junit_tests", "test": "components_policy_junit_tests" }, { + "name": "components_signin_junit_tests", "test": "components_signin_junit_tests" }, { + "name": "components_variations_junit_tests", "test": "components_variations_junit_tests" }, { + "name": "content_junit_tests", "test": "content_junit_tests" }, { + "name": "device_junit_tests", "test": "device_junit_tests" }, { + "name": "junit_unit_tests", "test": "junit_unit_tests" }, { + "name": "keyboard_accessory_junit_tests", "test": "keyboard_accessory_junit_tests" }, { + "name": "media_base_junit_tests", "test": "media_base_junit_tests" }, { + "name": "media_router_junit_tests", "test": "media_router_junit_tests" }, { + "name": "module_installer_junit_tests", "test": "module_installer_junit_tests" }, { + "name": "net_junit_tests", "test": "net_junit_tests" }, { + "name": "service_junit_tests", "test": "service_junit_tests" }, { + "name": "ui_junit_tests", "test": "ui_junit_tests" }, { + "name": "webapk_client_junit_tests", "test": "webapk_client_junit_tests" }, { + "name": "webapk_shell_apk_h2o_junit_tests", "test": "webapk_shell_apk_h2o_junit_tests" }, { + "name": "webapk_shell_apk_junit_tests", "test": "webapk_shell_apk_junit_tests" } ]
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 4aa93ad..0490998 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -7090,7 +7090,7 @@ "--browser=android-chromium", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer", "--dont-restore-color-profile-after-test", "--os-type", "android", @@ -10837,7 +10837,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer", "--dont-restore-color-profile-after-test", "--os-type", "linux", @@ -11383,7 +11383,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer", "--dont-restore-color-profile-after-test", "--os-type", "linux", @@ -23089,6 +23089,31 @@ "gtest_tests": [ { "args": [ + "--use-gpu-in-tests", + "--test-launcher-retry-limit=0" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.6912", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "expiration": 21600, + "shards": 4 + }, + "test": "angle_end2end_tests" + }, + { + "args": [ "--use-gpu-in-tests" ], "merge": { @@ -23437,33 +23462,6 @@ "isolated_scripts": [ { "args": [ - "--gtest-benchmark-name=angle_perftests", - "-v", - "--one-frame-only" - ], - "isolate_name": "angle_perftests", - "merge": { - "args": [ - "--smoke-test-mode" - ], - "script": "//tools/perf/process_perf_results.py" - }, - "name": "angle_perftests", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "8086:5912-26.20.100.6912", - "os": "Windows-10", - "pool": "Chrome-GPU" - } - ], - "expiration": 21600 - } - }, - { - "args": [ "context_lost", "--show-stdout", "--browser=release_x64",
diff --git a/testing/buildbot/filters/bfcache.browser_tests.filter b/testing/buildbot/filters/bfcache.browser_tests.filter index 51f73e0..a996f34c 100644 --- a/testing/buildbot/filters/bfcache.browser_tests.filter +++ b/testing/buildbot/filters/bfcache.browser_tests.filter
@@ -20,9 +20,3 @@ # Very flaky. Can't reproduce locally, it always succeed. -SystemNetworkContextManagerMaxConnectionsPerProxyBrowsertest.MaxConnectionsPerProxy - -# RenderWidget owned by an iframe used OnClose() method. -# Check failed: popup_ || pepper_fullscreen_. -# https://crbug.com/992891 --DeclarativeNetRequestBrowserTest.BlockRequests_Domains/0 --DeclarativeNetRequestBrowserTest.BlockRequests_Domains/1
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py index bb6471f..49cfea3 100755 --- a/testing/buildbot/generate_buildbot_json.py +++ b/testing/buildbot/generate_buildbot_json.py
@@ -638,7 +638,8 @@ test_config): return None result = { - 'test': test_name, + 'name': test_name, + 'test': test_config.get('test', test_name), } return result
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py index 72386fe..9f34dc92 100755 --- a/testing/buildbot/generate_buildbot_json_unittest.py +++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -1283,6 +1283,7 @@ "Fake Tester": { "junit_tests": [ { + "name": "foo_test", "test": "foo_test" } ]
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index e654111..8566d4d 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -37,8 +37,6 @@ # Temporarily disabled due to bad NVIDIA driver upgrade crbug.com/950542 'Linux FYI Debug (NVIDIA)', 'Linux FYI GPU TSAN Release', - # https://crbug.com/1002313 - 'Win10 FYI x64 Exp Release (Intel HD 630)', ], }, 'angle_perftests': { @@ -46,6 +44,7 @@ 'Android FYI Release (Nexus 5)', # crbug.com/915429 'Android FYI Release (Nexus 6)', # anglebug.com/2433 'Linux FYI GPU TSAN Release', # crbug.com/950542 + 'Win10 FYI x64 Exp Release (Intel HD 630)', # crbug.com/1002313 ], }, 'angle_unittests': { @@ -301,11 +300,6 @@ 'shards': 12, }, }, - 'android-marshmallow-arm64-rel': { - # TODO(crbug.com/731759): Enable this once we're confident that it - # passes. - 'experiment_percentage': 100, - }, 'KitKat Phone Tester (dbg)': { 'swarming': { 'shards': 20,
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index a0a36ed..d89479a8 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -3798,7 +3798,7 @@ '${got_revision}', '--test-machine-name', '${buildername}', - '--extra-browser-args=--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback', + '--extra-browser-args=--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer', ], 'precommit_args': [ # Gerrit issue ID
diff --git a/testing/buildbot/tryserver.chromium.android.json b/testing/buildbot/tryserver.chromium.android.json index de0af5d..fdbb364 100644 --- a/testing/buildbot/tryserver.chromium.android.json +++ b/testing/buildbot/tryserver.chromium.android.json
@@ -2883,69 +2883,91 @@ ], "junit_tests": [ { + "name": "android_webview_junit_tests", "test": "android_webview_junit_tests" }, { + "name": "base_junit_tests", "test": "base_junit_tests" }, { + "name": "chrome_junit_tests", "test": "chrome_junit_tests" }, { + "name": "components_background_task_scheduler_junit_tests", "test": "components_background_task_scheduler_junit_tests" }, { + "name": "components_gcm_driver_junit_tests", "test": "components_gcm_driver_junit_tests" }, { + "name": "components_invalidation_impl_junit_tests", "test": "components_invalidation_impl_junit_tests" }, { + "name": "components_policy_junit_tests", "test": "components_policy_junit_tests" }, { + "name": "components_signin_junit_tests", "test": "components_signin_junit_tests" }, { + "name": "components_variations_junit_tests", "test": "components_variations_junit_tests" }, { + "name": "content_junit_tests", "test": "content_junit_tests" }, { + "name": "device_junit_tests", "test": "device_junit_tests" }, { + "name": "junit_unit_tests", "test": "junit_unit_tests" }, { + "name": "keyboard_accessory_junit_tests", "test": "keyboard_accessory_junit_tests" }, { + "name": "media_base_junit_tests", "test": "media_base_junit_tests" }, { + "name": "media_router_junit_tests", "test": "media_router_junit_tests" }, { + "name": "module_installer_junit_tests", "test": "module_installer_junit_tests" }, { + "name": "net_junit_tests", "test": "net_junit_tests" }, { + "name": "service_junit_tests", "test": "service_junit_tests" }, { + "name": "ui_junit_tests", "test": "ui_junit_tests" }, { + "name": "webapk_client_junit_tests", "test": "webapk_client_junit_tests" }, { + "name": "webapk_shell_apk_h2o_junit_tests", "test": "webapk_shell_apk_h2o_junit_tests" }, { + "name": "webapk_shell_apk_junit_tests", "test": "webapk_shell_apk_junit_tests" } ]
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py b/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py index a2a9aae..9c71fc2f 100644 --- a/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py +++ b/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py
@@ -51,7 +51,7 @@ self.is_partial = is_partial self.inherited = inherited - self.own_members = own_members + self.own_members = list(own_members) def iter_all_members(self): return iter(self.own_members)
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py index 7e4f154..f34e7a6 100644 --- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py +++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
@@ -84,11 +84,12 @@ # Merge mixins. self._merge_interface_mixins() - self._group_overloaded_functions() - # Process inheritances. self._process_interface_inheritances() + # Make groups of overloaded functions including inherited ones. + self._group_overloaded_functions() + # Updates on IRs are finished. Create API objects. self._create_public_objects() @@ -246,28 +247,9 @@ make_copy(to_be_merged.operations)) self._ir_map.add(new_interface) - def _group_overloaded_functions(self): - old_interfaces = self._ir_map.irs_of_kind(IRMap.IR.Kind.INTERFACE) - - self._ir_map.move_to_new_phase() - - for old_interface in old_interfaces: - assert not old_interface.operation_groups - new_interface = make_copy(old_interface) - - sort_key = lambda x: x.identifier - sorted_operations = sorted(new_interface.operations, key=sort_key) - new_interface.operation_groups = [ - OperationGroup.IR(operations=list(operations)) - for identifier, operations in itertools.groupby( - sorted_operations, key=sort_key) if identifier - ] - - self._ir_map.add(new_interface) - def _process_interface_inheritances(self): def is_own_member(member): - return 'Unfogeable' in member.extended_attributes + return 'Unforgeable' in member.extended_attributes def create_inheritance_stack(obj, table): if obj.inherited is None: @@ -294,6 +276,25 @@ ]) self._ir_map.add(new_interface) + def _group_overloaded_functions(self): + old_interfaces = self._ir_map.irs_of_kind(IRMap.IR.Kind.INTERFACE) + + self._ir_map.move_to_new_phase() + + for old_interface in old_interfaces: + assert not old_interface.operation_groups + new_interface = make_copy(old_interface) + + sort_key = lambda x: x.identifier + sorted_operations = sorted(new_interface.operations, key=sort_key) + new_interface.operation_groups = [ + OperationGroup.IR(operations=list(operations)) + for identifier, operations in itertools.groupby( + sorted_operations, key=sort_key) if identifier + ] + + self._ir_map.add(new_interface) + def _create_public_objects(self): """Creates public representations of compiled objects.""" for ir in self._ir_map.irs_of_kind(IRMap.IR.Kind.INTERFACE):
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/interface.py b/third_party/blink/renderer/bindings/scripts/web_idl/interface.py index 5ef3c3c..a1ba381 100644 --- a/third_party/blink/renderer/bindings/scripts/web_idl/interface.py +++ b/third_party/blink/renderer/bindings/scripts/web_idl/interface.py
@@ -174,22 +174,33 @@ return self._attributes @property - def operation_groups(self): - """ - Returns groups of operations, including [Unforgeable] operations in - ancestors. Operation groups are sorted by their identifier. - - All operations are grouped by their identifier in OperationGroup's, - even when there exists a single operation with that identifier. - """ - assert False, "Not implemented yet." - - @property def constants(self): """Returns constants.""" return self._constants @property + def operations(self): + """ + Returns all operations, including special operations without an + identifier, as well as [Unforgeable] operations in ancestors. + """ + return self._operations + + @property + def operation_groups(self): + """ + Returns groups of overloaded operations, including [Unforgeable] + operations in ancestors. + + All operations that have an identifier are grouped by identifier, thus + it's possible that there is a single operation in a certain operation + group. If an operation doesn't have an identifier, i.e. if it's a + merely special operation, then the operation doesn't appear in any + operation group. + """ + return self._operation_groups + + @property def constructors(self): """Returns a constructor group.""" assert False, "Not implemented yet."
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS index 2783c53..61297fef 100644 --- a/third_party/blink/renderer/core/DEPS +++ b/third_party/blink/renderer/core/DEPS
@@ -120,5 +120,8 @@ ], "element_test.cc": [ "+third_party/blink/renderer/core/exported/web_plugin_container_impl.h" + ], + "html_canvas_painter_test.cc": [ + "+components/viz/test/test_context_provider.h", ] }
diff --git a/third_party/blink/renderer/core/accessibility/apply_dark_mode.cc b/third_party/blink/renderer/core/accessibility/apply_dark_mode.cc index 12068983..17ee26c9 100644 --- a/third_party/blink/renderer/core/accessibility/apply_dark_mode.cc +++ b/third_party/blink/renderer/core/accessibility/apply_dark_mode.cc
@@ -39,6 +39,13 @@ kBrightnessThreshold; } +bool IsDarkModeEnabled(const Settings& frame_settings) { + static bool isDarkModeEnabledByFeatureFlag = + features::kForceDarkInversionMethodParam.Get() != + ForceDarkInversionMethod::kUseBlinkSettings; + return isDarkModeEnabledByFeatureFlag || frame_settings.GetDarkModeEnabled(); +} + DarkModeInversionAlgorithm GetMode(const Settings& frame_settings) { switch (features::kForceDarkInversionMethodParam.Get()) { case ForceDarkInversionMethod::kUseBlinkSettings: @@ -129,7 +136,8 @@ DarkModeSettings BuildDarkModeSettings(const Settings& frame_settings, const LayoutView& root) { - if (ShouldApplyDarkModeFilterToPage(frame_settings.GetDarkModePagePolicy(), + if (IsDarkModeEnabled(frame_settings) && + ShouldApplyDarkModeFilterToPage(frame_settings.GetDarkModePagePolicy(), root)) { return GetCachedEnabledSettings(frame_settings); }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index c61f6b3d..e34f541 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -127,6 +127,7 @@ #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" #include "third_party/blink/renderer/core/html/parser/nesting_level_incrementer.h" #include "third_party/blink/renderer/core/input/event_handler.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/intersection_observer/element_intersection_observer_data.h" #include "third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h" #include "third_party/blink/renderer/core/invisible_dom/activate_invisible_event.h" @@ -427,6 +428,55 @@ return candidate.IsDescendantOf(document_element); } +// The first algorithm in +// https://html.spec.whatwg.org/C/#the-autofocus-attribute +void EnqueueAutofocus(Element& element) { + // When an element with the autofocus attribute specified is inserted into a + // document, run the following steps: + DCHECK(element.isConnected()); + if (!element.IsAutofocusable()) + return; + + // 1. If the user has indicated (for example, by starting to type in a form + // control) that they do not wish focus to be changed, then optionally return. + + // We don't implement this optional step. If other browsers have such + // behavior, we should follow it or standardize it. + + // 2. Let target be the element's node document. + Document& doc = element.GetDocument(); + + // 3. If target's browsing context is null, then return. + if (!doc.GetFrame()) + return; + + // 4. If target's active sandboxing flag set has the sandboxed automatic + // features browsing context flag, then return. + if (doc.IsSandboxed(WebSandboxFlags::kAutomaticFeatures)) { + doc.AddConsoleMessage(ConsoleMessage::Create( + mojom::ConsoleMessageSource::kSecurity, + mojom::ConsoleMessageLevel::kError, + "Blocked autofocusing on a form control because the form's frame is " + "sandboxed and the 'allow-scripts' permission is not set.")); + return; + } + + // 5. Let topDocument be the active document of target's browsing context's + // top-level browsing context. + // 6. If target's origin is not the same as the origin of topDocument, + // then return. + if (!doc.IsInMainFrame() && + !doc.TopFrameOrigin()->CanAccess(doc.GetSecurityOrigin())) { + doc.AddConsoleMessage(ConsoleMessage::Create( + mojom::ConsoleMessageSource::kSecurity, + mojom::ConsoleMessageLevel::kError, + "Blocked autofocusing on a form control in a cross-origin subframe.")); + return; + } + + element.GetDocument().TopDocument().EnqueueAutofocusCandidate(element); +} + } // namespace Element* Element::Create(const QualifiedName& tag_name, Document* document) { @@ -2519,6 +2569,8 @@ } if (isConnected()) { + EnqueueAutofocus(*this); + if (GetCustomElementState() == CustomElementState::kCustom) CustomElement::EnqueueConnectedCallback(*this); else if (IsUpgradedV0CustomElement()) @@ -4034,6 +4086,13 @@ !DisplayLockPreventsActivation(); } +bool Element::IsAutofocusable() const { + // https://html.spec.whatwg.org/C/#global-attributes + // https://svgwg.org/svg2-draft/struct.html#autofocusattribute + return (IsHTMLElement() || IsSVGElement()) && + FastHasAttribute(html_names::kAutofocusAttr); +} + bool Element::ActivateDisplayLockIfNeeded() { if (!RuntimeEnabledFeatures::DisplayLockingEnabled() || GetDocument().LockedDisplayLockCount() ==
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 1ea4677..af7ec18 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -672,6 +672,7 @@ virtual bool IsMouseFocusable() const; bool IsFocusedElementInDocument() const; Element* AdjustedFocusedElementInTreeScope() const; + bool IsAutofocusable() const; virtual void DispatchFocusEvent( Element* old_focused_element,
diff --git a/third_party/blink/renderer/core/frame/settings.cc b/third_party/blink/renderer/core/frame/settings.cc index 90fa96b..a5781d54 100644 --- a/third_party/blink/renderer/core/frame/settings.cc +++ b/third_party/blink/renderer/core/frame/settings.cc
@@ -107,14 +107,7 @@ if (force_dark_mode_ == enabled) return; force_dark_mode_ = enabled; - - if (force_dark_mode_) { - SetDarkModeInversionAlgorithm( - DarkModeInversionAlgorithm::kInvertLightnessLAB); - SetDarkModeImagePolicy(DarkModeImagePolicy::kFilterSmart); - } else { - SetDarkModeInversionAlgorithm(DarkModeInversionAlgorithm::kOff); - } + SetDarkModeEnabled(force_dark_mode_); Invalidate(SettingsDelegate::kColorSchemeChange); }
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index 3f13f65..1280d222 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -883,8 +883,13 @@ // Dark mode // { + name: "darkModeEnabled", + initial: false, + invalidate: "Paint", + }, + { name: "darkModeInversionAlgorithm", - initial: "DarkModeInversionAlgorithm::kOff", + initial: "DarkModeInversionAlgorithm::kInvertLightnessLAB", type: "DarkModeInversionAlgorithm", invalidate: "Paint", },
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics.cc b/third_party/blink/renderer/core/html/anchor_element_metrics.cc index 44b251a1..cc6fd74 100644 --- a/third_party/blink/renderer/core/html/anchor_element_metrics.cc +++ b/third_party/blink/renderer/core/html/anchor_element_metrics.cc
@@ -283,10 +283,15 @@ if (!anchor_element.Href().ProtocolIsInHTTPFamily()) continue; - if (anchor_element.VisibleBoundsInVisualViewport().IsEmpty() && - (!anchor_element.GetDocument().GetFrame() || - !GetRootDocument(anchor_element) || - !IsUrlIncrementedByOne(anchor_element))) { + // If the anchor doesn't have a valid frame/root document, skip it. + if (!anchor_element.GetDocument().GetFrame() || + !GetRootDocument(anchor_element)) { + continue; + } + + // Only anchors with width/height should be evaluated. + if (!anchor_element.GetLayoutObject() || + anchor_element.GetLayoutObject()->AbsoluteBoundingBoxRect().IsEmpty()) { continue; } @@ -297,9 +302,9 @@ anchor_elements_metrics.push_back(anchor_metric.value().CreateMetricsPtr()); - // Webpages with more than 40 anchors will stop processing at the 40th + // Webpages with more than 100 anchors will stop processing at the 100th // anchor element. - if (anchor_elements_metrics.size() >= 40) + if (anchor_elements_metrics.size() >= 100) break; }
diff --git a/third_party/blink/renderer/core/html/forms/file_chooser.cc b/third_party/blink/renderer/core/html/forms/file_chooser.cc index 834ba4e..fcffa28 100644 --- a/third_party/blink/renderer/core/html/forms/file_chooser.cc +++ b/third_party/blink/renderer/core/html/forms/file_chooser.cc
@@ -28,7 +28,7 @@ #include "third_party/blink/renderer/core/html/forms/file_chooser.h" -#include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/platform/file_path_conversion.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/page/chrome_client_impl.h" @@ -73,9 +73,10 @@ if (!frame) return false; chrome_client_impl_ = chrome_client_impl; - frame->GetInterfaceProvider().GetInterface( - &file_chooser_, frame->GetTaskRunner(TaskType::kInternalDefault)); - file_chooser_.set_connection_error_handler( + frame->GetBrowserInterfaceBroker().GetInterface( + file_chooser_.BindNewPipeAndPassReceiver( + frame->GetTaskRunner(TaskType::kInternalDefault))); + file_chooser_.set_disconnect_handler( WTF::Bind(&FileChooser::DidCloseChooser, WTF::Unretained(this))); file_chooser_->OpenFileChooser( params_.Clone(), @@ -93,9 +94,10 @@ if (!frame) return; DCHECK(!chrome_client_impl_); - frame->GetInterfaceProvider().GetInterface( - &file_chooser_, frame->GetTaskRunner(TaskType::kInternalDefault)); - file_chooser_.set_connection_error_handler( + frame->GetBrowserInterfaceBroker().GetInterface( + file_chooser_.BindNewPipeAndPassReceiver( + frame->GetTaskRunner(TaskType::kInternalDefault))); + file_chooser_.set_disconnect_handler( WTF::Bind(&FileChooser::DidCloseChooser, WTF::Unretained(this))); file_chooser_->EnumerateChosenDirectory( std::move(params_->selected_files[0]), @@ -143,8 +145,8 @@ } void FileChooser::DidCloseChooser() { - // Close the binding explicitly to avoid this function is called again as a - // connection error handler. + // Close the remote explicitly to avoid this function to be called again as a + // disconnect handler. file_chooser_.reset(); // Some cleanup for OpenFileChooser() path.
diff --git a/third_party/blink/renderer/core/html/forms/file_chooser.h b/third_party/blink/renderer/core/html/forms/file_chooser.h index fc4d926..a98154b 100644 --- a/third_party/blink/renderer/core/html/forms/file_chooser.h +++ b/third_party/blink/renderer/core/html/forms/file_chooser.h
@@ -30,7 +30,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_FILE_CHOOSER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_FILE_CHOOSER_H_ -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/choosers/file_chooser.mojom-blink.h" #include "third_party/blink/renderer/core/page/popup_opening_observer.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -99,7 +99,7 @@ WeakPersistent<FileChooserClient> client_; mojom::blink::FileChooserParamsPtr params_; Persistent<ChromeClientImpl> chrome_client_impl_; - mojom::blink::FileChooserPtr file_chooser_; + mojo::Remote<mojom::blink::FileChooser> file_chooser_; }; CORE_EXPORT mojom::blink::FileChooserFileInfoPtr
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc index 3e63afe..bdf321a 100644 --- a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc +++ b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
@@ -140,7 +140,7 @@ auto& input = *ToHTMLInputElement(doc.body()->firstChild()); base::RunLoop run_loop; - MockFileChooser chooser(&doc.GetFrame()->GetInterfaceProvider(), + MockFileChooser chooser(doc.GetFrame()->GetBrowserInterfaceBroker(), run_loop.QuitClosure()); DragData drag_data(DataObject::Create(), FloatPoint(), FloatPoint(), kDragOperationCopy);
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc index 79460a1..9295436 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -203,10 +203,6 @@ return true; } -bool HTMLButtonElement::SupportsAutofocus() const { - return true; -} - bool HTMLButtonElement::MatchesDefaultPseudoClass() const { // HTMLFormElement::findDefaultButton() traverses the tree. So we check // canBeSuccessfulSubmitButton() first for early return.
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h index 77b2eb56f..e1685752 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.h +++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -64,7 +64,6 @@ bool IsLabelable() const override { return true; } bool TypeShouldForceLegacyLayout() const final { return true; } bool IsInteractiveContent() const override; - bool SupportsAutofocus() const override; bool MatchesDefaultPseudoClass() const override; bool CanBeSuccessfulSubmitButton() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.idl b/third_party/blink/renderer/core/html/forms/html_button_element.idl index 9f41e83a..ab21763b 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_button_element.idl
@@ -23,7 +23,6 @@ Exposed=Window, HTMLConstructor ] interface HTMLButtonElement : HTMLElement { - [CEReactions, Reflect] attribute boolean autofocus; [CEReactions, Reflect] attribute boolean disabled; [ImplementedAs=formOwner] readonly attribute HTMLFormElement? form; [CEReactions, RaisesException=Setter] attribute URLString formAction;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc index c134f90..aa18e645 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -33,7 +33,6 @@ #include "third_party/blink/renderer/core/html/forms/html_form_element.h" #include "third_party/blink/renderer/core/html/forms/validity_state.h" #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" -#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" @@ -179,14 +178,6 @@ return IsDisabledFormControl() || IsReadOnly(); } -bool HTMLFormControlElement::SupportsAutofocus() const { - return false; -} - -bool HTMLFormControlElement::IsAutofocusable() const { - return FastHasAttribute(kAutofocusAttr) && SupportsAutofocus(); -} - void HTMLFormControlElement::SetAutofillState(WebAutofillState autofill_state) { if (autofill_state == autofill_state_) return; @@ -214,57 +205,6 @@ return g_empty_atom; } -// The first algorithm in -// https://html.spec.whatwg.org/C/#the-autofocus-attribute -static bool ShouldAutofocus(const HTMLFormControlElement* element) { - // When an element with the autofocus attribute specified is inserted into a - // document, run the following steps: - if (!element->isConnected()) - return false; - if (!element->IsAutofocusable()) - return false; - - // 1. If the user has indicated (for example, by starting to type in a form - // control) that they do not wish focus to be changed, then optionally return. - - // We don't implement this optional step. If other browsers have such - // behavior, we should follow it or standardize it. - - // 2. Let target be the element's node document. - Document& doc = element->GetDocument(); - - // 3. If target's browsing context is null, then return. - if (!doc.GetFrame()) - return false; - - // 4. If target's active sandboxing flag set has the sandboxed automatic - // features browsing context flag, then return. - if (doc.IsSandboxed(WebSandboxFlags::kAutomaticFeatures)) { - doc.AddConsoleMessage(ConsoleMessage::Create( - mojom::ConsoleMessageSource::kSecurity, - mojom::ConsoleMessageLevel::kError, - "Blocked autofocusing on a form control because the form's frame is " - "sandboxed and the 'allow-scripts' permission is not set.")); - return false; - } - - // 5. Let topDocument be the active document of target's browsing context's - // top-level browsing context. - // 6. If target's origin is not the same as the origin of topDocument, - // then return. - if (!doc.IsInMainFrame() && - !doc.TopFrameOrigin()->CanAccess(doc.GetSecurityOrigin())) { - doc.AddConsoleMessage(ConsoleMessage::Create( - mojom::ConsoleMessageSource::kSecurity, - mojom::ConsoleMessageLevel::kError, - "Blocked autofocusing on a form control in a cross-origin subframe.")); - return false; - } - - // Will call Document::EnqueueAutofocusCandidate() with |element|. - return true; -} - void HTMLFormControlElement::AttachLayoutTree(AttachContext& context) { HTMLElement::AttachLayoutTree(context); @@ -286,9 +226,6 @@ ContainerNode& insertion_point) { HTMLElement::InsertedInto(insertion_point); ListedElement::InsertedInto(insertion_point); - - if (ShouldAutofocus(this)) - GetDocument().TopDocument().EnqueueAutofocusCandidate(*this); return kInsertionDone; }
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h index df09c198..dd72657 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -96,8 +96,6 @@ bool IsReadOnly() const; bool IsDisabledOrReadOnly() const; - bool IsAutofocusable() const; - bool MayTriggerVirtualKeyboard() const override; WebAutofillState GetAutofillState() const { return autofill_state_; } @@ -153,7 +151,6 @@ void DidRecalcStyle(const StyleRecalcChange) override; virtual void ResetImpl() {} - virtual bool SupportsAutofocus() const; private: bool IsFormControlElement() const final { return true; }
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index fdb9ca0..09f6b4a 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -1941,10 +1941,6 @@ return input_type_->IsInteractiveContent(); } -bool HTMLInputElement::SupportsAutofocus() const { - return input_type_->IsInteractiveContent(); -} - scoped_refptr<ComputedStyle> HTMLInputElement::CustomStyleForLayoutObject() { return input_type_view_->CustomStyleForLayoutObject( OriginalStyleForLayoutObject());
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h index e6c85fb..e814d2e 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.h +++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -369,7 +369,6 @@ bool CanBeSuccessfulSubmitButton() const final; void ResetImpl() final; - bool SupportsAutofocus() const final; EventDispatchHandlingState* PreDispatchEventHandler(Event&) final; void PostDispatchEventHandler(Event&, EventDispatchHandlingState*) final;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.idl b/third_party/blink/renderer/core/html/forms/html_input_element.idl index 31b6b8e..fe03008 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_input_element.idl
@@ -31,7 +31,6 @@ [CEReactions, Reflect] attribute DOMString accept; [CEReactions, Reflect] attribute DOMString alt; [CEReactions, ImplementedAs=IDLExposedAutofillValue] attribute DOMString autocomplete; - [CEReactions, Reflect] attribute boolean autofocus; [CEReactions, Reflect=checked] attribute boolean defaultChecked; attribute boolean checked; [CEReactions, Reflect] attribute DOMString dirName;
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc index 8cc31129..773f57fa 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1851,10 +1851,6 @@ return true; } -bool HTMLSelectElement::SupportsAutofocus() const { - return true; -} - void HTMLSelectElement::Trace(Visitor* visitor) { visitor->Trace(list_items_); visitor->Trace(last_on_change_option_);
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.h b/third_party/blink/renderer/core/html/forms/html_select_element.h index 613dcfa5..3d010de 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_element.h +++ b/third_party/blink/renderer/core/html/forms/html_select_element.h
@@ -194,7 +194,6 @@ bool IsEnumeratable() const override { return true; } bool IsInteractiveContent() const override; - bool SupportsAutofocus() const override; bool IsLabelable() const override { return true; } FormControlState SaveFormControlState() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.idl b/third_party/blink/renderer/core/html/forms/html_select_element.idl index feaf76f..d5fde8e 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_select_element.idl
@@ -25,7 +25,6 @@ HTMLConstructor ] interface HTMLSelectElement : HTMLElement { [CEReactions, ImplementedAs=IDLExposedAutofillValue] attribute DOMString autocomplete; - [CEReactions, Reflect] attribute boolean autofocus; [CEReactions, Reflect] attribute boolean disabled; [ImplementedAs=formOwner] readonly attribute HTMLFormElement? form; [CEReactions, Reflect] attribute boolean multiple;
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc index 8030e87..9af1a81 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -613,10 +613,6 @@ return true; } -bool HTMLTextAreaElement::SupportsAutofocus() const { - return true; -} - void HTMLTextAreaElement::CloneNonAttributePropertiesFrom( const Element& source, CloneChildrenFlag flag) {
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.h b/third_party/blink/renderer/core/html/forms/html_text_area_element.h index 8bbd305ac..4980524 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.h +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
@@ -101,7 +101,6 @@ bool IsEnumeratable() const override { return true; } bool IsInteractiveContent() const override; - bool SupportsAutofocus() const override; bool IsLabelable() const override { return true; } const AtomicString& FormControlType() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.idl b/third_party/blink/renderer/core/html/forms/html_text_area_element.idl index 4e1376f..591be34 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.idl
@@ -25,7 +25,6 @@ HTMLConstructor ] interface HTMLTextAreaElement : HTMLElement { [CEReactions, ImplementedAs=IDLExposedAutofillValue] attribute DOMString autocomplete; - [CEReactions, Reflect] attribute boolean autofocus; [CEReactions] attribute unsigned long cols; [CEReactions, Reflect] attribute DOMString dirName; [CEReactions, Reflect] attribute boolean disabled;
diff --git a/third_party/blink/renderer/core/html/forms/mock_file_chooser.h b/third_party/blink/renderer/core/html/forms/mock_file_chooser.h index 2058d12..76e0d3c 100644 --- a/third_party/blink/renderer/core/html/forms/mock_file_chooser.h +++ b/third_party/blink/renderer/core/html/forms/mock_file_chooser.h
@@ -5,8 +5,8 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_MOCK_FILE_CHOOSER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_MOCK_FILE_CHOOSER_H_ -#include "mojo/public/cpp/bindings/binding_set.h" -#include "services/service_manager/public/cpp/interface_provider.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/choosers/file_chooser.mojom-blink.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -16,24 +16,25 @@ using FileChooser = mojom::blink::FileChooser; using FileChooserFileInfoPtr = mojom::blink::FileChooserFileInfoPtr; using FileChooserParamsPtr = mojom::blink::FileChooserParamsPtr; - using FileChooserRequest = mojom::blink::FileChooserRequest; public: // |reached_callback| is called when OpenFileChooser() or // |EnumerateChosenDirectory() is called. - MockFileChooser(service_manager::InterfaceProvider* provider, + MockFileChooser(blink::BrowserInterfaceBrokerProxy& broker, base::OnceClosure reached_callback) - : provider_(provider), reached_callback_(std::move(reached_callback)) { - service_manager::InterfaceProvider::TestApi test_api(provider); - test_api.SetBinderForName( + : broker_(broker), reached_callback_(std::move(reached_callback)) { + broker.SetBinderForTesting( FileChooser::Name_, - WTF::BindRepeating(&MockFileChooser::OnFileChooserRequest, + WTF::BindRepeating(&MockFileChooser::BindFileChooserReceiver, WTF::Unretained(this))); } ~MockFileChooser() override { - service_manager::InterfaceProvider::TestApi test_api(provider_); - test_api.ClearBinderForName(FileChooser::Name_); + broker_.SetBinderForTesting(FileChooser::Name_, {}); + } + + void SetQuitClosure(base::OnceClosure reached_callback) { + reached_callback_ = std::move(reached_callback); } void ResponseOnOpenFileChooser(FileChooserFileInfoList files) { @@ -42,12 +43,12 @@ "be called beforehand."; std::move(callback_).Run(mojom::blink::FileChooserResult::New( std::move(files), base::FilePath())); - bindings_.FlushForTesting(); + receivers_.FlushForTesting(); } private: - void OnFileChooserRequest(mojo::ScopedMessagePipeHandle handle) { - bindings_.AddBinding(this, FileChooserRequest(std::move(handle))); + void BindFileChooserReceiver(mojo::ScopedMessagePipeHandle handle) { + receivers_.Add(this, mojo::PendingReceiver<FileChooser>(std::move(handle))); } void OpenFileChooser(FileChooserParamsPtr params, @@ -67,8 +68,8 @@ std::move(reached_callback_).Run(); } - service_manager::InterfaceProvider* provider_; - mojo::BindingSet<FileChooser> bindings_; + blink::BrowserInterfaceBrokerProxy& broker_; + mojo::ReceiverSet<FileChooser> receivers_; OpenFileChooserCallback callback_; FileChooserParamsPtr params_; base::OnceClosure reached_callback_;
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css index b4969a72..bbc7b477 100644 --- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css +++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
@@ -4,7 +4,7 @@ */ body { - font: 12px "Segoe UI", system-ui, Roboto, Ubuntu, sans-serif; + font: 12px sans-serif; } .calendar-picker { @@ -41,11 +41,15 @@ } .calendar-navigation-button:hover { - background-color: #F3F3F3; + background-color: #E5E5E5; } .calendar-navigation-button:disabled { - color: #C5C5C5; + background-color: #FFFFFF; +} + +.calendar-navigation-button:disabled path { + fill: rgba(16, 16, 16, 0.3);; } .calendar-title { @@ -55,19 +59,33 @@ } .month-popup-button { - border-width: 0px !important; + border: 0 !important; font-weight: bold; padding: 0; } +.month-popup-button:focus { + outline: auto 1px -webkit-focus-ring-color !important; +} + +.month-popup-button:disabled { + background-color: #FFFFFF; + color: rgba(16, 16, 16, 0.3); +} + +.month-popup-button:disabled polygon { + fill: rgba(16, 16, 16, 0.3) !important; +} + .month-popup-button .disclosure-triangle { margin: 0; margin-inline-start: 4px; + margin-inline-end: 1px; } .day-cell { background-color: #ffffff; - border: 0; + border: 0 !important; border-radius: 2px; color: #767676; padding: 1px; @@ -80,29 +98,33 @@ .week-number-cell.highlighted, .day-cell.highlighted { - background-color: #F3F3F3; + background-color: #E5E5E5; } .week-number-cell.selected, .day-cell.selected { - background-color: #D9EBF9; + background-color: #CECECE; font-weight: bold; } .week-number-cell.disabled, .day-cell.disabled { - background-color: #ffffff; - color: #C5C5C5; + background-color: #FFFFFF; + color: rgba(16, 16, 16, 0.3); } .day-cell.highlighted.today, .day-cell.today { - background-color: #0078D4; + background-color: #6E6E6E; border: 0; color: #FFFFFF; font-weight: bold; } +.day-cell.selected.today { + border: 2px solid #CECECE !important; +} + .today-button-refresh { border: 0; bottom: 12px; @@ -115,6 +137,15 @@ width: auto; } +.today-button-refresh:hover { + background-color: #E5E5E5; +} + +.today-button-refresh:disabled { + background-color: #FFFFFF; + color: rgba(16, 16, 16, 0.3); +} + .year-list-view { border: 0; } @@ -142,5 +173,10 @@ } .month-button.highlighted { - background-color: #F3F3F3; + background-color: #E5E5E5; +} + +.month-button[aria-disabled="true"] { + background-color: #FFFFFF; + color: rgba(16, 16, 16, 0.3); }
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc index 8fbab58..30580eb3 100644 --- a/third_party/blink/renderer/core/html/html_dialog_element.cc +++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -58,11 +58,9 @@ auto* element = DynamicTo<Element>(node); if (!element) continue; - if (auto* control = DynamicTo<HTMLFormControlElement>(node)) { - if (control->IsAutofocusable() && control->IsFocusable()) { - control->focus(); - return; - } + if (element->IsAutofocusable() && element->IsFocusable()) { + element->focus(); + return; } if (!focusable_descendant && element->IsFocusable()) focusable_descendant = element;
diff --git a/third_party/blink/renderer/core/html/html_or_foreign_element.idl b/third_party/blink/renderer/core/html/html_or_foreign_element.idl index c153491d..8ee6971 100644 --- a/third_party/blink/renderer/core/html/html_or_foreign_element.idl +++ b/third_party/blink/renderer/core/html/html_or_foreign_element.idl
@@ -9,6 +9,7 @@ [SameObject, PerWorldBindings] readonly attribute DOMStringMap dataset; [CEReactions] attribute DOMString nonce; + [CEReactions, Reflect] attribute boolean autofocus; [Affects=Nothing, CEReactions, CustomElementCallbacks] attribute long tabIndex; void focus(optional FocusOptions options); void blur();
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index d02e1a8..7f1933aa 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -297,6 +297,9 @@ for (const NGPaintFragment* fragment : fragments) { const auto& text_fragment = To<NGPhysicalTextFragment>(fragment->PhysicalFragment()); + // TODO(yosin): We should introduce + // |NGPhysicalTextFragment::IsTruncated()| to skip them instead of using + // |IsHiddenForPaint()| with ordering of fragments. if (text_fragment.IsHiddenForPaint()) { in_hidden_for_paint = true; } else if (in_hidden_for_paint) { @@ -304,6 +307,10 @@ // ignore truncated fragments (actually painted). break; } + // We don't put generated texts, e.g. ellipsis, hyphen, etc. not in text + // content, into results. Note: CSS "content" aren't categorized this. + if (text_fragment.TextType() == NGPhysicalTextFragment::kGeneratedText) + continue; // When the corresponding DOM range contains collapsed whitespaces, NG // produces one fragment but legacy produces multiple text boxes broken at // collapsed whitespaces. We break the fragment at collapsed whitespaces @@ -311,6 +318,7 @@ for (const NGOffsetMappingUnit& unit : mapping->GetMappingUnitsForTextContentOffsetRange( text_fragment.StartOffset(), text_fragment.EndOffset())) { + DCHECK_EQ(unit.GetLayoutObject(), this); if (unit.GetType() == NGOffsetMappingUnitType::kCollapsed) continue; // [clamped_start, clamped_end] of |fragment| matches a legacy text box.
diff --git a/third_party/blink/renderer/core/layout/layout_text_test.cc b/third_party/blink/renderer/core/layout/layout_text_test.cc index 14c8171..ac8fb58 100644 --- a/third_party/blink/renderer/core/layout/layout_text_test.cc +++ b/third_party/blink/renderer/core/layout/layout_text_test.cc
@@ -492,6 +492,37 @@ EXPECT_EQ(LayoutRect(60, 0, 50, 10), boxes[1].local_rect); } +// For http://crbug.com/1003413 +TEST_P(ParameterizedLayoutTextTest, GetTextBoxInfoWithEllipsisForPseudoAfter) { + LoadAhem(); + SetBodyInnerHTML(R"HTML( + <style> + #sample { + box-sizing: border-box; + font: 10px/1 Ahem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 5ch; + } + b::after { content: ","; } + </style> + <div id=sample><b id=target>abc</b><b>xyz</b></div> + )HTML"); + const Element& target = *GetElementById("target"); + const Element& after = *target.GetPseudoElement(kPseudoIdAfter); + // Set |layout_text| to "," in <pseudo::after>,</pseudo::after> + const LayoutText& layout_text = + *ToLayoutText(after.GetLayoutObject()->SlowFirstChild()); + + auto boxes = layout_text.GetTextBoxInfo(); + EXPECT_EQ(1u, boxes.size()); + + EXPECT_EQ(0u, boxes[0].dom_start_offset); + EXPECT_EQ(1u, boxes[0].dom_length); + EXPECT_EQ(LayoutRect(30, 0, 10, 10), boxes[0].local_rect); +} + TEST_P(ParameterizedLayoutTextTest, IsBeforeAfterNonCollapsedCharacterNoLineWrap) { // Basic tests
diff --git a/third_party/blink/renderer/core/loader/frame_loader_state_machine.h b/third_party/blink/renderer/core/loader/frame_loader_state_machine.h index 4e73e2d8..2134e53 100644 --- a/third_party/blink/renderer/core/loader/frame_loader_state_machine.h +++ b/third_party/blink/renderer/core/loader/frame_loader_state_machine.h
@@ -46,9 +46,7 @@ public: FrameLoaderStateMachine(); - // Once a load has been committed, the state may alternate between - // CommittedFirstRealLoad and FirstLayoutDone. Otherwise, the states only go - // down the list. + // The states only go down the list. enum State { kCreatingInitialEmptyDocument, kDisplayingInitialEmptyDocument,
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc index 61bc163..1b79c83e 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -268,9 +268,9 @@ TEST_F(FileChooserQueueTest, DerefQueuedChooser) { LocalFrame* frame = helper_.LocalMainFrame()->GetFrame(); - base::RunLoop run_loop; - MockFileChooser chooser(&frame->GetInterfaceProvider(), - run_loop.QuitClosure()); + base::RunLoop run_loop_for_chooser1; + MockFileChooser chooser(frame->GetBrowserInterfaceBroker(), + run_loop_for_chooser1.QuitClosure()); auto* client1 = MakeGarbageCollected<MockFileChooserClient>(frame); auto* client2 = MakeGarbageCollected<MockFileChooserClient>(frame); mojom::blink::FileChooserParams params; @@ -284,12 +284,15 @@ chooser2.reset(); // Kicks ChromeClientImpl::DidCompleteFileChooser() for chooser1. - run_loop.Run(); + run_loop_for_chooser1.Run(); chooser.ResponseOnOpenFileChooser(FileChooserFileInfoList()); EXPECT_EQ(1u, chrome_client_impl_->file_chooser_queue_.size()); + base::RunLoop run_loop_for_chooser2; - // Cleanup for the second OpenFileChooser request. + chooser.SetQuitClosure(run_loop_for_chooser2.QuitClosure()); + run_loop_for_chooser2.Run(); + chooser.ResponseOnOpenFileChooser(FileChooserFileInfoList()); }
diff --git a/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc b/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc index b2f2f20..607a4f44 100644 --- a/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc +++ b/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc
@@ -8,6 +8,7 @@ #include <utility> #include "cc/layers/layer.h" +#include "components/viz/test/test_context_provider.h" #include "third_party/blink/public/platform/web_size.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h" @@ -16,8 +17,7 @@ #include "third_party/blink/renderer/core/paint/paint_controller_paint_test.h" #include "third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_gles2_interface.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h" +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_wrapper.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -33,14 +33,8 @@ protected: void SetUp() override { - auto factory = [](FakeGLES2Interface* gl, bool* gpu_compositing_disabled) - -> std::unique_ptr<WebGraphicsContext3DProvider> { - *gpu_compositing_disabled = false; - gl->SetIsContextLost(false); - return std::make_unique<FakeWebGraphicsContext3DProvider>(gl); - }; - SharedGpuContext::SetContextProviderFactoryForTesting( - WTF::BindRepeating(factory, WTF::Unretained(&gl_))); + test_context_provider_ = viz::TestContextProvider::Create(); + InitializeSharedGpuContext(test_context_provider_.get()); PaintControllerPaintTest::SetUp(); } @@ -68,7 +62,7 @@ } private: - FakeGLES2Interface gl_; + scoped_refptr<viz::TestContextProvider> test_context_provider_; }; INSTANTIATE_CAP_TEST_SUITE_P(HTMLCanvasPainterTestForCAP);
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time.cc b/third_party/blink/renderer/core/svg/animation/smil_time.cc index ce16f595..c06489c 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_time.cc +++ b/third_party/blink/renderer/core/svg/animation/smil_time.cc
@@ -32,8 +32,8 @@ SMILTime SMILTime::Repeat(SMILRepeatCount repeat_count) const { DCHECK(repeat_count.IsValid()); if (repeat_count.IsIndefinite() || repeat_count.IsUnspecified()) - return SMILTime::Indefinite(); - return SMILTime(time_ * repeat_count.NumericValue()); + return Indefinite(); + return time_ * repeat_count.NumericValue(); } std::ostream& operator<<(std::ostream& os, SMILTime time) {
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time.h b/third_party/blink/renderer/core/svg/animation/smil_time.h index 27597502..8ebd755 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_time.h +++ b/third_party/blink/renderer/core/svg/animation/smil_time.h
@@ -39,85 +39,104 @@ class SMILRepeatCount; struct SMILInterval; +// SMILTime is used as both a time and time delta in the SMIL animation +// code. It is a small wrapper around TimeDelta that adds two sentinel values +// for SMIL concepts: "indefinite" and "unresolved". +// +// For ordering, the special values have the properties that: +// +// <finite SMILTime> < SMILTime::Indefinite() < SMILTime::Unresolved() +// +// SMILTime::Earliest() and SMILTime::Latest() are smallest and largest finite +// time values respectively and sort accordingly. +// +// Addition and subtraction follow the semantics defined for computations of +// active duration (https://www.w3.org/TR/SMIL3/smil-timing.html#q78). class SMILTime { DISALLOW_NEW(); public: - constexpr SMILTime() : time_(0) {} + constexpr SMILTime() = default; - static constexpr SMILTime Unresolved() { - return std::numeric_limits<double>::quiet_NaN(); - } + static constexpr SMILTime Unresolved() { return base::TimeDelta::Max(); } static constexpr SMILTime Indefinite() { - return std::numeric_limits<double>::infinity(); + return base::TimeDelta::Max() - base::TimeDelta::FromMicroseconds(1); } - static constexpr SMILTime Earliest() { - return -std::numeric_limits<double>::infinity(); + static constexpr SMILTime Latest() { + return base::TimeDelta::Max() - base::TimeDelta::FromMicroseconds(2); } + static constexpr SMILTime Earliest() { return base::TimeDelta::Min(); } static constexpr SMILTime FromSecondsD(double seconds) { - return SMILTime(seconds); + return base::TimeDelta::FromSecondsD(seconds); } static constexpr SMILTime FromMicroseconds(int64_t us) { - return SMILTime(static_cast<double>(us) / - base::Time::kMicrosecondsPerSecond); + return base::TimeDelta::FromMicroseconds(us); } // Used for computing progress. Don't use for anything else. - double InternalValueAsDouble() const { return time_; } - double InSecondsF() const { return time_; } - int64_t InMicroseconds() const { - return time_ * base::Time::kMicrosecondsPerSecond; - } + double InternalValueAsDouble() const { return time_.InMicrosecondsF(); } + double InSecondsF() const { return time_.InSecondsF(); } + int64_t InMicroseconds() const { return time_.InMicroseconds(); } - bool IsFinite() const { return std::isfinite(time_); } - bool IsIndefinite() const { return std::isinf(time_); } - bool IsUnresolved() const { return std::isnan(time_); } + bool IsFinite() const { return *this < Indefinite(); } + bool IsIndefinite() const { return *this == Indefinite(); } + bool IsUnresolved() const { return *this == Unresolved(); } SMILTime Repeat(SMILRepeatCount repeat_count) const; - SMILTime operator+(SMILTime other) const { return time_ + other.time_; } - SMILTime operator-(SMILTime other) const { return time_ - other.time_; } - SMILTime operator-() const { return SMILTime(-time_); } + SMILTime operator+(SMILTime other) const { + if (!IsFinite()) + return time_; + if (!other.IsFinite()) + return other; + SMILTime result(time_ + other.time_); + return result.IsFinite() ? result : Latest(); + } + SMILTime operator-(SMILTime other) const { + if (!IsFinite()) + return time_; + if (!other.IsFinite()) + return other; + SMILTime result(time_ - other.time_); + return result.IsFinite() ? result : Latest(); + } + SMILTime operator-() const { return -time_; } // Division and /modulo are used primarily for computing interval // progress/repeats. int64_t operator/(SMILTime other) const { - return int64_t(time_ / other.time_); + DCHECK(IsFinite()); + DCHECK(other.IsFinite()); + return time_ / other.time_; } SMILTime operator%(SMILTime other) const { DCHECK(IsFinite()); DCHECK(other.IsFinite()); - return SMILTime(fmod(time_, other.time_)); + return SMILTime(time_ % other.time_); } - bool operator==(SMILTime other) const { - return (IsUnresolved() && other.IsUnresolved()) || time_ == other.time_; - } - explicit operator bool() const { return IsFinite() && time_; } - bool operator!=(SMILTime other) const { return !this->operator==(other); } + bool operator==(SMILTime other) const { return time_ == other.time_; } + explicit operator bool() const { return IsFinite() && !time_.is_zero(); } + bool operator!=(SMILTime other) const { return time_ != other.time_; } - // Ordering of SMILTimes has to follow: finite < indefinite (Inf) < unresolved - // (NaN). The first comparison is handled by IEEE754 but NaN values must be - // checked explicitly to guarantee that unresolved is ordered correctly too. - bool operator>(SMILTime other) const { - return IsUnresolved() || time_ > other.time_; - } - bool operator<(SMILTime other) const { return other.operator>(*this); } - bool operator>=(SMILTime other) const { - return this->operator>(other) || this->operator==(other); - } - bool operator<=(SMILTime other) const { - return this->operator<(other) || this->operator==(other); - } + // Ordering of SMILTimes has to follow: finite < indefinite < unresolved. We + // set this up by assigning consecutive sentinel values for the two latter + // (see above). + bool operator>(SMILTime other) const { return time_ > other.time_; } + bool operator<(SMILTime other) const { return time_ < other.time_; } + bool operator>=(SMILTime other) const { return time_ >= other.time_; } + bool operator<=(SMILTime other) const { return time_ <= other.time_; } private: friend bool operator!=(const SMILInterval& a, const SMILInterval& b); friend struct SMILTimeHash; - constexpr SMILTime(double time) : time_(time) {} + constexpr SMILTime(base::TimeDelta time) : time_(time) {} - double time_; + base::TimeDelta time_; }; +std::ostream& operator<<(std::ostream& os, SMILTime time); + class SMILTimeWithOrigin { DISALLOW_NEW(); @@ -140,8 +159,6 @@ Origin origin_; }; -std::ostream& operator<<(std::ostream& os, SMILTime time); - inline bool operator<(const SMILTimeWithOrigin& a, const SMILTimeWithOrigin& b) { return a.Time() < b.Time(); @@ -174,19 +191,15 @@ }; inline bool operator!=(const SMILInterval& a, const SMILInterval& b) { - // Compare the "raw" values since the operator!= for SMILTime always return - // true for non-finite times. - return a.begin.time_ != b.begin.time_ || a.end.time_ != b.end.time_; + return a.begin != b.begin || a.end != b.end; } struct SMILTimeHash { STATIC_ONLY(SMILTimeHash); static unsigned GetHash(const SMILTime& key) { - return WTF::FloatHash<double>::GetHash(key.time_); + return WTF::IntHash<int64_t>::GetHash(key.time_.InMicroseconds()); } - static bool Equal(const SMILTime& a, const SMILTime& b) { - return WTF::FloatHash<double>::Equal(a.time_, b.time_); - } + static bool Equal(const SMILTime& a, const SMILTime& b) { return a == b; } static const bool safe_to_compare_to_empty_or_deleted = true; };
diff --git a/third_party/blink/renderer/core/svg/svg_attribute_names.json5 b/third_party/blink/renderer/core/svg/svg_attribute_names.json5 index a91c1f4..38fae5f2 100644 --- a/third_party/blink/renderer/core/svg/svg_attribute_names.json5 +++ b/third_party/blink/renderer/core/svg/svg_attribute_names.json5
@@ -14,6 +14,7 @@ "animate", "attributeName", "attributeType", + "autofocus", "azimuth", "baseFrequency", "baseline-shift",
diff --git a/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js b/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js index 434e8605..ce5344ac 100644 --- a/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js +++ b/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
@@ -1457,7 +1457,6 @@ */ function createStyleElement(styleText) { const style = document.createElement('style'); - style.type = 'text/css'; style.textContent = styleText; return style; }
diff --git a/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js b/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js index 113e9577..7cce4f80 100644 --- a/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js +++ b/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
@@ -934,7 +934,6 @@ style = document.createElement('style'); style.id = styleTagId; - style.type = 'text/css'; style.textContent = rule; localRoot.appendChild(style);
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js index 0fa8fe3..dab04ad 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
@@ -403,7 +403,6 @@ 'column-rule', 'column-rule-color', 'fill', - 'list-style', 'list-style-image', 'outline', 'outline-color',
diff --git a/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js b/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js index 99a452c..9c71e667 100644 --- a/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js +++ b/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js
@@ -577,14 +577,13 @@ TestRunner.addStylesheetTag = function(path) { return TestRunner.evaluateInPageAsync(` (function(){ - let link = document.createElement('link'); + const link = document.createElement('link'); link.rel = 'stylesheet'; - link.type = 'text/css'; link.href = '${path}'; link.onload = onload; document.head.append(link); let resolve; - let promise = new Promise(r => resolve = r); + const promise = new Promise(r => resolve = r); function onload() { // TODO(chenwilliam): It shouldn't be necessary to force // style recalc here but some tests rely on it. @@ -603,10 +602,10 @@ TestRunner.addHTMLImport = function(path) { return TestRunner.evaluateInPageAsync(` (function(){ - let link = document.createElement('link'); + const link = document.createElement('link'); link.rel = 'import'; link.href = '${path}'; - let promise = new Promise(r => link.onload = r); + const promise = new Promise(r => link.onload = r); document.body.append(link); return promise; })(); @@ -626,7 +625,7 @@ options.name = options.name || ''; return TestRunner.evaluateInPageAsync(` (function(){ - let iframe = document.createElement('iframe'); + const iframe = document.createElement('iframe'); iframe.src = '${path}'; iframe.id = '${options.id}'; iframe.name = '${options.name}';
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js index 39f467a..fd1aad50 100644 --- a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js +++ b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
@@ -121,6 +121,14 @@ }; /** + * @param {!Element} element + */ +UI.ARIAUtils.markAsMenuItemSubMenu = function(element) { + UI.ARIAUtils.markAsMenuItem(element); + element.setAttribute('aria-haspopup', true); +}; + +/** * Must contain children whose role is option. * @param {!Element} element */
diff --git a/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js b/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js index 0b74e6e7..dd28379a 100644 --- a/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js +++ b/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
@@ -157,7 +157,7 @@ const menuItemElement = createElementWithClass('div', 'soft-context-menu-item'); menuItemElement._subItems = item.subItems; menuItemElement.tabIndex = -1; - UI.ARIAUtils.markAsMenuItem(menuItemElement); + UI.ARIAUtils.markAsMenuItemSubMenu(menuItemElement); // Occupy the same space on the left in all items. const checkMarkElement = UI.Icon.create('smallicon-checkmark', 'soft-context-menu-item-checkmark');
diff --git a/third_party/blink/renderer/devtools/front_end/ui/UIUtils.js b/third_party/blink/renderer/devtools/front_end/ui/UIUtils.js index 43588894..4ebb7d3a 100644 --- a/third_party/blink/renderer/devtools/front_end/ui/UIUtils.js +++ b/third_party/blink/renderer/devtools/front_end/ui/UIUtils.js
@@ -1287,14 +1287,12 @@ if (!content) console.error(cssFile + ' not preloaded. Check module.json'); let styleElement = createElement('style'); - styleElement.type = 'text/css'; styleElement.textContent = content; node.appendChild(styleElement); const themeStyleSheet = UI.themeSupport.themeStyleSheet(cssFile, content); if (themeStyleSheet) { styleElement = createElement('style'); - styleElement.type = 'text/css'; styleElement.textContent = themeStyleSheet + '\n' + Runtime.resolveSourceURL(cssFile + '.theme'); node.appendChild(styleElement); } @@ -1702,7 +1700,6 @@ injectCustomStyleSheets(element) { for (const sheet of this._customSheets){ const styleElement = createElement('style'); - styleElement.type = 'text/css'; styleElement.textContent = sheet; element.appendChild(styleElement); } @@ -1732,7 +1729,6 @@ result.push('/*# sourceURL=inspector.css.theme */'); const styleElement = createElement('style'); - styleElement.type = 'text/css'; styleElement.textContent = result.join('\n'); document.head.appendChild(styleElement); } @@ -1750,7 +1746,6 @@ let patch = this._cachedThemePatches.get(id); if (!patch) { const styleElement = createElement('style'); - styleElement.type = 'text/css'; styleElement.textContent = text; document.body.appendChild(styleElement); patch = this._patchForTheme(id, styleElement.sheet); @@ -2115,8 +2110,7 @@ * @return {string} */ function leadZero(value, length) { - const valueString = value.toString(); - const padding = length - valueString.length; - return padding <= 0 ? valueString : '0'.repeat(padding) + valueString; + const valueString = String(value); + return valueString.padStart(length, '0'); } };
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/DEPS b/third_party/blink/renderer/modules/canvas/canvas2d/DEPS index aaee473..11fa35c 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/DEPS +++ b/third_party/blink/renderer/modules/canvas/canvas2d/DEPS
@@ -1,3 +1,10 @@ include_rules = [ "+third_party/skia/include", -] \ No newline at end of file +] + +specific_include_rules = { + # Additional allowed includes for tests. + ".*_test(_.*)?\.(cc|h)" : [ + "+components/viz", + ] +} \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc index 4f9835f..91e8444 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -6,6 +6,7 @@ #include <memory> #include "build/build_config.h" +#include "components/viz/test/test_context_provider.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" @@ -35,8 +36,7 @@ #include "third_party/blink/renderer/platform/graphics/graphics_types.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_gles2_interface.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h" +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -176,7 +176,7 @@ Persistent<ImageData> partial_image_data_; FakeImageSource opaque_bitmap_; FakeImageSource alpha_bitmap_; - FakeGLES2Interface gl_; + scoped_refptr<viz::TestContextProvider> test_context_provider_; StringOrCanvasGradientOrCanvasPattern& OpaqueGradient() { return wrap_gradients_->opaque_gradient_; @@ -201,15 +201,8 @@ } void CanvasRenderingContext2DTest::SetUp() { - auto factory = [](FakeGLES2Interface* gl, bool* gpu_compositing_disabled) - -> std::unique_ptr<WebGraphicsContext3DProvider> { - *gpu_compositing_disabled = false; - gl->SetIsContextLost(false); - return std::make_unique<FakeWebGraphicsContext3DProvider>(gl); - }; - SharedGpuContext::SetContextProviderFactoryForTesting( - WTF::BindRepeating(factory, WTF::Unretained(&gl_))); - + test_context_provider_ = viz::TestContextProvider::Create(); + InitializeSharedGpuContext(test_context_provider_.get()); allow_accelerated_.reset( new ScopedAccelerated2dCanvasForTest(AllowsAcceleration())); web_view_helper_ = std::make_unique<frame_test_helpers::WebViewHelper>();
diff --git a/third_party/blink/renderer/modules/nfc/nfc_proxy_test.cc b/third_party/blink/renderer/modules/nfc/nfc_proxy_test.cc index 23196f6..c453538 100644 --- a/third_party/blink/renderer/modules/nfc/nfc_proxy_test.cc +++ b/third_party/blink/renderer/modules/nfc/nfc_proxy_test.cc
@@ -8,6 +8,7 @@ #include "base/run_loop.h" #include "base/test/bind_test_util.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "testing/gmock/include/gmock/gmock.h" @@ -62,7 +63,8 @@ void BindRequest(mojo::ScopedMessagePipeHandle handle) { DCHECK(!receiver_.is_bound()); - receiver_.Bind(device::mojom::blink::NFCRequest(std::move(handle))); + receiver_.Bind( + mojo::PendingReceiver<device::mojom::blink::NFC>(std::move(handle))); receiver_.set_disconnect_handler( WTF::Bind(&FakeNfcService::OnConnectionError, WTF::Unretained(this))); }
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index e79d962..7378cf2 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1570,6 +1570,8 @@ sources = [ "graphics/gpu/drawing_buffer_test_helpers.h", + "graphics/test/gpu_test_utils.cc", + "graphics/test/gpu_test_utils.h", "testing/code_cache_loader_mock.cc", "testing/code_cache_loader_mock.h", "testing/compositor_test.cc",
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc index 1d34f5b1..aa146496 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc
@@ -37,6 +37,8 @@ #include "cc/test/stub_decode_cache.h" #include "components/viz/common/resources/single_release_callback.h" #include "components/viz/common/resources/transferable_resource.h" +#include "components/viz/test/test_context_provider.h" +#include "components/viz/test/test_gles2_interface.h" #include "components/viz/test/test_gpu_memory_buffer_manager.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h" @@ -51,9 +53,8 @@ #include "third_party/blink/renderer/platform/graphics/paint/paint_flags.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_gles2_interface.h" -#include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h" #include "third_party/blink/renderer/platform/graphics/test/gpu_memory_buffer_test_platform.h" +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_wrapper.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" @@ -77,23 +78,6 @@ namespace { -class MockGLES2InterfaceWithImageSupport : public FakeGLES2Interface { - public: - MOCK_METHOD0(Flush, void()); - MOCK_METHOD4(CreateImageCHROMIUM, - GLuint(ClientBuffer, GLsizei, GLsizei, GLenum)); - MOCK_METHOD1(DestroyImageCHROMIUM, void(GLuint)); - MOCK_METHOD2(GenTextures, void(GLsizei, GLuint*)); - MOCK_METHOD2(DeleteTextures, void(GLsizei, const GLuint*)); - // Fake - void ProduceTextureDirectCHROMIUM(GLuint texture, GLbyte* mailbox) override { - mailbox[0] = mailbox_count_++; // Make non-zero mailbox names - } - - private: - int mailbox_count_ = 1; -}; - class ImageTrackingDecodeCache : public cc::StubDecodeCache { public: ImageTrackingDecodeCache() = default; @@ -163,29 +147,12 @@ } void SetUp() override { - auto factory = [](gpu::gles2::GLES2Interface* gl, - ImageTrackingDecodeCache* cache, GrContext* context, - bool* gpu_compositing_disabled) - -> std::unique_ptr<WebGraphicsContext3DProvider> { - *gpu_compositing_disabled = false; - return std::make_unique<FakeWebGraphicsContext3DProvider>(gl, cache, - context); - }; - - gpu::gles2::GLES2Interface* gl = &gl_; - GrContext* context = nullptr; - if (!NeedsMockGL()) { - test_context_provider_ = viz::TestContextProvider::Create(); - test_context_provider_->BindToCurrentThread(); - gl = test_context_provider_->ContextGL(); - context = test_context_provider_->GrContext(); - } - SharedGpuContext::SetContextProviderFactoryForTesting(WTF::BindRepeating( - factory, WTF::Unretained(gl), WTF::Unretained(&image_decode_cache_), - WTF::Unretained(context))); + test_context_provider_ = viz::TestContextProvider::Create(); + InitializeSharedGpuContext(test_context_provider_.get(), + &image_decode_cache_); } - virtual bool NeedsMockGL() { return true; } + virtual bool NeedsMockGL() { return false; } void TearDown() override { SharedGpuContext::ResetForTesting(); @@ -199,7 +166,6 @@ protected: scoped_refptr<viz::TestContextProvider> test_context_provider_; - MockGLES2InterfaceWithImageSupport gl_; ImageTrackingDecodeCache image_decode_cache_; std::unique_ptr<MockCanvasResourceHost> host_; }; @@ -227,7 +193,7 @@ uint32_t gen_id = bridge->GetOrCreateResourceProvider()->ContentUniqueID(); bridge->DrawingCanvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), flags); EXPECT_EQ(gen_id, bridge->GetOrCreateResourceProvider()->ContentUniqueID()); - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); EXPECT_EQ(nullptr, bridge->GetOrCreateResourceProvider()); // The following passes by not crashing bridge->NewImageSnapshot(kPreferAcceleration); @@ -242,7 +208,7 @@ bridge->FinalizeFrame(); // Trigger the creation of a backing store // When the context is lost we are not sure if we should still be producing // GL frames for the compositor or not, so fail to generate frames. - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); viz::TransferableResource resource; std::unique_ptr<viz::SingleReleaseCallback> release_callback; @@ -260,7 +226,7 @@ EXPECT_TRUE(bridge->IsValid()); // When the context is lost we are not sure if we should still be producing // GL frames for the compositor or not, so fail to generate frames. - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); EXPECT_FALSE(bridge->IsValid()); // Restoration will fail because @@ -331,7 +297,7 @@ } bool lost_resource = true; - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); // Get a new context provider so that the WeakPtr to the old one is null. // This is the test to make sure that ReleaseMailboxImageResource() handles // null context_provider_wrapper properly. @@ -390,7 +356,7 @@ } TEST_F(Canvas2DLayerBridgeTest, FallbackToSoftwareIfContextLost) { - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 150), Canvas2DLayerBridge::kEnableAcceleration, CanvasColorParams()); @@ -876,7 +842,7 @@ MockLogger* mock_logger_ptr = mock_logger.get(); bridge->SetLoggerForTesting(std::move(mock_logger)); - gl_.SetIsContextLost(true); + test_context_provider_->TestContextGL()->set_context_lost(true); // Test entering hibernation EXPECT_CALL( @@ -983,168 +949,79 @@ EXPECT_TRUE(bridge->IsValid()); } -TEST_F(Canvas2DLayerBridgeTest, GpuMemoryBufferRecycling) { - InSequence s; +TEST_F(Canvas2DLayerBridgeTest, ResourceRecycling) { ScopedCanvas2dImageChromiumForTest canvas_2d_image_chromium(true); - ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform> platform; const_cast<gpu::Capabilities&>(SharedGpuContext::ContextProviderWrapper() ->ContextProvider() ->GetCapabilities()) .gpu_memory_buffer_formats.Add(gfx::BufferFormat::BGRA_8888); - viz::TransferableResource resource1; - viz::TransferableResource resource2; - std::unique_ptr<viz::SingleReleaseCallback> release_callback1; - std::unique_ptr<viz::SingleReleaseCallback> release_callback2; - constexpr GLuint texture_id1 = 1; - constexpr GLuint texture_id2 = 2; - constexpr GLuint image_id1 = 3; - constexpr GLuint image_id2 = 4; - const GLuint texture_target = gpu::GetPlatformSpecificTextureTarget(); + viz::TransferableResource resources[3]; + std::unique_ptr<viz::SingleReleaseCallback> callbacks[3]; std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge( IntSize(300, 150), Canvas2DLayerBridge::kForceAccelerationForTesting, CanvasColorParams()); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)).WillOnce(Return(image_id1)); - EXPECT_CALL(gl_, GenTextures(1, _)).WillOnce(SetArgPointee<1>(texture_id1)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_id1)); - if (texture_target == GL_TEXTURE_EXTERNAL_OES) { - constexpr GLuint image_2d_id_for_copy = 17; - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)) - .WillOnce(Return(image_2d_id_for_copy)); - EXPECT_CALL(gl_, GenTextures(1, _)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_2d_id_for_copy)); - } DrawSomething(bridge.get()); - ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resource1, - &release_callback1)); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)).WillOnce(Return(image_id2)); - EXPECT_CALL(gl_, GenTextures(1, _)).WillOnce(SetArgPointee<1>(texture_id2)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_id2)); - if (texture_target == GL_TEXTURE_EXTERNAL_OES) { - constexpr GLuint image_2d_id_for_copy = 19; - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)) - .WillOnce(Return(image_2d_id_for_copy)); - EXPECT_CALL(gl_, GenTextures(1, _)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_2d_id_for_copy)); - } + ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resources[0], + &callbacks[0])); DrawSomething(bridge.get()); - ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resource2, - &release_callback2)); + ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resources[1], + &callbacks[1])); + EXPECT_NE(resources[0].mailbox_holder.mailbox, + resources[1].mailbox_holder.mailbox); - testing::Mock::VerifyAndClearExpectations(&gl_); + // Now release the first resource and draw again. It should be reused due to + // recycling. + callbacks[0]->Run(gpu::SyncToken(), false); + DrawSomething(bridge.get()); + ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resources[2], + &callbacks[2])); + EXPECT_EQ(resources[0].mailbox_holder.mailbox, + resources[2].mailbox_holder.mailbox); - // Check that release resources does not result in destruction due - // to recycling. - EXPECT_CALL(gl_, DeleteTextures(_, _)).Times(0); - bool lost_resource = false; - release_callback1->Run(gpu::SyncToken(), lost_resource); - release_callback1 = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, DeleteTextures(_, _)).Times(0); - release_callback2->Run(gpu::SyncToken(), lost_resource); - release_callback2 = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Destroying the bridge results in destruction of cached resources. - EXPECT_CALL(gl_, DeleteTextures(1, Pointee(texture_id1))); - EXPECT_CALL(gl_, DeleteTextures(1, Pointee(texture_id2))); - bridge.reset(); - - testing::Mock::VerifyAndClearExpectations(&gl_); + callbacks[1]->Run(gpu::SyncToken(), false); + callbacks[2]->Run(gpu::SyncToken(), false); } -TEST_F(Canvas2DLayerBridgeTest, NoGpuMemoryBufferRecyclingWhenPageHidden) { - InSequence s; +TEST_F(Canvas2DLayerBridgeTest, NoResourceRecyclingWhenPageHidden) { ScopedCanvas2dImageChromiumForTest canvas_2d_image_chromium(true); - ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform> platform; const_cast<gpu::Capabilities&>(SharedGpuContext::ContextProviderWrapper() ->ContextProvider() ->GetCapabilities()) .gpu_memory_buffer_formats.Add(gfx::BufferFormat::BGRA_8888); - viz::TransferableResource resource1; - viz::TransferableResource resource2; - std::unique_ptr<viz::SingleReleaseCallback> release_callback1; - std::unique_ptr<viz::SingleReleaseCallback> release_callback2; - constexpr GLuint texture_id1 = 1; - constexpr GLuint texture_id2 = 2; - constexpr GLuint image_id1 = 3; - constexpr GLuint image_id2 = 4; - const GLuint texture_target = gpu::GetPlatformSpecificTextureTarget(); + viz::TransferableResource resources[2]; + std::unique_ptr<viz::SingleReleaseCallback> callbacks[2]; std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge( IntSize(300, 150), Canvas2DLayerBridge::kForceAccelerationForTesting, CanvasColorParams()); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)).WillOnce(Return(image_id1)); - EXPECT_CALL(gl_, GenTextures(1, _)).WillOnce(SetArgPointee<1>(texture_id1)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_id1)); - if (texture_target == GL_TEXTURE_EXTERNAL_OES) { - constexpr GLuint image_2d_id_for_copy = 17; - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)) - .WillOnce(Return(image_2d_id_for_copy)); - EXPECT_CALL(gl_, GenTextures(1, _)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_2d_id_for_copy)); - } DrawSomething(bridge.get()); - bridge->PrepareTransferableResource(nullptr, &resource1, &release_callback1); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)).WillOnce(Return(image_id2)); - EXPECT_CALL(gl_, GenTextures(1, _)).WillOnce(SetArgPointee<1>(texture_id2)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_id2)); - if (texture_target == GL_TEXTURE_EXTERNAL_OES) { - constexpr GLuint image_2d_id_for_copy = 19; - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)) - .WillOnce(Return(image_2d_id_for_copy)); - EXPECT_CALL(gl_, GenTextures(1, _)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_2d_id_for_copy)); - } + ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resources[0], + &callbacks[0])); DrawSomething(bridge.get()); - bridge->PrepareTransferableResource(nullptr, &resource2, &release_callback2); + ASSERT_TRUE(bridge->PrepareTransferableResource(nullptr, &resources[1], + &callbacks[1])); + EXPECT_NE(resources[0].mailbox_holder.mailbox, + resources[1].mailbox_holder.mailbox); - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Release first frame to cache - EXPECT_CALL(gl_, DeleteTextures(_, _)).Times(0); - bool lost_resource = false; - release_callback1->Run(gpu::SyncToken(), lost_resource); - release_callback1 = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Switching to Hidden frees cached resources immediately - EXPECT_CALL(gl_, DeleteTextures(1, Pointee(texture_id1))); + // Now release the first resource and mark the page hidden. The recycled + // resource should be dropped. + callbacks[0]->Run(gpu::SyncToken(), false); + EXPECT_EQ(test_context_provider_->TestContextGL()->NumTextures(), 2u); bridge->SetIsHidden(true); + EXPECT_EQ(test_context_provider_->TestContextGL()->NumTextures(), 1u); - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Release second frame and verify that its resource is destroyed immediately - // due to the layer bridge being hidden - EXPECT_CALL(gl_, DeleteTextures(1, Pointee(texture_id2))); - release_callback2->Run(gpu::SyncToken(), lost_resource); - release_callback2 = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); + // Release second frame, this resource is not released because its the current + // render target for the canvas. It should only be released if the canvas is + // hibernated. + callbacks[1]->Run(gpu::SyncToken(), false); + EXPECT_EQ(test_context_provider_->TestContextGL()->NumTextures(), 1u); } -TEST_F(Canvas2DLayerBridgeTest, ReleaseGpuMemoryBufferAfterBridgeDestroyed) { - InSequence s; +TEST_F(Canvas2DLayerBridgeTest, ReleaseResourcesAfterBridgeDestroyed) { ScopedCanvas2dImageChromiumForTest canvas_2d_image_chromium(true); - ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform> platform; const_cast<gpu::Capabilities&>(SharedGpuContext::ContextProviderWrapper() ->ContextProvider() ->GetCapabilities()) @@ -1152,43 +1029,20 @@ viz::TransferableResource resource; std::unique_ptr<viz::SingleReleaseCallback> release_callback; - constexpr GLuint texture_id = 1; - constexpr GLuint image_id = 2; - const GLuint texture_target = gpu::GetPlatformSpecificTextureTarget(); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge( IntSize(300, 150), Canvas2DLayerBridge::kForceAccelerationForTesting, CanvasColorParams()); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)).WillOnce(Return(image_id)); - EXPECT_CALL(gl_, GenTextures(1, _)).WillOnce(SetArgPointee<1>(texture_id)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_id)); - if (texture_target == GL_TEXTURE_EXTERNAL_OES) { - constexpr GLuint image_2d_id_for_copy = 17; - EXPECT_CALL(gl_, CreateImageCHROMIUM(_, _, _, _)) - .WillOnce(Return(image_2d_id_for_copy)); - EXPECT_CALL(gl_, GenTextures(1, _)); - EXPECT_CALL(gl_, DestroyImageCHROMIUM(image_2d_id_for_copy)); - } DrawSomething(bridge.get()); bridge->PrepareTransferableResource(nullptr, &resource, &release_callback); - testing::Mock::VerifyAndClearExpectations(&gl_); - // Tearing down the bridge does not destroy unreleased resources. - EXPECT_CALL(gl_, DeleteTextures(_, _)).Times(0); bridge.reset(); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, DeleteTextures(1, Pointee(texture_id))); + EXPECT_EQ(test_context_provider_->TestContextGL()->NumTextures(), 1u); constexpr bool lost_resource = false; release_callback->Run(gpu::SyncToken(), lost_resource); + EXPECT_EQ(test_context_provider_->TestContextGL()->NumTextures(), 0u); release_callback = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); } TEST_F(Canvas2DLayerBridgeTest, EnsureCCImageCacheUse) { @@ -1315,16 +1169,11 @@ bridge->DrawingCanvas()->drawImage(images[1].paint_image(), 0u, 0u, &flags); } -class Canvas2DLayerBridgeTestNoMockGL : public Canvas2DLayerBridgeTest { - bool NeedsMockGL() override { return false; } -}; - -TEST_F(Canvas2DLayerBridgeTestNoMockGL, +TEST_F(Canvas2DLayerBridgeTest, PrepareTransferableResourceTracksCanvasChanges) { IntSize size = IntSize(300, 300); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge( size, Canvas2DLayerBridge::kEnableAcceleration, CanvasColorParams()); - host_->set_provider_type(CanvasResourceProvider::kSharedImage); bridge->DrawingCanvas()->clear(SK_ColorRED); DrawSomething(bridge.get());
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 82a9ba30..fe88647e 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -22,188 +22,6 @@ namespace blink { -// * Renders to a texture managed by Skia. Mailboxes are backed by vanilla GL -// textures. -// * Layers are not overlay candidates. -class CanvasResourceProviderTexture : public CanvasResourceProvider { - public: - CanvasResourceProviderTexture( - const IntSize& size, - unsigned msaa_sample_count, - SkFilterQuality filter_quality, - const CanvasColorParams& color_params, - base::WeakPtr<WebGraphicsContext3DProviderWrapper> - context_provider_wrapper, - base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher, - bool is_origin_top_left) - : CanvasResourceProvider(kTexture, - size, - msaa_sample_count, - filter_quality, - color_params, - is_origin_top_left, - std::move(context_provider_wrapper), - std::move(resource_dispatcher)) {} - - ~CanvasResourceProviderTexture() override = default; - - bool IsValid() const final { return GetSkSurface() && !IsGpuContextLost(); } - bool IsAccelerated() const final { return true; } - bool SupportsDirectCompositing() const override { return true; } - - GLuint GetBackingTextureHandleForOverwrite() override { - GrBackendTexture backend_texture = GetSkSurface()->getBackendTexture( - SkSurface::kDiscardWrite_TextureHandleAccess); - if (!backend_texture.isValid()) - return 0; - GrGLTextureInfo info; - if (!backend_texture.getGLTextureInfo(&info)) - return 0; - return info.fID; - } - - protected: - scoped_refptr<CanvasResource> ProduceCanvasResource() override { - TRACE_EVENT0("blink", - "CanvasResourceProviderTexture::ProduceCanvasResource"); - DCHECK(GetSkSurface()); - - if (IsGpuContextLost()) - return nullptr; - - auto* gl = ContextGL(); - DCHECK(gl); - - if (ContextProviderWrapper() - ->ContextProvider() - ->GetCapabilities() - .disable_2d_canvas_copy_on_write) { - // A readback operation may alter the texture parameters, which may affect - // the compositor's behavior. Therefore, we must trigger copy-on-write - // even though we are not technically writing to the texture, only to its - // parameters. This issue is Android-WebView specific: crbug.com/585250. - // If this issue with readback affecting state is ever fixed, then we'll - // have to do this instead of triggering a copy-on-write: - // static_cast<AcceleratedStaticBitmapImage*>(image.get()) - // ->RetainOriginalSkImageForCopyOnWrite(); - GetSkSurface()->notifyContentWillChange( - SkSurface::kRetain_ContentChangeMode); - } - - auto paint_image = MakeImageSnapshot(); - if (!paint_image) - return nullptr; - DCHECK(paint_image.GetSkImage()->isTextureBacked()); - - scoped_refptr<StaticBitmapImage> image = StaticBitmapImage::Create( - paint_image.GetSkImage(), ContextProviderWrapper()); - - scoped_refptr<CanvasResource> resource = CanvasResourceBitmap::Create( - image, CreateWeakPtr(), FilterQuality(), ColorParams()); - if (!resource) - return nullptr; - - return resource; - } - - scoped_refptr<StaticBitmapImage> Snapshot() override { - TRACE_EVENT0("blink", "CanvasResourceProviderTexture::Snapshot"); - return SnapshotInternal(); - } - - sk_sp<SkSurface> CreateSkSurface() const override { - TRACE_EVENT0("blink", "CanvasResourceProviderTexture::CreateSkSurface"); - if (IsGpuContextLost()) - return nullptr; - auto* gr = GetGrContext(); - DCHECK(gr); - - const SkImageInfo info = SkImageInfo::Make( - Size().Width(), Size().Height(), ColorParams().GetSkColorType(), - kPremul_SkAlphaType, ColorParams().GetSkColorSpaceForSkSurfaces()); - - return SkSurface::MakeRenderTarget( - gr, SkBudgeted::kNo, info, GetMSAASampleCount(), GetGrSurfaceOrigin(), - ColorParams().GetSkSurfaceProps()); - } -}; - -// * Renders to a texture managed by Skia. Mailboxes are GPU-accelerated -// platform native surfaces. -// * Layers are overlay candidates. -class CanvasResourceProviderTextureGpuMemoryBuffer final - : public CanvasResourceProviderTexture { - public: - CanvasResourceProviderTextureGpuMemoryBuffer( - const IntSize& size, - unsigned msaa_sample_count, - SkFilterQuality filter_quality, - const CanvasColorParams& color_params, - base::WeakPtr<WebGraphicsContext3DProviderWrapper> - context_provider_wrapper, - base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher, - bool is_origin_top_left) - : CanvasResourceProviderTexture(size, - msaa_sample_count, - filter_quality, - color_params, - std::move(context_provider_wrapper), - std::move(resource_dispatcher), - is_origin_top_left) { - type_ = kTextureGpuMemoryBuffer; - } - - ~CanvasResourceProviderTextureGpuMemoryBuffer() override = default; - bool SupportsDirectCompositing() const override { return true; } - bool SupportsSingleBuffering() const override { return true; } - - private: - scoped_refptr<CanvasResource> CreateResource() final { - TRACE_EVENT0( - "blink", - "CanvasResourceProviderTextureGpuMemoreBuffer::CreateResource"); - constexpr bool is_accelerated = true; - return CanvasResourceGpuMemoryBuffer::Create( - Size(), ColorParams(), ContextProviderWrapper(), CreateWeakPtr(), - FilterQuality(), is_accelerated); - } - - scoped_refptr<CanvasResource> ProduceCanvasResource() final { - TRACE_EVENT0( - "blink", - "CanvasResourceProviderTextureGpuMemoreBuffer::ProduceCanvasResource"); - DCHECK(GetSkSurface()); - - if (IsGpuContextLost()) - return nullptr; - - scoped_refptr<CanvasResource> output_resource = NewOrRecycledResource(); - if (!output_resource) { - // GpuMemoryBuffer creation failed, fallback to Texture resource - return CanvasResourceProviderTexture::ProduceCanvasResource(); - } - - auto paint_image = MakeImageSnapshot(); - if (!paint_image) - return nullptr; - DCHECK(paint_image.GetSkImage()->isTextureBacked()); - - GrBackendTexture backend_texture = - paint_image.GetSkImage()->getBackendTexture(true); - DCHECK(backend_texture.isValid()); - - GrGLTextureInfo info; - if (!backend_texture.getGLTextureInfo(&info)) - return nullptr; - - GLuint skia_texture_id = info.fID; - output_resource->CopyFromTexture(skia_texture_id, - ColorParams().GLUnsizedInternalFormat(), - ColorParams().GLType()); - return output_resource; - } -}; - // * Renders to a Skia RAM-backed bitmap. // * Mailboxing is not supported : cannot be directly composited. class CanvasResourceProviderBitmap : public CanvasResourceProvider { @@ -250,66 +68,6 @@ } }; -// * Renders to a ram memory buffer managed by Skia -// * Uses GpuMemoryBuffer to pass frames to the compositor -// * Layers are overlay candidates -class CanvasResourceProviderBitmapGpuMemoryBuffer final - : public CanvasResourceProviderBitmap { - public: - CanvasResourceProviderBitmapGpuMemoryBuffer( - const IntSize& size, - SkFilterQuality filter_quality, - const CanvasColorParams& color_params, - base::WeakPtr<WebGraphicsContext3DProviderWrapper> - context_provider_wrapper, - base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher) - : CanvasResourceProviderBitmap(size, - filter_quality, - color_params, - std::move(context_provider_wrapper), - std::move(resource_dispatcher)) { - type_ = kBitmapGpuMemoryBuffer; - } - - ~CanvasResourceProviderBitmapGpuMemoryBuffer() override = default; - bool SupportsDirectCompositing() const override { return true; } - bool SupportsSingleBuffering() const override { return true; } - - private: - scoped_refptr<CanvasResource> CreateResource() final { - TRACE_EVENT0("blink", - "CanvasResourceProviderBitmapGpuMemoryBuffer::CreateResource"); - - constexpr bool is_accelerated = false; - return CanvasResourceGpuMemoryBuffer::Create( - Size(), ColorParams(), ContextProviderWrapper(), CreateWeakPtr(), - FilterQuality(), is_accelerated); - } - - scoped_refptr<CanvasResource> ProduceCanvasResource() final { - TRACE_EVENT0( - "blink", - "CanvasResourceProviderBitmapGpuMemoryBuffer::ProduceCanvasResource"); - - DCHECK(GetSkSurface()); - - scoped_refptr<CanvasResource> output_resource = NewOrRecycledResource(); - if (!output_resource) { - // Not compositable without a GpuMemoryBuffer - return nullptr; - } - - auto paint_image = MakeImageSnapshot(); - if (!paint_image) - return nullptr; - DCHECK(!paint_image.GetSkImage()->isTextureBacked()); - - output_resource->TakeSkImage(paint_image.GetSkImage()); - - return output_resource; - } -}; - // * Renders to a shared memory bitmap. // * Uses SharedBitmaps to pass frames directly to the compositor. class CanvasResourceProviderSharedBitmap : public CanvasResourceProviderBitmap { @@ -361,99 +119,6 @@ } }; -// * Renders to a GpuMemoryBuffer-backed texture used to create a SkSurface. -// * Layers are overlay candidates -class CanvasResourceProviderDirectGpuMemoryBuffer final - : public CanvasResourceProvider { - public: - CanvasResourceProviderDirectGpuMemoryBuffer( - const IntSize& size, - unsigned msaa_sample_count, - SkFilterQuality filter_quality, - const CanvasColorParams& color_params, - base::WeakPtr<WebGraphicsContext3DProviderWrapper> - context_provider_wrapper, - base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher, - bool is_origin_top_left) - : CanvasResourceProvider(kDirectGpuMemoryBuffer, - size, - msaa_sample_count, - filter_quality, - color_params, - is_origin_top_left, - std::move(context_provider_wrapper), - std::move(resource_dispatcher)) { - constexpr bool is_accelerated = true; - resource_ = CanvasResourceGpuMemoryBuffer::Create( - Size(), ColorParams(), ContextProviderWrapper(), CreateWeakPtr(), - FilterQuality(), is_accelerated); - } - - ~CanvasResourceProviderDirectGpuMemoryBuffer() override = default; - bool IsValid() const final { return GetSkSurface() && !IsGpuContextLost(); } - bool IsAccelerated() const final { return true; } - bool SupportsDirectCompositing() const override { return true; } - bool SupportsSingleBuffering() const override { return true; } - - private: - GLuint GetBackingTextureHandleForOverwrite() override { - return resource_->GetBackingTextureHandleForOverwrite(); - } - - scoped_refptr<CanvasResource> CreateResource() final { - TRACE_EVENT0("blink", - "CanvasResourceProviderDirectGpuMemoryBuffer::CreateResource"); - DCHECK(resource_); - return resource_; - } - - scoped_refptr<CanvasResource> ProduceCanvasResource() final { - TRACE_EVENT0( - "blink", - "CanvasResourceProviderDirectGpuMemoryBuffer::ProduceCanvasResource"); - if (IsGpuContextLost()) - return nullptr; - FlushSkia(); - - auto* gl = ContextGL(); - DCHECK(gl); - gl->Flush(); - - return NewOrRecycledResource(); - } - - scoped_refptr<StaticBitmapImage> Snapshot() override { - TRACE_EVENT0("blink", - "CanvasResourceProviderDirectGpuMemoryBuffer::Snapshot"); - return SnapshotInternal(); - } - - sk_sp<SkSurface> CreateSkSurface() const override { - if (IsGpuContextLost() || !resource_) - return nullptr; - auto* gr = GetGrContext(); - DCHECK(gr); - - GrGLTextureInfo texture_info = {}; - texture_info.fID = resource_->GetBackingTextureHandleForOverwrite(); - texture_info.fTarget = GL_TEXTURE_2D; - // Skia requires a sized internal format. - texture_info.fFormat = ColorParams().GLSizedInternalFormat(); - - const GrBackendTexture backend_texture(Size().Width(), Size().Height(), - GrMipMapped::kNo, texture_info); - - auto surface = SkSurface::MakeFromBackendTextureAsRenderTarget( - gr, backend_texture, GetGrSurfaceOrigin(), GetMSAASampleCount(), - ColorParams().GetSkColorType(), - ColorParams().GetSkColorSpaceForSkSurfaces(), - ColorParams().GetSkSurfaceProps()); - return surface; - } - - scoped_refptr<CanvasResource> resource_; -}; - // * Renders to a SharedImage, which manages memory internally. // * Layers are overlay candidates. class CanvasResourceProviderSharedImage : public CanvasResourceProvider { @@ -912,13 +577,7 @@ kDirect3DSwapChain, kDirect2DSwapChain, kDirect3DGpuMemoryBuffer, - // TODO(khushalsagar): Delete Direct2D and TextureGpuMemoryBuffer types once - // shared image for single buffered canvas sticks. - kDirect2DGpuMemoryBuffer, - kTextureGpuMemoryBuffer, - kBitmapGpuMemoryBuffer, kSharedBitmap, - kTexture, kBitmap, kSharedImage, }; @@ -931,55 +590,17 @@ static const Vector<CanvasResourceType> kAcceleratedFallbackList({ CanvasResourceType::kSharedImage, - CanvasResourceType::kTexture, // Fallback to software CanvasResourceType::kBitmap, }); - static const Vector<CanvasResourceType> kSoftwareCompositedFallbackList({ + static const Vector<CanvasResourceType> kCompositedFallbackList({ CanvasResourceType::kSharedImage, - CanvasResourceType::kBitmapGpuMemoryBuffer, CanvasResourceType::kSharedBitmap, // Fallback to no direct compositing support CanvasResourceType::kBitmap, }); - static const Vector<CanvasResourceType> kAcceleratedCompositedFallbackList({ - CanvasResourceType::kSharedImage, - CanvasResourceType::kTextureGpuMemoryBuffer, - CanvasResourceType::kTexture, - // Fallback to software composited - // (|kSoftwareCompositedFallbackList|). - CanvasResourceType::kBitmapGpuMemoryBuffer, - CanvasResourceType::kSharedBitmap, - // Fallback to no direct compositing support - CanvasResourceType::kBitmap, - }); - DCHECK(std::equal(kAcceleratedCompositedFallbackList.begin() + 3, - kAcceleratedCompositedFallbackList.end(), - kSoftwareCompositedFallbackList.begin() + 1, - kSoftwareCompositedFallbackList.end())); - - static const Vector<CanvasResourceType> kAcceleratedDirect2DFallbackList({ - CanvasResourceType::kDirect2DSwapChain, - CanvasResourceType::kSharedImage, - CanvasResourceType::kDirect2DGpuMemoryBuffer, - // The rest is equal to |kAcceleratedCompositedFallbackList|. - CanvasResourceType::kTextureGpuMemoryBuffer, - CanvasResourceType::kTexture, - // Fallback to software composited - CanvasResourceType::kBitmapGpuMemoryBuffer, - CanvasResourceType::kSharedBitmap, - // Fallback to no direct compositing support - CanvasResourceType::kBitmap, - }); - // TODO(khushalsagar): Change this DCHECK after kDirect2DGpuMemoryBuffer and - // kTextureGpuMemoryBuffer are removed. - DCHECK(std::equal(kAcceleratedDirect2DFallbackList.begin() + 3, - kAcceleratedDirect2DFallbackList.end(), - kAcceleratedCompositedFallbackList.begin() + 1, - kAcceleratedCompositedFallbackList.end())); - static const Vector<CanvasResourceType> kAcceleratedDirect3DFallbackList({ // This is used with single-buffered WebGL where the resource comes // from an external source. The external site should take care of @@ -987,47 +608,40 @@ // compositor. CanvasResourceType::kDirect3DSwapChain, CanvasResourceType::kDirect3DGpuMemoryBuffer, - // The rest is equal to |kAcceleratedDirect2DFallbackList|. + // The rest is equal to |kCompositedFallbackList|. CanvasResourceType::kSharedImage, - CanvasResourceType::kDirect2DGpuMemoryBuffer, - CanvasResourceType::kTextureGpuMemoryBuffer, - CanvasResourceType::kTexture, - // Fallback to software composited - CanvasResourceType::kBitmapGpuMemoryBuffer, CanvasResourceType::kSharedBitmap, - // Fallback to no direct compositing support CanvasResourceType::kBitmap, }); - // TODO(khushalsagar): Change this DCHECK after kDirect2DGpuMemoryBuffer and - // kTextureGpuMemoryBuffer are removed. DCHECK(std::equal(kAcceleratedDirect3DFallbackList.begin() + 2, kAcceleratedDirect3DFallbackList.end(), - kAcceleratedDirect2DFallbackList.begin() + 1, - kAcceleratedDirect2DFallbackList.end())); + kCompositedFallbackList.begin(), + kCompositedFallbackList.end())); switch (usage) { case CanvasResourceProvider::ResourceUsage::kSoftwareResourceUsage: return kSoftwareFallbackList; case CanvasResourceProvider::ResourceUsage:: kSoftwareCompositedResourceUsage: - return kSoftwareCompositedFallbackList; + return kCompositedFallbackList; case CanvasResourceProvider::ResourceUsage::kAcceleratedResourceUsage: return kAcceleratedFallbackList; case CanvasResourceProvider::ResourceUsage:: kAcceleratedCompositedResourceUsage: - return kAcceleratedCompositedFallbackList; + return kCompositedFallbackList; case CanvasResourceProvider::ResourceUsage:: kAcceleratedDirect2DResourceUsage: - return kAcceleratedDirect2DFallbackList; + return kCompositedFallbackList; case CanvasResourceProvider::ResourceUsage:: kAcceleratedDirect3DResourceUsage: return kAcceleratedDirect3DFallbackList; case CanvasResourceProvider::ResourceUsage:: kSoftwareCompositedDirect2DResourceUsage: - return kSoftwareCompositedFallbackList; + return kCompositedFallbackList; } NOTREACHED(); } + } // unnamed namespace std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::CreateForCanvas( @@ -1106,30 +720,6 @@ size, filter_quality, color_params, context_provider_wrapper, resource_dispatcher); break; - case CanvasResourceType::kTextureGpuMemoryBuffer: - if (!is_gpu_memory_buffer_image_allowed) - continue; - DCHECK_EQ(color_params.GLUnsizedInternalFormat(), - gpu::InternalFormatForGpuMemoryBufferFormat( - color_params.GetBufferFormat())); - provider = - std::make_unique<CanvasResourceProviderTextureGpuMemoryBuffer>( - size, msaa_sample_count, filter_quality, color_params, - context_provider_wrapper, resource_dispatcher, - is_origin_top_left); - break; - case CanvasResourceType::kDirect2DGpuMemoryBuffer: - if (!is_gpu_memory_buffer_image_allowed) - continue; - DCHECK_EQ(color_params.GLUnsizedInternalFormat(), - gpu::InternalFormatForGpuMemoryBufferFormat( - color_params.GetBufferFormat())); - provider = - std::make_unique<CanvasResourceProviderDirectGpuMemoryBuffer>( - size, msaa_sample_count, filter_quality, color_params, - context_provider_wrapper, resource_dispatcher, - is_origin_top_left); - break; case CanvasResourceType::kDirect3DGpuMemoryBuffer: if (!is_gpu_memory_buffer_image_allowed) continue; @@ -1140,29 +730,12 @@ size, filter_quality, color_params, context_provider_wrapper, resource_dispatcher); break; - case CanvasResourceType::kBitmapGpuMemoryBuffer: - if (!is_gpu_memory_buffer_image_allowed || - !Platform::Current()->GetGpuMemoryBufferManager()) { - continue; - } - provider = - std::make_unique<CanvasResourceProviderBitmapGpuMemoryBuffer>( - size, filter_quality, color_params, context_provider_wrapper, - resource_dispatcher); - break; case CanvasResourceType::kSharedBitmap: if (!resource_dispatcher) continue; provider = std::make_unique<CanvasResourceProviderSharedBitmap>( size, filter_quality, color_params, resource_dispatcher); break; - case CanvasResourceType::kTexture: - if (!context_provider_wrapper) - continue; - provider = std::make_unique<CanvasResourceProviderTexture>( - size, msaa_sample_count, filter_quality, color_params, - context_provider_wrapper, resource_dispatcher, is_origin_top_left); - break; case CanvasResourceType::kBitmap: provider = std::make_unique<CanvasResourceProviderBitmap>( size, filter_quality, color_params, context_provider_wrapper, @@ -1233,49 +806,6 @@ return nullptr; } -std::unique_ptr<CanvasResourceProvider> -CanvasResourceProvider::CreateForTesting( - const IntSize& size, - ResourceProviderType type, - base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper, - unsigned msaa_sample_count, - const CanvasColorParams& color_params, - uint8_t presentation_mode, - base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher, - bool is_origin_top_left) { - switch (type) { - case CanvasResourceProvider::kSharedBitmap: - DCHECK(resource_dispatcher); - return std::make_unique<CanvasResourceProviderSharedBitmap>( - size, kLow_SkFilterQuality, color_params, resource_dispatcher); - case CanvasResourceProvider::kTexture: - DCHECK(context_provider_wrapper); - return std::make_unique<CanvasResourceProviderTexture>( - size, msaa_sample_count, kLow_SkFilterQuality, color_params, - context_provider_wrapper, resource_dispatcher, is_origin_top_left); - case CanvasResourceProvider::kBitmap: - return std::make_unique<CanvasResourceProviderBitmap>( - size, kLow_SkFilterQuality, color_params, context_provider_wrapper, - resource_dispatcher); - case CanvasResourceProvider::kSharedImage: - return std::make_unique<CanvasResourceProviderSharedImage>( - size, msaa_sample_count, kLow_SkFilterQuality, color_params, - context_provider_wrapper, resource_dispatcher, is_origin_top_left, - false, false, true); - case CanvasResourceProvider::kTextureGpuMemoryBuffer: - return std::make_unique<CanvasResourceProviderTextureGpuMemoryBuffer>( - size, msaa_sample_count, kLow_SkFilterQuality, color_params, - context_provider_wrapper, resource_dispatcher, is_origin_top_left); - case CanvasResourceProvider::kBitmapGpuMemoryBuffer: - return std::make_unique<CanvasResourceProviderBitmapGpuMemoryBuffer>( - size, kLow_SkFilterQuality, color_params, context_provider_wrapper, - resource_dispatcher); - default: - NOTREACHED(); - return nullptr; - } -} - class CanvasResourceProvider::CanvasImageProvider : public cc::ImageProvider { public: CanvasImageProvider(cc::ImageDecodeCache* cache_n32, @@ -1593,8 +1123,9 @@ // Need to check HasOneRef() because if there are outstanding references to // the resource, it cannot be safely recycled. if (resource->HasOneRef() && resource_recycling_enabled_ && - !is_single_buffered_) + !is_single_buffered_) { canvas_resources_.push_back(std::move(resource)); + } } void CanvasResourceProvider::SetResourceRecyclingEnabled(bool value) {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h index 2446a1f..a2e2129 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
@@ -110,16 +110,6 @@ base::WeakPtr<CanvasResourceDispatcher>, bool is_origin_top_left = true); - static std::unique_ptr<CanvasResourceProvider> CreateForTesting( - const IntSize&, - ResourceProviderType, - base::WeakPtr<WebGraphicsContext3DProviderWrapper>, - unsigned msaa_sample_count, - const CanvasColorParams&, - uint8_t presentation_mode, - base::WeakPtr<CanvasResourceDispatcher>, - bool is_origin_top_left = true); - // Use Snapshot() for capturing a frame that is intended to be displayed via // the compositor. Cases that are destined to be transferred via a // TransferableResource should call ProduceCanvasResource() instead. @@ -195,6 +185,10 @@ // are modified externally from the provider's SkSurface. virtual void NotifyTexParamsModified(const CanvasResource* resource) {} + size_t cached_resources_count_for_testing() const { + return canvas_resources_.size(); + } + protected: gpu::gles2::GLES2Interface* ContextGL() const; GrContext* GetGrContext() const;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc index b14852c..ecec0431 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
@@ -156,16 +156,18 @@ ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform> platform_; }; -TEST_F(CanvasResourceProviderTest, - CanvasResourceProviderTextureGpuMemoryBuffer) { +TEST_F(CanvasResourceProviderTest, CanvasResourceProviderAcceleratedOverlay) { const IntSize kSize(10, 10); const CanvasColorParams kColorParams(kSRGBCanvasColorSpace, kRGBA8CanvasPixelFormat, kNonOpaque); EnsureBufferFormatIsSupported(kColorParams.GetBufferFormat()); + EnsureOverlaysSupported(); - auto provider = CanvasResourceProvider::CreateForTesting( - kSize, CanvasResourceProvider::kTextureGpuMemoryBuffer, - context_provider_wrapper_, 0 /* msaa_sample_count */, kColorParams, + auto provider = CanvasResourceProvider::Create( + kSize, + CanvasResourceProvider::ResourceUsage::kAcceleratedDirect2DResourceUsage, + context_provider_wrapper_, 0 /* msaa_sample_count */, + kMedium_SkFilterQuality, kColorParams, CanvasResourceProvider::kAllowImageChromiumPresentationMode, nullptr /* resource_dispatcher */, true /* is_origin_top_left */); @@ -209,12 +211,12 @@ EXPECT_FALSE(provider->IsSingleBuffered()); } -TEST_F(CanvasResourceProviderTest, - CanvasResourceProviderBitmapGpuMemoryBuffer) { +TEST_F(CanvasResourceProviderTest, CanvasResourceProviderUnacceleratedOverlay) { const IntSize kSize(10, 10); const CanvasColorParams kColorParams(kSRGBCanvasColorSpace, kRGBA8CanvasPixelFormat, kNonOpaque); EnsureBufferFormatIsSupported(kColorParams.GetBufferFormat()); + EnsureOverlaysSupported(); auto provider = CanvasResourceProvider::Create( kSize, @@ -238,15 +240,19 @@ EXPECT_FALSE(provider->IsSingleBuffered()); } -TEST_F(CanvasResourceProviderTest, CanvasResourceProviderSharedImage) { +TEST_F(CanvasResourceProviderTest, + CanvasResourceProviderSharedImageResourceRecycling) { const IntSize kSize(10, 10); const CanvasColorParams kColorParams(kSRGBCanvasColorSpace, kRGBA8CanvasPixelFormat, kNonOpaque); EnsureBufferFormatIsSupported(kColorParams.GetBufferFormat()); - auto provider = CanvasResourceProvider::CreateForTesting( - kSize, CanvasResourceProvider::kSharedImage, context_provider_wrapper_, - 0 /* msaa_sample_count */, kColorParams, + auto provider = CanvasResourceProvider::Create( + kSize, + CanvasResourceProvider::ResourceUsage:: + kAcceleratedCompositedResourceUsage, + context_provider_wrapper_, 0 /* msaa_sample_count */, + kMedium_SkFilterQuality, kColorParams, CanvasResourceProvider::kAllowImageChromiumPresentationMode, nullptr /* resource_dispatcher */, true /* is_origin_top_left */); @@ -295,9 +301,12 @@ kRGBA8CanvasPixelFormat, kNonOpaque); EnsureBufferFormatIsSupported(kColorParams.GetBufferFormat()); - auto provider = CanvasResourceProvider::CreateForTesting( - kSize, CanvasResourceProvider::kSharedImage, context_provider_wrapper_, - 0 /* msaa_sample_count */, kColorParams, + auto provider = CanvasResourceProvider::Create( + kSize, + CanvasResourceProvider::ResourceUsage:: + kAcceleratedCompositedResourceUsage, + context_provider_wrapper_, 0 /* msaa_sample_count */, + kMedium_SkFilterQuality, kColorParams, CanvasResourceProvider::kAllowImageChromiumPresentationMode, nullptr /* resource_dispatcher */, true /* is_origin_top_left */); ASSERT_TRUE(provider->IsValid()); @@ -336,9 +345,12 @@ kRGBA8CanvasPixelFormat, kNonOpaque); EnsureBufferFormatIsSupported(kColorParams.GetBufferFormat()); - auto provider = CanvasResourceProvider::CreateForTesting( - kSize, CanvasResourceProvider::kSharedImage, context_provider_wrapper_, - 0 /* msaa_sample_count */, kColorParams, + auto provider = CanvasResourceProvider::Create( + kSize, + CanvasResourceProvider::ResourceUsage:: + kAcceleratedCompositedResourceUsage, + context_provider_wrapper_, 0 /* msaa_sample_count */, + kMedium_SkFilterQuality, kColorParams, CanvasResourceProvider::kAllowImageChromiumPresentationMode, nullptr /* resource_dispatcher */, true /* is_origin_top_left */); ASSERT_TRUE(provider->IsValid()); @@ -473,7 +485,7 @@ ExternalCanvasResource::Create( mailbox, kSize, GL_TEXTURE_2D, kColorParams, SharedGpuContext::ContextProviderWrapper(), provider->CreateWeakPtr(), - kNone_SkFilterQuality); + kMedium_SkFilterQuality); // NewOrRecycledResource() would return nullptr before an ImportResource(). EXPECT_TRUE(provider->ImportResource(resource));
diff --git a/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc b/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc index 8328209..1592804 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context_test.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/test/null_task_runner.h" +#include "components/viz/test/test_gles2_interface.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -15,6 +16,7 @@ #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/test/fake_gles2_interface.h" #include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h" +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/khronos/GLES2/gl2ext.h" @@ -71,9 +73,6 @@ MOCK_METHOD1(GenUnverifiedSyncTokenCHROMIUM, void(GLbyte*)); }; -class MailboxSharedGpuContextTest - : public SharedGpuContextTestBase<MailboxMockGLES2Interface> {}; - // Test fixure that simulate a graphics context creation failure, when using gpu // compositing. class BadSharedGpuContextTest : public Test { @@ -210,13 +209,18 @@ EXPECT_FALSE(SharedGpuContext::IsGpuCompositingEnabled()); } -class FakeMailboxGenerator { - STACK_ALLOCATED(); - +class MailboxSharedGpuContextTest : public Test { public: - void ProduceTexture(GLuint texture, GLbyte* name) { *name = counter_++; } + void SetUp() override { + task_runner_ = base::MakeRefCounted<base::NullTaskRunner>(); + handle_ = std::make_unique<base::ThreadTaskRunnerHandle>(task_runner_); + context_ = viz::TestContextProvider::Create(); + InitializeSharedGpuContext(context_.get()); + } - GLbyte counter_ = 1; + scoped_refptr<viz::TestContextProvider> context_; + scoped_refptr<base::NullTaskRunner> task_runner_; + std::unique_ptr<base::ThreadTaskRunnerHandle> handle_; }; TEST_F(MailboxSharedGpuContextTest, MailboxCaching) { @@ -231,104 +235,25 @@ CanvasResourceProvider::kDefaultPresentationMode, nullptr // canvas_resource_dispatcher ); + ASSERT_TRUE(resource_provider->IsAccelerated()); EXPECT_TRUE(resource_provider && resource_provider->IsValid()); scoped_refptr<StaticBitmapImage> image = resource_provider->Snapshot(); - testing::Mock::VerifyAndClearExpectations(&gl_); + GLenum texture_target = GL_TEXTURE_2D; + gpu::Mailbox mailbox[3]; - FakeMailboxGenerator mailboxGenerator; - gpu::Mailbox mailbox; - GLenum texture_target; - mailbox.name[0] = 0; - - EXPECT_CALL(gl_, ProduceTextureDirectCHROMIUM(_, mailbox.name)) - .Times(1) - .WillOnce(testing::Invoke(&mailboxGenerator, - &FakeMailboxGenerator::ProduceTexture)); + // Creating the SkImage representation from the shared image mailbox registers + // the same mailbox mapping to this SkImage with the cache. This ensures we + // don't recreate a non-shared image mailbox if going from SkImage to mailbox. + mailbox[0] = image->GetMailbox(); + SharedGpuContext::ContextProviderWrapper()->Utils()->GetMailboxForSkImage( + mailbox[1], texture_target, + image->PaintImageForCurrentFrame().GetSkImage(), GL_NEAREST); + EXPECT_EQ(mailbox[0], mailbox[1]); SharedGpuContext::ContextProviderWrapper()->Utils()->GetMailboxForSkImage( - mailbox, texture_target, image->PaintImageForCurrentFrame().GetSkImage(), - GL_NEAREST); - - EXPECT_EQ(mailbox.name[0], 1); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, ProduceTextureDirectCHROMIUM(_, mailbox.name)) - .Times(0); // ProduceTextureDirectCHROMIUM must not be called! - - mailbox.name[0] = 0; - SharedGpuContext::ContextProviderWrapper()->Utils()->GetMailboxForSkImage( - mailbox, texture_target, image->PaintImageForCurrentFrame().GetSkImage(), - GL_NEAREST); - EXPECT_EQ(mailbox.name[0], 1); - - testing::Mock::VerifyAndClearExpectations(&gl_); -} - -TEST_F(MailboxSharedGpuContextTest, MailboxCacheSurvivesSkiaRecycling) { - IntSize size(10, 10); - std::unique_ptr<CanvasResourceProvider> resource_provider = - CanvasResourceProvider::Create( - size, - CanvasResourceProvider::ResourceUsage::kAcceleratedResourceUsage, - SharedGpuContext::ContextProviderWrapper(), - 0, // msaa_sample_count - kLow_SkFilterQuality, CanvasColorParams(), - CanvasResourceProvider::kDefaultPresentationMode, - nullptr // canvas_resource_dispatcher - ); - EXPECT_TRUE(resource_provider && resource_provider->IsValid()); - scoped_refptr<StaticBitmapImage> image = resource_provider->Snapshot(); - testing::Mock::VerifyAndClearExpectations(&gl_); - - FakeMailboxGenerator mailboxGenerator; - gpu::Mailbox mailbox; - GLenum texture_target; - mailbox.name[0] = 0; - - EXPECT_CALL(gl_, ProduceTextureDirectCHROMIUM(_, mailbox.name)) - .Times(1) - .WillOnce(testing::Invoke(&mailboxGenerator, - &FakeMailboxGenerator::ProduceTexture)); - - SharedGpuContext::ContextProviderWrapper()->Utils()->GetMailboxForSkImage( - mailbox, texture_target, image->PaintImageForCurrentFrame().GetSkImage(), - GL_NEAREST); - - EXPECT_EQ(mailbox.name[0], 1); - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Destroy image and surface to return texture to recleable resource pool - image = nullptr; - resource_provider = nullptr; - - testing::Mock::VerifyAndClearExpectations(&gl_); - - // Re-creating surface should recycle the old GrTexture inside skia - resource_provider = CanvasResourceProvider::Create( - size, CanvasResourceProvider::ResourceUsage::kAcceleratedResourceUsage, - SharedGpuContext::ContextProviderWrapper(), - 0, // msaa_sample_count - kLow_SkFilterQuality, CanvasColorParams(), - CanvasResourceProvider::kDefaultPresentationMode, - nullptr // canvas_resource_dispatcher - ); - - EXPECT_TRUE(resource_provider && resource_provider->IsValid()); - image = resource_provider->Snapshot(); - - testing::Mock::VerifyAndClearExpectations(&gl_); - - EXPECT_CALL(gl_, ProduceTextureDirectCHROMIUM(_, mailbox.name)) - .Times(0); // ProduceTextureDirectCHROMIUM must not be called! - - mailbox.name[0] = 0; - SharedGpuContext::ContextProviderWrapper()->Utils()->GetMailboxForSkImage( - mailbox, texture_target, image->PaintImageForCurrentFrame().GetSkImage(), - GL_NEAREST); - EXPECT_EQ(mailbox.name[0], 1); - - testing::Mock::VerifyAndClearExpectations(&gl_); + mailbox[2], texture_target, + image->PaintImageForCurrentFrame().GetSkImage(), GL_NEAREST); + EXPECT_EQ(mailbox[1], mailbox[2]); } } // unnamed namespace
diff --git a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc index 234ac00..d0ac4be0 100644 --- a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc +++ b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
@@ -154,9 +154,8 @@ void MailboxTextureHolder::InitCommon() { DCHECK(!thread_id_); - Thread* thread = Thread::Current(); - thread_id_ = thread->ThreadId(); - texture_thread_task_runner_ = thread->GetTaskRunner(); + thread_id_ = base::PlatformThread::CurrentId(); + texture_thread_task_runner_ = Thread::Current()->GetTaskRunner(); } bool MailboxTextureHolder::IsValid() const { @@ -169,7 +168,7 @@ } bool MailboxTextureHolder::IsCrossThread() const { - return thread_id_ != Thread::Current()->ThreadId(); + return thread_id_ != base::PlatformThread::CurrentId(); } MailboxTextureHolder::~MailboxTextureHolder() { @@ -177,8 +176,7 @@ new gpu::SyncToken(mailbox_ref()->sync_token())); std::unique_ptr<gpu::Mailbox> passed_mailbox(new gpu::Mailbox(mailbox_)); - if (texture_thread_task_runner_ && - thread_id_ != Thread::Current()->ThreadId()) { + if (texture_thread_task_runner_ && IsCrossThread()) { PostCrossThreadTask( *texture_thread_task_runner_, FROM_HERE, CrossThreadBindOnce(&ReleaseTexture, is_converted_from_skia_texture_,
diff --git a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h index 930f022d..da4d680 100644 --- a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h +++ b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h
@@ -72,7 +72,7 @@ unsigned texture_id_; bool is_converted_from_skia_texture_; scoped_refptr<base::SingleThreadTaskRunner> texture_thread_task_runner_; - PlatformThreadId thread_id_; + base::PlatformThreadId thread_id_; bool did_issue_ordering_barrier_ = false; SkImageInfo sk_image_info_; GLenum texture_target_;
diff --git a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h index dff0d5ca..499dbd6 100644 --- a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h +++ b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_FAKE_CANVAS_RESOURCE_HOST_H_ #include "third_party/blink/renderer/platform/graphics/canvas_resource_host.h" +#include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -45,19 +46,10 @@ CanvasResourceProvider::kAllowImageChromiumPresentationMode; } - std::unique_ptr<CanvasResourceProvider> provider; - if (provider_type_) { - provider = CanvasResourceProvider::CreateForTesting( - size_, *provider_type_, SharedGpuContext::ContextProviderWrapper(), 0, - CanvasColorParams(), presentation_mode, nullptr); - } else { - provider = CanvasResourceProvider::Create( - size_, usage, SharedGpuContext::ContextProviderWrapper(), 0, - kLow_SkFilterQuality, CanvasColorParams(), presentation_mode, - nullptr); - } - - ReplaceResourceProvider(std::move(provider)); + ReplaceResourceProvider(CanvasResourceProvider::Create( + size_, usage, SharedGpuContext::ContextProviderWrapper(), 0, + kMedium_SkFilterQuality, CanvasColorParams(), presentation_mode, + nullptr)); return ResourceProvider(); } @@ -65,12 +57,7 @@ return kLow_SkFilterQuality; } - void set_provider_type(CanvasResourceProvider::ResourceProviderType type) { - provider_type_ = type; - } - private: - base::Optional<CanvasResourceProvider::ResourceProviderType> provider_type_; IntSize size_; };
diff --git a/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.cc b/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.cc new file mode 100644 index 0000000..296aa8a --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.cc
@@ -0,0 +1,31 @@ +// 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. + +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" + +#include "components/viz/test/test_context_provider.h" +#include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" +#include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" + +namespace blink { + +void InitializeSharedGpuContext(viz::TestContextProvider* context_provider, + cc::ImageDecodeCache* cache) { + auto factory = [](gpu::gles2::GLES2Interface* gl, GrContext* context, + cc::ImageDecodeCache* cache, bool* gpu_compositing_disabled) + -> std::unique_ptr<WebGraphicsContext3DProvider> { + *gpu_compositing_disabled = false; + return std::make_unique<FakeWebGraphicsContext3DProvider>(gl, cache, + context); + }; + context_provider->BindToCurrentThread(); + gpu::gles2::GLES2Interface* gl = context_provider->ContextGL(); + GrContext* context = context_provider->GrContext(); + SharedGpuContext::SetContextProviderFactoryForTesting( + WTF::BindRepeating(factory, WTF::Unretained(gl), WTF::Unretained(context), + WTF::Unretained(cache))); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h b/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h new file mode 100644 index 0000000..bbccb968 --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h
@@ -0,0 +1,23 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_GPU_TEST_UTILS_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_GPU_TEST_UTILS_H_ + +namespace cc { +class ImageDecodeCache; +} + +namespace viz { +class TestContextProvider; +} + +namespace blink { + +void InitializeSharedGpuContext(viz::TestContextProvider* context_provider, + cc::ImageDecodeCache* cache = nullptr); + +} + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_GPU_TEST_UTILS_H_
diff --git a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni index 0c0fb6cb..52bf92e 100644 --- a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni +++ b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
@@ -7,6 +7,11 @@ "//media/mojo/mojom/audio_parameters.typemap", "//mojo/public/cpp/base/values.typemap", "//services/network/public/cpp/http_request_headers.typemap", + "//services/network/public/cpp/ip_address_for_blink.typemap", + "//services/network/public/cpp/ip_endpoint_for_blink.typemap", + "//services/network/public/cpp/network_interface_for_blink.typemap", + "//services/network/public/cpp/mutable_network_traffic_annotation_tag.typemap", + "//services/network/public/cpp/p2p.typemap", "//third_party/blink/renderer/core/messaging/blink_cloneable_message.typemap", "//third_party/blink/renderer/core/messaging/blink_transferable_message.typemap", "//third_party/blink/renderer/modules/indexeddb/indexed_db_blink.typemap",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index d796a83..e9e1fc49 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -195,7 +195,6 @@ crbug.com/774873 [ Win ] virtual/exotic-color-space/images/color-profile-border-fade.html [ Pass Failure ] crbug.com/974652 [ Linux Debug ] virtual/gpu/fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ] -crbug.com/900706 [ Mac ] virtual/gpu/fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ] crbug.com/974666 [ Mac10.13 ] http/tests/misc/object-embedding-svg-delayed-size-negotiation-2.htm [ Pass Failure ] crbug.com/974720 [ Mac10.13 ] fast/text/firstline/capitalize-transform-2.html [ Pass Crash ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 31a376e..e8ddc32c 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -439,47 +439,47 @@ { "prefix": "dark-mode", "base": "paint/dark-mode/grayscale-images", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeImageStyle=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeImageStyle=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/image-filter-all", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/image-filter-none", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeImagePolicy=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeImagePolicy=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/image-filter-smart", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeImagePolicy=2,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeImagePolicy=2,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/native-theme-off", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/native-theme-on", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/page-policy-all", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModePagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModePagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/page-policy-background", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModePagePolicy=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModePagePolicy=1,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "dark-mode", "base": "paint/dark-mode/svg-invert-all", - "args": ["--blink-settings=darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] + "args": ["--blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=3,darkModeImagePolicy=0,darkModeTextBrightnessThreshold=256,darkModeBackgroundBrightnessThreshold=0"] }, { "prefix": "presentation",
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/elements-forms.js b/third_party/blink/web_tests/external/wpt/html/dom/elements-forms.js index 051bc208..448a72f5 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/elements-forms.js +++ b/third_party/blink/web_tests/external/wpt/html/dom/elements-forms.js
@@ -27,7 +27,6 @@ accept: "string", alt: "string", autocomplete: {type: "string", customGetter: true}, - autofocus: "boolean", defaultChecked: {type: "boolean", domAttrName: "checked"}, dirName: "string", disabled: "boolean", @@ -65,7 +64,6 @@ useMap: "string", }, button: { - autofocus: "boolean", disabled: "boolean", // "formAction" has magic hard-coded in reflection.js formAction: "url", @@ -79,7 +77,6 @@ }, select: { autocomplete: {type: "string", customGetter: true}, - autofocus: "boolean", disabled: "boolean", multiple: "boolean", name: "string", @@ -99,7 +96,6 @@ }, textarea: { autocomplete: {type: "string", customGetter: true}, - autofocus: "boolean", cols: {type: "limited unsigned long with fallback", defaultVal: 20}, dirName: "string", disabled: "boolean",
diff --git "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt" index 234075d..862e87d 100644 --- "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt" +++ "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1271 tests; 1223 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1271 tests; 1224 PASS, 47 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS idl_test setup PASS Partial interface Document: original interface defined PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined @@ -1238,7 +1238,7 @@ PASS SVGElement interface: attribute onpaste PASS SVGElement interface: attribute dataset PASS SVGElement interface: attribute nonce -FAIL SVGElement interface: attribute autofocus assert_true: The prototype object must have a property "autofocus" expected true got false +PASS SVGElement interface: attribute autofocus PASS SVGElement interface: attribute tabIndex PASS SVGElement interface: operation focus(FocusOptions) PASS SVGElement interface: operation blur()
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt index 579bca6..6c354e7 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 3589 tests; 3549 PASS, 40 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 3589 tests; 3551 PASS, 38 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS idl_test setup PASS Partial interface Document: original interface defined PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined @@ -173,7 +173,7 @@ PASS HTMLElement interface: attribute inputMode PASS HTMLElement interface: attribute dataset PASS HTMLElement interface: attribute nonce -FAIL HTMLElement interface: attribute autofocus assert_true: The prototype object must have a property "autofocus" expected true got false +PASS HTMLElement interface: attribute autofocus PASS HTMLElement interface: attribute tabIndex PASS HTMLElement interface: operation focus(FocusOptions) PASS HTMLElement interface: operation blur() @@ -263,7 +263,7 @@ PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type -FAIL HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" with the proper type assert_inherits: property "autofocus" not found in prototype chain +PASS HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus(FocusOptions)" with the proper type PASS HTMLElement interface: calling focus(FocusOptions) on document.createElement("noscript") with too few arguments must throw TypeError
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/reflection-embedded-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/reflection-embedded-expected.txt index 1b843e3..969c1d2 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/reflection-embedded-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/reflection-embedded-expected.txt
@@ -1,9 +1,10 @@ This is a testharness.js-based test. -Found 8134 tests; 8028 PASS, 106 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 8641 tests; 8535 PASS, 106 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS picture.title: 38 tests PASS picture.lang: 38 tests PASS picture.dir: 68 tests PASS picture.className (<picture class>): 38 tests +PASS picture.autofocus: 39 tests PASS picture.hidden: 39 tests PASS picture.accessKey: 38 tests PASS picture.tabIndex: 26 tests @@ -11,6 +12,7 @@ PASS img.lang: 38 tests PASS img.dir: 68 tests PASS img.className (<img class>): 38 tests +PASS img.autofocus: 39 tests PASS img.hidden: 39 tests PASS img.accessKey: 38 tests PASS img.tabIndex: 26 tests @@ -59,6 +61,7 @@ PASS iframe.lang: 38 tests PASS iframe.dir: 68 tests PASS iframe.className (<iframe class>): 38 tests +PASS iframe.autofocus: 39 tests PASS iframe.hidden: 39 tests PASS iframe.accessKey: 38 tests PASS iframe.tabIndex: 26 tests @@ -176,6 +179,7 @@ PASS embed.lang: 38 tests PASS embed.dir: 68 tests PASS embed.className (<embed class>): 38 tests +PASS embed.autofocus: 39 tests PASS embed.hidden: 39 tests PASS embed.accessKey: 38 tests PASS embed.tabIndex: 26 tests @@ -189,6 +193,7 @@ PASS object.lang: 38 tests PASS object.dir: 68 tests PASS object.className (<object class>): 38 tests +PASS object.autofocus: 39 tests PASS object.hidden: 39 tests PASS object.accessKey: 38 tests PASS object.tabIndex: 26 tests @@ -212,6 +217,7 @@ PASS param.lang: 38 tests PASS param.dir: 68 tests PASS param.className (<param class>): 38 tests +PASS param.autofocus: 39 tests PASS param.hidden: 39 tests PASS param.accessKey: 38 tests PASS param.tabIndex: 26 tests @@ -223,6 +229,7 @@ PASS video.lang: 38 tests PASS video.dir: 68 tests PASS video.className (<video class>): 38 tests +PASS video.autofocus: 39 tests PASS video.hidden: 39 tests PASS video.accessKey: 38 tests PASS video.tabIndex: 26 tests @@ -241,6 +248,7 @@ PASS audio.lang: 38 tests PASS audio.dir: 68 tests PASS audio.className (<audio class>): 38 tests +PASS audio.autofocus: 39 tests PASS audio.hidden: 39 tests PASS audio.accessKey: 38 tests PASS audio.tabIndex: 26 tests @@ -255,6 +263,7 @@ PASS source.lang: 38 tests PASS source.dir: 68 tests PASS source.className (<source class>): 38 tests +PASS source.autofocus: 39 tests PASS source.hidden: 39 tests PASS source.accessKey: 38 tests PASS source.tabIndex: 26 tests @@ -267,6 +276,7 @@ PASS track.lang: 38 tests PASS track.dir: 68 tests PASS track.className (<track class>): 38 tests +PASS track.autofocus: 39 tests PASS track.hidden: 39 tests PASS track.accessKey: 38 tests PASS track.tabIndex: 26 tests @@ -279,6 +289,7 @@ PASS canvas.lang: 38 tests PASS canvas.dir: 68 tests PASS canvas.className (<canvas class>): 38 tests +PASS canvas.autofocus: 39 tests PASS canvas.hidden: 39 tests PASS canvas.accessKey: 38 tests PASS canvas.tabIndex: 26 tests @@ -288,6 +299,7 @@ PASS map.lang: 38 tests PASS map.dir: 68 tests PASS map.className (<map class>): 38 tests +PASS map.autofocus: 39 tests PASS map.hidden: 39 tests PASS map.accessKey: 38 tests PASS map.tabIndex: 26 tests @@ -296,6 +308,7 @@ PASS area.lang: 38 tests PASS area.dir: 68 tests PASS area.className (<area class>): 38 tests +PASS area.autofocus: 39 tests PASS area.hidden: 39 tests PASS area.accessKey: 38 tests PASS area.tabIndex: 26 tests
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/reflection-metadata-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/reflection-metadata-expected.txt index 31c3689b..69f32cd 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/reflection-metadata-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/reflection-metadata-expected.txt
@@ -1,9 +1,10 @@ This is a testharness.js-based test. -Found 2802 tests; 2716 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 3036 tests; 2950 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS head.title: 38 tests PASS head.lang: 38 tests PASS head.dir: 68 tests PASS head.className (<head class>): 38 tests +PASS head.autofocus: 39 tests PASS head.hidden: 39 tests PASS head.accessKey: 38 tests PASS head.tabIndex: 26 tests @@ -11,6 +12,7 @@ PASS title.lang: 38 tests PASS title.dir: 68 tests PASS title.className (<title class>): 38 tests +PASS title.autofocus: 39 tests PASS title.hidden: 39 tests PASS title.accessKey: 38 tests PASS title.tabIndex: 26 tests @@ -18,6 +20,7 @@ PASS base.lang: 38 tests PASS base.dir: 68 tests PASS base.className (<base class>): 38 tests +PASS base.autofocus: 39 tests PASS base.hidden: 39 tests PASS base.accessKey: 38 tests PASS base.tabIndex: 26 tests @@ -27,6 +30,7 @@ PASS link.lang: 38 tests PASS link.dir: 68 tests PASS link.className (<link class>): 38 tests +PASS link.autofocus: 39 tests PASS link.hidden: 39 tests PASS link.accessKey: 38 tests PASS link.tabIndex: 26 tests @@ -158,6 +162,7 @@ PASS meta.lang: 38 tests PASS meta.dir: 68 tests PASS meta.className (<meta class>): 38 tests +PASS meta.autofocus: 39 tests PASS meta.hidden: 39 tests PASS meta.accessKey: 38 tests PASS meta.tabIndex: 26 tests @@ -169,6 +174,7 @@ PASS style.lang: 38 tests PASS style.dir: 68 tests PASS style.className (<style class>): 38 tests +PASS style.autofocus: 39 tests PASS style.hidden: 39 tests PASS style.accessKey: 38 tests PASS style.tabIndex: 26 tests
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/reflection-misc-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/reflection-misc-expected.txt index 62173d5..6456861b 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/reflection-misc-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/reflection-misc-expected.txt
@@ -1,9 +1,10 @@ This is a testharness.js-based test. -Found 4411 tests; 4394 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 4879 tests; 4862 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS html.title: 38 tests PASS html.lang: 38 tests PASS html.dir: 68 tests PASS html.className (<html class>): 38 tests +PASS html.autofocus: 39 tests PASS html.hidden: 39 tests PASS html.accessKey: 38 tests PASS html.tabIndex: 26 tests @@ -12,6 +13,7 @@ PASS script.lang: 38 tests PASS script.dir: 68 tests PASS script.className (<script class>): 38 tests +PASS script.autofocus: 39 tests PASS script.hidden: 39 tests PASS script.accessKey: 38 tests PASS script.tabIndex: 26 tests @@ -47,6 +49,7 @@ PASS noscript.lang: 38 tests PASS noscript.dir: 68 tests PASS noscript.className (<noscript class>): 38 tests +PASS noscript.autofocus: 39 tests PASS noscript.hidden: 39 tests PASS noscript.accessKey: 38 tests PASS noscript.tabIndex: 26 tests @@ -54,6 +57,7 @@ PASS template.lang: 38 tests PASS template.dir: 68 tests PASS template.className (<template class>): 38 tests +PASS template.autofocus: 39 tests PASS template.hidden: 39 tests PASS template.accessKey: 38 tests PASS template.tabIndex: 26 tests @@ -61,6 +65,7 @@ PASS slot.lang: 38 tests PASS slot.dir: 68 tests PASS slot.className (<slot class>): 38 tests +PASS slot.autofocus: 39 tests PASS slot.hidden: 39 tests PASS slot.accessKey: 38 tests PASS slot.tabIndex: 26 tests @@ -69,6 +74,7 @@ PASS ins.lang: 38 tests PASS ins.dir: 68 tests PASS ins.className (<ins class>): 38 tests +PASS ins.autofocus: 39 tests PASS ins.hidden: 39 tests PASS ins.accessKey: 38 tests PASS ins.tabIndex: 26 tests @@ -78,6 +84,7 @@ PASS del.lang: 38 tests PASS del.dir: 68 tests PASS del.className (<del class>): 38 tests +PASS del.autofocus: 39 tests PASS del.hidden: 39 tests PASS del.accessKey: 38 tests PASS del.tabIndex: 26 tests @@ -87,6 +94,7 @@ PASS details.lang: 38 tests PASS details.dir: 68 tests PASS details.className (<details class>): 38 tests +PASS details.autofocus: 39 tests PASS details.hidden: 39 tests PASS details.accessKey: 38 tests PASS details.tabIndex: 26 tests @@ -95,6 +103,7 @@ PASS summary.lang: 38 tests PASS summary.dir: 68 tests PASS summary.className (<summary class>): 38 tests +PASS summary.autofocus: 39 tests PASS summary.hidden: 39 tests PASS summary.accessKey: 38 tests PASS summary.tabIndex: 26 tests @@ -102,6 +111,7 @@ PASS menu.lang: 38 tests PASS menu.dir: 68 tests PASS menu.className (<menu class>): 38 tests +PASS menu.autofocus: 39 tests PASS menu.hidden: 39 tests PASS menu.accessKey: 38 tests PASS menu.tabIndex: 26 tests @@ -110,6 +120,7 @@ PASS dialog.lang: 38 tests PASS dialog.dir: 68 tests PASS dialog.className (<dialog class>): 38 tests +PASS dialog.autofocus: 39 tests PASS dialog.hidden: 39 tests PASS dialog.accessKey: 38 tests PASS dialog.tabIndex: 26 tests @@ -118,6 +129,7 @@ PASS undefinedelement.lang: 38 tests PASS undefinedelement.dir: 68 tests PASS undefinedelement.className (<undefinedelement class>): 38 tests +PASS undefinedelement.autofocus: 39 tests PASS undefinedelement.hidden: 39 tests PASS undefinedelement.accessKey: 38 tests PASS undefinedelement.tabIndex: 26 tests
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/reflection-text-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/reflection-text-expected.txt index fb690c5..777c18aa 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/reflection-text-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/reflection-text-expected.txt
@@ -1,9 +1,10 @@ This is a testharness.js-based test. -Found 9003 tests; 8991 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 10134 tests; 10122 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS a.title: 38 tests PASS a.lang: 38 tests PASS a.dir: 68 tests PASS a.className (<a class>): 38 tests +PASS a.autofocus: 39 tests PASS a.hidden: 39 tests PASS a.accessKey: 38 tests PASS a.tabIndex: 26 tests @@ -48,6 +49,7 @@ PASS em.lang: 38 tests PASS em.dir: 68 tests PASS em.className (<em class>): 38 tests +PASS em.autofocus: 39 tests PASS em.hidden: 39 tests PASS em.accessKey: 38 tests PASS em.tabIndex: 26 tests @@ -55,6 +57,7 @@ PASS strong.lang: 38 tests PASS strong.dir: 68 tests PASS strong.className (<strong class>): 38 tests +PASS strong.autofocus: 39 tests PASS strong.hidden: 39 tests PASS strong.accessKey: 38 tests PASS strong.tabIndex: 26 tests @@ -62,6 +65,7 @@ PASS small.lang: 38 tests PASS small.dir: 68 tests PASS small.className (<small class>): 38 tests +PASS small.autofocus: 39 tests PASS small.hidden: 39 tests PASS small.accessKey: 38 tests PASS small.tabIndex: 26 tests @@ -69,6 +73,7 @@ PASS s.lang: 38 tests PASS s.dir: 68 tests PASS s.className (<s class>): 38 tests +PASS s.autofocus: 39 tests PASS s.hidden: 39 tests PASS s.accessKey: 38 tests PASS s.tabIndex: 26 tests @@ -76,6 +81,7 @@ PASS cite.lang: 38 tests PASS cite.dir: 68 tests PASS cite.className (<cite class>): 38 tests +PASS cite.autofocus: 39 tests PASS cite.hidden: 39 tests PASS cite.accessKey: 38 tests PASS cite.tabIndex: 26 tests @@ -83,6 +89,7 @@ PASS q.lang: 38 tests PASS q.dir: 68 tests PASS q.className (<q class>): 38 tests +PASS q.autofocus: 39 tests PASS q.hidden: 39 tests PASS q.accessKey: 38 tests PASS q.tabIndex: 26 tests @@ -91,6 +98,7 @@ PASS dfn.lang: 38 tests PASS dfn.dir: 68 tests PASS dfn.className (<dfn class>): 38 tests +PASS dfn.autofocus: 39 tests PASS dfn.hidden: 39 tests PASS dfn.accessKey: 38 tests PASS dfn.tabIndex: 26 tests @@ -98,6 +106,7 @@ PASS abbr.lang: 38 tests PASS abbr.dir: 68 tests PASS abbr.className (<abbr class>): 38 tests +PASS abbr.autofocus: 39 tests PASS abbr.hidden: 39 tests PASS abbr.accessKey: 38 tests PASS abbr.tabIndex: 26 tests @@ -105,6 +114,7 @@ PASS ruby.lang: 38 tests PASS ruby.dir: 68 tests PASS ruby.className (<ruby class>): 38 tests +PASS ruby.autofocus: 39 tests PASS ruby.hidden: 39 tests PASS ruby.accessKey: 38 tests PASS ruby.tabIndex: 26 tests @@ -112,6 +122,7 @@ PASS rt.lang: 38 tests PASS rt.dir: 68 tests PASS rt.className (<rt class>): 38 tests +PASS rt.autofocus: 39 tests PASS rt.hidden: 39 tests PASS rt.accessKey: 38 tests PASS rt.tabIndex: 26 tests @@ -119,6 +130,7 @@ PASS rp.lang: 38 tests PASS rp.dir: 68 tests PASS rp.className (<rp class>): 38 tests +PASS rp.autofocus: 39 tests PASS rp.hidden: 39 tests PASS rp.accessKey: 38 tests PASS rp.tabIndex: 26 tests @@ -126,6 +138,7 @@ PASS data.lang: 38 tests PASS data.dir: 68 tests PASS data.className (<data class>): 38 tests +PASS data.autofocus: 39 tests PASS data.hidden: 39 tests PASS data.accessKey: 38 tests PASS data.tabIndex: 26 tests @@ -134,6 +147,7 @@ PASS time.lang: 38 tests PASS time.dir: 68 tests PASS time.className (<time class>): 38 tests +PASS time.autofocus: 39 tests PASS time.hidden: 39 tests PASS time.accessKey: 38 tests PASS time.tabIndex: 26 tests @@ -142,6 +156,7 @@ PASS code.lang: 38 tests PASS code.dir: 68 tests PASS code.className (<code class>): 38 tests +PASS code.autofocus: 39 tests PASS code.hidden: 39 tests PASS code.accessKey: 38 tests PASS code.tabIndex: 26 tests @@ -149,6 +164,7 @@ PASS var.lang: 38 tests PASS var.dir: 68 tests PASS var.className (<var class>): 38 tests +PASS var.autofocus: 39 tests PASS var.hidden: 39 tests PASS var.accessKey: 38 tests PASS var.tabIndex: 26 tests @@ -156,6 +172,7 @@ PASS samp.lang: 38 tests PASS samp.dir: 68 tests PASS samp.className (<samp class>): 38 tests +PASS samp.autofocus: 39 tests PASS samp.hidden: 39 tests PASS samp.accessKey: 38 tests PASS samp.tabIndex: 26 tests @@ -163,6 +180,7 @@ PASS kbd.lang: 38 tests PASS kbd.dir: 68 tests PASS kbd.className (<kbd class>): 38 tests +PASS kbd.autofocus: 39 tests PASS kbd.hidden: 39 tests PASS kbd.accessKey: 38 tests PASS kbd.tabIndex: 26 tests @@ -170,6 +188,7 @@ PASS sub.lang: 38 tests PASS sub.dir: 68 tests PASS sub.className (<sub class>): 38 tests +PASS sub.autofocus: 39 tests PASS sub.hidden: 39 tests PASS sub.accessKey: 38 tests PASS sub.tabIndex: 26 tests @@ -177,6 +196,7 @@ PASS sup.lang: 38 tests PASS sup.dir: 68 tests PASS sup.className (<sup class>): 38 tests +PASS sup.autofocus: 39 tests PASS sup.hidden: 39 tests PASS sup.accessKey: 38 tests PASS sup.tabIndex: 26 tests @@ -184,6 +204,7 @@ PASS i.lang: 38 tests PASS i.dir: 68 tests PASS i.className (<i class>): 38 tests +PASS i.autofocus: 39 tests PASS i.hidden: 39 tests PASS i.accessKey: 38 tests PASS i.tabIndex: 26 tests @@ -191,6 +212,7 @@ PASS b.lang: 38 tests PASS b.dir: 68 tests PASS b.className (<b class>): 38 tests +PASS b.autofocus: 39 tests PASS b.hidden: 39 tests PASS b.accessKey: 38 tests PASS b.tabIndex: 26 tests @@ -198,6 +220,7 @@ PASS u.lang: 38 tests PASS u.dir: 68 tests PASS u.className (<u class>): 38 tests +PASS u.autofocus: 39 tests PASS u.hidden: 39 tests PASS u.accessKey: 38 tests PASS u.tabIndex: 26 tests @@ -205,6 +228,7 @@ PASS mark.lang: 38 tests PASS mark.dir: 68 tests PASS mark.className (<mark class>): 38 tests +PASS mark.autofocus: 39 tests PASS mark.hidden: 39 tests PASS mark.accessKey: 38 tests PASS mark.tabIndex: 26 tests @@ -212,6 +236,7 @@ PASS bdi.lang: 38 tests PASS bdi.dir: 68 tests PASS bdi.className (<bdi class>): 38 tests +PASS bdi.autofocus: 39 tests PASS bdi.hidden: 39 tests PASS bdi.accessKey: 38 tests PASS bdi.tabIndex: 26 tests @@ -219,6 +244,7 @@ PASS bdo.lang: 38 tests PASS bdo.dir: 68 tests PASS bdo.className (<bdo class>): 38 tests +PASS bdo.autofocus: 39 tests PASS bdo.hidden: 39 tests PASS bdo.accessKey: 38 tests PASS bdo.tabIndex: 26 tests @@ -226,6 +252,7 @@ PASS span.lang: 38 tests PASS span.dir: 68 tests PASS span.className (<span class>): 38 tests +PASS span.autofocus: 39 tests PASS span.hidden: 39 tests PASS span.accessKey: 38 tests PASS span.tabIndex: 26 tests @@ -233,6 +260,7 @@ PASS br.lang: 38 tests PASS br.dir: 68 tests PASS br.className (<br class>): 38 tests +PASS br.autofocus: 39 tests PASS br.hidden: 39 tests PASS br.accessKey: 38 tests PASS br.tabIndex: 26 tests @@ -241,6 +269,7 @@ PASS wbr.lang: 38 tests PASS wbr.dir: 68 tests PASS wbr.className (<wbr class>): 38 tests +PASS wbr.autofocus: 39 tests PASS wbr.hidden: 39 tests PASS wbr.accessKey: 38 tests PASS wbr.tabIndex: 26 tests
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/reflection.js b/third_party/blink/web_tests/external/wpt/html/dom/reflection.js index 5209762..fca9e43 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/reflection.js +++ b/third_party/blink/web_tests/external/wpt/html/dom/reflection.js
@@ -900,6 +900,7 @@ ReflectionTests.reflects({type: "enum", keywords: ["ltr", "rtl", "auto"]}, "dir", element); ReflectionTests.reflects("string", "className", element, "class"); ReflectionTests.reflects("tokenlist", "classList", element, "class"); + ReflectionTests.reflects("boolean", "autofocus", element); ReflectionTests.reflects("boolean", "hidden", element); ReflectionTests.reflects("string", "accessKey", element); // Don't try to test the defaultVal -- it should be either 0 or -1, but the
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements-expected.txt deleted file mode 100644 index ad7ebdf..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL Contenteditable element should support autofocus assert_equals: expected "DIV" but got "BODY" -FAIL Element with tabindex should support autofocus assert_equals: expected "SPAN" but got "BODY" -PASS Non-HTMLElement should not support autofocus -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements.html index 398577e..7619367 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/autofocus/supported-elements.html
@@ -19,7 +19,7 @@ let w = window.open('/common/blank.html'); await waitForLoad(w); t.add_cleanup(() => { w.close(); }); - w.document.body.innerHTML = '<span tabindex=0></span>'; + w.document.body.innerHTML = '<span tabindex=0 autofocus></span>'; await waitUntilStableAutofocusState(w); assert_equals(w.document.activeElement.tagName, 'SPAN'); }, 'Element with tabindex should support autofocus');
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js b/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js index 01a4e70..025b1f6 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js
@@ -340,13 +340,17 @@ setReadingMessage(message, compatibility = 'nfc-forum') { this.reading_messages_.push({message: message, compatibility: toMojoNDEFCompatibility(compatibility)}); + // Ignore reading if NFCPushOptions.ignoreRead is true + let ignoreRead = false; + if(this.push_options_ && this.push_options_.ignoreRead) + ignoreRead = this.push_options_.ignoreRead; // Triggers onWatch if the new message matches existing watchers for (let watcher of this.watchers_) { - if (matchesWatchOptions( - message, message.compatibility, watcher.options)) { + if (!ignoreRead && matchesWatchOptions( + message, toMojoNDEFCompatibility(compatibility), watcher.options)) { this.client_.onWatch( [watcher.id], fake_tag_serial_number, - toMojoNDEFMessage(message.message)); + toMojoNDEFMessage(message)); } } }
diff --git a/third_party/blink/web_tests/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt b/third_party/blink/web_tests/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt index 653e39d71..63f63d1 100644 --- a/third_party/blink/web_tests/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt +++ b/third_party/blink/web_tests/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. -FAIL <a> should support autofocus assert_equals: expected Element node <a href="#" autofocus="autofocus"></a> but got null -FAIL Renderable element with tabindex should support autofocus assert_equals: expected Element node <path d="M0,0h8v8z" tabindex="0" autofocus="autofocus"></... but got null +PASS <a> should support autofocus +PASS Renderable element with tabindex should support autofocus FAIL Never-rendered element with tabindex should not support autofocus promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'tagName' of null" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NFCWriter_push.https.html b/third_party/blink/web_tests/external/wpt/web-nfc/NFCWriter_push.https.html index dcd2330..cc8c941 100644 --- a/third_party/blink/web_tests/external/wpt/web-nfc/NFCWriter_push.https.html +++ b/third_party/blink/web_tests/external/wpt/web-nfc/NFCWriter_push.https.html
@@ -140,6 +140,23 @@ }, "NFCWriter.push should fail if signal is not an AbortSignal."); nfc_test(async (t, mockNFC) => { + const writer1 = new NFCWriter(); + const writer2 = new NFCWriter(); + const controller = new AbortController(); + mockNFC.setPendingPushCompleted(false); + const p1 = writer1.push(test_text_data, + { signal: controller.signal, timeout: 100 }); + + // Even though push request is grantable, + // this abort should be processed synchronously. + controller.abort(); + await promise_rejects(t, 'AbortError', p1); + + await writer2.push(test_text_data); + assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage()); +}, "Synchronously signaled abort."); + +nfc_test(async (t, mockNFC) => { const writer = new NFCWriter(); mockNFC.setHWStatus(NFCHWStatus.DISABLED); await promise_rejects(t, 'NotReadableError', writer.push(test_text_data)); @@ -288,20 +305,35 @@ }, "Check that provided NFCPushOptions values are correctly converted."); nfc_test(async (t, mockNFC) => { - const writer1 = new NFCWriter(); - const writer2 = new NFCWriter(); + const reader = new NFCReader(); + const message = createMessage([createTextRecord(test_text_data)]); const controller = new AbortController(); - mockNFC.setPendingPushCompleted(false); - const p1 = writer1.push(test_text_data, - { signal: controller.signal, timeout: 100 }); + const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]); + const promise = readerWatcher.wait_for("reading").then(event => { + controller.abort(); + assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message)); + }); - // Even though push request is grantable, - // this abort should be processed synchronously. - controller.abort(); - await promise_rejects(t, 'AbortError', p1); + reader.scan({ signal: controller.signal }); - await writer2.push(test_text_data); + const writer = new NFCWriter(); + await writer.push(test_text_data, { ignoreRead: false }); + mockNFC.setReadingMessage(message); assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage()); -}, "Synchronously signaled abort."); + await promise; +}, "NFCWriter.push should read data when ignoreRead is false."); -</script> +nfc_test(async (t, mockNFC) => { + const reader = new NFCReader(); + const message = createMessage([createTextRecord(test_text_data)]); + // Ignore reading if NFCPushOptions.ignoreRead is true + reader.onreading = t.unreached_func("reading event should not be fired."); + reader.scan(); + + const writer = new NFCWriter(); + await writer.push(test_text_data, { ignoreRead: true }); + mockNFC.setReadingMessage(message); + assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage()); +}, "NFCWriter.push should ignore reading data when ignoreRead is true."); + +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 9fe2c52f..d285d1e 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse.html index 44973ee..bcaacbf 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..4a632e3 --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month.html new file mode 100644 index 0000000..5a54f04 --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script> +testRunner.waitUntilDone(); +</script> +<script src="../../../forms/resources/picker-common.js"></script> +<input type=date id=date value="2018-01-22" min="2018-01-01" max="2018-12-31"> +<script> +openPicker(document.getElementById('date'), () => testRunner.notifyDone()); +</script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index b6881de..9fe4c243 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html index 5e92a8f..b9abc4a9 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html
@@ -1,7 +1,6 @@ <!DOCTYPE html> <html dir="rtl"> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); if (window.internals) internals.settings.setLangAttributeAwareFormControlUIEnabled(true);
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 10e5d62..c458837 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step.html index 0a287e8..f3b43ab 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 2e52d8f..353f7de 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html index 13e65da..6acc1796 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index f8b63e9..5dd0787c 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values.html index a304ae0..a2fa51a67 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png new file mode 100644 index 0000000..58fd6f5 --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html index d90a4fb..f079ddb 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index b8f04b51..24705f1 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html index 6b5025b..6490891 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 826fd1c..c9b97d0 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html index 11268ba..3f24d75 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index dfc1d6f..de32ffd 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html index 38ec1cc..bb5c453 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html
@@ -1,7 +1,6 @@ <!DOCTYPE html> <html dir="rtl"> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); if (window.internals) internals.settings.setLangAttributeAwareFormControlUIEnabled(true);
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index 7c333f8e..2d035bf7 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html index 517a8cf..98e4aee 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 2e67e44..163da87 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html index 7ec16df..134062c 100644 --- a/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html +++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script> -testRunner.setUseMockTheme(false); testRunner.waitUntilDone(); </script> <script src="../../../forms/resources/picker-common.js"></script>
diff --git a/third_party/blink/web_tests/fast/forms/resources/mock-file-chooser.js b/third_party/blink/web_tests/fast/forms/resources/mock-file-chooser.js index dca52d4f..56d69db 100644 --- a/third_party/blink/web_tests/fast/forms/resources/mock-file-chooser.js +++ b/third_party/blink/web_tests/fast/forms/resources/mock-file-chooser.js
@@ -12,7 +12,7 @@ this.baseDir_ = undefined; this.bindingSet_ = new mojo.BindingSet(blink.mojom.FileChooser); this.interceptor_ = new MojoInterfaceInterceptor( - blink.mojom.FileChooser.name); + blink.mojom.FileChooser.name, "context", true); this.interceptor_.oninterfacerequest = e => { this.bindingSet_.addBinding( new MockFileChooser(this, this.paths_, this.baseDir_), e.handle);
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test-expected.txt new file mode 100644 index 0000000..e9e2853 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test-expected.txt
@@ -0,0 +1,6 @@ +Tests accessibility in the Changes drawer. +Showing the Changes drawer. +Running aXe on the Changes drawer. +aXe violations: [] + +
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test.js new file mode 100644 index 0000000..c7e2a65 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/changes/changes-a11y-test.js
@@ -0,0 +1,26 @@ +// 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. + +(async function() { + TestRunner.addResult('Tests accessibility in the Changes drawer.'); + await TestRunner.loadModule('axe_core_test_runner'); + await TestRunner.loadModule('changes'); + + const diff = [ + {0: Diff.Diff.Operation.Insert, 1: ['line 1 inserted']}, + {0: Diff.Diff.Operation.Delete, 1: ['line 2 deleted']}, + ]; + const uiSourceCodeMock = {mimeType: () => {}}; + + TestRunner.addResult('Showing the Changes drawer.'); + await UI.viewManager.showView('changes.changes'); + const changesWidget = await UI.viewManager.view('changes.changes').widget(); + changesWidget._selectedUISourceCode = uiSourceCodeMock; + changesWidget._renderDiffRows(diff); + + TestRunner.addResult('Running aXe on the Changes drawer.'); + await AxeCoreTestRunner.runValidation(changesWidget.contentElement); + + TestRunner.completeTest(); +})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/elements-panel-correct-case-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/elements-panel-correct-case-expected.txt index 61915a8..f7e753dc 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/elements-panel-correct-case-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/elements/elements-panel-correct-case-expected.txt
@@ -4,7 +4,7 @@ - <html> - <head> <base href="http://127.0.0.1:8000/devtools/elements/"> - <link rel="stylesheet" type="text/css" href="resources/elements-panel-styles.css"> + <link rel="stylesheet" href="resources/elements-panel-styles.css"> </head> - <body> - <svg>
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/interstitial-sidebar-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/interstitial-sidebar-expected.txt index 4f24fee..44edcf6d 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/interstitial-sidebar-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/interstitial-sidebar-expected.txt
@@ -3,13 +3,13 @@ Before interstitial is shown: <DIV > <#document-fragment > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=tree-outline-disclosure > <OL class=tree-outline role=tree tabindex=-1 > @@ -115,22 +115,22 @@ </OL> </OL> </DIV> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> </#document-fragment> </DIV> After interstitial is shown: <DIV > <#document-fragment > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=tree-outline-disclosure > <OL class=tree-outline role=tree tabindex=-1 > @@ -236,22 +236,22 @@ </OL> </OL> </DIV> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> </#document-fragment> </DIV> After interstitial is hidden: <DIV > <#document-fragment > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=tree-outline-disclosure > <OL class=tree-outline role=tree tabindex=-1 > @@ -357,9 +357,9 @@ </OL> </OL> </DIV> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> </#document-fragment> </DIV>
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/mixed-content-sidebar-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/mixed-content-sidebar-expected.txt index cd0e0a2..5bc0de01 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/mixed-content-sidebar-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/mixed-content-sidebar-expected.txt
@@ -3,13 +3,13 @@ Origin sidebar: <DIV > <#document-fragment > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=tree-outline-disclosure > <OL class=tree-outline role=tree tabindex=-1 > @@ -115,9 +115,9 @@ </OL> </OL> </DIV> - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> </#document-fragment> </DIV>
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-ct-compliance-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-ct-compliance-expected.txt index aa2aca3..0778002 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-ct-compliance-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-ct-compliance-expected.txt
@@ -2,9 +2,9 @@ Panel on origin view: <DIV class=widget vbox security-origin-view slot=insertion-point-main > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=title-section > <DIV class=title-section-header role=heading aria-level=1 >
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-noncryptographic-secure-origin-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-noncryptographic-secure-origin-expected.txt index acbd532..c5eb398 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-noncryptographic-secure-origin-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-noncryptographic-secure-origin-expected.txt
@@ -2,9 +2,9 @@ Panel on origin view: <DIV class=widget vbox security-origin-view slot=insertion-point-main > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=title-section > <DIV class=title-section-header role=heading aria-level=1 >
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-then-interstitial-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-then-interstitial-expected.txt index d3ee9c1..b88d357 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/origin-view-then-interstitial-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/origin-view-then-interstitial-expected.txt
@@ -30,9 +30,9 @@ </DIV> Panel on origin view before interstitial: <DIV class=widget vbox security-origin-view slot=insertion-point-main > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=title-section > <DIV class=title-section-header role=heading aria-level=1 >
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/security-details-updated-with-security-state-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/security-details-updated-with-security-state-expected.txt index bf2aa7e..f5329b6 100644 --- a/third_party/blink/web_tests/http/tests/devtools/security/security-details-updated-with-security-state-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/security/security-details-updated-with-security-state-expected.txt
@@ -46,9 +46,9 @@ </SPAN> Origin view ------------------------------------ <DIV class=widget vbox security-origin-view slot=insertion-point-main > - <STYLE type=text/css > + <STYLE > </STYLE> - <STYLE type=text/css > + <STYLE > </STYLE> <DIV class=title-section > <DIV class=title-section-header role=heading aria-level=1 >
diff --git a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt index 9c8fe69..47ffa25 100644 --- a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt +++ b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt
@@ -2,8 +2,8 @@ main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame main frame - BeginNavigation request to 'http://127.0.0.1:8000/history/post-replace-state-reload.html', http method POST -main frame - DidStartNavigation main frame - didFinishLoadForFrame +main frame - DidStartNavigation main frame - didHandleOnloadEventsForFrame main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame @@ -11,8 +11,8 @@ main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame main frame - BeginNavigation request to 'http://127.0.0.1:8000/history/post-replace-state-reload.html', http method GET -main frame - DidStartNavigation main frame - didFinishLoadForFrame +main frame - DidStartNavigation main frame - didHandleOnloadEventsForFrame main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt b/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt index 8af010d..e9ba775 100644 --- a/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt
@@ -4,8 +4,8 @@ main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/post-to-303-target.php', http method POST -main frame - DidStartNavigation main frame - didFinishLoadForFrame +main frame - DidStartNavigation main frame - didHandleOnloadEventsForFrame main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt b/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt index b81bd2a4..42fcee97 100644 --- a/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt
@@ -10,7 +10,6 @@ frame "iframe" - didCommitLoadForFrame CONSOLE MESSAGE: line 12: iframe: clicking frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/onreadystatechange-detach-iframe.html?done', http method GET -frame "iframe" - DidStartNavigation CONSOLE MESSAGE: line 5: iframe: onreadystatechange frame "iframe" - didFailLoadWithError main frame - didHandleOnloadEventsForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt b/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt index f2f60e2..e8fd11e 100644 --- a/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt
@@ -21,8 +21,8 @@ frame "0" - didReceiveTitle: frame "0" - didFinishDocumentLoadForFrame frame "0" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST -frame "0" - DidStartNavigation frame "0" - didFinishLoadForFrame +frame "0" - DidStartNavigation frame "0" - didHandleOnloadEventsForFrame frame "0" - ReadyToCommitNavigation frame "0" - didCommitLoadForFrame @@ -46,8 +46,8 @@ frame "1" - didReceiveTitle: frame "1" - didFinishDocumentLoadForFrame frame "1" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST -frame "1" - DidStartNavigation frame "1" - didFinishLoadForFrame +frame "1" - DidStartNavigation frame "1" - didHandleOnloadEventsForFrame frame "1" - ReadyToCommitNavigation frame "1" - didCommitLoadForFrame @@ -71,8 +71,8 @@ frame "2" - didReceiveTitle: frame "2" - didFinishDocumentLoadForFrame frame "2" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST -frame "2" - DidStartNavigation frame "2" - didFinishLoadForFrame +frame "2" - DidStartNavigation frame "2" - didHandleOnloadEventsForFrame frame "2" - ReadyToCommitNavigation frame "2" - didCommitLoadForFrame @@ -96,8 +96,8 @@ frame "3" - didReceiveTitle: frame "3" - didFinishDocumentLoadForFrame frame "3" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST -frame "3" - DidStartNavigation frame "3" - didFinishLoadForFrame +frame "3" - DidStartNavigation frame "3" - didHandleOnloadEventsForFrame frame "3" - ReadyToCommitNavigation frame "3" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt index 1b64335a..41a193b 100644 --- a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt
@@ -4,8 +4,8 @@ main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame main frame - BeginNavigation request to 'http://127.0.0.1:8000/navigation/resources/pass-and-notify-done.html', http method GET -main frame - DidStartNavigation main frame - didFinishLoadForFrame +main frame - DidStartNavigation main frame - didHandleOnloadEventsForFrame main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 988d42a..198aa5c 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..1351c026 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index 2654253..5633cb4 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 0de9f795..0ca849054 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index f60570a..ef5682fe 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index e49e4e2..951bc93 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index 19dec33..eaba86a95 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 50144a9..b3296ff 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index ec3a6c5..cddafa8 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 3a88a05f8..26a52f61 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index b3cee49..bd58da0 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index c97cab99..041789d 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 0a513e5..d01817bc 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..6f84410 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index 0a513e5..4ee46d1 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index e427f962..7608bde 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 25bbe0e..35ef34b3 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 8db9f9b..d33184d2 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index d2dc229..090c4b00 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index 37f240f5..11ee8c2 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index e5435390..03a51da 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 2a331e8..03aa5631 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 4b3ed0e..7a18dbf5 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 3b3e948..13b29bd 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index e08df3e4..d40fb99f 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index b12dcc6..60228aca 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..7e084d21c --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 94f4cfe..6dd9f49 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..0020649 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index 94f4cfe..000f5628 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index a164f0e..3e95e992 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 07803f4..afda2ce4 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index b87b1cd..10262594 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index 3839e97..61403cb 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index 64ad5a4..5a84fcf2 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 1a148a2c..db39750a 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index d4bf225..43b3ef5 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 41ceb9f..1116b9d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index a977220..194d4a9 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index 5b8f020..a455405 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 29de720..bb1eab6 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..d284b17 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index f8cb9061..8d08357 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..16c03cb1 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index f8cb9061..ae4c61d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index abc71f5..7188f6d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 8363ebb..51bde1d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 157f2941..7599ab66 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index b8b5462..9a80afe 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index f8c2545..f2e18c0 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 6533118..781da53 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index aa8840d..0100c12 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 670eb2f5..4a6a434 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index f6e694c..70fa82c 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index ed2861a..8e104a5 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index a24f5843..b7c6f19 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..15b86863 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index c51739af..8d08357 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..16c03cb1 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index c51739af..ae4c61d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index d18adf1b..7188f6d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index e8bf26be..51bde1d 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 232b5168..7599ab66 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index 2ce0952..9a80afe 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index bf664e3a..f2e18c0 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index f1eaf9a7..781da53 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 0822edb..0100c12 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 9e719fd..4a6a434 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 00fb45c..70fa82c 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index f2d8103..8e104a5 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 0b5ef30..b7c6f19 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 997116bb..0ff1b2d 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..bcc3bfb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index 997116bb..9970ac5 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index feed194e..c3409e6 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 76e4f19..95f23bd 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index e2495c3..4fab3ea 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index fc04413f..c37fbe4 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index bf664e3a..d219cb69 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index f1eaf9a7..624672b 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 0822edb..b575b6f 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 9e719fd..fc57d22 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 08ae918..51deeb7f 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index f2d8103..6271e8a 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 1f3729b..dae9b39 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..8a220f6e --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 997116bb..0ff1b2d 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..bcc3bfb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index 997116bb..9970ac5 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index feed194e..c3409e6 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 76e4f19..95f23bd 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index e2495c3..4fab3ea 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index fc04413f..c37fbe4 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index bf664e3a..d219cb69 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index f1eaf9a7..624672b 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 0822edb..b575b6f 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index 9e719fd..fc57d22 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 08ae918..51deeb7f 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index f2d8103..6271e8a 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 1f3729b..dae9b39 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/OffscreenCanvas-copyImage-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/OffscreenCanvas-copyImage-expected.txt index 629ef17..0500d46 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/OffscreenCanvas-copyImage-expected.txt +++ b/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/OffscreenCanvas-copyImage-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL CopyImageOnTransferredCanvas assert_array_equals: The copied image's top left is red property 0, expected 255 but got 0 +PASS CopyImageOnTransferredCanvas Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png deleted file mode 100644 index 33d6918..0000000 --- a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index e879b521..3e2e4cf 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..2003352 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index e879b521..4f69b5c 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index aea6c8e..9cd10ad9 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 6a075ac..e5f8e83 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index a4d2a93fb..dd25610 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index 0a83fb8..7a1ee86a 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index 4b945793..6c974cf4 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 34efdb34..3b895b1 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 06dbf77..523dd550 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index c1aa5ee..570ca0e 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index dcb8856..0819b466 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index 9bec721..753575f 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 30e7dc7..a987555 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 0f0a004..1704a64 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..188dacc8 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index b6718398..65a53fca 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index f07e582..b78f467 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 8e8f349..9ccdef8 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index 08512390..db35baf 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index 58043ff1..311274f0 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 1b758cb..837c58f 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index e4bb592..cb0e4df9 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index e3945ca..d636cb6 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index efe1b75..02ca463 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 5179ffb..05342d21 100644 --- a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png index 349e0557..11d1d3d 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-coarse-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png new file mode 100644 index 0000000..2fd53ea --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png index 349e0557..c31c9c60 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png index 8b6f49c5d..a262359 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png index 5d2f6cbb..e4b801d 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png index 6228e35..cd04a0b 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png index 45d7374d..b54703b 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png index d3595685..c90b05a2 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png index 6e476d42..31f5afa 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png index 5e61daaa..f315075 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png index a195b69..9cc8a42 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png index 7dfcd92..3798d613 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png index 785e5ed..e3d3f0b4 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png index 8bd93e27..0182e1a7 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt index 0b5b00e4..5d8dfbf 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -35,6 +35,7 @@ property attributeStyleMap property attributes property autocapitalize + property autofocus property baseURI property before property blur @@ -403,7 +404,6 @@ html element br property clear html element button - property autofocus property checkValidity property disabled property form @@ -629,7 +629,6 @@ property align property alt property autocomplete - property autofocus property checkValidity property checked property defaultChecked @@ -859,7 +858,6 @@ html element select property add property autocomplete - property autofocus property checkValidity property disabled property form @@ -957,7 +955,6 @@ property content html element textarea property autocomplete - property autofocus property checkValidity property cols property defaultValue @@ -1155,6 +1152,7 @@ property attachShadow property attributeStyleMap property attributes + property autofocus property baseURI property before property blur
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index 7c24d545..dbf1d52 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -2144,7 +2144,6 @@ setter vLink interface HTMLButtonElement : HTMLElement attribute @@toStringTag - getter autofocus getter disabled getter form getter formAction @@ -2163,7 +2162,6 @@ method constructor method reportValidity method setCustomValidity - setter autofocus setter disabled setter formAction setter formEnctype @@ -2244,6 +2242,7 @@ attribute @@toStringTag getter accessKey getter autocapitalize + getter autofocus getter contentEditable getter dataset getter dir @@ -2361,6 +2360,7 @@ method focus setter accessKey setter autocapitalize + setter autofocus setter contentEditable setter dir setter draggable @@ -2733,7 +2733,6 @@ getter align getter alt getter autocomplete - getter autofocus getter checked getter defaultChecked getter defaultValue @@ -2791,7 +2790,6 @@ setter align setter alt setter autocomplete - setter autofocus setter checked setter defaultChecked setter defaultValue @@ -3209,7 +3207,6 @@ interface HTMLSelectElement : HTMLElement attribute @@toStringTag getter autocomplete - getter autofocus getter disabled getter form getter labels @@ -3236,7 +3233,6 @@ method reportValidity method setCustomValidity setter autocomplete - setter autofocus setter disabled setter length setter multiple @@ -3411,7 +3407,6 @@ interface HTMLTextAreaElement : HTMLElement attribute @@toStringTag getter autocomplete - getter autofocus getter cols getter defaultValue getter dirName @@ -3443,7 +3438,6 @@ method setRangeText method setSelectionRange setter autocomplete - setter autofocus setter cols setter defaultValue setter dirName @@ -5584,6 +5578,7 @@ method constructor interface SVGElement : Element attribute @@toStringTag + getter autofocus getter className getter dataset getter nonce @@ -5682,6 +5677,7 @@ method blur method constructor method focus + setter autofocus setter nonce setter onabort setter onanimationend
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 7c8398e..8dfc2e80 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -88,6 +88,7 @@ property attributeStyleMap property attributes property autocapitalize + property autofocus property baseURI property before property blur @@ -472,7 +473,6 @@ html element br property clear html element button - property autofocus property checkValidity property disabled property form @@ -701,7 +701,6 @@ property align property alt property autocomplete - property autofocus property checkValidity property checked property defaultChecked @@ -940,7 +939,6 @@ html element select property add property autocomplete - property autofocus property checkValidity property disabled property form @@ -1039,7 +1037,6 @@ property content html element textarea property autocomplete - property autofocus property checkValidity property cols property defaultValue @@ -1294,6 +1291,7 @@ property attachShadow property attributeStyleMap property attributes + property autofocus property baseURI property before property blur
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index d378192..8b3eb60 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2840,7 +2840,6 @@ setter vLink interface HTMLButtonElement : HTMLElement attribute @@toStringTag - getter autofocus getter disabled getter form getter formAction @@ -2859,7 +2858,6 @@ method constructor method reportValidity method setCustomValidity - setter autofocus setter disabled setter formAction setter formEnctype @@ -2941,6 +2939,7 @@ attribute @@toStringTag getter accessKey getter autocapitalize + getter autofocus getter contentEditable getter dataset getter dir @@ -3063,6 +3062,7 @@ method focus setter accessKey setter autocapitalize + setter autofocus setter contentEditable setter dir setter draggable @@ -3444,7 +3444,6 @@ getter align getter alt getter autocomplete - getter autofocus getter checked getter defaultChecked getter defaultValue @@ -3502,7 +3501,6 @@ setter align setter alt setter autocomplete - setter autofocus setter checked setter defaultChecked setter defaultValue @@ -3939,7 +3937,6 @@ interface HTMLSelectElement : HTMLElement attribute @@toStringTag getter autocomplete - getter autofocus getter disabled getter form getter labels @@ -3966,7 +3963,6 @@ method reportValidity method setCustomValidity setter autocomplete - setter autofocus setter disabled setter length setter multiple @@ -4142,7 +4138,6 @@ interface HTMLTextAreaElement : HTMLElement attribute @@toStringTag getter autocomplete - getter autofocus getter cols getter defaultValue getter dirName @@ -4174,7 +4169,6 @@ method setRangeText method setSelectionRange setter autocomplete - setter autofocus setter cols setter defaultValue setter dirName @@ -6570,6 +6564,7 @@ method constructor interface SVGElement : Element attribute @@toStringTag + getter autofocus getter className getter dataset getter nonce @@ -6672,6 +6667,7 @@ method blur method constructor method focus + setter autofocus setter nonce setter onabort setter onactivateinvisible
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js index e0ba375..dcb2fd57 100644 --- a/third_party/closure_compiler/externs/passwords_private.js +++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -42,7 +42,8 @@ * username: string, * numCharactersInPassword: number, * federationText: (string|undefined), - * id: number + * id: number, + * fromAccountStore: boolean * }} */ chrome.passwordsPrivate.PasswordUiEntry; @@ -50,7 +51,8 @@ /** * @typedef {{ * urls: !chrome.passwordsPrivate.UrlCollection, - * id: number + * id: number, + * fromAccountStore: boolean * }} */ chrome.passwordsPrivate.ExceptionEntry; @@ -75,8 +77,7 @@ * @param {string} new_username The new username. * @param {string=} new_password The new password. */ -chrome.passwordsPrivate.changeSavedPassword = function( - id, new_username, new_password) {}; +chrome.passwordsPrivate.changeSavedPassword = function(id, new_username, new_password) {}; /** * Removes the saved password corresponding to |id|. If no saved password for
diff --git a/tools/android/elf_compression/compress_section.py b/tools/android/elf_compression/compress_section.py index 52ad04d..0f7d312 100755 --- a/tools/android/elf_compression/compress_section.py +++ b/tools/android/elf_compression/compress_section.py
@@ -120,33 +120,24 @@ segments is required here. """ elf = elf_headers.ElfHeader(data) - for phdr in elf.GetPhdrs(): - if phdr.p_type == elf_headers.ProgramHeader.Type.PT_LOAD: - # Current version of the prototype only supports ranges which are fully - # contained inside one LOAD segment. It should cover most of the common - # cases. - if phdr.p_offset >= r or phdr.p_offset + phdr.p_filesz <= l: - # Range doesn't overlap. - continue - if phdr.p_offset > l or phdr.p_offset + phdr.p_filesz < r: - # Range overlap with LOAD segment but isn't fully covered by it. - raise RuntimeError('Range is not contained within one LOAD segment') - l_virt = phdr.p_vaddr + (l - phdr.p_offset) - r_virt = phdr.p_vaddr + (r - phdr.p_offset) - return l_virt, r_virt + for phdr in elf.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_LOAD): + # Current version of the prototype only supports ranges which are fully + # contained inside one LOAD segment. It should cover most of the common + # cases. + if phdr.p_offset >= r or phdr.FilePositionEnd() <= l: + # Range doesn't overlap. + continue + if phdr.p_offset > l or phdr.FilePositionEnd() < r: + # Range overlap with LOAD segment but isn't fully covered by it. + raise RuntimeError('Range is not contained within one LOAD segment') + l_virt = phdr.p_vaddr + (l - phdr.p_offset) + r_virt = phdr.p_vaddr + (r - phdr.p_offset) + return l_virt, r_virt raise RuntimeError('Specified range is outside of all LOAD segments.') def _CopyRangeIntoCompressedSection(data, l, r): """Adds a new section containing compressed version of provided range.""" - virtual_l, virtual_r = _FileRangeToVirtualAddressRange(data, l, r) - # LOAD segments borders are being rounded to the page size so we have to - # shrink [l, r) so corresponding virtual addresses are aligned. - l += AlignUp(virtual_l) - virtual_l - r -= virtual_r - AlignDown(virtual_r) - if l >= r: - raise RuntimeError('Range collapsed after aligning by page size') - compressed_range = compression.CompressData(data[l:r]) with tempfile.TemporaryDirectory() as tmpdir: @@ -197,12 +188,16 @@ if elf_hdr.e_phoff + elf_hdr.e_phnum * elf_hdr.e_phentsize == len(data): return - new_phoff = len(data) + old_phoff = elf_hdr.e_phoff + new_phoff = elf_hdr.e_phoff = len(data) + unaligned_new_vaddr = _FindNewVaddr(elf_hdr.GetPhdrs()) new_vaddr = MatchVaddrAlignment(unaligned_new_vaddr, new_phoff) # Since we moved the PHDR section to the end of the file, we need to create a # new LOAD segment to load it in. - new_filesz = (elf_hdr.e_phnum + 1) * elf_hdr.e_phentsize + current_filesize = elf_hdr.e_phnum * elf_hdr.e_phentsize + # We are using current_filesize while adding new program header due to + # AddPhdr handling the increase of size due to addition of new header. elf_hdr.AddPhdr( elf_headers.ProgramHeader.Create( elf_hdr.byte_order, @@ -211,32 +206,99 @@ p_offset=new_phoff, p_vaddr=new_vaddr, p_paddr=new_vaddr, - p_filesz=new_filesz, - p_memsz=new_filesz, + p_filesz=current_filesize, + p_memsz=current_filesize, p_align=ADDRESS_ALIGN, )) # PHDR segment if it exists should point to the new location. - for phdr in elf_hdr.GetPhdrs(): - if phdr.p_type == elf_headers.ProgramHeader.Type.PT_PHDR: - phdr.p_offset = new_phoff - phdr.p_vaddr = new_vaddr - phdr.p_paddr = new_vaddr - phdr.p_filesz = new_filesz - phdr.p_memsz = new_filesz - phdr.p_align = ADDRESS_ALIGN + for phdr in elf_hdr.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_PHDR): + phdr.p_offset = new_phoff + phdr.p_vaddr = new_vaddr + phdr.p_paddr = new_vaddr + phdr.p_align = ADDRESS_ALIGN # We need to replace the previous phdr placement with zero bytes to fail # fast if dynamic linker doesn't like the new program header. previous_phdr_size = (elf_hdr.e_phnum - 1) * elf_hdr.e_phentsize - data[elf_hdr.e_phoff:elf_hdr.e_phoff + - previous_phdr_size] = [0] * previous_phdr_size + data[old_phoff:old_phoff + previous_phdr_size] = [0] * previous_phdr_size # Updating ELF header to point to the new location. - elf_hdr.e_phoff = new_phoff elf_hdr.PatchData(data) +def _SplitLoadSegment(data, l, r): + """Find LOAD segment covering [l, r) and splits it into three segments. + + Split is done so one of the LOAD segments contains only [l, r) and nothing + else. If the range is located at the start or at the end of the segment less + than three segments may be created. + """ + elf_hdr = elf_headers.ElfHeader(data) + + range_phdr = None + for phdr in elf_hdr.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_LOAD): + if phdr.p_offset <= l and phdr.FilePositionEnd() >= r: + range_phdr = phdr + break + if range_phdr is None: + raise RuntimeError('No LOAD segment covering the range found') + + # The range_phdr will become the LOAD segment containing the [l, r) range + # but we need to create the additional two segments. + left_segment_size = l - range_phdr.p_offset + if left_segment_size > 0: + # Creating LOAD segment containing the [phdr.p_offset, l) part. + elf_hdr.AddPhdr( + elf_headers.ProgramHeader.Create( + elf_hdr.byte_order, + p_type=range_phdr.p_type, + p_flags=range_phdr.p_flags, + p_offset=range_phdr.p_offset, + p_vaddr=range_phdr.p_vaddr, + p_paddr=range_phdr.p_paddr, + p_filesz=left_segment_size, + p_memsz=left_segment_size, + p_align=range_phdr.p_align, + )) + if range_phdr.p_offset + range_phdr.p_memsz > r: + # Creating LOAD segment containing the [r, phdr.p_offset + phdr.p_memsz). + right_segment_delta = r - range_phdr.p_offset + right_segment_address = range_phdr.p_vaddr + right_segment_delta + right_segment_filesize = max(range_phdr.p_filesz - right_segment_delta, 0) + right_segment_memsize = range_phdr.p_memsz - right_segment_delta + elf_hdr.AddPhdr( + elf_headers.ProgramHeader.Create( + elf_hdr.byte_order, + p_type=range_phdr.p_type, + p_flags=range_phdr.p_flags, + p_offset=r, + p_vaddr=right_segment_address, + p_paddr=right_segment_address, + p_filesz=right_segment_filesize, + p_memsz=right_segment_memsize, + p_align=range_phdr.p_align, + )) + # Modifying the range_phdr + central_segment_address = range_phdr.p_vaddr + left_segment_size + range_phdr.p_offset = l + range_phdr.p_vaddr = central_segment_address + range_phdr.p_paddr = central_segment_address + range_phdr.p_filesz = r - l + range_phdr.p_memsz = r - l + + elf_hdr.PatchData(data) + + +def _ShrinkRangeToAlignVirtualAddress(data, l, r): + virtual_l, virtual_r = _FileRangeToVirtualAddressRange(data, l, r) + # LOAD segments borders are being rounded to the page size so we have to + # shrink [l, r) so corresponding virtual addresses are aligned. + l += AlignUp(virtual_l) - virtual_l + r -= virtual_r - AlignDown(virtual_r) + return l, r + + def main(): _SetupLogging() args = _ParseArguments() @@ -245,8 +307,14 @@ data = f.read() data = bytearray(data) - _CopyRangeIntoCompressedSection(data, args.left_range, args.right_range) + left_range, right_range = _ShrinkRangeToAlignVirtualAddress( + data, args.left_range, args.right_range) + if left_range >= right_range: + raise RuntimeError('Range collapsed after aligning by page size') + + _CopyRangeIntoCompressedSection(data, left_range, right_range) _MovePhdrToTheEnd(data) + _SplitLoadSegment(data, left_range, right_range) with open(args.output, 'wb') as f: f.write(data)
diff --git a/tools/android/elf_compression/elf_headers.py b/tools/android/elf_compression/elf_headers.py index 597adf0..59b240c 100644 --- a/tools/android/elf_compression/elf_headers.py +++ b/tools/android/elf_compression/elf_headers.py
@@ -147,6 +147,10 @@ ] super(ProgramHeader, self).__init__(byte_order, fields) + def FilePositionEnd(self): + """Returns the end (exclusive) of the segment file range.""" + return self.p_offset + self.p_filesz + class ElfHeader(ElfEntry): """This class represents ELFHdr from the ELF standard. @@ -266,15 +270,57 @@ """Returns the list of file's program headers.""" return self.phdrs + def GetPhdrsByType(self, phdr_type): + """Yields program headers of the given type.""" + return (phdr for phdr in self.phdrs if phdr.p_type == phdr_type) + def AddPhdr(self, phdr): """Adds a new ProgramHeader entry correcting the e_phnum variable. + This method will increase the size of LOAD segment containing the program + headers without correcting the other offsets. It is up to the caller to + deal with the results. One way to avoid any problems would be to move + program headers to the end of the file. + Args: phdr: ProgramHeader. Instance of ProgramHeader to add. """ self.phdrs.append(phdr) + + phdrs_size = self.e_phnum * self.e_phentsize + # We need to locate the LOAD segment containing program headers and + # increase its size. + phdr_found = False + for phdr in self.GetPhdrsByType(ProgramHeader.Type.PT_LOAD): + if phdr.p_offset > self.e_phoff: + continue + if phdr.FilePositionEnd() < self.e_phoff + phdrs_size: + continue + phdr.p_filesz += self.e_phentsize + phdr.p_memsz += self.e_phentsize + phdr_found = True + break + if not phdr_found: + raise RuntimeError('Failed to increase program headers LOAD segment') + + # If PHDR segment exists it needs to be corrected as well. + for phdr in self.GetPhdrsByType(ProgramHeader.Type.PT_PHDR): + phdr.p_filesz += self.e_phentsize + phdr.p_memsz += self.e_phentsize self.e_phnum += 1 + def _OrderPhdrs(self): + """Orders program LOAD headers by p_vaddr to comply with standard.""" + + def HeaderToKey(phdr): + if phdr.p_type == ProgramHeader.Type.PT_LOAD: + return (0, phdr.p_vaddr) + else: + # We want to preserve the order of non LOAD segments. + return (1, 0) + + self.phdrs.sort(key=HeaderToKey) + def PatchData(self, data): """Patches the given data array to reflect all changes made to the header. @@ -294,6 +340,7 @@ elf_bytes = self.ToBytes() data[:len(elf_bytes)] = elf_bytes current_offset = self.e_phoff + self._OrderPhdrs() for phdr in self.GetPhdrs(): phdr_bytes = phdr.ToBytes() data[current_offset:current_offset + len(phdr_bytes)] = phdr_bytes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index afa6cd1c..8b1dcc2 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -36249,6 +36249,7 @@ <int value="-10709540" label="OmniboxUIExperimentHideSuggestionUrlScheme:enabled"/> <int value="-9599490" label="KernelnextVMs:disabled"/> + <int value="-9322265" label="ShowBluetoothDebugLogToggle:enabled"/> <int value="-5052940" label="enable-simplified-fullscreen"/> <int value="-3093629" label="DcheckIsFatal:disabled"/> <int value="-2953333" label="AndroidHistoryManager:disabled"/> @@ -36259,6 +36260,7 @@ </int> <int value="1343197" label="UseSearchClickForRightClick:enabled"/> <int value="1558582" label="ResamplingInputEvents:enabled"/> + <int value="3826348" label="DarkenWebsitesCheckboxInThemesSetting:disabled"/> <int value="5654819" label="CrostiniGpuSupport:disabled"/> <int value="7444737" label="NTPSuggestionsStandaloneUI:disabled"/> <int value="7533886" label="disable-offer-store-unmasked-wallet-cards"/> @@ -36450,6 +36452,7 @@ <int value="293134455" label="AutofillSendBillingCustomerNumber:disabled"/> <int value="293996306" label="ArrayPrototypeValues:disabled"/> <int value="296215399" label="WindowsMixedReality:disabled"/> + <int value="297095559" label="ShowBluetoothDebugLogToggle:disabled"/> <int value="299792415" label="OmniboxSuggestionTransparencyOptions:enabled"/> <int value="300095239" label="FCMInvalidations:enabled"/> <int value="301869874" label="NTPPhysicalWebPageSuggestions:disabled"/> @@ -37343,6 +37346,8 @@ <int value="1514119870" label="enable-file-manager-touch-mode"/> <int value="1515196403" label="fast-user-switching"/> <int value="1517863401" label="history-entry-requires-user-gesture"/> + <int value="1526718531" + label="DarkenWebsitesCheckboxInThemesSetting:enabled"/> <int value="1529979182" label="EnablePasswordSelection:enabled"/> <int value="1530113113" label="disable-pushstate-throttle"/> <int value="1530177325" label="LanguagesPreference:disabled"/>
diff --git a/tools/metrics/histograms/expand_owners_unittest.py b/tools/metrics/histograms/expand_owners_unittest.py index 054e7384..533a48d 100644 --- a/tools/metrics/histograms/expand_owners_unittest.py +++ b/tools/metrics/histograms/expand_owners_unittest.py
@@ -80,7 +80,7 @@ <summary>I like coffee.</summary> </histogram> -<histogram name="Maple.Syrup"> +<histogram name="Maple.Syrup" units="units"> <owner>joe@chromium.org</owner> <owner>{path}</owner> <owner>kim@chromium.org</owner> @@ -101,7 +101,7 @@ <component>Default>Component</component> </histogram> -<histogram name="Maple.Syrup"> +<histogram name="Maple.Syrup" units="units"> <owner>joe@chromium.org</owner> <owner>amy@chromium.org</owner> <owner>rae@chromium.org</owner>
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py index 40d1f573..0f59390 100644 --- a/tools/metrics/histograms/extract_histograms.py +++ b/tools/metrics/histograms/extract_histograms.py
@@ -404,6 +404,12 @@ logging.error('histogram %s should specify <owner>s', name) have_errors = True + # Histograms should have either units or enum. + if (not histogram.hasAttribute('units') and + not histogram.hasAttribute('enum')): + logging.error('histogram %s should have either units or enum', name) + have_errors = True + # Handle units. if histogram.hasAttribute('units'): histogram_entry['units'] = histogram.getAttribute('units')
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py index ad9db65e..cc2afe3 100644 --- a/tools/metrics/histograms/extract_histograms_test.py +++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -11,13 +11,13 @@ TEST_SUFFIX_OBSOLETION_XML_CONTENT = """ <histogram-configuration> <histograms> - <histogram name="Test.Test1"> + <histogram name="Test.Test1" units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Sample description. </summary> </histogram> - <histogram name="Test.Test2"> + <histogram name="Test.Test2" units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Sample description. @@ -43,7 +43,8 @@ <suffix name="ObsoleteSuffixNonObsoleteGroup1" label="Obsolete suffix"> <obsolete>This suffix is obsolete</obsolete> </suffix> - <suffix name="NonObsoleteSuffixNonObsoleteGroup2" label="Non obsolete suffix"/> + <suffix name="NonObsoleteSuffixNonObsoleteGroup2" + label="Non obsolete suffix"/> <affected-histogram name="Test.Test2"/> </histogram_suffixes> @@ -52,7 +53,8 @@ <suffix name="ObsoleteSuffixObsoleteGroup1" label="First obsolete suffix"> <obsolete>This suffix is obsolete</obsolete> </suffix> - <suffix name="NonObsoleteSuffixObsoleteGroup2" label="Second obsolete suffix"/> + <suffix name="NonObsoleteSuffixObsoleteGroup2" + label="Second obsolete suffix"/> <affected-histogram name="Test.Test2"/> </histogram_suffixes> </histogram_suffixes_list> @@ -62,13 +64,14 @@ TEST_BASE_HISTOGRAM_XML_CONTENT = """ <histogram-configuration> <histograms> - <histogram base="true" name="Test.Base" expires_after="2211-11-22"> + <histogram base="true" name="Test.Base" expires_after="2211-11-22" + units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Base histogram. </summary> </histogram> - <histogram base="true" name="Test.Base.Obsolete"> + <histogram base="true" name="Test.Base.Obsolete" units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Obsolete base histogram. @@ -77,13 +80,13 @@ The whole related set of histograms is obsolete! </obsolete> </histogram> - <histogram base="false" name="Test.NotBase.Explicit"> + <histogram base="false" name="Test.NotBase.Explicit" units="units" > <owner>chrome-metrics-team@google.com</owner> <summary> Not a base histogram: base attribute explicitly set to "false". </summary> </histogram> - <histogram name="Test.NotBase.Implicit" expires_after="M100"> + <histogram name="Test.NotBase.Implicit" expires_after="M100" units="units" > <owner>chrome-metrics-team@google.com</owner> <summary> Not a base histogram: no base attribute specified. @@ -187,7 +190,7 @@ <histograms> -<histogram name="Histogram.Name"{}> +<histogram name="Histogram.Name"{} units="units" > <owner>SomeOne@google.com</owner> <summary>Summary</summary> </histogram> @@ -242,7 +245,7 @@ <histograms> -<histogram name="Histogram.Name"{}> +<histogram name="Histogram.Name"{} units="units"> <owner>SomeOne@google.com</owner> <summary>Summary</summary> </histogram> @@ -279,7 +282,7 @@ multiple_paragraph_pattern = xml.dom.minidom.parseString(""" <histogram-configuration> <histograms> - <histogram name="MultiParagraphTest.Test1"> + <histogram name="MultiParagraphTest.Test1" units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Sample description @@ -287,7 +290,7 @@ </summary> </histogram> - <histogram name="MultiParagraphTest.Test2"> + <histogram name="MultiParagraphTest.Test2" units="units"> <owner>chrome-metrics-team@google.com</owner> <summary> Multi-paragraph sample description UI>Browser. @@ -312,7 +315,6 @@ 'Multi-paragraph sample description UI>Browser. Words.\n\n' 'Still multi-paragraph sample description.\n\nHere.') - def testNewHistogramWithoutSummary(self): histogram_without_summary = xml.dom.minidom.parseString(""" <histogram-configuration> @@ -327,6 +329,59 @@ histogram_without_summary, {}) self.assertTrue(have_errors) + def testNewHistogramWithoutEnumOrUnit(self): + histogram_without_enum_or_unit = xml.dom.minidom.parseString(""" +<histogram-configuration> +<histograms> + <histogram name="Test.Histogram"> + <owner>chrome-metrics-team@google.com</owner> + <summary> This is a summary </summary> + </histogram> +</histograms> +</histogram-configuration> +""") + _, have_errors = extract_histograms._ExtractHistogramsFromXmlTree( + histogram_without_enum_or_unit, {}) + self.assertTrue(have_errors) + + def testNewHistogramWithEnum(self): + histogram_with_enum = xml.dom.minidom.parseString(""" +<histogram-configuration> +<enums> + <enum name="MyEnumType"> + <summary>This is an example enum type</summary> + <int value="1" label="FIRST_VALUE">This is the first value.</int> + <int value="2" label="SECOND_VALUE">This is the second value.</int> + </enum> +</enums> + +<histograms> + <histogram name="Test.Histogram.Enum" enum="MyEnumType"> + <owner>chrome-metrics-team@google.com</owner> + <summary> This is a summary </summary> + </histogram> +</histograms> +</histogram-configuration> +""") + _, have_errors = extract_histograms.ExtractHistogramsFromDom( + histogram_with_enum) + self.assertFalse(have_errors) + + def testNewHistogramWithUnits(self): + histogram_with_units = xml.dom.minidom.parseString(""" +<histogram-configuration> +<histograms> + <histogram name="Test.Histogram" units="units"> + <owner>chrome-metrics-team@google.com</owner> + <summary> This is a summary </summary> + </histogram> +</histograms> +</histogram-configuration> +""") + _, have_errors = extract_histograms._ExtractHistogramsFromXmlTree( + histogram_with_units, {}) + self.assertFalse(have_errors) + def testNewHistogramWithEmptyOwnerTag(self): histogram_with_empty_owner_tag = xml.dom.minidom.parseString(""" <histogram-configuration>
diff --git a/tools/metrics/histograms/generate_expired_histograms_array_unittest.py b/tools/metrics/histograms/generate_expired_histograms_array_unittest.py index e0354e1..4c5ea73 100755 --- a/tools/metrics/histograms/generate_expired_histograms_array_unittest.py +++ b/tools/metrics/histograms/generate_expired_histograms_array_unittest.py
@@ -153,25 +153,25 @@ histograms = xml.dom.minidom.parseString(""" <histogram-configuration> <histograms><!-- Must be alphabetical. --> - <histogram name="FirstHistogram" expires_after="2010-11-01"> + <histogram name="FirstHistogram" expires_after="2010-11-01" units="units"> <owner>me@chromium.org</owner> <summary> This is a summary. </summary> </histogram> - <histogram name="FourthHistogram" expires_after="M61"> + <histogram name="FourthHistogram" expires_after="M61" units="units"> <owner>me@chromium.org</owner> <summary> This is a summary. </summary> </histogram> - <histogram name="SecondHistogram" expires_after="2010-09-01"> + <histogram name="SecondHistogram" expires_after="2010-09-01" units="units"> <owner>me@chromium.org</owner> <summary> This is a summary. </summary> </histogram> - <histogram name="ThirdHistogram" expires_after="M60"> + <histogram name="ThirdHistogram" expires_after="M60" units="units"> <owner>me@chromium.org</owner> <summary> This is a summary.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 233541e..d059cb65 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -1054,7 +1054,7 @@ </histogram> <histogram name="Ads.Media.LoadType" enum="MediaLoadType" - expires_after="2019-09-18"> + expires_after="2020-09-18"> <owner>johnidel@chromium.org</owner> <owner>jkarlin@chromium.org</owner> <summary> @@ -2268,7 +2268,7 @@ </summary> </histogram> -<histogram name="Android.DownloadManager.InitialCount" +<histogram name="Android.DownloadManager.InitialCount" units="units" expires_after="2020-02-23"> <owner>dtrainor@chromium.org</owner> <owner>clank-downloads@google.com</owner> @@ -2278,7 +2278,7 @@ </summary> </histogram> -<histogram name="Android.DownloadManager.InitialCount.Viewed" +<histogram name="Android.DownloadManager.InitialCount.Viewed" units="units" expires_after="M81"> <owner>dtrainor@chromium.org</owner> <owner>clank-downloads@google.com</owner> @@ -2325,7 +2325,7 @@ </histogram> <histogram name="Android.DownloadManager.Menu.Delete.SelectedCount" - expires_after="M81"> + units="units" expires_after="M81"> <owner>dtrainor@chromium.org</owner> <owner>clank-downloads@google.com</owner> <summary> @@ -2334,7 +2334,7 @@ </histogram> <histogram name="Android.DownloadManager.Menu.Share.SelectedCount" - expires_after="M81"> + units="units" expires_after="M81"> <owner>dtrainor@chromium.org</owner> <owner>clank-downloads@google.com</owner> <summary> @@ -2494,7 +2494,8 @@ </summary> </histogram> -<histogram name="Android.DownloadManager.Share.Count" expires_after="M82"> +<histogram name="Android.DownloadManager.Share.Count" units="units" + expires_after="M82"> <owner>twellington@chromium.org</owner> <owner>ianwen@chromium.org</owner> <owner>clank-downloads@google.com</owner> @@ -2686,7 +2687,7 @@ </summary> </histogram> -<histogram name="Android.HistoryPage.OpenSelected"> +<histogram name="Android.HistoryPage.OpenSelected" units="units"> <obsolete> Deprecated 7/2019. No longer tracked. </obsolete> @@ -2697,7 +2698,7 @@ </summary> </histogram> -<histogram name="Android.HistoryPage.RemoveSelected"> +<histogram name="Android.HistoryPage.RemoveSelected" units="units"> <obsolete> Deprecated 7/2019. No longer tracked. </obsolete> @@ -3912,7 +3913,7 @@ </summary> </histogram> -<histogram name="Android.TabPersistentStore.MetadataFileSize"> +<histogram name="Android.TabPersistentStore.MetadataFileSize" units="units"> <owner>wnwen@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary>The number of bytes written for the tab metadata file.</summary> @@ -3970,7 +3971,8 @@ <summary>Records the invocation count of WebView callbacks.</summary> </histogram> -<histogram name="Android.WebView.ClearProxyOverride" expires_after="2020-08-13"> +<histogram name="Android.WebView.ClearProxyOverride" units="units" + expires_after="2020-08-13"> <owner>laisminchillo@chromium.org</owner> <owner>tobiasjs@chromium.org</owner> <summary>Records ClearProxyOverride calls.</summary> @@ -4522,7 +4524,7 @@ </summary> </histogram> -<histogram name="appcache.CorruptionDetected"> +<histogram name="appcache.CorruptionDetected" units="units"> <obsolete> Deprecated on 2019-06-17. No longer tracked. </obsolete> @@ -4675,7 +4677,7 @@ </summary> </histogram> -<histogram name="appcache.ReinitAttempt"> +<histogram name="appcache.ReinitAttempt" units="units"> <owner>mek@chromium.org</owner> <summary> Tracks the number of times the appcache reinit process occurs. The boolean @@ -4802,7 +4804,8 @@ <summary>Interactions with the App Launcher promo dialog.</summary> </histogram> -<histogram name="Apps.AppList.AggregatedMlAppRankFail" expires_after="M92"> +<histogram name="Apps.AppList.AggregatedMlAppRankFail" units="units" + expires_after="M92"> <owner>pdyson@chromium.org</owner> <summary> The number of apps the were not able to be ranked by the Aggregated ML app @@ -4810,7 +4813,8 @@ </summary> </histogram> -<histogram name="Apps.AppList.AggregatedMlAppRankSuccess" expires_after="M92"> +<histogram name="Apps.AppList.AggregatedMlAppRankSuccess" units="units" + expires_after="M92"> <owner>pdyson@chromium.org</owner> <summary> The number of apps successfully ranked by the Aggregated ML app ranker (Top @@ -5291,7 +5295,7 @@ </summary> </histogram> -<histogram name="Apps.AppListRecommendedResponse.Count" +<histogram name="Apps.AppListRecommendedResponse.Count" units="units" expires_after="2020-02-16"> <owner>napper@chromium.org</owner> <owner>robsc@chromium.org</owner> @@ -5310,7 +5314,7 @@ </summary> </histogram> -<histogram name="Apps.AppListResultLaunchIndexAndQueryLength" +<histogram name="Apps.AppListResultLaunchIndexAndQueryLength" units="units" expires_after="2020-01-20"> <owner>tby@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -5508,7 +5512,7 @@ </summary> </histogram> -<histogram name="Apps.AppListTileLaunchIndexAndQueryLength" +<histogram name="Apps.AppListTileLaunchIndexAndQueryLength" units="units" expires_after="2020-01-20"> <owner>tby@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -5543,7 +5547,7 @@ </summary> </histogram> -<histogram name="Apps.AppShimErrorVersion" expires_after="M78"> +<histogram name="Apps.AppShimErrorVersion" units="units" expires_after="M78"> <owner>jackhou@chromium.org</owner> <summary> Counts which major milestone versions of app_mode_loader are sending @@ -5700,7 +5704,7 @@ </histogram> <histogram name="Apps.LockScreen.DataItemStorage.RegisteredItemsCount" - expires_after="M85"> + units="units" expires_after="M85"> <owner>dstockwell@chromium.org</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -5767,7 +5771,7 @@ </histogram> <histogram name="Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber" - expires_after="M85"> + units="units" expires_after="M85"> <owner>dstockwell@chromium.org</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -5822,7 +5826,7 @@ </histogram> <histogram name="Apps.LockScreen.NoteTakingApp.ReloadCountOnAppTermination" - expires_after="M85"> + units="units" expires_after="M85"> <owner>dstockwell@chromium.org</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -6028,7 +6032,7 @@ <summary>The time elapsed for booting up the ARC instance.</summary> </histogram> -<histogram name="Arc.AppCount" expires_after="2020-01-26"> +<histogram name="Arc.AppCount" units="units" expires_after="2020-01-26"> <owner>elijahtaylor@google.com</owner> <owner>shihuis@google.com</owner> <summary> @@ -6155,7 +6159,7 @@ </summary> </histogram> -<histogram name="Arc.ContainerRestartAfterCrashCount" +<histogram name="Arc.ContainerRestartAfterCrashCount" units="units" expires_after="2020-02-16"> <owner>elijahtaylor@google.com</owner> <owner>yusukes@google.com</owner> @@ -6165,6 +6169,18 @@ </summary> </histogram> +<histogram base="true" name="Arc.CpuRestrictionDisabled" units="ms" + expires_after="2020-03-09"> + <owner>wvk@google.org</owner> + <owner>khmel@google.com</owner> + <summary> + Records the time that throttling was disabled due to a particular throttle + observer. The duration begins when a new throttle observer becomes active, + and measures until it becomes inactive or another throttle observer becomes + effective. + </summary> +</histogram> + <histogram name="Arc.CumulativeUseTime" units="seconds" expires_after="2020-02-02"> <owner>elijahtaylor@google.com</owner> @@ -6177,7 +6193,8 @@ </summary> </histogram> -<histogram name="Arc.CupsPrinting.PageCount" expires_after="2020-01-20"> +<histogram name="Arc.CupsPrinting.PageCount" units="units" + expires_after="2020-01-20"> <owner>skau@chromium.org</owner> <owner>vkuzkokov@google.com</owner> <summary> @@ -6367,7 +6384,7 @@ </summary> </histogram> -<histogram name="Arc.ImeCount"> +<histogram name="Arc.ImeCount" units="units"> <owner>yhanada@google.com</owner> <owner>tetsui@google.com</owner> <summary> @@ -6410,7 +6427,7 @@ </summary> </histogram> -<histogram name="Arc.LowMemoryKiller.Count" expires_after="M82"> +<histogram name="Arc.LowMemoryKiller.Count" units="units" expires_after="M82"> <owner>elijahtaylor@google.com</owner> <owner>shihuis@google.com</owner> <summary>Cumulative count of low memory kills in one user session.</summary> @@ -6894,7 +6911,8 @@ </summary> </histogram> -<histogram name="Ash.ActiveTouchPoints" expires_after="2017-03-03"> +<histogram name="Ash.ActiveTouchPoints" units="units" + expires_after="2017-03-03"> <obsolete> Deprecated 02/2017 due to lack of usage. </obsolete> @@ -6927,7 +6945,7 @@ </summary> </histogram> -<histogram name="Ash.Desks.DesksCount" expires_after="M85"> +<histogram name="Ash.Desks.DesksCount" units="units" expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> Emitted when there's a change in the virtual desks count whether due to desk @@ -6964,7 +6982,8 @@ </summary> </histogram> -<histogram name="Ash.Desks.NumberOfWindowsOnDesk_1" expires_after="M85"> +<histogram name="Ash.Desks.NumberOfWindowsOnDesk_1" units="units" + expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The number of windows on the first desk. Emitted when a desk is removed, or @@ -6972,7 +6991,8 @@ </summary> </histogram> -<histogram name="Ash.Desks.NumberOfWindowsOnDesk_2" expires_after="M85"> +<histogram name="Ash.Desks.NumberOfWindowsOnDesk_2" units="units" + expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The number of windows on the second desk. Emitted when a desk is removed, or @@ -6980,7 +7000,8 @@ </summary> </histogram> -<histogram name="Ash.Desks.NumberOfWindowsOnDesk_3" expires_after="M85"> +<histogram name="Ash.Desks.NumberOfWindowsOnDesk_3" units="units" + expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The number of windows on the third desk. Emitted when a desk is removed, or @@ -6988,7 +7009,8 @@ </summary> </histogram> -<histogram name="Ash.Desks.NumberOfWindowsOnDesk_4" expires_after="M85"> +<histogram name="Ash.Desks.NumberOfWindowsOnDesk_4" units="units" + expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The number of windows on the fourth desk. Emitted when a desk is removed, or @@ -7102,7 +7124,7 @@ </summary> </histogram> -<histogram name="Ash.Dock.ItemsAll"> +<histogram name="Ash.Dock.ItemsAll" units="units"> <owner>kuscher@google.com</owner> <owner>wutao@chromium.org</owner> <summary> @@ -7111,7 +7133,7 @@ </summary> </histogram> -<histogram name="Ash.Dock.ItemsLarge"> +<histogram name="Ash.Dock.ItemsLarge" units="units"> <owner>kuscher@google.com</owner> <owner>wutao@chromium.org</owner> <summary> @@ -7121,7 +7143,7 @@ </summary> </histogram> -<histogram name="Ash.Dock.ItemsPanels"> +<histogram name="Ash.Dock.ItemsPanels" units="units"> <owner>kuscher@google.com</owner> <owner>wutao@chromium.org</owner> <summary> @@ -7130,7 +7152,7 @@ </summary> </histogram> -<histogram name="Ash.Dock.ItemsVisible"> +<histogram name="Ash.Dock.ItemsVisible" units="units"> <owner>kuscher@google.com</owner> <owner>wutao@chromium.org</owner> <summary> @@ -7406,7 +7428,8 @@ </summary> </histogram> -<histogram name="Ash.PersistentWindow.NumOfWindowsRestored" expires_after="M82"> +<histogram name="Ash.PersistentWindow.NumOfWindowsRestored" units="units" + expires_after="M82"> <owner>zentaro@chromium.org</owner> <owner>baileyberro@chromium.org</owner> <summary> @@ -7558,7 +7581,7 @@ </summary> </histogram> -<histogram name="Ash.Shelf.Palette.Assistant.GesturesPerSession" +<histogram name="Ash.Shelf.Palette.Assistant.GesturesPerSession" units="units" expires_after="M77"> <owner>kaznacheev@chromium.org</owner> <summary> @@ -7569,7 +7592,7 @@ </histogram> <histogram name="Ash.Shelf.Palette.Assistant.GesturesPerSession.Recognized" - expires_after="M81"> + units="units" expires_after="M81"> <owner>kaznacheev@chromium.org</owner> <summary> The number of recognized Assistant pen gestures per session. Session is @@ -7939,7 +7962,7 @@ </summary> </histogram> -<histogram name="Ash.TouchStartBurst" expires_after="2017-03-03"> +<histogram name="Ash.TouchStartBurst" units="units" expires_after="2017-03-03"> <obsolete> Deprecated 02/2017 due to lack of usage. </obsolete> @@ -8069,7 +8092,8 @@ </summary> </histogram> -<histogram name="Ash.Wallpaper.DefaultIndex" expires_after="2014-08-08"> +<histogram name="Ash.Wallpaper.DefaultIndex" units="units" + expires_after="2014-08-08"> <obsolete> Deprecated as of 11/2012. Use of indices has been removed. </obsolete> @@ -8254,7 +8278,8 @@ </summary> </histogram> -<histogram name="Ash.WindowSelector.ArrowKeyPresses" expires_after="M81"> +<histogram name="Ash.WindowSelector.ArrowKeyPresses" units="units" + expires_after="M81"> <owner>flackr@chromium.org</owner> <summary> The number of times the arrow keys are pressed in overview mode per session, @@ -8277,7 +8302,8 @@ </summary> </histogram> -<histogram name="Ash.WindowSelector.Items" expires_after="2020-01-26"> +<histogram name="Ash.WindowSelector.Items" units="units" + expires_after="2020-01-26"> <owner>flackr@chromium.org</owner> <owner>kuscher@google.com</owner> <summary> @@ -8305,7 +8331,7 @@ </summary> </histogram> -<histogram name="Ash.WindowSelector.OverviewClosedItems" +<histogram name="Ash.WindowSelector.OverviewClosedItems" units="units" expires_after="2020-01-26"> <owner>flackr@chromium.org</owner> <summary> @@ -8333,7 +8359,7 @@ </histogram> <histogram name="Ash.WindowSelector.TextFilteringTextfieldCleared" - expires_after="M77"> + units="units" expires_after="M77"> <owner>flackr@chromium.org</owner> <summary> The number of times the text filtering textfield has had all of its text @@ -8452,7 +8478,8 @@ </summary> </histogram> -<histogram name="Assistant.OptInFlow.LoadingTimeoutCount" expires_after="M82"> +<histogram name="Assistant.OptInFlow.LoadingTimeoutCount" units="units" + expires_after="M82"> <owner>updowndota@chromium.org</owner> <summary> Number of times that the loading timeout triggers. The loading timeout is @@ -8652,7 +8679,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.AttemptCountFail" expires_after="2018-12-04"> +<histogram name="AsyncDNS.AttemptCountFail" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -8663,7 +8691,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.AttemptCountSuccess" expires_after="2018-12-04"> +<histogram name="AsyncDNS.AttemptCountSuccess" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -9155,7 +9184,7 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerCount" expires_after="M81"> +<histogram name="AsyncDNS.ServerCount" units="units" expires_after="M81"> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -9164,7 +9193,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerFailureIndex" expires_after="2018-12-04"> +<histogram name="AsyncDNS.ServerFailureIndex" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -9175,7 +9205,7 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerFailuresAfterNetworkChange" +<histogram name="AsyncDNS.ServerFailuresAfterNetworkChange" units="units" expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. @@ -9188,7 +9218,7 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerFailuresAfterSuccess" +<histogram name="AsyncDNS.ServerFailuresAfterSuccess" units="units" expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. @@ -9202,7 +9232,7 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerFailuresBeforeSuccess" +<histogram name="AsyncDNS.ServerFailuresBeforeSuccess" units="units" expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. @@ -9215,7 +9245,7 @@ </summary> </histogram> -<histogram name="AsyncDNS.ServerFailuresWithoutSuccess" +<histogram name="AsyncDNS.ServerFailuresWithoutSuccess" units="units" expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. @@ -9264,7 +9294,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.SuffixSearchDone" expires_after="2018-12-04"> +<histogram name="AsyncDNS.SuffixSearchDone" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -9276,7 +9307,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.SuffixSearchRemain" expires_after="2018-12-04"> +<histogram name="AsyncDNS.SuffixSearchRemain" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -9288,7 +9320,8 @@ </summary> </histogram> -<histogram name="AsyncDNS.SuffixSearchStart" expires_after="2018-12-04"> +<histogram name="AsyncDNS.SuffixSearchStart" units="units" + expires_after="2018-12-04"> <obsolete> Removed as of 12/2018. </obsolete> @@ -9629,7 +9662,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.FailedTriesOfKinit" expires_after="2020-02-16"> +<histogram name="AuthPolicy.FailedTriesOfKinit" units="units" + expires_after="2020-02-16"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9641,7 +9675,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.FailedTriesOfSmbClient" expires_after="2020-02-16"> +<histogram name="AuthPolicy.FailedTriesOfSmbClient" units="units" + expires_after="2020-02-16"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9652,7 +9687,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.NumGposToDownload" expires_after="2020-02-16"> +<histogram name="AuthPolicy.NumGposToDownload" units="units" + expires_after="2020-02-16"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -10099,7 +10135,7 @@ </summary> </histogram> -<histogram name="AutocompleteActionPredictor.AccurateCount"> +<histogram name="AutocompleteActionPredictor.AccurateCount" units="units"> <owner>tbansal@chromium.org</owner> <summary> Every time we calculate the confidence for a URL to determine if it should @@ -10127,7 +10163,7 @@ </summary> </histogram> -<histogram name="AutocompleteActionPredictor.Confidence"> +<histogram name="AutocompleteActionPredictor.Confidence" units="units"> <owner>tbansal@chromium.org</owner> <summary> The distribution of confidence ratings. The AutocompleteActionPredictor uses @@ -10148,7 +10184,7 @@ </summary> </histogram> -<histogram name="AutocompleteActionPredictor.DatabaseRowCount"> +<histogram name="AutocompleteActionPredictor.DatabaseRowCount" units="units"> <owner>tbansal@chromium.org</owner> <summary> The distribution of row counts for the AutocompleteActionPredictorDatabase. @@ -10156,7 +10192,8 @@ </summary> </histogram> -<histogram name="AutocompleteActionPredictor.MatchIsInDb" expires_after="M82"> +<histogram name="AutocompleteActionPredictor.MatchIsInDb" units="units" + expires_after="M82"> <owner>tbansal@chromium.org</owner> <summary> A boolean that indicates if the autocomplete suggestion under consideration @@ -10167,7 +10204,7 @@ </summary> </histogram> -<histogram name="AutocompleteActionPredictor.NavigationCount"> +<histogram name="AutocompleteActionPredictor.NavigationCount" units="units"> <owner>tbansal@chromium.org</owner> <summary> The number of navigations triggered by the Omnibox and seen by the @@ -10268,7 +10305,7 @@ </summary> </histogram> -<histogram name="Autofill.AddressSuggestionsCount"> +<histogram name="Autofill.AddressSuggestionsCount" units="units"> <owner>isherman@chromium.org</owner> <summary> The number of address suggestions shown in the Autofill popup. @@ -10381,7 +10418,8 @@ </summary> </histogram> -<histogram name="AutoFill.CCInfoBarAccepted" expires_after="2013-03-30"> +<histogram name="AutoFill.CCInfoBarAccepted" units="units" + expires_after="2013-03-30"> <obsolete> Deprecated as of 3/2011, replaced by Autofill.CreditCardInfoBar. </obsolete> @@ -10389,7 +10427,8 @@ <summary>The Autofill credit card info bar was accepted.</summary> </histogram> -<histogram name="AutoFill.CCInfoBarDenied" expires_after="2013-03-30"> +<histogram name="AutoFill.CCInfoBarDenied" units="units" + expires_after="2013-03-30"> <obsolete> Deprecated as of 3/2011, replaced by Autofill.CreditCardInfoBar. </obsolete> @@ -10415,7 +10454,8 @@ </summary> </histogram> -<histogram name="Autofill.CreditCardsDeletedForDisuse" expires_after="M77"> +<histogram name="Autofill.CreditCardsDeletedForDisuse" units="units" + expires_after="M77"> <owner>wuandy@chromium.org</owner> <summary> The number of credit card deleted during a major version upgrade because @@ -10423,7 +10463,8 @@ </summary> </histogram> -<histogram name="Autofill.CreditCardsSuppressedForDisuse" expires_after="M77"> +<histogram name="Autofill.CreditCardsSuppressedForDisuse" units="units" + expires_after="M77"> <owner>wuandy@chromium.org</owner> <summary> The number of credit card suggestions not shown in the Autofill popup @@ -10538,7 +10579,7 @@ <summary>Number of fields in a form that Autofill encounters.</summary> </histogram> -<histogram name="Autofill.FieldPrediction"> +<histogram name="Autofill.FieldPrediction" units="units"> <!-- Name completed by histogram_suffixes name="AutofillFieldPredictionSource" --> @@ -10576,7 +10617,8 @@ </summary> </histogram> -<histogram name="Autofill.FillDuration.FromInteraction.WithAutofill"> +<histogram name="Autofill.FillDuration.FromInteraction.WithAutofill" + units="units"> <owner>isherman@chromium.org</owner> <summary> Time elapsed between the user's first interaction with a form and the form's @@ -10584,7 +10626,8 @@ </summary> </histogram> -<histogram name="Autofill.FillDuration.FromInteraction.WithoutAutofill"> +<histogram name="Autofill.FillDuration.FromInteraction.WithoutAutofill" + units="units"> <owner>isherman@chromium.org</owner> <summary> Time elapsed between the user's first interaction with a form and the form's @@ -10592,14 +10635,14 @@ </summary> </histogram> -<histogram name="Autofill.FillDuration.FromLoad.WithAutofill"> +<histogram name="Autofill.FillDuration.FromLoad.WithAutofill" units="units"> <owner>isherman@chromium.org</owner> <summary> Time elapsed between form load and form submission, for an autofilled form. </summary> </histogram> -<histogram name="Autofill.FillDuration.FromLoad.WithoutAutofill" +<histogram name="Autofill.FillDuration.FromLoad.WithoutAutofill" units="units" expires_after="M77"> <owner>isherman@chromium.org</owner> <summary> @@ -11129,7 +11172,7 @@ </summary> </histogram> -<histogram name="Autofill.MacAddressBook.NumShowsBeforeSelected" +<histogram name="Autofill.MacAddressBook.NumShowsBeforeSelected" units="units" expires_after="2015-08-26"> <obsolete> Deprecated as of 8/2015. @@ -11255,7 +11298,8 @@ </summary> </histogram> -<histogram name="AutoFill.ProfileCount" expires_after="2013-03-30"> +<histogram name="AutoFill.ProfileCount" units="units" + expires_after="2013-03-30"> <obsolete> Deprecated as of 3/2011, replaced by Autofill.StoredProfileCount. </obsolete> @@ -11676,14 +11720,15 @@ </summary> </histogram> -<histogram name="Autofill.StoredProfileCount"> +<histogram name="Autofill.StoredProfileCount" units="units"> <owner>isherman@chromium.org</owner> <summary> The number of Autofill addresses a user has stored, measured at launch time. </summary> </histogram> -<histogram name="Autofill.StoredProfileCountAtAutofillableFormSubmission"> +<histogram name="Autofill.StoredProfileCountAtAutofillableFormSubmission" + units="units"> <owner>mathp@chromium.org</owner> <summary> The number of Autofill addresses a user has stored, measured when an @@ -11691,7 +11736,8 @@ </summary> </histogram> -<histogram name="Autofill.StoredProfileDisusedCount" expires_after="M83"> +<histogram name="Autofill.StoredProfileDisusedCount" units="units" + expires_after="M83"> <owner>rogerm@chromium.org</owner> <summary> The number of stored Autofill address profiles which have not been used in a @@ -11840,7 +11886,8 @@ </summary> </histogram> -<histogram name="Autofill.SuggestionAccepted.OffTheRecord" expires_after="M85"> +<histogram name="Autofill.SuggestionAccepted.OffTheRecord" units="units" + expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -11866,7 +11913,8 @@ </summary> </histogram> -<histogram name="Autofill.SuggestionShown.OffTheRecord" expires_after="M85"> +<histogram name="Autofill.SuggestionShown.OffTheRecord" units="units" + expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -12953,7 +13001,7 @@ </summary> </histogram> -<histogram name="BackgroundFetch.IncompleteFetchesOnStartup" +<histogram name="BackgroundFetch.IncompleteFetchesOnStartup" units="units" expires_after="M81"> <owner>rayankans@chromium.org</owner> <summary> @@ -13057,7 +13105,7 @@ <summary>Records the storage error when running a database task.</summary> </histogram> -<histogram name="BackgroundMode.BackgroundApplicationsCount" +<histogram name="BackgroundMode.BackgroundApplicationsCount" units="units" expires_after="2020-02-01"> <owner>atwilson@chromium.org</owner> <owner>mvanouwerkerk@chromium.org</owner> @@ -13114,7 +13162,8 @@ </summary> </histogram> -<histogram name="BackgroundSync.Event.BatchSize" expires_after="M85"> +<histogram name="BackgroundSync.Event.BatchSize" units="units" + expires_after="M85"> <owner>nator@chromium.org</owner> <owner>rayankans@chromium.org</owner> <summary> @@ -13491,7 +13540,8 @@ </summary> </histogram> -<histogram name="Blacklist.RetryAttempts.Success" expires_after="2019-07-26"> +<histogram name="Blacklist.RetryAttempts.Success" units="units" + expires_after="2019-07-26"> <obsolete> Replaced by ChromeElf.Beacon.RetryAttemptsBeforeSuccess after the old blacklist was deprecated. @@ -14228,7 +14278,7 @@ </summary> </histogram> -<histogram name="Blink.ColorSpace.Destination.LinearFitError" +<histogram name="Blink.ColorSpace.Destination.LinearFitError" units="units" expires_after="2017-02-28"> <obsolete> Linear fit found to be always inaccurate on 2017-02-28. @@ -14265,7 +14315,7 @@ </summary> </histogram> -<histogram name="Blink.ColorSpace.Destination.NonlinearFitError" +<histogram name="Blink.ColorSpace.Destination.NonlinearFitError" units="units" expires_after="2018-05-17"> <obsolete> Nonlinear fit code moved to skcms on 2018-04-25. @@ -14278,7 +14328,8 @@ </summary> </histogram> -<histogram name="Blink.ColorSpace.Destination.NonlinearFitErrorCombined"> +<histogram name="Blink.ColorSpace.Destination.NonlinearFitErrorCombined" + units="units"> <owner>brianosman@chromium.org</owner> <owner>mcasas@google.com</owner> <owner>ccameron@chromium.org</owner> @@ -14301,7 +14352,7 @@ </summary> </histogram> -<histogram name="Blink.ColorSpace.Destination.OneMinusTMax" +<histogram name="Blink.ColorSpace.Destination.OneMinusTMax" units="units" expires_after="2017-02-28"> <obsolete> TMax found to almost always be 1 on 2017-02-28. @@ -14314,7 +14365,8 @@ </summary> </histogram> -<histogram name="Blink.ColorSpace.Destination.TMin" expires_after="2017-02-28"> +<histogram name="Blink.ColorSpace.Destination.TMin" units="units" + expires_after="2017-02-28"> <obsolete> TMin found to almost always be 0 on 2017-02-28. </obsolete> @@ -14337,7 +14389,7 @@ </histogram> <histogram base="true" name="Blink.Compositing.LayerPromotionCount" - expires_after="2020-01-26"> + units="units" expires_after="2020-01-26"> <owner>paint-dev@chromium.org</owner> <summary> Number of composited layers based on various reasons. Recorded when a page @@ -14675,7 +14727,7 @@ </summary> </histogram> -<histogram name="Blink.Fonts.ShapeCache" expires_after="M81"> +<histogram name="Blink.Fonts.ShapeCache" units="units" expires_after="M81"> <owner>eae@chromium.org</owner> <summary> Total number of entries in all Blink ShapeCache instances. The value is @@ -14707,7 +14759,8 @@ </summary> </histogram> -<histogram name="Blink.Fonts.WinFallback.LegacyNoneFound" expires_after="M82"> +<histogram name="Blink.Fonts.WinFallback.LegacyNoneFound" units="units" + expires_after="M82"> <owner>drott@chromium.org</owner> <owner>layout-dev@chromium.org</owner> <summary> @@ -14719,7 +14772,7 @@ </summary> </histogram> -<histogram name="Blink.Fonts.WinFallback.LegacyWinAPIDisagree" +<histogram name="Blink.Fonts.WinFallback.LegacyWinAPIDisagree" units="units" expires_after="M82"> <owner>drott@chromium.org</owner> <owner>layout-dev@chromium.org</owner> @@ -14733,7 +14786,8 @@ </summary> </histogram> -<histogram name="Blink.Fonts.WinFallback.NoFallbackFound" expires_after="M82"> +<histogram name="Blink.Fonts.WinFallback.NoFallbackFound" units="units" + expires_after="M82"> <owner>drott@chromium.org</owner> <owner>layout-dev@chromium.org</owner> <summary> @@ -14746,7 +14800,8 @@ </summary> </histogram> -<histogram name="Blink.Fonts.WinFallback.WinAPINoneFound" expires_after="M82"> +<histogram name="Blink.Fonts.WinFallback.WinAPINoneFound" units="units" + expires_after="M82"> <owner>drott@chromium.org</owner> <owner>layout-dev@chromium.org</owner> <summary> @@ -17775,7 +17830,7 @@ </summary> </histogram> -<histogram name="Bookmarks.LaunchDepth" expires_after="M77"> +<histogram name="Bookmarks.LaunchDepth" units="units" expires_after="M77"> <obsolete> Deprecated as of 6/2019. This histogram is no longer necessary. </obsolete> @@ -17978,7 +18033,7 @@ </summary> </histogram> -<histogram name="Browser.WindowCount.Guest" expires_after="M85"> +<histogram name="Browser.WindowCount.Guest" units="units" expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -17989,7 +18044,8 @@ </summary> </histogram> -<histogram name="Browser.WindowCount.Incognito" expires_after="M85"> +<histogram name="Browser.WindowCount.Incognito" units="units" + expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -18819,7 +18875,7 @@ </summary> </histogram> -<histogram name="CaptivePortal.OOBE.DiscrepancyWithShill" +<histogram name="CaptivePortal.OOBE.DiscrepancyWithShill" units="units" expires_after="2020-02-01"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> @@ -19143,7 +19199,8 @@ </summary> </histogram> -<histogram name="Cellular.ActivationFailure" expires_after="2016-04-29"> +<histogram name="Cellular.ActivationFailure" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19153,12 +19210,13 @@ </summary> </histogram> -<histogram name="Cellular.ActivationTry"> +<histogram name="Cellular.ActivationTry" units="units"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary>The count of cellular device activation tries (Chrome OS).</summary> </histogram> -<histogram name="Cellular.ConnectionFailed" expires_after="2016-04-29"> +<histogram name="Cellular.ConnectionFailed" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19168,7 +19226,8 @@ </summary> </histogram> -<histogram name="Cellular.ConnectionRetry" expires_after="2016-04-29"> +<histogram name="Cellular.ConnectionRetry" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19178,7 +19237,8 @@ </summary> </histogram> -<histogram name="Cellular.MobileSetupFailed" expires_after="2016-04-29"> +<histogram name="Cellular.MobileSetupFailed" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19188,14 +19248,15 @@ </summary> </histogram> -<histogram name="Cellular.MobileSetupStart" expires_after="M77"> +<histogram name="Cellular.MobileSetupStart" units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The count of initiated cellular device setup starts (Chrome OS). </summary> </histogram> -<histogram name="Cellular.MobileSetupSucceeded" expires_after="2016-04-29"> +<histogram name="Cellular.MobileSetupSucceeded" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19203,7 +19264,8 @@ <summary>The count of failed cellular plan setup tries (Chrome OS).</summary> </histogram> -<histogram name="Cellular.PaymentFailed" expires_after="2016-04-29"> +<histogram name="Cellular.PaymentFailed" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19211,7 +19273,8 @@ <summary>The count of failed cellular plan purchases (Chrome OS).</summary> </histogram> -<histogram name="Cellular.PaymentReceived" expires_after="2016-04-29"> +<histogram name="Cellular.PaymentReceived" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -19221,7 +19284,7 @@ </summary> </histogram> -<histogram name="CertificateType" expires_after="2013-08-09"> +<histogram name="CertificateType" units="units" expires_after="2013-08-09"> <obsolete> Deprecated as of 8/2013. This histogram only considered the leaf certificate expiry date as a proxy for whether a certificate was in-scope for the BRs, @@ -19238,7 +19301,7 @@ </summary> </histogram> -<histogram name="CertificateType2" expires_after="never"> +<histogram name="CertificateType2" units="units" expires_after="never"> <!-- expires-never: histograms are used to assess policy --> <!-- https://crbug.com/732640#c5 --> @@ -19494,7 +19557,8 @@ </summary> </histogram> -<histogram name="ChildProcess.KilledByExtensionAPI" expires_after="M81"> +<histogram name="ChildProcess.KilledByExtensionAPI" units="units" + expires_after="M81"> <owner>nasko@chromium.org</owner> <summary> Count of child processes killed by the extension API (processes.terminate). @@ -19593,7 +19657,8 @@ </summary> </histogram> -<histogram name="Chrome.BrowserCrashDumpAttempts" expires_after="2015-03-31"> +<histogram name="Chrome.BrowserCrashDumpAttempts" units="units" + expires_after="2015-03-31"> <obsolete> Deprecated as of 04/2015. </obsolete> @@ -19605,7 +19670,8 @@ </summary> </histogram> -<histogram name="Chrome.BrowserDumpsWithCrash" expires_after="2015-03-31"> +<histogram name="Chrome.BrowserDumpsWithCrash" units="units" + expires_after="2015-03-31"> <obsolete> Deprecated as of 04/2015. </obsolete> @@ -19616,7 +19682,8 @@ </summary> </histogram> -<histogram name="Chrome.BrowserDumpsWithNoCrash" expires_after="2015-03-31"> +<histogram name="Chrome.BrowserDumpsWithNoCrash" units="units" + expires_after="2015-03-31"> <obsolete> Deprecated as of 04/2015. </obsolete> @@ -19876,7 +19943,7 @@ </summary> </histogram> -<histogram name="ChromeElf.Beacon.RetryAttemptsBeforeSuccess" +<histogram name="ChromeElf.Beacon.RetryAttemptsBeforeSuccess" units="units" expires_after="M82"> <owner>chrisha@chromium.org</owner> <owner>pmonette@chromium.org</owner> @@ -20342,7 +20409,8 @@ </summary> </histogram> -<histogram name="ChromeOS.SAML.Scraping.PasswordCount" expires_after="M77"> +<histogram name="ChromeOS.SAML.Scraping.PasswordCount" units="units" + expires_after="M77"> <owner>bartfab@chromium.org</owner> <summary> The number of passwords that were scraped during a Chrome OS login via SAML. @@ -20473,7 +20541,7 @@ </summary> </histogram> -<histogram name="ChromeOS.UrlXattrsCount" expires_after="M80"> +<histogram name="ChromeOS.UrlXattrsCount" units="units" expires_after="M80"> <owner>jorgelo@chromium.org</owner> <owner>tnagel@chromium.org</owner> <summary> @@ -20884,12 +20952,13 @@ <summary>Event counts in CloudPrintAuth.</summary> </histogram> -<histogram name="CloudPrint.AvailablePrinters" expires_after="M81"> +<histogram name="CloudPrint.AvailablePrinters" units="units" + expires_after="M81"> <owner>thestig@chromium.org</owner> <summary>The number of printers availible for registration.</summary> </histogram> -<histogram name="CloudPrint.AvailablePrintersList"> +<histogram name="CloudPrint.AvailablePrintersList" units="units"> <owner>thestig@chromium.org</owner> <summary> The number of printers availible for registration in Windows Service. @@ -20911,12 +20980,14 @@ <summary>Event counts in PrinterJobHandler.</summary> </histogram> -<histogram name="CloudPrint.JobsDonePerInterval" expires_after="M81"> +<histogram name="CloudPrint.JobsDonePerInterval" units="units" + expires_after="M81"> <owner>thestig@chromium.org</owner> <summary>The number of jobs successfully completed per hour.</summary> </histogram> -<histogram name="CloudPrint.JobsStartedPerInterval" expires_after="M90"> +<histogram name="CloudPrint.JobsStartedPerInterval" units="units" + expires_after="M90"> <owner>thestig@chromium.org</owner> <summary>The number of jobs started per hour.</summary> </histogram> @@ -20938,12 +21009,14 @@ <summary>The amount of time needed to prepare job for spooling.</summary> </histogram> -<histogram name="CloudPrint.PrinterBlacklistSize" expires_after="M90"> +<histogram name="CloudPrint.PrinterBlacklistSize" units="units" + expires_after="M90"> <owner>thestig@chromium.org</owner> <summary>The number of printers user has blacklisted.</summary> </histogram> -<histogram name="CloudPrint.PrinterWhitelistSize" expires_after="M90"> +<histogram name="CloudPrint.PrinterWhitelistSize" units="units" + expires_after="M90"> <owner>thestig@chromium.org</owner> <summary>The number of printers user has whitelisted.</summary> </histogram> @@ -20959,7 +21032,7 @@ <summary>Event counts in ServiceProcessControl.</summary> </histogram> -<histogram name="CloudPrint.ServiceProcessSocketLength" +<histogram name="CloudPrint.ServiceProcessSocketLength" units="units" expires_after="2015-12-01"> <obsolete> Removed 12/2015. http://crbug.com/466644 @@ -21050,7 +21123,8 @@ <summary>The amount of time needed to spool print job.</summary> </histogram> -<histogram name="CloudPrint.UnregisterPrinters" expires_after="M90"> +<histogram name="CloudPrint.UnregisterPrinters" units="units" + expires_after="M90"> <owner>thestig@chromium.org</owner> <summary>The number of printers to unregister.</summary> </histogram> @@ -21073,7 +21147,8 @@ <summary>Request counts to cloud print service.</summary> </histogram> -<histogram name="CloudPrint.UrlFetcherRetries" expires_after="M81"> +<histogram name="CloudPrint.UrlFetcherRetries" units="units" + expires_after="M81"> <owner>thestig@chromium.org</owner> <summary>The number of retries used to complete cloud print request.</summary> </histogram> @@ -21084,7 +21159,7 @@ <summary>The amount of data uploaded with cloud print request.</summary> </histogram> -<histogram name="CloudPrint.XmppPingTry" expires_after="M90"> +<histogram name="CloudPrint.XmppPingTry" units="units" expires_after="M90"> <owner>thestig@chromium.org</owner> <summary>Number of tries before successful ping. 99 means giving up.</summary> </histogram> @@ -21396,7 +21471,8 @@ </histogram> <histogram - name="Compositing.Browser.RenderPass.AppendQuadData.NumMissingTilesNoImageContent"> + name="Compositing.Browser.RenderPass.AppendQuadData.NumMissingTilesNoImageContent" + units="units"> <obsolete> Deprecated 02/2016. We'd learned as much as we could from this metric and it made no sense to keep it around. @@ -21409,7 +21485,8 @@ </histogram> <histogram - name="Compositing.Browser.RenderPass.AppendQuadData.NumMissingTilesSomeImageContent"> + name="Compositing.Browser.RenderPass.AppendQuadData.NumMissingTilesSomeImageContent" + units="units"> <obsolete> Deprecated 02/2016. We'd learned as much as we could from this metric and it made no sense to keep it around. @@ -21619,7 +21696,8 @@ </summary> </histogram> -<histogram name="Compositing.NumActiveLayers" expires_after="2016-04-20"> +<histogram name="Compositing.NumActiveLayers" units="units" + expires_after="2016-04-20"> <obsolete> Deprecated 04/2016, replaced by similar metrics under Compositing.Renderer and Compositing.Browser, depending on which process it occurs in. @@ -21963,7 +22041,8 @@ </histogram> <histogram - name="Compositing.Renderer.RenderPass.AppendQuadData.NumMissingTilesNoImageContent"> + name="Compositing.Renderer.RenderPass.AppendQuadData.NumMissingTilesNoImageContent" + units="units"> <obsolete> Deprecated 02/2016. We'd learned as much as we could from this metric and it made no sense to keep it around. @@ -21976,7 +22055,8 @@ </histogram> <histogram - name="Compositing.Renderer.RenderPass.AppendQuadData.NumMissingTilesSomeImageContent"> + name="Compositing.Renderer.RenderPass.AppendQuadData.NumMissingTilesSomeImageContent" + units="units"> <obsolete> Deprecated 02/2016. We'd learned as much as we could from this metric and it made no sense to keep it around. @@ -22024,7 +22104,7 @@ </histogram> <histogram name="Compositing.RenderPass.AppendQuadData.NumIncompleteTiles" - expires_after="M81"> + units="units" expires_after="M81"> <owner>weiliangc@chromium.org</owner> <summary> Keeps track of number of incomplete tiles in a drawn compositor frame while @@ -22035,7 +22115,7 @@ </histogram> <histogram name="Compositing.RenderPass.AppendQuadData.NumMissingTiles" - expires_after="M81"> + units="units" expires_after="M81"> <owner>weiliangc@chromium.org</owner> <summary> Keeps track of number of missing tiles in a drawn compositor frame while @@ -22213,7 +22293,7 @@ </histogram> <histogram name="Compositing.SurfaceManager.NumOldTemporaryReferences" - expires_after="2018-01-29"> + units="units" expires_after="2018-01-29"> <obsolete> Deprecated 2018/01/24. </obsolete> @@ -22736,7 +22816,7 @@ </summary> </histogram> -<histogram name="ContentSettings.Exceptions" expires_after="M81"> +<histogram name="ContentSettings.Exceptions" units="units" expires_after="M81"> <owner>lshang@chromium.org</owner> <summary> The number of user defined content setting exceptions at browser start. @@ -22844,7 +22924,7 @@ </summary> </histogram> -<histogram name="ContentSettings.NumberOfAllowCookiesExceptions" +<histogram name="ContentSettings.NumberOfAllowCookiesExceptions" units="units" expires_after="2018-10-22"> <obsolete> Deprecated Oct 2018 in favor of ContentSettings.Exceptions.cookies.Allow @@ -22856,7 +22936,7 @@ </summary> </histogram> -<histogram name="ContentSettings.NumberOfBlockCookiesExceptions" +<histogram name="ContentSettings.NumberOfBlockCookiesExceptions" units="units" expires_after="2018-10-22"> <obsolete> Deprecated Oct 2018 in favor of ContentSettings.Exceptions.cookies.Block @@ -22868,7 +22948,8 @@ </summary> </histogram> -<histogram name="ContentSettings.NumberOfExceptions" expires_after="M90"> +<histogram name="ContentSettings.NumberOfExceptions" units="units" + expires_after="M90"> <owner>battre@chromium.org</owner> <summary> The number of user defined hostname patterns for content settings at browser @@ -22877,7 +22958,7 @@ </histogram> <histogram name="ContentSettings.NumberOfSessionOnlyCookiesExceptions" - expires_after="2018-10-22"> + units="units" expires_after="2018-10-22"> <obsolete> Deprecated Oct 2018 in favor of ContentSettings.Exceptions.cookies.SessionOnly @@ -24315,7 +24396,8 @@ </summary> </histogram> -<histogram name="Cookie.CorruptMetaTable" expires_after="2020-01-26"> +<histogram name="Cookie.CorruptMetaTable" units="units" + expires_after="2020-01-26"> <owner>tnagel@chromium.org</owner> <summary> Records the detection of a corrupted meta table. See http://crbug.com/111376 @@ -24323,7 +24405,7 @@ </summary> </histogram> -<histogram name="Cookie.CorruptMetaTableRecoveryFailed"> +<histogram name="Cookie.CorruptMetaTableRecoveryFailed" units="units"> <owner>morlovich@chromium.org</owner> <summary> Records a failure to recover a corrupted meta table. See @@ -24331,7 +24413,7 @@ </summary> </histogram> -<histogram name="Cookie.Count" expires_after="2020-02-16"> +<histogram name="Cookie.Count" units="units" expires_after="2020-02-16"> <owner>battre@chromium.org</owner> <summary> Number of cookies in the store (recorded every 10 minutes of active browsing @@ -24347,13 +24429,16 @@ </histogram> <histogram name="Cookie.DeletionCause" enum="CookieDeletionCause"> + <obsolete> + Removed Jul 2017 for lack of use. + </obsolete> <owner>nharper@chromium.org</owner> <summary> For each cookie removed from the store, the reason it was removed. </summary> </histogram> -<histogram name="Cookie.DomainCount" expires_after="2015-08-21"> +<histogram name="Cookie.DomainCount" units="units" expires_after="2015-08-21"> <obsolete> Deprecated 2015-08-17 as part of cookie histogram cleanup (https://crbug.com/521135). @@ -24365,7 +24450,8 @@ </summary> </histogram> -<histogram name="Cookie.DomainPerEtldp1Count" expires_after="2015-08-21"> +<histogram name="Cookie.DomainPerEtldp1Count" units="units" + expires_after="2015-08-21"> <obsolete> Deprecated 2015-08-17 as part of cookie histogram cleanup (https://crbug.com/521135). @@ -24377,7 +24463,7 @@ </summary> </histogram> -<histogram name="Cookie.Etldp1Count" expires_after="2015-08-21"> +<histogram name="Cookie.Etldp1Count" units="units" expires_after="2015-08-21"> <obsolete> Deprecated 2015-08-17 as part of cookie histogram cleanup (https://crbug.com/521135). @@ -24390,6 +24476,9 @@ </histogram> <histogram name="Cookie.EvictedLastAccessMinutes" units="minutes"> + <obsolete> + Removed Jul 2017 for lack of use. + </obsolete> <owner>nharper@chromium.org</owner> <summary> For each evicted (not expired) cookie, the amount of time since it was last @@ -24463,7 +24552,8 @@ </summary> </histogram> -<histogram name="Cookie.NumberOfLoadedCookies" expires_after="M77"> +<histogram name="Cookie.NumberOfLoadedCookies" units="units" + expires_after="M77"> <obsolete> Removed 2019-07-03. Cookie.Count measures similar things with different timing. @@ -24506,7 +24596,7 @@ </summary> </histogram> -<histogram name="Cookie.PriorityLoadCount" expires_after="M77"> +<histogram name="Cookie.PriorityLoadCount" units="units" expires_after="M77"> <owner>pwnall@chromium.org</owner> <summary> The number of distinct Effective Top-Level Domains Plus One (ETLD+1, i.e., @@ -24587,7 +24677,7 @@ </summary> </histogram> -<histogram name="Cookie.Shutdown.NumberOfCookiesDeleted" +<histogram name="Cookie.Shutdown.NumberOfCookiesDeleted" units="units" expires_after="2015-09-10"> <obsolete> Deprecated as of 9/2015. The associated experiment was flawed. @@ -24611,7 +24701,8 @@ </summary> </histogram> -<histogram name="Cookie.Startup.NumberOfCookiesDeleted" expires_after="M81"> +<histogram name="Cookie.Startup.NumberOfCookiesDeleted" units="units" + expires_after="M81"> <owner>erikchen@chromium.org</owner> <summary> The number of session cookies deleted on startup. This metric is emitted @@ -24826,7 +24917,8 @@ </summary> </histogram> -<histogram name="Cras.HfpWidebandSpeechPacketLoss" expires_after="2020-08-26"> +<histogram name="Cras.HfpWidebandSpeechPacketLoss" units="units" + expires_after="2020-08-26"> <owner>enshuo@chromium.org</owner> <owner>chromeos-audio@google.com</owner> <summary> @@ -24846,7 +24938,8 @@ </summary> </histogram> -<histogram name="Cras.HighestDeviceDelayInput" expires_after="2020-04-23"> +<histogram name="Cras.HighestDeviceDelayInput" units="units" + expires_after="2020-04-23"> <owner>yuhsuan@chromium.org</owner> <owner>chromeos-audio@google.com</owner> <summary> @@ -24858,7 +24951,8 @@ </summary> </histogram> -<histogram name="Cras.HighestDeviceDelayOutput" expires_after="2020-04-23"> +<histogram name="Cras.HighestDeviceDelayOutput" units="units" + expires_after="2020-04-23"> <owner>yuhsuan@chromium.org</owner> <owner>chromeos-audio@google.com</owner> <summary> @@ -25494,7 +25588,7 @@ </summary> </histogram> -<histogram name="CrashReport.PendingReportsOnBackgroundWakeUp" +<histogram name="CrashReport.PendingReportsOnBackgroundWakeUp" units="units" expires_after="2018-11-05"> <obsolete> Deprecated as of 03/2018 when Chrome for iOS stopped uploading crash dumps @@ -25621,14 +25715,14 @@ </summary> </histogram> -<histogram name="CrosFirstRun.DialogShown"> +<histogram name="CrosFirstRun.DialogShown" units="units"> <owner>alemate@chromium.org</owner> <summary> Records the number of times when first-run dialog was shown. </summary> </histogram> -<histogram name="CrosFirstRun.FurthestStep"> +<histogram name="CrosFirstRun.FurthestStep" units="units"> <owner>alemate@chromium.org</owner> <summary> Index of furthest step that was reached during tutorial. Since order of @@ -25653,7 +25747,8 @@ <summary>Tracks the way how user left tutorial.</summary> </histogram> -<histogram name="CrosFirstRun.TutorialLaunched" expires_after="M81"> +<histogram name="CrosFirstRun.TutorialLaunched" units="units" + expires_after="M81"> <owner>alemate@chromium.org</owner> <summary> Records the number of times when first-run tutorial has been launched. @@ -25722,7 +25817,8 @@ <summary>Result of crostini backup.</summary> </histogram> -<histogram name="Crostini.BackupCompressedSizeLog2" expires_after="2020-01-01"> +<histogram name="Crostini.BackupCompressedSizeLog2" units="units" + expires_after="2020-01-01"> <owner>juwa@google.com</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -25732,7 +25828,8 @@ </summary> </histogram> -<histogram name="Crostini.BackupContainerSizeLog2" expires_after="2020-01-01"> +<histogram name="Crostini.BackupContainerSizeLog2" units="units" + expires_after="2020-01-01"> <owner>juwa@google.com</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -25742,7 +25839,8 @@ </summary> </histogram> -<histogram name="Crostini.BackupSizeRatio" expires_after="2020-01-01"> +<histogram name="Crostini.BackupSizeRatio" units="units" + expires_after="2020-01-01"> <owner>juwa@google.com</owner> <owner>tbuckley@chromium.org</owner> <summary> @@ -26414,7 +26512,7 @@ </summary> </histogram> -<histogram name="Cryptohome.DircryptoMigrationTotalFileCount" +<histogram name="Cryptohome.DircryptoMigrationTotalFileCount" units="units" expires_after="M81"> <owner>hashimoto@chromium.org</owner> <summary> @@ -27264,7 +27362,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.ConfigFetchLostBytesCL" +<histogram name="DataReductionProxy.ConfigFetchLostBytesCL" units="units" expires_after="2016-02-10"> <obsolete> Removed in Feb. 2016 @@ -27278,7 +27376,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.ConfigFetchLostBytesDiff" +<histogram name="DataReductionProxy.ConfigFetchLostBytesDiff" units="units" expires_after="2016-02-10"> <obsolete> Removed in Feb. 2016 @@ -27294,7 +27392,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.ConfigFetchLostBytesOCL" +<histogram name="DataReductionProxy.ConfigFetchLostBytesOCL" units="units" expires_after="2016-02-10"> <obsolete> Removed in Feb. 2016 @@ -27360,7 +27458,8 @@ </histogram> <histogram - name="DataReductionProxy.ConfigService.FetchFailedAttemptsBeforeSuccess"> + name="DataReductionProxy.ConfigService.FetchFailedAttemptsBeforeSuccess" + units="units"> <owner>bengr@chromium.org</owner> <summary> The number of failed attempts when retrieving the configuration from the @@ -27484,7 +27583,7 @@ </histogram> <histogram name="DataReductionProxy.DeleteBrowsingHistory.NumBuckets" - expires_after="M77"> + units="units" expires_after="M77"> <owner>robertogden@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> @@ -27509,7 +27608,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.HeaderTamperDetectionHTTP" +<histogram name="DataReductionProxy.HeaderTamperDetectionHTTP" units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 @@ -27525,7 +27624,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.HeaderTamperDetectionHTTPS" +<histogram name="DataReductionProxy.HeaderTamperDetectionHTTPS" units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 @@ -27542,7 +27641,7 @@ </histogram> <histogram name="DataReductionProxy.HeaderTamperDetectionPassHTTP" - expires_after="2017-07-06"> + units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 </obsolete> @@ -27558,7 +27657,7 @@ </histogram> <histogram name="DataReductionProxy.HeaderTamperDetectionPassHTTPS" - expires_after="2017-07-06"> + units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 </obsolete> @@ -27573,7 +27672,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.HeaderTamperedHTTP" +<histogram name="DataReductionProxy.HeaderTamperedHTTP" units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 @@ -27589,7 +27688,7 @@ </summary> </histogram> -<histogram name="DataReductionProxy.HeaderTamperedHTTPS" +<histogram name="DataReductionProxy.HeaderTamperedHTTPS" units="units" expires_after="2017-07-06"> <obsolete> Removed in June 2017 @@ -27761,7 +27860,8 @@ </summary> </histogram> -<histogram name="DataReductionProxy.MissingViaHeader.ResponseCode"> +<histogram name="DataReductionProxy.MissingViaHeader.ResponseCode" + units="units"> <owner>bengr@chromium.org</owner> <owner>sclittle@chromium.org</owner> <summary> @@ -29236,7 +29336,8 @@ </summary> </histogram> -<histogram name="DemoMode.UniqueAppsLaunched" expires_after="2019-11-13"> +<histogram name="DemoMode.UniqueAppsLaunched" units="units" + expires_after="2019-11-13"> <owner>danan@chromium.org</owner> <owner>michaelpg@chromium.org</owner> <summary> @@ -29367,7 +29468,7 @@ </histogram> <histogram base="true" name="DesktopIOSPromotion.VariationSigninReason" - expires_after="2018-11-05"> + units="units" expires_after="2018-11-05"> <obsolete> Deprecated 11/2018 in issue 894963. </obsolete> @@ -30055,7 +30156,7 @@ </summary> </histogram> -<histogram name="DirectWrite.Fonts.BuildCache.Ignored"> +<histogram name="DirectWrite.Fonts.BuildCache.Ignored" units="units"> <owner>drott@chromium.org</owner> <summary> Reports the total number of fonts that will be ignored while building static @@ -30068,7 +30169,8 @@ </summary> </histogram> -<histogram name="DirectWrite.Fonts.Gfx.InitializeLoopCount" expires_after="M82"> +<histogram name="DirectWrite.Fonts.Gfx.InitializeLoopCount" units="units" + expires_after="M82"> <owner>drott@chromium.org</owner> <owner>etienneb@chromium.org</owner> <summary> @@ -30079,7 +30181,7 @@ </summary> </histogram> -<histogram name="DirectWrite.Fonts.Ignored"> +<histogram name="DirectWrite.Fonts.Ignored" units="units"> <owner>drott@chromium.org</owner> <summary> Reports the total number of fonts that will be ignored while loading a @@ -30088,7 +30190,7 @@ </summary> </histogram> -<histogram name="DirectWrite.Fonts.Loaded"> +<histogram name="DirectWrite.Fonts.Loaded" units="units"> <owner>drott@chromium.org</owner> <summary> Reports the total number of fonts to be loaded through a custom font @@ -30314,7 +30416,7 @@ <summary>Whether an extension has been wiped out.</summary> </histogram> -<histogram name="DisabledExtension.SideloadWipeoutCount" +<histogram name="DisabledExtension.SideloadWipeoutCount" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -30619,7 +30721,7 @@ </summary> </histogram> -<histogram name="DNS.AttemptCancelled" expires_after="2018-07-03"> +<histogram name="DNS.AttemptCancelled" units="units" expires_after="2018-07-03"> <obsolete> Deprecated as of 6/2018. </obsolete> @@ -30629,7 +30731,7 @@ </summary> </histogram> -<histogram name="DNS.AttemptDiscarded" expires_after="2018-11-08"> +<histogram name="DNS.AttemptDiscarded" units="units" expires_after="2018-11-08"> <obsolete> Deprecated 11/2018. </obsolete> @@ -30656,7 +30758,7 @@ </summary> </histogram> -<histogram name="DNS.AttemptFailure" expires_after="2018-11-08"> +<histogram name="DNS.AttemptFailure" units="units" expires_after="2018-11-08"> <obsolete> Deprecated 11/2018. </obsolete> @@ -30665,7 +30767,8 @@ <summary>The attempt that has not resolved the host successfully.</summary> </histogram> -<histogram name="DNS.AttemptFirstFailure" expires_after="2018-11-08"> +<histogram name="DNS.AttemptFirstFailure" units="units" + expires_after="2018-11-08"> <obsolete> Deprecated 11/2018. </obsolete> @@ -30677,7 +30780,8 @@ </summary> </histogram> -<histogram name="DNS.AttemptFirstSuccess" expires_after="2018-11-08"> +<histogram name="DNS.AttemptFirstSuccess" units="units" + expires_after="2018-11-08"> <obsolete> Deprecated 11/2018. </obsolete> @@ -30688,7 +30792,7 @@ </summary> </histogram> -<histogram name="DNS.AttemptSuccess" expires_after="2018-11-08"> +<histogram name="DNS.AttemptSuccess" units="units" expires_after="2018-11-08"> <obsolete> Deprecated 11/2018. </obsolete> @@ -31164,7 +31268,8 @@ </summary> </histogram> -<histogram name="DNS.PrefetchFoundName" expires_after="2017-09-28"> +<histogram name="DNS.PrefetchFoundName" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31189,7 +31294,8 @@ </summary> </histogram> -<histogram name="DNS.PrefetchNegativeHit" expires_after="2017-09-28"> +<histogram name="DNS.PrefetchNegativeHit" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31219,7 +31325,8 @@ </summary> </histogram> -<histogram name="DNS.PrefetchPositiveHit" expires_after="2017-09-28"> +<histogram name="DNS.PrefetchPositiveHit" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31293,7 +31400,8 @@ </summary> </histogram> -<histogram name="DNS.QueueRecycledDeltaOver2" expires_after="2017-09-28"> +<histogram name="DNS.QueueRecycledDeltaOver2" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31306,7 +31414,8 @@ </summary> </histogram> -<histogram name="DNS.QueueRecycledUnder2" expires_after="2017-09-28"> +<histogram name="DNS.QueueRecycledUnder2" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31480,7 +31589,7 @@ </summary> </histogram> -<histogram name="DNS.StaleHostResolver.RestoreSizeOnCacheMiss"> +<histogram name="DNS.StaleHostResolver.RestoreSizeOnCacheMiss" units="units"> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -31489,7 +31598,7 @@ </summary> </histogram> -<histogram name="DNS.StaleHostResolver.SizeOnCacheMiss"> +<histogram name="DNS.StaleHostResolver.SizeOnCacheMiss" units="units"> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -31534,7 +31643,8 @@ </summary> </histogram> -<histogram name="DNS.UnexpectedResolution" expires_after="2017-09-28"> +<histogram name="DNS.UnexpectedResolution" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31554,7 +31664,8 @@ </summary> </histogram> -<histogram name="DNS.UnexpectedResolutionL" expires_after="2017-09-28"> +<histogram name="DNS.UnexpectedResolutionL" units="units" + expires_after="2017-09-28"> <obsolete> Deprecated as of 9/2017. </obsolete> @@ -31678,7 +31789,7 @@ </histogram> <histogram name="DnsProbe.Probe.ResultBadConfig.SystemNameserverCount" - expires_after="2013-08-01"> + units="units" expires_after="2013-08-01"> <obsolete> Removed 7/2013. </obsolete> @@ -31748,7 +31859,7 @@ </histogram> <histogram name="Document.OutliveTimeAfterShutdown.DestroyedBeforeProcessDies" - expires_after="M77"> + units="units" expires_after="M77"> <owner>hajimehoshi@chromium.org</owner> <owner>keishi@chromium.org</owner> <summary> @@ -31901,7 +32012,8 @@ </summary> </histogram> -<histogram name="DomainBoundCerts.DBLoadedCount" expires_after="2018-01-22"> +<histogram name="DomainBoundCerts.DBLoadedCount" units="units" + expires_after="2018-01-22"> <obsolete> Removed January 2018. </obsolete> @@ -31941,7 +32053,7 @@ </summary> </histogram> -<histogram name="DomainBoundCerts.DBVersion"> +<histogram name="DomainBoundCerts.DBVersion" units="units"> <obsolete> Feature was removed (crbug.com/875053). </obsolete> @@ -32039,7 +32151,8 @@ </summary> </histogram> -<histogram name="DomainBoundCerts.TaskWaitCount" expires_after="2017-04-05"> +<histogram name="DomainBoundCerts.TaskWaitCount" units="units" + expires_after="2017-04-05"> <obsolete> Removed 4/2017. </obsolete> @@ -32049,7 +32162,7 @@ </summary> </histogram> -<histogram name="DomainMixing.OneDay"> +<histogram name="DomainMixing.OneDay" units="units"> <owner>qfiard@google.com</owner> <summary> The distribution over daily active users of Google Search of the ratio of @@ -32059,7 +32172,7 @@ </summary> </histogram> -<histogram name="DomainMixing.OneMonth"> +<histogram name="DomainMixing.OneMonth" units="units"> <owner>qfiard@google.com</owner> <summary> The distribution over daily active users of Google Search of the ratio of @@ -32069,7 +32182,7 @@ </summary> </histogram> -<histogram name="DomainMixing.OneWeek"> +<histogram name="DomainMixing.OneWeek" units="units"> <owner>qfiard@google.com</owner> <summary> The distribution over daily active users of Google Search of the ratio of @@ -32079,7 +32192,7 @@ </summary> </histogram> -<histogram name="DomainMixing.TwoWeeks"> +<histogram name="DomainMixing.TwoWeeks" units="units"> <owner>qfiard@google.com</owner> <summary> The distribution over daily active users of Google Search of the ratio of @@ -32187,7 +32300,7 @@ </summary> </histogram> -<histogram name="DomainReliability.UploadCollectorIndex" +<histogram name="DomainReliability.UploadCollectorIndex" units="units" expires_after="2017-11-14"> <obsolete> Removed November 2017. @@ -32728,7 +32841,7 @@ </summary> </histogram> -<histogram name="Download.BandwidthDiskBytesPerSecond" +<histogram name="Download.BandwidthDiskBytesPerSecond" units="units" expires_after="2018-08-14"> <obsolete> Removed in 08/2018. @@ -32740,7 +32853,7 @@ </summary> </histogram> -<histogram name="Download.BandwidthOverallBytesPerSecond" +<histogram name="Download.BandwidthOverallBytesPerSecond" units="units" expires_after="2020-02-16"> <owner>dtrainor@chromium.org</owner> <summary> @@ -32790,7 +32903,18 @@ </summary> </histogram> -<histogram name="Download.ClearAllSize" expires_after="2017-01-05"> +<histogram name="Download.CancelledDownloadRemovedFromHistory" + units="downloads" expires_after="M80"> + <owner>qinmin@chromium.org</owner> + <owner>xingliu@chromium.org</owner> + <summary> + Records the number of cancelled download that are cleaned up from the + history, after loading all the downloads from the history DB on startup. + </summary> +</histogram> + +<histogram name="Download.ClearAllSize" units="units" + expires_after="2017-01-05"> <obsolete> Deprecated 1/2017. </obsolete> @@ -33006,7 +33130,7 @@ <summary>Reason for dropping a record read in from the DB.</summary> </histogram> -<histogram name="Download.DatabaseRemoveDownloadsCount" +<histogram name="Download.DatabaseRemoveDownloadsCount" units="units" expires_after="2018-08-14"> <obsolete> Removed in 08/2018. @@ -33174,7 +33298,8 @@ </summary> </histogram> -<histogram name="Download.FileThreadBlockedTime" expires_after="2018-08-14"> +<histogram name="Download.FileThreadBlockedTime" units="units" + expires_after="2018-08-14"> <obsolete> Removed in 08/2018. </obsolete> @@ -33185,7 +33310,8 @@ </summary> </histogram> -<histogram name="Download.FileThreadReceiveBuffers" expires_after="2018-08-14"> +<histogram name="Download.FileThreadReceiveBuffers" units="units" + expires_after="2018-08-14"> <obsolete> Removed in 08/2018. </obsolete> @@ -33219,7 +33345,7 @@ </summary> </histogram> -<histogram name="Download.HistorySize"> +<histogram name="Download.HistorySize" units="units"> <owner>dtrainor@chromium.org</owner> <summary> The number of items in the History database, at the time a new download is @@ -33227,7 +33353,8 @@ </summary> </histogram> -<histogram name="Download.HistorySize2" expires_after="2020-02-16"> +<histogram name="Download.HistorySize2" units="units" + expires_after="2020-02-16"> <owner>dtrainor@chromium.org</owner> <summary> The number of items in the History database, at the time a new download is @@ -33309,6 +33436,16 @@ </summary> </histogram> +<histogram name="Download.InterruptedDownloadsRemovedFromHistory" + units="downloads" expires_after="M80"> + <owner>qinmin@chromium.org</owner> + <owner>xingliu@chromium.org</owner> + <summary> + Records the number of interrupted download that are cleaned up from the + history, after loading all the downloads from the history DB on startup. + </summary> +</histogram> + <histogram name="Download.InterruptedError" enum="NetErrorCodes"> <owner>dtrainor@chromium.org</owner> <summary> @@ -33316,7 +33453,8 @@ </summary> </histogram> -<histogram name="Download.InterruptedOverrunBytes" expires_after="M77"> +<histogram name="Download.InterruptedOverrunBytes" units="units" + expires_after="M77"> <obsolete> Removed in 07/2019. </obsolete> @@ -33359,7 +33497,7 @@ </summary> </histogram> -<histogram name="Download.InterruptedUnderrunBytes"> +<histogram name="Download.InterruptedUnderrunBytes" units="units"> <obsolete> Removed in 07/2019. </obsolete> @@ -33411,7 +33549,7 @@ </summary> </histogram> -<histogram name="Download.IOSDownloadedFileStatusCode" +<histogram name="Download.IOSDownloadedFileStatusCode" units="units" expires_after="2020-01-15"> <owner>eugenebut@chromium.org</owner> <owner>stkhapugin@chromium.org</owner> @@ -33622,7 +33760,7 @@ </summary> </histogram> -<histogram name="Download.OnChanged" expires_after="2018-08-14"> +<histogram name="Download.OnChanged" units="units" expires_after="2018-08-14"> <obsolete> Removed in 08/2018. </obsolete> @@ -33649,7 +33787,7 @@ </summary> </histogram> -<histogram name="Download.OpensOutstanding" expires_after="M77"> +<histogram name="Download.OpensOutstanding" units="units" expires_after="M77"> <owner>dtrainor@chromium.org</owner> <summary>The number of unopened downloads, when one is opened.</summary> </histogram> @@ -34266,7 +34404,7 @@ </summary> </histogram> -<histogram name="Download.ShelfInProgressSizeOnAutoClose" +<histogram name="Download.ShelfInProgressSizeOnAutoClose" units="units" expires_after="2018-08-14"> <obsolete> Removed in 08/2018. @@ -34278,7 +34416,7 @@ </summary> </histogram> -<histogram name="Download.ShelfInProgressSizeOnUserClose" +<histogram name="Download.ShelfInProgressSizeOnUserClose" units="units" expires_after="2018-08-14"> <obsolete> Removed in 08/2018. @@ -34290,7 +34428,8 @@ </summary> </histogram> -<histogram name="Download.ShelfSizeOnAutoClose" expires_after="2018-08-14"> +<histogram name="Download.ShelfSizeOnAutoClose" units="units" + expires_after="2018-08-14"> <obsolete> Removed in 08/2018. </obsolete> @@ -34300,7 +34439,8 @@ </summary> </histogram> -<histogram name="Download.ShelfSizeOnUserClose" expires_after="2018-08-14"> +<histogram name="Download.ShelfSizeOnUserClose" units="units" + expires_after="2018-08-14"> <obsolete> Removed in 08/2018. </obsolete> @@ -34471,7 +34611,8 @@ <summary>Records the OS error code when moving a file on windows.</summary> </histogram> -<histogram name="Download.WriteLoopCount" expires_after="2017-01-05"> +<histogram name="Download.WriteLoopCount" units="units" + expires_after="2017-01-05"> <obsolete> Deprecated 1/2017 </obsolete> @@ -34641,7 +34782,7 @@ </summary> </histogram> -<histogram name="Drive.FilesListRequestRunner.MaxResults" +<histogram name="Drive.FilesListRequestRunner.MaxResults" units="units" expires_after="2019-02-15"> <obsolete> Obsolete 02/2019 as DriveFS implementation obsoletes this metric. @@ -34713,7 +34854,8 @@ </summary> </histogram> -<histogram name="Drive.MetadataDBVersionBeforeUpgradeCheck" expires_after="M75"> +<histogram name="Drive.MetadataDBVersionBeforeUpgradeCheck" units="units" + expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -34726,7 +34868,8 @@ </summary> </histogram> -<histogram name="Drive.MigrateDirtyFilesCount" expires_after="2019-10-01"> +<histogram name="Drive.MigrateDirtyFilesCount" units="units" + expires_after="2019-10-01"> <obsolete> Obsolete 08/2019. Most migrations are complete, we no longer need this. </obsolete> @@ -34739,7 +34882,7 @@ </histogram> <histogram name="Drive.NumberOfCacheFilesRecoveredAfterDBCorruption" - expires_after="M75"> + units="units" expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -34752,7 +34895,8 @@ </summary> </histogram> -<histogram name="Drive.NumberOfHostedDocuments" expires_after="M75"> +<histogram name="Drive.NumberOfHostedDocuments" units="units" + expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -34764,7 +34908,7 @@ </summary> </histogram> -<histogram name="Drive.NumberOfRegularFiles" expires_after="M75"> +<histogram name="Drive.NumberOfRegularFiles" units="units" expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -34775,7 +34919,7 @@ </summary> </histogram> -<histogram name="Drive.NumberOfTotalFiles" expires_after="M75"> +<histogram name="Drive.NumberOfTotalFiles" units="units" expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -34830,7 +34974,8 @@ </summary> </histogram> -<histogram name="Drive.TotalFileCountInBatchUpload" expires_after="M75"> +<histogram name="Drive.TotalFileCountInBatchUpload" units="units" + expires_after="M75"> <obsolete> Obsolete 04/2019 as DriveFS implementation obsoletes this metric. </obsolete> @@ -35195,7 +35340,7 @@ </summary> </histogram> -<histogram name="EasyUnlock.Setup.Devices.Count.Eligible"> +<histogram name="EasyUnlock.Setup.Devices.Count.Eligible" units="units"> <owner>hansberry@chromium.org</owner> <summary> The number of eligible devices that the CryptAuth server returns during the @@ -35208,7 +35353,7 @@ </details> </histogram> -<histogram name="EasyUnlock.Setup.Devices.Count.Ineligible"> +<histogram name="EasyUnlock.Setup.Devices.Count.Ineligible" units="units"> <owner>hansberry@chromium.org</owner> <summary> The number of ineligible devices that the CryptAuth server returns during @@ -35612,7 +35757,7 @@ </summary> </histogram> -<histogram name="EnhancedBookmarks.AllBookmarksCount" +<histogram name="EnhancedBookmarks.AllBookmarksCount" units="units" expires_after="2016-05-04"> <obsolete> Removed 4/2016 after we no longer show "all bookamrks" in bookmark @@ -35742,7 +35887,7 @@ </summary> </histogram> -<histogram name="Enterprise.CloudReportingRequestCount"> +<histogram name="Enterprise.CloudReportingRequestCount" units="units"> <owner>zmin@chromium.org</owner> <summary> The number of request for one Chrome browser cloud management report. A @@ -36093,7 +36238,7 @@ </summary> </histogram> -<histogram name="Enterprise.IOSPolicies"> +<histogram name="Enterprise.IOSPolicies" units="units"> <owner>mnissler@chromium.org</owner> <summary> Number of policies loaded at startup on iOS, and when a change is detected @@ -36626,7 +36771,7 @@ </summary> </histogram> -<histogram name="Enterprise.VpdCheck" expires_after="2020-07-05"> +<histogram name="Enterprise.VpdCheck" units="units" expires_after="2020-07-05"> <owner>igorcov@chromium.org</owner> <owner>tnagel@chromium.org</owner> <summary> @@ -36635,7 +36780,7 @@ </summary> </histogram> -<histogram name="Enterprise.VpdUpdateStatus" expires_after="M82"> +<histogram name="Enterprise.VpdUpdateStatus" units="units" expires_after="M82"> <owner>igorcov@chromium.org</owner> <owner>tnagel@chromium.org</owner> <summary> @@ -36948,13 +37093,13 @@ </summary> </histogram> -<histogram name="Event.CoalescedCount.Mouse" expires_after="M81"> +<histogram name="Event.CoalescedCount.Mouse" units="units" expires_after="M81"> <owner>tdresser@chromium.org</owner> Team: input-dev@chromium.org. <summary>Number of Mouse events coalesced.</summary> </histogram> -<histogram name="Event.CoalescedCount.Touch"> +<histogram name="Event.CoalescedCount.Touch" units="units"> <owner>tdresser@chromium.org</owner> Team: input-dev@chromium.org. <summary>Number of Touch events coalesced.</summary> @@ -37173,7 +37318,8 @@ </summary> </histogram> -<histogram name="Event.DragDrop.ExternalOriginDrop" expires_after="M81"> +<histogram name="Event.DragDrop.ExternalOriginDrop" units="units" + expires_after="M81"> <owner>nzolghadr@chromium.org</owner> <summary> Counts the number of times a drag and drop operation originating outside of @@ -37200,7 +37346,7 @@ </summary> </histogram> -<histogram name="Event.FrameEventRouting.NoGestureTarget" +<histogram name="Event.FrameEventRouting.NoGestureTarget" units="units" expires_after="2020-02-23"> <owner>wjmaclean@chromium.org</owner> <summary> @@ -37210,7 +37356,7 @@ </summary> </histogram> -<histogram name="Event.FrameEventRouting.TouchEventAckQueueSize" +<histogram name="Event.FrameEventRouting.TouchEventAckQueueSize" units="units" expires_after="2019-12-31"> <owner>wjmaclean@chromium.org</owner> <owner>kenrb@chromium.org</owner> @@ -40701,7 +40847,8 @@ </summary> </histogram> -<histogram name="ExploreSites.SiteTilesClickIndex" expires_after="2020-02-02"> +<histogram name="ExploreSites.SiteTilesClickIndex" units="units" + expires_after="2020-02-02"> <obsolete> Deprecated with M77 and replaced by ExploreSites.SiteTilesClickIndex2. </obsolete> @@ -40715,7 +40862,8 @@ </summary> </histogram> -<histogram name="ExploreSites.SiteTilesClickIndex2" expires_after="2020-02-16"> +<histogram name="ExploreSites.SiteTilesClickIndex2" units="units" + expires_after="2020-02-16"> <owner>dewittj@chromium.org</owner> <owner>petewil@chromium.org</owner> <summary> @@ -40788,7 +40936,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.ContentScript" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.ContentScript" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40798,7 +40947,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedDiv" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedDiv" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40809,7 +40959,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedEmbed" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedEmbed" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40820,7 +40971,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedIframe" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedIframe" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40831,7 +40983,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedInput" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedInput" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40842,7 +40995,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedLink" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedLink" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40853,7 +41007,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedObject" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedObject" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40864,7 +41019,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.CreatedScript" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.CreatedScript" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40875,7 +41031,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.DocumentWrite" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.DocumentWrite" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -40885,7 +41042,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.ContentScript" +<histogram name="ExtensionActivity.Google.ContentScript" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40897,7 +41054,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedDiv" +<histogram name="ExtensionActivity.Google.CreatedDiv" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40909,7 +41066,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedEmbed" +<histogram name="ExtensionActivity.Google.CreatedEmbed" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40921,7 +41078,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedIframe"> +<histogram name="ExtensionActivity.Google.CreatedIframe" units="units"> <owner>felt@chromium.org</owner> <summary> For each www.google.com pageload, the number of extensions that create @@ -40929,7 +41086,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedInput" +<histogram name="ExtensionActivity.Google.CreatedInput" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40941,7 +41098,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedLink" +<histogram name="ExtensionActivity.Google.CreatedLink" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40953,7 +41110,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedObject" +<histogram name="ExtensionActivity.Google.CreatedObject" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40965,7 +41122,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.CreatedScript" +<histogram name="ExtensionActivity.Google.CreatedScript" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40977,7 +41134,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.DocumentWrite" +<histogram name="ExtensionActivity.Google.DocumentWrite" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -40989,7 +41146,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.InnerHtml" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.Google.InnerHtml" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41000,7 +41158,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.InvokedDomMethod" +<histogram name="ExtensionActivity.Google.InvokedDomMethod" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -41012,7 +41170,7 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.ModifiedDom" +<histogram name="ExtensionActivity.Google.ModifiedDom" units="units" expires_after="2015-08-17"> <obsolete> Deprecated with M46. @@ -41024,7 +41182,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.Google.ReadDom" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.Google.ReadDom" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41035,7 +41194,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.InnerHtml" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.InnerHtml" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41045,7 +41205,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.InvokedDomMethod" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.InvokedDomMethod" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41055,7 +41216,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.ModifiedDom" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.ModifiedDom" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41066,7 +41228,8 @@ </summary> </histogram> -<histogram name="ExtensionActivity.ReadDom" expires_after="2015-08-17"> +<histogram name="ExtensionActivity.ReadDom" units="units" + expires_after="2015-08-17"> <obsolete> Deprecated with M46. </obsolete> @@ -41230,7 +41393,7 @@ </summary> </histogram> -<histogram name="ExtensionInstallSigner.InvalidCount" +<histogram name="ExtensionInstallSigner.InvalidCount" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -41240,7 +41403,7 @@ </summary> </histogram> -<histogram name="ExtensionInstallSigner.RequestCount" +<histogram name="ExtensionInstallSigner.RequestCount" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -41252,7 +41415,7 @@ </summary> </histogram> -<histogram name="ExtensionInstallSigner.ResultWasValid" +<histogram name="ExtensionInstallSigner.ResultWasValid" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -42004,7 +42167,7 @@ </summary> </histogram> -<histogram name="Extensions.CorruptExtensionBecameDisabled"> +<histogram name="Extensions.CorruptExtensionBecameDisabled" units="units"> <owner>lazyboy@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -42024,7 +42187,7 @@ </summary> </histogram> -<histogram name="Extensions.CorruptExtensionTotalDisables" +<histogram name="Extensions.CorruptExtensionTotalDisables" units="units" expires_after="never"> <!-- expires-never: Used for monitoring corrupt extensions. --> @@ -42037,7 +42200,7 @@ </summary> </histogram> -<histogram name="Extensions.CorruptExtensionWouldBeDisabled"> +<histogram name="Extensions.CorruptExtensionWouldBeDisabled" units="units"> <owner>lazyboy@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -42106,7 +42269,7 @@ <summary>Net error results from URLFetcher.</summary> </histogram> -<histogram name="Extensions.CrxFetchFailureRetryCountGoogleUrl" +<histogram name="Extensions.CrxFetchFailureRetryCountGoogleUrl" units="units" expires_after="M77"> <owner>waffles@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -42116,7 +42279,7 @@ </summary> </histogram> -<histogram name="Extensions.CrxFetchFailureRetryCountOtherUrl" +<histogram name="Extensions.CrxFetchFailureRetryCountOtherUrl" units="units" expires_after="2018-08-30"> <owner>waffles@chromium.org</owner> <owner>rdevlin.cronin@chromium.org</owner> @@ -42127,7 +42290,7 @@ </summary> </histogram> -<histogram name="Extensions.CrxFetchSuccessRetryCountGoogleUrl" +<histogram name="Extensions.CrxFetchSuccessRetryCountGoogleUrl" units="units" expires_after="M77"> <owner>waffles@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -42137,7 +42300,7 @@ </summary> </histogram> -<histogram name="Extensions.CrxFetchSuccessRetryCountOtherUrl" +<histogram name="Extensions.CrxFetchSuccessRetryCountOtherUrl" units="units" expires_after="2018-08-30"> <owner>waffles@chromium.org</owner> <owner>rdevlin.cronin@chromium.org</owner> @@ -42148,7 +42311,8 @@ </summary> </histogram> -<histogram name="Extensions.CrxInstallDirPathLength" expires_after="2018-08-30"> +<histogram name="Extensions.CrxInstallDirPathLength" units="units" + expires_after="2018-08-30"> <owner>waffles@chromium.org</owner> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -42444,7 +42608,7 @@ </summary> </histogram> -<histogram name="Extensions.DepricatedExternalJsonCount" +<histogram name="Extensions.DepricatedExternalJsonCount" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -42500,7 +42664,7 @@ </histogram> <histogram name="Extensions.DidCreateScriptContext_LockScreenExtension" - expires_after="2020-12-01"> + units="units" expires_after="2020-12-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -42586,7 +42750,7 @@ </summary> </histogram> -<histogram name="Extensions.Disabled" expires_after="never"> +<histogram name="Extensions.Disabled" units="units" expires_after="never"> <!-- expires-never: Used for monitoring user extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -42595,7 +42759,8 @@ </summary> </histogram> -<histogram name="Extensions.DisabledForPermissions" expires_after="never"> +<histogram name="Extensions.DisabledForPermissions" units="units" + expires_after="never"> <!-- expires-never: Used for monitoring user extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -42702,7 +42867,7 @@ </histogram> <histogram name="Extensions.EnhancedBookmarksManagerNumEventListeners" - expires_after="2016-04-15"> + units="units" expires_after="2016-04-15"> <obsolete> Obsolete since the enhanced bookmarks manager is no longer using an event page. @@ -42717,7 +42882,7 @@ </summary> </histogram> -<histogram name="Extensions.ErrorCodeFromCrxOpen"> +<histogram name="Extensions.ErrorCodeFromCrxOpen" units="units"> <owner>extensions-core@chromium.org</owner> <summary> If opening the CRX file for unpacking fails, this integer is the error code @@ -42725,7 +42890,7 @@ </summary> </histogram> -<histogram name="Extensions.EventlessEventPages"> +<histogram name="Extensions.EventlessEventPages" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of extensions with event pages that have no registered event @@ -42836,7 +43001,8 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionCacheCount" expires_after="M78"> +<histogram name="Extensions.ExtensionCacheCount" units="units" + expires_after="M78"> <owner>achuith@chromium.org</owner> <summary> Number of cached extensions on disk. Reported on Chrome OS during user @@ -42897,7 +43063,7 @@ </histogram> <histogram name="Extensions.ExtensionHostMonitoring.MaxActiveLoading" - expires_after="2019-12-31"> + units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The maximum number of ExtensionHosts (primarily background/event pages) that @@ -42906,7 +43072,7 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionHostMonitoring.MaxInQueue" +<histogram name="Extensions.ExtensionHostMonitoring.MaxInQueue" units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -42916,7 +43082,7 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionHostMonitoring.NumLoaded" +<histogram name="Extensions.ExtensionHostMonitoring.NumLoaded" units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -42925,7 +43091,7 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionHostMonitoring.NumQueued" +<histogram name="Extensions.ExtensionHostMonitoring.NumQueued" units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -42936,7 +43102,7 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionInstalled"> +<histogram name="Extensions.ExtensionInstalled" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary>An extension has been installed.</summary> </histogram> @@ -42972,14 +43138,14 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionRootPathLength"> +<histogram name="Extensions.ExtensionRootPathLength" units="units"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Length of the Extensions dir path inside the profile directory. </summary> </histogram> -<histogram name="Extensions.ExtensionServiceInitTime"> +<histogram name="Extensions.ExtensionServiceInitTime" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary> Time taken for the ExtensionService to initialize, including the time it @@ -42990,7 +43156,7 @@ </histogram> <histogram name="Extensions.ExtensionServiceNotifyReadyListenersTime" - expires_after="2019-12-31"> + units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> Time taken for the ExtensionService to notify all ready listeners that the @@ -43000,7 +43166,7 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionUninstalled"> +<histogram name="Extensions.ExtensionUninstalled" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary>An extension has been uninstalled.</summary> </histogram> @@ -43083,7 +43249,8 @@ </summary> </histogram> -<histogram name="Extensions.ExternalJsonCount" expires_after="M77"> +<histogram name="Extensions.ExternalJsonCount" units="units" + expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of extensions referenced in the external extensions source at path @@ -43114,7 +43281,8 @@ </summary> </histogram> -<histogram name="Extensions.FileAccessAllowed" expires_after="2018-08-30"> +<histogram name="Extensions.FileAccessAllowed" units="units" + expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of extensions (and friends) that could have been given access to @@ -43126,7 +43294,8 @@ </summary> </histogram> -<histogram name="Extensions.FileAccessNotAllowed" expires_after="2018-08-30"> +<histogram name="Extensions.FileAccessNotAllowed" units="units" + expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of extensions (and friends) that could have been given access to @@ -43229,7 +43398,7 @@ </histogram> <histogram name="Extensions.ForceInstalledTimedOutAndNotInstalledCount" - expires_after="2019-11-01"> + units="units" expires_after="2019-11-01"> <owner>poromov@chromium.org</owner> <summary> Number of enterprise policy forced extensions that are not installed after 5 @@ -43237,7 +43406,7 @@ </summary> </histogram> -<histogram name="Extensions.ForceInstalledTimedOutCount" +<histogram name="Extensions.ForceInstalledTimedOutCount" units="units" expires_after="2019-11-01"> <owner>poromov@chromium.org</owner> <summary> @@ -43246,7 +43415,7 @@ </summary> </histogram> -<histogram name="Extensions.ForceInstalledTotalCandidateCount" +<histogram name="Extensions.ForceInstalledTotalCandidateCount" units="units" expires_after="2019-11-01"> <owner>poromov@chromium.org</owner> <owner>askaraitzhan@google.com</owner> @@ -43564,7 +43733,8 @@ </summary> </histogram> -<histogram name="Extensions.HomepageOverrides" expires_after="M85"> +<histogram name="Extensions.HomepageOverrides" units="units" + expires_after="M85"> <owner>rdevlin.cronin@chromium.org</owner> <owner>kelvinjiang@chromium.org</owner> <summary> @@ -43631,7 +43801,8 @@ </summary> </histogram> -<histogram name="Extensions.IncognitoAllowed" expires_after="never"> +<histogram name="Extensions.IncognitoAllowed" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -43645,7 +43816,8 @@ </summary> </histogram> -<histogram name="Extensions.IncognitoNotAllowed" expires_after="2018-08-30"> +<histogram name="Extensions.IncognitoNotAllowed" units="units" + expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of extensions (and friends) that could have been allowed in @@ -43710,7 +43882,7 @@ </summary> </histogram> -<histogram name="Extensions.InjectEnd_BlockingScriptCount" +<histogram name="Extensions.InjectEnd_BlockingScriptCount" units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -43718,7 +43890,8 @@ </summary> </histogram> -<histogram name="Extensions.InjectEnd_ScriptCount" expires_after="2019-12-31"> +<histogram name="Extensions.InjectEnd_ScriptCount" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary>Number of scripts injected at document end by extensions.</summary> </histogram> @@ -43731,7 +43904,7 @@ </summary> </histogram> -<histogram name="Extensions.InjectIdle_BlockingScriptCount" +<histogram name="Extensions.InjectIdle_BlockingScriptCount" units="units" expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> @@ -43739,7 +43912,8 @@ </summary> </histogram> -<histogram name="Extensions.InjectIdle_ScriptCount" expires_after="2019-12-31"> +<histogram name="Extensions.InjectIdle_ScriptCount" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary>Number of scripts injected at document idle by extensions.</summary> </histogram> @@ -43761,19 +43935,20 @@ <summary>Time taken to inject all scripts by extensions.</summary> </histogram> -<histogram name="Extensions.InjectStart_BlockingScriptCount"> +<histogram name="Extensions.InjectStart_BlockingScriptCount" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary> Number of blocking scripts injected at document start by extensions. </summary> </histogram> -<histogram name="Extensions.InjectStart_CssCount" expires_after="2019-12-31"> +<histogram name="Extensions.InjectStart_CssCount" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary>Number of css files injected by extensions.</summary> </histogram> -<histogram name="Extensions.InjectStart_ScriptCount"> +<histogram name="Extensions.InjectStart_ScriptCount" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary>Number of scripts injected at document start by extensions.</summary> </histogram> @@ -43895,7 +44070,7 @@ </summary> </histogram> -<histogram name="Extensions.LoadAll" expires_after="never"> +<histogram name="Extensions.LoadAll" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -43930,14 +44105,15 @@ </summary> </histogram> -<histogram name="Extensions.LoadApp" expires_after="never"> +<histogram name="Extensions.LoadApp" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> <summary>The number of apps loaded by each user at profile open.</summary> </histogram> -<histogram name="Extensions.LoadAppExternal" expires_after="never"> +<histogram name="Extensions.LoadAppExternal" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -43946,21 +44122,24 @@ </summary> </histogram> -<histogram name="Extensions.LoadAppUser" expires_after="2019-12-31"> +<histogram name="Extensions.LoadAppUser" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of user-installed apps loaded by each user at profile open. </summary> </histogram> -<histogram name="Extensions.LoadBrowserAction" expires_after="2019-12-31"> +<histogram name="Extensions.LoadBrowserAction" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of browser action extensions loaded at profile open. </summary> </histogram> -<histogram name="Extensions.LoadContentPack" expires_after="2015-04-23"> +<histogram name="Extensions.LoadContentPack" units="units" + expires_after="2015-04-23"> <obsolete> Deprecated as of 4/2015. Replaced by ManagedUsers.Whitelist.Count. </obsolete> @@ -43979,14 +44158,15 @@ </summary> </histogram> -<histogram name="Extensions.LoadExtension" expires_after="never"> +<histogram name="Extensions.LoadExtension" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> <summary>The number of extensions loaded at profile open.</summary> </histogram> -<histogram name="Extensions.LoadExtensionExternal" expires_after="never"> +<histogram name="Extensions.LoadExtensionExternal" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -43995,7 +44175,7 @@ </summary> </histogram> -<histogram name="Extensions.LoadExtensionUser"> +<histogram name="Extensions.LoadExtensionUser" units="units"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -44004,7 +44184,7 @@ </summary> </histogram> -<histogram name="Extensions.LoadExternal" expires_after="never"> +<histogram name="Extensions.LoadExternal" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -44013,7 +44193,7 @@ </summary> </histogram> -<histogram name="Extensions.LoadHostedApp" expires_after="never"> +<histogram name="Extensions.LoadHostedApp" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -44022,7 +44202,8 @@ </summary> </histogram> -<histogram name="Extensions.LoadNoExtensionAction" expires_after="2019-12-31"> +<histogram name="Extensions.LoadNoExtensionAction" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of extensions that had neither a page nor browser action @@ -44038,7 +44219,8 @@ </summary> </histogram> -<histogram name="Extensions.LoadPackagedApp" expires_after="never"> +<histogram name="Extensions.LoadPackagedApp" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -44047,14 +44229,15 @@ </summary> </histogram> -<histogram name="Extensions.LoadPlatformApp" expires_after="never"> +<histogram name="Extensions.LoadPlatformApp" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> <summary>The number of platform apps loaded at profile open.</summary> </histogram> -<histogram name="Extensions.LoadTheme"> +<histogram name="Extensions.LoadTheme" units="units"> <owner>rdevlin.cronin@chromium.org</owner> <summary>The number of themes loaded at profile open.</summary> </histogram> @@ -44067,7 +44250,7 @@ </summary> </histogram> -<histogram name="Extensions.LoadUserScript" expires_after="M81"> +<histogram name="Extensions.LoadUserScript" units="units" expires_after="M81"> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of converted user scripts loaded at profile open. @@ -44105,7 +44288,7 @@ </histogram> <histogram name="Extensions.ManifestFetchFailureRetryCountGoogleUrl" - expires_after="M77"> + units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of times chrome retried to download an extension update manifest with @@ -44114,7 +44297,7 @@ </histogram> <histogram name="Extensions.ManifestFetchFailureRetryCountOtherUrl" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of times chrome retried to download an extension update manifest with @@ -44123,7 +44306,7 @@ </histogram> <histogram name="Extensions.ManifestFetchSuccessRetryCountGoogleUrl" - expires_after="M77"> + units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of times chrome retried to download an extension update manifest with @@ -44132,7 +44315,7 @@ </histogram> <histogram name="Extensions.ManifestFetchSuccessRetryCountOtherUrl" - expires_after="M77"> + units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of times chrome retried to download an extension update manifest with @@ -44198,7 +44381,7 @@ </summary> </histogram> -<histogram name="Extensions.ManifestReloadNeedsRelocalization" +<histogram name="Extensions.ManifestReloadNeedsRelocalization" units="units" expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> @@ -44207,7 +44390,8 @@ </summary> </histogram> -<histogram name="Extensions.ManifestReloadNotNeeded" expires_after="2018-08-30"> +<histogram name="Extensions.ManifestReloadNotNeeded" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of extension loads on startup where it is not necessary to reload the @@ -44215,7 +44399,7 @@ </summary> </histogram> -<histogram name="Extensions.ManifestReloadUnpackedDir" +<histogram name="Extensions.ManifestReloadUnpackedDir" units="units" expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> @@ -44224,7 +44408,8 @@ </summary> </histogram> -<histogram name="Extensions.ManifestVersion" expires_after="never"> +<histogram name="Extensions.ManifestVersion" units="units" + expires_after="never"> <!-- expires-never: Monitoring extension usage. --> <owner>rdevlin.cronin@chromium.org</owner> @@ -44340,7 +44525,8 @@ </summary> </histogram> -<histogram name="Extensions.NewTabPageOverrides" expires_after="M85"> +<histogram name="Extensions.NewTabPageOverrides" units="units" + expires_after="M85"> <owner>rdevlin.cronin@chromium.org</owner> <owner>kelvinjiang@chromium.org</owner> <summary> @@ -44360,7 +44546,8 @@ </summary> </histogram> -<histogram name="Extensions.NonWebStoreNewTabPageOverrides" expires_after="M81"> +<histogram name="Extensions.NonWebStoreNewTabPageOverrides" units="units" + expires_after="M81"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Number of non-WebStore extensions on startup that override the new tab page. @@ -44944,7 +45131,7 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackFailure"> +<histogram name="Extensions.SandboxUnpackFailure" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Count the number of times a sandboxed extension unpack fails. @@ -44962,7 +45149,7 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackFailureTime" +<histogram name="Extensions.SandboxUnpackFailureTime" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -44976,14 +45163,14 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackInitialCrxPathLength" +<histogram name="Extensions.SandboxUnpackInitialCrxPathLength" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Length of the initial path to the CRX to be unpacked.</summary> </histogram> -<histogram name="Extensions.SandboxUnpackLinkFreeCrxPathLength" +<histogram name="Extensions.SandboxUnpackLinkFreeCrxPathLength" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -44993,42 +45180,42 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRate"> +<histogram name="Extensions.SandboxUnpackRate" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which a CRX file is unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRate1To2mB"> +<histogram name="Extensions.SandboxUnpackRate1To2mB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files 1MB to 2MB are unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRate2To5mB"> +<histogram name="Extensions.SandboxUnpackRate2To5mB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files 2MB to 5MB are unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRate50kBTo1mB"> +<histogram name="Extensions.SandboxUnpackRate50kBTo1mB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files 50kB to 1MB are unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRate5To10mB"> +<histogram name="Extensions.SandboxUnpackRate5To10mB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files 5MB to 10 MB are unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRateOver10mB"> +<histogram name="Extensions.SandboxUnpackRateOver10mB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files larger than 10MB are unpacked in Kilobytes per @@ -45036,20 +45223,21 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackRateUnder50kB"> +<histogram name="Extensions.SandboxUnpackRateUnder50kB" units="units"> <owner>extensions-core@chromium.org</owner> <summary> Rate at which CRX files under 50 KB are unpacked in Kilobytes per second. </summary> </histogram> -<histogram name="Extensions.SandboxUnpackSuccess" expires_after="2019-12-31"> +<histogram name="Extensions.SandboxUnpackSuccess" units="units" + expires_after="2019-12-31"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Count the number of times a sandboxed CRX unpack succeeds.</summary> </histogram> -<histogram name="Extensions.SandboxUnpackSuccessCantGetCrxSize" +<histogram name="Extensions.SandboxUnpackSuccessCantGetCrxSize" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -45059,12 +45247,12 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackSuccessCrxSize"> +<histogram name="Extensions.SandboxUnpackSuccessCrxSize" units="units"> <owner>extensions-core@chromium.org</owner> <summary>Size of the .crx file, in KB, when the unpack succeeds.</summary> </histogram> -<histogram name="Extensions.SandboxUnpackSuccessTime" +<histogram name="Extensions.SandboxUnpackSuccessTime" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -45073,7 +45261,7 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackTempCrxPathLength" +<histogram name="Extensions.SandboxUnpackTempCrxPathLength" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -45082,14 +45270,15 @@ </summary> </histogram> -<histogram name="Extensions.SandboxUnpackUnpackedCrxPathLength" +<histogram name="Extensions.SandboxUnpackUnpackedCrxPathLength" units="units" expires_after="2018-08-30"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Length of the path under which a CRX is unpacked.</summary> </histogram> -<histogram name="Extensions.SearchEngineOverrides" expires_after="M85"> +<histogram name="Extensions.SearchEngineOverrides" units="units" + expires_after="M85"> <owner>rdevlin.cronin@chromium.org</owner> <owner>kelvinjiang@chromium.org</owner> <summary> @@ -45099,7 +45288,7 @@ </histogram> <histogram name="Extensions.SettingsQuotaExceeded.BytesPerSetting" - expires_after="2016-09-13"> + units="units" expires_after="2016-09-13"> <obsolete> Removed in September, 2016 </obsolete> @@ -45110,7 +45299,7 @@ </summary> </histogram> -<histogram name="Extensions.SettingsQuotaExceeded.KeyCount" +<histogram name="Extensions.SettingsQuotaExceeded.KeyCount" units="units" expires_after="2016-09-13"> <obsolete> Removed in September, 2016 @@ -45122,7 +45311,7 @@ </summary> </histogram> -<histogram name="Extensions.SettingsQuotaExceeded.TotalBytes" +<histogram name="Extensions.SettingsQuotaExceeded.TotalBytes" units="units" expires_after="2016-09-13"> <obsolete> Removed in September, 2016 @@ -45182,7 +45371,8 @@ </summary> </histogram> -<histogram name="Extensions.StartupPagesOverrides" expires_after="M85"> +<histogram name="Extensions.StartupPagesOverrides" units="units" + expires_after="M85"> <owner>rdevlin.cronin@chromium.org</owner> <owner>kelvinjiang@chromium.org</owner> <summary> @@ -45372,7 +45562,8 @@ </summary> </histogram> -<histogram name="Extensions.UpdateCheckApp" expires_after="2018-08-30"> +<histogram name="Extensions.UpdateCheckApp" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of legacy packaged apps and hosted apps that were checked during @@ -45380,7 +45571,8 @@ </summary> </histogram> -<histogram name="Extensions.UpdateCheckExtension" expires_after="M77"> +<histogram name="Extensions.UpdateCheckExtension" units="units" + expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of extensions that were checked during an update check. @@ -45396,7 +45588,8 @@ <summary>Time in minutes between update checks.</summary> </histogram> -<histogram name="Extensions.UpdateCheckGoogleUrl" expires_after="M77"> +<histogram name="Extensions.UpdateCheckGoogleUrl" units="units" + expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of crx's with a Google-hosted update URL that were checked during @@ -45404,14 +45597,15 @@ </summary> </histogram> -<histogram name="Extensions.UpdateCheckNoUrl" expires_after="M77"> +<histogram name="Extensions.UpdateCheckNoUrl" units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of crx's with no update URL checked during an update check. </summary> </histogram> -<histogram name="Extensions.UpdateCheckOtherUrl" expires_after="M77"> +<histogram name="Extensions.UpdateCheckOtherUrl" units="units" + expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of crx's with a non-Google update URL that were checked during an @@ -45419,14 +45613,16 @@ </summary> </histogram> -<histogram name="Extensions.UpdateCheckPackagedApp" expires_after="2018-08-30"> +<histogram name="Extensions.UpdateCheckPackagedApp" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of packaged apps that were checked during an update check. </summary> </histogram> -<histogram name="Extensions.UpdateCheckTheme" expires_after="2018-08-30"> +<histogram name="Extensions.UpdateCheckTheme" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of themes that were checked during an update check. @@ -45466,7 +45662,7 @@ </summary> </histogram> -<histogram name="Extensions.UpdateOnLoad"> +<histogram name="Extensions.UpdateOnLoad" units="units"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> The number of extensions that were updated at browser startup. @@ -45813,7 +46009,7 @@ </histogram> <histogram base="true" name="Extensions.WebRequest.WS_RequestHeaders" - expires_after="2019-01-09"> + units="units" expires_after="2019-01-09"> <obsolete> Removed as of Jan 2019. </obsolete> @@ -46003,7 +46199,7 @@ </summary> </histogram> -<histogram name="ExtensionToolbarModel.BrowserActionsCount" +<histogram name="ExtensionToolbarModel.BrowserActionsCount" units="units" expires_after="2019-12-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -46014,7 +46210,8 @@ </summary> </histogram> -<histogram name="ExtensionToolbarModel.BrowserActionsPermanentlyHidden"> +<histogram name="ExtensionToolbarModel.BrowserActionsPermanentlyHidden" + units="units"> <obsolete> Stopped recording 2019-07. </obsolete> @@ -46026,7 +46223,7 @@ </summary> </histogram> -<histogram name="ExtensionToolbarModel.BrowserActionsVisible" +<histogram name="ExtensionToolbarModel.BrowserActionsVisible" units="units" expires_after="2019-12-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -46059,7 +46256,8 @@ </summary> </histogram> -<histogram name="ExtensionUrlRequest.OnReadCompleteResult" expires_after="M77"> +<histogram name="ExtensionUrlRequest.OnReadCompleteResult" units="units" + expires_after="M77"> <obsolete> Removed at 07/2019 because refactored DataPipeProducer does not provide the reported value, and this metric was already broken, reporting always 0. @@ -46073,7 +46271,8 @@ </summary> </histogram> -<histogram name="ExtensionUrlRequest.SeekPosition" expires_after="2019-11-30"> +<histogram name="ExtensionUrlRequest.SeekPosition" units="units" + expires_after="2019-11-30"> <owner>lazyboy@chromium.org</owner> <summary> When fetching a chrome-extension:// URL, this indicates the first byte @@ -46114,7 +46313,8 @@ </summary> </histogram> -<histogram name="Favicon.OnDemandIconExistsInDb" expires_after="2020-07-19"> +<histogram name="Favicon.OnDemandIconExistsInDb" units="units" + expires_after="2020-07-19"> <owner>victorvianna@google.com</owner> <owner>jkrcal@chromium.org</owner> <summary> @@ -46124,7 +46324,8 @@ </summary> </histogram> -<histogram name="Favicons.CandidatesCount" expires_after="2017-12-20"> +<histogram name="Favicons.CandidatesCount" units="units" + expires_after="2017-12-20"> <obsolete> Deprecated as of 12/2017. </obsolete> @@ -46135,7 +46336,7 @@ </summary> </histogram> -<histogram name="Favicons.CandidatesWithDefinedSizesCount" +<histogram name="Favicons.CandidatesWithDefinedSizesCount" units="units" expires_after="2017-12-20"> <obsolete> Deprecated as of 12/2017. @@ -46147,7 +46348,7 @@ </summary> </histogram> -<histogram name="Favicons.CandidatesWithTouchIconsCount" +<histogram name="Favicons.CandidatesWithTouchIconsCount" units="units" expires_after="2017-12-20"> <obsolete> Deprecated as of 12/2017. @@ -46484,7 +46685,7 @@ </summary> </histogram> -<histogram name="FileBrowser.DownloadsCount" expires_after="M89"> +<histogram name="FileBrowser.DownloadsCount" units="units" expires_after="M89"> <owner>slangley@chromium.org</owner> <owner>weifangsun@chromium.org</owner> <summary> @@ -46524,7 +46725,8 @@ </summary> </histogram> -<histogram name="FileBrowser.FolderShortcut.Add" expires_after="M89"> +<histogram name="FileBrowser.FolderShortcut.Add" units="units" + expires_after="M89"> <owner>slangley@chromium.org</owner> <owner>weifangsun@chromium.org</owner> <summary> @@ -46533,7 +46735,8 @@ </summary> </histogram> -<histogram name="FileBrowser.FolderShortcut.Count" expires_after="M89"> +<histogram name="FileBrowser.FolderShortcut.Count" units="units" + expires_after="M89"> <owner>slangley@chromium.org</owner> <owner>weifangsun@chromium.org</owner> <summary> @@ -46542,7 +46745,8 @@ </summary> </histogram> -<histogram name="FileBrowser.FolderShortcut.Navigate" expires_after="M89"> +<histogram name="FileBrowser.FolderShortcut.Navigate" units="units" + expires_after="M89"> <owner>slangley@chromium.org</owner> <owner>weifangsun@chromium.org</owner> <summary> @@ -46551,7 +46755,8 @@ </summary> </histogram> -<histogram name="FileBrowser.FolderShortcut.Remove" expires_after="M89"> +<histogram name="FileBrowser.FolderShortcut.Remove" units="units" + expires_after="M89"> <owner>slangley@chromium.org</owner> <owner>weifangsun@chromium.org</owner> <summary> @@ -46884,7 +47089,7 @@ </summary> </histogram> -<histogram name="FileBrowser.PhotoImport.ImportCount" +<histogram name="FileBrowser.PhotoImport.ImportCount" units="units" expires_after="2018-11-14"> <obsolete> Code seems to have been removed at an unknown time. @@ -47258,7 +47463,8 @@ </summary> </histogram> -<histogram name="FileSystem.PersistentOriginsCount" expires_after="2018-08-30"> +<histogram name="FileSystem.PersistentOriginsCount" units="units" + expires_after="2018-08-30"> <owner>tzik@chromium.org</owner> <summary> Number of origins that have persistent filesystem. Measured when the Quota @@ -47268,7 +47474,8 @@ </summary> </histogram> -<histogram name="FileSystem.TemporaryOriginsCount" expires_after="2018-08-30"> +<histogram name="FileSystem.TemporaryOriginsCount" units="units" + expires_after="2018-08-30"> <owner>tzik@chromium.org</owner> <summary> Number of origins that have temporary filesystem. Measured when the Quota @@ -47843,7 +48050,8 @@ <summary>Result of a message received by the GcmReceiver on Android.</summary> </histogram> -<histogram name="GCM.APICallUnregister" expires_after="2018-08-30"> +<histogram name="GCM.APICallUnregister" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -47870,7 +48078,8 @@ <summary>Status code of the outcome of a GCM checkin request.</summary> </histogram> -<histogram name="GCM.CheckinRetryCount" expires_after="2018-08-30"> +<histogram name="GCM.CheckinRetryCount" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -48131,7 +48340,7 @@ </summary> </histogram> -<histogram name="GCM.NumThrottledApps"> +<histogram name="GCM.NumThrottledApps" units="units"> <owner>zea@chromium.org</owner> <summary> Number of applications hitting GCM per-app outstanding message limits at @@ -48139,7 +48348,7 @@ </summary> </histogram> -<histogram name="GCM.NumUsers" expires_after="2014-03-21"> +<histogram name="GCM.NumUsers" units="units" expires_after="2014-03-21"> <obsolete> Deprecated as of 3/2014. </obsolete> @@ -48231,7 +48440,8 @@ </summary> </histogram> -<histogram name="GCM.RegistrationRetryCount" expires_after="2018-08-30"> +<histogram name="GCM.RegistrationRetryCount" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -48239,7 +48449,7 @@ <summary>Number of retries before a GCM registration succeeds.</summary> </histogram> -<histogram name="GCM.RegistrationSenderIdCount"> +<histogram name="GCM.RegistrationSenderIdCount" units="units"> <owner>jianli@chromium.org</owner> <summary>Number of sender IDs specified in a registration request.</summary> </histogram> @@ -48262,7 +48472,8 @@ </summary> </histogram> -<histogram name="GCM.RestoredIncomingMessages" expires_after="2018-08-30"> +<histogram name="GCM.RestoredIncomingMessages" units="units" + expires_after="2018-08-30"> <owner>zea@chromium.org</owner> <summary> Number of unacknowledged incoming messages restored from the persistent @@ -48270,7 +48481,8 @@ </summary> </histogram> -<histogram name="GCM.RestoredOutgoingMessages" expires_after="2018-08-30"> +<histogram name="GCM.RestoredOutgoingMessages" units="units" + expires_after="2018-08-30"> <owner>zea@chromium.org</owner> <summary> Number of pending outgoing messages restored from the persistent store at @@ -48278,7 +48490,8 @@ </summary> </histogram> -<histogram name="GCM.RestoredRegistrations" expires_after="2018-08-30"> +<histogram name="GCM.RestoredRegistrations" units="units" + expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> Number of registrations restored from the persistent store at startup. @@ -48295,7 +48508,8 @@ </summary> </histogram> -<histogram name="GCM.SendWebPushMessagePayloadSize" expires_after="2020-02-02"> +<histogram name="GCM.SendWebPushMessagePayloadSize" units="units" + expires_after="2020-02-02"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -48374,7 +48588,8 @@ <summary>Status code of the outcome of a GCM unregistration request.</summary> </histogram> -<histogram name="GCM.UnregistrationRetryCount" expires_after="2018-08-30"> +<histogram name="GCM.UnregistrationRetryCount" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -48457,7 +48672,8 @@ </summary> </histogram> -<histogram name="GData.NumberOfHostedDocuments" expires_after="2013-04-25"> +<histogram name="GData.NumberOfHostedDocuments" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 9/2012, and replaced by Drive.NumberOfHostedDocuments </obsolete> @@ -48468,7 +48684,8 @@ </summary> </histogram> -<histogram name="GData.NumberOfRegularFiles" expires_after="2013-04-25"> +<histogram name="GData.NumberOfRegularFiles" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 9/2012, and replaced by Drive.NumberOfRegularFiles </obsolete> @@ -48478,7 +48695,8 @@ </summary> </histogram> -<histogram name="GData.NumberOfTotalFiles" expires_after="2013-04-25"> +<histogram name="GData.NumberOfTotalFiles" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 9/2012, and replaced by Drive.NumberOfTotalFiles </obsolete> @@ -48586,7 +48804,7 @@ <summary>Error code for the geoposition sent to the renderers.</summary> </histogram> -<histogram name="Geolocation.NetworkLocationRequest.AccessPoints"> +<histogram name="Geolocation.NetworkLocationRequest.AccessPoints" units="units"> <owner>mattreynolds@chromium.org</owner> <owner>device-dev@chromium.org</owner> <summary> @@ -48664,7 +48882,7 @@ </summary> </histogram> -<histogram name="Geolocation.Timeout"> +<histogram name="Geolocation.Timeout" units="units"> <owner>mattreynolds@chromium.org</owner> <owner>deviceapi-team@google.com</owner> <summary> @@ -48674,7 +48892,8 @@ </summary> </histogram> -<histogram name="Geolocation.TimeoutExpired" expires_after="2020-02-01"> +<histogram name="Geolocation.TimeoutExpired" units="units" + expires_after="2020-02-01"> <owner>mattreynolds@chromium.org</owner> <owner>deviceapi-team@google.com</owner> <summary> @@ -48814,7 +49033,8 @@ </summary> </histogram> -<histogram name="GestureNavigation.Sheet.Selected" expires_after="2020-01-23"> +<histogram name="GestureNavigation.Sheet.Selected" units="units" + expires_after="2020-01-23"> <owner>jinsukkim@chromium.org</owner> <owner>chrome-android-app@chromium.org</owner> <summary> @@ -49061,7 +49281,7 @@ </summary> </histogram> -<histogram name="GoogleUpdate.InstallDetails.UpdateCohort" +<histogram name="GoogleUpdate.InstallDetails.UpdateCohort" units="units" expires_after="2019-06-01"> <owner>nikunjb@chromium.org</owner> <owner>chrome-metrics-team@google.com</owner> @@ -49157,7 +49377,7 @@ </summary> </histogram> -<histogram name="GoogleUpdate.UnexpectedState"> +<histogram name="GoogleUpdate.UnexpectedState" units="units"> <owner>grt@chromium.org</owner> <summary> An unrecognized CurrentState value received from Google Update while polling @@ -49424,7 +49644,7 @@ </summary> </histogram> -<histogram name="GPU.AtExitSurfaceCount" expires_after="M77"> +<histogram name="GPU.AtExitSurfaceCount" units="units" expires_after="M77"> <owner>vmiura@chromium.org</owner> <summary> The number of surfaces that the GPU process was rendering to right before @@ -49433,7 +49653,8 @@ </summary> </histogram> -<histogram name="GPU.AtExitWindowCount" expires_after="2018-11-02"> +<histogram name="GPU.AtExitWindowCount" units="units" + expires_after="2018-11-02"> <obsolete> Removed sometime around M55. </obsolete> @@ -50342,7 +50563,8 @@ </summary> </histogram> -<histogram name="Gpu.MetalProxy.NewLibraryAttempt" expires_after="M80"> +<histogram name="Gpu.MetalProxy.NewLibraryAttempt" units="units" + expires_after="M80"> <owner>ccameron@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary> @@ -50363,7 +50585,7 @@ </summary> </histogram> -<histogram name="Gpu.MetalProxy.NewRenderPipelineStateAttempt" +<histogram name="Gpu.MetalProxy.NewRenderPipelineStateAttempt" units="units" expires_after="M80"> <owner>ccameron@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> @@ -50729,7 +50951,8 @@ </summary> </histogram> -<histogram name="GPU.SurfaceCountAtExit" expires_after="2017-05-25"> +<histogram name="GPU.SurfaceCountAtExit" units="units" + expires_after="2017-05-25"> <obsolete> Deprecated 12/2012. Moved to GPU.AtExitSurfaceCount. </obsolete> @@ -50869,7 +51092,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.GamingScore"> +<histogram name="GPU.WinSAT.GamingScore" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) gaming graphics score. It is in @@ -50879,7 +51102,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.GamingScore2"> +<histogram name="GPU.WinSAT.GamingScore2" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) gaming graphics score, scaled by @@ -50889,7 +51112,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.GraphicsScore"> +<histogram name="GPU.WinSAT.GraphicsScore" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) graphics score. It is in the @@ -50898,7 +51121,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.GraphicsScore2"> +<histogram name="GPU.WinSAT.GraphicsScore2" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) graphics score, scaled by 10x. @@ -50916,7 +51139,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.OverallScore"> +<histogram name="GPU.WinSAT.OverallScore" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) overall system score. This is @@ -50926,7 +51149,7 @@ </summary> </histogram> -<histogram name="GPU.WinSAT.OverallScore2"> +<histogram name="GPU.WinSAT.OverallScore2" units="units"> <owner>vmiura@chromium.org</owner> <summary> The WinSAT (Windows System Assessment Tool) overall system score, scaled by @@ -51127,7 +51350,7 @@ </summary> </histogram> -<histogram name="Hardware.Display.Count.OnChange"> +<histogram name="Hardware.Display.Count.OnChange" units="units"> <owner>erikchen@chromium.org</owner> <summary> The number of displays present right after the user has attached or detached @@ -51135,7 +51358,7 @@ </summary> </histogram> -<histogram name="Hardware.Display.Count.OnStartup"> +<histogram name="Hardware.Display.Count.OnStartup" units="units"> <owner>erikchen@chromium.org</owner> <summary> The number of displays present at start up. Excludes mirrored displays, but @@ -51175,7 +51398,7 @@ </summary> </histogram> -<histogram name="Hardware.Serial.NewMinusOldDeviceListSize"> +<histogram name="Hardware.Serial.NewMinusOldDeviceListSize" units="units"> <owner>charliea@chromium.org</owner> <summary> On Windows and Mac, we're implementing new methods to enumerate serial @@ -51285,7 +51508,8 @@ </summary> </histogram> -<histogram name="HIDDetection.OOBEDialogShown" expires_after="M87"> +<histogram name="HIDDetection.OOBEDialogShown" units="units" + expires_after="M87"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -51294,7 +51518,7 @@ </summary> </histogram> -<histogram name="HIDDetection.TimesDialogShownPerOOBECompleted" +<histogram name="HIDDetection.TimesDialogShownPerOOBECompleted" units="units" expires_after="M97"> <owner>rsorokin@chromium.org</owner> <owner>alemate@chromium.org</owner> @@ -51418,7 +51642,8 @@ </summary> </histogram> -<histogram name="Histogram.InconsistentCountHigh" expires_after="2017-07-25"> +<histogram name="Histogram.InconsistentCountHigh" units="units" + expires_after="2017-07-25"> <obsolete> Deprecated 7/2017. </obsolete> @@ -51429,7 +51654,8 @@ </summary> </histogram> -<histogram name="Histogram.InconsistentCountLow" expires_after="2017-07-25"> +<histogram name="Histogram.InconsistentCountLow" units="units" + expires_after="2017-07-25"> <obsolete> Deprecated 7/2017. </obsolete> @@ -51440,7 +51666,7 @@ </summary> </histogram> -<histogram name="Histogram.InconsistentSnapshotBrowser"> +<histogram name="Histogram.InconsistentSnapshotBrowser" units="units"> <owner>asvitkine@chromium.org</owner> <summary> The amount of discrepancy found when examining a single histogram's data in @@ -51449,7 +51675,7 @@ </summary> </histogram> -<histogram name="Histogram.InconsistentSnapshotChildProcess"> +<histogram name="Histogram.InconsistentSnapshotChildProcess" units="units"> <owner>asvitkine@chromium.org</owner> <summary> The amount of discrepancy found when examining a single histogram's data in @@ -51458,7 +51684,7 @@ </summary> </histogram> -<histogram name="Histogram.InconsistentSnapshotRenderer" +<histogram name="Histogram.InconsistentSnapshotRenderer" units="units" expires_after="2014-08-12"> <obsolete> Deprecated 7/2012. @@ -51503,7 +51729,8 @@ </summary> </histogram> -<histogram name="History.AttemptedToFixProfileError" expires_after="M77"> +<histogram name="History.AttemptedToFixProfileError" units="units" + expires_after="M77"> <owner>sky@chromium.org</owner> <owner>sdefresne@chromium.org</owner> <summary> @@ -51570,7 +51797,7 @@ </histogram> <histogram name="History.ClearBrowsingData.ImportantDeselectedNum" - expires_after="M81"> + units="units" expires_after="M81"> <owner>dmurph@chromium.org</owner> <summary> Recorded when the user presses the 'clear' button when presented with the @@ -51601,7 +51828,7 @@ </summary> </histogram> -<histogram name="History.ClearBrowsingData.NumImportant" +<histogram name="History.ClearBrowsingData.NumImportant" units="units" expires_after="2020-03-01"> <owner>dmurph@chromium.org</owner> <summary> @@ -51612,7 +51839,8 @@ </histogram> <histogram - name="History.ClearBrowsingData.PasswordsDeletion.AdditionalDatatypesCount"> + name="History.ClearBrowsingData.PasswordsDeletion.AdditionalDatatypesCount" + units="units"> <owner>msramek@chromium.org</owner> <summary> Recorded when the user deletes their passwords in the ClearBrowsingData @@ -51639,7 +51867,7 @@ </summary> </histogram> -<histogram name="History.ClearBrowsingData.TaskQueueAtShutdown" +<histogram name="History.ClearBrowsingData.TaskQueueAtShutdown" units="units" expires_after="2020-01-20"> <owner>dullweber@chromium.org</owner> <owner>msramek@chromium.org</owner> @@ -51725,7 +51953,8 @@ </summary> </histogram> -<histogram name="History.DeleteFTSIndexDatabases" expires_after="2018-08-30"> +<histogram name="History.DeleteFTSIndexDatabases" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Count of "History Index *" databases deleted. These databases @@ -51786,7 +52015,7 @@ </summary> </histogram> -<histogram name="History.FaviconsRecoveredRowsFaviconBitmaps" +<histogram name="History.FaviconsRecoveredRowsFaviconBitmaps" units="units" expires_after="2017-04-12"> <obsolete> No longer tracked as of March 2017. @@ -51797,7 +52026,7 @@ </summary> </histogram> -<histogram name="History.FaviconsRecoveredRowsFavicons" +<histogram name="History.FaviconsRecoveredRowsFavicons" units="units" expires_after="2017-04-12"> <obsolete> No longer tracked as of March 2017. @@ -51806,7 +52035,7 @@ <summary>Rows recovered from [favicons] table in Favicons recovery.</summary> </histogram> -<histogram name="History.FaviconsRecoveredRowsIconMapping" +<histogram name="History.FaviconsRecoveredRowsIconMapping" units="units" expires_after="2017-04-12"> <obsolete> No longer tracked as of March 2017. @@ -51828,7 +52057,8 @@ </summary> </histogram> -<histogram name="History.FirstSetTopSitesDeltaSize" expires_after="M77"> +<histogram name="History.FirstSetTopSitesDeltaSize" units="units" + expires_after="M77"> <owner>yiyaoliu@chromium.org</owner> <summary> The count of differences between cached top sites and up-to-date top sites @@ -51875,7 +52105,8 @@ </summary> </histogram> -<histogram name="History.InMemoryDBItemCount" expires_after="2020-02-16"> +<histogram name="History.InMemoryDBItemCount" units="units" + expires_after="2020-02-16"> <owner>sky@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -51887,7 +52118,7 @@ </summary> </histogram> -<histogram name="History.InMemoryDBKeywordTermsCount" +<histogram name="History.InMemoryDBKeywordTermsCount" units="units" expires_after="2020-02-16"> <owner>sky@chromium.org</owner> <owner>mpearson@chromium.org</owner> @@ -51908,7 +52139,7 @@ </summary> </histogram> -<histogram name="History.InMemoryDBKeywordURLItemCount" +<histogram name="History.InMemoryDBKeywordURLItemCount" units="units" expires_after="2020-02-16"> <owner>sky@chromium.org</owner> <owner>mpearson@chromium.org</owner> @@ -51927,7 +52158,8 @@ </summary> </histogram> -<histogram name="History.InMemoryDBPopulate" expires_after="2020-02-16"> +<histogram name="History.InMemoryDBPopulate" units="units" + expires_after="2020-02-16"> <owner>sky@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -51939,7 +52171,8 @@ </summary> </histogram> -<histogram name="History.InMemoryTypedUrlVisitCount" expires_after="2020-02-02"> +<histogram name="History.InMemoryTypedUrlVisitCount" units="units" + expires_after="2020-02-02"> <obsolete> No longer needed. Removed Aug 2019 as part of crbug.com/969934 cleanup. </obsolete> @@ -51962,7 +52195,7 @@ </summary> </histogram> -<histogram name="History.InMemoryURLChars" expires_after="M86"> +<histogram name="History.InMemoryURLChars" units="units" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of items in the in-memory url index char_word_map_. Recorded on @@ -51971,7 +52204,8 @@ </summary> </histogram> -<histogram name="History.InMemoryURLHistoryItems" expires_after="M86"> +<histogram name="History.InMemoryURLHistoryItems" units="units" + expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of history items in the in-memory url index. Recorded on profile open @@ -52011,7 +52245,7 @@ </summary> </histogram> -<histogram name="History.InMemoryURLWords" expires_after="M86"> +<histogram name="History.InMemoryURLWords" units="units" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary> Number of items in in-memory url index word_map_. Recorded on profile open @@ -52020,7 +52254,8 @@ </summary> </histogram> -<histogram name="History.MigrateFailureFromVersion" expires_after="M77"> +<histogram name="History.MigrateFailureFromVersion" units="units" + expires_after="M77"> <owner>sky@chromium.org</owner> <owner>sdefresne@chromium.org</owner> <summary> @@ -52060,7 +52295,8 @@ </summary> </histogram> -<histogram name="History.NumFaviconBitmapsInDB" expires_after="M77"> +<histogram name="History.NumFaviconBitmapsInDB" units="units" + expires_after="M77"> <owner>rogerm@chromium.org</owner> <summary> The total number of favicon bitmaps (of all sizes) cached in a user's @@ -52070,7 +52306,8 @@ </summary> </histogram> -<histogram name="History.NumFaviconMappingsInDB" expires_after="M77"> +<histogram name="History.NumFaviconMappingsInDB" units="units" + expires_after="M77"> <owner>rogerm@chromium.org</owner> <summary> The number of page URL (e.g., http://www.google.com) to favicon URL (e.g., @@ -52079,7 +52316,7 @@ </summary> </histogram> -<histogram name="History.NumFaviconsInDB" expires_after="M77"> +<histogram name="History.NumFaviconsInDB" units="units" expires_after="M77"> <owner>rogerm@chromium.org</owner> <summary> The total number of favicon URLs (e.g. http://www.google.com/favicon.ico) @@ -52090,7 +52327,8 @@ </summary> </histogram> -<histogram name="History.NumLargeFaviconBitmapsInDB" expires_after="M77"> +<histogram name="History.NumLargeFaviconBitmapsInDB" units="units" + expires_after="M77"> <owner>rogerm@chromium.org</owner> <summary> The total number of large (>= 64 pixels wide) favicons being tracked in a @@ -52100,7 +52338,7 @@ </summary> </histogram> -<histogram name="History.NumTouchIconsInDB"> +<histogram name="History.NumTouchIconsInDB" units="units"> <owner>rogerm@chromium.org</owner> <summary> The total number of touch icons being tracked in a user's Favicon database. @@ -52168,7 +52406,7 @@ </summary> </histogram> -<histogram name="History.TopSitesRecoveredRowsThumbnails"> +<histogram name="History.TopSitesRecoveredRowsThumbnails" units="units"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Rows recovered from [thumbnails] table in TopSites recovery. @@ -52214,7 +52452,7 @@ </summary> </histogram> -<histogram name="History.URLTableCount" expires_after="M77"> +<histogram name="History.URLTableCount" units="units" expires_after="M77"> <owner>sbirch@google.com</owner> <summary> Number of rows in urls table in History DB. Metrics are logged on @@ -52222,7 +52460,7 @@ </summary> </histogram> -<histogram name="History.VisitTableCount" expires_after="M77"> +<histogram name="History.VisitTableCount" units="units" expires_after="M77"> <owner>sbirch@google.com</owner> <summary> Number of rows in visits table in History DB. Metrics are logged on @@ -52230,7 +52468,8 @@ </summary> </histogram> -<histogram name="History.WeeklyHostCount" expires_after="2020-02-16"> +<histogram name="History.WeeklyHostCount" units="units" + expires_after="2020-02-16"> <owner>sbirch@google.com</owner> <summary> Unique hostnames in History database urls table with last-visit times in the @@ -52239,7 +52478,8 @@ </summary> </histogram> -<histogram name="History.WeeklyURLCount" expires_after="2020-03-01"> +<histogram name="History.WeeklyURLCount" units="units" + expires_after="2020-03-01"> <owner>sbirch@google.com</owner> <summary> Unique URLs in History database urls table with last-visit times in the last @@ -52248,7 +52488,7 @@ </summary> </histogram> -<histogram name="History.WeeklyVisitCount" expires_after="M77"> +<histogram name="History.WeeklyVisitCount" units="units" expires_after="M77"> <owner>sbirch@google.com</owner> <summary> Number of rows in History visits table with visit times in the last 7 days. @@ -52256,7 +52496,8 @@ </summary> </histogram> -<histogram name="HistoryPage.ClickAgeInDays" expires_after="2020-02-29"> +<histogram name="HistoryPage.ClickAgeInDays" units="units" + expires_after="2020-02-29"> <owner>msramek@chromium.org</owner> <owner>dullweber@chromium.org</owner> <summary> @@ -52266,7 +52507,8 @@ </summary> </histogram> -<histogram name="HistoryPage.ClickAgeInDaysSubset" expires_after="2020-02-29"> +<histogram name="HistoryPage.ClickAgeInDaysSubset" units="units" + expires_after="2020-02-29"> <owner>msramek@chromium.org</owner> <owner>dullweber@chromium.org</owner> <summary> @@ -52275,7 +52517,8 @@ </summary> </histogram> -<histogram name="HistoryPage.ClickPosition" expires_after="2020-02-23"> +<histogram name="HistoryPage.ClickPosition" units="units" + expires_after="2020-02-23"> <owner>rpop@google.com</owner> <summary> Number of entries that the clicked entry is older than in History page. Last @@ -52283,7 +52526,7 @@ </summary> </histogram> -<histogram name="HistoryPage.ClickPositionSubset"> +<histogram name="HistoryPage.ClickPositionSubset" units="units"> <owner>rpop@google.com</owner> <summary> Subset of the Click Position histogram. Contains only the first smaller @@ -52310,7 +52553,7 @@ </histogram> <histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TabsPerWindow" - expires_after="M80"> + units="units" expires_after="M80"> <owner>dbeam@chromium.org</owner> <summary> The number of tabs created in each window when a user executes "Open @@ -52319,7 +52562,7 @@ </summary> </histogram> -<histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TotalTabs" +<histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TotalTabs" units="units" expires_after="M80"> <owner>dbeam@chromium.org</owner> <summary> @@ -52330,7 +52573,7 @@ </histogram> <histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TotalWindows" - expires_after="M80"> + units="units" expires_after="M80"> <owner>dbeam@chromium.org</owner> <summary> Total number of windows opened when a user executes "Open all" @@ -52339,7 +52582,7 @@ </summary> </histogram> -<histogram name="HistoryPage.RemoveEntryPosition"> +<histogram name="HistoryPage.RemoveEntryPosition" units="units"> <owner>rpop@google.com</owner> <summary> Number of entries that the deleted entry is older than in History page. Last @@ -52348,7 +52591,7 @@ </summary> </histogram> -<histogram name="HistoryPage.RemoveEntryPositionSubset"> +<histogram name="HistoryPage.RemoveEntryPositionSubset" units="units"> <owner>rpop@google.com</owner> <summary> Subset of Remove Entry Position histogram. Contains only the first smaller @@ -52656,7 +52899,7 @@ </histogram> <histogram name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed" - expires_after="M77"> + units="units" expires_after="M77"> <obsolete> Removed in M77. One day Android results: 25.00% 1033 50.00% 4945 75.00% 42023 95.00% Infinity @@ -53111,7 +53354,8 @@ </summary> </histogram> -<histogram name="Import.NumberOfImportedPasswords.Firefox" expires_after="M82"> +<histogram name="Import.NumberOfImportedPasswords.Firefox" units="units" + expires_after="M82"> <owner>vasilii@chromium.org</owner> <owner>hurims@gmail.com</owner> <summary> @@ -53505,7 +53749,7 @@ </summary> </histogram> -<histogram name="InputMethod.ActiveCount"> +<histogram name="InputMethod.ActiveCount" units="units"> <owner>shuchen@chromium.org</owner> <summary> The number of active input methods. Recorded when the user logs in to Chrome @@ -53530,7 +53774,8 @@ </summary> </histogram> -<histogram name="InputMethod.Commit.Index" expires_after="2020-04-01"> +<histogram name="InputMethod.Commit.Index" units="units" + expires_after="2020-04-01"> <owner>essential-inputs-team@google.com</owner> <summary> The suggestion index (1-based) of the suggestion list item which user @@ -53556,7 +53801,7 @@ </summary> </histogram> -<histogram name="InputMethod.CommitLength"> +<histogram name="InputMethod.CommitLength" units="units"> <owner>shuchen@chromium.org</owner> <summary>The number of characters committed with composition text.</summary> </histogram> @@ -53668,7 +53913,8 @@ </summary> </histogram> -<histogram name="InputMethod.PkCommit.Index" expires_after="2020-04-01"> +<histogram name="InputMethod.PkCommit.Index" units="units" + expires_after="2020-04-01"> <owner>essential-inputs-team@google.com</owner> <summary> The suggestion index (1-based) of the suggestion list item which user @@ -53690,7 +53936,7 @@ <summary>The result of registering proxy view to InputMethodManager.</summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.BackspaceCount"> +<histogram name="InputMethod.VirtualKeyboard.BackspaceCount" units="units"> <owner>essential-inputs-team@google.com</owner> <summary> The number of times the backspace key was pressed on the virtual keyboard, @@ -53719,7 +53965,8 @@ </summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.CharactersBetweenBackspaces"> +<histogram name="InputMethod.VirtualKeyboard.CharactersBetweenBackspaces" + units="units"> <owner>essential-inputs-team@google.com</owner> <summary> Counts the length of text typed by the virtual keyboard between each @@ -53728,7 +53975,7 @@ </summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.CharactersCommitted"> +<histogram name="InputMethod.VirtualKeyboard.CharactersCommitted" units="units"> <owner>essential-inputs-team@google.com</owner> <summary> The total number of characters committed. Recorded when the virtual keyboard @@ -53795,7 +54042,7 @@ </summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.LayoutSwitch"> +<histogram name="InputMethod.VirtualKeyboard.LayoutSwitch" units="units"> <owner>essential-inputs-team@google.com</owner> <summary> The count of layout switching actions while virtual keyboard is alive. @@ -53823,7 +54070,7 @@ </summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.TapCount"> +<histogram name="InputMethod.VirtualKeyboard.TapCount" units="units"> <owner>essential-inputs-team@google.com</owner> <summary> The number of times the virtual keyboard was tapped while the virtual @@ -53843,7 +54090,7 @@ </summary> </histogram> -<histogram name="InputMethod.VirtualKeyboard.WordsPerMinute"> +<histogram name="InputMethod.VirtualKeyboard.WordsPerMinute" units="units"> <owner>essential-inputs-team@google.com</owner> <summary> The number of words typed per minute. Recorded when the virtual keyboard is @@ -54095,7 +54342,8 @@ </summary> </histogram> -<histogram name="InstallSigner.InvalidCount" expires_after="2015-04-23"> +<histogram name="InstallSigner.InvalidCount" units="units" + expires_after="2015-04-23"> <obsolete> Deprecated 4/2015. It appears the code at some point changed to use the histogram name 'ExtensionInstallSigner.InvalidCount' and we forgot to update @@ -54108,7 +54356,8 @@ </summary> </histogram> -<histogram name="InstallSigner.InvalidSignature" expires_after="2014-01-15"> +<histogram name="InstallSigner.InvalidSignature" units="units" + expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by ExtensionInstallSigner.ResultWasValid. @@ -54120,7 +54369,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.CallbackInvalidSignature" +<histogram name="InstallVerifier.CallbackInvalidSignature" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54133,7 +54382,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.CallbackNoSignature" +<histogram name="InstallVerifier.CallbackNoSignature" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54147,7 +54396,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.CallbackValidSignature" +<histogram name="InstallVerifier.CallbackValidSignature" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54160,7 +54409,8 @@ </summary> </histogram> -<histogram name="InstallVerifier.InitGoodSignature" expires_after="2014-01-15"> +<histogram name="InstallVerifier.InitGoodSignature" units="units" + expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by ExtensionInstallVerifier.InitResult. @@ -54172,7 +54422,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.InitInvalidSignature" +<histogram name="InstallVerifier.InitInvalidSignature" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54187,7 +54437,8 @@ </summary> </histogram> -<histogram name="InstallVerifier.InitNoSignature" expires_after="2014-01-15"> +<histogram name="InstallVerifier.InitNoSignature" units="units" + expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by ExtensionInstallVerifier.InitResult. @@ -54199,7 +54450,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.InitUnparseablePref" +<histogram name="InstallVerifier.InitUnparseablePref" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54212,7 +54463,7 @@ </summary> </histogram> -<histogram name="InstallVerifier.SignatureFailedButNotEnforcing" +<histogram name="InstallVerifier.SignatureFailedButNotEnforcing" units="units" expires_after="2014-01-15"> <obsolete> Deprecated 1/2014 (crbug.com/333934). Replaced by @@ -54244,7 +54495,8 @@ <summary>Status code of the outcome of DeleteToken request.</summary> </histogram> -<histogram name="InstanceID.DeleteToken.RetryCount" expires_after="2018-08-30"> +<histogram name="InstanceID.DeleteToken.RetryCount" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -54289,7 +54541,8 @@ <summary>Status code of the outcome of GetToken request.</summary> </histogram> -<histogram name="InstanceID.GetToken.RetryCount" expires_after="2018-08-30"> +<histogram name="InstanceID.GetToken.RetryCount" units="units" + expires_after="2018-08-30"> <obsolete> Deprecated 7/2019. No longer used. </obsolete> @@ -54297,14 +54550,16 @@ <summary>Number of retries before GetToken succeeds.</summary> </histogram> -<histogram name="InstanceID.RestoredIDCount" expires_after="2018-08-30"> +<histogram name="InstanceID.RestoredIDCount" units="units" + expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> Number of Instance IDs restored from the persistent store at startup. </summary> </histogram> -<histogram name="InstanceID.RestoredTokenCount" expires_after="2018-08-30"> +<histogram name="InstanceID.RestoredTokenCount" units="units" + expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> Number of InstanceID tokens restored from the persistent store at startup. @@ -55837,7 +56092,8 @@ <summary>The number of navigation started events by navigation type.</summary> </histogram> -<histogram name="IOS.PageLoadCount.LoadingStarted" expires_after="2020-01-26"> +<histogram name="IOS.PageLoadCount.LoadingStarted" units="units" + expires_after="2020-01-26"> <owner>danyao@chromium.org</owner> <summary> The "true" value of this boolean histogram counts the number of @@ -55999,7 +56255,8 @@ <summary>Time spent in Spotlight initial indexation of bookmarks.</summary> </histogram> -<histogram name="IOS.Spotlight.BookmarksInitialIndexSize" expires_after="M85"> +<histogram name="IOS.Spotlight.BookmarksInitialIndexSize" units="units" + expires_after="M85"> <owner>olivierrobin@chromium.org</owner> <summary>Number of bookmarks indexed during initial indexation.</summary> </histogram> @@ -56171,7 +56428,7 @@ </summary> </histogram> -<histogram name="JSDialogs.CountOfJSDialogMessageNewlines" +<histogram name="JSDialogs.CountOfJSDialogMessageNewlines" units="units" expires_after="2018-06-25"> <obsolete> Deprecated 2018-06. @@ -56194,7 +56451,7 @@ </summary> </histogram> -<histogram name="JSDialogs.CountOfOnBeforeUnloadMessageNewlines" +<histogram name="JSDialogs.CountOfOnBeforeUnloadMessageNewlines" units="units" expires_after="2016-03-11"> <obsolete> Deprecated 2016-02. @@ -56332,7 +56589,8 @@ </summary> </histogram> -<histogram name="Kerberos.NumberOfAccounts.Managed" expires_after="M83"> +<histogram name="Kerberos.NumberOfAccounts.Managed" units="units" + expires_after="M83"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -56343,7 +56601,7 @@ </summary> </histogram> -<histogram name="Kerberos.NumberOfAccounts.RememberedPassword" +<histogram name="Kerberos.NumberOfAccounts.RememberedPassword" units="units" expires_after="M83"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> @@ -56356,7 +56614,8 @@ </summary> </histogram> -<histogram name="Kerberos.NumberOfAccounts.Total" expires_after="M83"> +<histogram name="Kerberos.NumberOfAccounts.Total" units="units" + expires_after="M83"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -56366,7 +56625,8 @@ </summary> </histogram> -<histogram name="Kerberos.NumberOfAccounts.Unmanaged" expires_after="M83"> +<histogram name="Kerberos.NumberOfAccounts.Unmanaged" units="units" + expires_after="M83"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -56377,7 +56637,7 @@ </summary> </histogram> -<histogram name="Kerberos.NumberOfAccounts.UseLoginPassword" +<histogram name="Kerberos.NumberOfAccounts.UseLoginPassword" units="units" expires_after="M83"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> @@ -57449,7 +57709,8 @@ </summary> </histogram> -<histogram name="LocalDiscovery.ClientRestartAttempts" expires_after="M77"> +<histogram name="LocalDiscovery.ClientRestartAttempts" units="units" + expires_after="M77"> <obsolete> Removed July 2019. </obsolete> @@ -57564,7 +57825,7 @@ </summary> </histogram> -<histogram name="LocalStorage.BrowserTimeToPrimeLocalStorage" +<histogram name="LocalStorage.BrowserTimeToPrimeLocalStorage" units="units" expires_after="M77"> <owner>mek@chromium.org</owner> <owner>dmurph@chromium.org</owner> @@ -57625,7 +57886,7 @@ </summary> </histogram> -<histogram name="LocalStorage.RendererTimeToPrimeLocalStorage"> +<histogram name="LocalStorage.RendererTimeToPrimeLocalStorage" units="units"> <owner>mek@chromium.org</owner> <owner>dmurph@chromium.org</owner> <summary> @@ -57633,7 +57894,7 @@ </summary> </histogram> -<histogram name="LocalStorage.TimeToPrimeLocalStorage"> +<histogram name="LocalStorage.TimeToPrimeLocalStorage" units="units"> <owner>mek@chromium.org</owner> <owner>dmurph@chromium.org</owner> <summary> @@ -57837,7 +58098,8 @@ </summary> </histogram> -<histogram name="Login.OfflineSuccess.Attempts" expires_after="2020-02-16"> +<histogram name="Login.OfflineSuccess.Attempts" units="units" + expires_after="2020-02-16"> <owner>glevin@chromium.org</owner> <summary> On offline login success, records number of attempts, including success. @@ -58421,7 +58683,7 @@ </summary> </histogram> -<histogram name="Media.Android.NumMediaServerCrashes" +<histogram name="Media.Android.NumMediaServerCrashes" units="units" expires_after="2017-04-12"> <obsolete> Deprecated as of 04/2017 @@ -58478,14 +58740,14 @@ </summary> </histogram> -<histogram name="Media.Audible.ConcurrentTabsWhenStarting"> +<histogram name="Media.Audible.ConcurrentTabsWhenStarting" units="units"> <owner>mlamouri@chromium.org</owner> <summary> Records how many tabs were audible when a new tab started to be audible. </summary> </histogram> -<histogram name="Media.Audible.MaxConcurrentTabsInSession"> +<histogram name="Media.Audible.MaxConcurrentTabsInSession" units="units"> <owner>mlamouri@chromium.org</owner> <summary> Records how many tabs are audible at the same time during the session. It is @@ -58495,7 +58757,7 @@ </summary> </histogram> -<histogram name="Media.Audio.ActualInputBufferFrameSizeMac" +<histogram name="Media.Audio.ActualInputBufferFrameSizeMac" units="units" expires_after="2020-07-01"> <owner>henrika@chromium.org</owner> <owner>media-dev@chromium.org</owner> @@ -58980,7 +59242,7 @@ </summary> </histogram> -<histogram name="Media.Audio.InputRestartAttemptsMac" +<histogram name="Media.Audio.InputRestartAttemptsMac" units="units" expires_after="2017-05-24"> <obsolete> Deprecated May 2017. Restart mechanism is removed. @@ -59040,7 +59302,8 @@ </summary> </histogram> -<histogram name="Media.Audio.LogicalProcessorsMac" expires_after="2020-07-01"> +<histogram name="Media.Audio.LogicalProcessorsMac" units="units" + expires_after="2020-07-01"> <owner>henrika@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -59049,7 +59312,7 @@ </summary> </histogram> -<histogram name="Media.Audio.NumberOfBasicInputStreamsMac" +<histogram name="Media.Audio.NumberOfBasicInputStreamsMac" units="units" expires_after="2018-08-22"> <obsolete> Deprecated as of Aug 2018. @@ -59061,7 +59324,7 @@ </summary> </histogram> -<histogram name="Media.Audio.NumberOfLowLatencyInputStreamsMac" +<histogram name="Media.Audio.NumberOfLowLatencyInputStreamsMac" units="units" expires_after="2018-08-22"> <obsolete> Deprecated as of Aug 2018. @@ -59073,7 +59336,7 @@ </summary> </histogram> -<histogram name="Media.Audio.NumberOfOutputStreamsMac" +<histogram name="Media.Audio.NumberOfOutputStreamsMac" units="units" expires_after="2018-08-22"> <obsolete> Deprecated as of Aug 2018. @@ -59108,7 +59371,7 @@ </summary> </histogram> -<histogram name="Media.Audio.PhysicalProcessorsMac"> +<histogram name="Media.Audio.PhysicalProcessorsMac" units="units"> <owner>henrika@chromium.org</owner> <summary> The number of physical processors/cores available on the Mac OSX device. @@ -59241,7 +59504,7 @@ </summary> </histogram> -<histogram name="Media.Audio.Render.BrowserCallbackRegularity"> +<histogram name="Media.Audio.Render.BrowserCallbackRegularity" units="units"> <obsolete> Deprecated June 2019. </obsolete> @@ -59540,7 +59803,7 @@ </summary> </histogram> -<histogram name="Media.Audio.RequestedInputBufferFrameSizeMac" +<histogram name="Media.Audio.RequestedInputBufferFrameSizeMac" units="units" expires_after="2020-07-01"> <owner>henrika@chromium.org</owner> <owner>media-dev@chromium.org</owner> @@ -59552,7 +59815,8 @@ </summary> </histogram> -<histogram name="Media.Audio.ResumeEventsMac" expires_after="2018-08-22"> +<histogram name="Media.Audio.ResumeEventsMac" units="units" + expires_after="2018-08-22"> <obsolete> Deprecated as of Aug 2018. </obsolete> @@ -59634,7 +59898,7 @@ </summary> </histogram> -<histogram name="Media.AudioBitsPerChannel"> +<histogram name="Media.AudioBitsPerChannel" units="units"> <owner>dalecurtis@chromium.org</owner> <summary>Bits per channel of HTML5 audio sample data.</summary> </histogram> @@ -59932,7 +60196,8 @@ </summary> </histogram> -<histogram name="Media.AudioRendererIpcStreams" expires_after="2017-02-08"> +<histogram name="Media.AudioRendererIpcStreams" units="units" + expires_after="2017-02-08"> <obsolete> Deprecated 02/2017. No longer needed. </obsolete> @@ -59943,7 +60208,8 @@ </summary> </histogram> -<histogram name="Media.AudioRendererIpcStreamsTotal" expires_after="2017-02-08"> +<histogram name="Media.AudioRendererIpcStreamsTotal" units="units" + expires_after="2017-02-08"> <obsolete> Deprecated 02/2017. No longer needed. </obsolete> @@ -60587,7 +60853,8 @@ <summary>Container used for HTML5 media for a local file playback.</summary> </histogram> -<histogram name="Media.DetectedTrackCount.Audio" expires_after="M77"> +<histogram name="Media.DetectedTrackCount.Audio" units="units" + expires_after="M77"> <obsolete> Deprecated 07/2019 in issue 975315. </obsolete> @@ -60599,7 +60866,8 @@ </summary> </histogram> -<histogram name="Media.DetectedTrackCount.Text" expires_after="M77"> +<histogram name="Media.DetectedTrackCount.Text" units="units" + expires_after="M77"> <obsolete> Deprecated 07/2019 in issue 975315. </obsolete> @@ -60611,7 +60879,8 @@ </summary> </histogram> -<histogram name="Media.DetectedTrackCount.Video" expires_after="M77"> +<histogram name="Media.DetectedTrackCount.Video" units="units" + expires_after="M77"> <obsolete> Deprecated 07/2019 in issue 975315. </obsolete> @@ -60664,7 +60933,7 @@ </summary> </histogram> -<histogram name="Media.DroppedFrameCount"> +<histogram name="Media.DroppedFrameCount" units="units"> <owner>prabhur@chromium.org</owner> <summary> Count of dropped frames between pipeline start and stop. Media pipeline @@ -60702,7 +60971,7 @@ </summary> </histogram> -<histogram name="Media.DXVAVDA.ErrorLine"> +<histogram name="Media.DXVAVDA.ErrorLine" units="units"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -60724,7 +60993,8 @@ </summary> </histogram> -<histogram name="Media.DXVAVDA.PictureBufferErrorLine" expires_after="M77"> +<histogram name="Media.DXVAVDA.PictureBufferErrorLine" units="units" + expires_after="M77"> <owner>jbauman@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -60833,7 +61103,7 @@ </summary> </histogram> -<histogram name="Media.EME.CdmInterfaceVersion"> +<histogram name="Media.EME.CdmInterfaceVersion" units="units"> <owner>xhwang@chromium.org</owner> <summary> Chromium could support multiple versions of CDM interface. This metric @@ -60934,7 +61204,8 @@ </summary> </histogram> -<histogram base="true" name="Media.EME.KeyAdded" expires_after="2018-01-04"> +<histogram base="true" name="Media.EME.KeyAdded" units="units" + expires_after="2018-01-04"> <obsolete> Deprecated 02/2016 with removal of prefixed EME. </obsolete> @@ -61002,7 +61273,7 @@ <histogram name="Media.EME.MediaDrm.PreprovisionedOriginId.NonPerAppProvisioningDevice" - expires_after="M90"> + units="units" expires_after="M90"> <owner>jrummell@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -61013,7 +61284,7 @@ <histogram name="Media.EME.MediaDrm.PreprovisionedOriginId.PerAppProvisioningDevice" - expires_after="M90"> + units="units" expires_after="M90"> <owner>jrummell@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -61042,7 +61313,7 @@ </summary> </histogram> -<histogram name="Media.EME.NeedKey" expires_after="2017-10-21"> +<histogram name="Media.EME.NeedKey" units="units" expires_after="2017-10-21"> <obsolete> Renamed to Media.EME.EncryptedEvent in 10/2017. </obsolete> @@ -61283,7 +61554,7 @@ </summary> </histogram> -<histogram name="Media.FallbackHardwareAudioBitsPerChannel" +<histogram name="Media.FallbackHardwareAudioBitsPerChannel" units="units" expires_after="2018-05-04"> <obsolete> Deprecated May 2018; has been 32-bit for years now. @@ -61295,7 +61566,8 @@ </summary> </histogram> -<histogram name="Media.FallbackHardwareAudioChannelCount" expires_after="M77"> +<histogram name="Media.FallbackHardwareAudioChannelCount" units="units" + expires_after="M77"> <obsolete> Removed 06/2019 in issue 975072. Not useful. </obsolete> @@ -61467,7 +61739,8 @@ </summary> </histogram> -<histogram name="Media.HardwareAudioBitsPerChannel" expires_after="2018-05-04"> +<histogram name="Media.HardwareAudioBitsPerChannel" units="units" + expires_after="2018-05-04"> <obsolete> Deprecated May 2018; has been 32-bit for years now. </obsolete> @@ -61475,7 +61748,8 @@ <summary>Bits per channel of the hardware audio device.</summary> </histogram> -<histogram name="Media.HardwareAudioChannelCount" expires_after="never"> +<histogram name="Media.HardwareAudioChannelCount" units="units" + expires_after="never"> <!-- expires-never: Media platform support planning metric. --> <owner>dalecurtis@chromium.org</owner> @@ -61925,7 +62199,7 @@ </summary> </histogram> -<histogram name="Media.MojoVideoDecoder.ActiveInstances" +<histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units" expires_after="2020-02-02"> <owner>sandersd@chromium.org</owner> <summary> @@ -62008,7 +62282,8 @@ </summary> </histogram> -<histogram name="Media.MSE.DetectedTrackCount.Audio" expires_after="2020-02-02"> +<histogram name="Media.MSE.DetectedTrackCount.Audio" units="units" + expires_after="2020-02-02"> <obsolete> Deprecated 07/2019 in issue 975090. </obsolete> @@ -62020,7 +62295,8 @@ </summary> </histogram> -<histogram name="Media.MSE.DetectedTrackCount.Text" expires_after="2020-02-02"> +<histogram name="Media.MSE.DetectedTrackCount.Text" units="units" + expires_after="2020-02-02"> <obsolete> Deprecated 07/2019 in issue 975090. </obsolete> @@ -62034,7 +62310,8 @@ </summary> </histogram> -<histogram name="Media.MSE.DetectedTrackCount.Video" expires_after="2020-02-02"> +<histogram name="Media.MSE.DetectedTrackCount.Video" units="units" + expires_after="2020-02-02"> <obsolete> Deprecated 07/2019 in issue 975090. </obsolete> @@ -62132,7 +62409,8 @@ </summary> </histogram> -<histogram name="Media.MSE.NumberOfTracks" expires_after="2020-02-02"> +<histogram name="Media.MSE.NumberOfTracks" units="units" + expires_after="2020-02-02"> <obsolete> Deprecated 07/2019 in issue 975898. </obsolete> @@ -62398,7 +62676,8 @@ </summary> </histogram> -<histogram name="Media.PepperVideoDecoderPictureCount" expires_after="M77"> +<histogram name="Media.PepperVideoDecoderPictureCount" units="units" + expires_after="M77"> <owner>ihf@chromium.org</owner> <owner>posciak@chromium.org</owner> <summary> @@ -62409,7 +62688,8 @@ </summary> </histogram> -<histogram name="Media.PepperVideoDecoderPictureHeight" expires_after="M77"> +<histogram name="Media.PepperVideoDecoderPictureHeight" units="units" + expires_after="M77"> <owner>ihf@chromium.org</owner> <owner>posciak@chromium.org</owner> <summary> @@ -63045,7 +63325,7 @@ </summary> </histogram> -<histogram name="Media.UnderflowCount" expires_after="2017-02-22"> +<histogram name="Media.UnderflowCount" units="units" expires_after="2017-02-22"> <obsolete> Removed Feb 2017. Media.UnderflowDuration provides more useful counts. </obsolete> @@ -63847,7 +64127,8 @@ <summary>Coded aspect ratio of HTML5 video.</summary> </histogram> -<histogram name="Media.VideoCodedWidth" expires_after="2016-11-15"> +<histogram name="Media.VideoCodedWidth" units="units" + expires_after="2016-11-15"> <obsolete> Deprecated 11/2016 in issue 2506533002. </obsolete> @@ -64035,7 +64316,7 @@ <summary>Visible aspect ratio of HTML5 video.</summary> </histogram> -<histogram name="Media.VideoVisibleWidth"> +<histogram name="Media.VideoVisibleWidth" units="units"> <owner>dalecurtis@chromium.org</owner> <summary>Visible width of HTML5 video.</summary> </histogram> @@ -64049,7 +64330,7 @@ </summary> </histogram> -<histogram name="Media.Vpx.VideoDecoderBuffersInUseByDecoder" +<histogram name="Media.Vpx.VideoDecoderBuffersInUseByDecoder" units="units" expires_after="2016-05-25"> <obsolete> Deprecated 05/2016. @@ -64059,7 +64340,7 @@ </histogram> <histogram name="Media.Vpx.VideoDecoderBuffersInUseByDecoderAndVideoFrame" - expires_after="2016-05-25"> + units="units" expires_after="2016-05-25"> <obsolete> Deprecated 05/2016. </obsolete> @@ -64299,7 +64580,7 @@ <summary>If a media scan was cancelled, the duration (in ms) it ran.</summary> </histogram> -<histogram name="MediaGalleries.ScanDirectoriesFound"> +<histogram name="MediaGalleries.ScanDirectoriesFound" units="units"> <owner>vandebo@chromium.org</owner> <summary> The number of directories with media files found during a scan. @@ -64321,7 +64602,7 @@ </summary> </histogram> -<histogram name="MediaGalleries.ScanGalleriesPopulated"> +<histogram name="MediaGalleries.ScanGalleriesPopulated" units="units"> <owner>vandebo@chromium.org</owner> <summary> The number of galleries added or updated in preferences after a scan. @@ -64741,7 +65022,7 @@ <summary>The number of times a user stops different types of routes.</summary> </histogram> -<histogram name="MediaRouter.Ui.Device.Count" expires_after="M85"> +<histogram name="MediaRouter.Ui.Device.Count" units="units" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> Counts the number of devices known and populated to the Media Router dialog @@ -64807,7 +65088,7 @@ </summary> </histogram> -<histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" +<histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" units="units" expires_after="M85"> <owner>takumif@chromium.org</owner> <summary> @@ -65000,7 +65281,7 @@ </summary> </histogram> -<histogram name="Memory.BackingStore"> +<histogram name="Memory.BackingStore" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -65105,7 +65386,7 @@ </summary> </histogram> -<histogram name="Memory.CachedFontAndDC"> +<histogram name="Memory.CachedFontAndDC" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -66224,7 +66505,7 @@ </summary> </histogram> -<histogram name="Memory.GlyphPagesPerLoad"> +<histogram name="Memory.GlyphPagesPerLoad" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -66862,7 +67143,7 @@ </summary> </histogram> -<histogram name="Memory.ProcessLimit" expires_after="2018-03-09"> +<histogram name="Memory.ProcessLimit" units="units" expires_after="2018-03-09"> <obsolete> Deprecated 03/2018. No direct replacement. </obsolete> @@ -67316,7 +67597,8 @@ </summary> </histogram> -<histogram name="Memory.Swap.CompressionRatio" expires_after="2018-03-09"> +<histogram name="Memory.Swap.CompressionRatio" units="units" + expires_after="2018-03-09"> <obsolete> Deprecated 03/2018. No direct replacement. </obsolete> @@ -67413,7 +67695,7 @@ </summary> </histogram> -<histogram name="Memory.Swap.NumReads" expires_after="2018-03-09"> +<histogram name="Memory.Swap.NumReads" units="units" expires_after="2018-03-09"> <obsolete> Deprecated 03/2018. No direct replacement. </obsolete> @@ -67426,7 +67708,8 @@ </summary> </histogram> -<histogram name="Memory.Swap.NumWrites" expires_after="2018-03-09"> +<histogram name="Memory.Swap.NumWrites" units="units" + expires_after="2018-03-09"> <obsolete> Deprecated 03/2018. No direct replacement. </obsolete> @@ -67759,7 +68042,7 @@ </summary> </histogram> -<histogram name="MemoryAndroid.DeviceMemoryClass"> +<histogram name="MemoryAndroid.DeviceMemoryClass" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -67780,7 +68063,7 @@ </summary> </histogram> -<histogram name="MemoryAndroid.LowMemoryLoadedTabCount"> +<histogram name="MemoryAndroid.LowMemoryLoadedTabCount" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -67862,7 +68145,8 @@ </summary> </histogram> -<histogram name="MemoryWarning.OccurrencesPerSession" expires_after="M85"> +<histogram name="MemoryWarning.OccurrencesPerSession" units="units" + expires_after="M85"> <owner>marq@chromium.org</owner> <summary> The number of memory warnings during a given foreground session. @@ -67881,7 +68165,7 @@ </histogram> <histogram name="MessageLoop.DelayedTaskQueue.PendingTasksCountOnIdle" - expires_after="2018-07-24"> + units="units" expires_after="2018-07-24"> <obsolete> Deprecated as of 07/2018. </obsolete> @@ -67905,7 +68189,7 @@ </histogram> <histogram name="MessageLoop.DelayedTaskQueueForUI.PendingTasksCountOnIdle" - expires_after="2018-11-14"> + units="units" expires_after="2018-11-14"> <obsolete> Deprecated as of 11/2018. </obsolete> @@ -68036,7 +68320,7 @@ </summary> </histogram> -<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount"> +<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units"> <!-- Name completed by histogram_suffixes name="Mobile.DefaultBrowser.Type" --> <owner>dtrainor@chromium.org</owner> @@ -68052,7 +68336,8 @@ </summary> </histogram> -<histogram base="true" name="Mobile.DefaultBrowser.SystemBrowserCount"> +<histogram base="true" name="Mobile.DefaultBrowser.SystemBrowserCount" + units="units"> <!-- Name completed by histogram_suffixes name="Mobile.DefaultBrowser.SystemDefaultBrowser.Type" --> @@ -68317,6 +68602,10 @@ <histogram name="MobileDownload.CancelledDownloadRemovedFromHistory" units="downloads" expires_after="M72"> + <obsolete> + Deprecated 09/2019, replaced by + Download.CancelledDownloadRemovedFromHistory. + </obsolete> <owner>qinmin@chromium.org</owner> <owner>dtrainor@chromium.org</owner> <summary> @@ -68420,6 +68709,10 @@ <histogram name="MobileDownload.InterruptedDownloadsRemovedFromHistory" units="downloads" expires_after="M73"> + <obsolete> + Deprecated 09/2019, replaced by + Download.InterruptedDownloadsRemovedFromHistory. + </obsolete> <owner>qinmin@chromium.org</owner> <owner>dtrainor@chromium.org</owner> <summary> @@ -68428,7 +68721,7 @@ </summary> </histogram> -<histogram name="MobileDownload.InterruptionsCount"> +<histogram name="MobileDownload.InterruptionsCount" units="units"> <owner>qinmin@chromium.org</owner> <summary> Android: Records the total interruptions for a download by completion @@ -68509,7 +68802,7 @@ </summary> </histogram> -<histogram base="true" name="MobileDownload.ResumptionsCount" +<histogram base="true" name="MobileDownload.ResumptionsCount" units="units" expires_after="2020-02-02"> <owner>qinmin@chromium.org</owner> <summary> @@ -68730,7 +69023,7 @@ </summary> </histogram> -<histogram name="MobileStartup.DailyLaunchCount"> +<histogram name="MobileStartup.DailyLaunchCount" units="units"> <owner>tedchoc@chromium.org</owner> <summary>The count of launching Chrome mobile app within a day.</summary> </histogram> @@ -68779,7 +69072,7 @@ </summary> </histogram> -<histogram name="MobileStartup.MobileMultiWindowInstances"> +<histogram name="MobileStartup.MobileMultiWindowInstances" units="units"> <obsolete> Deprecated 7/2019. No longer tracked. </obsolete> @@ -68996,7 +69289,7 @@ </histogram> <histogram name="ModuleIntegrityVerification.RelocationsUnorderedModuleIndex" - expires_after="2015-04-15"> + units="units" expires_after="2015-04-15"> <obsolete> Deprecated 04/2015; replaced by ModuleIntegrityVerification.RelocationsUnordered. @@ -69060,7 +69353,7 @@ </summary> </histogram> -<histogram name="Mojo.System.MessagesAcceptedPerEvent" +<histogram name="Mojo.System.MessagesAcceptedPerEvent" units="units" expires_after="2017-06-07"> <obsolete> Deprecated as of 6/2017. @@ -69074,7 +69367,8 @@ </summary> </histogram> -<histogram name="Mojo.System.Node.ConnectedPeers" expires_after="2018-02-21"> +<histogram name="Mojo.System.Node.ConnectedPeers" units="units" + expires_after="2018-02-21"> <obsolete> Deprecated 2/2018. Data no longer useful. </obsolete> @@ -69085,7 +69379,8 @@ </summary> </histogram> -<histogram name="Mojo.System.Node.PendingChildren" expires_after="2018-02-21"> +<histogram name="Mojo.System.Node.PendingChildren" units="units" + expires_after="2018-02-21"> <obsolete> Deprecated 2/2018. Data no longer useful. </obsolete> @@ -69214,7 +69509,8 @@ </summary> </histogram> -<histogram name="MouseEventPrefetch.MouseDowns" expires_after="2016-04-29"> +<histogram name="MouseEventPrefetch.MouseDowns" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -69249,7 +69545,8 @@ </summary> </histogram> -<histogram name="MouseEventPrefetch.MouseOvers" expires_after="2016-04-29"> +<histogram name="MouseEventPrefetch.MouseOvers" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -69284,7 +69581,8 @@ </summary> </histogram> -<histogram name="MouseEventPrefetch.TapDowns" expires_after="2016-04-29"> +<histogram name="MouseEventPrefetch.TapDowns" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -69295,7 +69593,8 @@ </summary> </histogram> -<histogram name="MouseEventPrefetch.TapUnconfirmeds" expires_after="2016-04-29"> +<histogram name="MouseEventPrefetch.TapUnconfirmeds" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -69306,7 +69605,8 @@ </summary> </histogram> -<histogram name="MPArch.ChildProcessLaunchFirst" expires_after="2020-02-02"> +<histogram name="MPArch.ChildProcessLaunchFirst" units="units" + expires_after="2020-02-02"> <owner>ppi@chromium.org</owner> <summary> The time it takes to spawn the first child subprocess (including sandbox @@ -69314,7 +69614,7 @@ </summary> </histogram> -<histogram name="MPArch.ChildProcessLaunchSubsequent" +<histogram name="MPArch.ChildProcessLaunchSubsequent" units="units" expires_after="2020-01-26"> <owner>ppi@chromium.org</owner> <summary> @@ -69341,7 +69641,8 @@ </summary> </histogram> -<histogram name="MPArch.RendererLaunchFirst" expires_after="2014-08-13"> +<histogram name="MPArch.RendererLaunchFirst" units="units" + expires_after="2014-08-13"> <obsolete> Deprecated 2/2013, renamed. </obsolete> @@ -69352,7 +69653,8 @@ </summary> </histogram> -<histogram name="MPArch.RendererLaunchSubsequent" expires_after="2014-08-13"> +<histogram name="MPArch.RendererLaunchSubsequent" units="units" + expires_after="2014-08-13"> <obsolete> Deprecated 2/2013, renamed. </obsolete> @@ -69363,7 +69665,7 @@ </summary> </histogram> -<histogram name="MPArch.RPHCountPerLoad" expires_after="M77"> +<histogram name="MPArch.RPHCountPerLoad" units="units" expires_after="M77"> <owner>ppi@chromium.org</owner> <summary> The number of RenderProcessHosts (i.e. renderer processes) present when each @@ -69404,7 +69706,8 @@ <summary>The time spent inside RenderWidgetHost::OnMsgPaintRect.</summary> </histogram> -<histogram name="MPArch.RWH_OnMsgResizeOrRepaintACK" expires_after="2018-10-16"> +<histogram name="MPArch.RWH_OnMsgResizeOrRepaintACK" units="units" + expires_after="2018-10-16"> <obsolete> Deprecated 09/2018 as message no longer exists. </obsolete> @@ -69426,7 +69729,8 @@ <summary>The time spent inside RenderWidgetHost::OnMsgScrollRect.</summary> </histogram> -<histogram name="MPArch.RWH_OnMsgUpdateRect" expires_after="2017-10-03"> +<histogram name="MPArch.RWH_OnMsgUpdateRect" units="units" + expires_after="2017-10-03"> <obsolete> Deprecated 10/2017. Replaced with MPArch.RWH_OnMsgResizeOrRepaintACK. </obsolete> @@ -69434,7 +69738,8 @@ <summary>TBD</summary> </histogram> -<histogram name="MPArch.RWH_RepaintDelta" expires_after="2018-08-30"> +<histogram name="MPArch.RWH_RepaintDelta" units="units" + expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary>TBD</summary> </histogram> @@ -69746,7 +70051,8 @@ </summary> </histogram> -<histogram name="MultiProfile.DiscardedTabsPerUser" expires_after="2017-11-22"> +<histogram name="MultiProfile.DiscardedTabsPerUser" units="units" + expires_after="2017-11-22"> <obsolete> Deprecated 11/2017. Analysis confirms that the number of discards increases with the number of logged in users. No action will be taken based on this @@ -69819,7 +70125,8 @@ </summary> </histogram> -<histogram name="MultiProfile.UsersPerSession" expires_after="2014-03-09"> +<histogram name="MultiProfile.UsersPerSession" units="units" + expires_after="2014-03-09"> <obsolete> Deprecated 3/2014, renamed to MultiProfile.UsersPerSessionIncremental. </obsolete> @@ -69830,7 +70137,7 @@ </summary> </histogram> -<histogram name="MultiProfile.UsersPerSessionIncremental" +<histogram name="MultiProfile.UsersPerSessionIncremental" units="units" expires_after="2020-02-02"> <owner>skuhne@chromium.org</owner> <summary> @@ -70380,7 +70687,8 @@ </summary> </histogram> -<histogram name="NativeFileSystemAPI.FileChooserResult" expires_after="M82"> +<histogram name="NativeFileSystemAPI.FileChooserResult" units="units" + expires_after="M82"> <owner>mek@chromium.org</owner> <owner>src/content/browser/native_file_system/OWNERS</owner> <summary> @@ -70428,7 +70736,7 @@ </summary> </histogram> -<histogram name="NativeSmbFileShare.MountCount"> +<histogram name="NativeSmbFileShare.MountCount" units="units"> <owner>zentaro@chromium.org</owner> <summary> The number of active mounts that a user has. This is recorded after a share @@ -70445,7 +70753,7 @@ </summary> </histogram> -<histogram name="NativeSmbFileShare.ReadDirectoryCount"> +<histogram name="NativeSmbFileShare.ReadDirectoryCount" units="units"> <owner>zentaro@chromium.org</owner> <summary> The number of entries read when calling ReadDirectory. This is recorded @@ -70484,7 +70792,7 @@ </summary> </histogram> -<histogram name="Navigation.BackForward.BackTargetSkipped"> +<histogram name="Navigation.BackForward.BackTargetSkipped" units="units"> <owner>shivanisha@chromium.org</owner> <owner>csharrison@chromium.org</owner> <summary> @@ -70501,7 +70809,7 @@ <summary>The cache flags set on back-forward navigations.</summary> </histogram> -<histogram name="Navigation.BackForward.ForwardTargetSkipped"> +<histogram name="Navigation.BackForward.ForwardTargetSkipped" units="units"> <owner>shivanisha@chromium.org</owner> <owner>csharrison@chromium.org</owner> <summary> @@ -72246,7 +72554,8 @@ </summary> </histogram> -<histogram name="NCN.NetworkOperatorMCCMNC" expires_after="2020-02-02"> +<histogram name="NCN.NetworkOperatorMCCMNC" units="units" + expires_after="2020-02-02"> <owner>tbansal@chromium.org</owner> <owner>bengr@google.com</owner> <summary> @@ -72278,7 +72587,7 @@ </summary> </histogram> -<histogram name="NCN.OfflineDataRecvAny5sBeforeOnline" +<histogram name="NCN.OfflineDataRecvAny5sBeforeOnline" units="units" expires_after="2018-06-27"> <obsolete> Deprecated 6/2018. @@ -72303,7 +72612,7 @@ </summary> </histogram> -<histogram name="NCN.OfflinePolls" expires_after="2018-06-27"> +<histogram name="NCN.OfflinePolls" units="units" expires_after="2018-06-27"> <obsolete> Deprecated 6/2018. </obsolete> @@ -72403,7 +72712,7 @@ </histogram> <histogram name="Net.AlternativeServiceServers.MoreOrEqualCacheEntries" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <obsolete> Deprecated 2019/8. </obsolete> @@ -72417,7 +72726,7 @@ </summary> </histogram> -<histogram name="Net.AlternativeServiceServers.MorePrefsEntries"> +<histogram name="Net.AlternativeServiceServers.MorePrefsEntries" units="units"> <obsolete> Deprecated 2019/8. </obsolete> @@ -72438,7 +72747,7 @@ </summary> </histogram> -<histogram name="Net.AsyncResourceHandler_PendingDataCount" +<histogram name="Net.AsyncResourceHandler_PendingDataCount" units="units" expires_after="2015-03-24"> <obsolete> Deprecated 03/2015. @@ -72451,7 +72760,7 @@ </histogram> <histogram name="Net.AsyncResourceHandler_PendingDataCount_WhenFull" - expires_after="2015-03-24"> + units="units" expires_after="2015-03-24"> <obsolete> Deprecated 03/2015. </obsolete> @@ -72581,7 +72890,7 @@ <summary>The time to generate an NTLM HTTP authentication token.</summary> </histogram> -<histogram name="Net.AutoReload.CountAtStop" expires_after="M77"> +<histogram name="Net.AutoReload.CountAtStop" units="units" expires_after="M77"> <obsolete> Deprecated and removed 06/2019. </obsolete> @@ -72593,7 +72902,8 @@ </summary> </histogram> -<histogram name="Net.AutoReload.CountAtSuccess" expires_after="M77"> +<histogram name="Net.AutoReload.CountAtSuccess" units="units" + expires_after="M77"> <obsolete> Deprecated and removed 06/2019. </obsolete> @@ -72686,7 +72996,8 @@ </summary> </histogram> -<histogram name="Net.CacheState.AllBytes" expires_after="2016-08-02"> +<histogram name="Net.CacheState.AllBytes" units="units" + expires_after="2016-08-02"> <obsolete> Part of a concluded experiment, 2016-08-02. </obsolete> @@ -72705,7 +73016,8 @@ </summary> </histogram> -<histogram name="Net.CacheState.EncodeableBytes" expires_after="2016-10-27"> +<histogram name="Net.CacheState.EncodeableBytes" units="units" + expires_after="2016-10-27"> <obsolete> Part of a concluded experiment, 2016-08-02. </obsolete> @@ -73198,7 +73510,7 @@ </histogram> <histogram name="Net.CertificateTransparency.MainFrameValidSCTCount" - expires_after="2018-12-20"> + units="units" expires_after="2018-12-20"> <obsolete> Deprecated 12/2018. </obsolete> @@ -73273,7 +73585,7 @@ </summary> </histogram> -<histogram name="Net.CertificateTransparency.SCTsPerConnection" +<histogram name="Net.CertificateTransparency.SCTsPerConnection" units="units" expires_after="2018-12-20"> <obsolete> Deprecated 12/2018. @@ -73307,7 +73619,7 @@ </summary> </histogram> -<histogram name="Net.CertVerifier.PathBuilderIterationCount" +<histogram name="Net.CertVerifier.PathBuilderIterationCount" units="units" expires_after="2020-07-01"> <owner>mattm@chromium.org</owner> <owner>net-dev@chromium.org</owner> @@ -73594,7 +73906,8 @@ </summary> </histogram> -<histogram name="Net.ConnectionUsedSSLv3Fallback" expires_after="2013-04-09"> +<histogram name="Net.ConnectionUsedSSLv3Fallback" units="units" + expires_after="2013-04-09"> <obsolete> Replaced by Net.ConnectionUsedSSLVersionFallback in Chrome 21. </obsolete> @@ -73682,7 +73995,7 @@ <summary>Intervals between access time updates for each cookie.</summary> </histogram> -<histogram name="net.CookieCount" expires_after="2013-04-09"> +<histogram name="net.CookieCount" units="units" expires_after="2013-04-09"> <obsolete> Initial typo; only here to get results from builds before r59117. See "Cookie." group. @@ -73706,7 +74019,8 @@ </summary> </histogram> -<histogram name="net.CookieDomainCount" expires_after="2013-04-09"> +<histogram name="net.CookieDomainCount" units="units" + expires_after="2013-04-09"> <obsolete> Initial typo; only here to get results from builds before r59117. See "Cookie." group. @@ -73718,7 +74032,8 @@ </summary> </histogram> -<histogram name="net.CookieDomainPerEtldp1Count" expires_after="2016-04-29"> +<histogram name="net.CookieDomainPerEtldp1Count" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -73729,7 +74044,8 @@ </summary> </histogram> -<histogram name="net.CookieEtldp1Count" expires_after="2013-04-09"> +<histogram name="net.CookieEtldp1Count" units="units" + expires_after="2013-04-09"> <obsolete> Initial typo; only here to get results from builds before r59117. See "Cookie." group. @@ -73764,7 +74080,7 @@ <summary>Number of minutes until cookie expires when set.</summary> </histogram> -<histogram name="net.CookieTimeGet" expires_after="2013-04-09"> +<histogram name="net.CookieTimeGet" units="units" expires_after="2013-04-09"> <obsolete> Initial typo; only here to get results from builds before r59117. See "Cookie." group. @@ -73775,7 +74091,7 @@ </summary> </histogram> -<histogram name="net.CookieTimeLoad" expires_after="2013-04-09"> +<histogram name="net.CookieTimeLoad" units="units" expires_after="2013-04-09"> <obsolete> Initial typo; only here to get results from builds before r59117. See "Cookie." group. @@ -73972,7 +74288,7 @@ </summary> </histogram> -<histogram name="Net.CountOfSpdyServers" expires_after="M77"> +<histogram name="Net.CountOfSpdyServers" units="units" expires_after="M77"> <obsolete> Removed on 2016-08. </obsolete> @@ -73983,7 +74299,8 @@ </summary> </histogram> -<histogram name="Net.CountOfSpdySettings" expires_after="2016-11-10"> +<histogram name="Net.CountOfSpdySettings" units="units" + expires_after="2016-11-10"> <obsolete> Removed on 2016-10-11. </obsolete> @@ -74590,7 +74907,8 @@ </summary> </histogram> -<histogram name="Net.DhcpWpadNumAdaptersAtWaitTimer" expires_after="2014-09-16"> +<histogram name="Net.DhcpWpadNumAdaptersAtWaitTimer" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -74602,7 +74920,7 @@ </summary> </histogram> -<histogram name="Net.DhcpWpadNumPendingAdaptersAtWaitTimer" +<histogram name="Net.DhcpWpadNumPendingAdaptersAtWaitTimer" units="units" expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. @@ -74616,7 +74934,8 @@ </summary> </histogram> -<histogram name="Net.DhcpWpadUnhandledDhcpError" expires_after="2014-09-16"> +<histogram name="Net.DhcpWpadUnhandledDhcpError" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -75156,7 +75475,7 @@ </summary> </histogram> -<histogram name="Net.DNS_Resolution_And_TCP_Connection_Latency" +<histogram name="Net.DNS_Resolution_And_TCP_Connection_Latency" units="units" expires_after="2013-05-10"> <obsolete> Deprecated- see Net.DNS_Resolution_And_TCP_Connection_Latency2 @@ -75164,7 +75483,7 @@ <owner>Please list the metric's owners. Add more owner tags as needed.</owner> </histogram> -<histogram name="Net.Dns_Resolution_And_TCP_Connection_Latency" +<histogram name="Net.Dns_Resolution_And_TCP_Connection_Latency" units="units" expires_after="2013-04-09"> <obsolete> Deprecated- see Net.DNS_Resolution_And_TCP_Connection_Latency2 @@ -75180,7 +75499,7 @@ </summary> </histogram> -<histogram name="Net.Dns_Resolution_And_TCP_Connection_Latency2" +<histogram name="Net.Dns_Resolution_And_TCP_Connection_Latency2" units="units" expires_after="2013-05-10"> <obsolete> Deprecated- see Net.DNS_Resolution_And_TCP_Connection_Latency2 @@ -75221,7 +75540,7 @@ </summary> </histogram> -<histogram name="Net.DoubleGetExperiment_ResponseCode" +<histogram name="Net.DoubleGetExperiment_ResponseCode" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -75236,7 +75555,8 @@ </summary> </histogram> -<histogram name="Net.DownloadBandwidth" expires_after="2015-03-31"> +<histogram name="Net.DownloadBandwidth" units="units" + expires_after="2015-03-31"> <obsolete> Deprecated as of 03/2015. No longer generated. </obsolete> @@ -75640,7 +75960,7 @@ </summary> </histogram> -<histogram name="Net.FileError_Flush" expires_after="2016-04-29"> +<histogram name="Net.FileError_Flush" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75651,7 +75971,8 @@ </summary> </histogram> -<histogram name="Net.FileError_GetSize" expires_after="2016-04-29"> +<histogram name="Net.FileError_GetSize" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75662,7 +75983,7 @@ </summary> </histogram> -<histogram name="Net.FileError_Open" expires_after="2016-04-29"> +<histogram name="Net.FileError_Open" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75673,7 +75994,7 @@ </summary> </histogram> -<histogram name="Net.FileError_Read" expires_after="2016-04-29"> +<histogram name="Net.FileError_Read" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75684,7 +76005,7 @@ </summary> </histogram> -<histogram name="Net.FileError_Seek" expires_after="2016-04-29"> +<histogram name="Net.FileError_Seek" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75695,7 +76016,7 @@ </summary> </histogram> -<histogram name="Net.FileError_SetEof" expires_after="2016-04-29"> +<histogram name="Net.FileError_SetEof" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75706,7 +76027,7 @@ </summary> </histogram> -<histogram name="Net.FileError_Write" expires_after="2016-04-29"> +<histogram name="Net.FileError_Write" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75717,7 +76038,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_Flush" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_Flush" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75730,7 +76052,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_GetSize" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_GetSize" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75743,7 +76066,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_Open" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_Open" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75756,7 +76080,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_Read" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_Read" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75769,7 +76094,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_Seek" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_Seek" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75782,7 +76108,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_SetEof" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_SetEof" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -75795,7 +76122,8 @@ </summary> </histogram> -<histogram name="Net.FileErrorRange_Write" expires_after="2016-04-29"> +<histogram name="Net.FileErrorRange_Write" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -76081,7 +76409,8 @@ </summary> </histogram> -<histogram name="Net.HttpAuthCacheAddEvictedCreation" expires_after="M77"> +<histogram name="Net.HttpAuthCacheAddEvictedCreation" units="units" + expires_after="M77"> <obsolete> Removed in Chrome 77. </obsolete> @@ -76091,7 +76420,8 @@ </summary> </histogram> -<histogram name="Net.HttpAuthCacheAddEvictedLastUse" expires_after="M77"> +<histogram name="Net.HttpAuthCacheAddEvictedLastUse" units="units" + expires_after="M77"> <obsolete> Removed in Chrome 77. </obsolete> @@ -76113,7 +76443,7 @@ </summary> </histogram> -<histogram name="Net.HttpAuthCacheEntriesExaminedWhenNoMatch" +<histogram name="Net.HttpAuthCacheEntriesExaminedWhenNoMatch" units="units" expires_after="2018-10-12"> <obsolete> Deprecated 10/2018 when changing the cache implementation such that the @@ -76129,7 +76459,7 @@ </summary> </histogram> -<histogram name="Net.HttpAuthCacheLookupByPathPosition" +<histogram name="Net.HttpAuthCacheLookupByPathPosition" units="units" expires_after="2018-10-12"> <obsolete> Deprecated 10/2018 when changing the cache implementation such that the @@ -76142,7 +76472,8 @@ </summary> </histogram> -<histogram name="Net.HttpAuthCacheLookupPosition" expires_after="2018-10-12"> +<histogram name="Net.HttpAuthCacheLookupPosition" units="units" + expires_after="2018-10-12"> <obsolete> Deprecated 10/2018 when changing the cache implementation such that the lookup position no longer applies. @@ -76481,12 +76812,13 @@ </summary> </histogram> -<histogram name="Net.HttpResponseCode"> +<histogram name="Net.HttpResponseCode" units="units"> <owner>mmenke@chromium.org</owner> <summary>The count of HTTP Response codes encountered.</summary> </histogram> -<histogram name="Net.HttpResponseCode_Nxx_MainFrame" expires_after="M77"> +<histogram name="Net.HttpResponseCode_Nxx_MainFrame" units="units" + expires_after="M77"> <obsolete> Deprecated as of 06/2019. Net.HttpResponseCode has similar information, but for all resources, not just the main frame, and includes the full response @@ -76536,7 +76868,8 @@ </summary> </histogram> -<histogram name="Net.HttpServerProperties.CountOfServers" expires_after="M82"> +<histogram name="Net.HttpServerProperties.CountOfServers" units="units" + expires_after="M82"> <owner>zhongyi@chromium.org</owner> <owner>mmenke@chromium.org</owner> <summary> @@ -77123,7 +77456,8 @@ </summary> </histogram> -<histogram name="Net.NotifyAddrChangeFailures" expires_after="2018-08-30"> +<histogram name="Net.NotifyAddrChangeFailures" units="units" + expires_after="2018-08-30"> <owner>pauljensen@chromium.org</owner> <summary> On Windows, NetworkChangeNotifierWin calls NotifyAddrChange, which can fail @@ -77133,7 +77467,8 @@ </summary> </histogram> -<histogram name="Net.NumDuplicateCookiesInDb" expires_after="2015-08-21"> +<histogram name="Net.NumDuplicateCookiesInDb" units="units" + expires_after="2015-08-21"> <obsolete> Deprecated 2015-08-17 as part of cookie histogram cleanup (https://crbug.com/521135). @@ -77145,7 +77480,7 @@ </summary> </histogram> -<histogram name="Net.NumQuicSessionsAtShutdown"> +<histogram name="Net.NumQuicSessionsAtShutdown" units="units"> <owner>rch@chromium.org</owner> <summary> The number of QUIC sessions when the QuicStreamFactory is destroyed. @@ -77387,7 +77722,7 @@ </details> </histogram> -<histogram name="Net.PreconnectSubresourceExpectation" +<histogram name="Net.PreconnectSubresourceExpectation" units="units" expires_after="2018-05-15"> <obsolete> Deprecated May 2018 @@ -77449,7 +77784,8 @@ </details> </histogram> -<histogram name="Net.Predictor.MRUIndex" expires_after="2016-07-28"> +<histogram name="Net.Predictor.MRUIndex" units="units" + expires_after="2016-07-28"> <obsolete> Dev data was collected which was good enough to make a decision on the size of the predictor database. @@ -77565,7 +77901,7 @@ </summary> </histogram> -<histogram name="Net.PrefProxyConfig.GooglezipProxyRemovalCount"> +<histogram name="Net.PrefProxyConfig.GooglezipProxyRemovalCount" units="units"> <owner>sclittle@chromium.org</owner> <summary> Records how many *.googlezip.net Data Reduction Proxies were removed from @@ -77642,7 +77978,7 @@ </summary> </histogram> -<histogram name="Net.ProxyAuthRequested.HasConnection" +<histogram name="Net.ProxyAuthRequested.HasConnection" units="units" expires_after="2019-03-01"> <obsolete> Removed 2019/02/28, in a proxy auth refactor. @@ -77655,7 +77991,8 @@ </summary> </histogram> -<histogram name="Net.ProxyPollConfigurationTime" expires_after="2014-09-16"> +<histogram name="Net.ProxyPollConfigurationTime" units="units" + expires_after="2014-09-16"> <obsolete> Removed at some time before 2014/09/15. </obsolete> @@ -77728,7 +78065,7 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.BlockingDNSMode.NumAlerts" +<histogram name="Net.ProxyResolver.BlockingDNSMode.NumAlerts" units="units" expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. @@ -77740,7 +78077,7 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.BlockingDNSMode.NumErrors" +<histogram name="Net.ProxyResolver.BlockingDNSMode.NumErrors" units="units" expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. @@ -77751,7 +78088,7 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.BlockingDNSMode.NumRestarts" +<histogram name="Net.ProxyResolver.BlockingDNSMode.NumRestarts" units="units" expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. @@ -77787,7 +78124,7 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.BlockingDNSMode.UniqueDNS" +<histogram name="Net.ProxyResolver.BlockingDNSMode.UniqueDNS" units="units" expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. @@ -77826,7 +78163,8 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.NumAlerts" expires_after="2014-09-16"> +<histogram name="Net.ProxyResolver.NumAlerts" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -77837,7 +78175,8 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.NumErrors" expires_after="2014-09-16"> +<histogram name="Net.ProxyResolver.NumErrors" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -77847,7 +78186,8 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.NumRestarts" expires_after="2014-09-16"> +<histogram name="Net.ProxyResolver.NumRestarts" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -77907,7 +78247,8 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.UniqueDNS" expires_after="2014-09-16"> +<histogram name="Net.ProxyResolver.UniqueDNS" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -77918,7 +78259,8 @@ </summary> </histogram> -<histogram name="Net.ProxyResolver.URLSize" expires_after="2014-09-16"> +<histogram name="Net.ProxyResolver.URLSize" units="units" + expires_after="2014-09-16"> <obsolete> Removed in Chrome 39. </obsolete> @@ -78103,7 +78445,7 @@ </summary> </histogram> -<histogram name="Net.QuicActiveSessions"> +<histogram name="Net.QuicActiveSessions" units="units"> <owner>rch@chromium.org</owner> <summary> The number of active QUIC sessions before we activate a new QUIC session. @@ -78239,7 +78581,8 @@ </summary> </histogram> -<histogram name="Net.QuicEphemeralPortsSuggested" expires_after="2016-04-25"> +<histogram name="Net.QuicEphemeralPortsSuggested" units="units" + expires_after="2016-04-25"> <obsolete> Deprecated as of 04/2016. </obsolete> @@ -78247,7 +78590,7 @@ <summary>The number of ports suggested per server.</summary> </histogram> -<histogram name="Net.QuicHandshakeNotConfirmedNumPacketsReceived"> +<histogram name="Net.QuicHandshakeNotConfirmedNumPacketsReceived" units="units"> <owner>rch@chromium.org</owner> <summary> The number of QUIC packets received by a QUIC connection whose handshake was @@ -78346,13 +78689,13 @@ </summary> </histogram> -<histogram name="Net.QuicNumSentClientHellos"> +<histogram name="Net.QuicNumSentClientHellos" units="units"> <owner>rch@chromium.org</owner> <summary>The number of client hello messages sent.</summary> </histogram> <histogram name="Net.QuicNumSentClientHellosCryptoHandshakeConfirmed" - expires_after="2014-01-22"> + units="units" expires_after="2014-01-22"> <obsolete> see Net.QuicSession.Connect*PortForHTTP* </obsolete> @@ -78369,14 +78712,15 @@ <summary>The number of times ServerConfigUpdateMessages ignored.</summary> </histogram> -<histogram name="Net.QuicNumStreamFramesInPacket" expires_after="2018-08-30"> +<histogram name="Net.QuicNumStreamFramesInPacket" units="units" + expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> The number of stream frames bundled within a received packet. </summary> </histogram> -<histogram name="Net.QuicNumStreamFramesPerStreamInPacket" +<histogram name="Net.QuicNumStreamFramesPerStreamInPacket" units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> @@ -78537,7 +78881,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.BlockedFrames.Received" expires_after="M77"> +<histogram name="Net.QuicSession.BlockedFrames.Received" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The number of BLOCKED frames recevied by a QuicSession when the session is @@ -78545,7 +78890,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.BlockedFrames.Sent" expires_after="M77"> +<histogram name="Net.QuicSession.BlockedFrames.Sent" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The number of BLOCKED frames sent by a QuicSession when the session is @@ -78682,20 +79028,23 @@ </histogram> <histogram - name="Net.QuicSession.ConnectionClose.NumOpenStreams.HandshakeTimedOut"> + name="Net.QuicSession.ConnectionClose.NumOpenStreams.HandshakeTimedOut" + units="units"> <owner>rch@chromium.org</owner> <summary> The number of streams open when a QUIC session crypto handshake timed out. </summary> </histogram> -<histogram name="Net.QuicSession.ConnectionClose.NumOpenStreams.TimedOut"> +<histogram name="Net.QuicSession.ConnectionClose.NumOpenStreams.TimedOut" + units="units"> <owner>rch@chromium.org</owner> <summary>The number of streams open when a QUIC session timed out.</summary> </histogram> <histogram - name="Net.QuicSession.ConnectionClose.NumTotalStreams.HandshakeTimedOut"> + name="Net.QuicSession.ConnectionClose.NumTotalStreams.HandshakeTimedOut" + units="units"> <owner>rch@chromium.org</owner> <summary> The number of total streams created when a QUIC session crypto handshake @@ -78850,7 +79199,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.DuplicatePacketsReceived"> +<histogram name="Net.QuicSession.DuplicatePacketsReceived" units="units"> <owner>rch@chromium.org</owner> <summary> The number of duplicate packets recevied by a QuicSession when the session @@ -78858,7 +79207,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.FinalTcpCwnd"> +<histogram name="Net.QuicSession.FinalTcpCwnd" units="units"> <owner>rch@chromium.org</owner> <summary> The value of the TCP cubic sender's CWND when the session is closed. @@ -78946,7 +79295,7 @@ </histogram> <histogram name="Net.QuicSession.HeadersStream.EarlyFramesReceived" - expires_after="2016-08-17"> + units="units" expires_after="2016-08-17"> <obsolete> Deprecated 08/2016. </obsolete> @@ -78977,7 +79326,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.IncorrectConnectionIDsReceived" +<histogram name="Net.QuicSession.IncorrectConnectionIDsReceived" units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> @@ -79005,7 +79354,8 @@ </histogram> <histogram - name="Net.QuicSession.LocallyTimedOutWithOpenStreams.TimeSinceLastReceived"> + name="Net.QuicSession.LocallyTimedOutWithOpenStreams.TimeSinceLastReceived" + units="units"> <owner>rch@chromium.org</owner> <summary> If a QUIC connection timed out locally with open streams, this contains the @@ -79015,7 +79365,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.MaxReordering" expires_after="M77"> +<histogram name="Net.QuicSession.MaxReordering" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The maximum packet sequence number reordering observed by a QUIC connection. @@ -79045,7 +79396,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.MtuProbesSent" expires_after="2018-08-30"> +<histogram name="Net.QuicSession.MtuProbesSent" units="units" + expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> The number of MTU probes sent by the client during the session. Logged when @@ -79062,7 +79414,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.NumOpenStreams"> +<histogram name="Net.QuicSession.NumOpenStreams" units="units"> <owner>rch@chromium.org</owner> <summary> The number of QUIC streams opened when a new QUIC stream is created. @@ -79096,7 +79448,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.NumTotalStreams"> +<histogram name="Net.QuicSession.NumTotalStreams" units="units"> <owner>rch@chromium.org</owner> <summary> The total number of streams created by the client when the session is @@ -79104,7 +79456,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.OutOfOrderGapReceived" expires_after="M77"> +<histogram name="Net.QuicSession.OutOfOrderGapReceived" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The number of missing packets between the current received packet and the @@ -79114,7 +79467,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.OutOfOrderLargePacketsReceived" +<histogram name="Net.QuicSession.OutOfOrderLargePacketsReceived" units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> @@ -79124,7 +79477,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.OutOfOrderPacketsReceived" expires_after="M77"> +<histogram name="Net.QuicSession.OutOfOrderPacketsReceived" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The number of times the current received packet had a lower sequence number @@ -79132,7 +79486,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.PacketGapReceived" expires_after="M77"> +<histogram name="Net.QuicSession.PacketGapReceived" units="units" + expires_after="M77"> <owner>rch@chromium.org</owner> <summary> The number of missing packets between the current received packet and the @@ -79149,7 +79504,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.PacketGapSent"> +<histogram name="Net.QuicSession.PacketGapSent" units="units"> <owner>rch@chromium.org</owner> <summary> The number of missing packets between the current received packet and the @@ -79188,7 +79543,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.PacketWriteTime"> +<histogram name="Net.QuicSession.PacketWriteTime" units="units"> <owner>rch@chromium.org</owner> <summary> The time taken to Write() a QUIC packet to the socket. Recorded for each @@ -79303,7 +79658,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.QuicVersion"> +<histogram name="Net.QuicSession.QuicVersion" units="units"> <owner>rch@chromium.org</owner> <summary>Version of the QUIC protocol used for this connection.</summary> </histogram> @@ -79333,7 +79688,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.RejectLength" expires_after="2018-08-30"> +<histogram name="Net.QuicSession.RejectLength" units="units" + expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> The length in bytes of a QUIC REJ message received from the server. @@ -79375,7 +79731,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.SecureResourceSecureSession"> +<histogram name="Net.QuicSession.SecureResourceSecureSession" units="units"> <owner>rch@chromium.org.</owner> <summary> The number of request for secure resources over QUIC sessions. True if the @@ -79499,7 +79855,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentLongConnection"> +<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentLongConnection" + units="units"> <owner>rch@chromium.org</owner> <summary> The percentage of stream frames received which were duplicates. Only for @@ -79507,7 +79864,8 @@ </summary> </histogram> -<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentShortConnection"> +<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentShortConnection" + units="units"> <owner>rch@chromium.org</owner> <summary> The percentage of stream frames received which were duplicates. Only for @@ -79526,7 +79884,7 @@ </histogram> <histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveRTOCount" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> If a QUIC connection timed out with open streams, this contains a count of @@ -79535,7 +79893,7 @@ </histogram> <histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveTLPCount" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> If a QUIC connection timed out with open streams, this contains a count of @@ -79544,7 +79902,7 @@ </histogram> <histogram name="Net.QuicSession.TimedOutWithOpenStreams.HasUnackedPackets" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> If a QUIC connection timed out with open streams, this will be true when the @@ -79553,7 +79911,7 @@ </histogram> <histogram name="Net.QuicSession.TimedOutWithOpenStreams.LocalPort" - expires_after="2018-08-30"> + units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> If a QUIC connection timed out locally with open streams, this contains the @@ -79589,7 +79947,7 @@ </summary> </histogram> -<histogram name="Net.QuicSession.TruncatedAcksReceived" +<histogram name="Net.QuicSession.TruncatedAcksReceived" units="units" expires_after="2016-08-04"> <obsolete> Deprecated 08/2016. @@ -79598,7 +79956,8 @@ <summary>The number of truncated ACK frames received.</summary> </histogram> -<histogram name="Net.QuicSession.TruncatedAcksSent" expires_after="2016-08-04"> +<histogram name="Net.QuicSession.TruncatedAcksSent" units="units" + expires_after="2016-08-04"> <obsolete> Deprecated 08/2016. </obsolete> @@ -79606,7 +79965,7 @@ <summary>The number of truncated ACK frames sent.</summary> </histogram> -<histogram name="Net.QuicSession.UndecryptablePacketsReceived" +<histogram name="Net.QuicSession.UndecryptablePacketsReceived" units="units" expires_after="2018-08-30"> <owner>rch@chromium.org</owner> <summary> @@ -79891,7 +80250,7 @@ </summary> </histogram> -<histogram name="Net.RenegotiationExtensionSupported" +<histogram name="Net.RenegotiationExtensionSupported" units="units" expires_after="2015-03-30"> <obsolete> Deprecated 03/2015. No longer tracked. @@ -79975,7 +80334,7 @@ </summary> </histogram> -<histogram name="Net.RequestTime" expires_after="2015-07-08"> +<histogram name="Net.RequestTime" units="units" expires_after="2015-07-08"> <obsolete> Replaced by Net.RequestTime2 due to bug in original implementation. </obsolete> @@ -79985,7 +80344,7 @@ </summary> </histogram> -<histogram name="Net.RequestTime2" expires_after="2017-09-01"> +<histogram name="Net.RequestTime2" units="units" expires_after="2017-09-01"> <obsolete> Unused, so removed from Chromium as of 2017/8/31. </obsolete> @@ -80304,12 +80663,12 @@ </summary> </histogram> -<histogram name="Net.Socket.NumIdleSockets"> +<histogram name="Net.Socket.NumIdleSockets" units="units"> <owner>mmenke@chromium.org</owner> <summary>Number of idle sockets when one of them was reused.</summary> </histogram> -<histogram name="Net.SocketIdleTimeBeforeNextUse_ReusedSocket" +<histogram name="Net.SocketIdleTimeBeforeNextUse_ReusedSocket" units="units" expires_after="2015-03-25"> <obsolete> Deprecated as of 03/2015. @@ -80318,7 +80677,7 @@ <summary>The time an already used socket sat idle before being used.</summary> </histogram> -<histogram name="Net.SocketIdleTimeBeforeNextUse_UnusedSocket" +<histogram name="Net.SocketIdleTimeBeforeNextUse_UnusedSocket" units="units" expires_after="2015-03-25"> <obsolete> Deprecated as of 03/2015. @@ -80330,7 +80689,7 @@ </summary> </histogram> -<histogram name="Net.SocketIdleTimeOnIOError2_ReusedSocket" +<histogram name="Net.SocketIdleTimeOnIOError2_ReusedSocket" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -80342,7 +80701,7 @@ </summary> </histogram> -<histogram name="Net.SocketIdleTimeOnIOError2_UnusedSocket" +<histogram name="Net.SocketIdleTimeOnIOError2_UnusedSocket" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -80377,7 +80736,8 @@ </summary> </histogram> -<histogram name="Net.SocketRequestTime" expires_after="2015-03-25"> +<histogram name="Net.SocketRequestTime" units="units" + expires_after="2015-03-25"> <obsolete> Deprecated as of 03/2015. </obsolete> @@ -80453,7 +80813,8 @@ <summary>Number of bytes on a socket stream.</summary> </histogram> -<histogram name="Net.SocketStream.ReceivedCounts" expires_after="2014-11-05"> +<histogram name="Net.SocketStream.ReceivedCounts" units="units" + expires_after="2014-11-05"> <obsolete> Deprecated 2014-10-28. No longer generated. No direct replacement. </obsolete> @@ -80472,7 +80833,8 @@ <summary>Number of bytes on a socket stream.</summary> </histogram> -<histogram name="Net.SocketStream.SentCounts" expires_after="2014-11-05"> +<histogram name="Net.SocketStream.SentCounts" units="units" + expires_after="2014-11-05"> <obsolete> Deprecated 2014-10-28. No longer generated. No direct replacement. </obsolete> @@ -80509,7 +80871,7 @@ </histogram> <histogram name="Net.SOCKSSocketIdleTimeBeforeNextUse_ReusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete> see SocketIdleTimeBeforeNextUse_ReusedSocket_SOCK </obsolete> @@ -80520,7 +80882,7 @@ </histogram> <histogram name="Net.SOCKSSocketIdleTimeBeforeNextUse_UnusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete> see SocketIdleTimeBeforeNextUse_UnusedSocket_SOCK </obsolete> @@ -80540,7 +80902,8 @@ </summary> </histogram> -<histogram name="Net.SocksSocketRequestTime" expires_after="2016-04-29"> +<histogram name="Net.SocksSocketRequestTime" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -80607,7 +80970,8 @@ </summary> </histogram> -<histogram name="Net.SpdyHighestQueuedCappedFramesCount" expires_after="M82"> +<histogram name="Net.SpdyHighestQueuedCappedFramesCount" units="units" + expires_after="M82"> <owner>dschinazi@chromium.org</owner> <summary> The highest number of capped frames queued in the SPDY write queue. @@ -80651,7 +81015,8 @@ <summary>The RTT for SPDY's PING.</summary> </histogram> -<histogram name="Net.SpdyPriorityCount" expires_after="2016-05-27"> +<histogram name="Net.SpdyPriorityCount" units="units" + expires_after="2016-05-27"> <obsolete> Removed 2016-05-26. </obsolete> @@ -80849,7 +81214,8 @@ </summary> </histogram> -<histogram name="Net.SpdySessionsWithStalls" expires_after="2016-11-10"> +<histogram name="Net.SpdySessionsWithStalls" units="units" + expires_after="2016-11-10"> <obsolete> Removed on 2016-10-10. </obsolete> @@ -80929,31 +81295,34 @@ </summary> </histogram> -<histogram name="Net.SpdyStreamsAbandonedPerSession" expires_after="M77"> +<histogram name="Net.SpdyStreamsAbandonedPerSession" units="units" + expires_after="M77"> <owner>bnc@chromium.org</owner> <summary> The number of pushed, but abandoned streams over a single session. </summary> </histogram> -<histogram name="Net.SpdyStreamsPerSession"> +<histogram name="Net.SpdyStreamsPerSession" units="units"> <owner>bnc@chromium.org</owner> <summary>The number of streams issued over a single session.</summary> </histogram> -<histogram name="Net.SpdyStreamsPushedAndClaimedPerSession" expires_after="M92"> +<histogram name="Net.SpdyStreamsPushedAndClaimedPerSession" units="units" + expires_after="M92"> <owner>bnc@chromium.org</owner> <summary> The number of pushed, and used streams over a single session. </summary> </histogram> -<histogram name="Net.SpdyStreamsPushedPerSession"> +<histogram name="Net.SpdyStreamsPushedPerSession" units="units"> <owner>bnc@chromium.org</owner> <summary>The number of push streams received over a single session.</summary> </histogram> -<histogram name="Net.SpdyStreamStallsPerSession" expires_after="2016-11-10"> +<histogram name="Net.SpdyStreamStallsPerSession" units="units" + expires_after="2016-11-10"> <obsolete> Removed on 2016-10-10. </obsolete> @@ -81355,7 +81724,8 @@ </summary> </histogram> -<histogram name="Net.SSL_KeyExchange.DHE" expires_after="2016-09-20"> +<histogram name="Net.SSL_KeyExchange.DHE" units="units" + expires_after="2016-09-20"> <obsolete> Removed September 2016. </obsolete> @@ -81381,7 +81751,8 @@ </summary> </histogram> -<histogram name="Net.SSL_KeyExchange.RSA" expires_after="2016-06-02"> +<histogram name="Net.SSL_KeyExchange.RSA" units="units" + expires_after="2016-06-02"> <obsolete> Removed May 2016. </obsolete> @@ -81395,7 +81766,8 @@ </summary> </histogram> -<histogram name="Net.SSLCertBlacklisted" expires_after="2016-01-23"> +<histogram name="Net.SSLCertBlacklisted" units="units" + expires_after="2016-01-23"> <obsolete> Removed on 01/2016. Only ever measured blacklisted Comodo serials, not any of the other blacklisted certificates and keys. @@ -81610,7 +81982,7 @@ </summary> </histogram> -<histogram name="Net.SSLSessionConcurrentLookupCount" +<histogram name="Net.SSLSessionConcurrentLookupCount" units="units" expires_after="2017-10-05"> <obsolete> Removed on 2017-10-02. @@ -81724,7 +82096,8 @@ </summary> </histogram> -<histogram name="Net.SSLVerificationMerged" expires_after="2015-11-11"> +<histogram name="Net.SSLVerificationMerged" units="units" + expires_after="2015-11-11"> <obsolete> Removed in 2012. </obsolete> @@ -81816,7 +82189,8 @@ </summary> </histogram> -<histogram name="Net.TCP_Connection_Idle_Sockets" expires_after="2016-04-29"> +<histogram name="Net.TCP_Connection_Idle_Sockets" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -81881,7 +82255,7 @@ </histogram> <histogram name="Net.TCPForSOCKSSocketIdleTimeBeforeNextUse_ReusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete> see SocketIdleTimeBeforeNextUse_ReusedSocket_TCPforSOCKS </obsolete> @@ -81893,7 +82267,7 @@ </histogram> <histogram name="Net.TCPForSOCKSSocketIdleTimeBeforeNextUse_UnusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete> see SocketIdleTimeBeforeNextUse_UnusedSocket_TCPforSOCKS </obsolete> @@ -82170,7 +82544,7 @@ </histogram> <histogram name="Net.TransportSocketIdleTimeBeforeNextUse_ReusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete/> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> @@ -82180,7 +82554,7 @@ </histogram> <histogram name="Net.TransportSocketIdleTimeBeforeNextUse_UnusedSocket" - expires_after="2013-04-09"> + units="units" expires_after="2013-04-09"> <obsolete/> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> @@ -82383,7 +82757,8 @@ <summary>All HTTP status codes seen during WebSocket handshakes.</summary> </histogram> -<histogram name="Net.Wifi.InterfaceCount" expires_after="2020-02-01"> +<histogram name="Net.Wifi.InterfaceCount" units="units" + expires_after="2020-02-01"> <owner>mattreynolds@chromium.org</owner> <owner>deviceapi-team@google.com</owner> <summary> @@ -82442,7 +82817,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.0.ResponseCode" +<histogram name="NetConnectivity.Pipeline.0.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82473,7 +82848,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.1.ResponseCode" +<histogram name="NetConnectivity.Pipeline.1.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82505,7 +82880,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.2.ResponseCode" +<histogram name="NetConnectivity.Pipeline.2.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82536,7 +82911,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.3.ResponseCode" +<histogram name="NetConnectivity.Pipeline.3.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82568,7 +82943,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.4.ResponseCode" +<histogram name="NetConnectivity.Pipeline.4.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82599,7 +82974,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.5.ResponseCode" +<histogram name="NetConnectivity.Pipeline.5.ResponseCode" units="units" expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. @@ -82643,7 +83018,8 @@ </summary> </histogram> -<histogram name="NetConnectivity.Pipeline.Depth" expires_after="2014-05-27"> +<histogram name="NetConnectivity.Pipeline.Depth" units="units" + expires_after="2014-05-27"> <obsolete> Deprecated 05/2014, related field trial already long expired. </obsolete> @@ -82662,7 +83038,8 @@ <summary>True if the entire pipeline connectivity trial passed.</summary> </histogram> -<histogram name="NetConnectivity.Sent21" expires_after="2013-04-19"> +<histogram name="NetConnectivity.Sent21" units="units" + expires_after="2013-04-19"> <obsolete> Deprecated 6/25/2012. No longer tracked. </obsolete> @@ -82677,7 +83054,7 @@ </summary> </histogram> -<histogram name="NetConnectivity.Sent21.AckReceivedForNthPacket" +<histogram name="NetConnectivity.Sent21.AckReceivedForNthPacket" units="units" expires_after="2013-04-19"> <obsolete> Deprecated 6/25/2012. No longer tracked. @@ -82796,7 +83173,8 @@ <summary>The RTT for echoing 1K bytes of UDP data successfully.</summary> </histogram> -<histogram name="NetConnectivity.UDP.PacketLoss" expires_after="2013-04-26"> +<histogram name="NetConnectivity.UDP.PacketLoss" units="units" + expires_after="2013-04-26"> <obsolete> Deprecated 6/25/2012. No longer tracked. </obsolete> @@ -82811,7 +83189,8 @@ </summary> </histogram> -<histogram name="NetConnectivity.UDP.PacketLoss6" expires_after="2013-04-26"> +<histogram name="NetConnectivity.UDP.PacketLoss6" units="units" + expires_after="2013-04-26"> <obsolete> Deprecated 6/25/2012. No longer tracked. </obsolete> @@ -82880,7 +83259,8 @@ <summary>The RTT for echoing 1k bytes of UDP data successfully.</summary> </histogram> -<histogram name="NetConnectivity2.Send6.PacketsSent" expires_after="2016-04-29"> +<histogram name="NetConnectivity2.Send6.PacketsSent" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -82891,7 +83271,8 @@ </summary> </histogram> -<histogram name="NetConnectivity2.Send6.SeriesAcked" expires_after="2016-04-29"> +<histogram name="NetConnectivity2.Send6.SeriesAcked" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -82906,7 +83287,8 @@ </summary> </histogram> -<histogram name="NetConnectivity2.Sent21" expires_after="2016-04-29"> +<histogram name="NetConnectivity2.Sent21" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -82921,7 +83303,7 @@ </summary> </histogram> -<histogram name="NetConnectivity2.Sent21.AckReceivedForNthPacket" +<histogram name="NetConnectivity2.Sent21.AckReceivedForNthPacket" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -82949,7 +83331,7 @@ </summary> </histogram> -<histogram name="NetConnectivity2.Sent21.PacketsSent" +<histogram name="NetConnectivity2.Sent21.PacketsSent" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -82961,7 +83343,7 @@ </summary> </histogram> -<histogram name="NetConnectivity3" expires_after="2016-04-29"> +<histogram name="NetConnectivity3" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -83116,7 +83498,7 @@ <summary/> </histogram> -<histogram name="NetConnectivity3.StartPacket.Send6.PacketsSent" +<histogram name="NetConnectivity3.StartPacket.Send6.PacketsSent" units="units" expires_after="2013-04-26"> <obsolete> Deprecated 9/2012. No longer tracked. @@ -83200,7 +83582,7 @@ <summary/> </histogram> -<histogram name="NetConnectivity4" expires_after="2016-04-29"> +<histogram name="NetConnectivity4" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -83211,7 +83593,7 @@ </summary> </histogram> -<histogram name="NetConnectivity5" expires_after="2016-04-29"> +<histogram name="NetConnectivity5" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -83254,7 +83636,7 @@ </summary> </histogram> -<histogram name="Network.3G.Gobi.FirmwareDownload.Attempts"> +<histogram name="Network.3G.Gobi.FirmwareDownload.Attempts" units="units"> <owner>benchan@chromium.org</owner> <summary>Number of attempts taken to install Gobi firmware.</summary> </histogram> @@ -83467,7 +83849,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Cellular.AutoConnectTries" +<histogram name="Network.Shill.Cellular.AutoConnectTries" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -83578,7 +83960,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Cellular.PortalAttempts" +<histogram name="Network.Shill.Cellular.PortalAttempts" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -83589,7 +83971,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Cellular.PortalAttemptsToOnline" +<histogram name="Network.Shill.Cellular.PortalAttemptsToOnline" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -83610,7 +83992,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Cellular.SignalStrengthBeforeDrop" +<histogram name="Network.Shill.Cellular.SignalStrengthBeforeDrop" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -83859,7 +84241,7 @@ </summary> </histogram> -<histogram name="Network.Shill.DarkResumeScanNumRetries" +<histogram name="Network.Shill.DarkResumeScanNumRetries" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -83993,7 +84375,7 @@ </histogram> <histogram name="Network.Shill.Ethernet.LinkMonitorBroadcastErrorsAtFailure" - expires_after="2020-06-01"> + units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -84034,7 +84416,7 @@ </histogram> <histogram name="Network.Shill.Ethernet.LinkMonitorUnicastErrorsAtFailure" - expires_after="2020-06-01"> + units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -84044,7 +84426,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Ethernet.PortalAttempts" +<histogram name="Network.Shill.Ethernet.PortalAttempts" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -84055,7 +84437,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Ethernet.PortalAttemptsToOnline" +<histogram name="Network.Shill.Ethernet.PortalAttemptsToOnline" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -84245,7 +84627,7 @@ <summary>Chrome OS connection manager service errors seen.</summary> </histogram> -<histogram name="Network.Shill.ServicesOnSameNetwork" +<histogram name="Network.Shill.ServicesOnSameNetwork" units="units" expires_after="2020-06-01"> <owner>benchan@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -84557,7 +84939,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.AutoConnectableServices" +<histogram name="Network.Shill.WiFi.AutoConnectableServices" units="units" expires_after="M77"> <owner>kirtika@chromium.org</owner> <summary> @@ -84566,7 +84948,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.AvailableBSSesAtConnect"> +<histogram name="Network.Shill.WiFi.AvailableBSSesAtConnect" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network metric sampling the number of BSSes (endpoints) available @@ -84713,7 +85095,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.FrequenciesConnectedEver"> +<histogram name="Network.Shill.WiFi.FrequenciesConnectedEver" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS metric sampling the number of different frequencies (i.e. @@ -84735,7 +85117,7 @@ </histogram> <histogram name="Network.Shill.Wifi.LinkMonitorBroadcastErrorsAtFailure" - expires_after="M77"> + units="units" expires_after="M77"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network performance metric that tracks the number of LinkMonitor @@ -84771,7 +85153,8 @@ </summary> </histogram> -<histogram name="Network.Shill.Wifi.LinkMonitorUnicastErrorsAtFailure"> +<histogram name="Network.Shill.Wifi.LinkMonitorUnicastErrorsAtFailure" + units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network performance metric that tracks the number of LinkMonitor @@ -84806,7 +85189,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Wifi.PortalAttempts"> +<histogram name="Network.Shill.Wifi.PortalAttempts" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network diagnostic metric sampling the number of portal detection @@ -84815,7 +85198,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Wifi.PortalAttemptsToOnline"> +<histogram name="Network.Shill.Wifi.PortalAttemptsToOnline" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network diagnostic metric sampling the total number of portal @@ -84833,7 +85216,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.RememberedNetworkCount"> +<histogram name="Network.Shill.WiFi.RememberedNetworkCount" units="units"> <owner>pstew@chromium.org</owner> <summary> Chrome OS network diagnostic metric sampling the number of 802.11 wireless @@ -84843,7 +85226,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.RememberedSystemNetworkCount"> +<histogram name="Network.Shill.WiFi.RememberedSystemNetworkCount" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network metric sampling the number of 802.11 wireless networks @@ -84857,7 +85240,7 @@ </summary> </histogram> -<histogram name="Network.Shill.WiFi.RememberedUserNetworkCount"> +<histogram name="Network.Shill.WiFi.RememberedUserNetworkCount" units="units"> <owner>kirtika@chromium.org</owner> <summary> Chrome OS network metric sampling the number of 802.11 wireless networks @@ -85141,7 +85524,7 @@ </summary> </histogram> -<histogram name="Network.Shill.Wifi.UnreliableLinkSignalStrength" +<histogram name="Network.Shill.Wifi.UnreliableLinkSignalStrength" units="units" expires_after="M77"> <owner>kirtika@chromium.org</owner> <summary> @@ -85521,7 +85904,8 @@ </summary> </histogram> -<histogram name="Networks.RememberedShared" expires_after="2020-08-01"> +<histogram name="Networks.RememberedShared" units="units" + expires_after="2020-08-01"> <owner>stevenjb@chromium.org</owner> <summary> Number of shared remembered (preferred) networks on Chrome OS. Updated any @@ -85529,7 +85913,8 @@ </summary> </histogram> -<histogram name="Networks.RememberedUnshared" expires_after="2020-08-01"> +<histogram name="Networks.RememberedUnshared" units="units" + expires_after="2020-08-01"> <owner>stevenjb@chromium.org</owner> <summary> Number of private remembered (preferred) networks on Chrome OS. Updated any @@ -85537,7 +85922,7 @@ </summary> </histogram> -<histogram name="Networks.Visible" expires_after="2020-08-01"> +<histogram name="Networks.Visible" units="units" expires_after="2020-08-01"> <owner>stevenjb@chromium.org</owner> <summary> Number of visible (in-range) networks on Chrome OS. Updated any time the @@ -85731,7 +86116,7 @@ </summary> </histogram> -<histogram name="NetworkTimeTracker.UpdateTimeFetchAttempted" +<histogram name="NetworkTimeTracker.UpdateTimeFetchAttempted" units="units" expires_after="2016-08-15"> <obsolete> Deprecated 08/2016 because it does not provide additional information beyond @@ -86064,7 +86449,7 @@ </summary> </histogram> -<histogram name="NewTabPage.ContentSuggestions.CountOnNtpOpened" +<histogram name="NewTabPage.ContentSuggestions.CountOnNtpOpened" units="units" expires_after="2017-07-07"> <obsolete> Deprecated in July 2017. This metric was replaced by @@ -86081,7 +86466,8 @@ </summary> </histogram> -<histogram name="NewTabPage.ContentSuggestions.CountOnNtpOpenedIfVisible"> +<histogram name="NewTabPage.ContentSuggestions.CountOnNtpOpenedIfVisible" + units="units"> <owner>vitaliii@chromium.org</owner> <summary> Android: The number of suggestion cards that were available at the time an @@ -86091,7 +86477,8 @@ </histogram> <histogram - name="NewTabPage.ContentSuggestions.CountOnNtpOpenedIfVisible.Articles.Prefetched.Offline"> + name="NewTabPage.ContentSuggestions.CountOnNtpOpenedIfVisible.Articles.Prefetched.Offline" + units="units"> <obsolete> Deprecated in October 2017 (M63) and replaced by CountOnNtpOpenedIfVisible.Articles.Prefetched.Offline2, because @@ -86585,7 +86972,7 @@ </summary> </histogram> -<histogram name="NewTabPage.ContentSuggestions.UsageTimeLocal"> +<histogram name="NewTabPage.ContentSuggestions.UsageTimeLocal" units="units"> <owner>markusheintz@chromium.org</owner> <summary> Android: The time of day (in the local timezone) when the user used content @@ -86743,7 +87130,8 @@ </summary> </histogram> -<histogram name="NewTabPage.HoverTimeClicked" expires_after="2016-02-19"> +<histogram name="NewTabPage.HoverTimeClicked" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -86754,7 +87142,8 @@ </summary> </histogram> -<histogram name="NewTabPage.HoverTimeNotClicked" expires_after="2016-02-19"> +<histogram name="NewTabPage.HoverTimeNotClicked" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -86765,7 +87154,8 @@ </summary> </histogram> -<histogram name="NewTabPage.IconsColor" expires_after="2017-04-03"> +<histogram name="NewTabPage.IconsColor" units="units" + expires_after="2017-04-03"> <obsolete> Deprecated 2017-04, replaced by NewTabPage.TileType and NewTabPage.SuggestionsImpression.IconsColor. @@ -86778,7 +87168,7 @@ </summary> </histogram> -<histogram name="NewTabPage.IconsGray" expires_after="2017-04-03"> +<histogram name="NewTabPage.IconsGray" units="units" expires_after="2017-04-03"> <obsolete> Deprecated 2017-04, replaced by NewTabPage.TileType and NewTabPage.SuggestionsImpression.IconsGray. @@ -86790,7 +87180,7 @@ </summary> </histogram> -<histogram name="NewTabPage.IconsReal" expires_after="2017-04-03"> +<histogram name="NewTabPage.IconsReal" units="units" expires_after="2017-04-03"> <obsolete> Deprecated 2017-04, replaced by NewTabPage.TileType and NewTabPage.SuggestionsImpression.IconsReal. @@ -87054,7 +87444,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NonVisibleScreenshots" expires_after="2016-02-19"> +<histogram name="NewTabPage.NonVisibleScreenshots" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87065,7 +87456,7 @@ </summary> </histogram> -<histogram name="NewTabPage.NonVisibleSuggestedSiteRank" +<histogram name="NewTabPage.NonVisibleSuggestedSiteRank" units="units" expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). @@ -87078,7 +87469,7 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfExternalTileFallbacks" +<histogram name="NewTabPage.NumberOfExternalTileFallbacks" units="units" expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. @@ -87093,7 +87484,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfExternalTiles" expires_after="2016-07-11"> +<histogram name="NewTabPage.NumberOfExternalTiles" units="units" + expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. </obsolete> @@ -87106,7 +87498,7 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfGrayTileFallbacks" +<histogram name="NewTabPage.NumberOfGrayTileFallbacks" units="units" expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. @@ -87120,7 +87512,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfGrayTiles" expires_after="2016-07-11"> +<histogram name="NewTabPage.NumberOfGrayTiles" units="units" + expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. </obsolete> @@ -87132,7 +87525,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfMouseOvers" expires_after="2016-07-08"> +<histogram name="NewTabPage.NumberOfMouseOvers" units="units" + expires_after="2016-07-08"> <obsolete> Deprecated 2016-07. </obsolete> @@ -87144,7 +87538,7 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfThumbnailAttempts" +<histogram name="NewTabPage.NumberOfThumbnailAttempts" units="units" expires_after="2014-01-17"> <obsolete> Deprecated 01/2014. Replaced by NewTabPage.NumberOfThumbnailTiles. @@ -87158,7 +87552,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfThumbnailErrors" expires_after="2016-07-11"> +<histogram name="NewTabPage.NumberOfThumbnailErrors" units="units" + expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. </obsolete> @@ -87170,7 +87565,8 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfThumbnailTiles" expires_after="2016-07-11"> +<histogram name="NewTabPage.NumberOfThumbnailTiles" units="units" + expires_after="2016-07-11"> <obsolete> Deprecated 2016-07. </obsolete> @@ -87182,7 +87578,7 @@ </summary> </histogram> -<histogram name="NewTabPage.NumberOfTiles" expires_after="M87"> +<histogram name="NewTabPage.NumberOfTiles" units="units" expires_after="M87"> <owner>dbeam@chromium.org</owner> <summary> The number of tiles that are on the NTP, no matter if they are thumbnails, @@ -87408,7 +87804,7 @@ </summary> </histogram> -<histogram name="NewTabPage.SearchSuggestions.IndexClicked" +<histogram name="NewTabPage.SearchSuggestions.IndexClicked" units="units" expires_after="never"> <!-- expires-never: part of top-line metric (internal: go/chrome-browser-nsm) --> @@ -87469,7 +87865,8 @@ </summary> </histogram> -<histogram name="NewTabPage.SearchSuggestions.ShownCount" expires_after="M82"> +<histogram name="NewTabPage.SearchSuggestions.ShownCount" units="units" + expires_after="M82"> <owner>dbeam@chromium.org</owner> <owner>yyushkina@chromium.org</owner> <summary> @@ -87477,7 +87874,8 @@ </summary> </histogram> -<histogram name="NewTabPage.SearchURLs.Total" expires_after="2016-02-19"> +<histogram name="NewTabPage.SearchURLs.Total" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87494,7 +87892,8 @@ <summary>The pane selected when the user switches panes in the NTP.</summary> </histogram> -<histogram name="NewTabPage.SessionRestore" expires_after="2016-02-19"> +<histogram name="NewTabPage.SessionRestore" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87505,7 +87904,7 @@ </summary> </histogram> -<histogram name="NewTabPage.SingleSessionPageSwitches" +<histogram name="NewTabPage.SingleSessionPageSwitches" units="units" expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). @@ -87517,7 +87916,8 @@ </summary> </histogram> -<histogram name="NewTabPage.Snippets.CardClicked" expires_after="2016-10-27"> +<histogram name="NewTabPage.Snippets.CardClicked" units="units" + expires_after="2016-10-27"> <obsolete> Replaced by NewTabPage.ContentSuggestions.Opened. </obsolete> @@ -87587,7 +87987,8 @@ </summary> </histogram> -<histogram name="NewTabPage.Snippets.CardExpanded" expires_after="2016-10-27"> +<histogram name="NewTabPage.Snippets.CardExpanded" units="units" + expires_after="2016-10-27"> <obsolete> Deprecated as of 4/2016 </obsolete> @@ -87598,7 +87999,8 @@ </summary> </histogram> -<histogram name="NewTabPage.Snippets.CardHidden" expires_after="2016-10-27"> +<histogram name="NewTabPage.Snippets.CardHidden" units="units" + expires_after="2016-10-27"> <obsolete> Deprecated as of 4/2016 </obsolete> @@ -87646,7 +88048,8 @@ </summary> </histogram> -<histogram name="NewTabPage.Snippets.CardShown" expires_after="2016-10-27"> +<histogram name="NewTabPage.Snippets.CardShown" units="units" + expires_after="2016-10-27"> <obsolete> Replaced by NewTabPage.ContentSuggestions.Shown. </obsolete> @@ -87876,7 +88279,8 @@ </summary> </histogram> -<histogram name="NewTabPage.SuggestedSite" expires_after="2016-02-19"> +<histogram name="NewTabPage.SuggestedSite" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87896,7 +88300,8 @@ <summary>Action taken by the user on the Suggested Sites NTP pane.</summary> </histogram> -<histogram name="NewTabPage.SuggestedSitesLoadTime" expires_after="2016-02-19"> +<histogram name="NewTabPage.SuggestedSitesLoadTime" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87904,7 +88309,8 @@ <summary>Time to load the Suggested Sites NTP pane, in milliseconds.</summary> </histogram> -<histogram name="NewTabPage.SuggestedSitesViewTime" expires_after="2016-02-19"> +<histogram name="NewTabPage.SuggestedSitesViewTime" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -87945,7 +88351,8 @@ </summary> </histogram> -<histogram name="NewTabPage.ThumbnailErrorRate" expires_after="2014-01-17"> +<histogram name="NewTabPage.ThumbnailErrorRate" units="units" + expires_after="2014-01-17"> <obsolete> Deprecated 01/2014. Replaced by NewTabPage.NumberOfThumbnailAttempts and NewTabPage.NumberOfThumbnailErrors. @@ -88184,7 +88591,8 @@ </summary> </histogram> -<histogram name="NewTabPage.VisibleScreenshots" expires_after="2016-02-19"> +<histogram name="NewTabPage.VisibleScreenshots" units="units" + expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). </obsolete> @@ -88195,7 +88603,7 @@ </summary> </histogram> -<histogram name="NewTabPage.VisibleSuggestedSiteRank" +<histogram name="NewTabPage.VisibleSuggestedSiteRank" units="units" expires_after="2016-02-19"> <obsolete> Deprecated 2016-02 (and not recorded for some time before that). @@ -88681,7 +89089,7 @@ </summary> </histogram> -<histogram name="Notifications.Permissions.RevokeDeleteCount" +<histogram name="Notifications.Permissions.RevokeDeleteCount" units="units" expires_after="M80"> <owner>knollr@chromium.org</owner> <owner>peter@chromium.org</owner> @@ -89493,7 +89901,7 @@ </summary> </histogram> -<histogram name="NQE.Correlation.ResourceLoadTime.0Kb_128Kb" +<histogram name="NQE.Correlation.ResourceLoadTime.0Kb_128Kb" units="units" expires_after="2017-12-19"> <obsolete> Obsoleted in December 2017. @@ -90109,7 +90517,7 @@ </summary> </histogram> -<histogram name="ntp.searchurls.total"> +<histogram name="ntp.searchurls.total" units="units"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -90337,7 +90745,7 @@ </summary> </histogram> -<histogram base="true" name="OfflinePages.AccessCount"> +<histogram base="true" name="OfflinePages.AccessCount" units="units"> <owner>jianli@chromium.org</owner> <summary> Number of accesses to the offline page since its creation. This is reported @@ -90513,7 +90921,7 @@ </histogram> <histogram name="OfflinePages.Background.ImmediateStart.AvailableRequestCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests available for processing when @@ -90523,7 +90931,8 @@ </histogram> <histogram - name="OfflinePages.Background.ImmediateStart.AvailableRequestCount.Svelte"> + name="OfflinePages.Background.ImmediateStart.AvailableRequestCount.Svelte" + units="units"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests available for processing when @@ -90534,7 +90943,7 @@ <histogram name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount" - expires_after="M78"> + units="units" expires_after="M78"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests unavailable for processing when @@ -90544,7 +90953,8 @@ </histogram> <histogram - name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount.Svelte"> + name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount.Svelte" + units="units"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests unavailable for processing when @@ -90589,7 +90999,7 @@ </histogram> <histogram name="OfflinePages.Background.RequestFailure.StartedAttemptCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dougarnett@chromium.org</owner> <summary> Number of started attempts by failed background load requests. @@ -90597,7 +91007,7 @@ </histogram> <histogram name="OfflinePages.Background.RequestSuccess.StartedAttemptCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dougarnett@chromium.org</owner> <summary> Number of started attempts by successful background load requests. @@ -90637,13 +91047,13 @@ </summary> </histogram> -<histogram name="OfflinePages.Background.SavePageFromCCT"> +<histogram name="OfflinePages.Background.SavePageFromCCT" units="units"> <owner>chili@chromium.org</owner> <summary>Whether the save page result came from chrome custom tabs.</summary> </histogram> <histogram name="OfflinePages.Background.ScheduledStart.AvailableRequestCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests available for processing when @@ -90654,7 +91064,7 @@ <histogram name="OfflinePages.Background.ScheduledStart.AvailableRequestCount.Svelte" - expires_after="M78"> + units="units" expires_after="M78"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests available for processing when @@ -90665,7 +91075,7 @@ <histogram name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount" - expires_after="M78"> + units="units" expires_after="M78"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests unavailable for processing when @@ -90676,7 +91086,7 @@ <histogram name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount.Svelte" - expires_after="M78"> + units="units" expires_after="M78"> <owner>dougarnett@chromium.org</owner> <summary> Number of queued background load requests unavailable for processing when @@ -90725,7 +91135,8 @@ </summary> </histogram> -<histogram name="OfflinePages.BatchDelete.Count" expires_after="2018-02-05"> +<histogram name="OfflinePages.BatchDelete.Count" units="units" + expires_after="2018-02-05"> <obsolete> Deprecated 2/2018. No longer used. </obsolete> @@ -90882,7 +91293,7 @@ </summary> </histogram> -<histogram name="OfflinePages.Consistency.OrphanedArchivesCount" +<histogram name="OfflinePages.Consistency.OrphanedArchivesCount" units="units" expires_after="2017-12-08"> <obsolete> Deprecated 12/2017, replaced by @@ -90896,7 +91307,7 @@ </histogram> <histogram name="OfflinePages.Consistency.PagesMissingArchiveFileCount" - expires_after="2017-12-08"> + units="units" expires_after="2017-12-08"> <obsolete> Deprecated 12/2017, replaced by OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount and @@ -91004,7 +91415,7 @@ <summary>Result of temporary page consistency check.</summary> </histogram> -<histogram name="OfflinePages.DeletePage.AccessCount" +<histogram name="OfflinePages.DeletePage.AccessCount" units="units" expires_after="2017-12-21"> <obsolete> Deprecated as of 12/2017. Replaced by OfflinePages.AccessCount. @@ -91195,7 +91606,8 @@ </summary> </histogram> -<histogram name="OfflinePages.ExpirePage.BatchSize" expires_after="2016-11-30"> +<histogram name="OfflinePages.ExpirePage.BatchSize" units="units" + expires_after="2016-11-30"> <obsolete> Deprecated 11/2016. Offline pages no longer use two-step expiration. </obsolete> @@ -91391,7 +91803,8 @@ </summary> </histogram> -<histogram name="OfflinePages.OfflinePageCount" expires_after="2016-05-17"> +<histogram name="OfflinePages.OfflinePageCount" units="units" + expires_after="2016-05-17"> <obsolete> Deprecated 5/2016. This was the dup of OfflinePages.SavedPageCount. </obsolete> @@ -92452,7 +92865,7 @@ </summary> </histogram> -<histogram name="Omnibox.ClipboardSuggestionShownNumTimes"> +<histogram name="Omnibox.ClipboardSuggestionShownNumTimes" units="units"> <owner>mpearson@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <summary> @@ -92856,7 +93269,8 @@ </summary> </histogram> -<histogram name="Omnibox.PhysicalWebProviderMatches" expires_after="2018-04-17"> +<histogram name="Omnibox.PhysicalWebProviderMatches" units="units" + expires_after="2018-04-17"> <obsolete> Obsolete 4/2018, Physical Web is disabled (crbug.com/826540). </obsolete> @@ -92915,7 +93329,8 @@ </summary> </histogram> -<histogram name="Omnibox.QueryBookmarksTime" expires_after="2013-04-16"> +<histogram name="Omnibox.QueryBookmarksTime" units="units" + expires_after="2013-04-16"> <obsolete> Deprecated 2012-11-14. Replaced by Omnibox.ProviderTime. </obsolete> @@ -93106,7 +93521,7 @@ </summary> </histogram> -<histogram name="Omnibox.SearchProviderMatches"> +<histogram name="Omnibox.SearchProviderMatches" units="units"> <owner>mpearson@chromium.org</owner> <summary> The number of matches returned by SearchProvider. Emitted on every call to @@ -93633,7 +94048,8 @@ </summary> </histogram> -<histogram name="Omnibox.ZeroSuggest.MostVisitedResultsCounterfactual"> +<histogram name="Omnibox.ZeroSuggest.MostVisitedResultsCounterfactual" + units="units"> <owner>mpearson@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <owner>hfung@chromium.org</owner> @@ -93738,7 +94154,7 @@ <summary>Number of times error screen has appeared during update.</summary> </histogram> -<histogram name="OOBE.RecommendApps.Fetcher.AppCount" +<histogram name="OOBE.RecommendApps.Fetcher.AppCount" units="units" expires_after="2019-08-30"> <owner>play-bm-eng@google.com</owner> <summary>The number of recommended apps.</summary> @@ -93774,7 +94190,7 @@ <summary>The user action on the recommend apps screen.</summary> </histogram> -<histogram name="OOBE.RecommendApps.Screen.SelectedAppCount" +<histogram name="OOBE.RecommendApps.Screen.SelectedAppCount" units="units" expires_after="2019-08-30"> <owner>chromesky-eng@google.com</owner> <summary>The number of apps user selected.</summary> @@ -93907,7 +94323,7 @@ </histogram> <histogram name="OptimizationGuide.HintsFetcher.GetHintsRequest.HintCount" - expires_after="M82"> + units="units" expires_after="M82"> <owner>mcrouse@chromium.org</owner> <owner>sophiechang@chromium.org</owner> <summary> @@ -94038,7 +94454,7 @@ </summary> </histogram> -<histogram name="OriginChip.Pressed" expires_after="2015-02-12"> +<histogram name="OriginChip.Pressed" units="units" expires_after="2015-02-12"> <obsolete> Deprecated with CL 731423002. OriginChip has been removed. </obsolete> @@ -94085,7 +94501,8 @@ </summary> </histogram> -<histogram name="OSCrypt.EncryptionKeyLookupError" expires_after="M81"> +<histogram name="OSCrypt.EncryptionKeyLookupError" units="units" + expires_after="M81"> <owner>cfroussios@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -94094,7 +94511,7 @@ </summary> </histogram> -<histogram name="OSCrypt.EncryptionKeyOverwritingPreventions" +<histogram name="OSCrypt.EncryptionKeyOverwritingPreventions" units="units" expires_after="2018-11-22"> <obsolete> Obsolete as of Chrome 72. @@ -94282,7 +94699,8 @@ </summary> </histogram> -<histogram base="true" name="OSX.OtherInstances" expires_after="2019-12-31"> +<histogram base="true" name="OSX.OtherInstances" units="units" + expires_after="2019-12-31"> <owner>avi@chromium.org</owner> <owner>rsesek@chromium.org</owner> <owner>mark@chromium.org</owner> @@ -94376,7 +94794,7 @@ </summary> </histogram> -<histogram name="OutdatedUpgradeBubble.NumLaterPerEnableAU"> +<histogram name="OutdatedUpgradeBubble.NumLaterPerEnableAU" units="units"> <owner>mad@chromium.org</owner> <summary> Counts the number of times the user clicked on the later button of the @@ -94385,7 +94803,7 @@ </summary> </histogram> -<histogram name="OutdatedUpgradeBubble.NumLaterPerReinstall"> +<histogram name="OutdatedUpgradeBubble.NumLaterPerReinstall" units="units"> <owner>mad@chromium.org</owner> <summary> Counts the number of times the user clicked on the later button of the @@ -94764,7 +95182,7 @@ </summary> </histogram> -<histogram name="PageActionController.ExtensionsWithPageActions" +<histogram name="PageActionController.ExtensionsWithPageActions" units="units" expires_after="2020-12-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> @@ -94904,7 +95322,8 @@ </summary> </histogram> -<histogram base="true" name="PageLoad.Bytes" expires_after="2020-01-05"> +<histogram base="true" name="PageLoad.Bytes" units="units" + expires_after="2020-01-05"> <owner>jkarlin@chromium.org</owner> <owner>johnidel@chromium.org</owner> <summary> @@ -95949,7 +96368,7 @@ </summary> </histogram> -<histogram name="PageLoad.Clients.DocWrite.Block.ReloadCount" +<histogram name="PageLoad.Clients.DocWrite.Block.ReloadCount" units="units" expires_after="M77"> <owner>shivanisha@chromium.org</owner> <owner>bmcquade@chromium.org</owner> @@ -96205,7 +96624,8 @@ </summary> </histogram> -<histogram base="true" name="PageLoad.Cpu" expires_after="2020-01-05"> +<histogram base="true" name="PageLoad.Cpu" units="units" + expires_after="2020-01-05"> <owner>ericrobinson@chromium.org</owner> <owner>csharrison@chromium.org</owner> <summary> @@ -98657,7 +99077,7 @@ </histogram> <histogram name="PageSerialization.ProblemDetection.TotalCSSCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dimich@chromium.org</owner> <summary> Total number of CSS elements in the main frame for serialization. @@ -98665,7 +99085,7 @@ </histogram> <histogram name="PageSerialization.ProblemDetection.TotalImageCount" - expires_after="M77"> + units="units" expires_after="M77"> <owner>dimich@chromium.org</owner> <summary>Total number of images in the main frame for serialization.</summary> </histogram> @@ -99056,7 +99476,7 @@ </summary> </histogram> -<histogram name="PasswordHash.CreateTime"> +<histogram name="PasswordHash.CreateTime" units="units"> <owner>mlerman@chromium.org</owner> <summary> Time required to create the local hash of the user's GAIA password. @@ -99162,7 +99582,7 @@ </summary> </histogram> -<histogram name="PasswordManager.AccountsPerSite"> +<histogram name="PasswordManager.AccountsPerSite" units="units"> <owner>dvadym@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -99480,7 +99900,8 @@ </summary> </histogram> -<histogram name="PasswordManager.BlacklistedSites" expires_after="M76"> +<histogram name="PasswordManager.BlacklistedSites" units="units" + expires_after="M76"> <obsolete> Deprecated in M76 in favor of PasswordManager.BlacklistedSitesHiRes. </obsolete> @@ -99543,7 +99964,7 @@ </summary> </histogram> -<histogram name="PasswordManager.BlacklistedSitesHiRes"> +<histogram name="PasswordManager.BlacklistedSitesHiRes" units="units"> <owner>jdoerrie@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -99590,7 +100011,7 @@ </histogram> <histogram name="PasswordManager.ButtonTitlePerformance.HasFormTag" - expires_after="2019-07-01"> + units="units" expires_after="2019-07-01"> <owner>kolos@chromium.org</owner> <summary> The time (ms) it takes to infer button titles within a form tag. @@ -99598,7 +100019,7 @@ </histogram> <histogram name="PasswordManager.ButtonTitlePerformance.NoFormTag" - expires_after="2019-07-01"> + units="units" expires_after="2019-07-01"> <owner>kolos@chromium.org</owner> <summary> The time (ms) it takes to infer button titles outside of form tags. @@ -99629,7 +100050,7 @@ </summary> </histogram> -<histogram name="PasswordManager.CleanedUpPasswords"> +<histogram name="PasswordManager.CleanedUpPasswords" units="units"> <owner>vasilii@chromium.org</owner> <summary> Collects positive number of undecryptable passwords that were successfully @@ -99639,7 +100060,8 @@ </summary> </histogram> -<histogram name="PasswordManager.CredentialsWithDuplicates" expires_after="M80"> +<histogram name="PasswordManager.CredentialsWithDuplicates" units="units" + expires_after="M80"> <owner>dvadym@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -99654,7 +100076,7 @@ </histogram> <histogram name="PasswordManager.CredentialsWithMismatchedDuplicates" - expires_after="M80"> + units="units" expires_after="M80"> <owner>dvadym@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -99688,7 +100110,7 @@ </summary> </histogram> -<histogram name="PasswordManager.DropdownShown.OffTheRecord" +<histogram name="PasswordManager.DropdownShown.OffTheRecord" units="units" expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> @@ -99698,7 +100120,8 @@ </summary> </histogram> -<histogram name="PasswordManager.DynamicFormChanges" expires_after="M82"> +<histogram name="PasswordManager.DynamicFormChanges" units="units" + expires_after="M82"> <owner>battre@chromium.org</owner> <owner>dvadym@chromium.org</owner> <summary> @@ -99720,7 +100143,7 @@ </summary> </histogram> -<histogram name="PasswordManager.EmptyUsernames.CountInDatabase" +<histogram name="PasswordManager.EmptyUsernames.CountInDatabase" units="units" expires_after="M82"> <owner>vasilii@chromium.org</owner> <summary> @@ -99766,7 +100189,7 @@ </histogram> <histogram name="PasswordManager.EmptyUsernames.PasswordFieldCount" - expires_after="2018-09-06"> + units="units" expires_after="2018-09-06"> <obsolete> Deprecated as of 09/2018. The investigation this metric was supporting has been concluded in 2016. @@ -99782,7 +100205,7 @@ </histogram> <histogram name="PasswordManager.EmptyUsernames.TextAndPasswordFieldCount" - expires_after="2018-09-06"> + units="units" expires_after="2018-09-06"> <obsolete> Deprecated as of 09/2018. The investigation this metric was supporting has been concluded in 2016. @@ -99797,7 +100220,8 @@ </summary> </histogram> -<histogram name="PasswordManager.EmptyUsernames.WithoutCorrespondingNonempty"> +<histogram name="PasswordManager.EmptyUsernames.WithoutCorrespondingNonempty" + units="units"> <obsolete> Deprecated as of 06/2019. </obsolete> @@ -99821,7 +100245,7 @@ </summary> </histogram> -<histogram name="PasswordManager.ExportedPasswordsPerUserInCSV"> +<histogram name="PasswordManager.ExportedPasswordsPerUserInCSV" units="units"> <obsolete> Deprecated as of 2019/07. Password exporting has been rolled out. </obsolete> @@ -99970,7 +100394,7 @@ </histogram> <histogram name="PasswordManager.GooglePasswordManager.TimeToFailure" - expires_after="2019-12-31"> + units="units" expires_after="2019-12-31"> <owner>jdoerrie@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -99982,7 +100406,7 @@ </histogram> <histogram name="PasswordManager.GooglePasswordManager.TimeToSuccess" - expires_after="2019-12-31"> + units="units" expires_after="2019-12-31"> <owner>jdoerrie@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -100079,7 +100503,7 @@ </summary> </histogram> -<histogram name="PasswordManager.ImportedPasswordsPerUserInCSV"> +<histogram name="PasswordManager.ImportedPasswordsPerUserInCSV" units="units"> <owner>vasilii@chromium.org</owner> <summary>The number of passwords imported in CSV format per user</summary> </histogram> @@ -100149,7 +100573,8 @@ </summary> </histogram> -<histogram name="PasswordManager.ItemSelected.OffTheRecord" expires_after="M85"> +<histogram name="PasswordManager.ItemSelected.OffTheRecord" units="units" + expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -100159,7 +100584,8 @@ </histogram> <histogram - name="PasswordManager.KeychainMigration.NumChromeOwnedInaccessiblePasswords"> + name="PasswordManager.KeychainMigration.NumChromeOwnedInaccessiblePasswords" + units="units"> <obsolete> Deprecated as of 09/2016. </obsolete> @@ -100170,7 +100596,8 @@ </summary> </histogram> -<histogram name="PasswordManager.KeychainMigration.NumFailedPasswords"> +<histogram name="PasswordManager.KeychainMigration.NumFailedPasswords" + units="units"> <obsolete> Deprecated as of 06/2019. </obsolete> @@ -100182,7 +100609,8 @@ </summary> </histogram> -<histogram name="PasswordManager.KeychainMigration.NumPasswordsOnFailure"> +<histogram name="PasswordManager.KeychainMigration.NumPasswordsOnFailure" + units="units"> <obsolete> Deprecated as of 06/2019. </obsolete> @@ -100385,7 +100813,7 @@ </histogram> <histogram name="PasswordManager.LinuxBackendMigration.TimeIntoEncrypted" - expires_after="2019-11-01"> + units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> <summary> @@ -100397,7 +100825,7 @@ </histogram> <histogram name="PasswordManager.LinuxBackendMigration.TimeIntoNative" - expires_after="2019-11-01"> + units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> <summary> @@ -100408,7 +100836,8 @@ </summary> </histogram> -<histogram name="PasswordManager.LinuxBackendStatistics" expires_after="M77"> +<histogram name="PasswordManager.LinuxBackendStatistics" units="units" + expires_after="M77"> <obsolete> Removed 07/2019. </obsolete> @@ -100420,7 +100849,7 @@ </summary> </histogram> -<histogram name="PasswordManager.LoginDatabaseFailedVersion" +<histogram name="PasswordManager.LoginDatabaseFailedVersion" units="units" expires_after="M77"> <obsolete> Deprecated 06/2019. @@ -100545,7 +100974,7 @@ </summary> </histogram> -<histogram name="PasswordManager.NumPasswordsDeletedByBulkDelete" +<histogram name="PasswordManager.NumPasswordsDeletedByBulkDelete" units="units" expires_after="M77"> <obsolete> Deprecated as of 06/2019. @@ -100557,7 +100986,8 @@ </summary> </histogram> -<histogram name="PasswordManager.NumPasswordsDeletedDuringRollback"> +<histogram name="PasswordManager.NumPasswordsDeletedDuringRollback" + units="units"> <obsolete> Deprecated as of 06/2019. </obsolete> @@ -100568,7 +100998,7 @@ </histogram> <histogram name="PasswordManager.NumPasswordsDeletedWhenBlacklisting" - expires_after="2015-08-19"> + units="units" expires_after="2015-08-19"> <obsolete> Deprecated as of 08/2015. </obsolete> @@ -100579,7 +101009,7 @@ </summary> </histogram> -<histogram name="PasswordManager.NumPasswordsNotShown"> +<histogram name="PasswordManager.NumPasswordsNotShown" units="units"> <owner>dvadym@chromium.org</owner> <summary> The password manager only shows those credentials that are considered the @@ -100861,7 +101291,7 @@ </summary> </histogram> -<histogram name="PasswordManager.RemovedCorruptedPasswords"> +<histogram name="PasswordManager.RemovedCorruptedPasswords" units="units"> <owner>vasilii@chromium.org</owner> <summary> Collects positive number of inaccessible passwords that were successfully @@ -100916,7 +101346,7 @@ </histogram> <histogram name="PasswordManager.SavedEnterprisePasswordHashCount" - expires_after="M85"> + units="units" expires_after="M85"> <owner>dvadym@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -101119,7 +101549,7 @@ </summary> </histogram> -<histogram name="PasswordManager.SignInPromoCountTilClick" +<histogram name="PasswordManager.SignInPromoCountTilClick" units="units" expires_after="2016-12-16"> <obsolete> Deprecated as of 12/16/16. New statistic is @@ -101132,7 +101562,7 @@ </summary> </histogram> -<histogram name="PasswordManager.SignInPromoCountTilNoThanks"> +<histogram name="PasswordManager.SignInPromoCountTilNoThanks" units="units"> <obsolete> Deprecated as of 06/19. </obsolete> @@ -101143,7 +101573,8 @@ </summary> </histogram> -<histogram name="PasswordManager.SignInPromoCountTilSignIn" expires_after="M77"> +<histogram name="PasswordManager.SignInPromoCountTilSignIn" units="units" + expires_after="M77"> <obsolete> Deprecated as of 06/19. </obsolete> @@ -101154,7 +101585,8 @@ </summary> </histogram> -<histogram name="PasswordManager.SignInPromoDismissalCount" expires_after="M77"> +<histogram name="PasswordManager.SignInPromoDismissalCount" units="units" + expires_after="M77"> <obsolete> Deprecated as of 06/19. </obsolete> @@ -101186,7 +101618,7 @@ </summary> </histogram> -<histogram name="PasswordManager.StorePerformance.AddLogin" +<histogram name="PasswordManager.StorePerformance.AddLogin" units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> @@ -101196,7 +101628,7 @@ </summary> </histogram> -<histogram name="PasswordManager.StorePerformance.GetLogin" +<histogram name="PasswordManager.StorePerformance.GetLogin" units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> @@ -101206,7 +101638,7 @@ </summary> </histogram> -<histogram name="PasswordManager.StorePerformance.GetLogins" +<histogram name="PasswordManager.StorePerformance.GetLogins" units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> @@ -101216,7 +101648,7 @@ </summary> </histogram> -<histogram name="PasswordManager.StorePerformance.RemoveLogin" +<histogram name="PasswordManager.StorePerformance.RemoveLogin" units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> @@ -101226,7 +101658,7 @@ </summary> </histogram> -<histogram name="PasswordManager.StorePerformance.UpdateLogin" +<histogram name="PasswordManager.StorePerformance.UpdateLogin" units="units" expires_after="2019-11-01"> <owner>cfroussios@chromium.org</owner> <owner>dvadym@chromium.org</owner> @@ -101414,7 +101846,7 @@ </summary> </histogram> -<histogram name="PasswordManager.TimesGeneratedPasswordUsed" +<histogram name="PasswordManager.TimesGeneratedPasswordUsed" units="units" expires_after="2014-11-18"> <obsolete> Deprecated as of 11/11/14. New statistic is @@ -101427,7 +101859,7 @@ </summary> </histogram> -<histogram name="PasswordManager.TimesPasswordUsed"> +<histogram name="PasswordManager.TimesPasswordUsed" units="units"> <owner>battre@chromium.org</owner> <owner>dvadym@chromium.org</owner> <summary> @@ -101437,7 +101869,8 @@ </summary> </histogram> -<histogram base="true" name="PasswordManager.TotalAccounts" expires_after="M76"> +<histogram base="true" name="PasswordManager.TotalAccounts" units="units" + expires_after="M76"> <obsolete> Deprecated in M76 in favor of PasswordManager.TotalAccountsHiRes.ByType. </obsolete> @@ -101450,7 +101883,8 @@ </summary> </histogram> -<histogram base="true" name="PasswordManager.TotalAccountsHiRes.ByType"> +<histogram base="true" name="PasswordManager.TotalAccountsHiRes.ByType" + units="units"> <owner>battre@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -101681,7 +102115,7 @@ </summary> </histogram> -<histogram name="PasswordProtection.PageZoomFactor"> +<histogram name="PasswordProtection.PageZoomFactor" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -102009,28 +102443,28 @@ </summary> </histogram> -<histogram name="PaymentRequest.NumberOfSelectionAdds"> +<histogram name="PaymentRequest.NumberOfSelectionAdds" units="units"> <owner>sebsg@chromium.org</owner> <summary> The number of times the user added an entry during a Payment Request. </summary> </histogram> -<histogram name="PaymentRequest.NumberOfSelectionChanges"> +<histogram name="PaymentRequest.NumberOfSelectionChanges" units="units"> <owner>sebsg@chromium.org</owner> <summary> The number of times the user changed an entry during a Payment Request. </summary> </histogram> -<histogram name="PaymentRequest.NumberOfSelectionEdits"> +<histogram name="PaymentRequest.NumberOfSelectionEdits" units="units"> <owner>sebsg@chromium.org</owner> <summary> The number of times the user edited an entry during a Payment Request. </summary> </histogram> -<histogram name="PaymentRequest.NumberOfSuggestionsShown"> +<histogram name="PaymentRequest.NumberOfSuggestionsShown" units="units"> <owner>sebsg@chromium.org</owner> <summary> The number of suggestions shown to the user during a payment request. @@ -102485,7 +102919,7 @@ </summary> </histogram> -<histogram name="PerformanceManager.FramesPerRendererByTime" +<histogram name="PerformanceManager.FramesPerRendererByTime" units="units" expires_after="2019-09-30"> <owner>chrisha@chromium.org</owner> <owner>catan-team@chromium.org</owner> @@ -102497,7 +102931,7 @@ </histogram> <histogram name="PerformanceManager.SiteInstancesPerRendererByTime" - expires_after="2019-09-30"> + units="units" expires_after="2019-09-30"> <owner>chrisha@chromium.org</owner> <owner>catan-team@chromium.org</owner> <summary> @@ -102810,7 +103244,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Accepted.PriorDismissCount"> +<histogram name="Permissions.Prompt.Accepted.PriorDismissCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102821,7 +103255,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Accepted.PriorIgnoreCount"> +<histogram name="Permissions.Prompt.Accepted.PriorIgnoreCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102856,7 +103290,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Denied.PriorDismissCount"> +<histogram name="Permissions.Prompt.Denied.PriorDismissCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102867,7 +103301,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Denied.PriorIgnoreCount"> +<histogram name="Permissions.Prompt.Denied.PriorIgnoreCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102878,7 +103312,8 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.DismissCount" expires_after="2016-08-23"> +<histogram name="Permissions.Prompt.DismissCount" units="units" + expires_after="2016-08-23"> <obsolete> Renamed to Permissions.Prompt.Dismissed.PriorDismissCount on 17 August 2016. </obsolete> @@ -102894,7 +103329,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Dismissed.PriorDismissCount"> +<histogram name="Permissions.Prompt.Dismissed.PriorDismissCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102905,7 +103340,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Dismissed.PriorIgnoreCount"> +<histogram name="Permissions.Prompt.Dismissed.PriorIgnoreCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102916,7 +103351,8 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.IgnoreCount" expires_after="2016-08-23"> +<histogram name="Permissions.Prompt.IgnoreCount" units="units" + expires_after="2016-08-23"> <obsolete> Renamed to Permissions.Prompt.Dismissed.PriorDismissCount on 17 August 2016. </obsolete> @@ -102932,7 +103368,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Ignored.PriorDismissCount"> +<histogram name="Permissions.Prompt.Ignored.PriorDismissCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102943,7 +103379,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.Ignored.PriorIgnoreCount"> +<histogram name="Permissions.Prompt.Ignored.PriorIgnoreCount" units="units"> <owner>dominickn@chromium.org</owner> <owner>kcarattini@chromium.org</owner> <summary> @@ -102996,7 +103432,7 @@ </summary> </histogram> -<histogram name="Permissions.Prompt.RequestsPerPrompt" +<histogram name="Permissions.Prompt.RequestsPerPrompt" units="units" expires_after="2017-11-08"> <obsolete> Redundant since M61 (bug 728483) as we now only merge Mic+Camera. The same @@ -103321,7 +103757,7 @@ </summary> </histogram> -<histogram name="Platform.AsvGroup" expires_after="2018-08-30"> +<histogram name="Platform.AsvGroup" units="units" expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> Chrome OS (ARM Chromebooks using Exynos 5250 only) Adaptive Support Voltage @@ -103368,7 +103804,8 @@ </summary> </histogram> -<histogram name="Platform.BootSectorsRead" expires_after="2020-07-02"> +<histogram name="Platform.BootSectorsRead" units="units" + expires_after="2020-07-02"> <owner>sonnyrao@chromium.org</owner> <owner>chromeos-performance@google.com</owner> <summary> @@ -103377,7 +103814,8 @@ </summary> </histogram> -<histogram name="Platform.BootSectorsWritten" expires_after="2020-07-02"> +<histogram name="Platform.BootSectorsWritten" units="units" + expires_after="2020-07-02"> <owner>sonnyrao@chromium.org</owner> <owner>chromeos-performance@google.com</owner> <summary> @@ -103386,7 +103824,8 @@ </summary> </histogram> -<histogram name="Platform.Cast.MeminfoMemAvailable" expires_after="2018-12-05"> +<histogram name="Platform.Cast.MeminfoMemAvailable" units="units" + expires_after="2018-12-05"> <obsolete> Removed 11/2018 in favor of Platform.Cast.MeminfoMemAvailable2 with a larger range. @@ -103407,7 +103846,7 @@ </summary> </histogram> -<histogram name="Platform.Cast.MeminfoMemFreeDerived" +<histogram name="Platform.Cast.MeminfoMemFreeDerived" units="units" expires_after="2018-12-05"> <obsolete> Removed 11/2018 in favor of Platform.Cast.MeminfoMemFreeDerived2 with a @@ -103706,7 +104145,7 @@ </summary> </histogram> -<histogram name="Platform.DiskUsage.OldestUserOnDevice"> +<histogram name="Platform.DiskUsage.OldestUserOnDevice" units="units"> <owner>achuith@chromium.org</owner> <owner>omrilio@chromium.org</owner> <summary> @@ -103715,7 +104154,7 @@ </summary> </histogram> -<histogram name="Platform.DiskUsage.UsersOnDevice"> +<histogram name="Platform.DiskUsage.UsersOnDevice" units="units"> <owner>achuith@chromium.org</owner> <owner>omrilio@chromium.org</owner> <summary> @@ -103750,7 +104189,7 @@ </summary> </histogram> -<histogram name="Platform.FileSystem.ErrorCount"> +<histogram name="Platform.FileSystem.ErrorCount" units="units"> <owner>gwendal@google.com</owner> <summary> Number of file system errors, as reported by dumpe2fs "FS Error @@ -103852,7 +104291,8 @@ </summary> </histogram> -<histogram name="Platform.KernelWarningHashes" expires_after="2018-08-30"> +<histogram name="Platform.KernelWarningHashes" units="units" + expires_after="2018-08-30"> <obsolete> Removed 8/2019 due to lack of usage. </obsolete> @@ -103868,7 +104308,8 @@ </summary> </histogram> -<histogram name="Platform.LogicalCpuCount" expires_after="2020-07-02"> +<histogram name="Platform.LogicalCpuCount" units="units" + expires_after="2020-07-02"> <owner>sonnyrao@chromium.org</owner> <owner>chromeos-performance@google.com</owner> <summary> @@ -103984,7 +104425,7 @@ </summary> </histogram> -<histogram name="Platform.MemuseAnon0"> +<histogram name="Platform.MemuseAnon0" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kouhei@chromium.org</owner> <summary> @@ -103993,7 +104434,7 @@ </summary> </histogram> -<histogram name="Platform.MemuseAnon1"> +<histogram name="Platform.MemuseAnon1" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kouhei@chromium.org</owner> <summary> @@ -104002,7 +104443,7 @@ </summary> </histogram> -<histogram name="Platform.MemuseAnon2"> +<histogram name="Platform.MemuseAnon2" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kouhei@chromium.org</owner> <summary> @@ -104011,7 +104452,7 @@ </summary> </histogram> -<histogram name="Platform.MemuseAnon3"> +<histogram name="Platform.MemuseAnon3" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kouhei@chromium.org</owner> <summary> @@ -104020,7 +104461,7 @@ </summary> </histogram> -<histogram name="Platform.MemuseAnon4"> +<histogram name="Platform.MemuseAnon4" units="units"> <owner>hajimehoshi@chromium.org</owner> <owner>kouhei@chromium.org</owner> <summary> @@ -104080,7 +104521,7 @@ </summary> </histogram> -<histogram name="Platform.ReadSectorsLong"> +<histogram name="Platform.ReadSectorsLong" units="units"> <owner>gwendal@google.com</owner> <summary> Number of disk sectors per second read by Chrome OS in a long interval @@ -104088,7 +104529,7 @@ </summary> </histogram> -<histogram name="Platform.ReadSectorsShort"> +<histogram name="Platform.ReadSectorsShort" units="units"> <owner>gwendal@google.com</owner> <summary> Number of disk sectors per second read by Chrome OS in a short interval @@ -104096,7 +104537,8 @@ </summary> </histogram> -<histogram name="Platform.ServiceFailureHashes" expires_after="M77"> +<histogram name="Platform.ServiceFailureHashes" units="units" + expires_after="M77"> <obsolete> Removed 8/2019 due to lack of usage. </obsolete> @@ -104109,17 +104551,19 @@ </summary> </histogram> -<histogram name="Platform.SmartTransferErrors" expires_after="2030-07-08"> +<histogram name="Platform.SmartTransferErrors" units="units" + expires_after="2030-07-08"> <owner>gwendal@google.com</owner> <summary>Disk communication errors (SMART 199), sent at boot.</summary> </histogram> -<histogram name="Platform.SmartUncorrectableErrors" expires_after="2030-07-08"> +<histogram name="Platform.SmartUncorrectableErrors" units="units" + expires_after="2030-07-08"> <owner>gwendal@google.com</owner> <summary>Uncorrectable disk errors (SMART 187), sent at boot.</summary> </histogram> -<histogram name="Platform.SpringChargerType" expires_after="M77"> +<histogram name="Platform.SpringChargerType" units="units" expires_after="M77"> <owner>vpalatin@google.com</owner> <summary> USB device ID of the charger plugged into a Spring device (if any), sent @@ -104159,7 +104603,7 @@ </summary> </histogram> -<histogram name="Platform.Storage.Flash.BadBlocks"> +<histogram name="Platform.Storage.Flash.BadBlocks" units="units"> <owner>dehrenberg@chromium.org</owner> <owner>cast-analytics@google.com</owner> <summary> @@ -105209,7 +105653,7 @@ </summary> </histogram> -<histogram name="Platform.TPM.DictionaryAttackCounter"> +<histogram name="Platform.TPM.DictionaryAttackCounter" units="units"> <owner>apronin@chromium.org</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary> @@ -105284,7 +105728,8 @@ </summary> </histogram> -<histogram name="Platform.Tps65090Retries" expires_after="2016-04-29"> +<histogram name="Platform.Tps65090Retries" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -105336,7 +105781,7 @@ </summary> </histogram> -<histogram name="Platform.Vpd.UnknownKeys"> +<histogram name="Platform.Vpd.UnknownKeys" units="units"> <owner>tnagel@chromium.org</owner> <summary> Number of unknown RW_VPD entries on Chrome OS, sent once per boot. @@ -105352,7 +105797,8 @@ </summary> </histogram> -<histogram name="Platform.WiFiDisapppearedFromPCI" expires_after="2019-12-31"> +<histogram name="Platform.WiFiDisapppearedFromPCI" units="units" + expires_after="2019-12-31"> <owner>rajatja@chromium.org</owner> <owner>kirtika@chromium.org</owner> <owner>chromeos-kernel-wifi@google.com</owner> @@ -105375,7 +105821,7 @@ </summary> </histogram> -<histogram name="Platform.WriteSectorsLong"> +<histogram name="Platform.WriteSectorsLong" units="units"> <owner>gwendal@google.com</owner> <summary> Number of disk sectors per second written by Chrome OS in a long interval @@ -105383,7 +105829,7 @@ </summary> </histogram> -<histogram name="Platform.WriteSectorsShort"> +<histogram name="Platform.WriteSectorsShort" units="units"> <owner>gwendal@google.com</owner> <summary> Number of disk sectors per second written by Chrome OS in a short interval @@ -105947,7 +106393,7 @@ <summary>PLT.BeginToFinish, but for pages fetched over a SPDY proxy.</summary> </histogram> -<histogram name="PLT.BeginToFinishDoc" expires_after="2016-08-02"> +<histogram name="PLT.BeginToFinishDoc" units="units" expires_after="2016-08-02"> <obsolete> Use PageLoad.DocumentTiming.NavigationToDOMContentLoadedEventFired instead. </obsolete> @@ -106796,7 +107242,8 @@ </summary> </histogram> -<histogram name="PLT.StartToFinish.NoProxy.http" expires_after="2014-07-08"> +<histogram name="PLT.StartToFinish.NoProxy.http" units="units" + expires_after="2014-07-08"> <obsolete> Deprecated as of 07/2014. </obsolete> @@ -106804,7 +107251,8 @@ <summary>StartToFinish times when using http and no proxy.</summary> </histogram> -<histogram name="PLT.StartToFinish.NoProxy.https" expires_after="2014-07-08"> +<histogram name="PLT.StartToFinish.NoProxy.https" units="units" + expires_after="2014-07-08"> <obsolete> Deprecated as of 07/2014. </obsolete> @@ -106812,7 +107260,8 @@ <summary>StartToFinish times when using https and no proxy.</summary> </histogram> -<histogram name="PLT.StartToFinish.Proxy.http" expires_after="2014-07-08"> +<histogram name="PLT.StartToFinish.Proxy.http" units="units" + expires_after="2014-07-08"> <obsolete> Deprecated as of 07/2014. </obsolete> @@ -106820,7 +107269,8 @@ <summary>StartToFinish times when using http over a proxy.</summary> </histogram> -<histogram name="PLT.StartToFinish.Proxy.https" expires_after="2014-07-08"> +<histogram name="PLT.StartToFinish.Proxy.https" units="units" + expires_after="2014-07-08"> <obsolete> Deprecated as of 07/2014. </obsolete> @@ -106898,7 +107348,8 @@ <summary>Width of Flash plugins users click at least once.</summary> </histogram> -<histogram name="Plugin.Flash.Engagement" expires_after="2017-12-13"> +<histogram name="Plugin.Flash.Engagement" units="units" + expires_after="2017-12-13"> <obsolete> Deprecated 12/2017 in Issue 781644 as we no longer use Site Engagement Index as a signal for Flash display. @@ -107363,7 +107814,7 @@ </summary> </histogram> -<histogram name="Power.BitfixChunks" expires_after="M77"> +<histogram name="Power.BitfixChunks" units="units" expires_after="M77"> <owner>dianders@chromium.org</owner> <summary> Chrome OS (Snow RO firmware 2695.90.0 only) number of 8K chunks that were @@ -107372,7 +107823,7 @@ </summary> </histogram> -<histogram name="Power.BitfixFixes" expires_after="M77"> +<histogram name="Power.BitfixFixes" units="units" expires_after="M77"> <owner>dianders@chromium.org</owner> <summary> Chrome OS (Snow RO firmware 2695.90.0 only) number of 4-byte words that were @@ -107489,7 +107940,8 @@ </summary> </histogram> -<histogram name="Power.DarkResumeWakeupsPerHour" expires_after="2020-01-26"> +<histogram name="Power.DarkResumeWakeupsPerHour" units="units" + expires_after="2020-01-26"> <owner>chirantan@chromium.org</owner> <summary> The number of times a system woke up in dark resume in an hour. Note that @@ -107777,7 +108229,7 @@ </summary> </histogram> -<histogram name="Power.MilliConsumptionPerHourIosOnActive" +<histogram name="Power.MilliConsumptionPerHourIosOnActive" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -107793,7 +108245,7 @@ </summary> </histogram> -<histogram name="Power.MilliConsumptionPerHourOthers" +<histogram name="Power.MilliConsumptionPerHourOthers" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -107809,7 +108261,8 @@ </summary> </histogram> -<histogram name="Power.MilliConsumptionPerHourP2P" expires_after="2016-04-29"> +<histogram name="Power.MilliConsumptionPerHourP2P" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -107824,7 +108277,7 @@ </summary> </histogram> -<histogram name="Power.MilliConsumptionPerHourServer" +<histogram name="Power.MilliConsumptionPerHourServer" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -107840,7 +108293,8 @@ </summary> </histogram> -<histogram name="Power.NumberOfAlsAdjustmentsPerSession" expires_after="M100"> +<histogram name="Power.NumberOfAlsAdjustmentsPerSession" units="units" + expires_after="M100"> <owner>tbroch@chromium.org</owner> <owner>jiameng@chromium.org</owner> <summary> @@ -107851,7 +108305,8 @@ </summary> </histogram> -<histogram name="Power.NumberOfSessionsPerCharge" expires_after="2020-01-26"> +<histogram name="Power.NumberOfSessionsPerCharge" units="units" + expires_after="2020-01-26"> <owner>tbroch@chromium.org</owner> <summary> The number of user sessions that occured since the last time that the device @@ -107936,7 +108391,8 @@ </summary> </histogram> -<histogram name="Power.RetrySuspendCount" expires_after="2014-02-13"> +<histogram name="Power.RetrySuspendCount" units="units" + expires_after="2014-02-13"> <obsolete> Deprecated Feb 2014 by Power.SuspendAttemptsBeforeCancel and Power.SuspendAttemptsBeforeSuccess. @@ -107965,7 +108421,8 @@ </summary> </histogram> -<histogram name="Power.SuspendAttemptsBeforeCancel" expires_after="2020-01-20"> +<histogram name="Power.SuspendAttemptsBeforeCancel" units="units" + expires_after="2020-01-20"> <owner>tbroch@chromium.org</owner> <summary> The number of suspend attempts performed for a single suspend request (e.g. @@ -107975,7 +108432,8 @@ </summary> </histogram> -<histogram name="Power.SuspendAttemptsBeforeSuccess" expires_after="2020-01-20"> +<histogram name="Power.SuspendAttemptsBeforeSuccess" units="units" + expires_after="2020-01-20"> <owner>tbroch@chromium.org</owner> <summary> The number of suspend attempts performed for a single suspend request (e.g. @@ -108045,7 +108503,7 @@ </summary> </histogram> -<histogram name="Power.UserBrightnessAdjustmentsPerSessionOnAC" +<histogram name="Power.UserBrightnessAdjustmentsPerSessionOnAC" units="units" expires_after="M100"> <owner>tbroch@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -108057,7 +108515,7 @@ </histogram> <histogram name="Power.UserBrightnessAdjustmentsPerSessionOnBattery" - expires_after="2020-03-01"> + units="units" expires_after="2020-03-01"> <owner>tbroch@chromium.org</owner> <owner>jiameng@chromium.org</owner> <summary> @@ -108301,7 +108759,8 @@ </summary> </histogram> -<histogram name="Precache.Fetch.FailureReasons" expires_after="2017-07-12"> +<histogram name="Precache.Fetch.FailureReasons" units="units" + expires_after="2017-07-12"> <obsolete> Deprecated July 11 2017. </obsolete> @@ -108875,7 +109334,7 @@ </summary> </histogram> -<histogram name="Prerender.FractionPixelsFinalAtSwapin" +<histogram name="Prerender.FractionPixelsFinalAtSwapin" units="units" expires_after="2014-01-15"> <obsolete> Deprecated Jan 14 2014. @@ -109005,7 +109464,8 @@ </summary> </histogram> -<histogram name="Prerender.LocalVisitDatabaseSize" expires_after="2013-05-15"> +<histogram name="Prerender.LocalVisitDatabaseSize" units="units" + expires_after="2013-05-15"> <obsolete> deprecated Nov 16 2012 </obsolete> @@ -109024,7 +109484,8 @@ </summary> </histogram> -<histogram name="Prerender.ModPagespeedHeader" expires_after="2013-10-21"> +<histogram name="Prerender.ModPagespeedHeader" units="units" + expires_after="2013-10-21"> <obsolete> Deprecated as of 10/2013. </obsolete> @@ -109186,7 +109647,7 @@ </summary> </histogram> -<histogram name="Prerender.OmniboxNavigationsCouldPrerender" +<histogram name="Prerender.OmniboxNavigationsCouldPrerender" units="units" expires_after="M81"> <owner>pasko@chromium.org</owner> <summary> @@ -109200,7 +109661,7 @@ </summary> </histogram> -<histogram name="Prerender.OmniboxNavigationsUsedPrerenderCount" +<histogram name="Prerender.OmniboxNavigationsUsedPrerenderCount" units="units" expires_after="2017-09-06"> <obsolete> Deprecated 2017-09 as prerenders can no longer be 'used' (=='swapped-in'). @@ -109214,7 +109675,8 @@ </summary> </histogram> -<histogram name="Prerender.OmniboxPrerenderCount" expires_after="2017-09-06"> +<histogram name="Prerender.OmniboxPrerenderCount" units="units" + expires_after="2017-09-06"> <obsolete> Deprecated 2017-09. </obsolete> @@ -109576,7 +110038,8 @@ </summary> </histogram> -<histogram name="Prerender.PercentLoadDoneAtSwapin" expires_after="2017-09-06"> +<histogram name="Prerender.PercentLoadDoneAtSwapin" units="units" + expires_after="2017-09-06"> <obsolete> Deprecated 2017-09 as prerenders can no longer be 'used' (=='swapped-in'). </obsolete> @@ -109632,7 +110095,8 @@ </summary> </histogram> -<histogram name="Prerender.PrerenderCountOf3Max" expires_after="2017-03-31"> +<histogram name="Prerender.PrerenderCountOf3Max" units="units" + expires_after="2017-03-31"> <obsolete> Deprecated 2017-03. </obsolete> @@ -109651,7 +110115,8 @@ </summary> </histogram> -<histogram name="Prerender.PrerenderLoadedOnIndex" expires_after="M81"> +<histogram name="Prerender.PrerenderLoadedOnIndex" units="units" + expires_after="M81"> <owner>justincohen@chromium.org</owner> <summary> The last comitted index before a successful preload is committed. Recorded @@ -109671,7 +110136,7 @@ </summary> </histogram> -<histogram name="Prerender.PrerendersPerSessionCount"> +<histogram name="Prerender.PrerendersPerSessionCount" units="units"> <owner>pasko@chromium.org</owner> <summary> The number of sessions that have at least X successful prerenders. Recorded @@ -110906,14 +111371,16 @@ </summary> </histogram> -<histogram name="PrintPreview.ManagePrinters" expires_after="2020-02-23"> +<histogram name="PrintPreview.ManagePrinters" units="units" + expires_after="2020-02-23"> <owner>thestig@chromium.org</owner> <summary> Count the number of requests received to show the manage printers dialog. </summary> </histogram> -<histogram name="PrintPreview.NumberOfPrinters" expires_after="2020-01-26"> +<histogram name="PrintPreview.NumberOfPrinters" units="units" + expires_after="2020-01-26"> <owner>thestig@chromium.org</owner> <summary> Count the total number of printers shown in destination drop down list. @@ -110934,7 +111401,8 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.Initial" expires_after="2020-02-23"> +<histogram name="PrintPreview.PageCount.Initial" units="units" + expires_after="2020-02-23"> <obsolete> Deprecated 07/2019. </obsolete> @@ -110945,7 +111413,8 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.OpenInMacPreview" expires_after="M77"> +<histogram name="PrintPreview.PageCount.OpenInMacPreview" units="units" + expires_after="M77"> <obsolete> Deprecated 07/2019. </obsolete> @@ -110956,7 +111425,7 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintToCloudPrint"> +<histogram name="PrintPreview.PageCount.PrintToCloudPrint" units="units"> <obsolete> Deprecated 07/2019. </obsolete> @@ -110968,7 +111437,7 @@ </histogram> <histogram name="PrintPreview.PageCount.PrintToCloudPrintWebDialog" - expires_after="2016-01-14"> + units="units" expires_after="2016-01-14"> <obsolete> No longer used as of 01/2016. </obsolete> @@ -110979,7 +111448,8 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintToGoogleDrive" expires_after="M77"> +<histogram name="PrintPreview.PageCount.PrintToGoogleDrive" units="units" + expires_after="M77"> <obsolete> Deprecated 07/2019. </obsolete> @@ -110991,7 +111461,7 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintToPDF"> +<histogram name="PrintPreview.PageCount.PrintToPDF" units="units"> <obsolete> Deprecated 07/2019. </obsolete> @@ -111001,7 +111471,7 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintToPrinter" +<histogram name="PrintPreview.PageCount.PrintToPrinter" units="units" expires_after="2020-01-20"> <obsolete> Deprecated 07/2019. @@ -111013,7 +111483,7 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintWithExtension"> +<histogram name="PrintPreview.PageCount.PrintWithExtension" units="units"> <obsolete> Deprecated 07/2019. </obsolete> @@ -111024,7 +111494,7 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.PrintWithPrivet"> +<histogram name="PrintPreview.PageCount.PrintWithPrivet" units="units"> <obsolete> Deprecated 07/2019. </obsolete> @@ -111035,7 +111505,8 @@ </summary> </histogram> -<histogram name="PrintPreview.PageCount.SystemDialog" expires_after="M81"> +<histogram name="PrintPreview.PageCount.SystemDialog" units="units" + expires_after="M81"> <obsolete> Deprecated 07/2019. </obsolete> @@ -111105,7 +111576,7 @@ </histogram> <histogram name="PrintPreview.RegeneratePreviewRequest.BeforeCancel" - expires_after="M77"> + units="units" expires_after="M77"> <owner>thestig@chromium.org</owner> <summary> The number of times regenerate preview requests received before the user @@ -111114,7 +111585,7 @@ </histogram> <histogram name="PrintPreview.RegeneratePreviewRequest.BeforeFirstData" - expires_after="2020-02-23"> + units="units" expires_after="2020-02-23"> <owner>thestig@chromium.org</owner> <summary> The number of times regenerate preview requests received before the first @@ -111123,7 +111594,7 @@ </histogram> <histogram name="PrintPreview.RegeneratePreviewRequest.BeforePrint" - expires_after="2020-02-16"> + units="units" expires_after="2020-02-16"> <owner>thestig@chromium.org</owner> <summary> The number of times regenerate preview requests received before the user @@ -111343,7 +111814,7 @@ </summary> </histogram> -<histogram name="Profile.AppCount" expires_after="M77"> +<histogram name="Profile.AppCount" units="units" expires_after="M77"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary>The number of installed apps when a profile is opened.</summary> </histogram> @@ -111677,7 +112148,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfAccountsPerProfile" expires_after="2020-02-02"> +<histogram name="Profile.NumberOfAccountsPerProfile" units="units" + expires_after="2020-02-02"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -111687,7 +112159,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfActiveProfiles" expires_after="2020-01-26"> +<histogram name="Profile.NumberOfActiveProfiles" units="units" + expires_after="2020-01-26"> <owner>feuunk@chromium.org</owner> <summary> Counts the number of profiles on a user's machine at least every 24 hours @@ -111698,7 +112171,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfManagedProfiles" expires_after="M82"> +<histogram name="Profile.NumberOfManagedProfiles" units="units" + expires_after="M82"> <owner>treib@chromium.org</owner> <owner>michaelpg@chromium.org</owner> <summary> @@ -111724,7 +112198,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfProfiles" expires_after="2020-01-20"> +<histogram name="Profile.NumberOfProfiles" units="units" + expires_after="2020-01-20"> <owner>rogerta@chromium.org</owner> <summary> Counts the number of profiles on a user's machine at least every 24 hours @@ -111735,7 +112210,7 @@ </summary> </histogram> -<histogram name="Profile.NumberOfProfilesAfterAddOrDelete" +<histogram name="Profile.NumberOfProfilesAfterAddOrDelete" units="units" expires_after="2014-01-29"> <obsolete> Deprecated 2013-04-09. No longer tracked. See Profile.NumberOfProfiles. @@ -111747,7 +112222,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfProfilesOnStartup" expires_after="2014-01-29"> +<histogram name="Profile.NumberOfProfilesOnStartup" units="units" + expires_after="2014-01-29"> <obsolete> Deprecated; replaced by Profile.NumberOfProfiles on 2013-04-09. Data are suspect, especially after 2012-02-24: see https://crbug.com/189213. @@ -111758,7 +112234,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfProfilesWithAuthErrors" expires_after="M82"> +<histogram name="Profile.NumberOfProfilesWithAuthErrors" units="units" + expires_after="M82"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -111769,7 +112246,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfSignedInProfiles" expires_after="2020-02-02"> +<histogram name="Profile.NumberOfSignedInProfiles" units="units" + expires_after="2020-02-02"> <owner>rogerta@chromium.org</owner> <summary> Counts the number of signed-in profiles on a user's machine at least every @@ -111780,7 +112258,7 @@ </summary> </histogram> -<histogram name="Profile.NumberOfSignedInProfilesOnStartup" +<histogram name="Profile.NumberOfSignedInProfilesOnStartup" units="units" expires_after="2014-01-29"> <obsolete> Deprecated; replaced by Profile.NumberOfSignedInProfiles on 2013-04-09. @@ -111792,7 +112270,7 @@ </summary> </histogram> -<histogram name="Profile.NumberOfSignedInProfilesWithGAIAIcons" +<histogram name="Profile.NumberOfSignedInProfilesWithGAIAIcons" units="units" expires_after="M82"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> @@ -111805,7 +112283,7 @@ </summary> </histogram> -<histogram name="Profile.NumberOfSwitches" expires_after="M82"> +<histogram name="Profile.NumberOfSwitches" units="units" expires_after="M82"> <owner>anthonyvd@chromium.org</owner> <summary> Counts the number of times profiles were switched in a browser session. This @@ -111814,7 +112292,8 @@ </summary> </histogram> -<histogram name="Profile.NumberOfUnusedProfiles" expires_after="M82"> +<histogram name="Profile.NumberOfUnusedProfiles" units="units" + expires_after="M82"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -111867,7 +112346,8 @@ </summary> </histogram> -<histogram name="Profile.PercentageOfManagedProfiles" expires_after="M82"> +<histogram name="Profile.PercentageOfManagedProfiles" units="units" + expires_after="M82"> <owner>treib@chromium.org</owner> <owner>michaelpg@chromium.org</owner> <summary> @@ -112125,7 +112605,8 @@ </summary> </histogram> -<histogram name="Profile.ValidateMenuItemInvalidIndex.ProfileCount"> +<histogram name="Profile.ValidateMenuItemInvalidIndex.ProfileCount" + units="units"> <owner>anthonyvd@chromium.org</owner> <summary> The count of profiles in the avatar menu when -validateMenuItem in the @@ -112488,7 +112969,8 @@ </summary> </histogram> -<histogram name="PurgeAndSuspend.PendingTaskCount" expires_after="2017-10-11"> +<histogram name="PurgeAndSuspend.PendingTaskCount" units="units" + expires_after="2017-10-11"> <obsolete> Deprecated Oct 2017. </obsolete> @@ -112499,7 +112981,8 @@ </summary> </histogram> -<histogram name="PushMessaging.BackgroundBudget" expires_after="2018-08-30"> +<histogram name="PushMessaging.BackgroundBudget" units="units" + expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> Whenever a Service Worker receives a push message, this records the budget @@ -112548,7 +113031,8 @@ </summary> </histogram> -<histogram name="PushMessaging.QueuedMessagesCount" expires_after="2020-03-01"> +<histogram name="PushMessaging.QueuedMessagesCount" units="units" + expires_after="2020-03-01"> <owner>mamir@chromium.org</owner> <summary> When a message arrives for a lazy subscription and Chrome isn't in the @@ -112578,7 +113062,7 @@ </summary> </histogram> -<histogram name="PushMessaging.SESForLowBudgetOrigin" +<histogram name="PushMessaging.SESForLowBudgetOrigin" units="units" expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> @@ -112587,7 +113071,8 @@ </summary> </histogram> -<histogram name="PushMessaging.SESForNoBudgetOrigin" expires_after="2018-08-30"> +<histogram name="PushMessaging.SESForNoBudgetOrigin" units="units" + expires_after="2018-08-30"> <owner>peter@chromium.org</owner> <summary> When a Service Worker hits zero budget when servicing a push message, this @@ -112666,7 +113151,8 @@ </summary> </histogram> -<histogram name="Quickoffice.csvFormattedCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.csvFormattedCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112675,7 +113161,8 @@ </summary> </histogram> -<histogram name="Quickoffice.csvNonEmptyCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.csvNonEmptyCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112684,7 +113171,8 @@ </summary> </histogram> -<histogram name="Quickoffice.csvSheetCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.csvSheetCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112693,7 +113181,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docPageCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docPageCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112701,7 +113190,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docParagraphCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docParagraphCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112710,7 +113200,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docSectionCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docSectionCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112718,7 +113209,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docxPageCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docxPageCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112726,7 +113218,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docxParagraphCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docxParagraphCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112734,7 +113227,8 @@ </summary> </histogram> -<histogram name="Quickoffice.docxSectionCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.docxSectionCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112766,7 +113260,8 @@ </summary> </histogram> -<histogram name="Quickoffice.pptMasterCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.pptMasterCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112775,7 +113270,8 @@ </summary> </histogram> -<histogram name="Quickoffice.pptSlideCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.pptSlideCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112784,7 +113280,8 @@ </summary> </histogram> -<histogram name="Quickoffice.pptxMasterCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.pptxMasterCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112793,7 +113290,8 @@ </summary> </histogram> -<histogram name="Quickoffice.pptxSlideCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.pptxSlideCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112801,7 +113299,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsFormattedCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsFormattedCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112810,7 +113309,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsNonEmptyCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsNonEmptyCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112819,7 +113319,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsSheetCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsSheetCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112828,7 +113329,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsxFormattedCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsxFormattedCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112837,7 +113339,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsxNonEmptyCellCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsxNonEmptyCellCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112846,7 +113349,8 @@ </summary> </histogram> -<histogram name="Quickoffice.xlsxSheetCount" expires_after="2020-02-29"> +<histogram name="Quickoffice.xlsxSheetCount" units="units" + expires_after="2020-02-29"> <owner>snopanen@google.com</owner> <owner>sdoerner@google.com</owner> <summary> @@ -112881,7 +113385,7 @@ </summary> </histogram> -<histogram name="Quota.DaysBetweenRepeatedOriginEvictions" +<histogram name="Quota.DaysBetweenRepeatedOriginEvictions" units="units" expires_after="2020-02-02"> <owner>jarrydg@chromium.org</owner> <summary> @@ -112910,7 +113414,7 @@ </summary> </histogram> -<histogram name="Quota.ErrorsOnEvictingOriginPerHour" +<histogram name="Quota.ErrorsOnEvictingOriginPerHour" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -112922,7 +113426,7 @@ </summary> </histogram> -<histogram name="Quota.ErrorsOnGettingUsageAndQuotaPerHour" +<histogram name="Quota.ErrorsOnGettingUsageAndQuotaPerHour" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -112942,7 +113446,8 @@ </summary> </histogram> -<histogram name="Quota.EvictedOriginAccessCount" expires_after="2020-02-23"> +<histogram name="Quota.EvictedOriginAccessCount" units="units" + expires_after="2020-02-23"> <owner>jarrydg@chromium.org</owner> <summary> The number of times the evicted origin was accessed. Logged when the origin @@ -112950,7 +113455,8 @@ </summary> </histogram> -<histogram name="Quota.EvictedOriginDaysSinceAccess" expires_after="2020-02-23"> +<histogram name="Quota.EvictedOriginDaysSinceAccess" units="units" + expires_after="2020-02-23"> <owner>jarrydg@chromium.org</owner> <summary> The number of days since the evicted origin was last accessed. Logged when @@ -112958,12 +113464,13 @@ </summary> </histogram> -<histogram name="Quota.EvictedOriginsPerHour"> +<histogram name="Quota.EvictedOriginsPerHour" units="units"> <owner>jarrydg@chromium.org</owner> <summary>Number of evicted origins in an hour.</summary> </histogram> -<histogram name="Quota.EvictedOriginTimeSinceAccess" expires_after="2017-02-06"> +<histogram name="Quota.EvictedOriginTimeSinceAccess" units="units" + expires_after="2017-02-06"> <obsolete/> <owner>calamity@chromium.org</owner> <summary> @@ -112972,7 +113479,8 @@ </summary> </histogram> -<histogram name="Quota.EvictionRoundsPerHour" expires_after="2020-01-20"> +<histogram name="Quota.EvictionRoundsPerHour" units="units" + expires_after="2020-01-20"> <owner>jarrydg@chromium.org</owner> <summary>Number of eviction rounds in an hour.</summary> </histogram> @@ -113023,13 +113531,13 @@ </summary> </histogram> -<histogram name="Quota.NumberOfEvictedOriginsPerRound" +<histogram name="Quota.NumberOfEvictedOriginsPerRound" units="units" expires_after="2020-01-26"> <owner>jarrydg@chromium.org</owner> <summary>Number of evicted origins per round.</summary> </histogram> -<histogram name="Quota.NumberOfPersistentStorageOrigins" +<histogram name="Quota.NumberOfPersistentStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113038,7 +113546,7 @@ <summary>Number of origins using persistent storage.</summary> </histogram> -<histogram name="Quota.NumberOfProtectedPersistentStorageOrigins" +<histogram name="Quota.NumberOfProtectedPersistentStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113047,7 +113555,7 @@ <summary>Number of protected origins using persistent storage.</summary> </histogram> -<histogram name="Quota.NumberOfProtectedTemporaryStorageOrigins" +<histogram name="Quota.NumberOfProtectedTemporaryStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113056,7 +113564,7 @@ <summary>Number of protected origins using temporary storage.</summary> </histogram> -<histogram name="Quota.NumberOfTemporaryStorageOrigins" +<histogram name="Quota.NumberOfTemporaryStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113065,7 +113573,7 @@ <summary>Number of origins using temporary storage.</summary> </histogram> -<histogram name="Quota.NumberOfUnlimitedPersistentStorageOrigins" +<histogram name="Quota.NumberOfUnlimitedPersistentStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113074,7 +113582,7 @@ <summary>Number of unlimited origins using persistent storage.</summary> </histogram> -<histogram name="Quota.NumberOfUnlimitedTemporaryStorageOrigins" +<histogram name="Quota.NumberOfUnlimitedTemporaryStorageOrigins" units="units" expires_after="2019-03-07"> <obsolete> Expired on 2018-08-30. Removed in M74. @@ -113141,7 +113649,8 @@ </summary> </histogram> -<histogram name="Quota.SkippedEvictionRoundsPerHour" expires_after="2018-08-30"> +<histogram name="Quota.SkippedEvictionRoundsPerHour" units="units" + expires_after="2018-08-30"> <owner>jarrydg@chromium.org</owner> <summary>Number of skipped eviction rounds in an hour.</summary> </histogram> @@ -113157,7 +113666,7 @@ </summary> </histogram> -<histogram name="Quota.TimeBetweenRepeatedOriginEvictions" +<histogram name="Quota.TimeBetweenRepeatedOriginEvictions" units="units" expires_after="2017-02-06"> <obsolete/> <owner>calamity@chromium.org</owner> @@ -113167,12 +113676,13 @@ </summary> </histogram> -<histogram name="Quota.TimeDeltaOfEvictionRounds"> +<histogram name="Quota.TimeDeltaOfEvictionRounds" units="units"> <owner>jarrydg@chromium.org</owner> <summary>Time between two consecutive active eviction rounds.</summary> </histogram> -<histogram name="Quota.TimeSpentToAEvictionRound" expires_after="2018-08-30"> +<histogram name="Quota.TimeSpentToAEvictionRound" units="units" + expires_after="2018-08-30"> <owner>jarrydg@chromium.org</owner> <summary>Time spent to an eviction round.</summary> </histogram> @@ -113463,7 +113973,7 @@ </summary> </histogram> -<histogram name="Render.Workers.MaxWorkerCountInRendererProcess" +<histogram name="Render.Workers.MaxWorkerCountInRendererProcess" units="units" expires_after="2016-12-29"> <obsolete> Deprecated Dec 2016. This metric did not report the number of shared workers @@ -113618,7 +114128,7 @@ </summary> </histogram> -<histogram name="Renderer.PixelIncreaseFromTransitions" +<histogram name="Renderer.PixelIncreaseFromTransitions" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -113663,7 +114173,8 @@ </summary> </histogram> -<histogram name="Renderer2.FinishDocToFinish" expires_after="2016-04-29"> +<histogram name="Renderer2.FinishDocToFinish" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113674,7 +114185,8 @@ </summary> </histogram> -<histogram name="Renderer2.RequestToFinish" expires_after="2013-04-25"> +<histogram name="Renderer2.RequestToFinish" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 6/15/09. Replaced by Renderer2.RequestToFinish_L </obsolete> @@ -113685,7 +114197,8 @@ </summary> </histogram> -<histogram name="Renderer2.RequestToFinish_L" expires_after="2016-04-29"> +<histogram name="Renderer2.RequestToFinish_L" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113696,7 +114209,8 @@ </summary> </histogram> -<histogram name="Renderer2.RequestToFirstLayout" expires_after="2016-04-29"> +<histogram name="Renderer2.RequestToFirstLayout" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113706,7 +114220,8 @@ </summary> </histogram> -<histogram name="Renderer2.RequestToStart" expires_after="2016-04-29"> +<histogram name="Renderer2.RequestToStart" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113716,7 +114231,8 @@ </summary> </histogram> -<histogram name="Renderer2.StartToFinish" expires_after="2016-04-29"> +<histogram name="Renderer2.StartToFinish" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113726,7 +114242,8 @@ </summary> </histogram> -<histogram name="Renderer2.StartToFinishDoc" expires_after="2016-04-29"> +<histogram name="Renderer2.StartToFinishDoc" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113737,7 +114254,8 @@ </summary> </histogram> -<histogram name="Renderer2.StartToFirstLayout" expires_after="2016-04-29"> +<histogram name="Renderer2.StartToFirstLayout" units="units" + expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. </obsolete> @@ -113760,7 +114278,7 @@ </summary> </histogram> -<histogram name="Renderer4.AccelContentPaintDurationMS" +<histogram name="Renderer4.AccelContentPaintDurationMS" units="units" expires_after="2014-05-13"> <obsolete> Deprecated 2014-05 because of impl-side painting. @@ -113772,7 +114290,7 @@ </summary> </histogram> -<histogram name="Renderer4.AccelContentPaintMegapixPerSecond" +<histogram name="Renderer4.AccelContentPaintMegapixPerSecond" units="units" expires_after="2014-05-13"> <obsolete> Deprecated 2014-05 because of impl-side painting. @@ -113784,7 +114302,7 @@ </summary> </histogram> -<histogram name="Renderer4.AccelDoDeferredUpdateDelay" +<histogram name="Renderer4.AccelDoDeferredUpdateDelay" units="units" expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. @@ -113793,7 +114311,8 @@ <summary>Time between frames when GPU acceleration is active.</summary> </histogram> -<histogram name="Renderer4.AccelRootPaintDurationMS" expires_after="2019-02-14"> +<histogram name="Renderer4.AccelRootPaintDurationMS" units="units" + expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -113804,7 +114323,7 @@ </summary> </histogram> -<histogram name="Renderer4.AccelRootPaintMegapixPerSecond" +<histogram name="Renderer4.AccelRootPaintMegapixPerSecond" units="units" expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. @@ -113842,7 +114361,8 @@ </summary> </histogram> -<histogram name="Renderer4.BeginToFinish" expires_after="2019-02-14"> +<histogram name="Renderer4.BeginToFinish" units="units" + expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -113850,7 +114370,8 @@ <summary>TBD</summary> </histogram> -<histogram name="Renderer4.BeginToFinishDoc" expires_after="2019-02-14"> +<histogram name="Renderer4.BeginToFinishDoc" units="units" + expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -114107,7 +114628,7 @@ </histogram> <histogram name="Renderer4.GpuImageDecodeState.CachePeakUsagePercent" - expires_after="2020-08-01"> + units="units" expires_after="2020-08-01"> <owner>sashamcintosh@chromium.org</owner> <owner>ericrk@chromium.org</owner> <summary> @@ -114225,7 +114746,8 @@ </summary> </histogram> -<histogram name="Renderer4.IdealContentsScale" expires_after="2018-02-10"> +<histogram name="Renderer4.IdealContentsScale" units="units" + expires_after="2018-02-10"> <obsolete> Deprecated 02/2018. The ideal content scale closely matches the default device scale factor. @@ -114509,7 +115031,7 @@ </summary> </histogram> -<histogram name="Renderer4.renderPassCount"> +<histogram name="Renderer4.renderPassCount" units="units"> <owner>enne@chromium.org</owner> <owner>chrishtr@chromium.org</owner> <summary> @@ -114563,7 +115085,7 @@ </summary> </histogram> -<histogram name="Renderer4.Snapshot" expires_after="2019-02-14"> +<histogram name="Renderer4.Snapshot" units="units" expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -114585,7 +115107,7 @@ </summary> </histogram> -<histogram name="Renderer4.SoftwareDoDeferredUpdateDelay" +<histogram name="Renderer4.SoftwareDoDeferredUpdateDelay" units="units" expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. @@ -114613,7 +115135,8 @@ </summary> </histogram> -<histogram name="Renderer4.SoftwarePaintDurationMS" expires_after="2017-08-21"> +<histogram name="Renderer4.SoftwarePaintDurationMS" units="units" + expires_after="2017-08-21"> <obsolete> Deprecated in issue 755432 as no longer being needed. </obsolete> @@ -114624,7 +115147,7 @@ </summary> </histogram> -<histogram name="Renderer4.SoftwarePaintMegapixPerSecond" +<histogram name="Renderer4.SoftwarePaintMegapixPerSecond" units="units" expires_after="2017-08-21"> <obsolete> Deprecated in issue 755432 as no longer being needed. @@ -114674,7 +115197,8 @@ </summary> </histogram> -<histogram name="Renderer4.TextureGpuUploadTimeUS" expires_after="2019-02-14"> +<histogram name="Renderer4.TextureGpuUploadTimeUS" units="units" + expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -114685,7 +115209,7 @@ </summary> </histogram> -<histogram name="Renderer4.Thumbnail" expires_after="2019-02-14"> +<histogram name="Renderer4.Thumbnail" units="units" expires_after="2019-02-14"> <obsolete> Deprecated at an unknown time. No longer used in code. </obsolete> @@ -116190,7 +116714,8 @@ </summary> </histogram> -<histogram name="ReportingAndNEL.CorruptMetaTable" expires_after="M82"> +<histogram name="ReportingAndNEL.CorruptMetaTable" units="units" + expires_after="M82"> <owner>chlily@chromium.org</owner> <owner>sburnett@chromium.org</owner> <summary> @@ -116200,7 +116725,7 @@ </summary> </histogram> -<histogram name="ReportingAndNEL.CorruptMetaTableRecoveryFailed" +<histogram name="ReportingAndNEL.CorruptMetaTableRecoveryFailed" units="units" expires_after="M82"> <owner>chlily@chromium.org</owner> <owner>sburnett@chromium.org</owner> @@ -116728,7 +117253,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.DbStringTooLong" +<histogram name="ResourcePrefetchPredictor.DbStringTooLong" units="units" expires_after="2016-10-05"> <obsolete> Deprecated October 2016. No longer recorded. @@ -116741,7 +117266,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.HavePredictionsForUrl" +<histogram name="ResourcePrefetchPredictor.HavePredictionsForUrl" units="units" expires_after="2014-10-30"> <obsolete> Deprecated 08/2012. Replaced with ResourcePrefetchPredictorNavigationEvent. @@ -116754,7 +117279,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.HavePrefetchResults" +<histogram name="ResourcePrefetchPredictor.HavePrefetchResults" units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. @@ -116769,7 +117294,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.HistoryVisitCountForUrl" - expires_after="2018-02-28"> + units="units" expires_after="2018-02-28"> <obsolete> Deprecated at M66. No longer recorded. </obsolete> @@ -116782,7 +117307,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Host.PredictedPrefetchCount" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -116798,7 +117323,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Host.PredictedPrefetchFromCache" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -116815,7 +117340,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Host.PredictedPrefetchFromNetwork" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -116849,7 +117374,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Host.PredictedPrefetchMisses" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -116991,7 +117516,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.HostTableHostCount" +<histogram name="ResourcePrefetchPredictor.HostTableHostCount" units="units" expires_after="2017-01-27"> <obsolete> Deprecated January 2017. This is effectively the same as @@ -117007,7 +117532,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.HostTableRowCount" +<histogram name="ResourcePrefetchPredictor.HostTableRowCount" units="units" expires_after="2017-01-27"> <obsolete> Deprecated January 2017. Replaced by @@ -117141,7 +117666,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.PredictedPrefetchCount" - expires_after="2014-10-30"> + units="units" expires_after="2014-10-30"> <obsolete> Deprecated 01/2013. Replaced with specific ones for Url and Host. </obsolete> @@ -117154,7 +117679,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.PredictedPrefetchFromCache" - expires_after="2014-10-30"> + units="units" expires_after="2014-10-30"> <obsolete> Deprecated 01/2013. Replaced with specific ones for Url and Host. </obsolete> @@ -117168,7 +117693,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.PredictedPrefetchFromNetwork" - expires_after="2014-10-30"> + units="units" expires_after="2014-10-30"> <obsolete> Deprecated 01/2013. Replaced with specific ones for Url and Host. </obsolete> @@ -117182,7 +117707,8 @@ </histogram> <histogram - name="ResourcePrefetchPredictor.PredictedPrefetchFromNetworkPercentOfTotalFromNetwork"> + name="ResourcePrefetchPredictor.PredictedPrefetchFromNetworkPercentOfTotalFromNetwork" + units="units"> <obsolete> Deprecated 01/2013. Replaced with specific ones for Url and Host. </obsolete> @@ -117195,7 +117721,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.PredictedPrefetchMisses" - expires_after="2014-10-30"> + units="units" expires_after="2014-10-30"> <obsolete> Deprecated 01/2013. Replaced with specific ones for Url and Host. </obsolete> @@ -117379,7 +117905,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Url.PredictedPrefetchCount" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -117395,7 +117921,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Url.PredictedPrefetchFromCache" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -117412,7 +117938,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Url.PredictedPrefetchFromNetwork" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -117446,7 +117972,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.Url.PredictedPrefetchMisses" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. No longer recorded. </obsolete> @@ -117589,7 +118115,7 @@ </histogram> <histogram name="ResourcePrefetchPredictor.UrlTableMainFrameUrlCount" - expires_after="2016-09-02"> + units="units" expires_after="2016-09-02"> <obsolete> Deprecated September 2016. This is effectively the same as ResourcePrefetchPredictor.UrlTableRowCount2 after refactoring of the @@ -117605,7 +118131,8 @@ </histogram> <histogram - name="ResourcePrefetchPredictor.UrlTableMainFrameUrlsDeletedNotInHistory"> + name="ResourcePrefetchPredictor.UrlTableMainFrameUrlsDeletedNotInHistory" + units="units"> <obsolete> Deprecated October 2012. No longer recorded. </obsolete> @@ -117630,7 +118157,7 @@ </summary> </histogram> -<histogram name="ResourcePrefetchPredictor.UrlTableRowCount" +<histogram name="ResourcePrefetchPredictor.UrlTableRowCount" units="units" expires_after="2017-01-27"> <obsolete> Deprecated January 2017. Replaced by @@ -117726,7 +118253,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.ClientLoadedTime.Active" +<histogram name="ResourceScheduler.ClientLoadedTime.Active" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117741,7 +118268,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.ClientLoadedTime.Background" +<histogram name="ResourceScheduler.ClientLoadedTime.Background" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117756,7 +118283,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.ClientLoadedTime.Other" +<histogram name="ResourceScheduler.ClientLoadedTime.Other" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117772,7 +118299,7 @@ </histogram> <histogram name="ResourceScheduler.ClientLoadedTime.Other.SwitchedToActive" - expires_after="2016-01-29"> + units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 </obsolete> @@ -117923,7 +118450,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.RequestTimeDeferred.Active" +<histogram name="ResourceScheduler.RequestTimeDeferred.Active" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117937,7 +118464,7 @@ </histogram> <histogram name="ResourceScheduler.RequestTimeDeferred.Background" - expires_after="2016-01-29"> + units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 </obsolete> @@ -117949,7 +118476,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.RequestTimeDeferred.Other" +<histogram name="ResourceScheduler.RequestTimeDeferred.Other" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117965,7 +118492,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.RequestTimeThrottled.Active" +<histogram name="ResourceScheduler.RequestTimeThrottled.Active" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -117979,7 +118506,7 @@ </histogram> <histogram name="ResourceScheduler.RequestTimeThrottled.Background" - expires_after="2016-01-29"> + units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 </obsolete> @@ -117991,7 +118518,7 @@ </summary> </histogram> -<histogram name="ResourceScheduler.RequestTimeThrottled.Other" +<histogram name="ResourceScheduler.RequestTimeThrottled.Other" units="units" expires_after="2016-01-29"> <obsolete> Deprecated 1/2016 @@ -118030,7 +118557,8 @@ </summary> </histogram> -<histogram name="RTCQuicStream.ReadIntoAmountBytes" expires_after="M75"> +<histogram name="RTCQuicStream.ReadIntoAmountBytes" units="units" + expires_after="M75"> <obsolete> Removed in M76. </obsolete> @@ -118057,7 +118585,8 @@ </summary> </histogram> -<histogram name="RTCQuicStream.WriteAmountBytes" expires_after="M75"> +<histogram name="RTCQuicStream.WriteAmountBytes" units="units" + expires_after="M75"> <obsolete> Removed in M76. </obsolete> @@ -118378,7 +118907,7 @@ </histogram> <histogram name="SafeBrowsing.NavigationObserver.IPAddressCleanUpCount" - expires_after="2018-09-21"> + units="units" expires_after="2018-09-21"> <obsolete> Deprecated in M71+. </obsolete> @@ -118391,7 +118920,7 @@ </histogram> <histogram name="SafeBrowsing.NavigationObserver.NavigationEventCleanUpCount" - expires_after="2020-07-24"> + units="units" expires_after="2020-07-24"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -118518,7 +119047,7 @@ </summary> </histogram> -<histogram name="SafeBrowsing.ReferrerURLChainSize"> +<histogram name="SafeBrowsing.ReferrerURLChainSize" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -118665,7 +119194,8 @@ </summary> </histogram> -<histogram name="SafeBrowsing.UnverifiedDownloads.AlternateExtensionCount"> +<histogram name="SafeBrowsing.UnverifiedDownloads.AlternateExtensionCount" + units="units"> <owner>dtrainor@chromium.org</owner> <summary> Count of alternate extensions that were supplied when attempting to download @@ -119504,7 +120034,7 @@ </summary> </histogram> -<histogram name="SB.BuildBloom" expires_after="2013-04-25"> +<histogram name="SB.BuildBloom" units="units" expires_after="2013-04-25"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -119595,7 +120125,7 @@ </summary> </histogram> -<histogram name="SB.Update" expires_after="2014-07-09"> +<histogram name="SB.Update" units="units" expires_after="2014-07-09"> <obsolete> Has not been generated for years (7/8/14). </obsolete> @@ -119603,7 +120133,7 @@ <summary>TBD.</summary> </histogram> -<histogram name="SB2.AddPrefixes" expires_after="2018-09-21"> +<histogram name="SB2.AddPrefixes" units="units" expires_after="2018-09-21"> <obsolete> Deprecated after the launch of PVer4 in M57. </obsolete> @@ -119691,7 +120221,8 @@ </summary> </histogram> -<histogram name="SB2.BuildReadOperations" expires_after="2018-09-21"> +<histogram name="SB2.BuildReadOperations" units="units" + expires_after="2018-09-21"> <obsolete> Deprecated after the launch of PVer4 in M57. </obsolete> @@ -119725,7 +120256,8 @@ </summary> </histogram> -<histogram name="SB2.BuildWriteOperations" expires_after="2018-09-21"> +<histogram name="SB2.BuildWriteOperations" units="units" + expires_after="2018-09-21"> <obsolete> Deprecated after the launch of PVer4 in M57. </obsolete> @@ -119872,7 +120404,8 @@ </summary> </histogram> -<histogram name="SB2.DownloadBinhashAddsDeleted" expires_after="2014-02-20"> +<histogram name="SB2.DownloadBinhashAddsDeleted" units="units" + expires_after="2014-02-20"> <obsolete> Deleted in M-34 (February 2014). </obsolete> @@ -119880,7 +120413,8 @@ <summary>Obsolete download BINHASH add chunks deleted.</summary> </histogram> -<histogram name="SB2.DownloadBinhashSubsDeleted" expires_after="2014-02-20"> +<histogram name="SB2.DownloadBinhashSubsDeleted" units="units" + expires_after="2014-02-20"> <obsolete> Deleted in M-34 (February 2014). </obsolete> @@ -119960,7 +120494,7 @@ </summary> </histogram> -<histogram name="SB2.FailedUpdate" expires_after="2013-04-25"> +<histogram name="SB2.FailedUpdate" units="units" expires_after="2013-04-25"> <obsolete> Deprecated, replaced by SB2.DatabaseFailure BROWSE_DB_UPDATE_FINISH. </obsolete> @@ -119998,7 +120532,7 @@ <summary>Which filter file the database loaded from disk.</summary> </histogram> -<histogram name="SB2.FilterMissing" expires_after="2013-04-25"> +<histogram name="SB2.FilterMissing" units="units" expires_after="2013-04-25"> <obsolete> Deprecated, replaced by SB2.DatabaseFailure FILTER_MISSING. </obsolete> @@ -120009,7 +120543,7 @@ </summary> </histogram> -<histogram name="SB2.FilterReadFail" expires_after="2013-04-25"> +<histogram name="SB2.FilterReadFail" units="units" expires_after="2013-04-25"> <obsolete> Deprecated, replaced by SB2.DatabaseFailure FILTER_READ. </obsolete> @@ -120029,7 +120563,7 @@ <summary>The size of the current bloom filter.</summary> </histogram> -<histogram name="SB2.FilterWriteFail" expires_after="2013-04-25"> +<histogram name="SB2.FilterWriteFail" units="units" expires_after="2013-04-25"> <obsolete> Deprecated, replaced by SB2.DatabaseFailure FILTER_WRITE. </obsolete> @@ -120065,7 +120599,7 @@ </summary> </histogram> -<histogram name="SB2.GetHash200" expires_after="2013-04-25"> +<histogram name="SB2.GetHash200" units="units" expires_after="2013-04-25"> <obsolete> Deprecated in favor of SB2.GetHashResult STATUS_200. </obsolete> @@ -120075,7 +120609,7 @@ </summary> </histogram> -<histogram name="SB2.GetHash204" expires_after="2013-04-25"> +<histogram name="SB2.GetHash204" units="units" expires_after="2013-04-25"> <obsolete> Deprecated in favor of SB2.GetHashResult STATUS_204. </obsolete> @@ -120131,7 +120665,8 @@ </summary> </histogram> -<histogram name="SB2.GetHashServerMiss" expires_after="2013-04-25"> +<histogram name="SB2.GetHashServerMiss" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated in favor of SB2.GetHashResult FULL_HASH_* and SB2.BloomFilterFalsePositives. It is unclear if this histogram ever reported @@ -120144,7 +120679,7 @@ </summary> </histogram> -<histogram name="SB2.HandleCorrupt" expires_after="2013-04-25"> +<histogram name="SB2.HandleCorrupt" units="units" expires_after="2013-04-25"> <obsolete> Deprecated, replaced by SB2.DatabaseFailure CORRUPT. </obsolete> @@ -120300,7 +120835,7 @@ <summary>Size of v1 database deleted from client profile.</summary> </histogram> -<histogram name="SB2.OutShardShifts" expires_after="2018-09-21"> +<histogram name="SB2.OutShardShifts" units="units" expires_after="2018-09-21"> <obsolete> Deprecated after the launch of PVer4 in M57. </obsolete> @@ -120401,7 +120936,8 @@ <summary>Time to load one of the PrefixSet files.</summary> </histogram> -<histogram name="SB2.PrefixSetRestoredExcess" expires_after="2013-04-25"> +<histogram name="SB2.PrefixSetRestoredExcess" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -120411,7 +120947,8 @@ </summary> </histogram> -<histogram name="SB2.PrefixSetRestoredShortfall" expires_after="2013-04-25"> +<histogram name="SB2.PrefixSetRestoredShortfall" units="units" + expires_after="2013-04-25"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -120434,7 +120971,8 @@ </summary> </histogram> -<histogram name="SB2.PrefixSetUnsortedDelta" expires_after="2013-04-11"> +<histogram name="SB2.PrefixSetUnsortedDelta" units="units" + expires_after="2013-04-11"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -120444,7 +120982,8 @@ </summary> </histogram> -<histogram name="SB2.PrefixSetUnsortedDifference" expires_after="2013-04-11"> +<histogram name="SB2.PrefixSetUnsortedDifference" units="units" + expires_after="2013-04-11"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -120467,7 +121006,8 @@ </summary> </histogram> -<histogram name="SB2.PrefixSetUnsortedSize" expires_after="2013-04-11"> +<histogram name="SB2.PrefixSetUnsortedSize" units="units" + expires_after="2013-04-11"> <obsolete> Deprecated 9/2012. No longer generated. </obsolete> @@ -120478,7 +121018,8 @@ </summary> </histogram> -<histogram name="SB2.PrefixSetVersionRead" expires_after="2018-09-10"> +<histogram name="SB2.PrefixSetVersionRead" units="units" + expires_after="2018-09-10"> <obsolete> Deprecated in M58 (Aug 2017). No longer generated. </obsolete> @@ -120579,7 +121120,7 @@ </summary> </histogram> -<histogram name="SB2.RemoteCall.InternalErrorStatusCode" +<histogram name="SB2.RemoteCall.InternalErrorStatusCode" units="units" expires_after="2018-06-19"> <obsolete> No longer generated. Replaced by SB2.RemoteCall.InternalErrorStatusCode2 @@ -120808,7 +121349,7 @@ <summary>The instantiation status of the SideEffectFreeWhitelist.</summary> </histogram> -<histogram name="SB2.StoreVersionRead" expires_after="2018-09-21"> +<histogram name="SB2.StoreVersionRead" units="units" expires_after="2018-09-21"> <obsolete> Deprecated after the launch of PVer4 in M57. </obsolete> @@ -120816,7 +121357,7 @@ <summary>Version read from the store file.</summary> </histogram> -<histogram name="SB2.SubPrefixes" expires_after="2018-09-10"> +<histogram name="SB2.SubPrefixes" units="units" expires_after="2018-09-10"> <obsolete> Deprecated in M58 (Aug 2017). No longer generated. </obsolete> @@ -120887,7 +121428,7 @@ </summary> </histogram> -<histogram name="SB2.UpdateUrls" expires_after="2018-09-10"> +<histogram name="SB2.UpdateUrls" units="units" expires_after="2018-09-10"> <obsolete> Deprecated in M58 (Aug 2017). No longer generated. </obsolete> @@ -120895,7 +121436,8 @@ <summary>The number of chunk URLs in an update response.</summary> </histogram> -<histogram name="SB2.VolunteerPrefixesRemoved" expires_after="2014-08-26"> +<histogram name="SB2.VolunteerPrefixesRemoved" units="units" + expires_after="2014-08-26"> <obsolete> The operation this is tracking has been deleted as of 09/2014. </obsolete> @@ -121439,7 +121981,7 @@ </summary> </histogram> -<histogram name="SBClientDownload.SignedOrWhitelistedDownload" +<histogram name="SBClientDownload.SignedOrWhitelistedDownload" units="units" expires_after="2016-03-21"> <obsolete> Deprecated in Chrome 50. Replaced by @@ -121713,7 +122255,7 @@ </histogram> <histogram name="SBClientPhishing.CheckNoPendingClassificationFailed" - expires_after="2015-09-15"> + units="units" expires_after="2015-09-15"> <obsolete> Removed in M47. </obsolete> @@ -121776,7 +122318,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.DOMFeatureFrameRemoved"> +<histogram name="SBClientPhishing.DOMFeatureFrameRemoved" units="units"> <owner>gab@chromium.org</owner> <summary> The number of times that DOM feature extraction finished early because the @@ -121784,7 +122326,8 @@ </summary> </histogram> -<histogram name="SBClientPhishing.DOMFeatureIterations" expires_after="M77"> +<histogram name="SBClientPhishing.DOMFeatureIterations" units="units" + expires_after="M77"> <owner>gab@chromium.org</owner> <summary> The number of iterations that the DOM feature extractor took to finish. @@ -121802,7 +122345,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.DOMFeatureTimeout"> +<histogram name="SBClientPhishing.DOMFeatureTimeout" units="units"> <owner>gab@chromium.org</owner> <summary> The number of phishing classifications that were aborted because DOM feature @@ -121828,7 +122371,7 @@ <summary>Time spent generating the thumbnail.</summary> </histogram> -<histogram name="SBClientPhishing.IllegalFeatureValue"> +<histogram name="SBClientPhishing.IllegalFeatureValue" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -121837,7 +122380,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.InitPrivateNetworksFailed" +<histogram name="SBClientPhishing.InitPrivateNetworksFailed" units="units" expires_after="2014-05-30"> <obsolete> Deprecated in Chrome 37, which now uses //net's internal matching. @@ -121850,7 +122393,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.InvalidWhitelistExpression" +<histogram name="SBClientPhishing.InvalidWhitelistExpression" units="units" expires_after="2013-04-25"> <obsolete> Deprecated 12/2011. Whitelist entries are no longer part of @@ -121884,7 +122427,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.RequestNotSerialized"> +<histogram name="SBClientPhishing.RequestNotSerialized" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -121936,7 +122479,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.TermFeatureBreakIterError"> +<histogram name="SBClientPhishing.TermFeatureBreakIterError" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -121954,7 +122497,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.TermFeatureIterations" +<histogram name="SBClientPhishing.TermFeatureIterations" units="units" expires_after="2020-09-04"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> @@ -121963,7 +122506,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.TermFeatureTimeout" +<histogram name="SBClientPhishing.TermFeatureTimeout" units="units" expires_after="2020-09-04"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> @@ -121983,7 +122526,7 @@ </summary> </histogram> -<histogram name="SBClientPhishing.TooManyFeatures"> +<histogram name="SBClientPhishing.TooManyFeatures" units="units"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -122016,7 +122559,8 @@ </summary> </histogram> -<histogram name="SBDownloadFeedback.ActiveFeedbacks" expires_after="M80"> +<histogram name="SBDownloadFeedback.ActiveFeedbacks" units="units" + expires_after="M80"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <owner>mattm@chromium.org</owner> @@ -122245,7 +122789,7 @@ </summary> </histogram> -<histogram name="SBIRS.IncidentCount" expires_after="M77"> +<histogram name="SBIRS.IncidentCount" units="units" expires_after="M77"> <obsolete> Deprecated 07/2019. </obsolete> @@ -123613,7 +124157,8 @@ </summary> </histogram> -<histogram name="Sdch3.Advertisement_Count" expires_after="2017-09-14"> +<histogram name="Sdch3.Advertisement_Count" units="units" + expires_after="2017-09-14"> <obsolete> Deprecated 2017-9. </obsolete> @@ -123659,7 +124204,8 @@ </summary> </histogram> -<histogram name="Sdch3.DictionaryUseCount" expires_after="2017-09-14"> +<histogram name="Sdch3.DictionaryUseCount" units="units" + expires_after="2017-09-14"> <obsolete> Deprecated 2017-9. </obsolete> @@ -123669,7 +124215,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment2_Decode" expires_after="2014-07-30"> +<histogram name="Sdch3.Experiment2_Decode" units="units" + expires_after="2014-07-30"> <obsolete> Replaced by Sdch3.Experiment3_Holdback. </obsolete> @@ -123681,7 +124228,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment2_Holdback" expires_after="2014-07-30"> +<histogram name="Sdch3.Experiment2_Holdback" units="units" + expires_after="2014-07-30"> <obsolete> Replaced by Sdch3.Experiment3_Holdback. </obsolete> @@ -123693,7 +124241,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment3_Decode" expires_after="2017-09-14"> +<histogram name="Sdch3.Experiment3_Decode" units="units" + expires_after="2017-09-14"> <obsolete> Deprecated 2017-9. </obsolete> @@ -123705,7 +124254,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment3_Holdback" expires_after="2017-09-14"> +<histogram name="Sdch3.Experiment3_Holdback" units="units" + expires_after="2017-09-14"> <obsolete> Deprecated 2017-9. </obsolete> @@ -123717,7 +124267,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment_Decode" expires_after="2014-06-25"> +<histogram name="Sdch3.Experiment_Decode" units="units" + expires_after="2014-06-25"> <obsolete> Replaced by Sdch3.Experiment2_Decode. </obsolete> @@ -123729,7 +124280,8 @@ </summary> </histogram> -<histogram name="Sdch3.Experiment_Holdback" expires_after="2014-06-25"> +<histogram name="Sdch3.Experiment_Holdback" units="units" + expires_after="2014-06-25"> <obsolete> Replaced by Sdch3.Experiment2_Holdback. </obsolete> @@ -123825,7 +124377,8 @@ </summary> </histogram> -<histogram name="Sdch3.FilterUseBeforeDisabling" expires_after="2016-11-10"> +<histogram name="Sdch3.FilterUseBeforeDisabling" units="units" + expires_after="2016-11-10"> <obsolete> Deprecated 2016-11. </obsolete> @@ -123969,7 +124522,8 @@ </summary> </histogram> -<histogram name="Sdch3.Network_Decode_Packets_b" expires_after="2016-11-10"> +<histogram name="Sdch3.Network_Decode_Packets_b" units="units" + expires_after="2016-11-10"> <obsolete> Deprecated 2016-11. </obsolete> @@ -124081,7 +124635,7 @@ </summary> </histogram> -<histogram name="Sdch3.Network_Pass-through_Packets_b" +<histogram name="Sdch3.Network_Pass-through_Packets_b" units="units" expires_after="2016-11-10"> <obsolete> Deprecated 2016-11. @@ -126034,7 +126588,7 @@ </summary> </histogram> -<histogram name="Security.PageInfo.TimeOpen"> +<histogram name="Security.PageInfo.TimeOpen" units="units"> <owner>cthomp@chromium.org</owner> <summary> Records the amount of time the Page Info bubble is open before the user @@ -126042,7 +126596,7 @@ </summary> </histogram> -<histogram name="Security.PageInfo.TimeOpen.Action"> +<histogram name="Security.PageInfo.TimeOpen.Action" units="units"> <owner>cthomp@chromium.org</owner> <summary> Records the amount of time the Page Info bubble is open before the user @@ -126050,7 +126604,7 @@ </summary> </histogram> -<histogram name="Security.PageInfo.TimeOpen.NoAction"> +<histogram name="Security.PageInfo.TimeOpen.NoAction" units="units"> <owner>cthomp@chromium.org</owner> <summary> Records the amount of time the Page Info bubble is open before the user @@ -126230,7 +126784,7 @@ </summary> </histogram> -<histogram base="true" name="Security.SiteEngagement"> +<histogram base="true" name="Security.SiteEngagement" units="units"> <owner>cthomp@chromium.org</owner> <summary> The final Site Engagement score (0 to 100) of a URL during a visit to a @@ -126238,7 +126792,7 @@ </summary> </histogram> -<histogram base="true" name="Security.SiteEngagementDelta"> +<histogram base="true" name="Security.SiteEngagementDelta" units="units"> <owner>cthomp@chromium.org</owner> <summary> The change in Site Engagement score for a site between the page navigation @@ -126251,7 +126805,8 @@ </summary> </histogram> -<histogram base="true" name="Security.TimeOnPage" expires_after="2019-03-15"> +<histogram base="true" name="Security.TimeOnPage" units="units" + expires_after="2019-03-15"> <obsolete> Deprecated March 2019 in favor of Security.TimeOnPage2. </obsolete> @@ -126266,7 +126821,8 @@ </summary> </histogram> -<histogram base="true" name="Security.TimeOnPage2" expires_after="2020-02-16"> +<histogram base="true" name="Security.TimeOnPage2" units="units" + expires_after="2020-02-16"> <owner>cthomp@chromium.org</owner> <summary> Records the time spent on the page (the time that the page was in the @@ -126277,7 +126833,7 @@ </summary> </histogram> -<histogram name="Security.TreatInsecureOriginAsSecure"> +<histogram name="Security.TreatInsecureOriginAsSecure" units="units"> <owner>mkwst@chromium.org</owner> <summary> Records the number of origins which will be treated as secure based on their @@ -126450,7 +127006,8 @@ </summary> </histogram> -<histogram name="SequencedWorkerPool.TaskCount" expires_after="2016-03-07"> +<histogram name="SequencedWorkerPool.TaskCount" units="units" + expires_after="2016-03-07"> <obsolete> Histogram wasn't even reported anymore when ownership was taken in 11/2015. </obsolete> @@ -126461,7 +127018,7 @@ </summary> </histogram> -<histogram name="SequencedWorkerPool.UnrunnableTaskCount" +<histogram name="SequencedWorkerPool.UnrunnableTaskCount" units="units" expires_after="2016-03-07"> <obsolete> Histogram wasn't even reported anymore when ownership was taken in 11/2015. @@ -126771,7 +127328,8 @@ </summary> </histogram> -<histogram name="ServiceWorker.DiskCache.InitResult" expires_after="2020-06-30"> +<histogram name="ServiceWorker.DiskCache.InitResult" units="units" + expires_after="2020-06-30"> <owner>nhiroki@chromium.org</owner> <summary> Records result of opening a disk cache for ServiceWorkerDiskCache. @@ -126989,7 +127547,7 @@ </summary> </histogram> -<histogram name="ServiceWorker.ForeignFetch.OriginCount" +<histogram name="ServiceWorker.ForeignFetch.OriginCount" units="units" expires_after="2018-04-09"> <obsolete> Deprecated April 2018. @@ -127006,7 +127564,7 @@ </summary> </histogram> -<histogram name="ServiceWorker.ForeignFetch.ScopeCount" +<histogram name="ServiceWorker.ForeignFetch.ScopeCount" units="units" expires_after="2018-04-09"> <obsolete> Deprecated April 2018. @@ -129096,7 +129654,7 @@ <summary>The size, in k, of the last session file on disk.</summary> </histogram> -<histogram name="SessionRestore.NavEntryCommittedLongPeriod" +<histogram name="SessionRestore.NavEntryCommittedLongPeriod" units="units" expires_after="2017-02-24"> <obsolete> Deprecated 2017-02 as not actionable. @@ -129118,7 +129676,7 @@ </summary> </histogram> -<histogram name="SessionRestore.NavigationListPrunedLongPeriod" +<histogram name="SessionRestore.NavigationListPrunedLongPeriod" units="units" expires_after="2017-02-24"> <obsolete> Deprecated 2017-02 as not actionable. @@ -129140,7 +129698,8 @@ </summary> </histogram> -<histogram name="SessionRestore.ParallelTabLoads" expires_after="2017-02-24"> +<histogram name="SessionRestore.ParallelTabLoads" units="units" + expires_after="2017-02-24"> <obsolete> Deprecated 2017-02 as not actionable. </obsolete> @@ -129206,7 +129765,8 @@ </summary> </histogram> -<histogram name="SessionRestore.SaveLongPeriod" expires_after="2017-02-24"> +<histogram name="SessionRestore.SaveLongPeriod" units="units" + expires_after="2017-02-24"> <obsolete> Deprecated 2017-02 as not actionable. </obsolete> @@ -129251,7 +129811,8 @@ </summary> </histogram> -<histogram name="SessionRestore.TabClosedLongPeriod" expires_after="2017-02-24"> +<histogram name="SessionRestore.TabClosedLongPeriod" units="units" + expires_after="2017-02-24"> <obsolete> Deprecated 2017-02 as not actionable. </obsolete> @@ -129693,7 +130254,7 @@ </summary> </histogram> -<histogram name="Settings.PinnedTabs" expires_after="M86"> +<histogram name="Settings.PinnedTabs" units="units" expires_after="M86"> <owner>mpearson@chromium.org</owner> <summary>The number of pinned tabs opened when a profile is loaded.</summary> </histogram> @@ -129719,7 +130280,7 @@ </summary> </histogram> -<histogram name="Settings.SearchLength"> +<histogram name="Settings.SearchLength" units="units"> <owner>dschuyler@chromium.org</owner> <summary> The number of characters typed in the chrome://settings page search box. @@ -129728,7 +130289,7 @@ </summary> </histogram> -<histogram name="Settings.SearchLengthNoMatch"> +<histogram name="Settings.SearchLengthNoMatch" units="units"> <owner>dschuyler@chromium.org</owner> <summary> If no matches are found when searching within the chrome://settings page, @@ -129736,7 +130297,7 @@ </summary> </histogram> -<histogram name="Settings.SearchPageMatchCount"> +<histogram name="Settings.SearchPageMatchCount" units="units"> <owner>dschuyler@chromium.org</owner> <summary> The number of search page hits within the chrome://settings page. This is @@ -129757,7 +130318,7 @@ </summary> </histogram> -<histogram name="Settings.SearchSubpageMatchCount"> +<histogram name="Settings.SearchSubpageMatchCount" units="units"> <owner>dschuyler@chromium.org</owner> <summary> The number of search subpage hits within the chrome://settings page. This is @@ -129887,7 +130448,7 @@ </summary> </histogram> -<histogram name="Settings.StartupPageLoadURLs"> +<histogram name="Settings.StartupPageLoadURLs" units="units"> <obsolete> Not needed. Removed August 2019. </obsolete> @@ -130091,7 +130652,7 @@ </summary> </histogram> -<histogram name="Settings.TrackedSplitPreferenceChanged"> +<histogram name="Settings.TrackedSplitPreferenceChanged" units="units"> <owner>gab@chromium.org</owner> <summary> The number of items that had changed in a dictionary pref when @@ -130123,7 +130684,7 @@ </summary> </histogram> -<histogram name="SettingsResetBubble.NumNoThanksPerReset"> +<histogram name="SettingsResetBubble.NumNoThanksPerReset" units="units"> <owner>mad@chromium.org</owner> <summary> Counts the number of times the user clicked on the No Thanks button of the @@ -130880,7 +131441,8 @@ </summary> </histogram> -<histogram name="ShortcutsProvider.DatabaseSize" expires_after="2018-08-30"> +<histogram name="ShortcutsProvider.DatabaseSize" units="units" + expires_after="2018-08-30"> <owner>mpearson@chromium.org</owner> <summary> The number of entries in shortcuts backend's database when initialized, @@ -130896,7 +131458,8 @@ </summary> </histogram> -<histogram name="Shutdown.browser_exit.time" expires_after="2016-10-11"> +<histogram name="Shutdown.browser_exit.time" units="units" + expires_after="2016-10-11"> <obsolete> Replaced by Shutdown.browser_exit.time2 to get more resolution into the tail of the distribution (10/2016). @@ -130907,14 +131470,15 @@ </summary> </histogram> -<histogram name="Shutdown.browser_exit.time2"> +<histogram name="Shutdown.browser_exit.time2" units="units"> <owner>hashimoto@chromium.org</owner> <summary> Time for shutdown initiated by the browser exit menu command. </summary> </histogram> -<histogram name="Shutdown.browser_exit.time_per_process" expires_after="M77"> +<histogram name="Shutdown.browser_exit.time_per_process" units="units" + expires_after="M77"> <owner>hashimoto@chromium.org</owner> <summary> Time for shutdown initiated by the browser exit menu command per renderer @@ -130922,7 +131486,8 @@ </summary> </histogram> -<histogram name="Shutdown.end_session.time" expires_after="2016-10-11"> +<histogram name="Shutdown.end_session.time" units="units" + expires_after="2016-10-11"> <obsolete> Replaced by Shutdown.end_session.time2 to get more resolution into the tail of the distribution (10/2016). @@ -130934,7 +131499,7 @@ </summary> </histogram> -<histogram name="Shutdown.end_session.time2" expires_after="M78"> +<histogram name="Shutdown.end_session.time2" units="units" expires_after="M78"> <owner>hashimoto@chromium.org</owner> <summary> Time for shutdown initiated by an end session (user logs off, shuts down or @@ -130942,7 +131507,8 @@ </summary> </histogram> -<histogram name="Shutdown.end_session.time_per_process" expires_after="M77"> +<histogram name="Shutdown.end_session.time_per_process" units="units" + expires_after="M77"> <owner>hashimoto@chromium.org</owner> <summary> Time for shutdown initiated by an end session (user logs off, shuts down or @@ -130950,7 +131516,7 @@ </summary> </histogram> -<histogram name="Shutdown.renderers.slow" expires_after="M77"> +<histogram name="Shutdown.renderers.slow" units="units" expires_after="M77"> <owner>hashimoto@chromium.org</owner> <summary> The number of renderer processes that couldn't be shutdown quickly due to @@ -130958,7 +131524,7 @@ </summary> </histogram> -<histogram name="Shutdown.renderers.total" expires_after="M77"> +<histogram name="Shutdown.renderers.total" units="units" expires_after="M77"> <owner>hashimoto@chromium.org</owner> <summary> The number of renderer processes running when shutdown was called. @@ -130990,7 +131556,8 @@ </summary> </histogram> -<histogram name="Shutdown.window_close.time_per_process" expires_after="M77"> +<histogram name="Shutdown.window_close.time_per_process" units="units" + expires_after="M77"> <owner>hashimoto@chromium.org</owner> <summary> Time for shutdown initiated by the last browser window being closed per @@ -131681,7 +132248,8 @@ </summary> </histogram> -<histogram name="Signin.Multilogin.NumberOfAccounts" expires_after="2020-02-16"> +<histogram name="Signin.Multilogin.NumberOfAccounts" units="units" + expires_after="2020-02-16"> <owner>droger@chromium.org</owner> <owner>msarda@chromium.org</owner> <summary>Number of accounts in tokens sent to Gaia Multilogin.</summary> @@ -131754,7 +132322,8 @@ <summary>Tracks events related to the reauthentication Gaia page.</summary> </histogram> -<histogram name="Signin.Reconciler.AddedToChrome" expires_after="2014-09-25"> +<histogram name="Signin.Reconciler.AddedToChrome" units="units" + expires_after="2014-09-25"> <obsolete> Deprecated 2014-09 because chrome no longer tries to reconcile from the cookie jar to the browser. @@ -131766,7 +132335,7 @@ </summary> </histogram> -<histogram name="Signin.Reconciler.AddedToCookieJar"> +<histogram name="Signin.Reconciler.AddedToCookieJar" units="units"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -131796,7 +132365,8 @@ </summary> </histogram> -<histogram name="Signin.Reconciler.Duration" expires_after="2019-04-05"> +<histogram name="Signin.Reconciler.Duration" units="units" + expires_after="2019-04-05"> <obsolete> Deprecated in favor of Signin.Reconciler.Duration.UpTo3mins. </obsolete> @@ -131826,7 +132396,7 @@ </histogram> <histogram name="Signin.Reconciler.ExternalCcResultTime.NotCompleted" - expires_after="2020-06-14"> + units="units" expires_after="2020-06-14"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -131837,7 +132407,7 @@ </summary> </histogram> -<histogram name="Signin.Reconciler.RemovedFromCookieJar"> +<histogram name="Signin.Reconciler.RemovedFromCookieJar" units="units"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -132414,7 +132984,7 @@ </summary> </histogram> -<histogram base="true" name="SimpleCache.EntryOperationsPending" +<histogram base="true" name="SimpleCache.EntryOperationsPending" units="units" expires_after="2019-03-12"> <obsolete> Removed 2019-03. @@ -132470,7 +133040,7 @@ <summary>The size of the cache at the beginning of an eviction.</summary> </histogram> -<histogram base="true" name="SimpleCache.Eviction.EntryCount"> +<histogram base="true" name="SimpleCache.Eviction.EntryCount" units="units"> <owner>morlovich@chromium.org</owner> <summary>The number of entries to be erased in an eviction.</summary> </histogram> @@ -132585,7 +133155,7 @@ </summary> </histogram> -<histogram base="true" name="SimpleCache.GlobalOpenEntryCount"> +<histogram base="true" name="SimpleCache.GlobalOpenEntryCount" units="units"> <obsolete> Removed 2019-07-03. </obsolete> @@ -132672,17 +133242,17 @@ <summary>For each index load, whether the index file was corrupt.</summary> </histogram> -<histogram base="true" name="SimpleCache.IndexCreatedEntryCount"> +<histogram base="true" name="SimpleCache.IndexCreatedEntryCount" units="units"> <owner>morlovich@chromium.org</owner> <summary>The number of entries in a newly created index file.</summary> </histogram> -<histogram base="true" name="SimpleCache.IndexEntriesLoaded"> +<histogram base="true" name="SimpleCache.IndexEntriesLoaded" units="units"> <owner>morlovich@chromium.org</owner> <summary>Number of entries loaded from the index file on start.</summary> </histogram> -<histogram base="true" name="SimpleCache.IndexEntriesRestored"> +<histogram base="true" name="SimpleCache.IndexEntriesRestored" units="units"> <owner>morlovich@chromium.org</owner> <summary> Number of entries restored from disk when there was no index or the index @@ -132698,7 +133268,8 @@ </summary> </histogram> -<histogram base="true" name="SimpleCache.IndexInitializationWaiters"> +<histogram base="true" name="SimpleCache.IndexInitializationWaiters" + units="units"> <owner>morlovich@chromium.org</owner> <summary> At the time of index initialization, the number of enqueued jobs awaiting @@ -132727,7 +133298,7 @@ </summary> </histogram> -<histogram base="true" name="SimpleCache.IndexNumEntriesOnWrite"> +<histogram base="true" name="SimpleCache.IndexNumEntriesOnWrite" units="units"> <owner>morlovich@chromium.org</owner> <summary>The number of entries written to the index on a flush.</summary> </histogram> @@ -133227,7 +133798,8 @@ <summary>Result of SimpleGeolocationRequest.</summary> </histogram> -<histogram name="SimpleGeolocation.Request.Retries" expires_after="never"> +<histogram name="SimpleGeolocation.Request.Retries" units="units" + expires_after="never"> <!-- expires-never: This reports external location provider health status and should be kept until we use this API. --> @@ -133308,7 +133880,7 @@ </histogram> <histogram name="SiteEngagementService.EngagementPercentageForHTTPS" - expires_after="2017-04-18"> + units="units" expires_after="2017-04-18"> <obsolete> Removed in M60. See crbug.com/712493. </obsolete> @@ -133323,7 +133895,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.EngagementScore" +<histogram name="SiteEngagementService.EngagementScore" units="units" expires_after="2020-02-16"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> @@ -133334,7 +133906,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.EngagementScore.HTTP" +<histogram name="SiteEngagementService.EngagementScore.HTTP" units="units" expires_after="2017-04-18"> <obsolete> Removed in M60. See crbug.com/712493. @@ -133350,7 +133922,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.EngagementScore.HTTPS" +<histogram name="SiteEngagementService.EngagementScore.HTTPS" units="units" expires_after="2017-04-18"> <obsolete> Removed in M60. See crbug.com/712493. @@ -133397,7 +133969,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.MeanEngagement"> +<histogram name="SiteEngagementService.MeanEngagement" units="units"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -133407,7 +133979,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.MedianEngagement" +<histogram name="SiteEngagementService.MedianEngagement" units="units" expires_after="2020-02-16"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> @@ -133418,7 +133990,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.OriginsEngaged" +<histogram name="SiteEngagementService.OriginsEngaged" units="units" expires_after="2020-02-16"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> @@ -133430,7 +134002,7 @@ </histogram> <histogram name="SiteEngagementService.OriginsWithMaxDailyEngagement" - expires_after="2020-06-01"> + units="units" expires_after="2020-06-01"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -133442,7 +134014,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.OriginsWithMaxEngagement" +<histogram name="SiteEngagementService.OriginsWithMaxEngagement" units="units" expires_after="2020-06-01"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> @@ -133456,7 +134028,7 @@ </histogram> <histogram name="SiteEngagementService.PercentOriginsWithMaxEngagement" - expires_after="2020-06-01"> + units="units" expires_after="2020-06-01"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -133486,7 +134058,7 @@ </summary> </histogram> -<histogram name="SiteEngagementService.TotalEngagement" +<histogram name="SiteEngagementService.TotalEngagement" units="units" expires_after="2020-02-16"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> @@ -133497,7 +134069,8 @@ </summary> </histogram> -<histogram name="SiteIsolatedCodeCache.Behaviour" expires_after="2018-10-10"> +<histogram name="SiteIsolatedCodeCache.Behaviour" units="units" + expires_after="2018-10-10"> <obsolete> Split this histogram into SiteIsolatedCodeCache.JS.Behaviour and SiteIsolatedCodeCache.WASM.Behaviour to collect statistics for JS and WASM @@ -133531,7 +134104,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.AllResponses"> +<histogram name="SiteIsolation.AllResponses" units="units"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -133543,7 +134116,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.BrowsingInstanceCount" +<histogram name="SiteIsolation.BrowsingInstanceCount" units="units" expires_after="2020-02-16"> <owner>creis@chromium.org</owner> <summary> @@ -133640,7 +134213,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.CurrentRendererProcessCount" +<histogram name="SiteIsolation.CurrentRendererProcessCount" units="units" expires_after="2020-02-16"> <owner>creis@chromium.org</owner> <summary> @@ -133670,7 +134243,7 @@ </histogram> <histogram name="SiteIsolation.IsolateAllSitesProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since site-per-process has already shipped on desktop in M67 (see @@ -133684,7 +134257,7 @@ </histogram> <histogram name="SiteIsolation.IsolateAllSitesProcessCountLowerBound" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since site-per-process has already shipped on desktop in M67 (see @@ -133699,7 +134272,7 @@ </histogram> <histogram name="SiteIsolation.IsolateAllSitesProcessCountNoLimit" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since site-per-process has already shipped on desktop in M67 (see @@ -133713,7 +134286,7 @@ </histogram> <histogram name="SiteIsolation.IsolateAllSitesTotalProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since site-per-process has already shipped on desktop in M67 (see @@ -133727,7 +134300,7 @@ </histogram> <histogram name="SiteIsolation.IsolateExtensionsProcessCountEstimate" - expires_after="M77"> + units="units" expires_after="M77"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since isolate-extensions has already shipped in M56 (see @@ -133743,7 +134316,7 @@ </histogram> <histogram name="SiteIsolation.IsolateExtensionsProcessCountLowerBound" - expires_after="M77"> + units="units" expires_after="M77"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since isolate-extensions has already shipped in M56 (see @@ -133759,7 +134332,7 @@ </histogram> <histogram name="SiteIsolation.IsolateExtensionsProcessCountNoLimit" - expires_after="M77"> + units="units" expires_after="M77"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since isolate-extensions has already shipped in M56 (see @@ -133775,7 +134348,7 @@ </histogram> <histogram name="SiteIsolation.IsolateExtensionsTotalProcessCountEstimate" - expires_after="M77"> + units="units" expires_after="M77"> <obsolete> Logging code has been removed in M77 - the histogram is no longer useful since isolate-extensions has already shipped in M56 (see @@ -133791,7 +134364,7 @@ </histogram> <histogram name="SiteIsolation.IsolateHttpsSitesProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133806,7 +134379,7 @@ </histogram> <histogram name="SiteIsolation.IsolateHttpsSitesProcessCountLowerBound" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133821,7 +134394,7 @@ </histogram> <histogram name="SiteIsolation.IsolateHttpsSitesProcessCountNoLimit" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133835,7 +134408,7 @@ </histogram> <histogram name="SiteIsolation.IsolateHttpsSitesTotalProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133849,7 +134422,7 @@ </histogram> <histogram name="SiteIsolation.IsolateNothingProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133863,7 +134436,7 @@ </histogram> <histogram name="SiteIsolation.IsolateNothingProcessCountLowerBound" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133877,7 +134450,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.IsolateNothingProcessCountNoLimit" +<histogram name="SiteIsolation.IsolateNothingProcessCountNoLimit" units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. @@ -133892,7 +134465,7 @@ </histogram> <histogram name="SiteIsolation.IsolateNothingTotalProcessCountEstimate" - expires_after="M82"> + units="units" expires_after="M82"> <obsolete> Logging code has been removed in M77. </obsolete> @@ -133935,7 +134508,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.OutOfProcessIframes" expires_after="2020-02-16"> +<histogram name="SiteIsolation.OutOfProcessIframes" units="units" + expires_after="2020-02-16"> <owner>nasko@chromium.org</owner> <summary> The count of all out-of-process iframes. Recorded once per UMA ping. @@ -133956,7 +134530,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.ProxyCount" expires_after="2020-02-16"> +<histogram name="SiteIsolation.ProxyCount" units="units" + expires_after="2020-02-16"> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> <owner>site-isolation-dev@chromium.org</owner> @@ -133965,7 +134540,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.ProxyCountPerBrowsingInstance" +<histogram name="SiteIsolation.ProxyCountPerBrowsingInstance" units="units" expires_after="2020-02-16"> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -133999,7 +134574,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.SiteInstancesPerBrowsingInstance" +<histogram name="SiteIsolation.SiteInstancesPerBrowsingInstance" units="units" expires_after="2020-02-16"> <owner>nasko@chromium.org</owner> <summary> @@ -134152,7 +134727,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.HTML.Blocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.HTML.Blocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134165,7 +134741,7 @@ </histogram> <histogram name="SiteIsolation.XSD.HTML.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134209,7 +134785,7 @@ </histogram> <histogram name="SiteIsolation.XSD.HTML.NoSniffBlocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134253,7 +134829,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.HTML.NotBlocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.HTML.NotBlocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134265,7 +134842,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.HTML.NotBlocked.MaybeJS" +<histogram name="SiteIsolation.XSD.HTML.NotBlocked.MaybeJS" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134278,7 +134855,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.JSON.Blocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.JSON.Blocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134291,7 +134869,7 @@ </histogram> <histogram name="SiteIsolation.XSD.JSON.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134335,7 +134913,7 @@ </histogram> <histogram name="SiteIsolation.XSD.JSON.NoSniffBlocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134379,7 +134957,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.JSON.NotBlocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.JSON.NotBlocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134391,7 +134970,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.JSON.NotBlocked.MaybeJS" +<histogram name="SiteIsolation.XSD.JSON.NotBlocked.MaybeJS" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134435,7 +135014,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.Plain.HTML.Blocked" +<histogram name="SiteIsolation.XSD.Plain.HTML.Blocked" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134449,7 +135028,7 @@ </histogram> <histogram name="SiteIsolation.XSD.Plain.HTML.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134492,7 +135071,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.Plain.JSON.Blocked" +<histogram name="SiteIsolation.XSD.Plain.JSON.Blocked" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134506,7 +135085,7 @@ </histogram> <histogram name="SiteIsolation.XSD.Plain.JSON.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134551,7 +135130,8 @@ </histogram> <histogram - name="SiteIsolation.XSD.Plain.NoSniffBlocked.NonRenderableStatusCode"> + name="SiteIsolation.XSD.Plain.NoSniffBlocked.NonRenderableStatusCode" + units="units"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134595,7 +135175,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.Plain.NotBlocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.Plain.NotBlocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134607,7 +135188,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.Plain.NotBlocked.MaybeJS" +<histogram name="SiteIsolation.XSD.Plain.NotBlocked.MaybeJS" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134620,7 +135201,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.Plain.XML.Blocked" +<histogram name="SiteIsolation.XSD.Plain.XML.Blocked" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -134634,7 +135215,7 @@ </histogram> <histogram name="SiteIsolation.XSD.Plain.XML.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134678,7 +135259,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.XML.Blocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.XML.Blocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134691,7 +135273,7 @@ </histogram> <histogram name="SiteIsolation.XSD.XML.Blocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134735,7 +135317,7 @@ </histogram> <histogram name="SiteIsolation.XSD.XML.NoSniffBlocked.NonRenderableStatusCode" - expires_after="2018-03-21"> + units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134779,7 +135361,8 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.XML.NotBlocked" expires_after="2018-03-21"> +<histogram name="SiteIsolation.XSD.XML.NotBlocked" units="units" + expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. </obsolete> @@ -134791,7 +135374,7 @@ </summary> </histogram> -<histogram name="SiteIsolation.XSD.XML.NotBlocked.MaybeJS" +<histogram name="SiteIsolation.XSD.XML.NotBlocked.MaybeJS" units="units" expires_after="2018-03-21"> <obsolete> Removed in March 2018; in M67+, browser-process CORB policy is enabled. @@ -135290,7 +135873,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.Cleaner.Version"> +<histogram name="SoftwareReporter.Cleaner.Version" units="units"> <owner>joenotcharles@google.com</owner> <summary>The build version of the software reporter cleaner tool.</summary> </histogram> @@ -135386,7 +135969,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.MajorVersion"> +<histogram name="SoftwareReporter.MajorVersion" units="units"> <owner>joenotcharles@google.com</owner> <summary> As SoftwareReporter.MinorVersion, but a double word combination of the other @@ -135404,7 +135987,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.MinorVersion"> +<histogram name="SoftwareReporter.MinorVersion" units="units"> <owner>joenotcharles@google.com</owner> <summary> The last component of the version of the software reporter that was executed @@ -135573,7 +136156,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.UploadFailureCount"> +<histogram name="SoftwareReporter.UploadFailureCount" units="units"> <owner>joenotcharles@google.com</owner> <summary> The total count of SRT log upload failures experienced by this machine for @@ -135581,7 +136164,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.UploadLongestFailureRun"> +<histogram name="SoftwareReporter.UploadLongestFailureRun" units="units"> <owner>joenotcharles@google.com</owner> <summary> The longest run of upload failures logged by SRT runs. This value is @@ -135589,7 +136172,7 @@ </summary> </histogram> -<histogram name="SoftwareReporter.UploadSuccessCount"> +<histogram name="SoftwareReporter.UploadSuccessCount" units="units"> <owner>joenotcharles@google.com</owner> <summary> The total count of successful SRT log uploads experienced by this machine @@ -135964,7 +136547,7 @@ </summary> </histogram> -<histogram name="Sqlite.Version"> +<histogram name="Sqlite.Version" units="units"> <owner>costan@google.com</owner> <summary>Version of pre-existing database at startup.</summary> </histogram> @@ -136067,7 +136650,8 @@ </summary> </histogram> -<histogram name="SSL.ExpectCTReportSendingAttempt" expires_after="M77"> +<histogram name="SSL.ExpectCTReportSendingAttempt" units="units" + expires_after="M77"> <owner>estark@chromium.org</owner> <summary> Sites can opt in to Expect CT, a reporting feature that sends a report @@ -136123,7 +136707,8 @@ <summary>Tracks when mixed content is displayed or run.</summary> </histogram> -<histogram name="SSORecallPromo.AccountsAvailable" expires_after="2020-11-30"> +<histogram name="SSORecallPromo.AccountsAvailable" units="units" + expires_after="2020-11-30"> <owner>msarda@chromium.org</owner> <summary> Number of accounts available for Single Sign On with the current device, @@ -136139,7 +136724,8 @@ </summary> </histogram> -<histogram name="SSORecallPromo.PromoSeenCount" expires_after="2020-11-30"> +<histogram name="SSORecallPromo.PromoSeenCount" units="units" + expires_after="2020-11-30"> <owner>msarda@chromium.org</owner> <summary> Number of times the promotion has been seen on the current device. @@ -136284,7 +136870,7 @@ </histogram> <histogram name="Stability.Android.StrongBindingOomRemainingStrongBindingCount" - expires_after="2020-02-16"> + units="units" expires_after="2020-02-16"> <owner>boliu@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -136637,7 +137223,7 @@ <summary>Amount of time taken to serialize a call stack profile.</summary> </histogram> -<histogram name="Stars.BookmarksBar_Active_Clip_Count" +<histogram name="Stars.BookmarksBar_Active_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136645,7 +137231,7 @@ </summary> </histogram> -<histogram name="Stars.Clipper_Folio_Selected_Depth_Count" +<histogram name="Stars.Clipper_Folio_Selected_Depth_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136654,21 +137240,23 @@ </histogram> <histogram name="Stars.Clipper_Folio_Selected_Visible_Folio_Count" - expires_after="2019-01-30"> + units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the number of folios visible when a folio is selected in the clipper. </summary> </histogram> -<histogram name="Stars.Clipper_Open_Folio_Count" expires_after="2019-01-30"> +<histogram name="Stars.Clipper_Open_Folio_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of folios when the clipper is opened. </summary> </histogram> -<histogram name="Stars.Folio_Active_Clip_Count" expires_after="2019-01-30"> +<histogram name="Stars.Folio_Active_Clip_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of clips when the folio view is activated. @@ -136709,7 +137297,7 @@ </summary> </histogram> -<histogram name="Stars.Launch_Bookmark_BookmarksBar_Clip_Count" +<histogram name="Stars.Launch_Bookmark_BookmarksBar_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136718,7 +137306,7 @@ </summary> </histogram> -<histogram name="Stars.Launch_Bookmark_Folio_Clip_Count" +<histogram name="Stars.Launch_Bookmark_Folio_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136727,7 +137315,7 @@ </summary> </histogram> -<histogram name="Stars.Launch_Bookmark_Search_Clip_Count" +<histogram name="Stars.Launch_Bookmark_Search_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136736,7 +137324,7 @@ </summary> </histogram> -<histogram name="Stars.Launch_Bookmark_SmartGroup_Clip_Count" +<histogram name="Stars.Launch_Bookmark_SmartGroup_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136745,7 +137333,7 @@ </summary> </histogram> -<histogram name="Stars.Launch_Bookmark_Timeline_Clip_Count" +<histogram name="Stars.Launch_Bookmark_Timeline_Clip_Count" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> @@ -136780,14 +137368,16 @@ </summary> </histogram> -<histogram name="Stars.Number_Of_Nodes" expires_after="2019-01-30"> +<histogram name="Stars.Number_Of_Nodes" units="units" + expires_after="2019-01-30"> <owner>yefim@chromium.org</owner> <summary> Logs number of bookmark nodes every time stars extension is loaded. </summary> </histogram> -<histogram name="Stars.Profile_Active_Clip_Count" expires_after="2019-01-30"> +<histogram name="Stars.Profile_Active_Clip_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of clips when the profile view is activated. @@ -136814,33 +137404,37 @@ </summary> </histogram> -<histogram name="Stars.Search_Active_Clip_Count" expires_after="2019-01-30"> +<histogram name="Stars.Search_Active_Clip_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of clips when the search view is activated. </summary> </histogram> -<histogram name="Stars.SmartGroup_Active_Clip_Count" expires_after="2019-01-30"> +<histogram name="Stars.SmartGroup_Active_Clip_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of clips when the smart group view is activated. </summary> </histogram> -<histogram name="Stars.Timeline_Active_Clip_Count" expires_after="2019-01-30"> +<histogram name="Stars.Timeline_Active_Clip_Count" units="units" + expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary> Logs the approx number of clips when the timeline view is activated. </summary> </histogram> -<histogram name="Stars.Version" expires_after="2019-01-30"> +<histogram name="Stars.Version" units="units" expires_after="2019-01-30"> <owner>accamed@google.com</owner> <summary>Logs the extension version the user is using.</summary> </histogram> -<histogram name="Startup.AfterStartupTaskCount" expires_after="2020-02-16"> +<histogram name="Startup.AfterStartupTaskCount" units="units" + expires_after="2020-02-16"> <owner>michaeln@chromium.org</owner> <summary> The number of after-startup tasks that were queued prior to startup @@ -137157,7 +137751,7 @@ </summary> </histogram> -<histogram name="Startup.BrowserOpenTabs" expires_after="M81"> +<histogram name="Startup.BrowserOpenTabs" units="units" expires_after="M81"> <owner>fdoray@chromium.org</owner> <summary> Time taken to open the initial tab or to restore tabs from previous session. @@ -137548,7 +138142,7 @@ </summary> </histogram> -<histogram name="Startup.IsResume" expires_after="2013-07-08"> +<histogram name="Startup.IsResume" units="units" expires_after="2013-07-08"> <obsolete> Deprecated 12/2011. Merged into MobileSessionStartType. </obsolete> @@ -137556,7 +138150,8 @@ <summary>Whether a startup is a resume (vs a cold start).</summary> </histogram> -<histogram name="Startup.LoadTime.ExeMainToDllMain" expires_after="2016-12-17"> +<histogram name="Startup.LoadTime.ExeMainToDllMain" units="units" + expires_after="2016-12-17"> <obsolete> Deprecated 12/2016. crbug.com/634408 </obsolete> @@ -137570,7 +138165,8 @@ </summary> </histogram> -<histogram name="Startup.LoadTime.ExeMainToDllMain2" expires_after="2020-02-23"> +<histogram name="Startup.LoadTime.ExeMainToDllMain2" units="units" + expires_after="2020-02-23"> <owner>fdoray@chromium.org</owner> <owner>gab@chromium.org</owner> <summary> @@ -137578,7 +138174,7 @@ </summary> </histogram> -<histogram name="Startup.LoadTime.ProcessCreateToDllMain" +<histogram name="Startup.LoadTime.ProcessCreateToDllMain" units="units" expires_after="2016-12-17"> <obsolete> Deprecated 12/2016. crbug.com/634408 @@ -137593,13 +138189,14 @@ </summary> </histogram> -<histogram name="Startup.LoadTime.ProcessCreateToDllMain2" expires_after="M81"> +<histogram name="Startup.LoadTime.ProcessCreateToDllMain2" units="units" + expires_after="M81"> <owner>fdoray@chromium.org</owner> <owner>gab@chromium.org</owner> <summary>Time from the process creation to chrome.dll's main().</summary> </histogram> -<histogram name="Startup.LoadTime.ProcessCreateToExeMain" +<histogram name="Startup.LoadTime.ProcessCreateToExeMain" units="units" expires_after="2016-12-17"> <obsolete> Deprecated 12/2016. crbug.com/634408 @@ -137615,7 +138212,8 @@ </summary> </histogram> -<histogram name="Startup.LoadTime.ProcessCreateToExeMain2" expires_after="M77"> +<histogram name="Startup.LoadTime.ProcessCreateToExeMain2" units="units" + expires_after="M77"> <owner>fdoray@chromium.org</owner> <owner>gab@chromium.org</owner> <summary> @@ -137758,7 +138356,8 @@ </summary> </histogram> -<histogram name="Startup.SameVersionStartupCount" expires_after="2020-03-08"> +<histogram name="Startup.SameVersionStartupCount" units="units" + expires_after="2020-03-08"> <obsolete> Deprecated 8/2019. See startup_metric_utils.cc for a summary of old data. </obsolete> @@ -139517,7 +140116,7 @@ </summary> </histogram> -<histogram name="Sync.AppRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.AppRunFailures" units="units" expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -139716,7 +140315,8 @@ </summary> </histogram> -<histogram name="Sync.AutofillProfileRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.AutofillProfileRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -139751,7 +140351,8 @@ </summary> </histogram> -<histogram name="Sync.AutofillRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.AutofillRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -139772,7 +140373,7 @@ <summary>Enumeration of types of autofill association failures.</summary> </histogram> -<histogram name="Sync.AutoNigoriOverwrites"> +<histogram name="Sync.AutoNigoriOverwrites" units="units"> <owner>zea@chromium.org</owner> <summary> Number of times this client has overwritten the nigori node to update the @@ -139826,7 +140427,7 @@ </summary> </histogram> -<histogram name="Sync.BadRequestCountOnSignInNeedsUpdateInfoBar" +<histogram name="Sync.BadRequestCountOnSignInNeedsUpdateInfoBar" units="units" expires_after="2016-06-20"> <obsolete> Deprecated in M53. @@ -139847,7 +140448,8 @@ <summary>Time taken during bookmark association.</summary> </histogram> -<histogram name="Sync.BookmarkRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.BookmarkRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -139858,7 +140460,8 @@ </summary> </histogram> -<histogram name="Sync.BookmarksDuplicationsAtAssociation" expires_after="M82"> +<histogram name="Sync.BookmarksDuplicationsAtAssociation" units="units" + expires_after="M82"> <owner>mamir@chromium.org</owner> <summary> Estimated number of bookmark duplications after bookmark association. @@ -139900,7 +140503,7 @@ </summary> </histogram> -<histogram name="Sync.BookmarksNewDuplicationsAtAssociation"> +<histogram name="Sync.BookmarksNewDuplicationsAtAssociation" units="units"> <owner>mamir@chromium.org</owner> <summary> Estimated number of new bookmark duplications after bookmark association. @@ -140117,7 +140720,8 @@ </summary> </histogram> -<histogram name="Sync.ConflictFixCircularity" expires_after="2014-02-28"> +<histogram name="Sync.ConflictFixCircularity" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated 12/2011. No longer tracked. See crbug.com/107816. </obsolete> @@ -140128,7 +140732,7 @@ </summary> </histogram> -<histogram name="Sync.ConflictFixRemovedDirectoriesWithContent" +<histogram name="Sync.ConflictFixRemovedDirectoriesWithContent" units="units" expires_after="2014-02-28"> <obsolete> Deprecated 12/2011. No longer tracked. See crbug.com/107816. @@ -140246,7 +140850,8 @@ </summary> </histogram> -<histogram name="Sync.CustomPassphrase" expires_after="2014-02-28"> +<histogram name="Sync.CustomPassphrase" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m26. </obsolete> @@ -140281,7 +140886,8 @@ </summary> </histogram> -<histogram name="Sync.DatatypePrefRecovery" expires_after="2016-06-20"> +<histogram name="Sync.DatatypePrefRecovery" units="units" + expires_after="2016-06-20"> <obsolete> Deprecated in M53. </obsolete> @@ -140349,7 +140955,7 @@ </summary> </histogram> -<histogram name="Sync.DeviceCount" expires_after="2019-02-08"> +<histogram name="Sync.DeviceCount" units="units" expires_after="2019-02-08"> <obsolete> Deprecated in M74. </obsolete> @@ -140361,7 +140967,7 @@ </summary> </histogram> -<histogram name="Sync.DeviceCount2" expires_after="2020-02-16"> +<histogram name="Sync.DeviceCount2" units="units" expires_after="2020-02-16"> <owner>mastiz@chromium.org</owner> <owner>jkrcal@chromium.org</owner> <summary> @@ -140400,7 +141006,8 @@ </summary> </histogram> -<histogram name="Sync.DirectoryOpenFailedMac" expires_after="2014-02-28"> +<histogram name="Sync.DirectoryOpenFailedMac" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated 11/2011. No longer tracked. </obsolete> @@ -140408,7 +141015,8 @@ <summary>Number of failures trying to open the sync database on mac.</summary> </histogram> -<histogram name="Sync.DirectoryOpenFailedNotWinMac" expires_after="2014-02-28"> +<histogram name="Sync.DirectoryOpenFailedNotWinMac" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated 11/2011. No longer tracked. </obsolete> @@ -140419,7 +141027,8 @@ </summary> </histogram> -<histogram name="Sync.DirectoryOpenFailedWin" expires_after="2014-02-28"> +<histogram name="Sync.DirectoryOpenFailedWin" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated 11/2011. No longer tracked. </obsolete> @@ -140528,7 +141137,7 @@ </summary> </histogram> -<histogram name="Sync.EncryptAllData" expires_after="2014-02-28"> +<histogram name="Sync.EncryptAllData" units="units" expires_after="2014-02-28"> <obsolete> Deprecated as of m26. </obsolete> @@ -140581,7 +141190,8 @@ </summary> </histogram> -<histogram name="Sync.ExtensionRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.ExtensionRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -140664,7 +141274,7 @@ <summary>Whether a sync favicon cache lookup succeeded or not.</summary> </histogram> -<histogram name="Sync.FaviconCount" expires_after="2016-06-20"> +<histogram name="Sync.FaviconCount" units="units" expires_after="2016-06-20"> <obsolete> Deprecated in M53. </obsolete> @@ -141433,7 +142043,7 @@ </summary> </histogram> -<histogram name="Sync.PageRevisitNavigationMatchOffset" +<histogram name="Sync.PageRevisitNavigationMatchOffset" units="units" expires_after="2018-02-21"> <obsolete> Deprecated in M66. @@ -141547,7 +142157,7 @@ <summary>Transition type that didn't match a typed URL.</summary> </histogram> -<histogram name="Sync.PartiallySyncedTypes" expires_after="M77"> +<histogram name="Sync.PartiallySyncedTypes" units="units" expires_after="M77"> <owner>zea@chromium.org</owner> <summary> Number of partially synced types (those with a progress marker but no @@ -141586,7 +142196,8 @@ </summary> </histogram> -<histogram name="Sync.PasswordRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.PasswordRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -141705,7 +142316,8 @@ </summary> </histogram> -<histogram name="Sync.PreferenceRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.PreferenceRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -141848,7 +142460,7 @@ </summary> </histogram> -<histogram name="Sync.RequestGroupSizeForSyncedHistoryFavicons" +<histogram name="Sync.RequestGroupSizeForSyncedHistoryFavicons" units="units" expires_after="2020-07-10"> <owner>victorvianna@google.com</owner> <owner>jkrcal@chromium.org</owner> @@ -141928,7 +142540,8 @@ </summary> </histogram> -<histogram name="Sync.SearchEngineRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.SearchEngineRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -141996,7 +142609,8 @@ </summary> </histogram> -<histogram name="Sync.SessionRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.SessionRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -142118,7 +142732,7 @@ </summary> </histogram> -<histogram name="Sync.SizeOfFaviconServerRequestGroup" +<histogram name="Sync.SizeOfFaviconServerRequestGroup" units="units" expires_after="2019-07-10"> <obsolete> Replaced by Sync.RequestGroupSizeForSyncedHistoryFavicons in M77. @@ -142240,7 +142854,8 @@ </summary> </histogram> -<histogram name="Sync.SyncerConflictStuck" expires_after="2014-02-28"> +<histogram name="Sync.SyncerConflictStuck" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated 12/2011. No longer tracked. See crbug.com/107816. </obsolete> @@ -142259,7 +142874,7 @@ </summary> </histogram> -<histogram name="Sync.SyncEverything" expires_after="2018-10-22"> +<histogram name="Sync.SyncEverything" units="units" expires_after="2018-10-22"> <obsolete> Deprecated 10/2018, replaced by Sync.SyncEverything2. </obsolete> @@ -142295,7 +142910,8 @@ </summary> </histogram> -<histogram name="Sync.ThemeRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.ThemeRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -142374,7 +142990,8 @@ </summary> </histogram> -<histogram name="Sync.TypedUrlRunFailures" expires_after="2014-02-28"> +<histogram name="Sync.TypedUrlRunFailures" units="units" + expires_after="2014-02-28"> <obsolete> Deprecated as of m19. </obsolete> @@ -142448,7 +143065,7 @@ <summary>Time the user spends looking at the authorization dialog.</summary> </histogram> -<histogram name="Sync.UserPerceivedBookmarkAssociation" +<histogram name="Sync.UserPerceivedBookmarkAssociation" units="units" expires_after="2016-06-20"> <obsolete> Deprecated in M53. @@ -142592,7 +143209,7 @@ <summary>The result of opening the Sync FileSystem backend database.</summary> </histogram> -<histogram name="SyncFileSystem.MetadataNumber"> +<histogram name="SyncFileSystem.MetadataNumber" units="units"> <owner>tzik@chromium.org</owner> <summary> The number of cached backing remote file metadata in the Sync FileSystem @@ -142600,7 +143217,7 @@ </summary> </histogram> -<histogram name="SyncFileSystem.RegisteredAppNumber"> +<histogram name="SyncFileSystem.RegisteredAppNumber" units="units"> <owner>tzik@chromium.org</owner> <summary> The number of Chrome Apps that uses Sync FileSystem with V2 backend. @@ -142632,7 +143249,7 @@ <summary>The result of opening the Sync FileSystem tracker database.</summary> </histogram> -<histogram name="SyncFileSystem.TrackerNumber"> +<histogram name="SyncFileSystem.TrackerNumber" units="units"> <owner>tzik@chromium.org</owner> <summary> The number of the directory tree node that maps backing files to local files @@ -142700,7 +143317,7 @@ </summary> </histogram> -<histogram name="Tab.BackgroundTabsOpenedViaContextMenuCount"> +<histogram name="Tab.BackgroundTabsOpenedViaContextMenuCount" units="units"> <owner>pkotwicz@chromium.org</owner> <summary> Counts the number of background tabs opened via the context menu per page @@ -142730,7 +143347,7 @@ </summary> </histogram> -<histogram name="Tab.Count.Guest" expires_after="M85"> +<histogram name="Tab.Count.Guest" units="units" expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -142743,7 +143360,7 @@ </summary> </histogram> -<histogram name="Tab.Count.Incognito" expires_after="M85"> +<histogram name="Tab.Count.Incognito" units="units" expires_after="M85"> <owner>rhalavati@chromium.org</owner> <owner>chrome-privacy-core@google.com</owner> <summary> @@ -142843,7 +143460,7 @@ </summary> </histogram> -<histogram name="Tab.FormActivityCountEvictedHistogram" +<histogram name="Tab.FormActivityCountEvictedHistogram" units="units" expires_after="2016-10-06"> <obsolete> Deprecated as of 10/2016. @@ -142954,7 +143571,8 @@ <summary>[iOS] The orientation of the device. Recorded on page load.</summary> </histogram> -<histogram name="Tab.PageLoadsSinceLastSwitchToEvictedTab" expires_after="M77"> +<histogram name="Tab.PageLoadsSinceLastSwitchToEvictedTab" units="units" + expires_after="M77"> <owner>dtrainor@chromium.org</owner> <summary> [Android] The number of page loads since the last switch to an evicted tab @@ -143200,7 +143818,8 @@ </summary> </histogram> -<histogram name="Tab.SwitchedToForegroundMRURank" expires_after="2014-04-14"> +<histogram name="Tab.SwitchedToForegroundMRURank" units="units" + expires_after="2014-04-14"> <obsolete> Deprecated as of 04/2014. </obsolete> @@ -143209,7 +143828,8 @@ </summary> </histogram> -<histogram name="Tab.SwitchedToForegroundNumTabs" expires_after="2019-01-16"> +<histogram name="Tab.SwitchedToForegroundNumTabs" units="units" + expires_after="2019-01-16"> <obsolete> No longer logged </obsolete> @@ -143411,7 +144031,7 @@ </histogram> <histogram name="TabHoverCards.TabHoverCardsSeenBeforeTabSelection" - expires_after="2020-01-01"> + units="units" expires_after="2020-01-01"> <owner>corising@chromium.org</owner> <owner>chrome-desktop-ui-sea@google.com</owner> <summary> @@ -143637,7 +144257,7 @@ </summary> </histogram> -<histogram name="TabManager.Discarding.DiscardedEngagementScore" +<histogram name="TabManager.Discarding.DiscardedEngagementScore" units="units" expires_after="2017-11-21"> <obsolete> Deprecated 11/2017. Analysis showed that MRU was as good as engagement score @@ -143768,7 +144388,7 @@ </summary> </histogram> -<histogram name="TabManager.Discarding.ReloadedEngagementScore" +<histogram name="TabManager.Discarding.ReloadedEngagementScore" units="units" expires_after="2017-11-21"> <obsolete> Deprecated 11/2017. Analysis showed that MRU was as good as engagement score @@ -144301,7 +144921,8 @@ <summary>[Android and iOS] The number of tabs open at cold launch.</summary> </histogram> -<histogram name="Tabs.Discard.DiscardCount" expires_after="2015-10-06"> +<histogram name="Tabs.Discard.DiscardCount" units="units" + expires_after="2015-10-06"> <obsolete> Deprecated 10/2015, and replaced by TabManager.Discarding.DiscardCount. </obsolete> @@ -144445,7 +145066,8 @@ </summary> </histogram> -<histogram name="Tabs.Discard.ReloadCount" expires_after="2015-10-06"> +<histogram name="Tabs.Discard.ReloadCount" units="units" + expires_after="2015-10-06"> <obsolete> Deprecated 10/2015, and replaced by TabManager.Discarding.ReloadCount. </obsolete> @@ -144509,7 +145131,7 @@ </summary> </histogram> -<histogram name="Tabs.FirstSwitchedToForegroundCreationRank" +<histogram name="Tabs.FirstSwitchedToForegroundCreationRank" units="units" expires_after="M77"> <owner>pkotwicz@chromium.org</owner> <summary> @@ -144521,7 +145143,7 @@ </histogram> <histogram name="Tabs.FirstSwitchedToForegroundCreationReverseRank" - expires_after="M77"> + units="units" expires_after="M77"> <owner>pkotwicz@chromium.org</owner> <summary> Records the "Reverse Tab Creation Rank" for the first background @@ -145033,7 +145655,7 @@ </details> </histogram> -<histogram base="true" name="Tabs.TabOffsetOfSwitch"> +<histogram base="true" name="Tabs.TabOffsetOfSwitch" units="units"> <owner>yusufo@chromium.org</owner> <summary> How many tabs a user moved forward or backward in the Android tab switcher. @@ -145316,7 +145938,7 @@ </summary> </histogram> -<histogram name="TaskQueueManager.ActiveQueuesCount"> +<histogram name="TaskQueueManager.ActiveQueuesCount" units="units"> <owner>altimin@chromium.org</owner> <owner>farahcharab@chromium.org</owner> <summary> @@ -146084,7 +146706,7 @@ </summary> </histogram> -<histogram name="ThreadWatcher.ResponsiveThreads"> +<histogram name="ThreadWatcher.ResponsiveThreads" units="units"> <owner>rch@chromium.org</owner> <summary> This is the total number of watched threads that are responding when we got @@ -146100,7 +146722,7 @@ </summary> </histogram> -<histogram name="ThreadWatcher.UnresponsiveThreads"> +<histogram name="ThreadWatcher.UnresponsiveThreads" units="units"> <owner>rch@chromium.org</owner> <summary> This is the total number of watched threads that are not responding when we @@ -146246,7 +146868,8 @@ <summary>Result of TimeZoneRequest.</summary> </histogram> -<histogram name="TimeZone.TimeZoneRequest.Retries" expires_after="never"> +<histogram name="TimeZone.TimeZoneRequest.Retries" units="units" + expires_after="never"> <!-- expires-never: This reports external time zone provider health status and should be kept until we use this API. --> @@ -146255,7 +146878,7 @@ <summary>Number of retries until the final response was recorded.</summary> </histogram> -<histogram name="Toolbar.ActionsModel.ComponentActionsCount" +<histogram name="Toolbar.ActionsModel.ComponentActionsCount" units="units" expires_after="2018-12-27"> <obsolete> We no longer have component actions. @@ -146269,7 +146892,7 @@ </summary> </histogram> -<histogram name="Toolbar.ActionsModel.OverallActionsCount" +<histogram name="Toolbar.ActionsModel.OverallActionsCount" units="units" expires_after="2019-02-28"> <obsolete> After the removal of component actions, this histogram is equivalent to @@ -146284,7 +146907,7 @@ </summary> </histogram> -<histogram name="Toolbar.ActionsModel.ToolbarActionsVisible"> +<histogram name="Toolbar.ActionsModel.ToolbarActionsVisible" units="units"> <obsolete> Obsolete. See ExtensionToolbarModel.BrowserActionsVisible instead. Stopped recording 2019-07. @@ -146367,7 +146990,8 @@ </summary> </histogram> -<histogram name="TopSites.NumberOfApplyBlacklist" expires_after="2018-08-30"> +<histogram name="TopSites.NumberOfApplyBlacklist" units="units" + expires_after="2018-08-30"> <obsolete> Long removed. </obsolete> @@ -146375,7 +146999,8 @@ <summary>The number of times TopSitesImpl::ApplyBlacklist is called.</summary> </histogram> -<histogram name="TopSites.NumberOfBlacklistedItems" expires_after="2018-08-30"> +<histogram name="TopSites.NumberOfBlacklistedItems" units="units" + expires_after="2018-08-30"> <obsolete> Long removed. </obsolete> @@ -146725,7 +147350,8 @@ </summary> </histogram> -<histogram name="Translate.AlwaysTranslateLang" expires_after="2020-02-23"> +<histogram name="Translate.AlwaysTranslateLang" units="units" + expires_after="2020-02-23"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the always translate option was selected in the @@ -146867,7 +147493,8 @@ </summary> </histogram> -<histogram name="Translate.DeclineTranslate" expires_after="2020-01-26"> +<histogram name="Translate.DeclineTranslate" units="units" + expires_after="2020-01-26"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the "Nope" (don't translate) or the infobar's @@ -146875,7 +147502,7 @@ </summary> </histogram> -<histogram name="Translate.DeclineTranslateCloseInfobar" +<histogram name="Translate.DeclineTranslateCloseInfobar" units="units" expires_after="2020-02-16"> <owner>kenjibaheux@google.com</owner> <summary> @@ -146884,7 +147511,7 @@ </summary> </histogram> -<histogram name="Translate.DeclineTranslateDismissUI" +<histogram name="Translate.DeclineTranslateDismissUI" units="units" expires_after="2020-02-23"> <owner>kenjibaheux@google.com</owner> <summary> @@ -147056,7 +147683,7 @@ </summary> </histogram> -<histogram name="Translate.ModifyOriginalLang"> +<histogram name="Translate.ModifyOriginalLang" units="units"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the original language in the translate infobar has been @@ -147064,7 +147691,8 @@ </summary> </histogram> -<histogram name="Translate.ModifyTargetLang" expires_after="2020-01-26"> +<histogram name="Translate.ModifyTargetLang" units="units" + expires_after="2020-01-26"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the target language in the translate infobar has been @@ -147072,7 +147700,8 @@ </summary> </histogram> -<histogram name="Translate.NeverTranslateLang" expires_after="2020-02-23"> +<histogram name="Translate.NeverTranslateLang" units="units" + expires_after="2020-02-23"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the never translate option was selected in the translate @@ -147080,7 +147709,7 @@ </summary> </histogram> -<histogram name="Translate.NeverTranslateSite"> +<histogram name="Translate.NeverTranslateSite" units="units"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the never translate site was selected in the translate @@ -147184,7 +147813,7 @@ </summary> </histogram> -<histogram name="Translate.ReportLanguageDetectionError"> +<histogram name="Translate.ReportLanguageDetectionError" units="units"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the "report this error" of options menu is @@ -147192,7 +147821,8 @@ </summary> </histogram> -<histogram name="Translate.RevertTranslation" expires_after="2020-02-23"> +<histogram name="Translate.RevertTranslation" units="units" + expires_after="2020-02-23"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the show original button was clicked in the translate @@ -147200,7 +147830,7 @@ </summary> </histogram> -<histogram name="Translate.ServerReportedUnsupportedLanguage" +<histogram name="Translate.ServerReportedUnsupportedLanguage" units="units" expires_after="2013-06-14"> <obsolete> Deprecated 5/2013 by Translate.UndisplayableLanguage @@ -147212,7 +147842,7 @@ </summary> </histogram> -<histogram name="Translate.ShowBeforeTranslateInfobar" +<histogram name="Translate.ShowBeforeTranslateInfobar" units="units" expires_after="2013-05-30"> <obsolete> Deprecated 7/2010. No longer tracked. @@ -147538,7 +148168,8 @@ </summary> </histogram> -<histogram name="UKM.Entries.SerializedCount" expires_after="2018-02-16"> +<histogram name="UKM.Entries.SerializedCount" units="units" + expires_after="2018-02-16"> <obsolete> Deprecated 2/2018 by UKM.Entries.SerializedCount2. </obsolete> @@ -147727,7 +148358,8 @@ </summary> </histogram> -<histogram name="UKM.UnsentLogs.NumDropped" expires_after="2020-07-01"> +<histogram name="UKM.UnsentLogs.NumDropped" units="units" + expires_after="2020-07-01"> <owner>rkaplow@chromium.org</owner> <owner>ukm-team@google.com</owner> <summary> @@ -147987,7 +148619,8 @@ </summary> </histogram> -<histogram name="UMA.Discarded Log Events" expires_after="2017-06-05"> +<histogram name="UMA.Discarded Log Events" units="units" + expires_after="2017-06-05"> <obsolete> Replaced by UMA.Truncate* metrics. </obsolete> @@ -148070,7 +148703,7 @@ </summary> </histogram> -<histogram name="UMA.FileMetricsProvider.DeletedFiles" +<histogram name="UMA.FileMetricsProvider.DeletedFiles" units="units" expires_after="2018-04-12"> <obsolete> Removed April, 2018 as the information it provides is no longer useful. @@ -148085,7 +148718,7 @@ </summary> </histogram> -<histogram name="UMA.FileMetricsProvider.DirectoryFiles" +<histogram name="UMA.FileMetricsProvider.DirectoryFiles" units="units" expires_after="2018-04-12"> <obsolete> Removed April, 2018 as no problems were ever indicated. @@ -148113,7 +148746,7 @@ </histogram> <histogram name="UMA.FileMetricsProvider.EmbeddedProfile.DroppedHistogramCount" - expires_after="M75"> + units="units" expires_after="M75"> <obsolete> Removed 2019/04 with the resolution of https://crbug.com/695880 </obsolete> @@ -148348,7 +148981,8 @@ </summary> </histogram> -<histogram name="UMA.LogLoadComplete called" expires_after="2016-04-09"> +<histogram name="UMA.LogLoadComplete called" units="units" + expires_after="2016-04-09"> <obsolete> No longer tracked. </obsolete> @@ -148426,7 +149060,8 @@ </summary> </histogram> -<histogram name="UMA.LowEntropySource3Value" expires_after="2020-08-30"> +<histogram name="UMA.LowEntropySource3Value" units="units" + expires_after="2020-08-30"> <owner>asvitkine@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -148437,7 +149072,8 @@ </summary> </histogram> -<histogram name="UMA.LowEntropySourceValue" expires_after="2020-03-01"> +<histogram name="UMA.LowEntropySourceValue" units="units" + expires_after="2020-03-01"> <owner>asvitkine@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -148608,7 +149244,8 @@ </summary> </histogram> -<histogram name="UMA.PersistentHistograms.TmpRemovals" expires_after="M77"> +<histogram name="UMA.PersistentHistograms.TmpRemovals" units="units" + expires_after="M77"> <obsolete> Data showed many files being deleted during rollout and then tapering off to near zero. Removed 2019/07. @@ -148632,7 +149269,8 @@ </summary> </histogram> -<histogram name="UMA.ProfilesCount.AfterErase" expires_after="2016-06-14"> +<histogram name="UMA.ProfilesCount.AfterErase" units="units" + expires_after="2016-06-14"> <obsolete> Deprecated as of Jun 2016. The histogram was added for debugging purpose and is not needed anymore. @@ -148732,7 +149370,8 @@ </summary> </histogram> -<histogram name="UMA.SyntheticTrials.Count" expires_after="2015-08-06"> +<histogram name="UMA.SyntheticTrials.Count" units="units" + expires_after="2015-08-06"> <obsolete> Deprecated as of August 2015. </obsolete> @@ -148763,7 +149402,8 @@ </summary> </histogram> -<histogram name="UMA.Unacceptable_Log_Discarded" expires_after="2013-07-11"> +<histogram name="UMA.Unacceptable_Log_Discarded" units="units" + expires_after="2013-07-11"> <obsolete> Deprecated as of May, 2012 (i.e. Chrome 21+). Replaced by the UMA.UploadResponseStatus.XML and UMA.UploadResponseStatus.Protobuf @@ -148778,7 +149418,8 @@ </details> </histogram> -<histogram name="UMA.UnsentLogs.Dropped" expires_after="2019-08-30"> +<histogram name="UMA.UnsentLogs.Dropped" units="units" + expires_after="2019-08-30"> <owner>holte@chromium.org</owner> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -149377,7 +150018,7 @@ </summary> </histogram> -<histogram name="UpdateEngine.KernelKey.MaxRollforwardVersion" +<histogram name="UpdateEngine.KernelKey.MaxRollforwardVersion" units="units" expires_after="M93"> <owner>poromov@chromium.org</owner> <summary> @@ -149396,7 +150037,8 @@ </summary> </histogram> -<histogram name="UpdateEngine.KernelKey.MinVersion" expires_after="M93"> +<histogram name="UpdateEngine.KernelKey.MinVersion" units="units" + expires_after="M93"> <owner>poromov@chromium.org</owner> <summary> Minimum kernel key version already set in the TPM. This value specifies @@ -150067,7 +150709,7 @@ </summary> </histogram> -<histogram name="V8.ASTOptimization" expires_after="2014-09-16"> +<histogram name="V8.ASTOptimization" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -150088,7 +150730,7 @@ <summary>Cache size to source size ratio when caching compiled code.</summary> </histogram> -<histogram name="V8.CodeCreation" expires_after="2014-09-16"> +<histogram name="V8.CodeCreation" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -150096,7 +150738,7 @@ <summary>TBD</summary> </histogram> -<histogram name="V8.CodeGeneration" expires_after="2014-09-16"> +<histogram name="V8.CodeGeneration" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -150460,7 +151102,8 @@ </summary> </histogram> -<histogram name="V8.DeferredCodeGeneration" expires_after="2014-09-16"> +<histogram name="V8.DeferredCodeGeneration" units="units" + expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8 </obsolete> @@ -150468,7 +151111,7 @@ <summary>Time spent generating deferred code stubs.</summary> </histogram> -<histogram name="V8.DetachedContextAgeInGC"> +<histogram name="V8.DetachedContextAgeInGC" units="units"> <obsolete> This histogram has been removed. </obsolete> @@ -151177,7 +151820,7 @@ <summary>Time spent preparsing source code.</summary> </histogram> -<histogram name="V8.Rewriting" expires_after="2014-09-16"> +<histogram name="V8.Rewriting" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151185,7 +151828,7 @@ <summary>Time spent on rewriting ASTs before compilation.</summary> </histogram> -<histogram name="V8.RSetLO" expires_after="2014-09-16"> +<histogram name="V8.RSetLO" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151193,7 +151836,7 @@ <summary>TBD</summary> </histogram> -<histogram name="V8.RSetPaged" expires_after="2014-09-16"> +<histogram name="V8.RSetPaged" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151201,7 +151844,7 @@ <summary>TBD</summary> </histogram> -<histogram name="V8.ScriptCache" expires_after="2015-01-27"> +<histogram name="V8.ScriptCache" units="units" expires_after="2015-01-27"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151367,7 +152010,7 @@ </summary> </histogram> -<histogram name="V8.UsageAnalysis" expires_after="2014-09-16"> +<histogram name="V8.UsageAnalysis" units="units" expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151375,7 +152018,8 @@ <summary>Time spent analysing the usage of variables.</summary> </histogram> -<histogram name="V8.VariableAllocation" expires_after="2014-09-16"> +<histogram name="V8.VariableAllocation" units="units" + expires_after="2014-09-16"> <obsolete> This histogram is no longer present in V8. </obsolete> @@ -151913,7 +152557,8 @@ </summary> </histogram> -<histogram name="Variations.Headers.ExperimentCount" expires_after="M90"> +<histogram name="Variations.Headers.ExperimentCount" units="units" + expires_after="M90"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -151969,7 +152614,8 @@ </summary> </histogram> -<histogram name="Variations.RequestCount" expires_after="2018-08-30"> +<histogram name="Variations.RequestCount" units="units" + expires_after="2018-08-30"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -152325,7 +152971,7 @@ </summary> </histogram> -<histogram name="Variations.SimulateSeed.KillBestEffortChanges" +<histogram name="Variations.SimulateSeed.KillBestEffortChanges" units="units" expires_after="2018-08-30"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> @@ -152339,7 +152985,7 @@ </summary> </histogram> -<histogram name="Variations.SimulateSeed.KillCriticalChanges" +<histogram name="Variations.SimulateSeed.KillCriticalChanges" units="units" expires_after="2018-08-30"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> @@ -152353,7 +152999,7 @@ </summary> </histogram> -<histogram name="Variations.SimulateSeed.NormalChanges" +<histogram name="Variations.SimulateSeed.NormalChanges" units="units" expires_after="2018-08-30"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> @@ -152540,7 +153186,7 @@ </summary> </histogram> -<histogram name="VideoPlayer.NumberOfCastDevices"> +<histogram name="VideoPlayer.NumberOfCastDevices" units="units"> <owner>yoshiki@chromium.org</owner> <summary> Chrome OS Video Player: the number of cast devices. This is recorded when @@ -152548,7 +153194,7 @@ </summary> </histogram> -<histogram name="VideoPlayer.NumberOfOpenedFiles"> +<histogram name="VideoPlayer.NumberOfOpenedFiles" units="units"> <owner>yoshiki@chromium.org</owner> <summary> Chrome OS Video Player: the number of files being opened on launch. @@ -152650,7 +153296,7 @@ </summary> </histogram> -<histogram name="VirtualKeyboard.KeystrokesBetweenBackspace" +<histogram name="VirtualKeyboard.KeystrokesBetweenBackspace" units="units" expires_after="2016-04-29"> <obsolete> Deprecated 04/2016 as doesn't have data nor owner. @@ -152999,7 +153645,8 @@ <summary>The version of the runtime being used for VR.</summary> </histogram> -<histogram name="VRSessionNavigationCount" expires_after="2020-07-01"> +<histogram name="VRSessionNavigationCount" units="units" + expires_after="2020-07-01"> <owner>billorr@chromium.org</owner> <owner>cassew@chromium.org</owner> <owner>samdrazin@chromium.org</owner> @@ -153031,7 +153678,7 @@ </summary> </histogram> -<histogram name="VRSessionVideoCount" expires_after="2020-07-01"> +<histogram name="VRSessionVideoCount" units="units" expires_after="2020-07-01"> <owner>billorr@chromium.org</owner> <owner>cassew@chromium.org</owner> <owner>samdrazin@chromium.org</owner> @@ -153623,7 +154270,8 @@ </summary> </histogram> -<histogram base="true" name="WebApk.ShellApkVersion" expires_after="2018-08-29"> +<histogram base="true" name="WebApk.ShellApkVersion" units="units" + expires_after="2018-08-29"> <obsolete> Deprecated 2018-08 in favour of WebApk.ShellApkVersion2. </obsolete> @@ -153636,7 +154284,7 @@ </summary> </histogram> -<histogram base="true" name="WebApk.ShellApkVersion2" +<histogram base="true" name="WebApk.ShellApkVersion2" units="units" expires_after="2020-01-20"> <owner>hanxi@chromium.org</owner> <owner>pkotwicz@chromium.org</owner> @@ -153995,7 +154643,8 @@ </summary> </histogram> -<histogram name="WebAudio.AudioBuffer.NumberOfChannels" expires_after="M81"> +<histogram name="WebAudio.AudioBuffer.NumberOfChannels" units="units" + expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> <summary> @@ -154028,7 +154677,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioBuffer.SampleRateRatio" +<histogram name="WebAudio.AudioBuffer.SampleRateRatio" units="units" expires_after="2016-10-12"> <obsolete> Replaced by SampleRateRatio384kHz in Issue 644683 on 2016/10 due to higher @@ -154043,7 +154692,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioBuffer.SampleRateRatio384kHz" +<histogram name="WebAudio.AudioBuffer.SampleRateRatio384kHz" units="units" expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -154064,7 +154713,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioContext.MaxChannelsAvailable" +<histogram name="WebAudio.AudioContext.MaxChannelsAvailable" units="units" expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -154086,7 +154735,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioContextOptions.sampleRateRatio" +<histogram name="WebAudio.AudioContextOptions.sampleRateRatio" units="units" expires_after="2020-03-08"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -154097,7 +154746,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioDestination.CallbackBufferSize" +<histogram name="WebAudio.AudioDestination.CallbackBufferSize" units="units" expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -154109,7 +154758,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioDestination.HardwareBufferSize" +<histogram name="WebAudio.AudioDestination.HardwareBufferSize" units="units" expires_after="2020-03-08"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> @@ -154119,7 +154768,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioParam.ValueSetterConflictCount" +<histogram name="WebAudio.AudioParam.ValueSetterConflictCount" units="units" expires_after="2018-02-08"> <obsolete> Removed 02/2018 in Issue 764396. Information no longer needed or recorded. @@ -154134,7 +154783,7 @@ </histogram> <histogram name="WebAudio.AudioParam.ValueSetterConflictPercentage" - expires_after="2018-02-08"> + units="units" expires_after="2018-02-08"> <obsolete> Removed 02/2018 in Issue 764396. Information no longer needed or recorded. </obsolete> @@ -154147,7 +154796,7 @@ </summary> </histogram> -<histogram name="WebAudio.AudioParam.ValueSetterCount" +<histogram name="WebAudio.AudioParam.ValueSetterCount" units="units" expires_after="2018-02-08"> <obsolete> Removed 02/2018 in Issue 764396. Information no longer needed or recorded. @@ -154197,7 +154846,8 @@ </summary> </histogram> -<histogram name="WebAudio.BiquadFilter.Q.Highpass" expires_after="2017-10-16"> +<histogram name="WebAudio.BiquadFilter.Q.Highpass" units="units" + expires_after="2017-10-16"> <obsolete> Removed in Issue 774526 on 2017/10; statistics aren't needed anymore. </obsolete> @@ -154211,7 +154861,8 @@ </summary> </histogram> -<histogram name="WebAudio.BiquadFilter.Q.Lowpass" expires_after="2017-10-16"> +<histogram name="WebAudio.BiquadFilter.Q.Lowpass" units="units" + expires_after="2017-10-16"> <obsolete> Removed in Issue 774526 on 2017/10; statistics aren't needed anymore. </obsolete> @@ -154237,7 +154888,8 @@ </summary> </histogram> -<histogram name="WebAudio.IIRFilterNode.Order" expires_after="M81"> +<histogram name="WebAudio.IIRFilterNode.Order" units="units" + expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> <summary> @@ -154247,7 +154899,8 @@ </summary> </histogram> -<histogram name="WebAudio.OfflineAudioContext.ChannelCount" expires_after="M81"> +<histogram name="WebAudio.OfflineAudioContext.ChannelCount" units="units" + expires_after="M81"> <owner>rtoy@chromium.org</owner> <owner>hongchan@chromium.org</owner> <summary> @@ -154617,7 +155270,8 @@ </summary> </histogram> -<histogram name="WebCore.FindInPage.ScopingTime" expires_after="M77"> +<histogram name="WebCore.FindInPage.ScopingTime" units="units" + expires_after="M77"> <obsolete> Deprecated in M77 because we're not tracking this anymore. </obsolete> @@ -155593,7 +156247,8 @@ </summary> </histogram> -<histogram name="WebCore.ResourceFetcher.HitCount" expires_after="2017-04-24"> +<histogram name="WebCore.ResourceFetcher.HitCount" units="units" + expires_after="2017-04-24"> <obsolete> Deprecated April 2017. </obsolete> @@ -155604,7 +156259,8 @@ </summary> </histogram> -<histogram name="WebCore.ResourceFetcher.LoadCount" expires_after="2017-04-24"> +<histogram name="WebCore.ResourceFetcher.LoadCount" units="units" + expires_after="2017-04-24"> <obsolete> Deprecated April 2017. </obsolete> @@ -155637,7 +156293,7 @@ </summary> </histogram> -<histogram name="WebCore.ResourceFetcher.RevalidateCount" +<histogram name="WebCore.ResourceFetcher.RevalidateCount" units="units" expires_after="2017-04-24"> <obsolete> Deprecated April 2017. @@ -155849,7 +156505,7 @@ </summary> </histogram> -<histogram name="WebCore.WebSocket.BinaryTypeChangesAfterOpen" +<histogram name="WebCore.WebSocket.BinaryTypeChangesAfterOpen" units="units" expires_after="2017-06-12"> <obsolete> Deprecate 2017-06, as we've collected enough data to discuss. (see issue @@ -156017,7 +156673,8 @@ </summary> </histogram> -<histogram name="WebFont.DiskCache.ReuseCount.Evict" expires_after="M81"> +<histogram name="WebFont.DiskCache.ReuseCount.Evict" units="units" + expires_after="M81"> <obsolete> Deprecated 08/2019. </obsolete> @@ -156029,7 +156686,8 @@ </summary> </histogram> -<histogram name="WebFont.DiskCache.ReuseCount.Hit" expires_after="M81"> +<histogram name="WebFont.DiskCache.ReuseCount.Hit" units="units" + expires_after="M81"> <obsolete> Deprecated 08/2019. </obsolete> @@ -156361,7 +157019,7 @@ </summary> </histogram> -<histogram name="WebFont.WebFontsInPage" expires_after="M77"> +<histogram name="WebFont.WebFontsInPage" units="units" expires_after="M77"> <obsolete> Removed June 2019. </obsolete> @@ -156461,7 +157119,7 @@ </summary> </histogram> -<histogram name="WebRTC.ApplicationMaxConsecutiveBytesDiscard" +<histogram name="WebRTC.ApplicationMaxConsecutiveBytesDiscard" units="units" expires_after="2014-12-28"> <obsolete> Deprecated as of 12/2014, replaced by @@ -156475,7 +157133,7 @@ </summary> </histogram> -<histogram name="WebRTC.ApplicationMaxConsecutiveBytesDiscard.v2" +<histogram name="WebRTC.ApplicationMaxConsecutiveBytesDiscard.v2" units="units" expires_after="M77"> <owner>guoweis@chromium.org</owner> <summary> @@ -157404,7 +158062,7 @@ </summary> </histogram> -<histogram name="WebRTC.BWE.Probing.ProbesPerCluster" +<histogram name="WebRTC.BWE.Probing.ProbesPerCluster" units="units" expires_after="2020-10-01"> <owner>jonasolsson@chromium.org</owner> <owner>crodbro@chromium.org</owner> @@ -157424,7 +158082,7 @@ </summary> </histogram> -<histogram name="WebRTC.BWE.Probing.TotalFailedProbeClusters" +<histogram name="WebRTC.BWE.Probing.TotalFailedProbeClusters" units="units" expires_after="2020-10-01"> <owner>jonasolsson@chromium.org</owner> <owner>crodbro@chromium.org</owner> @@ -157434,7 +158092,7 @@ </summary> </histogram> -<histogram name="WebRTC.BWE.Probing.TotalProbeClustersRequested" +<histogram name="WebRTC.BWE.Probing.TotalProbeClustersRequested" units="units" expires_after="2020-10-01"> <owner>jonasolsson@chromium.org</owner> <owner>crodbro@chromium.org</owner> @@ -157595,7 +158253,7 @@ </summary> </histogram> -<histogram name="WebRTC.DataChannelMaxRetransmits"> +<histogram name="WebRTC.DataChannelMaxRetransmits" units="units"> <owner>perkj@chromium.org</owner> <summary> The maximum number of retransmissions that are attempted in unreliable mode. @@ -157647,7 +158305,7 @@ </summary> </histogram> -<histogram name="WebRTC.NumDataChannelsPerPeerConnection" +<histogram name="WebRTC.NumDataChannelsPerPeerConnection" units="units" expires_after="2020-02-16"> <owner>perkj@chromium.org</owner> <summary> @@ -157803,7 +158461,8 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.IPv4Interfaces" expires_after="M81"> +<histogram name="WebRTC.PeerConnection.IPv4Interfaces" units="units" + expires_after="M81"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -157811,7 +158470,8 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.IPv4LocalCandidates" expires_after="M81"> +<histogram name="WebRTC.PeerConnection.IPv4LocalCandidates" units="units" + expires_after="M81"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -157821,7 +158481,8 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.IPv6Interfaces" expires_after="M81"> +<histogram name="WebRTC.PeerConnection.IPv6Interfaces" units="units" + expires_after="M81"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -157829,7 +158490,8 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.IPv6LocalCandidates" expires_after="M81"> +<histogram name="WebRTC.PeerConnection.IPv6LocalCandidates" units="units" + expires_after="M81"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -158014,7 +158676,8 @@ </summary> </histogram> -<histogram name="WebRTC.PeerConnection.Simulcast.Disabled" expires_after="M81"> +<histogram name="WebRTC.PeerConnection.Simulcast.Disabled" units="units" + expires_after="M81"> <owner>amithi@chromium.org</owner> <summary> Simulcast was disabled because it is not supported by the remote party. This @@ -158023,7 +158686,7 @@ </histogram> <histogram name="WebRTC.PeerConnection.Simulcast.NumberOfSendEncodings" - expires_after="M81"> + units="units" expires_after="M81"> <owner>amithi@chromium.org</owner> <summary> Counts the number of send encodings given to PeerConnection::AddTransceiver. @@ -158190,7 +158853,8 @@ </summary> </histogram> -<histogram name="WebRTC.SystemMaxConsecutiveBytesDelayed" expires_after="M81"> +<histogram name="WebRTC.SystemMaxConsecutiveBytesDelayed" units="units" + expires_after="M81"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -159193,14 +159857,16 @@ </summary> </histogram> -<histogram name="WebRTC.Video.Screenshare.Layer0" expires_after="M81"> +<histogram name="WebRTC.Video.Screenshare.Layer0" units="units" + expires_after="M81"> <owner>sprang@chromium.org</owner> <summary> Stats for the lower layer (TL0) of a screenshare stream in conference mode. </summary> </histogram> -<histogram name="WebRTC.Video.Screenshare.Layer1" expires_after="M81"> +<histogram name="WebRTC.Video.Screenshare.Layer1" units="units" + expires_after="M81"> <owner>sprang@chromium.org</owner> <summary> Stats for the higher layer (TL1) of a screenshare stream in conference mode. @@ -159649,7 +160315,8 @@ </summary> </histogram> -<histogram name="WebRtcEventLogging.NetError" expires_after="2020-03-01"> +<histogram name="WebRtcEventLogging.NetError" units="units" + expires_after="2020-03-01"> <owner>eladalon@chromium.org</owner> <owner>saeedj@google.com</owner> <owner>manj@google.com</owner> @@ -160135,7 +160802,7 @@ </summary> </histogram> -<histogram name="WindowManager.AppWindowCountPerLoad"> +<histogram name="WindowManager.AppWindowCountPerLoad" units="units"> <owner>kuscher@chromium.org</owner> <summary> The number of app windows open when a load completes. This includes windows @@ -160144,7 +160811,7 @@ </summary> </histogram> -<histogram name="WindowManager.PanelWindowCountPerLoad" +<histogram name="WindowManager.PanelWindowCountPerLoad" units="units" expires_after="2015-04-13"> <obsolete> Deprecated 4/2013. No longer tracked. @@ -160157,7 +160824,7 @@ </summary> </histogram> -<histogram name="WindowManager.PopUpWindowCountPerLoad"> +<histogram name="WindowManager.PopUpWindowCountPerLoad" units="units"> <owner>kuscher@chromium.org</owner> <summary> The number of popup windows open when a load completes. Popup windows only @@ -160166,7 +160833,7 @@ </summary> </histogram> -<histogram name="WindowManager.TabbedWindowCountPerLoad"> +<histogram name="WindowManager.TabbedWindowCountPerLoad" units="units"> <owner>kuscher@chromium.org</owner> <summary> The number of tabbed windows open when a load completes. A tabbed window is @@ -160383,7 +161050,8 @@ <summary>The type of category clicked in the Windows Jumplist</summary> </histogram> -<histogram name="WinJumplist.CreateIconFilesCount" expires_after="2017-07-07"> +<histogram name="WinJumplist.CreateIconFilesCount" units="units" + expires_after="2017-07-07"> <obsolete> Obsolete 07/06/2017 as we are no long recording this metric. </obsolete> @@ -160692,7 +161360,8 @@ </summary> </histogram> -<histogram name="WinTimeTicks.NonStopTsc" expires_after="2017-01-12"> +<histogram name="WinTimeTicks.NonStopTsc" units="units" + expires_after="2017-01-12"> <obsolete> Removed 01/2017. </obsolete> @@ -160826,7 +161495,7 @@ </summary> </histogram> -<histogram name="WrenchMenu.TimeToAction" expires_after="M81"> +<histogram name="WrenchMenu.TimeToAction" units="units" expires_after="M81"> <owner>ainslie@chromium.org</owner> <owner>edwardjung@chromium.org</owner> <summary> @@ -160989,7 +161658,8 @@ </summary> </histogram> -<histogram name="ZeroSuggest.AllResults" expires_after="2020-03-01"> +<histogram name="ZeroSuggest.AllResults" units="units" + expires_after="2020-03-01"> <owner>hfung@chromium.org</owner> <summary> The number of results (either query or URL) from ZeroSuggest. This is set @@ -160998,7 +161668,7 @@ </summary> </histogram> -<histogram name="ZeroSuggest.QueryResults" expires_after="M77"> +<histogram name="ZeroSuggest.QueryResults" units="units" expires_after="M77"> <owner>hfung@chromium.org</owner> <summary> The number of query results returned from ZeroSuggest. This is set every @@ -161007,7 +161677,7 @@ </summary> </histogram> -<histogram name="ZeroSuggest.URLResults" expires_after="M77"> +<histogram name="ZeroSuggest.URLResults" units="units" expires_after="M77"> <owner>hfung@chromium.org</owner> <summary> The number of URL results returned from ZeroSuggest. This is set every time @@ -161758,6 +162428,12 @@ <affected-histogram name="Arc.Runtime.Performance.RenderQuality"/> </histogram_suffixes> +<histogram_suffixes name="ArcThrottleObservers" separator="."> + <suffix name="ArcIsBooting" label="ARC++ is booting or restarting."/> + <suffix name="ArcWindowIsActiveWindow" label="An ARC++ window is active."/> + <affected-histogram name="Arc.CpuRestrictionDisabled"/> +</histogram_suffixes> + <histogram_suffixes name="ArcUserTypes" separator="."> <suffix name="ActiveDirectory" label="User with active directory account"/> <suffix name="Child" label="User with child accounts."/> @@ -165779,6 +166455,7 @@ <histogram_suffixes name="FileBrowserCrostiniSharedPathsDepth" separator="."> <suffix name="AndroidFiles" label="Shared path in Android volume."/> + <suffix name="Crostini" label="Shared path in Crostini volume."/> <suffix name="Downloads" label="Shared path in Downloads volume."/> <suffix name="DriveComputers" label="Shared path in Drive Computers volume."/> <suffix name="MyDrive" label="Shared path in My Drive volume."/>
diff --git a/tools/perf/benchmarks/benchmark_smoke_unittest.py b/tools/perf/benchmarks/benchmark_smoke_unittest.py index a5062cc..b04498c 100644 --- a/tools/perf/benchmarks/benchmark_smoke_unittest.py +++ b/tools/perf/benchmarks/benchmark_smoke_unittest.py
@@ -114,6 +114,7 @@ 'tab_switching.typical_25', 'UNSCHEDULED_oortonline_tbmv2', 'webrtc', # crbug.com/932036 + 'speedometer2-future' # Flaky on mac, crbug.com/1003776 ]
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 04a2bbc..d48caed8 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -29,7 +29,7 @@ <item id="blob_reader" hash_code="5154306" type="0" deprecated="2018-06-14" content_hash_code="39702178" file_path=""/> <item id="bluetooth_socket" hash_code="94099818" type="0" content_hash_code="30932349" os_list="linux,windows" file_path="device/bluetooth/bluetooth_socket_net.cc"/> <item id="brandcode_config" hash_code="109679553" type="0" content_hash_code="128843792" os_list="linux,windows" file_path="chrome/browser/profile_resetter/brandcode_config_fetcher.cc"/> - <item id="browser_switcher_ieem_sitelist" hash_code="97159948" type="0" content_hash_code="40881413" os_list="linux,windows" file_path="chrome/browser/browser_switcher/browser_switcher_service.cc"/> + <item id="browser_switcher_ieem_sitelist" hash_code="97159948" type="0" content_hash_code="129062966" os_list="linux,windows" file_path="chrome/browser/browser_switcher/browser_switcher_service.cc"/> <item id="bundled_exchanges_start_url_loader" hash_code="105810794" type="0" content_hash_code="20630448" os_list="linux,windows" file_path="content/browser/web_package/bundled_exchanges_handle.cc"/> <item id="captive_portal_service" hash_code="88754904" type="0" content_hash_code="70737580" os_list="linux,windows" file_path="chrome/browser/captive_portal/captive_portal_service.cc"/> <item id="cast_channel_send" hash_code="103172229" type="0" deprecated="2018-08-23" content_hash_code="33946302" file_path=""/>
diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc index 777adb6..7856740 100644 --- a/ui/events/blink/input_handler_proxy_unittest.cc +++ b/ui/events/blink/input_handler_proxy_unittest.cc
@@ -81,11 +81,11 @@ WebScopedInputEvent CreateGestureScrollPinch(WebInputEvent::Type type, WebGestureDevice source_device, + base::TimeTicks event_time, float delta_y_or_scale = 0, int x = 0, int y = 0) { - WebGestureEvent gesture(type, WebInputEvent::kNoModifiers, - WebInputEvent::GetStaticTimeStampForTests(), + WebGestureEvent gesture(type, WebInputEvent::kNoModifiers, event_time, source_device); if (type == WebInputEvent::kGestureScrollUpdate) { gesture.data.scroll_update.delta_y = delta_y_or_scale; @@ -446,7 +446,9 @@ int y = 0) { LatencyInfo latency; input_handler_proxy_.HandleInputEventWithLatencyInfo( - CreateGestureScrollPinch(type, source_device, delta_y_or_scale, x, y), + CreateGestureScrollPinch(type, source_device, + input_handler_proxy_.tick_clock_->NowTicks(), + delta_y_or_scale, x, y), latency, base::BindOnce( &InputHandlerProxyEventQueueTest::DidHandleInputEventAndOverscroll, @@ -1972,6 +1974,10 @@ } TEST_F(InputHandlerProxyEventQueueTest, ScrollPredictorTest) { + base::SimpleTestTickClock tick_clock; + tick_clock.SetNowTicks(base::TimeTicks()); + SetInputHandlerProxyTickClockForTesting(&tick_clock); + cc::InputHandlerScrollResult scroll_result_did_scroll_; scroll_result_did_scroll_.did_scroll = true; EXPECT_CALL(mock_input_handler_, ScrollBegin(_, _)) @@ -1984,16 +1990,19 @@ // No prediction when start with a GSB ui::InputPredictor::InputData result; + tick_clock.Advance(base::TimeDelta::FromMilliseconds(8)); HandleGestureEvent(WebInputEvent::kGestureScrollBegin); DeliverInputForBeginFrame(); EXPECT_FALSE(GestureScrollEventPredictionAvailable(&result)); // Test predictor returns last GSU delta. + tick_clock.Advance(base::TimeDelta::FromMilliseconds(8)); HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -20); + tick_clock.Advance(base::TimeDelta::FromMilliseconds(8)); HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -15); DeliverInputForBeginFrame(); EXPECT_TRUE(GestureScrollEventPredictionAvailable(&result)); - EXPECT_EQ(-35, result.pos.y()); + EXPECT_NE(0, result.pos.y()); testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); @@ -2001,6 +2010,7 @@ EXPECT_CALL(mock_input_handler_, SetNeedsAnimateInput()).Times(1); EXPECT_CALL(mock_input_handler_, ScrollBegin(_, _)) .WillOnce(testing::Return(kImplThreadScrollState)); + tick_clock.Advance(base::TimeDelta::FromMilliseconds(8)); HandleGestureEvent(WebInputEvent::kGestureScrollBegin); DeliverInputForBeginFrame(); EXPECT_FALSE(GestureScrollEventPredictionAvailable(&result)); @@ -2544,6 +2554,8 @@ &mock_client_, /*force_input_to_main_thread=*/false) { tick_clock_.SetNowTicks(base::TimeTicks::Now()); + // Disable scroll predictor for this test. + input_handler_proxy_.scroll_predictor_ = nullptr; input_handler_proxy_.SetTickClockForTesting(&tick_clock_); }
diff --git a/ui/events/blink/scroll_predictor.cc b/ui/events/blink/scroll_predictor.cc index c4dde3c8..52e718c1 100644 --- a/ui/events/blink/scroll_predictor.cc +++ b/ui/events/blink/scroll_predictor.cc
@@ -20,6 +20,9 @@ std::string predictor_name = GetFieldTrialParamValueByFeature( features::kResamplingScrollEvents, "predictor"); + if (predictor_name.empty()) + predictor_name = ui::input_prediction::kScrollPredictorNameLinearResampling; + input_prediction::PredictorType predictor_type = ui::PredictorFactory::GetPredictorTypeFromName(predictor_name); predictor_ = ui::PredictorFactory::GetPredictor(predictor_type);
diff --git a/ui/events/blink/scroll_predictor_unittest.cc b/ui/events/blink/scroll_predictor_unittest.cc index e944b97f..1e21940 100644 --- a/ui/events/blink/scroll_predictor_unittest.cc +++ b/ui/events/blink/scroll_predictor_unittest.cc
@@ -420,9 +420,9 @@ } TEST_F(ScrollPredictorTest, ScrollPredictorTypeSelection) { - // Empty Predictor when kResamplingScrollEvents is disabled. + // Use LinearResampling predictor by default. scroll_predictor_ = std::make_unique<ScrollPredictor>(); - VerifyPredictorType(input_prediction::kScrollPredictorNameEmpty); + VerifyPredictorType(input_prediction::kScrollPredictorNameLinearResampling); // When resampling is enabled, predictor type is set from // kResamplingScrollEvents.
diff --git a/ui/file_manager/file_manager/background/js/crostini.js b/ui/file_manager/file_manager/background/js/crostini.js index 550a320..039f17e 100644 --- a/ui/file_manager/file_manager/background/js/crostini.js +++ b/ui/file_manager/file_manager/background/js/crostini.js
@@ -266,6 +266,12 @@ return false; } + // Disallow sharing LinuxFiles with itself. + if (vmName === CrostiniImpl.DEFAULT_VM && + root === VolumeManagerCommon.RootType.CROSTINI) { + return false; + } + return CrostiniImpl.VALID_ROOT_TYPES_FOR_SHARE.has(root); } } @@ -297,6 +303,7 @@ [VolumeManagerCommon.RootType.DRIVE, 'MyDrive'], [VolumeManagerCommon.RootType.SHARED_DRIVES_GRAND_ROOT, 'TeamDrive'], [VolumeManagerCommon.RootType.SHARED_DRIVE, 'TeamDrive'], + [VolumeManagerCommon.RootType.CROSTINI, 'Crostini'], ]); /**
diff --git a/ui/file_manager/file_manager/background/js/crostini_unittest.js b/ui/file_manager/file_manager/background/js/crostini_unittest.js index 67b6a4e..241d251a 100644 --- a/ui/file_manager/file_manager/background/js/crostini_unittest.js +++ b/ui/file_manager/file_manager/background/js/crostini_unittest.js
@@ -211,4 +211,9 @@ assertFalse(crostini.canSharePath('vm', grandRootFolder, false)); assertFalse(crostini.canSharePath('vm', computerRootFolder, false)); assertTrue(crostini.canSharePath('vm', computerFolder, false)); + + // Sharing LinuxFiles is allowed for all VMs except termina. + volumeManagerRootType = VolumeManagerCommon.RootType.CROSTINI; + assertTrue(crostini.canSharePath('vm', root, false)); + assertFalse(crostini.canSharePath('termina', root, false)); }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/table/table_header.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_header.js index e12c9ec9..e7e4ce7 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/table/table_header.js +++ b/ui/file_manager/file_manager/foreground/js/ui/table/table_header.js
@@ -9,44 +9,51 @@ cr.define('cr.ui.table', function() { /** * Creates a new table header. - * @param {Object=} opt_propertyBag Optional properties. - * @constructor * @extends {HTMLDivElement} */ - const TableHeader = cr.ui.define('div'); + class TableHeader { + constructor() { + /** @private {cr.ui.Table} */ + this.table_ = null; - TableHeader.prototype = { - __proto__: HTMLDivElement.prototype, + /** @private {number} */ + this.batchCount_ = 0; - table_: null, + /** @private {Element} */ + this.headerInner_; + } /** * Initializes the element. + * @param {Element} el */ - decorate: function() { - this.className = 'table-header'; + static decorate(el) { + el.__proto__ = TableHeader.prototype; + el = /** @type {cr.ui.table.TableHeader} */ (el); - this.headerInner_ = this.ownerDocument.createElement('div'); - this.headerInner_.className = 'table-header-inner'; - this.appendChild(this.headerInner_); - this.addEventListener( - 'touchstart', this.handleTouchStart_.bind(this), false); - }, + el.className = 'table-header'; + el.batchCount_ = 0; + + el.headerInner_ = el.ownerDocument.createElement('div'); + el.headerInner_.className = 'table-header-inner'; + el.appendChild(el.headerInner_); + el.addEventListener('touchstart', el.handleTouchStart_.bind(el), false); + } /** * Updates table header width. Header width depends on list having a * vertical scrollbar. */ - updateWidth: function() { + updateWidth() { // Header should not span over the vertical scrollbar of the list. const list = this.table_.querySelector('list'); this.headerInner_.style.width = list.clientWidth + 'px'; - }, + } /** * Resizes columns. */ - resize: function() { + resize() { const headerCells = this.querySelectorAll('.table-header-cell'); if (this.needsFullRedraw_(headerCells)) { this.redraw(); @@ -58,25 +65,23 @@ headerCells[i].style.width = cm.getWidth(i) + 'px'; } this.placeSplitters_(this.querySelectorAll('.table-header-splitter')); - }, + } - batchCount_: 0, - - startBatchUpdates: function() { + startBatchUpdates() { this.batchCount_++; - }, + } - endBatchUpdates: function() { + endBatchUpdates() { this.batchCount_--; if (this.batchCount_ == 0) { this.redraw(); } - }, + } /** * Redraws table header. */ - redraw: function() { + redraw() { if (this.batchCount_ != 0) { return; } @@ -108,12 +113,12 @@ this.headerInner_.appendChild(cell); } this.appendSplitters_(); - }, + } /** * Appends column splitters to the table header. */ - appendSplitters_: function() { + appendSplitters_() { const cm = this.table_.columnModel; const splitters = []; for (let i = 0; i < cm.size; i++) { @@ -131,13 +136,13 @@ splitters.push(splitter); } this.placeSplitters_(splitters); - }, + } /** * Place splitters to right positions. * @param {Array<HTMLElement>|NodeList} splitters Array of splitters. */ - placeSplitters_: function(splitters) { + placeSplitters_(splitters) { const cm = this.table_.columnModel; let place = 0; for (let i = 0; i < cm.size; i++) { @@ -148,13 +153,13 @@ place += cm.getWidth(i); splitters[i].style.marginInlineStart = place + 'px'; } - }, + } /** * Renders column header. Appends text label and sort arrow if needed. * @param {number} index Column index. */ - createHeaderLabel_: function(index) { + createHeaderLabel_(index) { const cm = this.table_.columnModel; const dm = this.table_.dataModel; @@ -179,24 +184,24 @@ } labelDiv.appendChild(span); return labelDiv; - }, + } /** * Creates sort function for given column. * @param {number} index The index of the column to sort by. */ - createSortFunction_: function(index) { + createSortFunction_(index) { return function() { this.table_.sort(index); }.bind(this); - }, + } /** * Handles the touchstart event. If the touch happened close enough * to a splitter starts dragging. * @param {Event} e The touch event. */ - handleTouchStart_: function(e) { + handleTouchStart_(e) { e = /** @type {TouchEvent} */ (e); if (e.touches.length != 1) { return; @@ -224,7 +229,7 @@ } // Splitter itself shouldn't handle this event. e.stopPropagation(); - }, + } /** * Handles the double click on a column separator event. @@ -232,16 +237,16 @@ * @param {number} index Column index. * @param {Event} e The double click event. */ - handleDblClick_: function(index, e) { + handleDblClick_(index, e) { this.table_.fitColumn(index); - }, + } /** * Determines whether a full redraw is required. * @param {!NodeList} headerCells * @return {boolean} */ - needsFullRedraw_: function(headerCells) { + needsFullRedraw_(headerCells) { const cm = this.table_.columnModel; // If the number of columns in the model has changed, a full redraw is // needed. @@ -255,8 +260,10 @@ } } return false; - }, - }; + } + } + + TableHeader.prototype.__proto__ = HTMLDivElement.prototype; /** * The table associated with the header.
diff --git a/ui/file_manager/file_manager/test/crostini_share.js b/ui/file_manager/file_manager/test/crostini_share.js index 75c97dc..da34f04 100644 --- a/ui/file_manager/file_manager/test/crostini_share.js +++ b/ui/file_manager/file_manager/test/crostini_share.js
@@ -194,11 +194,15 @@ await test.waitForFiles( test.TestEntryInfo.getExpectedRows(test.BASIC_CROSTINI_ENTRY_SET)); - // Check 'Share with <VM>' is not shown in menu. + // Check 'Share with <VM>' is not shown in menu for termina. assertTrue( test.fakeMouseRightClick('#file-list [file-name="A"]'), 'right-click directory A'); - await test.waitForElement(menuNoShareWith); + if (vmName === 'termina') { + await test.waitForElement(menuNoShareWith); + } else { + await test.waitForElement(menuShareWith); + } // Select 'Google Drive' to show dir photos in file list. await test.waitForElement(googleDrive);
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index ac4d3a1..cf5dc08 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -305,7 +305,7 @@ void WaylandWindow::DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) { + const gfx::Point& pointer_location_in_px) { DCHECK(xdg_surface_); connection_->ResetPointerFlags(); @@ -377,15 +377,6 @@ void WaylandWindow::PrepareForShutdown() {} void WaylandWindow::SetBounds(const gfx::Rect& bounds_px) { - // TODO(crbug.com/958314): figure out if this return is legitimate. - // - // The X11 implementation says that even if the pixel bounds didn't change, we - // still need to forward this call to the delegate, and that the device scale - // factor may have changed which effectively changes the bounds. Perhaps we - // need to do the same here. - // - // After this is resolved, update test expectations for calls to - // delegate's OnBoundsChanged. if (bounds_px_ == bounds_px) return; bounds_px_ = bounds_px;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 98ffa33..f55d7e9 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -104,7 +104,7 @@ // WmMoveResizeHandler void DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) override; + const gfx::Point& pointer_location_in_px) override; // WmDragHandler void StartDrag(const ui::OSExchangeData& data,
diff --git a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h index cd5a696a..ac30160 100644 --- a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h +++ b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h
@@ -21,10 +21,11 @@ // on the |hittest| value. The |hittest| value identifies in which direction // the window should be resized or whether it should be moved. See // ui/base/hit_test.h for a concrete example with chromium symbolic names - // defined. The |pointer_location| indicates the position of the button press - // with respect to the platform window, which is needed when sending a - // move/resize request in such backends as X11. See _NET_WM_MOVERESIZE section - // in https://specifications.freedesktop.org/wm-spec/1.4/ar01s04.html. + // defined. The |pointer_location_in_px| indicates the position of the button + // press with respect to the platform window in screen pixel coordinates, + // which is needed when sending a move/resize request in such backends as X11. + // See _NET_WM_MOVERESIZE section in + // https://specifications.freedesktop.org/wm-spec/1.4/ar01s04.html. // // There is no need to implement this by all the platforms except Ozone/X11 // and Ozone/Wayland, compositors of which support interactive move/resize. @@ -45,7 +46,7 @@ // browser. virtual void DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) = 0; + const gfx::Point& pointer_location_in_px) = 0; protected: virtual ~WmMoveResizeHandler() {}
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc index 5eacc84..0b7c6931 100644 --- a/ui/platform_window/x11/x11_window.cc +++ b/ui/platform_window/x11/x11_window.cc
@@ -438,8 +438,8 @@ void X11Window::DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) { - XWindow::WmMoveResize(hittest, pointer_location); + const gfx::Point& pointer_location_in_px) { + XWindow::WmMoveResize(hittest, pointer_location_in_px); } void X11Window::SetPlatformEventDispatcher() {
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h index f8dea53..317d638a 100644 --- a/ui/platform_window/x11/x11_window.h +++ b/ui/platform_window/x11/x11_window.h
@@ -108,7 +108,7 @@ // WmMoveResizeHandler void DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) override; + const gfx::Point& pointer_location_in_px) override; // X11WindowOzone sets own event dispatcher now. virtual void SetPlatformEventDispatcher();
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb index 824e1bd..0b3bf48 100644 --- a/ui/strings/translations/ui_strings_bn.xtb +++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{১ মাস বাকি}one{# মাস বাকি}other{# মাস বাকি}}</translation> <translation id="4841881773802181781">যোগ করা হচ্ছে</translation> <translation id="4881695831933465202">খুলুন</translation> +<translation id="4888938634149558681">কল করুন</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}</translation> <translation id="4971687151119236543">মিডিয়া পূর্ববর্তী ট্র্যাক</translation> <translation id="5046499563572181734">এখানে আলতো চাপুন</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb index eab332a..36d0d61 100644 --- a/ui/strings/translations/ui_strings_fil.xtb +++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -156,13 +156,13 @@ <translation id="6404817160109697034">{SECONDS,plural, =1{1 segundo ang nakalipas}one{# segundo ang nakalipas}other{# na segundo ang nakalipas}}</translation> <translation id="6430678249303439055">I-block ang lahat ng notification mula sa app na ito</translation> <translation id="6483402905448010557">{SECONDS,plural, =1{1 segundo ang nakalipas}one{# segundo ang nakalipas}other{# na segundo ang nakalipas}}</translation> -<translation id="6539092367496845964">Nagkaproblema. Subukang muli sa ibang pagkakataon.</translation> +<translation id="6539092367496845964">Nagkaproblema. Subukan ulit sa ibang pagkakataon.</translation> <translation id="654149438358937226">I-block ang lahat ng notification</translation> <translation id="6567071839949112727">i-click ang ancestor</translation> <translation id="6578407462441924264">Walang Pangalan</translation> <translation id="6612467943526193239">Upang lumabas sa pag-calibrate pindutin ang Esc.</translation> <translation id="6620110761915583480">I-save ang File</translation> -<translation id="6656912866303152668">Tiyaking na-on ng <ph name="TARGET_DEVICE_NAME" /> ang pag-sync sa Chrome, at pagkatapos ay subukang ipadala muli.</translation> +<translation id="6656912866303152668">Tiyaking naka-on sa <ph name="TARGET_DEVICE_NAME" /> ang pag-sync sa Chrome, at pagkatapos ay subukang ipadala ulit.</translation> <translation id="6699343763173986273">Susunod na Track ng Media</translation> <translation id="673773751041746814">Pag-delete</translation> <translation id="6779314412797872738">Para magpadala ng numero sa iyong Android phone mula rito, <ph name="TROUBLESHOOT_LINK" /> para sa parehong device sa mga setting.</translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb index ce0f885..87b6f86 100644 --- a/ui/strings/translations/ui_strings_gu.xtb +++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{1 મહિનો બાકી}one{# મહિનો બાકી}other{# મહિના બાકી}}</translation> <translation id="4841881773802181781">ઉમેરો</translation> <translation id="4881695831933465202">ખોલો</translation> +<translation id="4888938634149558681">કૉલ કરો</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}</translation> <translation id="4971687151119236543">મીડિયા પાછલું ગીત</translation> <translation id="5046499563572181734">અહીં ટૅપ કરો</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb index ef31109..2a1dc934 100644 --- a/ui/strings/translations/ui_strings_id.xtb +++ b/ui/strings/translations/ui_strings_id.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{1 bulan lagi}other{# bulan lagi}}</translation> <translation id="4841881773802181781">Penyisipan</translation> <translation id="4881695831933465202">Buka</translation> +<translation id="4888938634149558681">Telepon</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 detik}other{# detik}}</translation> <translation id="4971687151119236543">Lacak Media Sebelumnya</translation> <translation id="5046499563572181734">Ketuk di sini</translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb index 61611dc..59bc34d 100644 --- a/ui/strings/translations/ui_strings_ml.xtb +++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -108,6 +108,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{ഒരു മാസം ശേഷിക്കുന്നു}other{# മാസം ശേഷിക്കുന്നു}}</translation> <translation id="4841881773802181781">ചേർക്കൽ</translation> <translation id="4881695831933465202">തുറക്കുക</translation> +<translation id="4888938634149558681">കോൾ വിളിക്കുക</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{ഒരു സെക്കന്ഡ്}other{# സെക്കൻഡ്}}</translation> <translation id="4971687151119236543">മുമ്പത്തെ മീഡിയ ട്രാക്ക്</translation> <translation id="5046499563572181734">ഇവിടെ ടാപ്പുചെയ്യുക</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb index 768a431..7f57b9d 100644 --- a/ui/strings/translations/ui_strings_no.xtb +++ b/ui/strings/translations/ui_strings_no.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{1 måned igjen}other{# måneder igjen}}</translation> <translation id="4841881773802181781">Innsetting</translation> <translation id="4881695831933465202">Åpne</translation> +<translation id="4888938634149558681">Ring</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation> <translation id="4971687151119236543">Media – forrige spor</translation> <translation id="5046499563572181734">Trykk her</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb index 1c0205e..1592c94 100644 --- a/ui/strings/translations/ui_strings_sv.xtb +++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{1 månad kvar}other{# månader kvar}}</translation> <translation id="4841881773802181781">Infogning</translation> <translation id="4881695831933465202">Öppna</translation> +<translation id="4888938634149558681">Ring</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation> <translation id="4971687151119236543">Föregående spår</translation> <translation id="5046499563572181734">Tryck här</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb index 29c0846..67552d4 100644 --- a/ui/strings/translations/ui_strings_sw.xtb +++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{Umesalia mwezi 1}other{Imesalia miezi #}}</translation> <translation id="4841881773802181781">Uwekaji</translation> <translation id="4881695831933465202">Fungua</translation> +<translation id="4888938634149558681">Piga simu</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{Sekunde 1}other{Sekunde #}}</translation> <translation id="4971687151119236543">Wimbo wa Awali wa Media</translation> <translation id="5046499563572181734">Gusa hapa</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb index 7d43f8e0..a1037fe 100644 --- a/ui/strings/translations/ui_strings_tr.xtb +++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{1 ay kaldı}other{# ay kaldı}}</translation> <translation id="4841881773802181781">Ekleme</translation> <translation id="4881695831933465202">Aç</translation> +<translation id="4888938634149558681">Telefon et</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 saniye}other{# saniye}}</translation> <translation id="4971687151119236543">Medya Önceki Parça</translation> <translation id="5046499563572181734">Buraya dokunun</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb index 272174e27..1bbd70a 100644 --- a/ui/strings/translations/ui_strings_vi.xtb +++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{Còn 1 tháng}other{Còn # tháng}}</translation> <translation id="4841881773802181781">Chèn</translation> <translation id="4881695831933465202">Mở</translation> +<translation id="4888938634149558681">Gọi điện</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 giây}other{# giây}}</translation> <translation id="4971687151119236543">Bản nhạc trước của trình phát phương tiện</translation> <translation id="5046499563572181734">Nhấn vào đây</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb index b952b632..e125b0e 100644 --- a/ui/strings/translations/ui_strings_zh-CN.xtb +++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{还有 1 个月的时间}other{还有 # 个月的时间}}</translation> <translation id="4841881773802181781">插入</translation> <translation id="4881695831933465202">打开</translation> +<translation id="4888938634149558681">致电</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation> <translation id="4971687151119236543">媒体上一曲</translation> <translation id="5046499563572181734">点按此处</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb index 0c1e8e7..83a1ece 100644 --- a/ui/strings/translations/ui_strings_zh-TW.xtb +++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -113,6 +113,7 @@ <translation id="4788285488841504513">{MONTHS,plural, =1{還剩 1 個月}other{還剩 # 個月}}</translation> <translation id="4841881773802181781">插入</translation> <translation id="4881695831933465202">開啟</translation> +<translation id="4888938634149558681">撥打電話</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation> <translation id="4971687151119236543">上一首媒體曲目</translation> <translation id="5046499563572181734">輕觸這裡</translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index b12b2137..916debe9 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -753,8 +753,8 @@ sources += [ "style/platform_style_linux.cc", "widget/desktop_aura/desktop_window_tree_host_linux.cc", - "widget/desktop_aura/window_event_filter.cc", - "widget/desktop_aura/window_event_filter.h", + "widget/desktop_aura/window_event_filter_linux.cc", + "widget/desktop_aura/window_event_filter_linux.h", ] deps += [ "//ui/base:hit_test" ] } @@ -1282,8 +1282,8 @@ "//ui/wm/public", ] - if (!is_chromeos && (is_linux && !use_x11)) { - sources += [ "widget/desktop_aura/desktop_window_tree_host_platform_interactive_uitest.cc" ] + if (is_desktop_linux) { + sources += [ "widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc" ] } deps += [
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc index b582cf0d..936a5d2 100644 --- a/ui/views/controls/menu/menu_controller_unittest.cc +++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -365,6 +365,7 @@ owner_->CloseNow(); DestroyMenuController(); ViewsTestBase::TearDown(); + base::i18n::SetRTLForTesting(false); } void ReleaseTouchId(int id) { event_generator_->ReleaseTouchId(id); } @@ -1862,9 +1863,10 @@ const int menu_width = MenuConfig::instance().touchable_menu_width; const gfx::Size parent_size(menu_width, menu_width); + const gfx::Size parent_size_wide(menu_width * 2, menu_width); - const int kDisplayWidth = parent_size.width() * 2; - const int kDisplayHeight = parent_size.height() * 2; + const int kDisplayWidth = parent_size.width() * 3; + const int kDisplayHeight = parent_size.height() * 3; // Simulate multiple display layouts. for (int x = -1; x <= 1; x++) @@ -1875,6 +1877,7 @@ const int x_min = monitor_bounds.x(); const int x_max = monitor_bounds.right() - parent_size.width(); const int x_mid = (x_min + x_max) / 2; + const int x_qtr = x_min + (x_max - x_min) / 4; const int y_min = monitor_bounds.y(); const int y_max = monitor_bounds.bottom() - parent_size.height(); @@ -1890,6 +1893,11 @@ gfx::Rect(gfx::Point(x_min, y_mid), parent_size)); TestSubmenuFitsOnScreen(sub_item, monitor_bounds, gfx::Rect(gfx::Point(x_min, y_max), parent_size)); + + // Extra wide menu: test with insufficient room on both sides. + TestSubmenuFitsOnScreen( + sub_item, monitor_bounds, + gfx::Rect(gfx::Point(x_qtr, y_min), parent_size_wide)); } }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc index d1e21777..bc7cf482 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -10,7 +10,7 @@ #include "ui/platform_window/platform_window_init_properties.h" #include "ui/views/linux_ui/linux_ui.h" #include "ui/views/views_delegate.h" -#include "ui/views/widget/desktop_aura/window_event_filter.h" +#include "ui/views/widget/desktop_aura/window_event_filter_linux.h" #include "ui/views/widget/widget.h" namespace views { @@ -87,14 +87,8 @@ void DesktopWindowTreeHostLinux::AddNonClientEventFilter() { DCHECK(!non_client_window_event_filter_); - std::unique_ptr<WindowEventFilter> window_event_filter = - std::make_unique<WindowEventFilter>(this); - auto* wm_move_resize_handler = GetWmMoveResizeHandler(*platform_window()); - if (wm_move_resize_handler) - window_event_filter->SetWmMoveResizeHandler( - GetWmMoveResizeHandler(*(platform_window()))); - - non_client_window_event_filter_ = std::move(window_event_filter); + non_client_window_event_filter_ = std::make_unique<WindowEventFilterLinux>( + this, GetWmMoveResizeHandler(*platform_window())); window()->AddPreTargetHandler(non_client_window_event_filter_.get()); }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h index 45e2ad5..df65c6213e 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -11,7 +11,7 @@ namespace views { -class WindowEventFilter; +class WindowEventFilterLinux; // Contains Linux specific implementation. class VIEWS_EXPORT DesktopWindowTreeHostLinux @@ -30,6 +30,8 @@ void OnClosed() override; private: + FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostLinuxTest, HitTest); + // Overridden from display::DisplayObserver via aura::WindowTreeHost: void OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) override; @@ -43,7 +45,7 @@ void RemoveNonClientEventFilter(); // A handler for events intended for non client area. - std::unique_ptr<WindowEventFilter> non_client_window_event_filter_; + std::unique_ptr<WindowEventFilterLinux> non_client_window_event_filter_; DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostLinux); };
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_interactive_uitest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc similarity index 74% rename from ui/views/widget/desktop_aura/desktop_window_tree_host_platform_interactive_uitest.cc rename to ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc index a78dac93..10fa831 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_interactive_uitest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.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 "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h" +#include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h" #include "ui/aura/window_tree_host_platform.h" #include "ui/base/hit_test.h" @@ -10,7 +10,7 @@ #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/views/test/views_interactive_ui_test_base.h" #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" -#include "ui/views/widget/desktop_aura/window_event_filter.h" +#include "ui/views/widget/desktop_aura/window_event_filter_linux.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/window/native_frame_view.h" @@ -46,20 +46,20 @@ void Reset() { hittest_ = -1; - pointer_location_ = gfx::Point(); + pointer_location_in_px_ = gfx::Point(); } int hittest() const { return hittest_; } - gfx::Point pointer_location() const { return pointer_location_; } + gfx::Point pointer_location_in_px() const { return pointer_location_in_px_; } void set_bounds(const gfx::Rect& bounds) { bounds_ = bounds; } // ui::WmMoveResizeHandler void DispatchHostWindowDragMovement( int hittest, - const gfx::Point& pointer_location) override { + const gfx::Point& pointer_location_in_px) override { hittest_ = hittest; - pointer_location_ = pointer_location; + pointer_location_in_px_ = pointer_location_in_px; platform_window_->SetBounds(bounds_); } @@ -69,26 +69,27 @@ gfx::Rect bounds_; int hittest_ = -1; - gfx::Point pointer_location_; + gfx::Point pointer_location_in_px_; DISALLOW_COPY_AND_ASSIGN(FakeWmMoveResizeHandler); }; -void SetExpectationBasedOnHittestValue(int hittest, - const FakeWmMoveResizeHandler& handler, - const gfx::Point& pointer_location) { +void SetExpectationBasedOnHittestValue( + int hittest, + const FakeWmMoveResizeHandler& handler, + const gfx::Point& pointer_location_in_px) { if (IsNonClientComponent(hittest)) { // Ensure both the pointer location and the hit test value are passed to the // fake move/resize handler. - EXPECT_EQ(handler.pointer_location().ToString(), - pointer_location.ToString()); + EXPECT_EQ(handler.pointer_location_in_px().ToString(), + pointer_location_in_px.ToString()); EXPECT_EQ(handler.hittest(), hittest); return; } // Ensure the handler does not receive the hittest value or the pointer // location. - EXPECT_TRUE(handler.pointer_location().IsOrigin()); + EXPECT_TRUE(handler.pointer_location_in_px().IsOrigin()); EXPECT_NE(handler.hittest(), hittest); } @@ -96,8 +97,8 @@ class HitTestNonClientFrameView : public NativeFrameView { public: explicit HitTestNonClientFrameView(Widget* widget) - : NativeFrameView(widget), hit_test_result_(HTNOWHERE) {} - ~HitTestNonClientFrameView() override {} + : NativeFrameView(widget) {} + ~HitTestNonClientFrameView() override = default; void set_hit_test_result(int component) { hit_test_result_ = component; } @@ -107,7 +108,7 @@ } private: - int hit_test_result_; + int hit_test_result_ = HTNOWHERE; DISALLOW_COPY_AND_ASSIGN(HitTestNonClientFrameView); }; @@ -115,27 +116,30 @@ // This is used to return HitTestNonClientFrameView on create call. class HitTestWidgetDelegate : public views::WidgetDelegate { public: - HitTestWidgetDelegate(views::Widget* widget, - HitTestNonClientFrameView* frame_view) - : widget_(widget), frame_view_(frame_view) {} - ~HitTestWidgetDelegate() override {} + explicit HitTestWidgetDelegate(views::Widget* widget) : widget_(widget) {} + ~HitTestWidgetDelegate() override = default; void set_can_resize(bool can_resize) { can_resize_ = can_resize; widget_->OnSizeConstraintsChanged(); } + HitTestNonClientFrameView* frame_view() { return frame_view_; } + // views::WidgetDelegate: bool CanResize() const override { return can_resize_; } views::Widget* GetWidget() override { return widget_; } views::Widget* GetWidget() const override { return widget_; } views::NonClientFrameView* CreateNonClientFrameView(Widget* widget) override { + DCHECK(widget_ == widget); + if (!frame_view_) + frame_view_ = new HitTestNonClientFrameView(widget); return frame_view_; } private: - views::Widget* widget_; - HitTestNonClientFrameView* frame_view_; + views::Widget* const widget_; + HitTestNonClientFrameView* frame_view_ = nullptr; bool can_resize_ = false; DISALLOW_COPY_AND_ASSIGN(HitTestWidgetDelegate); @@ -143,16 +147,15 @@ } // namespace -class DesktopWindowTreeHostPlatformTest : public ViewsInteractiveUITestBase { +class DesktopWindowTreeHostLinuxTest : public ViewsInteractiveUITestBase { public: - DesktopWindowTreeHostPlatformTest() = default; - ~DesktopWindowTreeHostPlatformTest() override = default; + DesktopWindowTreeHostLinuxTest() = default; + ~DesktopWindowTreeHostLinuxTest() override = default; protected: Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds) { Widget* toplevel = new Widget; - frame_view_ = new HitTestNonClientFrameView(toplevel); - delegate_ = new HitTestWidgetDelegate(toplevel, frame_view_); + delegate_ = new HitTestWidgetDelegate(toplevel); Widget::InitParams toplevel_params = CreateParams(Widget::InitParams::TYPE_WINDOW); toplevel_params.native_widget = @@ -166,38 +169,38 @@ } std::unique_ptr<ui::MouseEvent> CreateMouseEvent( - const gfx::Point& pointer_location, + const gfx::Point& pointer_location_in_px, ui::EventType event_type, int flags) { std::unique_ptr<ui::MouseEvent> mouse_event = - std::make_unique<ui::MouseEvent>(event_type, pointer_location, - pointer_location, + std::make_unique<ui::MouseEvent>(event_type, pointer_location_in_px, + pointer_location_in_px, base::TimeTicks::Now(), flags, flags); return mouse_event; } - HitTestNonClientFrameView* frame_view_ = nullptr; HitTestWidgetDelegate* delegate_ = nullptr; private: - DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostPlatformTest); + DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostLinuxTest); }; -TEST_F(DesktopWindowTreeHostPlatformTest, HitTest) { +// Leaking test. https://crbug.com/1004674 +TEST_F(DesktopWindowTreeHostLinuxTest, DISABLED_HitTest) { gfx::Rect bounds(0, 0, 100, 100); std::unique_ptr<Widget> widget(BuildTopLevelDesktopWidget(bounds)); widget->Show(); aura::Window* window = widget->GetNativeWindow(); - DesktopWindowTreeHostPlatform* host = - static_cast<DesktopWindowTreeHostPlatform*>(window->GetHost()); + DesktopWindowTreeHostLinux* host = + static_cast<DesktopWindowTreeHostLinux*>(window->GetHost()); // Install a fake move/resize handler to intercept the move/resize call. - WindowEventFilter* non_client_filter = - host->non_client_window_event_filter_.get(); - std::unique_ptr<FakeWmMoveResizeHandler> handler = + auto handler = std::make_unique<FakeWmMoveResizeHandler>(host->platform_window()); - non_client_filter->SetWmMoveResizeHandler(handler.get()); + host->RemoveNonClientEventFilter(); + auto filter = std::make_unique<WindowEventFilterLinux>(host, handler.get()); + window->AddPreTargetHandler(filter.get()); delegate_->set_can_resize(true); @@ -205,7 +208,7 @@ // values used in the browser itself, because we fake the hit test results, // which non client frame view sends back. Thus, just make sure the content // window is able to receive these events. - gfx::Point pointer_location(10, 10); + gfx::Point pointer_location_in_px(10, 10); constexpr int hittest_values[] = { HTBOTTOM, HTBOTTOMLEFT, HTBOTTOMRIGHT, HTCAPTION, HTLEFT, @@ -216,12 +219,13 @@ HTZOOM, }; + auto* frame_view = delegate_->frame_view(); for (int hittest : hittest_values) { handler->Reset(); // Set the desired hit test result value, which will be returned, when // WindowEventFilter starts to perform hit testing. - frame_view_->set_hit_test_result(hittest); + frame_view->set_hit_test_result(hittest); gfx::Rect bounds = window->GetBoundsInScreen(); @@ -229,8 +233,8 @@ // coordinate, whereas event dispatcher receives event locations on a local // system coordinate. Thus, add an offset of a new possible origin value of // a window to the expected pointer location. - gfx::Point expected_pointer_location(pointer_location); - expected_pointer_location.Offset(bounds.x(), bounds.y()); + gfx::Point expected_pointer_location_in_px(pointer_location_in_px); + expected_pointer_location_in_px.Offset(bounds.x(), bounds.y()); if (hittest == HTCAPTION) { // Move the window on HTCAPTION hit test value. @@ -249,7 +253,7 @@ // move/resize handler to start interactive move/resize with the |hittest| // value we specified. auto mouse_down_event = CreateMouseEvent( - pointer_location, ui::ET_MOUSE_PRESSED, ui::EF_LEFT_MOUSE_BUTTON); + pointer_location_in_px, ui::ET_MOUSE_PRESSED, ui::EF_LEFT_MOUSE_BUTTON); host->DispatchEvent(mouse_down_event.get()); // The test expectation is based on the hit test component. If it is a @@ -257,16 +261,18 @@ // must receive the hittest value and the pointer location in global screen // coordinate system. In other cases, it must not. SetExpectationBasedOnHittestValue(hittest, *handler.get(), - expected_pointer_location); + expected_pointer_location_in_px); // Make sure the bounds of the content window are correct. EXPECT_EQ(window->GetBoundsInScreen().ToString(), bounds.ToString()); // Dispatch mouse up event to release mouse pressed handler and be able to // consume future events. - auto mouse_up_event = CreateMouseEvent( - pointer_location, ui::ET_MOUSE_RELEASED, ui::EF_LEFT_MOUSE_BUTTON); + auto mouse_up_event = + CreateMouseEvent(pointer_location_in_px, ui::ET_MOUSE_RELEASED, + ui::EF_LEFT_MOUSE_BUTTON); host->DispatchEvent(mouse_up_event.get()); } + window->RemovePreTargetHandler(filter.get()); } } // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h index 802f0e3..2719f8c 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -121,8 +121,6 @@ gfx::Rect ToPixelRect(const gfx::Rect& rect_in_dip) const; private: - FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostPlatformTest, HitTest); - void Relayout(); Widget* GetWidget();
diff --git a/ui/views/widget/desktop_aura/window_event_filter.cc b/ui/views/widget/desktop_aura/window_event_filter_linux.cc similarity index 78% rename from ui/views/widget/desktop_aura/window_event_filter.cc rename to ui/views/widget/desktop_aura/window_event_filter_linux.cc index 66269f0..054f8aac 100644 --- a/ui/views/widget/desktop_aura/window_event_filter.cc +++ b/ui/views/widget/desktop_aura/window_event_filter_linux.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 "ui/views/widget/desktop_aura/window_event_filter.h" +#include "ui/views/widget/desktop_aura/window_event_filter_linux.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" @@ -22,12 +22,16 @@ namespace views { -WindowEventFilter::WindowEventFilter(DesktopWindowTreeHost* window_tree_host) - : window_tree_host_(window_tree_host) {} +WindowEventFilterLinux::WindowEventFilterLinux( + DesktopWindowTreeHost* window_tree_host, + ui::WmMoveResizeHandler* handler) + : window_tree_host_(window_tree_host), handler_(handler) { + DCHECK(handler_); +} -WindowEventFilter::~WindowEventFilter() = default; +WindowEventFilterLinux::~WindowEventFilterLinux() = default; -void WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) { +void WindowEventFilterLinux::OnMouseEvent(ui::MouseEvent* event) { if (event->type() != ui::ET_MOUSE_PRESSED) return; @@ -54,14 +58,8 @@ } } -void WindowEventFilter::SetWmMoveResizeHandler( - ui::WmMoveResizeHandler* handler) { - DCHECK(!handler_); - handler_ = handler; -} - -void WindowEventFilter::OnClickedCaption(ui::MouseEvent* event, - int previous_click_component) { +void WindowEventFilterLinux::OnClickedCaption(ui::MouseEvent* event, + int previous_click_component) { aura::Window* target = static_cast<aura::Window*>(event->target()); LinuxUI* linux_ui = LinuxUI::instance(); @@ -112,7 +110,7 @@ if (!widget) break; views::View* view = widget->GetContentsView(); - if (!view || !view->context_menu_controller()) + if (!view) break; gfx::Point location(event->location()); views::View::ConvertPointToScreen(view, &location); @@ -122,7 +120,7 @@ } } -void WindowEventFilter::OnClickedMaximizeButton(ui::MouseEvent* event) { +void WindowEventFilterLinux::OnClickedMaximizeButton(ui::MouseEvent* event) { aura::Window* target = static_cast<aura::Window*>(event->target()); views::Widget* widget = views::Widget::GetWidgetForNativeView(target); if (!widget) @@ -144,26 +142,31 @@ } } -void WindowEventFilter::ToggleMaximizedState() { +void WindowEventFilterLinux::ToggleMaximizedState() { if (window_tree_host_->IsMaximized()) window_tree_host_->Restore(); else window_tree_host_->Maximize(); } -void WindowEventFilter::LowerWindow() {} +void WindowEventFilterLinux::LowerWindow() {} -void WindowEventFilter::MaybeDispatchHostWindowDragMovement( +void WindowEventFilterLinux::MaybeDispatchHostWindowDragMovement( int hittest, ui::MouseEvent* event) { - if (handler_ && event->IsLeftMouseButton() && - ui::CanPerformDragOrResize(hittest)) { + if (event->IsLeftMouseButton() && ui::CanPerformDragOrResize(hittest)) { // Some platforms (eg X11) may require last pointer location not in the // local surface coordinates, but rather in the screen coordinates for // interactive move/resize. - const gfx::Point last_pointer_location = + aura::Window* target = static_cast<aura::Window*>(event->target()); + const auto scale_factor = display::Screen::GetScreen() + ->GetDisplayNearestWindow(target) + .device_scale_factor(); + gfx::Point last_cursor_location_in_dip = aura::Env::GetInstance()->last_mouse_location(); - handler_->DispatchHostWindowDragMovement(hittest, last_pointer_location); + handler_->DispatchHostWindowDragMovement( + hittest, + gfx::ScaleToFlooredPoint(last_cursor_location_in_dip, scale_factor)); event->StopPropagation(); return; }
diff --git a/ui/views/widget/desktop_aura/window_event_filter.h b/ui/views/widget/desktop_aura/window_event_filter_linux.h similarity index 61% rename from ui/views/widget/desktop_aura/window_event_filter.h rename to ui/views/widget/desktop_aura/window_event_filter_linux.h index 41eae913..a8710e7 100644 --- a/ui/views/widget/desktop_aura/window_event_filter.h +++ b/ui/views/widget/desktop_aura/window_event_filter_linux.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_H_ -#define UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_H_ +#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LINUX_H_ +#define UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LINUX_H_ #include "base/compiler_specific.h" #include "base/macros.h" @@ -18,22 +18,17 @@ namespace views { class DesktopWindowTreeHost; -// An EventFilter that sets properties on native windows. -// The downstream effort to add wayland and x11 support with ozone -// are using this class (to be upstreamed later). -class VIEWS_EXPORT WindowEventFilter : public ui::EventHandler { +// An EventFilter that sets properties on native windows. Uses +// WmMoveResizeHandler to dispatch move/resize requests. +class VIEWS_EXPORT WindowEventFilterLinux : public ui::EventHandler { public: - explicit WindowEventFilter(DesktopWindowTreeHost* window_tree_host); - ~WindowEventFilter() override; + WindowEventFilterLinux(DesktopWindowTreeHost* window_tree_host, + ui::WmMoveResizeHandler* handler); + ~WindowEventFilterLinux() override; // Overridden from ui::EventHandler: void OnMouseEvent(ui::MouseEvent* event) override; - // Sets a move resize handler. Currently initialized only by ozone platforms. - // See WaylandWindow::WaylandWindow in the wayland_window.cc file for an - // example. - void SetWmMoveResizeHandler(ui::WmMoveResizeHandler* handler); - private: // Called when the user clicked the caption area. void OnClickedCaption(ui::MouseEvent* event, int previous_click_component); @@ -46,14 +41,13 @@ // Dispatches a message to the window manager to tell it to act as if a border // or titlebar drag occurred with left mouse click. In case of X11, a // _NET_WM_MOVERESIZE message is sent. - virtual void MaybeDispatchHostWindowDragMovement(int hittest, - ui::MouseEvent* event); + void MaybeDispatchHostWindowDragMovement(int hittest, ui::MouseEvent* event); // A signal to lower an attached to this filter window to the bottom of the // stack. virtual void LowerWindow(); - DesktopWindowTreeHost* window_tree_host_; + DesktopWindowTreeHost* const window_tree_host_; // The non-client component for the target of a MouseEvent. Mouse events can // be destructive to the window tree, which can cause the component of a @@ -65,11 +59,11 @@ // A handler, which is used for interactive move/resize events if set and // unless MaybeDispatchHostWindowDragMovement is overridden by a derived // class. - ui::WmMoveResizeHandler* handler_ = nullptr; + ui::WmMoveResizeHandler* const handler_; - DISALLOW_COPY_AND_ASSIGN(WindowEventFilter); + DISALLOW_COPY_AND_ASSIGN(WindowEventFilterLinux); }; } // namespace views -#endif // UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_H_ +#endif // UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LINUX_H_
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index a9a9475..c3a7ff4 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -143,7 +143,6 @@ ":shared_style_css_module", ":shared_vars_css_module", "cr_action_menu:cr_action_menu_module", - "cr_action_menu:modulize", "cr_button:cr_button_module", "cr_checkbox:cr_checkbox_module", "cr_dialog:cr_dialog_module", @@ -161,6 +160,7 @@ "cr_search_field:cr_search_field_module", "cr_search_field:modulize", "cr_tabs:cr_tabs_module", + "cr_toast:cr_toast_manager_module", "cr_toast:cr_toast_module", "cr_toggle:cr_toggle_module", "cr_toolbar:cr_toolbar_module",
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn b/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn index 6a03f506..0025d2d 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn +++ b/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn
@@ -4,21 +4,15 @@ import("//third_party/closure_compiler/compile_js.gni") import("//tools/polymer/polymer.gni") -import("../../tools/js_modulizer.gni") js_type_check("closure_compile") { deps = [ - ":anchor_alignment", ":cr_action_menu", ] } -js_library("anchor_alignment") { -} - js_library("cr_action_menu") { deps = [ - ":anchor_alignment", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:util", "//ui/webui/resources/js/cr/ui:focus_row", @@ -27,11 +21,6 @@ externs_list = [ "$externs_path/pending.js" ] } -js_modulizer("modulize") { - input_files = [ "anchor_alignment.js" ] - deps = [] -} - polymer_modulizer("cr_action_menu") { js_file = "cr_action_menu.js" html_file = "cr_action_menu.html" @@ -47,7 +36,6 @@ "ui/webui/resources/html/polymer.html|dom,html,Polymer", "ui/webui/resources/html/assert.html|assert", "ui/webui/resources/html/cr.html|isMac, isWindows", - "ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.html|AnchorAlignment", "ui/webui/resources/html/cr/ui/focus_row.html|FocusRow", "ui/webui/resources/html/cr/ui/focus_without_ink.html|focusWithoutInk", "ui/webui/resources/html/util.html|getDeepActiveElement, hasKeyModifiers", @@ -57,25 +45,15 @@ js_type_check("closure_compile_module") { is_polymer3 = true deps = [ - ":anchor_alignment.m", ":cr_action_menu.m", ] } -js_library("anchor_alignment.m") { - sources = [ - "$root_gen_dir/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.m.js", - ] - deps = [] - extra_deps = [ ":modulize" ] -} - js_library("cr_action_menu.m") { sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.m.js", ] deps = [ - ":anchor_alignment.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:cr.m",
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.html b/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.html deleted file mode 100644 index a673df5..0000000 --- a/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.html +++ /dev/null
@@ -1 +0,0 @@ -<script src="anchor_alignment.js"></script>
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.js b/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.js deleted file mode 100644 index e4a4431..0000000 --- a/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.js +++ /dev/null
@@ -1,15 +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. - -/** - * @enum {number} - * @const - */ -/* #export */ const AnchorAlignment = { - BEFORE_START: -2, - AFTER_START: -1, - CENTER: 0, - BEFORE_END: 1, - AFTER_END: 2, -};
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html index a7ad2a11..6811c73 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html +++ b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
@@ -6,7 +6,6 @@ <link rel="import" href="../../html/cr/ui/focus_without_ink.html"> <link rel="import" href="../../html/util.html"> <link rel="import" href="../shared_vars_css.html"> -<link rel="import" href="anchor_alignment.html"> <dom-module id="cr-action-menu"> <template>
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js index 788cf26..f5d68a6f 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js +++ b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
@@ -34,6 +34,18 @@ */ let ShowAtPositionConfig; +/** + * @enum {number} + * @const + */ +/* #export */ const AnchorAlignment = { + BEFORE_START: -2, + AFTER_START: -1, + CENTER: 0, + BEFORE_END: 1, + AFTER_END: 2, +}; + /** @const {string} */ const DROPDOWN_ITEM_CLASS = 'dropdown-item';
diff --git a/ui/webui/resources/cr_elements/cr_input/cr_input.html b/ui/webui/resources/cr_elements/cr_input/cr_input.html index 073b2c6..1a2136a 100644 --- a/ui/webui/resources/cr_elements/cr_input/cr_input.html +++ b/ui/webui/resources/cr_elements/cr_input/cr_input.html
@@ -54,6 +54,7 @@ #input::placeholder { color: var(--cr-input-placeholder-color); + letter-spacing: var(--cr-input-placeholder-letter-spacing); } :host([invalid]) #input {
diff --git a/ui/webui/resources/cr_elements/cr_toast/BUILD.gn b/ui/webui/resources/cr_elements/cr_toast/BUILD.gn index a4527c0c..ab9f040 100644 --- a/ui/webui/resources/cr_elements/cr_toast/BUILD.gn +++ b/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
@@ -30,10 +30,22 @@ html_type = "dom-module" } +polymer_modulizer("cr_toast_manager") { + js_file = "cr_toast_manager.js" + html_file = "cr_toast_manager.html" + html_type = "dom-module" + auto_imports = [ "ui/webui/resources/html/assert.html|assert" ] + namespace_rewrites = [ + "cr.toastManager.setInstance|setInstance", + "cr.toastManager.CrToastManagerElement|CrToastManagerElement", + ] +} + js_type_check("closure_compile_module") { is_polymer3 = true deps = [ ":cr_toast.m", + ":cr_toast_manager.m", ] } @@ -46,3 +58,16 @@ ] extra_deps = [ ":cr_toast_module" ] } + +js_library("cr_toast_manager.m") { + sources = [ + "$root_gen_dir/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.m.js", + ] + deps = [ + ":cr_toast.m", + "//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", + ] + extra_deps = [ ":cr_toast_manager_module" ] +}
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js b/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js index f5fce4dd..3a72996 100644 --- a/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js +++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js
@@ -4,120 +4,129 @@ cr.define('cr.toastManager', () => { /* eslint-disable */ - /** @private {?CrToastManagerElement} */ + /** @private {?cr.toastManager.CrToastManagerElement} */ let toastManagerInstance = null; /* eslint-enable */ - /** @return {!CrToastManagerElement} */ - function getInstance() { - return assert(cr.toastManager.toastManagerInstance); + /** @return {!cr.toastManager.CrToastManagerElement} */ + /* #export */ function getInstance() { + return assert(toastManagerInstance); } - return { - getInstance: getInstance, - }; -}); + /** @param {?cr.toastManager.CrToastManagerElement} instance */ + /* #export */ function setInstance(instance) { + assert(!instance || !toastManagerInstance); + toastManagerInstance = instance; + } -/** - * @fileoverview Element which shows toasts with optional undo button. - */ -Polymer({ - is: 'cr-toast-manager', + /** + * @fileoverview Element which shows toasts with optional undo button. + */ + // eslint-disable-next-line + /* #export */ let CrToastManagerElement = Polymer({ + is: 'cr-toast-manager', - properties: { - duration: { - type: Number, - value: 0, + properties: { + duration: { + type: Number, + value: 0, + }, + + /** @private */ + showUndo_: Boolean, + + undoDescription: String, + + undoLabel: String, + }, + + /** @return {boolean} */ + get isToastOpen() { + return this.$.toast.open; + }, + + /** @return {boolean} */ + get isUndoButtonHidden() { + return this.$.button.hidden; + }, + + /** @override */ + attached: function() { + cr.toastManager.setInstance(this); + }, + + /** @override */ + detached: function() { + cr.toastManager.setInstance(null); + }, + + /** + * @param {string} label The label to display inside the toast. + * @param {boolean} showUndo Whether the undo button should be shown. + */ + show: function(label, showUndo) { + this.$.content.textContent = label; + this.showInternal_(showUndo); + this.$.toast.show(); + }, + + /** + * Shows the toast, making certain text fragments collapsible. + * @param {!Array<!{value: string, collapsible: boolean}>} pieces + * @param {boolean} showUndo Whether the undo button should be shown. + */ + showForStringPieces: function(pieces, showUndo) { + const content = this.$.content; + content.textContent = ''; + pieces.forEach(function(p) { + if (p.value.length == 0) { + return; + } + + const span = document.createElement('span'); + span.textContent = p.value; + if (p.collapsible) { + span.classList.add('collapsible'); + } + + content.appendChild(span); + }); + + this.showInternal_(showUndo); + }, + + /** + * @param {boolean} showUndo Whether the undo button should be shown. + * @private + */ + showInternal_: function(showUndo) { + this.showUndo_ = showUndo; + Polymer.IronA11yAnnouncer.requestAvailability(); + this.fire('iron-announce', { + text: this.$.content.textContent, + }); + if (showUndo && this.undoDescription) { + this.fire('iron-announce', { + text: this.undoDescription, + }); + } + this.$.toast.show(); + }, + + hide: function() { + this.$.toast.hide(); }, /** @private */ - showUndo_: Boolean, + onUndoClick_: function() { + this.fire('undo-click'); + }, + }); - undoDescription: String, - - undoLabel: String, - }, - - /** @return {boolean} */ - get isToastOpen() { - return this.$.toast.open; - }, - - /** @return {boolean} */ - get isUndoButtonHidden() { - return this.$.button.hidden; - }, - - /** @override */ - attached: function() { - assert(!cr.toastManager.toastManagerInstance); - cr.toastManager.toastManagerInstance = this; - }, - - /** @override */ - detached: function() { - cr.toastManager.toastManagerInstance = null; - }, - - /** - * @param {string} label The label to display inside the toast. - * @param {boolean} showUndo Whether the undo button should be shown. - */ - show: function(label, showUndo) { - this.$.content.textContent = label; - this.showInternal_(showUndo); - this.$.toast.show(); - }, - - /** - * Shows the toast, making certain text fragments collapsible. - * @param {!Array<!{value: string, collapsible: boolean}>} pieces - * @param {boolean} showUndo Whether the undo button should be shown. - */ - showForStringPieces: function(pieces, showUndo) { - const content = this.$.content; - content.textContent = ''; - pieces.forEach(function(p) { - if (p.value.length == 0) { - return; - } - - const span = document.createElement('span'); - span.textContent = p.value; - if (p.collapsible) { - span.classList.add('collapsible'); - } - - content.appendChild(span); - }); - - this.showInternal_(showUndo); - }, - - /** - * @param {boolean} showUndo Whether the undo button should be shown. - * @private - */ - showInternal_: function(showUndo) { - this.showUndo_ = showUndo; - Polymer.IronA11yAnnouncer.requestAvailability(); - this.fire('iron-announce', { - text: this.$.content.textContent, - }); - if (showUndo && this.undoDescription) { - this.fire('iron-announce', { - text: this.undoDescription, - }); - } - this.$.toast.show(); - }, - - hide: function() { - this.$.toast.hide(); - }, - - /** @private */ - onUndoClick_: function() { - this.fire('undo-click'); - }, + // #cr_define_end + return { + CrToastManagerElement: CrToastManagerElement, + getInstance: getInstance, + setInstance: setInstance, + }; });
diff --git a/ui/webui/resources/cr_elements_resources.grdp b/ui/webui/resources/cr_elements_resources.grdp index 0571408..faa39ab9 100644 --- a/ui/webui/resources/cr_elements_resources.grdp +++ b/ui/webui/resources/cr_elements_resources.grdp
@@ -5,14 +5,6 @@ file="cr_elements/action_link_css.html" type="chrome_html" compress="gzip" /> - <structure name="IDR_CR_ELEMENTS_CR_ACTION_MENU_ANCHOR_ALIGNMENT_HTML" - file="cr_elements/cr_action_menu/anchor_alignment.html" - type="chrome_html" - compress="gzip" /> - <structure name="IDR_CR_ELEMENTS_CR_ACTION_MENU_ANCHOR_ALIGNMENT_JS" - file="cr_elements/cr_action_menu/anchor_alignment.js" - type="chrome_html" - compress="gzip" /> <structure name="IDR_CR_ELEMENTS_CR_ACTION_MENU_HTML" file="cr_elements/cr_action_menu/cr_action_menu.html" type="chrome_html"
diff --git a/ui/webui/resources/cr_elements_resources_v3.grdp b/ui/webui/resources/cr_elements_resources_v3.grdp index fcc98b9..39d855b 100644 --- a/ui/webui/resources/cr_elements_resources_v3.grdp +++ b/ui/webui/resources/cr_elements_resources_v3.grdp
@@ -6,11 +6,6 @@ use_base_dir="false" type="BINDATA" compress="gzip" /> - <include name="IDR_CR_ELEMENTS_CR_ACTION_MENU_ANCHOR_ALIGNMENT_M_JS" - file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_action_menu/anchor_alignment.m.js" - use_base_dir="false" - type="BINDATA" - compress="gzip" /> <include name="IDR_CR_ELEMENTS_CR_ACTION_MENU_M_JS" file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.m.js" use_base_dir="false" @@ -126,6 +121,11 @@ use_base_dir="false" type="BINDATA" compress="gzip" /> + <include name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_M_JS" + file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.m.js" + use_base_dir="false" + type="BINDATA" + compress="gzip" /> <include name="IDR_CR_ELEMENTS_CR_TOGGLE_M_JS" file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.js" use_base_dir="false"